Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
c14c608
Moves synth heads to the new body part system and adds some more.
Constellado Jun 3, 2026
ba16891
Fix bug with nemo head.
Constellado Jun 3, 2026
3208fa4
adds the start of android battery core organ! Needs a sprite.
Constellado Jun 3, 2026
eb30ece
Woops, forgot to remove a broken thing I did before committing. Shoul…
Constellado Jun 3, 2026
16bfb5f
makes overcharging with the new organ less often
Constellado Jun 3, 2026
13ce7d9
Comment tweaks
Constellado Jun 3, 2026
9e18cf9
Adds required defines
Constellado Jun 3, 2026
7fd0ca7
another comment tweak
Constellado Jun 3, 2026
fbce704
woops, wrong defines was undefined. Fixed.
Constellado Jun 3, 2026
7e4f9b4
comment typo fixed
Constellado Jun 3, 2026
f74eec0
Merge branch 'master' into SynthMaintenance
Constellado Jun 3, 2026
6913855
maplestation story content dme fix
Constellado Jun 3, 2026
b89eb7e
Merge branch 'SynthMaintenance' of https://github.com/Constellado/Map…
Constellado Jun 3, 2026
251d76b
Fix!
Constellado Jun 7, 2026
d2feafa
adds headflags to the new heads
Constellado Jun 9, 2026
576d17f
allows for synth eye colours
Constellado Jun 9, 2026
0897dcc
sprite updates
Constellado Jun 9, 2026
a4caf8a
Adds Clara's head.
Constellado Jun 9, 2026
3320e0c
Clara head positional adjustments
Constellado Jun 9, 2026
2b404db
Merge branch 'MrMelbert:master' into SynthMaintenance
Constellado Jun 9, 2026
22d9f7d
Adds sprite for the stomach and tooltips for specific heads
Constellado Jun 9, 2026
f563b6e
adjust battery description
Constellado Jun 9, 2026
57c4ecb
Fixes tooltips and description
Constellado Jun 9, 2026
9c99650
Fix drone DMI
Constellado Jun 9, 2026
f9d83ab
Update maplestation.dme part 1
Constellado Jun 14, 2026
ea97d92
Update maplestation.dme part 2
Constellado Jun 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion code/__DEFINES/DNA.dm
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,6 @@
#define ORGAN_SLOT_EXTERNAL_ANTENNAE "antennae"
#define ORGAN_SLOT_EXTERNAL_POD_HAIR "pod_hair"
#define ORGAN_SLOT_EXTERNAL_HEAD_TENTACLES "head_tentacles" // NON-MODULE CHANGE
#define ORGAN_SLOT_EXTERNAL_SYNTH_HEAD_COVER "synth_head_cover" //NON-MODULE CHANGE

/// Xenomorph organ slots
#define ORGAN_SLOT_XENO_ACIDGLAND "acid_gland"
Expand Down
2 changes: 0 additions & 2 deletions code/controllers/subsystem/sprite_accessories.dm
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity
var/list/arm_wingsopen_list
var/list/tails_list_avian
var/list/avian_ears_list
var/list/synth_head_cover_list
var/list/tails_list_rat
var/list/rat_ears_list
var/list/bat_ears_list
Expand Down Expand Up @@ -133,7 +132,6 @@ SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity
arm_wingsopen_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/arm_wingsopen)[DEFAULT_SPRITE_LIST]
tails_list_avian = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/avian/)[DEFAULT_SPRITE_LIST]
avian_ears_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/plumage)[DEFAULT_SPRITE_LIST]
synth_head_cover_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/synth_head_cover)[DEFAULT_SPRITE_LIST]
tails_list_rat = init_sprite_accessory_subtypes(/datum/sprite_accessory/tail_rat, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
rat_ears_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/ears_rat, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
bat_ears_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/ears_bat, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
Expand Down
1 change: 0 additions & 1 deletion code/modules/mob/living/carbon/human/dummy.dm
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,6 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy)
target.dna.features["arm_wings"] = get_consistent_feature_entry(SSaccessories.arm_wings_list) // NON-MODULE CHANGE
target.dna.features["tail_avian"] = get_consistent_feature_entry(SSaccessories.tails_list_avian) // NON-MODULE CHANGE
target.dna.features["ears_avian"] = get_consistent_feature_entry(SSaccessories.avian_ears_list) // NON-MODULE CHANGE
target.dna.features["synth_head_cover"] = get_consistent_feature_entry(SSaccessories.synth_head_cover_list) // NON-MODULE CHANGE
target.dna.features["feathers"] = "#FF3B76" //NON-MODULE CHANGE
target.dna.features["animid_type"] = /datum/animid_type/cat::id //NON-MODULE CHANGE
target.dna.features["bat_ears"] = get_consistent_feature_entry(SSaccessories.bat_ears_list) //NON-MODULE CHANGE
Expand Down
2 changes: 1 addition & 1 deletion code/modules/surgery/bodyparts/robot_bodyparts.dm
Original file line number Diff line number Diff line change
Expand Up @@ -393,7 +393,7 @@

damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT)

head_flags = HEAD_EYESPRITES
head_flags = HEAD_EYESPRITES | HEAD_EYECOLOR
bodypart_flags = BODYPART_UNHUSKABLE

var/obj/item/assembly/flash/handheld/flash1 = null
Expand Down
1 change: 1 addition & 0 deletions maplestation.dme
Original file line number Diff line number Diff line change
Expand Up @@ -6705,6 +6705,7 @@
#include "maplestation_modules\code\modules\mob\living\carbon\human\species_types\animid\animid_prefs.dm"
#include "maplestation_modules\code\modules\mob\living\carbon\human\species_types\animid\animid_rat.dm"
#include "maplestation_modules\code\modules\mob\living\carbon\human\species_types\synth\android.dm"
#include "maplestation_modules\code\modules\mob\living\carbon\human\species_types\synth\android_battery.dm"
#include "maplestation_modules\code\modules\mob\living\carbon\human\species_types\synth\android_brain.dm"
#include "maplestation_modules\code\modules\mob\living\carbon\human\species_types\synth\android_ears.dm"
#include "maplestation_modules\code\modules\mob\living\carbon\human\species_types\synth\android_effects.dm"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@
"zhenkov" = 'maplestation_modules/icons/mob/augmentation/zhenkovipc.dmi',
"zhenkov dark" = 'maplestation_modules/icons/mob/augmentation/zhenkovipc_dark.dmi',
"ZHP" = 'maplestation_modules/icons/mob/augmentation/zhpipc.dmi',
"Vintage Cybersun" = 'maplestation_modules/icons/mob/augmentation/vintage_cybersun.dmi',
"S-Tech" = 'maplestation_modules/icons/mob/augmentation/s-tech.dmi',
"Skull" = 'maplestation_modules/icons/mob/augmentation/skull.dmi',
"Drone" = 'maplestation_modules/icons/mob/augmentation/drone.dmi',
"Nemo" = 'maplestation_modules/icons/mob/augmentation/flat.dmi'
)

