From 697ef4c23e26a17dabe2532f2aed56cecbb75a02 Mon Sep 17 00:00:00 2001 From: Constellado <64122807+Constellado@users.noreply.github.com> Date: Tue, 9 Jul 2024 06:29:04 +1200 Subject: [PATCH] New Synth Customisation Options (#500) --- code/__DEFINES/DNA.dm | 4 +- code/__HELPERS/global_lists.dm | 1 + code/datums/dna.dm | 8 ++ code/modules/mob/living/carbon/human/dummy.dm | 1 + ...eenshot_humanoids__datum_species_synth.png | Bin 1042 -> 2564 bytes .../client/preferences/species/synth.dm | 43 ++++++++ .../mob/dead/new_player/sprite_accessories.dm | 14 +++ .../carbon/human/species_types/synth/synth.dm | 98 +++++++++++++++++- .../icons/mob/synth_heads.dmi | Bin 0 -> 3466 bytes .../features/_modular_species_features.tsx | 5 + 10 files changed, 168 insertions(+), 6 deletions(-) create mode 100644 maplestation_modules/icons/mob/synth_heads.dmi diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 6dc96b88ec16..fefc8d17f086 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -61,8 +61,9 @@ #define DNA_AVIAN_EARS_BLOCK 18 // NON-MODULE CHANGE #define DNA_AVIAN_TAIL_BLOCK 19 // NON-MODULE CHANGE #define DNA_FEATHER_COLOR_BLOCK 20 // NON-MODULE CHANGE +#define DNA_SYNTH_HEAD_COVER_BLOCK 21 // NON-MODULE CHANGE -#define DNA_FEATURE_BLOCKS 20 // NON-MODULE CHANGE +#define DNA_FEATURE_BLOCKS 21 // NON-MODULE CHANGE #define DNA_SEQUENCE_LENGTH 4 #define DNA_MUTATION_BLOCKS 8 @@ -104,6 +105,7 @@ #define ORGAN_SLOT_EXTERNAL_BODYMARKINGS "bodymarkings" #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" diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index d9157a58cf06..928a1b13c3d2 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -38,6 +38,7 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/arm_wingsopen, GLOB.arm_wingsopen_list) //NON-MODULE CHANGE init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/avian, GLOB.tails_list_avian) //NON-MODULE CHANGE init_sprite_accessory_subtypes(/datum/sprite_accessory/plumage, GLOB.avian_ears_list) //NON-MODULE CHANGE + init_sprite_accessory_subtypes(/datum/sprite_accessory/synth_head_cover, GLOB.synth_head_cover_list) //NON-MODULE CHANGE /// Inits GLOB.species_list. Not using GLOBAL_LIST_INIT b/c it depends on GLOB.string_lists /proc/init_species_list() diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 90f8536d0c5d..2d84900d7955 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -242,6 +242,9 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) L[DNA_AVIAN_EARS_BLOCK] = construct_block(GLOB.avian_ears_list.Find(features["ears_avian"]), GLOB.avian_ears_list.len) if(features["feathers"]) // NON-MODULE CHANGE L[DNA_FEATHER_COLOR_BLOCK] = sanitize_hexcolor(features["feathers"], include_crunch = FALSE) + if(features["synth_head_cover"]) // NON-MODULE CHANGE + L[DNA_SYNTH_HEAD_COVER_BLOCK] = construct_block(GLOB.synth_head_cover_list.Find(features["synth_head_cover"]), GLOB.synth_head_cover_list.len) + for(var/blocknum in 1 to DNA_FEATURE_BLOCKS) . += L[blocknum] || random_string(GET_UI_BLOCK_LEN(blocknum), GLOB.hex_characters) @@ -388,6 +391,9 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) set_uni_feature_block(blocknumber, construct_block(GLOB.avian_ears_list.Find(features["ears_avian"]), GLOB.avian_ears_list.len)) if(DNA_FEATHER_COLOR_BLOCK) // NON-MODULE CHANGE set_uni_feature_block(blocknumber, sanitize_hexcolor(features["feathers"], include_crunch = FALSE)) + if(DNA_SYNTH_HEAD_COVER_BLOCK) // NON-MODULE CHANGE + set_uni_feature_block(blocknumber, construct_block(GLOB.synth_head_cover_list.Find(features["head_tentacles"]), GLOB.synth_head_cover_list.len)) + //Please use add_mutation or activate_mutation instead /datum/dna/proc/force_give(datum/mutation/human/human_mutation) @@ -696,6 +702,8 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) dna.features["ears_avian"] = GLOB.avian_ears_list[deconstruct_block(get_uni_feature_block(features, DNA_AVIAN_EARS_BLOCK), GLOB.avian_ears_list.len)] if(dna.features["feathers"]) // NON-MODULE CHANGE dna.features["feathers"] = sanitize_hexcolor(get_uni_feature_block(features, DNA_FEATHER_COLOR_BLOCK)) + if(dna.features["synth_head_cover"]) // NON-MODULE CHANGE + dna.features["synth_head_cover"] = GLOB.synth_head_cover_list[deconstruct_block(get_uni_feature_block(features, DNA_SYNTH_HEAD_COVER_BLOCK), GLOB.synth_head_cover_list.len)] for(var/obj/item/organ/external/external_organ in organs) external_organ.mutate_feature(features, src) diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index e712de2e5bc2..305bf132f721 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -107,6 +107,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) target.dna.features["arm_wings"] = get_consistent_feature_entry(GLOB.arm_wings_list) // NON-MODULE CHANGE target.dna.features["tail_avian"] = get_consistent_feature_entry(GLOB.tails_list_avian) // NON-MODULE CHANGE target.dna.features["ears_avian"] = get_consistent_feature_entry(GLOB.avian_ears_list) // NON-MODULE CHANGE + target.dna.features["synth_head_cover"] = get_consistent_feature_entry(GLOB.synth_head_cover_list) // NON-MODULE CHANGE target.dna.features["feathers"] = "#FF3B76" //NON-MODULE CHANGE target.dna.initialize_dna(/datum/blood_type/crew/human/o_plus, create_mutation_blocks = FALSE, randomize_features = FALSE) //NON-MODULE CHANGE // UF and UI are nondeterministic, even though the features are the same some blocks will randomize slightly diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_synth.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_synth.png index d793ca168ba05d29eb9ca5e3f1033cf1e393902b..0167a33b51269cfb0a39dfb2e784837d09f746cb 100644 GIT binary patch literal 2564 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 CuilRU diff --git a/maplestation_modules/code/modules/client/preferences/species/synth.dm b/maplestation_modules/code/modules/client/preferences/species/synth.dm index ab518f252a2a..df02a4f7ebce 100644 --- a/maplestation_modules/code/modules/client/preferences/species/synth.dm +++ b/maplestation_modules/code/modules/client/preferences/species/synth.dm @@ -75,3 +75,46 @@ /datum/preference/choiced/synth_blood/is_accessible(datum/preferences/preferences) return ..() && ispath(preferences.read_preference(/datum/preference/choiced/species), /datum/species/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/external/synth_head_cover + should_generate_icons = TRUE + +/datum/preference/choiced/synth_head_cover/init_possible_values() + return assoc_to_keys(GLOB.synth_head_cover_list) + +/datum/preference/choiced/synth_head_cover/icon_for(value) + var/datum/sprite_accessory/sprite_accessory = GLOB.synth_head_cover_list[value] + var/icon/head = icon('maplestation_modules/icons/mob/synth_heads.dmi', "synth_head", SOUTH) + + var/icon/final_icon = icon(head) + + if (!isnull(sprite_accessory)) + for(var/side in list("ADJ", "FRONT")) + var/icon/accessory_icon = icon( + icon = 'maplestation_modules/icons/mob/synth_heads.dmi', + icon_state = "m_synth_head_cover_[sprite_accessory.icon_state]_ADJ", + dir = SOUTH, + ) + final_icon.Blend(accessory_icon, ICON_OVERLAY) + + final_icon.Crop(11, 20, 23, 32) + final_icon.Scale(32, 32) + final_icon.Blend(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 diff --git a/maplestation_modules/code/modules/mob/dead/new_player/sprite_accessories.dm b/maplestation_modules/code/modules/mob/dead/new_player/sprite_accessories.dm index 50c44c5db047..ecd0d34ceed1 100644 --- a/maplestation_modules/code/modules/mob/dead/new_player/sprite_accessories.dm +++ b/maplestation_modules/code/modules/mob/dead/new_player/sprite_accessories.dm @@ -256,6 +256,7 @@ icon ='maplestation_modules/icons/mob/clothing/underwear.dmi' gender = NEUTER +/// -- Frills -- /datum/sprite_accessory/frills/big name = "Big" icon_state = "big" @@ -266,6 +267,19 @@ 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 --- /datum/sprite_accessory/socks/pokersocks diff --git a/maplestation_modules/code/modules/mob/living/carbon/human/species_types/synth/synth.dm b/maplestation_modules/code/modules/mob/living/carbon/human/species_types/synth/synth.dm index c3e3eb93b240..757e872b57c4 100644 --- a/maplestation_modules/code/modules/mob/living/carbon/human/species_types/synth/synth.dm +++ b/maplestation_modules/code/modules/mob/living/carbon/human/species_types/synth/synth.dm @@ -1,5 +1,8 @@ // -- Synth additions (though barely functional) -- +/// GLOB list of head options +GLOBAL_LIST_EMPTY(synth_head_cover_list) + #define BODYPART_ID_SYNTH "synth" /mob/living/carbon/human/species/synth @@ -15,7 +18,7 @@ /datum/species/synth name = "Synth" id = SPECIES_SYNTH - sexes = FALSE + sexes = TRUE inherent_traits = list( TRAIT_AGEUSIA, TRAIT_NOBREATH, @@ -38,6 +41,9 @@ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/synth, BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/synth, ) + + external_organs = list(/obj/item/organ/external/synth_head_cover = "Helm") + mutantbrain = /obj/item/organ/internal/brain/cybernetic mutanttongue = /obj/item/organ/internal/tongue/robot mutantstomach = /obj/item/organ/internal/stomach/cybernetic/tier2 @@ -45,7 +51,7 @@ mutantheart = /obj/item/organ/internal/heart/cybernetic/tier2 mutantliver = /obj/item/organ/internal/liver/cybernetic/tier2 mutantlungs = null - mutanteyes = /obj/item/organ/internal/eyes/robotic + mutanteyes = /obj/item/organ/internal/eyes/robotic/synth mutantears = /obj/item/organ/internal/ears/cybernetic species_pain_mod = 0.2 exotic_bloodtype = /datum/blood_type/oil @@ -363,8 +369,8 @@ /obj/item/bodypart/head/synth limb_id = BODYPART_ID_SYNTH - icon_static = 'icons/mob/human/bodyparts.dmi' - icon = 'icons/mob/human/bodyparts.dmi' + icon_static = 'maplestation_modules/icons/mob/synth_heads.dmi' + icon = 'maplestation_modules/icons/mob/synth_heads.dmi' icon_state = "synth_head" should_draw_greyscale = FALSE obj_flags = CONDUCTS_ELECTRICITY @@ -373,7 +379,7 @@ brute_modifier = 0.8 burn_modifier = 0.8 biological_state = BIO_ROBOTIC|BIO_BLOODED - head_flags = NONE + head_flags = HEAD_EYESPRITES | HEAD_EYECOLOR change_exempt_flags = BP_BLOCK_CHANGE_SPECIES /obj/item/bodypart/chest/synth @@ -447,4 +453,86 @@ biological_state = BIO_ROBOTIC|BIO_BLOODED change_exempt_flags = BP_BLOCK_CHANGE_SPECIES +/obj/item/organ/internal/eyes/robotic/synth + name = "synth eyes" + +// Organ for synth head covers. + +/obj/item/organ/external/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" + + dna_block = DNA_SYNTH_HEAD_COVER_BLOCK + organ_flags = ORGAN_ROBOTIC + + bodypart_overlay = /datum/bodypart_overlay/mutant/synth_head_cover + + +/obj/item/organ/external/synth_head_cover/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) + . = ..() + var/mob/living/carbon/human/robot_target = organ_owner + var/obj/item/bodypart/head/noggin = robot_target.get_bodypart(BODY_ZONE_HEAD) + + noggin.head_flags &= ~HEAD_EYESPRITES + + +/obj/item/organ/external/synth_head_cover/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags) + . = ..() + var/mob/living/carbon/human/robot_target = organ_owner + var/obj/item/bodypart/head/noggin = robot_target.get_bodypart(BODY_ZONE_HEAD) + + noggin.head_flags &= HEAD_EYESPRITES + + +//-- overlay -- +/datum/bodypart_overlay/mutant/synth_head_cover/get_global_feature_list() + return GLOB.synth_head_cover_list + +/datum/bodypart_overlay/mutant/synth_head_cover/can_draw_on_bodypart(mob/living/carbon/human/human) + if((human.head?.flags_inv & HIDEHAIR) || (human.wear_mask?.flags_inv & HIDEHAIR)) + return FALSE + return TRUE + +/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" + +// add more here!! + + #undef BODYPART_ID_SYNTH diff --git a/maplestation_modules/icons/mob/synth_heads.dmi b/maplestation_modules/icons/mob/synth_heads.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4023357e4e194df70644d8bc5c4ef61c58f589b0 GIT binary patch literal 3466 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