From 2bcea22001d12c33f3daaaed2c968c15106b34ae Mon Sep 17 00:00:00 2001 From: Wollywoger Date: Wed, 22 Jul 2026 15:03:48 -0400 Subject: [PATCH 01/11] does basically everything needed for the base state, ahhh --- .../surgery/organs/external/_visual_organs.dm | 4 +- .../modules/surgery/organs/external/spines.dm | 15 ++++ code/modules/surgery/organs/external/tails.dm | 15 ++++ maplestation.dme | 3 +- .../client/preferences/species/lizard.dm | 3 +- .../human/species_types/animid/animid_fish.dm | 6 +- .../species_types/animid/animid_lizard.dm | 69 +++++++++++++++++++ .../features/_modular_species_features.tsx | 5 ++ 8 files changed, 112 insertions(+), 8 deletions(-) create mode 100644 maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_lizard.dm diff --git a/code/modules/surgery/organs/external/_visual_organs.dm b/code/modules/surgery/organs/external/_visual_organs.dm index 9decb58b79e0..20819d95cf1a 100644 --- a/code/modules/surgery/organs/external/_visual_organs.dm +++ b/code/modules/surgery/organs/external/_visual_organs.dm @@ -168,8 +168,8 @@ Unlike normal organs, we're actually inside a persons limbs at all times if(isnull(bodypart_owner.owner) || HAS_TRAIT(bodypart_owner.owner, TRAIT_MUTANT_COLORS) || HAS_TRAIT(bodypart_owner, TRAIT_MUTANT_COLORS)) return bodypart_owner.draw_color // then use forced color - for non-mutant-colored species, like piscinids - if(bodypart_owner?.owner?.dna?.features["forced_fish_color"]) - return bodypart_owner.owner.dna.features["forced_fish_color"] + if(bodypart_owner?.owner?.dna?.features["forced_mut_color"]) + return bodypart_owner.owner.dna.features["forced_mut_color"] // then default to body color - though this will probably be skin color, some forced color, or pure white return bodypart_owner.draw_color diff --git a/code/modules/surgery/organs/external/spines.dm b/code/modules/surgery/organs/external/spines.dm index 65aa0b9a2586..9c23ec44d507 100644 --- a/code/modules/surgery/organs/external/spines.dm +++ b/code/modules/surgery/organs/external/spines.dm @@ -34,6 +34,21 @@ layers = EXTERNAL_ADJACENT|EXTERNAL_BEHIND feature_key = "spines" dyable = TRUE + color_source = ORGAN_COLOR_OVERRIDE // NON-MODULE CHANGE + +// BEGIN NON-MODULE CHANGE +/datum/bodypart_overlay/mutant/spines/override_color(obj/item/bodypart/bodypart_owner) + + // by default, use body color if we should be mutant colored + if(isnull(bodypart_owner.owner) || HAS_TRAIT(bodypart_owner.owner, TRAIT_MUTANT_COLORS) || HAS_TRAIT(bodypart_owner, TRAIT_MUTANT_COLORS)) + return bodypart_owner.draw_color + // then use forced color - for non-mutant-colored species, like reptilids + if(bodypart_owner?.owner?.dna?.features["forced_mut_color"]) + return bodypart_owner.owner.dna.features["forced_mut_color"] + // then default to body color - though this will probably be skin color, some forced color, or pure white + return bodypart_owner.draw_color + +// END NON-MODULE CHANGE /datum/bodypart_overlay/mutant/spines/get_global_feature_list() return SSaccessories.spines_list diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index 7fe537165caf..da84db8d29f4 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -211,6 +211,21 @@ /datum/bodypart_overlay/mutant/tail/lizard feature_key = "tail_lizard" mesh_in_suits = TRUE + color_source = ORGAN_COLOR_OVERRIDE // NON-MODULE CHANGE + +// BEGIN NON-MODULE CHANGE +/datum/bodypart_overlay/mutant/tail/lizard/override_color(obj/item/bodypart/bodypart_owner) + + // by default, use body color if we should be mutant colored + if(isnull(bodypart_owner.owner) || HAS_TRAIT(bodypart_owner.owner, TRAIT_MUTANT_COLORS) || HAS_TRAIT(bodypart_owner, TRAIT_MUTANT_COLORS)) + return bodypart_owner.draw_color + // then use forced color - for non-mutant-colored species, like reptilids + if(bodypart_owner?.owner?.dna?.features["forced_mut_color"]) + return bodypart_owner.owner.dna.features["forced_mut_color"] + // then default to body color - though this will probably be skin color, some forced color, or pure white + return bodypart_owner.draw_color + +// END NON-MODULE CHANGE /datum/bodypart_overlay/mutant/tail/lizard/get_global_feature_list() return SSaccessories.tails_list_lizard diff --git a/maplestation.dme b/maplestation.dme index d16c388f218e..ba0de39e5931 100644 --- a/maplestation.dme +++ b/maplestation.dme @@ -6711,6 +6711,7 @@ #include "maplestation_modules\code\modules\mob\living\carbon\human\species_types\animid\animid_dog.dm" #include "maplestation_modules\code\modules\mob\living\carbon\human\species_types\animid\animid_fish.dm" #include "maplestation_modules\code\modules\mob\living\carbon\human\species_types\animid\animid_fox.dm" +#include "maplestation_modules\code\modules\mob\living\carbon\human\species_types\animid\animid_lizard.dm" #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" @@ -6798,7 +6799,6 @@ #include "maplestation_modules\code\modules\vending\wardrobes.dm" #include "maplestation_modules\code\modules\wiremod\component_printer.dm" #include "maplestation_modules\code\modules\wiremod\shells.dm" -#ifdef MAPLESTATION_STORY_CONTENT #include "maplestation_modules\story_content\armored_corps\code\clothing\aylie_cloak.dm" #include "maplestation_modules\story_content\armored_corps\code\mecha_weapons\gauss_override.dm" #include "maplestation_modules\story_content\armored_corps\code\mecha_weapons\laser_override.dm" @@ -6816,5 +6816,4 @@ #include "maplestation_modules\story_content\volkan_equipment\code\volkanpets_ai.dm" #include "maplestation_modules\story_content\volkan_equipment\datums\loadout_datum.dm" #include "maplestation_modules\story_content\wollys_items\code\wollysitems.dm" -#endif // MAPLESTATION_STORY_CONTENT // END_INCLUDE diff --git a/maplestation_modules/code/modules/client/preferences/species/lizard.dm b/maplestation_modules/code/modules/client/preferences/species/lizard.dm index 0e142b8815f5..1f8a9444ecfc 100644 --- a/maplestation_modules/code/modules/client/preferences/species/lizard.dm +++ b/maplestation_modules/code/modules/client/preferences/species/lizard.dm @@ -61,7 +61,8 @@ return 3 /datum/preference/numeric/hiss_length/is_accessible(datum/preferences/preferences) - return ..() && ispath(preferences.read_preference(/datum/preference/choiced/species), /datum/species/lizard) + var/datum/species/target_species = preferences.read_preference(/datum/preference/choiced/species) + return ..() && ispath(target_species::mutanttongue, /obj/item/organ/tongue/lizard) /datum/preference/numeric/hiss_length/apply_to_human(mob/living/carbon/human/target, value) var/obj/item/organ/tongue/lizard/tongue = target.get_organ_slot(ORGAN_SLOT_TONGUE) diff --git a/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_fish.dm b/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_fish.dm index b87d77a135d4..4878d90743d7 100644 --- a/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_fish.dm +++ b/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_fish.dm @@ -20,7 +20,7 @@ /datum/animid_type/fish/pre_species_gain(datum/species/human/animid/species, mob/living/carbon/human/new_animid) // ensures we get mutant color rather than a random forced color - new_animid.dna?.features["forced_fish_color"] = new_animid.dna?.features["mcolor"] + new_animid.dna?.features["forced_mut_color"] = new_animid.dna?.features["mcolor"] /datum/animid_type/fish/extra_feature_keys() return list(/datum/preference/color/mutant_color::savefile_key) @@ -95,7 +95,7 @@ . = ..() RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(check_location)) check_location(owner, null) - owner.dna.features["forced_fish_color"] ||= pick("#B4B8DD", "#85C7D0", "#67BBEE", "#2F4450", "#55CCBB", "#999FD0", "#345066", "#585B69", "#7381A0", "#B6DDE5", "#4E4E50") + owner.dna.features["forced_mut_color"] ||= pick("#B4B8DD", "#85C7D0", "#67BBEE", "#2F4450", "#55CCBB", "#999FD0", "#345066", "#585B69", "#7381A0", "#B6DDE5", "#4E4E50") /obj/item/organ/tail/fish/on_mob_remove(mob/living/carbon/owner) . = ..() @@ -137,7 +137,7 @@ if(!bodypart_owner.owner || HAS_TRAIT(bodypart_owner.owner, TRAIT_MUTANT_COLORS)) return bodypart_owner.draw_color - return bodypart_owner.owner.dna?.features["forced_fish_color"] || bodypart_owner.draw_color + return bodypart_owner.owner.dna?.features["forced_mut_color"] || bodypart_owner.draw_color /datum/bodypart_overlay/mutant/tail/fish/get_global_feature_list() return SSaccessories.tails_list_fish diff --git a/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_lizard.dm b/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_lizard.dm new file mode 100644 index 000000000000..e5f3f9e57eaa --- /dev/null +++ b/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_lizard.dm @@ -0,0 +1,69 @@ +/datum/animid_type/lizard + id = "Lizard" + components = list( + BODY_ZONE_CHEST = /obj/item/bodypart/chest/scaled, + BODY_ZONE_HEAD = /obj/item/bodypart/head/scaled, + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/scaled, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/scaled, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/scaled, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/scaled, + MUTANT_ORGANS = list( + /obj/item/organ/horns = SPRITE_ACCESSORY_NONE, + /obj/item/organ/frills = SPRITE_ACCESSORY_NONE, + /obj/item/organ/spines = SPRITE_ACCESSORY_NONE, + /obj/item/organ/tail/lizard = "Smooth", + ), + ) + + name = "Reptilid" + icon = FA_ICON_HAND_LIZARD + +/datum/animid_type/lizard/pre_species_gain(datum/species/human/animid/species, mob/living/carbon/human/new_animid) + // ensures we get mutant color rather than a random forced color + new_animid.dna?.features["forced_mut_color"] = new_animid.dna?.features["mcolor"] + if (new_animid.dna?.features["Hissing"] == TRUE) + components.Add(list(ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/lizard)) + else + components.Add(list(ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/lizard/no_hiss)) + +/datum/animid_type/lizard/extra_feature_keys() + return list(/datum/preference/color/mutant_color::savefile_key, /datum/preference/toggle/liz_tongue_hissing::savefile_key) + +/datum/animid_type/lizard/get_readable_features() + return ..() + "Scales" + +/datum/animid_type/lizard/get_extra_perks() + var/list/to_add = list() + + to_add += list( + list( + SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, + SPECIES_PERK_ICON = FA_ICON_HAND_FIST, + SPECIES_PERK_NAME = "Scaled Defense", + SPECIES_PERK_DESC = "[name] scales provide a minor amount of resistance to bruises and burns. \ + However, good luck disguising your scaled skin.", + ), + ) + + return to_add + +/datum/preference/toggle/liz_tongue_hissing + savefile_key = "liz_tongue_hissing" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_SECONDARY_FEATURES + can_randomize = FALSE + default_value = FALSE + +/datum/preference/toggle/liz_tongue_hissing/apply_to_human(mob/living/carbon/human/target, value) + if(!(is_species(target, /datum/species/human/animid) && (target.dna.features["animid_type"] == "Lizard"))) + return // sorry, but we're not blocking lizardpeople from hissing in this codebase + target.dna.features["Hissing"] = value + +/datum/preference/toggle/liz_tongue_hissing/is_accessible(datum/preferences/preferences) + return ..() && ((ispath(preferences.read_preference(/datum/preference/choiced/species), /datum/species/human/animid)) && (preferences.read_preference(/datum/preference/choiced/animid_type) == "Lizard")) + +/obj/item/organ/tongue/lizard/no_hiss // because modifies_speech only affects things on init + name = "mutated forked tongue" + desc = "A thin and long muscle typically found in reptilian races, apparently moonlights as a nose. The ends on this one appear more rigid than normal, reducing the amount of hissing." + modifies_speech = FALSE // no hiss for you + draw_length = 0 diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/_modular_species_features.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/_modular_species_features.tsx index 5bedcab6da25..2df744bba38e 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/_modular_species_features.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/_modular_species_features.tsx @@ -166,6 +166,11 @@ export const feature_fox_tail: FeatureChoiced = { name: 'Fox Tail', component: FeatureDropdownInput, }; +export const liz_tongue_hissing: FeatureToggle = { + name: 'Lizard Speech', + description: 'If checked, you will sssspeak like a lizardperson.', + component: CheckboxInput, +}; export const feature_android_species: FeatureChoiced = { name: 'Android Species', From 72648c4c61433ab60ade5e397c7f5c020f30c638 Mon Sep 17 00:00:00 2001 From: Wollywoger Date: Wed, 22 Jul 2026 18:46:40 -0400 Subject: [PATCH 02/11] refactors, other things being tidied up --- code/__DEFINES/external_organs.dm | 5 +++++ .../mutant_bodypart_overlay.dm | 5 +++++ .../surgery/organs/external/_visual_organs.dm | 9 +-------- .../modules/surgery/organs/external/spines.dm | 16 +--------------- code/modules/surgery/organs/external/tails.dm | 16 +--------------- .../organs/external/wings/functional_wings.dm | 1 + icons/map_icons/items/pda.dmi | Bin 11621 -> 10988 bytes maplestation.dme | 3 +++ .../mutant_bodypart_overlay.dm | 14 ++++++++++++++ .../client/preferences/species/lizard.dm | 4 +++- .../human/species_types/animid/animid_fish.dm | 10 ++-------- .../species_types/animid/animid_lizard.dm | 5 ++--- 12 files changed, 38 insertions(+), 50 deletions(-) create mode 100644 maplestation_modules/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm diff --git a/code/__DEFINES/external_organs.dm b/code/__DEFINES/external_organs.dm index 5d84a3aecdd9..d6ec21f2f775 100644 --- a/code/__DEFINES/external_organs.dm +++ b/code/__DEFINES/external_organs.dm @@ -5,6 +5,11 @@ ///Uses the parent's haircolor #define ORGAN_COLOR_HAIR (1<<2) +// BEGIN NON-MODULE CHANGE +// in a chain, inherit the mob's mutant color, a forced mutant color, before the true draw color +#define ORGAN_COLOR_MUTANT_OVERRIDE (1<<3) +// END NON-MODULE CHANGE + ///Tail wagging #define WAG_ABLE (1<<0) #define WAG_WAGGING (1<<1) diff --git a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm index 35440ebab830..ebdc7ccaafa3 100644 --- a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm @@ -131,6 +131,11 @@ if(isnull(draw_color) && ishuman(bodypart_owner.owner)) var/mob/living/carbon/human/human_owner = bodypart_owner.owner draw_color = human_owner.hair_color + // BEGIN NON-MODULE CHANGE + if(ORGAN_COLOR_MUTANT_OVERRIDE) + var/the_color = mutant_override_color(bodypart_owner) + draw_color = the_color + // END NON-MODULE CHANGE return TRUE diff --git a/code/modules/surgery/organs/external/_visual_organs.dm b/code/modules/surgery/organs/external/_visual_organs.dm index 20819d95cf1a..9d7766a44d23 100644 --- a/code/modules/surgery/organs/external/_visual_organs.dm +++ b/code/modules/surgery/organs/external/_visual_organs.dm @@ -164,14 +164,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times // prioritize a specific color they have set if(bodypart_owner?.owner?.dna?.features["lizard_frill_color"]) return bodypart_owner.owner.dna.features["lizard_frill_color"] - // then use body color if we should be mutant colored - if(isnull(bodypart_owner.owner) || HAS_TRAIT(bodypart_owner.owner, TRAIT_MUTANT_COLORS) || HAS_TRAIT(bodypart_owner, TRAIT_MUTANT_COLORS)) - return bodypart_owner.draw_color - // then use forced color - for non-mutant-colored species, like piscinids - if(bodypart_owner?.owner?.dna?.features["forced_mut_color"]) - return bodypart_owner.owner.dna.features["forced_mut_color"] - // then default to body color - though this will probably be skin color, some forced color, or pure white - return bodypart_owner.draw_color + return mutant_override_color(bodypart_owner) /datum/bodypart_overlay/mutant/frills/generate_icon_cache(obj/item/bodypart/limb) . = ..() diff --git a/code/modules/surgery/organs/external/spines.dm b/code/modules/surgery/organs/external/spines.dm index 9c23ec44d507..b269b9416660 100644 --- a/code/modules/surgery/organs/external/spines.dm +++ b/code/modules/surgery/organs/external/spines.dm @@ -34,21 +34,7 @@ layers = EXTERNAL_ADJACENT|EXTERNAL_BEHIND feature_key = "spines" dyable = TRUE - color_source = ORGAN_COLOR_OVERRIDE // NON-MODULE CHANGE - -// BEGIN NON-MODULE CHANGE -/datum/bodypart_overlay/mutant/spines/override_color(obj/item/bodypart/bodypart_owner) - - // by default, use body color if we should be mutant colored - if(isnull(bodypart_owner.owner) || HAS_TRAIT(bodypart_owner.owner, TRAIT_MUTANT_COLORS) || HAS_TRAIT(bodypart_owner, TRAIT_MUTANT_COLORS)) - return bodypart_owner.draw_color - // then use forced color - for non-mutant-colored species, like reptilids - if(bodypart_owner?.owner?.dna?.features["forced_mut_color"]) - return bodypart_owner.owner.dna.features["forced_mut_color"] - // then default to body color - though this will probably be skin color, some forced color, or pure white - return bodypart_owner.draw_color - -// END NON-MODULE CHANGE + color_source = ORGAN_COLOR_MUTANT_OVERRIDE // NON-MODULE CHANGE /datum/bodypart_overlay/mutant/spines/get_global_feature_list() return SSaccessories.spines_list diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index da84db8d29f4..b04684658d3e 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -211,21 +211,7 @@ /datum/bodypart_overlay/mutant/tail/lizard feature_key = "tail_lizard" mesh_in_suits = TRUE - color_source = ORGAN_COLOR_OVERRIDE // NON-MODULE CHANGE - -// BEGIN NON-MODULE CHANGE -/datum/bodypart_overlay/mutant/tail/lizard/override_color(obj/item/bodypart/bodypart_owner) - - // by default, use body color if we should be mutant colored - if(isnull(bodypart_owner.owner) || HAS_TRAIT(bodypart_owner.owner, TRAIT_MUTANT_COLORS) || HAS_TRAIT(bodypart_owner, TRAIT_MUTANT_COLORS)) - return bodypart_owner.draw_color - // then use forced color - for non-mutant-colored species, like reptilids - if(bodypart_owner?.owner?.dna?.features["forced_mut_color"]) - return bodypart_owner.owner.dna.features["forced_mut_color"] - // then default to body color - though this will probably be skin color, some forced color, or pure white - return bodypart_owner.draw_color - -// END NON-MODULE CHANGE + color_source = ORGAN_COLOR_MUTANT_OVERRIDE // NON-MODULE CHANGE /datum/bodypart_overlay/mutant/tail/lizard/get_global_feature_list() return SSaccessories.tails_list_lizard diff --git a/code/modules/surgery/organs/external/wings/functional_wings.dm b/code/modules/surgery/organs/external/wings/functional_wings.dm index f03af571b7c2..e1c86284ee79 100644 --- a/code/modules/surgery/organs/external/wings/functional_wings.dm +++ b/code/modules/surgery/organs/external/wings/functional_wings.dm @@ -179,6 +179,7 @@ name = "dragon wings" desc = "Hey, HEY- NOT lizard wings. Dragon wings. Mighty dragon wings." sprite_accessory_override = /datum/sprite_accessory/wings/dragon + bodypart_overlay = /datum/bodypart_overlay/mutant/wings/functional/mutant_color // NON_MODULE CHANGE ///robotic wings, which relate to androids. /obj/item/organ/wings/functional/robotic diff --git a/icons/map_icons/items/pda.dmi b/icons/map_icons/items/pda.dmi index 0712af49864f20397079b5c060e65008f60a5394..925d3d233bc05467602f35930a061beaec93729f 100644 GIT binary patch literal 10988 zcmZ{Kby!qg-}RuRh)5$yNOwq#2Tz1LoA{U%gRMHcS?#RCusgeNa2tpQwr-@UOhflmrf+hq_4 zt$y1O> z(M^7q4CVLf>)T*b7TQPDqFe77Sir0{KO%b{LD6_P@|1AsTQJwtgZNyeJnJ z|7d`|Xd{rX?{t=P|X3i60v zbHq!%xSvwmiRS%LQU~I+ir&Bb&3)kA0#$K4W@kRM-n*JIOE_Jr!JC1rvAfrX(7&7{ zOTkvHxCIXnLjm80-re&W#<`6ObZlSkXT5vMSpFR17%66hG$0TyNM8D-mS@^tx|gq} z_F`8izfJtU#3)^-no*$gHR=&--?IlhlKJR)Wa*;aj0~3M@ zU5I}9fQ27ej3~~^lGv*lDP1o(C(FvQ9m>IxW0VsSHyAGLT}qG1VncmaZEi0BG8Om< z64&j31ryT#fu_kJ_x_`&zdU`!nqEs@iXQ)X8Cf?~-S4mZuyyaG@xXuN?oO%I^~cxu zNsX`c$6k_6?5pF!h+7A^o1J@vU_{O4kKUX=AGkH3Pyach_5m&-pFlJgz#}1 zeo`oB2jdLl;3%=zI|ioVmpfbH;6%(b@KZ!8$;pMRHTudI-VZR@aYVfVnfj^e@nC{3 z#Tb&wQ9g1!93)_`y7qEw_l!d?2GbUC4)R!#3y!acUkz^NcPbCD626)`tPa9StRReB zB9NxqZ-=8@@6^Bd*lXsvrG3tC7})$zw;-Vmo|7tI`AsgXHV1ijRoSSg1SB*xG~6sv zbyyD{H2GQMMnaWev5tkWiF7wnM`#e!#vMF8_!6O!=W%^<9EJvxjZP=gcAEYc9Q#=} zqR`{`k_-*>@DatsD0fV7C02S;W|e_6frP4;r|6vU6F=d5>CpPzxU+?R{TD|fZ@PG* zozu{L&wjrg8pcdjB0A5v^$-_Wsm-K?pOyDs|M~gh%LPr-t#{A_h)mpv=WO9~v5?B| z!!oFtC)QKZLZRLFG)*u_@Gz5R0r!P1m-zLm!`bCz6O+>}^7hMawp6P9HNx$n<>Eou z$z-*R$r`v%;Eme!UcuK$RzKik6d?;%#PH1j*yU%UUeb;|e8k4uj5OTgdK6x#!`nTqUW2;^zR%WLe8mQaFoH3jG zDAfF=k*djeC+W+_oSK-a+P$#><9qUAfG#h9H%G z)o0>dYcNIbtaSC8AjT@<{`es94 z3T<-Ttx=|3#fgZ86V;(dwxu0AP2Ae!P?O?~XJr27RG#VZ`I7C^bz|jg)%xZx1yNwP zX$^sC1Fr07;p1-@*A;!`>qgR=44)Y}xog)DN0{AEd_+XFMAh%A)MyLJAZ+V0#W2ig zY}4;u-CM$cEcmu@QYRc0;rGc?pluPatY#u-Qm4PEtexwi0LP2VvTh=09xtJo>s_YXC|>6G#hP-y;8Q>OmNyQGk*-&si-X%tHZ68W){nODdQ{DiLca)*EMHB4 zPr4?>?2zYIxTi6$39D?|iCGsd`14jwd#<`?iA2(nkukF*#RmjC8BuPv2MW=fzFtpz zo0sQGt=_KCav>l&=-eYTqh>|p-$ON|`dRsl5 zh9Rw{TZVK0AA*beFzEt&`1@(F1jP zz2KqwD@b!ACZ94B$M{?IwrMm_ECr_<1>S=lTdH-&2&#U5gV)X4y8E~dA3uHsfl4OA z>g!)HFf-FXdxi#zNlSYON^_Bvyr;xORBqhzr*KEUgIaAHy4eB8)yw5EvG>^}=@U00 zyynW9-D9@-9n=kUzI&NzgcYD^Wu7p35RPpz=bwhknVWhrL?~=d*-BpMFj&B@iZAe)9SF1%{POstB~)>g>-%+$;pT z{~A%9Qz_5D|0L1>BwZ{dh&n>yV$q%u0Jr=lU)`o#2`Re0%eP{#OMat;F0N%y$P2p> zCx|eHjOuCW+4PtnZc?|~Jh9PN3|e$YX`M`CetAO&w= zX()#1-A2kMn%`$TQ$CTInMTqP2>%V;97HpYr$7NQ=x}a1JW#Nwcr%3h%-t}w*dtX3 z&oNZok6Ln503tl;Fz7;-zNvSGEa80Nyn;SpRn6hQ9!VDjV&N9v(}VUnypxJ3bA@Ov zvfLXnBt`uyOQ{nln2E9xq*T%8sB&_(Ue^bqFNf!30kp}hhYxNBb zpo16~kND!#n7C5;tfO)r&5xFe=@PhY6&{$JTIc%q>Be)vKs$H=d(l^LBNCuW)1e70 zH1|?>X%^>;Rszr8ja%L@gBBX?&&rC$;Mt3!K6!L;0>zc^)p#rdJVWC!n zg)6Da(Z7S(;d*O+S?$$``zLgX9Qrc#1B80r=ku`718)uy%!b*bd4+p7qb@a?&Kx4I z&dC^xcyE^#3~D6~HFKp;K4emSj7#FQI4N*{5;*nMm*op;HUXcvtpD-M4F*}Tx#^+D z=*`EUbCthW-p$;Q)jf%g>7(*t4a$r$2m(^6q9&89h1{3bz=TSAKhHZ{hCwLTHQ`@; z7t!ZuVeDh89U}I5-C|*7w{^!@g3bVb_gy%M`#pRK>`c!JG-$%3PB5hI)yto{zS)mR zh>2;JH!JH648k_&`hke@(5Z@IC7lZ6z>aUAce^N{1?PYtJP2AE z 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 diff --git a/maplestation.dme b/maplestation.dme index ba0de39e5931..59c4ee37d971 100644 --- a/maplestation.dme +++ b/maplestation.dme @@ -6304,6 +6304,7 @@ #include "maplestation_modules\code\controllers\subsystem\pain_subsystem.dm" #include "maplestation_modules\code\datums\dna.dm" #include "maplestation_modules\code\datums\shuttles.dm" +#include "maplestation_modules\code\datums\bodypart_overlays\mutant_bodypart_overlay.dm" #include "maplestation_modules\code\datums\brain_damage\split_personality.dm" #include "maplestation_modules\code\datums\components\easy_ignite.dm" #include "maplestation_modules\code\datums\components\knockoff_move.dm" @@ -6799,6 +6800,7 @@ #include "maplestation_modules\code\modules\vending\wardrobes.dm" #include "maplestation_modules\code\modules\wiremod\component_printer.dm" #include "maplestation_modules\code\modules\wiremod\shells.dm" +#ifdef MAPLESTATION_STORY_CONTENT #include "maplestation_modules\story_content\armored_corps\code\clothing\aylie_cloak.dm" #include "maplestation_modules\story_content\armored_corps\code\mecha_weapons\gauss_override.dm" #include "maplestation_modules\story_content\armored_corps\code\mecha_weapons\laser_override.dm" @@ -6816,4 +6818,5 @@ #include "maplestation_modules\story_content\volkan_equipment\code\volkanpets_ai.dm" #include "maplestation_modules\story_content\volkan_equipment\datums\loadout_datum.dm" #include "maplestation_modules\story_content\wollys_items\code\wollysitems.dm" +#endif MAPLESTATION_STORY_CONTENT // END_INCLUDE diff --git a/maplestation_modules/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm b/maplestation_modules/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm new file mode 100644 index 000000000000..19f1526b714a --- /dev/null +++ b/maplestation_modules/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm @@ -0,0 +1,14 @@ +// used for additional stuff on mutant bodypart overlays + +// used by "ORGAN_COLOR_MUTANT_OVERRIDE" but can also be used by other organs' color overrides +/datum/bodypart_overlay/mutant/proc/mutant_override_color(obj/item/bodypart/bodypart_owner) + // use body color if we should be mutant colored + if(isnull(bodypart_owner.owner) || HAS_TRAIT(bodypart_owner.owner, TRAIT_MUTANT_COLORS) || HAS_TRAIT(bodypart_owner, TRAIT_MUTANT_COLORS)) + return bodypart_owner.draw_color + // first try to use forced color - for non-mutant-colored species, like piscinids + // then default to body color - though this will probably be skin color, some other forced color, or pure white + return bodypart_owner.owner.dna.features["forced_mut_color"] || bodypart_owner.draw_color + +// todo: figure out how on god's green earth functional wings even get their color, also refactor that part of the code and push it to TG +/datum/bodypart_overlay/mutant/wings/functional/mutant_color + color_source = ORGAN_COLOR_MUTANT_OVERRIDE diff --git a/maplestation_modules/code/modules/client/preferences/species/lizard.dm b/maplestation_modules/code/modules/client/preferences/species/lizard.dm index 1f8a9444ecfc..6c54ea817103 100644 --- a/maplestation_modules/code/modules/client/preferences/species/lizard.dm +++ b/maplestation_modules/code/modules/client/preferences/species/lizard.dm @@ -62,7 +62,9 @@ /datum/preference/numeric/hiss_length/is_accessible(datum/preferences/preferences) var/datum/species/target_species = preferences.read_preference(/datum/preference/choiced/species) - return ..() && ispath(target_species::mutanttongue, /obj/item/organ/tongue/lizard) + // lizard animids, are, for many reasons, a bit funky so i'll add an exception for them + var/species_check = (ispath(target_species, /datum/species/human/animid)) && (preferences.read_preference(/datum/preference/choiced/animid_type) == "Lizard") + return ..() && (ispath(target_species::mutanttongue, /obj/item/organ/tongue/lizard) || species_check) /datum/preference/numeric/hiss_length/apply_to_human(mob/living/carbon/human/target, value) var/obj/item/organ/tongue/lizard/tongue = target.get_organ_slot(ORGAN_SLOT_TONGUE) diff --git a/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_fish.dm b/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_fish.dm index 4878d90743d7..4180f651b1cf 100644 --- a/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_fish.dm +++ b/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_fish.dm @@ -129,16 +129,9 @@ /datum/bodypart_overlay/mutant/tail/fish feature_key = "fish_tail" - color_source = ORGAN_COLOR_OVERRIDE + color_source = ORGAN_COLOR_MUTANT_OVERRIDE mesh_in_suits = TRUE -/datum/bodypart_overlay/mutant/tail/fish/override_color(obj/item/bodypart/bodypart_owner) - //If the owner uses mutant colors, inherit the color of the bodypart - if(!bodypart_owner.owner || HAS_TRAIT(bodypart_owner.owner, TRAIT_MUTANT_COLORS)) - return bodypart_owner.draw_color - - return bodypart_owner.owner.dna?.features["forced_mut_color"] || bodypart_owner.draw_color - /datum/bodypart_overlay/mutant/tail/fish/get_global_feature_list() return SSaccessories.tails_list_fish @@ -213,6 +206,7 @@ texture_bodypart_overlay = /datum/bodypart_overlay/texture/fishscale brute_modifier = 0.9 burn_modifier = 0.9 + wing_types = list(/obj/item/organ/wings/functional/angel, /obj/item/organ/wings/functional/dragon) /obj/item/bodypart/head/scaled texture_bodypart_overlay = /datum/bodypart_overlay/texture/fishscale diff --git a/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_lizard.dm b/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_lizard.dm index e5f3f9e57eaa..434c587d9f37 100644 --- a/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_lizard.dm +++ b/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_lizard.dm @@ -16,7 +16,7 @@ ) name = "Reptilid" - icon = FA_ICON_HAND_LIZARD + icon = FA_ICON_DRAGON /datum/animid_type/lizard/pre_species_gain(datum/species/human/animid/species, mob/living/carbon/human/new_animid) // ensures we get mutant color rather than a random forced color @@ -55,8 +55,7 @@ default_value = FALSE /datum/preference/toggle/liz_tongue_hissing/apply_to_human(mob/living/carbon/human/target, value) - if(!(is_species(target, /datum/species/human/animid) && (target.dna.features["animid_type"] == "Lizard"))) - return // sorry, but we're not blocking lizardpeople from hissing in this codebase + // behavior is only applied on animids by default target.dna.features["Hissing"] = value /datum/preference/toggle/liz_tongue_hissing/is_accessible(datum/preferences/preferences) From 133853db39beaa8317ce0d802487599395215a84 Mon Sep 17 00:00:00 2001 From: Yellow Wollywog <88261474+Wollywoger@users.noreply.github.com> Date: Sun, 26 Jul 2026 11:33:14 -0400 Subject: [PATCH 03/11] Apply first batch of suggestions as per the norm, these are verbatim changes that don't require much more than just adding them to a batch, credits to melbert Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> --- .../code/modules/client/preferences/species/lizard.dm | 2 +- .../living/carbon/human/species_types/animid/animid_lizard.dm | 4 ++-- .../preferences/features/_modular_species_features.tsx | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/maplestation_modules/code/modules/client/preferences/species/lizard.dm b/maplestation_modules/code/modules/client/preferences/species/lizard.dm index 6c54ea817103..a806fbaea35e 100644 --- a/maplestation_modules/code/modules/client/preferences/species/lizard.dm +++ b/maplestation_modules/code/modules/client/preferences/species/lizard.dm @@ -63,7 +63,7 @@ /datum/preference/numeric/hiss_length/is_accessible(datum/preferences/preferences) var/datum/species/target_species = preferences.read_preference(/datum/preference/choiced/species) // lizard animids, are, for many reasons, a bit funky so i'll add an exception for them - var/species_check = (ispath(target_species, /datum/species/human/animid)) && (preferences.read_preference(/datum/preference/choiced/animid_type) == "Lizard") + var/species_check = (ispath(target_species, /datum/species/human/animid)) && (preferences.read_preference(/datum/preference/choiced/animid_type) == /datum/animid_type/lizard::id) return ..() && (ispath(target_species::mutanttongue, /obj/item/organ/tongue/lizard) || species_check) /datum/preference/numeric/hiss_length/apply_to_human(mob/living/carbon/human/target, value) diff --git a/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_lizard.dm b/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_lizard.dm index 434c587d9f37..0f4fbf513868 100644 --- a/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_lizard.dm +++ b/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_lizard.dm @@ -11,7 +11,7 @@ /obj/item/organ/horns = SPRITE_ACCESSORY_NONE, /obj/item/organ/frills = SPRITE_ACCESSORY_NONE, /obj/item/organ/spines = SPRITE_ACCESSORY_NONE, - /obj/item/organ/tail/lizard = "Smooth", + /obj/item/organ/tail/lizard = /datum/sprite_accessory/tails/lizard/smooth::name, ), ) @@ -59,7 +59,7 @@ target.dna.features["Hissing"] = value /datum/preference/toggle/liz_tongue_hissing/is_accessible(datum/preferences/preferences) - return ..() && ((ispath(preferences.read_preference(/datum/preference/choiced/species), /datum/species/human/animid)) && (preferences.read_preference(/datum/preference/choiced/animid_type) == "Lizard")) + return ..() && ((ispath(preferences.read_preference(/datum/preference/choiced/species), /datum/species/human/animid)) && (preferences.read_preference(/datum/preference/choiced/animid_type) == /datum/animid_type/lizard::id)) /obj/item/organ/tongue/lizard/no_hiss // because modifies_speech only affects things on init name = "mutated forked tongue" diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/_modular_species_features.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/_modular_species_features.tsx index 2df744bba38e..649fa2725deb 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/_modular_species_features.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/_modular_species_features.tsx @@ -166,6 +166,7 @@ export const feature_fox_tail: FeatureChoiced = { name: 'Fox Tail', component: FeatureDropdownInput, }; + export const liz_tongue_hissing: FeatureToggle = { name: 'Lizard Speech', description: 'If checked, you will sssspeak like a lizardperson.', From 3c2f5da170da42ece9dedf1725e879de991d233b Mon Sep 17 00:00:00 2001 From: Wollywoger Date: Sun, 26 Jul 2026 11:46:29 -0400 Subject: [PATCH 04/11] second batch of review changes --- .../carbon/human/species_types/animid/animid_lizard.dm | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_lizard.dm b/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_lizard.dm index 0f4fbf513868..d0dc71363eba 100644 --- a/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_lizard.dm +++ b/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_lizard.dm @@ -21,13 +21,10 @@ /datum/animid_type/lizard/pre_species_gain(datum/species/human/animid/species, mob/living/carbon/human/new_animid) // ensures we get mutant color rather than a random forced color new_animid.dna?.features["forced_mut_color"] = new_animid.dna?.features["mcolor"] - if (new_animid.dna?.features["Hissing"] == TRUE) - components.Add(list(ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/lizard)) - else - components.Add(list(ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/lizard/no_hiss)) + species.mutanttongue = new_animid.dna?.features["hissing"] ? /obj/item/organ/tongue/lizard : /obj/item/organ/tongue/lizard/no_hiss /datum/animid_type/lizard/extra_feature_keys() - return list(/datum/preference/color/mutant_color::savefile_key, /datum/preference/toggle/liz_tongue_hissing::savefile_key) + return list(/datum/preference/color/mutant_color::savefile_key) /datum/animid_type/lizard/get_readable_features() return ..() + "Scales" @@ -56,7 +53,7 @@ /datum/preference/toggle/liz_tongue_hissing/apply_to_human(mob/living/carbon/human/target, value) // behavior is only applied on animids by default - target.dna.features["Hissing"] = value + target.dna.features["hissing"] = value /datum/preference/toggle/liz_tongue_hissing/is_accessible(datum/preferences/preferences) return ..() && ((ispath(preferences.read_preference(/datum/preference/choiced/species), /datum/species/human/animid)) && (preferences.read_preference(/datum/preference/choiced/animid_type) == /datum/animid_type/lizard::id)) From 588852b44e6ff6ed756f418855daf980227d47ea Mon Sep 17 00:00:00 2001 From: Yellow Wollywog <88261474+Wollywoger@users.noreply.github.com> Date: Sun, 26 Jul 2026 14:42:19 -0400 Subject: [PATCH 05/11] Update maplestation.dme --- maplestation.dme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maplestation.dme b/maplestation.dme index 59c4ee37d971..6f7e5c52b90e 100644 --- a/maplestation.dme +++ b/maplestation.dme @@ -6818,5 +6818,5 @@ #include "maplestation_modules\story_content\volkan_equipment\code\volkanpets_ai.dm" #include "maplestation_modules\story_content\volkan_equipment\datums\loadout_datum.dm" #include "maplestation_modules\story_content\wollys_items\code\wollysitems.dm" -#endif MAPLESTATION_STORY_CONTENT +#endif // MAPLESTATION_STORY_CONTENT // END_INCLUDE From 78462673b890f84b36221ad277a1dccc4f5cc495 Mon Sep 17 00:00:00 2001 From: Wollywoger Date: Sun, 26 Jul 2026 14:58:47 -0400 Subject: [PATCH 06/11] added the override color to tailspines, because they didn't inherit tailcolor's new color setting --- code/modules/surgery/organs/external/tails.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index b04684658d3e..426e0c87e351 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -228,6 +228,7 @@ var/wagging = FALSE /// Key for tail spine states, depends on the shape of the tail. Defined in the tail sprite datum. var/tail_spine_key = NONE + color_source = ORGAN_COLOR_MUTANT_OVERRIDE // NON-MODULE CHANGE /datum/bodypart_overlay/mutant/tail_spines/get_global_feature_list() return SSaccessories.tail_spines_list From e84af00745c71e63eaf0975f1a5b1fe5156bc6ed Mon Sep 17 00:00:00 2001 From: Yellow Wollywog <88261474+Wollywoger@users.noreply.github.com> Date: Thu, 30 Jul 2026 20:39:04 -0400 Subject: [PATCH 07/11] Update code/datums/bodypart_overlays/mutant_bodypart_overlay.dm Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> --- code/datums/bodypart_overlays/mutant_bodypart_overlay.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm index ebdc7ccaafa3..6132f583b1e9 100644 --- a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm @@ -133,8 +133,7 @@ draw_color = human_owner.hair_color // BEGIN NON-MODULE CHANGE if(ORGAN_COLOR_MUTANT_OVERRIDE) - var/the_color = mutant_override_color(bodypart_owner) - draw_color = the_color + draw_color = mutant_override_color(bodypart_owner) // END NON-MODULE CHANGE return TRUE From a1dd6e4936747ef5d30489afba3ccd42af5dd10d Mon Sep 17 00:00:00 2001 From: Wollywoger Date: Thu, 30 Jul 2026 20:42:04 -0400 Subject: [PATCH 08/11] changes frills to mutant_override --- code/modules/surgery/organs/external/_visual_organs.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/surgery/organs/external/_visual_organs.dm b/code/modules/surgery/organs/external/_visual_organs.dm index 9d7766a44d23..c0db98cb49ab 100644 --- a/code/modules/surgery/organs/external/_visual_organs.dm +++ b/code/modules/surgery/organs/external/_visual_organs.dm @@ -152,7 +152,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times /datum/bodypart_overlay/mutant/frills layers = EXTERNAL_ADJACENT feature_key = "frills" - color_source = ORGAN_COLOR_OVERRIDE + color_source = ORGAN_COLOR_MUTANT_OVERRIDE // NON-MODULE CHANGE /datum/bodypart_overlay/mutant/frills/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) return !(bodypart_owner.owner?.obscured_slots & HIDEEARS) @@ -160,11 +160,11 @@ Unlike normal organs, we're actually inside a persons limbs at all times /datum/bodypart_overlay/mutant/frills/get_global_feature_list() return SSaccessories.frills_list -/datum/bodypart_overlay/mutant/frills/override_color(obj/item/bodypart/bodypart_owner) +// BEGIN NON-MODULE CHANGE +/datum/bodypart_overlay/mutant/frills/mutant_override_color(obj/item/bodypart/bodypart_owner) // NOTE: this was originally in the slot of "override_color" but was changed to this. // prioritize a specific color they have set - if(bodypart_owner?.owner?.dna?.features["lizard_frill_color"]) - return bodypart_owner.owner.dna.features["lizard_frill_color"] - return mutant_override_color(bodypart_owner) + return bodypart_owner?.owner?.dna?.features["lizard_frill_color"] || ..() +// END NON-MODULE CHANGE /datum/bodypart_overlay/mutant/frills/generate_icon_cache(obj/item/bodypart/limb) . = ..() From b5d78829abfb267e7087720f5be21b4432e2d6ea Mon Sep 17 00:00:00 2001 From: Wollywoger Date: Thu, 30 Jul 2026 20:50:21 -0400 Subject: [PATCH 09/11] updates map icons --- icons/map_icons/items/pda.dmi | Bin 10988 -> 11621 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/map_icons/items/pda.dmi b/icons/map_icons/items/pda.dmi index 925d3d233bc05467602f35930a061beaec93729f..0712af49864f20397079b5c060e65008f60a5394 100644 GIT binary patch literal 11621 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 literal 10988 zcmZ{Kby!qg-}RuRh)5$yNOwq#2Tz1LoA{U%gRMHcS?#RCusgeNa2tpQwr-@UOhflmrf+hq_4 zt$y1O> z(M^7q4CVLf>)T*b7TQPDqFe77Sir0{KO%b{LD6_P@|1AsTQJwtgZNyeJnJ z|7d`|Xd{rX?{t=P|X3i60v zbHq!%xSvwmiRS%LQU~I+ir&Bb&3)kA0#$K4W@kRM-n*JIOE_Jr!JC1rvAfrX(7&7{ zOTkvHxCIXnLjm80-re&W#<`6ObZlSkXT5vMSpFR17%66hG$0TyNM8D-mS@^tx|gq} z_F`8izfJtU#3)^-no*$gHR=&--?IlhlKJR)Wa*;aj0~3M@ zU5I}9fQ27ej3~~^lGv*lDP1o(C(FvQ9m>IxW0VsSHyAGLT}qG1VncmaZEi0BG8Om< z64&j31ryT#fu_kJ_x_`&zdU`!nqEs@iXQ)X8Cf?~-S4mZuyyaG@xXuN?oO%I^~cxu zNsX`c$6k_6?5pF!h+7A^o1J@vU_{O4kKUX=AGkH3Pyach_5m&-pFlJgz#}1 zeo`oB2jdLl;3%=zI|ioVmpfbH;6%(b@KZ!8$;pMRHTudI-VZR@aYVfVnfj^e@nC{3 z#Tb&wQ9g1!93)_`y7qEw_l!d?2GbUC4)R!#3y!acUkz^NcPbCD626)`tPa9StRReB zB9NxqZ-=8@@6^Bd*lXsvrG3tC7})$zw;-Vmo|7tI`AsgXHV1ijRoSSg1SB*xG~6sv zbyyD{H2GQMMnaWev5tkWiF7wnM`#e!#vMF8_!6O!=W%^<9EJvxjZP=gcAEYc9Q#=} zqR`{`k_-*>@DatsD0fV7C02S;W|e_6frP4;r|6vU6F=d5>CpPzxU+?R{TD|fZ@PG* zozu{L&wjrg8pcdjB0A5v^$-_Wsm-K?pOyDs|M~gh%LPr-t#{A_h)mpv=WO9~v5?B| z!!oFtC)QKZLZRLFG)*u_@Gz5R0r!P1m-zLm!`bCz6O+>}^7hMawp6P9HNx$n<>Eou z$z-*R$r`v%;Eme!UcuK$RzKik6d?;%#PH1j*yU%UUeb;|e8k4uj5OTgdK6x#!`nTqUW2;^zR%WLe8mQaFoH3jG zDAfF=k*djeC+W+_oSK-a+P$#><9qUAfG#h9H%G z)o0>dYcNIbtaSC8AjT@<{`es94 z3T<-Ttx=|3#fgZ86V;(dwxu0AP2Ae!P?O?~XJr27RG#VZ`I7C^bz|jg)%xZx1yNwP zX$^sC1Fr07;p1-@*A;!`>qgR=44)Y}xog)DN0{AEd_+XFMAh%A)MyLJAZ+V0#W2ig zY}4;u-CM$cEcmu@QYRc0;rGc?pluPatY#u-Qm4PEtexwi0LP2VvTh=09xtJo>s_YXC|>6G#hP-y;8Q>OmNyQGk*-&si-X%tHZ68W){nODdQ{DiLca)*EMHB4 zPr4?>?2zYIxTi6$39D?|iCGsd`14jwd#<`?iA2(nkukF*#RmjC8BuPv2MW=fzFtpz zo0sQGt=_KCav>l&=-eYTqh>|p-$ON|`dRsl5 zh9Rw{TZVK0AA*beFzEt&`1@(F1jP zz2KqwD@b!ACZ94B$M{?IwrMm_ECr_<1>S=lTdH-&2&#U5gV)X4y8E~dA3uHsfl4OA z>g!)HFf-FXdxi#zNlSYON^_Bvyr;xORBqhzr*KEUgIaAHy4eB8)yw5EvG>^}=@U00 zyynW9-D9@-9n=kUzI&NzgcYD^Wu7p35RPpz=bwhknVWhrL?~=d*-BpMFj&B@iZAe)9SF1%{POstB~)>g>-%+$;pT z{~A%9Qz_5D|0L1>BwZ{dh&n>yV$q%u0Jr=lU)`o#2`Re0%eP{#OMat;F0N%y$P2p> zCx|eHjOuCW+4PtnZc?|~Jh9PN3|e$YX`M`CetAO&w= zX()#1-A2kMn%`$TQ$CTInMTqP2>%V;97HpYr$7NQ=x}a1JW#Nwcr%3h%-t}w*dtX3 z&oNZok6Ln503tl;Fz7;-zNvSGEa80Nyn;SpRn6hQ9!VDjV&N9v(}VUnypxJ3bA@Ov zvfLXnBt`uyOQ{nln2E9xq*T%8sB&_(Ue^bqFNf!30kp}hhYxNBb zpo16~kND!#n7C5;tfO)r&5xFe=@PhY6&{$JTIc%q>Be)vKs$H=d(l^LBNCuW)1e70 zH1|?>X%^>;Rszr8ja%L@gBBX?&&rC$;Mt3!K6!L;0>zc^)p#rdJVWC!n zg)6Da(Z7S(;d*O+S?$$``zLgX9Qrc#1B80r=ku`718)uy%!b*bd4+p7qb@a?&Kx4I z&dC^xcyE^#3~D6~HFKp;K4emSj7#FQI4N*{5;*nMm*op;HUXcvtpD-M4F*}Tx#^+D z=*`EUbCthW-p$;Q)jf%g>7(*t4a$r$2m(^6q9&89h1{3bz=TSAKhHZ{hCwLTHQ`@; z7t!ZuVeDh89U}I5-C|*7w{^!@g3bVb_gy%M`#pRK>`c!JG-$%3PB5hI)yto{zS)mR zh>2;JH!JH648k_&`hke@(5Z@IC7lZ6z>aUAce^N{1?PYtJP2AE z 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 auyAu0vL9*5a{&Kh1 Date: Fri, 31 Jul 2026 22:24:51 -0400 Subject: [PATCH 10/11] calms down screenshot tests by adding the right screenshots --- ...manoids_datum_species_human_animid_Lizard.png | Bin 0 -> 1276 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 code/modules/unit_tests/screenshots/screenshot_humanoids_datum_species_human_animid_Lizard.png diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids_datum_species_human_animid_Lizard.png b/code/modules/unit_tests/screenshots/screenshot_humanoids_datum_species_human_animid_Lizard.png new file mode 100644 index 0000000000000000000000000000000000000000..48b61a49d6c4158ff4929fa08c74e3adccd26c67 GIT binary patch literal 1276 zcmVkD4 zac^&LH8??dASk9TE*cskR}djqT4Q&6gC8I!EiE$^78@TQBpVwa4-XR~Bq<#oBy@3t z07U=*dH^Xj?cM+Y00DGTPE!Ct=GbNc003orR9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9` z^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3KAHiHkEO zv#1!Po{KZBC^0t`#5UwoR&e!m0hviG<=KLLK7&OXBHRc$+k_vS8FXhL~9p@#@c6gh(f%G76~m6F42Y>_)7^+ z-D}e{uU#tO{XS9b`%?Xo_T6i@$17hyq;C{y;2ESIwAy!jg;(xjlR6Cp>W3lmI2Gzn zcAALt4B$N&5UFR6gVb_RTIx=#K{89=Z>djxkMG3eN+zkCmdk6Ffn(sXc{G4gIF+|R zbq+u1usAT}1Wv3wz#fFl3C3v>AOHdaF->EJkN9-f`XP-OF7O0KEWaFB8Sz_&*R=a( zhN;hS5$mSK)-eMNqiyP#;ccV|CYobxGhDPy6CG|Fx^i4>n%f6@!IeTarpe&Qh+?D} zU0~;c6&X-6oic!Sf8hA_DOT0znLhVKAohGiE3-#koK*9|#8nZs;2dYb)=M$7wnW`f+6I zuee<)%rDi}Ae7eXcoL^0yl;nr_kdis=V!07M@t;+N-QF2j z{bzTuY~l|F;rpuprFvpm4Z` zgvac#z&J_%gzY(12lZfz)hsh-3iDG+&v0rk*rt%#vSK=pVU`@}FncL`Gx!ciuG zvPjCJ>{|lJ79A4>_fUM&I+zSaM~?I@?|^)Rlf3;{1Bb0g3am!nK_UVudk=9dc7U~! zKvrVNj2MZ(lhddQ_tB*Tz~dy{kUKdN|8as%#c_3|M;RR`xLJ4&q~D?#i-Sp6Tt?wp zi_}4ccX0U(7YZ1QhF00=Kr70T1+O~FHd2?F|M{6f46&7b!r6M51K6u#Js8#mZ_gZx zn_?!5P_8F=d^^k)tIuZ=tgjNVE&Lrpw*FG@zeeB}hMOKx@4fvR0ZHrcJ)CKP9=2hI z1vqUHoL~`PGK{A|o Date: Fri, 31 Jul 2026 22:55:14 -0400 Subject: [PATCH 11/11] there was a double underline and i got the filename wrong --- ...umanoids__datum_species_human_animid_Lizard.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename code/modules/unit_tests/screenshots/{screenshot_humanoids_datum_species_human_animid_Lizard.png => screenshot_humanoids__datum_species_human_animid_Lizard.png} (100%) diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids_datum_species_human_animid_Lizard.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_animid_Lizard.png similarity index 100% rename from code/modules/unit_tests/screenshots/screenshot_humanoids_datum_species_human_animid_Lizard.png rename to code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_animid_Lizard.png