var/static/list/emissive_augments = list(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,43 +70,6 @@
/datum/preference/choiced/synth_blood/is_accessible(datum/preferences/preferences)
return ..() && ispath(preferences.read_preference(/datum/preference/choiced/species), /datum/species/android/synth)

//synth head covers (aka head design options)
/datum/preference/choiced/synth_head_cover
main_feature_name = "Head Cover"
savefile_key = "feature_synth_head_cover"

savefile_identifier = PREFERENCE_CHARACTER
category = PREFERENCE_CATEGORY_FEATURES
can_randomize = TRUE
relevant_external_organ = /obj/item/organ/synth_head_cover
should_generate_icons = TRUE

/datum/preference/choiced/synth_head_cover/init_possible_values()
return assoc_to_keys(SSaccessories.synth_head_cover_list)

/datum/preference/choiced/synth_head_cover/icon_for(value)
var/datum/sprite_accessory/sprite_accessory = SSaccessories.synth_head_cover_list[value]
var/datum/universal_icon/head = uni_icon('maplestation_modules/icons/mob/synth_heads.dmi', "synth_head", SOUTH)

var/datum/universal_icon/final_icon = head.copy()

if (!isnull(sprite_accessory))
for(var/side in list("ADJ", "FRONT"))
var/datum/universal_icon/accessory_icon = uni_icon('maplestation_modules/icons/mob/synth_heads.dmi', "m_synth_head_cover_[sprite_accessory.icon_state]_ADJ", dir = SOUTH)
final_icon.blend_icon(accessory_icon, ICON_OVERLAY)

final_icon.crop(11, 20, 23, 32)
final_icon.scale(32, 32)
final_icon.blend_color(COLOR_GRAY, ICON_MULTIPLY)

return final_icon

/datum/preference/choiced/synth_head_cover/apply_to_human(mob/living/carbon/human/target, value)
target.dna.features["synth_head_cover"] = value

/datum/preference/choiced/synth_head_cover/create_default_value()
return /datum/sprite_accessory/synth_head_cover::name

/datum/preference/choiced/android_species
savefile_key = "feature_android_species"
savefile_identifier = PREFERENCE_CHARACTER
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,16 @@
ui_zone = BODY_ZONE_L_ARM
pref_list_slot = ORGAN_SLOT_LEFT_ARM_AUG
// Yeah you can have one in both arms if you want, don't really care


//battery core stuff
/datum/limb_option_datum/organ/synthetic
tooltip = "Unique to Androids and Synthetics."

/datum/limb_option_datum/organ/synthetic/can_be_selected(datum/preferences/prefs)
return ispath(prefs.read_preference(/datum/preference/choiced/species), /datum/species/android)

/datum/limb_option_datum/organ/synthetic/battery_core
tooltip = "Replaces the stomach with a battery with more charge, but cannot process food or chemicals. Unique to Androids and Synthetics."
name = "Battery Core"
limb_path = /obj/item/organ/stomach/ethereal/android/battery_core
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,34 @@
/datum/limb_option_datum/bodypart/cybernetic_head/zhp
name = "ZHP Cybernetic Head"
limb_path = /obj/item/bodypart/head/robot/zhp

// // -- Synth&Android DLC --
/datum/limb_option_datum/bodypart/cybernetic_head/helm
name = "Vintage 2415 Cybersun Head"
limb_path = /obj/item/bodypart/head/robot/helm

/datum/limb_option_datum/bodypart/cybernetic_head/nemo
name = "Nemo Screen Head"
limb_path = /obj/item/bodypart/head/robot/nemo

/datum/limb_option_datum/bodypart/cybernetic_head/cloak
name = "Frontech Model X Head"
limb_path = /obj/item/bodypart/head/robot/cloak

/datum/limb_option_datum/bodypart/cybernetic_head/gumhead
tooltip = "Character Item. Unique to Androids and Synthetics"
name = "S-Tech GUM Model Head"
limb_path = /obj/item/bodypart/head/robot/gumhead

/datum/limb_option_datum/bodypart/cybernetic_head/skull
name = "Robotic Skull"
limb_path = /obj/item/bodypart/head/robot/skull

/datum/limb_option_datum/bodypart/cybernetic_head/drone
name = "Drone Head"
limb_path = /obj/item/bodypart/head/robot/drone

/datum/limb_option_datum/bodypart/cybernetic_head/fss_clara
tooltip = "Character Item. Unique to Androids and Synthetics"
name = "FSS Redesigned Head"
limb_path = /obj/item/bodypart/head/robot/fss_clara
Original file line number Diff line number Diff line change
Expand Up @@ -526,18 +526,6 @@
icon_state = "divinity"
icon = 'maplestation_modules/icons/mob/frills.dmi'

// -- Synth head coverings --
/datum/sprite_accessory/synth_head_cover
icon = 'maplestation_modules/icons/mob/synth_heads.dmi'

/datum/sprite_accessory/synth_head_cover/helm
name = "Helm"
icon_state = "helm"

/datum/sprite_accessory/synth_head_cover/tv_blank
name = "Tv_blank"
icon_state = "tv_blank"


/// --- Socks ---

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
//Adds a new android stomach type which has more charge than the android stomach, but makes it impossible to eat.
/obj/item/organ/stomach/ethereal/android/battery_core
name = "Battery Core"
desc = "A robotic stomach replacement with many layers of batteries instead of a bioreactor."
icon = 'maplestation_modules/icons/obj/medical/organs/organs.dmi'
icon_state = "stomach_battery"

passive_drain_multiplier = 0.3 //drains slower than default robots
stomach_blood_transfer_rate = 0 //chems don't work too...


//stop eating benefits
#define NUTRITION_MULTIPLIER 0 //does this even work?
#define BOOZE_MULTIPLIER 0
/obj/item/organ/stomach/ethereal/android/battery_core/effective_charge()
. = ..()

/obj/item/organ/stomach/ethereal/android/battery_core/handle_chemical(mob/living/carbon/source, datum/reagent/chem, seconds_per_tick, times_fired)
//No booze, no drink, no food. It is not a stomach, it is a battery!
return NONE

#undef NUTRITION_MULTIPLIER
#undef BOOZE_MULTIPLIER


#define NO_CHARGE "Low Power"
#define HAS_CON_MOD (1 << 0)
#define HAS_MOOD_EVENT (1 << 1)
#define HAS_DEATH_TIMER (1 << 2)

//Tweaked charge code which makes overcharged shocking less often (I hate shocking people so bad.) Pretend it has some overcurrent protection or something.
/obj/item/organ/stomach/ethereal/android/battery_core/handle_charge(mob/living/carbon/carbon, seconds_per_tick, times_fired)
var/has_flags = NONE
switch(cell.charge())
if(-INFINITY to ETHEREAL_CHARGE_NONE)
carbon.add_mood_event(ALERT_ETHEREAL_CHARGE, /datum/mood_event/android_no_charge)
if(!death_timer)
carbon.add_max_consciousness_value(NO_CHARGE, CONSCIOUSNESS_MAX * 0.4)
carbon.add_consciousness_modifier(NO_CHARGE, -30)
death_timer = addtimer(CALLBACK(src, PROC_REF(turn_off), carbon), 30 SECONDS, TIMER_UNIQUE|TIMER_STOPPABLE|TIMER_DELETE_ME)
to_chat(carbon, span_userdanger("Power levels critical: Shutdown in 30 seconds without recharge!"))
has_flags |= HAS_CON_MOD | HAS_MOOD_EVENT | HAS_DEATH_TIMER

if(ETHEREAL_CHARGE_NONE to ETHEREAL_CHARGE_LOWPOWER)
carbon.add_mood_event(ALERT_ETHEREAL_CHARGE, /datum/mood_event/android_decharged)
carbon.add_max_consciousness_value(NO_CHARGE, CONSCIOUSNESS_MAX * 0.6)
carbon.add_consciousness_modifier(NO_CHARGE, -20)
has_flags |= HAS_CON_MOD | HAS_MOOD_EVENT

if(ETHEREAL_CHARGE_LOWPOWER to ETHEREAL_CHARGE_NORMAL)
carbon.add_mood_event(ALERT_ETHEREAL_CHARGE, /datum/mood_event/android_low_power)
has_flags |= HAS_MOOD_EVENT

if(ETHEREAL_CHARGE_NORMAL to ETHEREAL_CHARGE_ALMOSTFULL)
EMPTY_BLOCK_GUARD

if(ETHEREAL_CHARGE_ALMOSTFULL to ETHEREAL_CHARGE_FULL)
carbon.add_mood_event(ALERT_ETHEREAL_CHARGE, /datum/mood_event/android_charged)
has_flags |= HAS_MOOD_EVENT

if(ETHEREAL_CHARGE_FULL to ETHEREAL_CHARGE_OVERLOAD)
carbon.add_mood_event(ALERT_ETHEREAL_CHARGE, /datum/mood_event/android_overcharged)
has_flags |= HAS_MOOD_EVENT

if(ETHEREAL_CHARGE_OVERLOAD to ETHEREAL_CHARGE_DANGEROUS)
carbon.add_mood_event(ALERT_ETHEREAL_CHARGE, /datum/mood_event/android_supercharged)
has_flags |= HAS_MOOD_EVENT
if(SPT_PROB(0.5, seconds_per_tick)) // UPDATED FROM 5% to 0.5% each second for the android to explosively release excess energy if it reaches dangerous levels
discharge_process(carbon)

carbon.hud_used?.hunger?.update_hunger_bar()
if(!(has_flags & HAS_MOOD_EVENT))
carbon.clear_mood_event(ALERT_ETHEREAL_CHARGE)
if(!(has_flags & HAS_CON_MOD))
carbon.remove_max_consciousness_value(NO_CHARGE)
carbon.remove_consciousness_modifier(NO_CHARGE)
if(!(has_flags & HAS_DEATH_TIMER) && death_timer)
deltimer(death_timer)
death_timer = null

#undef NO_CHARGE
#undef HAS_CON_MOD
#undef HAS_MOOD_EVENT
#undef HAS_DEATH_TIMER
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
digitigrade_legs = null

mutanttongue = /obj/item/organ/tongue/robot/synth
mutant_organs = list(/obj/item/organ/synth_head_cover = "Helm")
allow_fleshy_bits = TRUE

/// Reference to the species we're disguised as.
Expand Down Expand Up @@ -412,85 +411,4 @@
/obj/item/organ/eyes/robotic/synth
name = "synth eyes"

// Organ for synth head covers.

/obj/item/organ/synth_head_cover
name = "Head Cover"
desc = "It is a cover that goes on a synth head."

zone = BODY_ZONE_HEAD
slot = ORGAN_SLOT_EXTERNAL_SYNTH_HEAD_COVER

preference = "feature_synth_head_cover"

organ_flags = ORGAN_ROBOTIC

bodypart_overlay = /datum/bodypart_overlay/mutant/synth_head_cover
organ_flags = parent_type::organ_flags | ORGAN_EXTERNAL


/obj/item/organ/synth_head_cover/on_bodypart_insert(obj/item/bodypart/head/limb, movement_flags)
. = ..()
limb.head_flags &= ~HEAD_EYESPRITES

/obj/item/organ/synth_head_cover/on_bodypart_remove(obj/item/bodypart/head/limb, movement_flags)
. = ..()
if(initial(limb.head_flags) & HEAD_EYESPRITES)
limb.head_flags |= HEAD_EYESPRITES

//-- overlay --
/datum/bodypart_overlay/mutant/synth_head_cover/get_global_feature_list()
return SSaccessories.synth_head_cover_list

/datum/bodypart_overlay/mutant/synth_head_cover/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner)
if(bodypart_owner.owner?.obscured_slots & HIDEHAIR)
return FALSE
if(bodypart_owner.limb_id == BODYPART_ID_SYNTH) // disguised = no head cover
return TRUE
if(IS_ROBOTIC_LIMB(bodypart_owner)) // works on android limbs too
return TRUE
return FALSE

