diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index fd50b8b70d..92cee59860 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -139,6 +139,9 @@ #define STYLE_PAW_TAURIC (1<<3) #define STYLE_HOOF_TAURIC (1<<4) #define STYLE_ALL_TAURIC (STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC|STYLE_HOOF_TAURIC) +#define USE_SNEK_CLIP_MASK (1<<5) +#define USE_HOOF_CLIP_MASK (1<<6) +#define USE_TAUR_CLIP_MASK (USE_SNEK_CLIP_MASK|USE_HOOF_CLIP_MASK) //digitigrade legs settings. #define NOT_DIGITIGRADE 0 diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 3fb149d071..e8ca6f444c 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -35,15 +35,15 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s #define BODY_ADJ_LAYER 27 //certain mutantrace features (snout, body markings) that must appear above the body parts #define GENITALS_FRONT_LAYER 26 //Draws some genitalia above clothes and the TAUR body if need be. #define BODY_LAYER 25 //underwear, undershirts, socks, eyes, lips(makeup) -#define FRONT_MUTATIONS_LAYER 24 //mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes) -#define DAMAGE_LAYER 23 //damage indicators (cuts and burns) -#define UNIFORM_LAYER 22 -#define ID_LAYER 21 -#define HANDS_PART_LAYER 20 -#define SHOES_LAYER 19 -#define GLOVES_LAYER 18 -#define EARS_LAYER 17 -#define BODY_TAUR_LAYER 16 +#define BODY_ADJ_UPPER_LAYER 24 +#define FRONT_MUTATIONS_LAYER 23 //mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes) +#define DAMAGE_LAYER 22 //damage indicators (cuts and burns) +#define UNIFORM_LAYER 21 +#define ID_LAYER 20 +#define HANDS_PART_LAYER 19 +#define SHOES_LAYER 18 +#define GLOVES_LAYER 17 +#define EARS_LAYER 16 #define SUIT_LAYER 15 #define GENITALS_EXPOSED_LAYER 14 #define GLASSES_LAYER 13 diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 968995e81d..ed037968ef 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -137,8 +137,10 @@ GLOBAL_LIST_INIT(jumpsuitlist, list(PREF_SUIT, PREF_SKIRT)) #define UPLINK_PEN "Pen" //like a real spy! GLOBAL_LIST_INIT(uplink_spawn_loc_list, list(UPLINK_PDA, UPLINK_RADIO, UPLINK_PEN)) - //Female Uniforms -GLOBAL_LIST_EMPTY(female_clothing_icons) +//List of alpha masked cached icons. +GLOBAL_LIST_EMPTY(alpha_masked_worn_clothing_icons) +//List containing alpha mask /icons in a 'state = list(icon, offset_x, offset_y)' +GLOBAL_LIST_EMPTY(worn_alpha_masks) //radical shit GLOBAL_LIST_INIT(hit_appends, list("-OOF", "-ACK", "-UGH", "-HRNK", "-HURGH", "-GLORF")) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 7da9d5a1dc..78f6f52ee7 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -159,6 +159,15 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["cock_shape"] = malformed_hockeys[hockey] features["cock_taur"] = TRUE + if(current_version < 29) + switch(features["taur"]) + if("Husky", "Lab", "Shepherd", "Fox", "Wolf") + features["taur"] = "Canine" + if("Panther", "Tiger") + features["taur"] = "Feline" + if("Cow") + features["taur"] = "Cow (Spotted)" + /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) return diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index d484027ad5..2fd52ed048 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -173,12 +173,37 @@ SEE_PIXELS// if an object is located on an unlit area, but some of its pixels ar BLIND // can't see anything */ -/proc/generate_female_clothing(index,t_color,icon,type) - var/icon/female_clothing_icon = icon("icon"=icon, "icon_state"=t_color) - var/icon/female_s = icon("icon"='icons/mob/clothing/uniform.dmi', "icon_state"="[(type == FEMALE_UNIFORM_FULL) ? "female_full" : "female_top"]") - female_clothing_icon.Blend(female_s, ICON_MULTIPLY) - female_clothing_icon = fcopy_rsc(female_clothing_icon) - GLOB.female_clothing_icons[index] = female_clothing_icon +#if DM_VERSION >= 513 // Yes! Filters! + +/proc/generate_alpha_masked_clothing(index,state,icon,layer,female,alpha_masks) + var/mutable_appearance/M = mutable_appearance(icon, state, layer = layer) + if(female) + var/icon/female_s = icon('icons/mob/clothing/uniform.dmi', "[(female == FEMALE_UNIFORM_FULL) ? "female_full" : "female_top"]") + M.filters += filter(type="alpha",icon = female_s) + if(alpha_masks) + if(istext(alpha_masks)) + alpha_masks = list(alpha_masks) + for(var/k in alpha_masks) + var/list/L = GLOB.worn_alpha_masks[k] + M.filters += filter(type="alpha", x = L[1], y = L[2], icon = L[3]) + . = GLOB.alpha_masked_worn_clothing_icons[index] = M + +#else + +/proc/generate_alpha_masked_clothing(index,state,icon,layer,female,alpha_masks) + var/icon/I = icon(icon, state) + if(female) + var/icon/female_s = icon('icons/mob/clothing/uniform.dmi', "[(female == FEMALE_UNIFORM_FULL) ? "female_full" : "female_top"]") + I.Blend(female_s, ICON_MULTIPLY) + if(alpha_masks) + if(istext(alpha_masks)) + alpha_masks = list(alpha_masks) + for(var/k in alpha_masks) + var/list/L = GLOB.worn_alpha_masks[k] + I.Blend(L[3], ICON_MULTIPLY, L[1], L[2]) + GLOB.alpha_masked_worn_clothing_icons[index] = fcopy_rsc(I) + +#endif /obj/item/clothing/proc/weldingvisortoggle(mob/user) //proc to toggle welding visors on helmets, masks, goggles, etc. if(!can_use(user)) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm index ab278b2e82..7b383d22b5 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm @@ -16,6 +16,7 @@ from doing this unless you absolutely know what you are doing, and have defined a conversion in savefile.dm */ + /proc/init_sprite_accessory_subtypes(prototype, list/L, list/male, list/female, roundstart = FALSE, skip_prototype = TRUE)//Roundstart argument builds a specific list for roundstart parts where some parts may be locked if(!istype(L)) L = list() @@ -60,6 +61,9 @@ var/dimension_x = 32 var/dimension_y = 32 var/center = FALSE //Should we center the sprite? + var/list/relevant_layers //list of layers that this accessory uses. As of now only used in species.handle_mutant_bodyparts(), but that's where most sprite accessories are anyway. + var/mutant_part_string //Also used in species.handle_mutant_bodyparts() to generate the overlay icon state. + var/alpha_mask_state //Special / holdover traits for Citadel specific sprites. var/extra = FALSE @@ -75,6 +79,22 @@ //For soft-restricting markings to species IDs var/list/recommended_species +/datum/sprite_accessory/New() + if(alpha_mask_state) + alpha_mask_state = "[icon]-[alpha_mask_state]" //foolproofing against states with same name but different files. + if(!GLOB.worn_alpha_masks[alpha_mask_state]) + var/image/I = icon(icon, alpha_mask_state) + var/x_offset = 0 + var/y_offset = 0 + if(center) + x_offset = -((dimension_x/world.icon_size)-1)*(world.icon_size*0.5) + y_offset = -((dimension_y/world.icon_size)-1)*(world.icon_size*0.5) + if(dimension_x < world.icon_size) + x_offset *= -1 + if(dimension_y < world.icon_size) + y_offset *= -1 + GLOB.worn_alpha_masks[alpha_mask_state] = list(x_offset, y_offset, I) + /datum/sprite_accessory/underwear icon = 'icons/mob/clothing/underwear.dmi' var/has_color = FALSE diff --git a/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm b/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm index 6c0659f851..c8e7aca26d 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm @@ -4,6 +4,8 @@ *******************************************/ /datum/sprite_accessory/xeno_dorsal icon = 'modular_citadel/icons/mob/xeno_parts_greyscale.dmi' + mutant_part_string = "xenodorsal" + relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/xeno_dorsal/standard name = "Standard" @@ -22,9 +24,12 @@ *******************************************/ /datum/sprite_accessory/xeno_tail icon = 'modular_citadel/icons/mob/xeno_parts_greyscale.dmi' + mutant_part_string = "tail" + relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/xeno_tail/none name = "None" + relevant_layers = null /datum/sprite_accessory/xeno_tail/standard name = "Xenomorph Tail" @@ -35,6 +40,8 @@ *******************************************/ /datum/sprite_accessory/xeno_head icon = 'modular_citadel/icons/mob/xeno_parts_greyscale.dmi' + mutant_part_string = "xhead" + relevant_layers = list(BODY_ADJ_LAYER) /datum/sprite_accessory/xeno_head/standard name = "Standard" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm index 8f043125b2..9950f0d76a 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm @@ -4,10 +4,12 @@ /datum/sprite_accessory/body_markings icon = 'icons/mob/mutant_bodyparts.dmi' + relevant_layers = list(BODY_ADJ_LAYER) /datum/sprite_accessory/body_markings/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/body_markings/dtiger name = "Dark Tiger Body" @@ -45,6 +47,7 @@ icon_state = "none" ckeys_allowed = list("yousshouldnteverbeseeingthisyoumeme") icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + relevant_layers = null /datum/sprite_accessory/mam_body_markings/plain name = "Plain" @@ -219,10 +222,12 @@ /datum/sprite_accessory/insect_fluff icon = 'icons/mob/wings.dmi' color_src = 0 + relevant_layers = list(BODY_FRONT_LAYER) /datum/sprite_accessory/insect_fluff/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/insect_fluff/plain name = "Plain" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/caps.dm b/code/modules/mob/dead/new_player/sprite_accessories/caps.dm index debb4865ba..822fcf960d 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/caps.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/caps.dm @@ -1,7 +1,8 @@ datum/sprite_accessory/caps icon = 'icons/mob/mutant_bodyparts.dmi' color_src = HAIR + relevant_layers = list(BODY_ADJ_LAYER) /datum/sprite_accessory/caps/round name = "Round" - icon_state = "round" \ No newline at end of file + icon_state = "round" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm index c91bd633a5..c60abbeefa 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm @@ -1,9 +1,12 @@ /datum/sprite_accessory/ears icon = 'icons/mob/mutant_bodyparts.dmi' + mutant_part_string = "ears" + relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/ears/none name = "None" icon_state = "none" + relevant_layers = null /****************************************** *************** Human Ears **************** @@ -172,10 +175,13 @@ /datum/sprite_accessory/mam_ears icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED + mutant_part_string = "ears" + relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/mam_ears/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/mam_ears/axolotl name = "Axolotl" @@ -309,4 +315,4 @@ /datum/sprite_accessory/mam_ears/bunny name = "Bunny" - icon_state = "bunny" \ No newline at end of file + icon_state = "bunny" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/frills.dm b/code/modules/mob/dead/new_player/sprite_accessories/frills.dm index 93c4af6df0..0aaec309a4 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/frills.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/frills.dm @@ -1,9 +1,11 @@ /datum/sprite_accessory/frills icon = 'icons/mob/mutant_bodyparts.dmi' + relevant_layers = list(BODY_ADJ_LAYER) /datum/sprite_accessory/frills/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/frills/simple name = "Simple" @@ -15,4 +17,4 @@ /datum/sprite_accessory/frills/aquatic name = "Aquatic" - icon_state = "aqua" \ No newline at end of file + icon_state = "aqua" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/horns.dm b/code/modules/mob/dead/new_player/sprite_accessories/horns.dm index a630ead7b3..6126b6c04b 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/horns.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/horns.dm @@ -1,10 +1,12 @@ /datum/sprite_accessory/horns icon = 'icons/mob/mutant_bodyparts.dmi' color_src = HORNCOLOR + relevant_layers = list(BODY_ADJ_LAYER) /datum/sprite_accessory/horns/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/horns/simple name = "Simple" @@ -33,4 +35,4 @@ /datum/sprite_accessory/horns/guilmon name = "Guilmon" - icon_state = "guilmon" \ No newline at end of file + icon_state = "guilmon" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm b/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm index d47607f6fd..e38d9b7341 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm @@ -5,6 +5,7 @@ /datum/sprite_accessory/screen icon = 'modular_citadel/icons/mob/ipc_screens.dmi' color_src = null + relevant_layers = list(BODY_ADJ_LAYER) /datum/sprite_accessory/screen/blank name = "Blank" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm b/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm index fe154ffeec..3aec01d557 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm @@ -22,28 +22,38 @@ /datum/sprite_accessory/taur icon = 'modular_citadel/icons/mob/mam_taur.dmi' extra_icon = 'modular_citadel/icons/mob/mam_taur.dmi' - extra = TRUE extra2_icon = 'modular_citadel/icons/mob/mam_taur.dmi' - extra2 = TRUE center = TRUE dimension_x = 64 - var/taur_mode = NONE //Must be a single specific tauric suit variation bitflag. Don't do FLAG_1|FLAG_2 - var/alt_taur_mode = NONE //Same as above. color_src = MATRIXED recommended_species = list("human", "lizard", "insect", "mammal", "xeno", "jelly", "slimeperson", "podweak") + relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_UPPER_LAYER, BODY_FRONT_LAYER) + var/taur_mode = NONE //Must be a single specific tauric suit variation bitflag. Don't do FLAG_1|FLAG_2 + var/alt_taur_mode = NONE //Same as above. + var/hide_legs = USE_HOOF_CLIP_MASK + alpha_mask_state = "taur_mask_def" + /datum/sprite_accessory/taur/none - dimension_x = 32 - center = FALSE name = "None" icon_state = "None" + dimension_x = 32 + center = FALSE recommended_species = null + relevant_layers = null + hide_legs = FALSE /datum/sprite_accessory/taur/cow name = "Cow" icon_state = "cow" taur_mode = STYLE_HOOF_TAURIC alt_taur_mode = STYLE_PAW_TAURIC + color_src = MUTCOLORS + +/datum/sprite_accessory/taur/cow/spotted + name = "Cow (Spotted)" + icon_state = "cow_spotted" + color_src = MATRIXED /datum/sprite_accessory/taur/deer name = "Deer" @@ -56,27 +66,21 @@ name = "Drake" icon_state = "drake" taur_mode = STYLE_PAW_TAURIC + color_src = MUTCOLORS + extra = TRUE /datum/sprite_accessory/taur/drider name = "Drider" icon_state = "drider" color_src = MUTCOLORS + extra = TRUE /datum/sprite_accessory/taur/eevee name = "Eevee" icon_state = "eevee" taur_mode = STYLE_PAW_TAURIC color_src = MUTCOLORS - -/datum/sprite_accessory/taur/fox - name = "Fox" - icon_state = "fox" - taur_mode = STYLE_PAW_TAURIC - -/datum/sprite_accessory/taur/husky - name = "Husky" - icon_state = "husky" - taur_mode = STYLE_PAW_TAURIC + extra = TRUE /datum/sprite_accessory/taur/horse name = "Horse" @@ -84,15 +88,12 @@ taur_mode = STYLE_HOOF_TAURIC alt_taur_mode = STYLE_PAW_TAURIC -/datum/sprite_accessory/taur/lab - name = "Lab" - icon_state = "lab" - taur_mode = STYLE_PAW_TAURIC - /datum/sprite_accessory/taur/naga name = "Naga" icon_state = "naga" taur_mode = STYLE_SNEK_TAURIC + hide_legs = USE_SNEK_CLIP_MASK + alpha_mask_state = "taur_mask_naga" /datum/sprite_accessory/taur/otie name = "Otie" @@ -104,29 +105,26 @@ icon_state = "pede" taur_mode = STYLE_PAW_TAURIC color_src = MUTCOLORS - -/datum/sprite_accessory/taur/panther - name = "Panther" - icon_state = "panther" - taur_mode = STYLE_PAW_TAURIC - -/datum/sprite_accessory/taur/shepherd - name = "Shepherd" - icon_state = "shepherd" - taur_mode = STYLE_PAW_TAURIC + extra = TRUE + extra2 = TRUE /datum/sprite_accessory/taur/tentacle name = "Tentacle" icon_state = "tentacle" taur_mode = STYLE_SNEK_TAURIC color_src = MUTCOLORS + hide_legs = USE_SNEK_CLIP_MASK -/datum/sprite_accessory/taur/tiger - name = "Tiger" - icon_state = "tiger" +/datum/sprite_accessory/taur/canine + name = "Canine" + icon_state = "canine" taur_mode = STYLE_PAW_TAURIC + color_src = MUTCOLORS + extra = TRUE -/datum/sprite_accessory/taur/wolf - name = "Wolf" - icon_state = "wolf" +/datum/sprite_accessory/taur/feline + name = "Feline" + icon_state = "feline" taur_mode = STYLE_PAW_TAURIC + color_src = MUTCOLORS + extra = TRUE diff --git a/code/modules/mob/dead/new_player/sprite_accessories/pines.dm b/code/modules/mob/dead/new_player/sprite_accessories/pines.dm index 4ccbc3d9ea..0885a6eb9f 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/pines.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/pines.dm @@ -7,6 +7,7 @@ /datum/sprite_accessory/spines/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/spines_animated/none name = "None" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm index c016e9b119..61763e21ee 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm @@ -1,5 +1,6 @@ /datum/sprite_accessory/snouts icon = 'icons/mob/mutant_bodyparts.dmi' + mutant_part_string = "snout" /datum/sprite_accessory/snouts/sharp name = "Sharp" @@ -152,11 +153,13 @@ color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_snouts.dmi' recommended_species = list("mammal", "slimeperson", "insect", "podweak") + mutant_part_string = "snout" /datum/sprite_accessory/mam_snouts/none name = "None" icon_state = "none" recommended_species = null + relevant_layers = null /datum/sprite_accessory/mam_snouts/bird name = "Beak" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm index 90980743e1..a48df5e41e 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm @@ -1,8 +1,10 @@ /datum/sprite_accessory/tails icon = 'icons/mob/mutant_bodyparts.dmi' + mutant_part_string = "tail" /datum/sprite_accessory/tails_animated icon = 'icons/mob/mutant_bodyparts.dmi' + mutant_part_string = "tailwag" /****************************************** ************* Lizard Tails **************** @@ -43,10 +45,12 @@ /datum/sprite_accessory/tails/lizard/none name = "None" icon_state = "None" + relevant_layers = null /datum/sprite_accessory/tails_animated/lizard/none name = "None" icon_state = "None" + relevant_layers = null /datum/sprite_accessory/tails/lizard/axolotl name = "Axolotl" @@ -85,10 +89,12 @@ /datum/sprite_accessory/tails/human/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/tails_animated/human/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/tails/human/ailurus name = "Red Panda" @@ -502,20 +508,23 @@ color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' recommended_species = list("mammal", "slimeperson", "podweak", "felinid", "insect") + mutant_part_string = "tail" /datum/sprite_accessory/mam_tails/none name = "None" icon_state = "none" recommended_species = null + relevant_layers = null /datum/sprite_accessory/mam_tails_animated color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + mutant_part_string = "tail" /datum/sprite_accessory/mam_tails_animated/none name = "None" icon_state = "none" - color_src = MATRIXED + relevant_layers = null /datum/sprite_accessory/mam_tails/ailurus name = "Red Panda" @@ -576,7 +585,7 @@ /datum/sprite_accessory/mam_tails_animated/catbig name = "Cat, Big" icon_state = "catbig" - + /datum/sprite_accessory/mam_tails/twocat name = "Cat, Double" icon_state = "twocat" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm index 9c1eb6a3fa..2b25fe8848 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm @@ -3,6 +3,7 @@ /datum/sprite_accessory/wings/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/wings_open icon = 'icons/mob/wings.dmi' @@ -17,6 +18,7 @@ /datum/sprite_accessory/wings icon = 'icons/mob/wings.dmi' + relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/wings/angel name = "Angel" @@ -32,10 +34,13 @@ /datum/sprite_accessory/deco_wings icon = 'icons/mob/wings.dmi' color_src = WINGCOLOR + mutant_part_string = "insect_wings" + relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/deco_wings/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/deco_wings/angel name = "Angel" @@ -130,10 +135,12 @@ /datum/sprite_accessory/insect_wings icon = 'icons/mob/wings.dmi' color_src = WINGCOLOR + relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/insect_wings/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/insect_wings/bat name = "Bat" @@ -231,10 +238,12 @@ /datum/sprite_accessory/insect_markings // Extra markings for insects ported from tg. icon = 'icons/mob/insect_markings.dmi' color_src = null + relevant_layers = list(BODY_ADJ_LAYER) /datum/sprite_accessory/insect_markings/none name = "None" icon_state = "none" + relevant_layers = null /datum/sprite_accessory/insect_markings/reddish name = "Reddish" @@ -290,4 +299,4 @@ /datum/sprite_accessory/insect_markings/witchwing name = "Witch Wing" - icon_state = "witchwing" \ No newline at end of file + icon_state = "witchwing" diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index e39ce7d488..d1b408444c 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -582,7 +582,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/state = "[T.icon_state][((DIGITIGRADE in species_traits) && T.has_digitigrade) ? "_d" : ""]" var/mutable_appearance/MA if(H.dna.species.sexes && H.dna.features["body_model"] == FEMALE) - MA = wear_female_version(state, T.icon, BODY_LAYER) + MA = wear_alpha_masked_version(state, T.icon, -BODY_LAYER, FEMALE_UNIFORM_TOP) else MA = mutable_appearance(T.icon, state, -BODY_LAYER) if(T.has_color) @@ -597,15 +597,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) /datum/species/proc/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour) var/list/bodyparts_to_add = mutant_bodyparts.Copy() - var/list/relevent_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER, BODY_TAUR_LAYER) + var/list/relevant_layers = list() + var/list/dna_feature_as_text_string = list() var/list/standing = list() H.remove_overlay(BODY_BEHIND_LAYER) H.remove_overlay(BODY_ADJ_LAYER) + H.remove_overlay(BODY_ADJ_UPPER_LAYER) H.remove_overlay(BODY_FRONT_LAYER) - //CITADEL EDIT - Do not forget to add this to relevent_layers list just above too! - H.remove_overlay(BODY_TAUR_LAYER) - //END EDIT if(!mutant_bodyparts) return @@ -742,113 +741,110 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!bodyparts_to_add) return + for(var/bodypart in bodyparts_to_add) + var/datum/sprite_accessory/S + switch(bodypart) + if("tail_lizard") + S = GLOB.tails_list_lizard[H.dna.features["tail_lizard"]] + if("waggingtail_lizard") + S = GLOB.animated_tails_list_lizard[H.dna.features["tail_lizard"]] + if("tail_human") + S = GLOB.tails_list_human[H.dna.features["tail_human"]] + if("waggingtail_human") + S = GLOB.animated_tails_list_human[H.dna.features["tail_human"]] + if("spines") + S = GLOB.spines_list[H.dna.features["spines"]] + if("waggingspines") + S = GLOB.animated_spines_list[H.dna.features["spines"]] + if("snout") + S = GLOB.snouts_list[H.dna.features["snout"]] + if("frills") + S = GLOB.frills_list[H.dna.features["frills"]] + if("horns") + S = GLOB.horns_list[H.dna.features["horns"]] + if("ears") + S = GLOB.ears_list[H.dna.features["ears"]] + if("body_markings") + S = GLOB.body_markings_list[H.dna.features["body_markings"]] + if("wings") + S = GLOB.wings_list[H.dna.features["wings"]] + if("wingsopen") + S = GLOB.wings_open_list[H.dna.features["wings"]] + if("deco_wings") + S = GLOB.deco_wings_list[H.dna.features["deco_wings"]] + if("legs") + S = GLOB.legs_list[H.dna.features["legs"]] + if("insect_wings") + S = GLOB.insect_wings_list[H.dna.features["insect_wings"]] + if("insect_fluff") + S = GLOB.insect_fluffs_list[H.dna.features["insect_fluff"]] + if("insect_markings") + S = GLOB.insect_markings_list[H.dna.features["insect_markings"]] + if("caps") + S = GLOB.caps_list[H.dna.features["caps"]] + if("ipc_screen") + S = GLOB.ipc_screens_list[H.dna.features["ipc_screen"]] + if("ipc_antenna") + S = GLOB.ipc_antennas_list[H.dna.features["ipc_antenna"]] + if("mam_tail") + S = GLOB.mam_tails_list[H.dna.features["mam_tail"]] + if("mam_waggingtail") + S = GLOB.mam_tails_animated_list[H.dna.features["mam_tail"]] + if("mam_body_markings") + S = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]] + if("mam_ears") + S = GLOB.mam_ears_list[H.dna.features["mam_ears"]] + if("mam_snouts") + S = GLOB.mam_snouts_list[H.dna.features["mam_snouts"]] + if("taur") + S = GLOB.taur_list[H.dna.features["taur"]] + if("xenodorsal") + S = GLOB.xeno_dorsal_list[H.dna.features["xenodorsal"]] + if("xenohead") + S = GLOB.xeno_head_list[H.dna.features["xenohead"]] + if("xenotail") + S = GLOB.xeno_tail_list[H.dna.features["xenotail"]] + + if(!S || S.icon_state == "none") + continue + + for(var/L in S.relevant_layers) + LAZYADD(relevant_layers["[L]"], S) + if(!S.mutant_part_string) + dna_feature_as_text_string[S] = bodypart + + var/static/list/layer_text = list("[BODY_BEHIND_LAYER]" = "_BEHIND", "[BODY_ADJ_LAYER]" = "_ADJ", \ + "[BODY_ADJ_UPPER_LAYER]" = "_ADJUP", "[BODY_FRONT_LAYER]" = "_FRONT") + var/g = (H.dna.features["body_model"] == FEMALE) ? "f" : "m" + var/list/colorlist = list() + var/husk = HAS_TRAIT(H, TRAIT_HUSK) + colorlist += husk ? ReadRGB("#a3a3a3") :ReadRGB("[H.dna.features["mcolor"]]0") + colorlist += husk ? ReadRGB("#a3a3a3") :ReadRGB("[H.dna.features["mcolor2"]]0") + colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("[H.dna.features["mcolor3"]]0") + colorlist += list(0,0,0, hair_alpha) + for(var/index in 1 to colorlist.len) + colorlist[index] /= 255 - for(var/layer in relevent_layers) - var/layertext = mutant_bodyparts_layertext(layer) - - for(var/bodypart in bodyparts_to_add) - var/datum/sprite_accessory/S - switch(bodypart) - if("tail_lizard") - S = GLOB.tails_list_lizard[H.dna.features["tail_lizard"]] - if("waggingtail_lizard") - S = GLOB.animated_tails_list_lizard[H.dna.features["tail_lizard"]] - if("tail_human") - S = GLOB.tails_list_human[H.dna.features["tail_human"]] - if("waggingtail_human") - S = GLOB.animated_tails_list_human[H.dna.features["tail_human"]] - if("spines") - S = GLOB.spines_list[H.dna.features["spines"]] - if("waggingspines") - S = GLOB.animated_spines_list[H.dna.features["spines"]] - if("snout") - S = GLOB.snouts_list[H.dna.features["snout"]] - if("frills") - S = GLOB.frills_list[H.dna.features["frills"]] - if("horns") - S = GLOB.horns_list[H.dna.features["horns"]] - if("ears") - S = GLOB.ears_list[H.dna.features["ears"]] - if("body_markings") - S = GLOB.body_markings_list[H.dna.features["body_markings"]] - if("wings") - S = GLOB.wings_list[H.dna.features["wings"]] - if("wingsopen") - S = GLOB.wings_open_list[H.dna.features["wings"]] - if("deco_wings") - S = GLOB.deco_wings_list[H.dna.features["deco_wings"]] - if("legs") - S = GLOB.legs_list[H.dna.features["legs"]] - if("insect_wings") - S = GLOB.insect_wings_list[H.dna.features["insect_wings"]] - if("insect_fluff") - S = GLOB.insect_fluffs_list[H.dna.features["insect_fluff"]] - if("insect_markings") - S = GLOB.insect_markings_list[H.dna.features["insect_markings"]] - if("caps") - S = GLOB.caps_list[H.dna.features["caps"]] - if("ipc_screen") - S = GLOB.ipc_screens_list[H.dna.features["ipc_screen"]] - if("ipc_antenna") - S = GLOB.ipc_antennas_list[H.dna.features["ipc_antenna"]] - if("mam_tail") - S = GLOB.mam_tails_list[H.dna.features["mam_tail"]] - if("mam_waggingtail") - S = GLOB.mam_tails_animated_list[H.dna.features["mam_tail"]] - if("mam_body_markings") - S = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]] - if("mam_ears") - S = GLOB.mam_ears_list[H.dna.features["mam_ears"]] - if("mam_snouts") - S = GLOB.mam_snouts_list[H.dna.features["mam_snouts"]] - if("taur") - S = GLOB.taur_list[H.dna.features["taur"]] - if("xenodorsal") - S = GLOB.xeno_dorsal_list[H.dna.features["xenodorsal"]] - if("xenohead") - S = GLOB.xeno_head_list[H.dna.features["xenohead"]] - if("xenotail") - S = GLOB.xeno_tail_list[H.dna.features["xenotail"]] - - if(!S || S.icon_state == "none") - continue - - var/mutable_appearance/accessory_overlay = mutable_appearance(S.icon, layer = -layer) - - accessory_overlay.color = null //just because. reee. - - //A little rename so we don't have to use tail_lizard or tail_human when naming the sprites. - if(bodypart == "tail_lizard" || bodypart == "tail_human" || bodypart == "mam_tail" || bodypart == "xenotail") - bodypart = "tail" - if(bodypart == "mam_waggingtail" || bodypart == "waggingtail_human" || bodypart == "waggingtail_lizard") - bodypart = "tailwag" - if(bodypart == "mam_ears" || bodypart == "ears") - bodypart = "ears" - if(bodypart == "mam_snouts" || bodypart == "snout") - bodypart = "snout" - if(bodypart == "xenohead") - bodypart = "xhead" - if(bodypart == "insect_wings" || bodypart == "deco_wings") - bodypart = "insect_wings" + for(var/layer in relevant_layers) + var/layertext = layer_text[layer] + if(!layertext) // should there + stack_trace("invalid layer '[layer]' found in the list of relevant layers on species.handle_mutant_bodyparts().") + continue + var/layernum = text2num(layer) + for(var/bodypart in relevant_layers[layer]) + var/datum/sprite_accessory/S = bodypart + var/mutable_appearance/accessory_overlay = mutable_appearance(S.icon, layer = -layernum) + bodypart = S.mutant_part_string || dna_feature_as_text_string[S] if(S.gender_specific) - accessory_overlay.icon_state = "[g]_[bodypart]_[S.icon_state]_[layertext]" + accessory_overlay.icon_state = "[g]_[bodypart]_[S.icon_state][layertext]" else - accessory_overlay.icon_state = "m_[bodypart]_[S.icon_state]_[layertext]" + accessory_overlay.icon_state = "m_[bodypart]_[S.icon_state][layertext]" if(S.center) accessory_overlay = center_image(accessory_overlay, S.dimension_x, S.dimension_y) - var/list/colorlist = list() - colorlist.Cut() - colorlist += ReadRGB("[H.dna.features["mcolor"]]0") - colorlist += ReadRGB("[H.dna.features["mcolor2"]]0") - colorlist += ReadRGB("[H.dna.features["mcolor3"]]0") - colorlist += list(0,0,0, hair_alpha) - for(var/index=1, index<=colorlist.len, index++) - colorlist[index] = colorlist[index]/255 - if(!HAS_TRAIT(H, TRAIT_HUSK)) if(!forced_colour) switch(S.color_src) @@ -894,14 +890,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(bodypart == "tail") accessory_overlay.icon_state = "m_tail_husk_[layertext]" if(S.color_src == MATRIXED) - var/list/husklist = list() - husklist += ReadRGB("#a3a3a3") - husklist += ReadRGB("#a3a3a3") - husklist += ReadRGB("#a3a3a3") - husklist += list(0,0,0, hair_alpha) - for(var/index=1, index<=husklist.len, index++) - husklist[index] = husklist[index]/255 - accessory_overlay.color = husklist + accessory_overlay.color = colorlist if(OFFSET_MUTPARTS in H.dna.species.offset_features) accessory_overlay.pixel_x += H.dna.species.offset_features[OFFSET_MUTPARTS][1] @@ -910,7 +899,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) standing += accessory_overlay if(S.hasinner) - var/mutable_appearance/inner_accessory_overlay = mutable_appearance(S.icon, layer = -layer) + var/mutable_appearance/inner_accessory_overlay = mutable_appearance(S.icon, layer = -layernum) if(S.gender_specific) inner_accessory_overlay.icon_state = "[g]_[bodypart]inner_[S.icon_state]_[layertext]" else @@ -926,7 +915,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) standing += inner_accessory_overlay if(S.extra) //apply the extra overlay, if there is one - var/mutable_appearance/extra_accessory_overlay = mutable_appearance(S.icon, layer = -layer) + var/mutable_appearance/extra_accessory_overlay = mutable_appearance(S.icon, layer = -layernum) if(S.gender_specific) extra_accessory_overlay.icon_state = "[g]_[bodypart]_extra_[S.icon_state]_[layertext]" else @@ -973,7 +962,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) standing += extra_accessory_overlay if(S.extra2) //apply the extra overlay, if there is one - var/mutable_appearance/extra2_accessory_overlay = mutable_appearance(S.icon, layer = -layer) + var/mutable_appearance/extra2_accessory_overlay = mutable_appearance(S.icon, layer = -layernum) if(S.gender_specific) extra2_accessory_overlay.icon_state = "[g]_[bodypart]_extra2_[S.icon_state]_[layertext]" else @@ -1019,8 +1008,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) H.apply_overlay(BODY_BEHIND_LAYER) H.apply_overlay(BODY_ADJ_LAYER) + H.apply_overlay(BODY_ADJ_UPPER_LAYER) H.apply_overlay(BODY_FRONT_LAYER) - H.apply_overlay(BODY_TAUR_LAYER) // CITADEL EDIT /* @@ -1032,21 +1021,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) outfit_important_for_life= new() outfit_important_for_life.equip(human_to_equip) -//This exists so sprite accessories can still be per-layer without having to include that layer's -//number in their sprite name, which causes issues when those numbers change. -/datum/species/proc/mutant_bodyparts_layertext(layer) - switch(layer) - if(BODY_BEHIND_LAYER) - return "BEHIND" - if(BODY_ADJ_LAYER) - return "ADJ" - if(BODY_FRONT_LAYER) - return "FRONT" - //CITADEL EDIT - if(BODY_TAUR_LAYER) - return "TAUR" - //END EDIT - /* TODO: Snowflake trail marks // Impliments different trails for species depending on if they're wearing shoes. /datum/species/proc/get_move_trail(var/mob/living/carbon/human/H) @@ -1456,12 +1430,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(target.check_martial_melee_block()) target.visible_message("[target] blocks [user]'s attack!") return FALSE - + if(HAS_TRAIT(user, TRAIT_PUGILIST))//CITADEL CHANGE - makes punching cause staminaloss but funny martial artist types get a discount user.adjustStaminaLossBuffered(1.5) else user.adjustStaminaLossBuffered(3.5) - + if(attacker_style && attacker_style.harm_act(user,target)) return TRUE else @@ -1526,7 +1500,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(user.limb_destroyer) target.dismembering_strike(user, affecting.body_zone) - + if(atk_verb == ATTACK_EFFECT_KICK)//kicks deal 1.5x raw damage + 0.5x stamina damage target.apply_damage(damage*1.5, BRUTE, affecting, armor_block) target.apply_damage(damage*0.5, STAMINA, affecting, armor_block) @@ -1538,21 +1512,21 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if((target.stat != DEAD) && damage >= user.dna.species.punchstunthreshold) if((punchedstam > 50) && prob(punchedstam*0.5)) //If our punch victim has been hit above the threshold, and they have more than 50 stamina damage, roll for stun, probability of 1% per 2 stamina damage - + target.visible_message("[user] knocks [target] down!", \ "You're knocked down by [user]!", "You hear aggressive shuffling followed by a loud thud!", COMBAT_MESSAGE_RANGE, user) to_chat(user, "You knock [target] down!") - + var/knockdown_duration = 40 + (punchedstam + (punchedbrute*0.5))*0.8 - armor_block target.DefaultCombatKnockdown(knockdown_duration) target.forcesay(GLOB.hit_appends) log_combat(user, target, "got a stun punch with their previous punch") - + if(HAS_TRAIT(user, TRAIT_KI_VAMPIRE) && !HAS_TRAIT(target, TRAIT_NOBREATH) && (punchedbrute < 100)) //If we're a ki vampire we also sap them of lifeforce, but only if they're not too beat up. Also living organics only. user.adjustBruteLoss(-5) user.adjustFireLoss(-5) user.adjustStaminaLoss(-20) - + target.adjustCloneLoss(10) target.adjustBruteLoss(10) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 63e772e07c..3d47cdae36 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -129,15 +129,23 @@ There are several things that need to be remembered: alt_worn = 'icons/mob/clothing/uniform_digi.dmi' variant_flag |= STYLE_DIGITIGRADE + var/mask + if(dna.species.mutant_bodyparts["taur"]) + var/datum/sprite_accessory/taur/T = GLOB.taur_list[dna.features["taur"]] + var/clip_flag = U.mutantrace_variation & T?.hide_legs + if(clip_flag) + variant_flag |= clip_flag + mask = T.alpha_mask_state + var/mutable_appearance/uniform_overlay if(dna && dna.species.sexes) - var/G = (dna.features["body_model"] == FEMALE) ? "f" : "m" - if(G == "f" && U.fitted != NO_FEMALE_UNIFORM) - uniform_overlay = U.build_worn_icon(UNIFORM_LAYER, alt_worn, FALSE, U.fitted, target_overlay, variant_flag, FALSE) + if(dna.features["body_model"] == FEMALE && U.fitted != NO_FEMALE_UNIFORM) + uniform_overlay = U.build_worn_icon(UNIFORM_LAYER, alt_worn, FALSE, U.fitted, target_overlay, variant_flag, FALSE, mask) + if(!uniform_overlay) - uniform_overlay = U.build_worn_icon( UNIFORM_LAYER, alt_worn, FALSE, NO_FEMALE_UNIFORM, target_overlay, variant_flag, FALSE) + uniform_overlay = U.build_worn_icon( UNIFORM_LAYER, alt_worn, FALSE, NO_FEMALE_UNIFORM, target_overlay, variant_flag, FALSE, mask) if(OFFSET_UNIFORM in dna.species.offset_features) @@ -269,6 +277,11 @@ There are several things that need to be remembered: var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_SHOES] inv.update_icon() + if(dna.species.mutant_bodyparts["taur"]) + var/datum/sprite_accessory/taur/T = GLOB.taur_list[dna.features["taur"]] + if(T?.hide_legs) //If only they actually made shoes unwearable. Please don't making cosmetics, guys. + return + if(shoes) var/obj/item/clothing/shoes/S = shoes shoes.screen_loc = ui_shoes //move the item to the appropriate screen loc @@ -507,12 +520,17 @@ There are several things that need to be remembered: overlays_standing[BACK_LAYER] = back_overlay apply_overlay(BACK_LAYER) -/proc/wear_female_version(t_color, icon, layer, type) - var/index = "[t_color]-[icon]" - var/icon/female_clothing_icon = GLOB.female_clothing_icons[index] - if(!female_clothing_icon) //Create standing/laying icons if they don't exist - generate_female_clothing(index,t_color,icon,type) - return mutable_appearance(GLOB.female_clothing_icons[index], layer = -layer) +/proc/wear_alpha_masked_version(state, icon, layer, female, alpha_mask) + var/mask = "-[alpha_mask]" + if(islist(alpha_mask)) + mask = "-" + for(var/t in alpha_mask) + mask += t + var/index = "[state]-[icon]-[female][mask]" + . = GLOB.alpha_masked_worn_clothing_icons[index] + if(!.) //Create standing/laying icons if they don't exist + . = generate_alpha_masked_clothing(index,state,icon,-layer,female,alpha_mask) + return mutable_appearance(., layer = -layer) /mob/living/carbon/human/proc/get_overlays_copy(list/unwantedLayers) var/list/out = new @@ -567,10 +585,12 @@ generate/load female uniform sprites matching all previously decided variables style_flags: mutant race appearance flags, mostly used for worn_overlays() +alpha_mask: a text string or list of text, the actual icons are stored in a global list and associated with said text string(s). + use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if mob_overlay_icon is present. */ -/obj/item/proc/build_worn_icon(default_layer = 0, default_icon_file = null, isinhands = FALSE, femaleuniform = NO_FEMALE_UNIFORM, override_state, style_flags = NONE, use_mob_overlay_icon = TRUE) +/obj/item/proc/build_worn_icon(default_layer = 0, default_icon_file = null, isinhands = FALSE, femaleuniform = NO_FEMALE_UNIFORM, override_state, style_flags = NONE, use_mob_overlay_icon = TRUE, alpha_mask) var/t_state t_state = override_state || item_state || icon_state @@ -590,8 +610,8 @@ use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if layer2use = default_layer var/mutable_appearance/standing - if(femaleuniform) - standing = wear_female_version(t_state,file2use,layer2use,femaleuniform) + if(femaleuniform || alpha_mask) + standing = wear_alpha_masked_version(t_state, file2use, layer2use, femaleuniform, alpha_mask) if(!standing) standing = mutable_appearance(file2use, t_state, -layer2use) @@ -654,19 +674,17 @@ use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if . += "-[dna.features["body_model"]]" - var/is_taur = FALSE - if(dna.species.mutant_bodyparts["taur"] && dna.features["taur"] != "None") - is_taur = TRUE - + if(dna.species.mutant_bodyparts["taur"]) + var/datum/sprite_accessory/taur/T = GLOB.taur_list[dna.features["taur"]] + if(T?.hide_legs) + is_taur = TRUE + var/static/list/leg_day = typecacheof(list(/obj/item/bodypart/r_leg, /obj/item/bodypart/l_leg)) for(var/X in bodyparts) var/obj/item/bodypart/BP = X - - if(istype(BP, /obj/item/bodypart/r_leg) || istype(BP, /obj/item/bodypart/l_leg)) - if(is_taur) - continue - + if(is_taur && leg_day[BP.type]) + continue . += "-[BP.body_zone]" if(BP.status == BODYPART_ORGANIC) diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index a431059a89..9a1c6c54b6 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -203,6 +203,12 @@ remove_overlay(BODYPARTS_LAYER) + var/is_taur = FALSE + if(dna?.species.mutant_bodyparts["taur"]) + var/datum/sprite_accessory/taur/T = GLOB.taur_list[dna.features["taur"]] + if(T?.hide_legs) + is_taur = TRUE + for(var/X in bodyparts) var/obj/item/bodypart/BP = X BP.update_limb() @@ -213,9 +219,12 @@ return //GENERATE NEW LIMBS + var/static/list/leg_day = typecacheof(list(/obj/item/bodypart/r_leg, /obj/item/bodypart/l_leg)) var/list/new_limbs = list() for(var/X in bodyparts) var/obj/item/bodypart/BP = X + if(is_taur && leg_day[BP.type]) + continue new_limbs += BP.get_limb_icon() if(new_limbs.len) overlays_standing[BODYPARTS_LAYER] = new_limbs diff --git a/icons/mob/clothing/taur_hooved.dmi b/icons/mob/clothing/taur_hooved.dmi index 71aec5444a..993e9c2550 100644 Binary files a/icons/mob/clothing/taur_hooved.dmi and b/icons/mob/clothing/taur_hooved.dmi differ diff --git a/modular_citadel/icons/mob/mam_taur.dmi b/modular_citadel/icons/mob/mam_taur.dmi index db1f001fae..4d3d996cbb 100644 Binary files a/modular_citadel/icons/mob/mam_taur.dmi and b/modular_citadel/icons/mob/mam_taur.dmi differ