/datum/bodypart_overlay/mutant/synth_head_cover
feature_key = "synth_head_cover"
layers = ALL_EXTERNAL_OVERLAYS

//-- accessories --
//the path to the icon for the head covers
/datum/sprite_accessory/synth_head_cover
icon = 'maplestation_modules/icons/mob/synth_heads.dmi'

//head covers
/datum/sprite_accessory/synth_head_cover/none // for those that don't want a cover.
name = "None"
icon_state = null

//A kind of helmet looking thing with a big black screen/face cover thing. I dunno what else to call this.
/datum/sprite_accessory/synth_head_cover/helm
name = "Helm"
icon_state = "helm"

//helm with white plastic on the sides.
/datum/sprite_accessory/synth_head_cover/helm_white
name = "White Helm"
icon_state = "helm_white"

//just the IPC TV that is already in the code base
/datum/sprite_accessory/synth_head_cover/tv_blank
name = "Tv_blank"
icon_state = "tv_blank"

//a cool design inspired from cloak pilots in titanfall 2, *sorta*.
/datum/sprite_accessory/synth_head_cover/cloakp
name = "Cloakp"
icon_state = "cloakp"

//GUMTEETH's head
/datum/sprite_accessory/synth_head_cover/gumhead
name = "GUMHEAD"
icon_state = "gumhead"

// add more here!!


#undef BODYPART_ID_SYNTH
Loading
Loading