diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 6b0e85a6c95a8c..c26926d5af457e 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -181,6 +181,9 @@ /// A bit nasty, but I can't think of another way to do this. Owners of this limb will not render shoes. #define BODYSHAPE_HIDE_SHOES (1<<11) +/// Teshari limbs. They are very much not normally shaped, so they need an entire bodytype. +#define BODYSHAPE_TESHARI (1<<12) + /// BREAKER: Numeric -> text for use in defines #define BODYSHAPE_HUMANOID_T "1" #define BODYSHAPE_MONKEY_T "2" @@ -189,6 +192,7 @@ #define BODYSHAPE_TAUR_SNAKE_T "256" #define BODYSHAPE_TAUR_HOOF_T "512" #define BODYSHAPE_TAUR_PAW_T "1024" +#define BODYSHAPE_TESHARI_T "4096" /// DOPPLER SHIFT ADDITION END #define BODYTYPE_BIOSCRAMBLE_INCOMPATIBLE (BODYTYPE_ROBOTIC | BODYTYPE_LARVA_PLACEHOLDER | BODYTYPE_GOLEM | BODYTYPE_PEG) @@ -490,6 +494,7 @@ #define OFFSET_SUIT "suit" #define OFFSET_NECK "neck" #define OFFSET_HELD "held" +#define OFFSET_ACCESSORY "accessory" // DOPPLER EDIT ADDITION - Accesory offsets, currently used only for teshari //MINOR TWEAKS/MISC #define AGE_MIN 18 //youngest a character can be diff --git a/code/__DEFINES/~doppler_defines/_autogen_clothing_defines.dm b/code/__DEFINES/~doppler_defines/_autogen_clothing_defines.dm new file mode 100644 index 00000000000000..52b8f44b78af4e --- /dev/null +++ b/code/__DEFINES/~doppler_defines/_autogen_clothing_defines.dm @@ -0,0 +1,79 @@ +// These COLORPIXEL defines indicate the pixel position on the base sprite of a clothing piece from which the color will be taken for autogenerated clothing See: [autogen_clothing.dm]. +#define GLASSES_COLORPIXEL_X_1 10 +#define GLASSES_COLORPIXEL_Y_1 16 +#define GLASSES_COLORPIXEL_X_2 18 +#define GLASSES_COLORPIXEL_Y_2 16 + +#define GLOVES_COLORPIXEL_X_1 10 +#define GLOVES_COLORPIXEL_Y_1 13 + +#define SCARF_COLORPIXEL_X_1 15 +#define SCARF_COLORPIXEL_Y_1 19 + +#define TIE_COLORPIXEL_X_1 16 +#define TIE_COLORPIXEL_Y_1 20 + +#define SHOES_COLORPIXEL_X_1 13 +#define SHOES_COLORPIXEL_Y_1 3 + +#define SPACESUIT_COLORPIXEL_X_1 10 +#define SPACESUIT_COLORPIXEL_Y_1 20 + +#define MODSUIT_COLORPIXEL_X_1 10 +#define MODSUIT_COLORPIXEL_Y_1 20 +#define MODSUIT_COLORPIXEL_X_2 14 +#define MODSUIT_COLORPIXEL_Y_2 15 +#define MODSUIT_COLORPIXEL_X_3 22 +#define MODSUIT_COLORPIXEL_Y_3 12 + +#define MODCONTROL_COLORPIXEL_X_1 13 +#define MODCONTROL_COLORPIXEL_Y_1 10 + +#define COAT_COLORPIXEL_X_1 13 +#define COAT_COLORPIXEL_Y_1 15 + +#define ARMOR_COLORPIXEL_X_1 14 +#define ARMOR_COLORPIXEL_Y_1 18 + +#define CLOAK_COLORPIXEL_X_1 11 +#define CLOAK_COLORPIXEL_Y_1 15 +#define CLOAK_COLORPIXEL_X_2 12 +#define CLOAK_COLORPIXEL_Y_2 22 + +#define MANTLE_COLORPIXEL_X_1 10 +#define MANTLE_COLORPIXEL_Y_1 20 +#define MANTLE_COLORPIXEL_X_2 15 +#define MANTLE_COLORPIXEL_Y_2 20 + +#define UNDER_COLORPIXEL_X_1 15 +#define UNDER_COLORPIXEL_Y_1 17 +#define UNDER_COLORPIXEL_X_2 10 +#define UNDER_COLORPIXEL_Y_2 19 +#define UNDER_COLORPIXEL_X_3 15 +#define UNDER_COLORPIXEL_Y_3 10 + +#define THICKROBE_COLORPIXEL_X_1 16 +#define THICKROBE_COLORPIXEL_Y_1 9 +#define JACKET_COLORPIXEL_X_1 14 +#define JACKET_COLORPIXEL_Y_1 16 +#define LONGCOAT_COLORPIXEL_X_1 13 +#define LONGCOAT_COLORPIXEL_Y_1 20 +#define THICKROBE_COLORPIXEL_X_2 14 +#define THICKROBE_COLORPIXEL_Y_2 19 +#define JACKET_COLORPIXEL_X_2 14 +#define JACKET_COLORPIXEL_Y_2 21 +#define THICKROBE_COLORPIXEL_X_3 13 +#define THICKROBE_COLORPIXEL_Y_3 19 +#define THICKROBE_COLORPIXEL_X_4 8 +#define THICKROBE_COLORPIXEL_Y_4 16 +#define LONGCOAT_COLORPIXEL_X_4 19 +#define LONGCOAT_COLORPIXEL_Y_4 17 +#define JACKET_COLORPIXEL_X_4 9 +#define JACKET_COLORPIXEL_Y_4 15 +#define THICKROBE_COLORPIXEL_X_5 16 +#define THICKROBE_COLORPIXEL_Y_5 12 +#define THICKROBE_COLORPIXEL_X_6 16 +#define THICKROBE_COLORPIXEL_Y_6 20 + +#define BACK_COLORPIXEL_X_1 13 +#define BACK_COLORPIXEL_Y_1 18 diff --git a/code/__DEFINES/~doppler_defines/is_helpers.dm b/code/__DEFINES/~doppler_defines/is_helpers.dm index bca61f97526918..5b6768c039bc5f 100644 --- a/code/__DEFINES/~doppler_defines/is_helpers.dm +++ b/code/__DEFINES/~doppler_defines/is_helpers.dm @@ -5,3 +5,4 @@ #define issnail(A) (is_species(A, /datum/species/snail)) #define ishemophage(A) (is_species(A, /datum/species/human/genemod/hemophage)) #define isramatan(A) (is_species(A, /datum/species/ramatan)) +#define isteshari(A) (is_species(A, /datum/species/teshari)) diff --git a/code/__DEFINES/~doppler_defines/mobs.dm b/code/__DEFINES/~doppler_defines/mobs.dm index 58ee19c13f3754..99bf02320ca76a 100644 --- a/code/__DEFINES/~doppler_defines/mobs.dm +++ b/code/__DEFINES/~doppler_defines/mobs.dm @@ -7,6 +7,7 @@ #define BODYPART_ICON_SNAIL 'modular_doppler/modular_species/species_types/snails/icons/bodyparts/snail_bodyparts.dmi' #define BODYPART_ICON_ROUNDSTARTSLIME 'modular_doppler/modular_species/species_types/slimes/icons/bodyparts.dmi' #define BODYPART_ICON_TAUR 'modular_doppler/taurs/icons/taur_invisible_legs.dmi' +#define BODYPART_ICON_TESHARI 'modular_doppler/modular_species/species_types/teshari/icons/teshari_parts_greyscale.dmi' #define DIGI_HOOF "Hooved Legs" #define DIGI_TALON "Taloned Legs" diff --git a/code/__DEFINES/~doppler_defines/mutant_blacklists.dm b/code/__DEFINES/~doppler_defines/mutant_blacklists.dm index fa7b3a4ff6fb82..45d880d3cb86d2 100644 --- a/code/__DEFINES/~doppler_defines/mutant_blacklists.dm +++ b/code/__DEFINES/~doppler_defines/mutant_blacklists.dm @@ -1,5 +1,6 @@ GLOBAL_LIST_INIT(species_blacklist_no_mutant, list( /datum/species/human, + /datum/species/teshari, // tesh have special ears and tails )) GLOBAL_LIST_INIT(species_blacklist_no_humanoid, list( diff --git a/code/__DEFINES/~doppler_defines/mutant_variations.dm b/code/__DEFINES/~doppler_defines/mutant_variations.dm index c1d8db84c16f4b..55964483fbf189 100644 --- a/code/__DEFINES/~doppler_defines/mutant_variations.dm +++ b/code/__DEFINES/~doppler_defines/mutant_variations.dm @@ -19,6 +19,7 @@ #define MOUSE "mouse" #define ROACH "roach" #define BAT "bat" +#define TESHARI "teshari" /// This list gets read by the dropdown pref when a player chooses what type of sprite accessory to access GLOBAL_LIST_INIT(mutant_variations, list( @@ -36,6 +37,7 @@ GLOBAL_LIST_INIT(mutant_variations, list( LIZARD, MONKEY, MOUSE, + // no TESHARI - TESHARI is handled specially in tail.dm )) /// This list gets read by the animalistic preference for genemod and anthros diff --git a/code/__DEFINES/~doppler_defines/species.dm b/code/__DEFINES/~doppler_defines/species.dm index 05af02502fb80c..5657869f5158a7 100644 --- a/code/__DEFINES/~doppler_defines/species.dm +++ b/code/__DEFINES/~doppler_defines/species.dm @@ -6,3 +6,4 @@ #define SPECIES_HEMOPHAGE "hemophage" #define SPECIES_SLIMESTART "slimehybrid" #define SPECIES_HOLOSYNTH "holosynth" +#define SPECIES_TESHARI "teshari" diff --git a/code/__DEFINES/~doppler_defines/teshari.dm b/code/__DEFINES/~doppler_defines/teshari.dm new file mode 100644 index 00000000000000..743625b8644c1e --- /dev/null +++ b/code/__DEFINES/~doppler_defines/teshari.dm @@ -0,0 +1,4 @@ +#define TESHARI_PUNCH_LOW 2 // Lower bound punch damage +#define TESHARI_PUNCH_HIGH 6 +#define TESHARI_BURN_MODIFIER 1.25 // They take more damage from practically everything +#define TESHARI_BRUTE_MODIFIER 1.2 diff --git a/code/__DEFINES/~doppler_defines/traits.dm b/code/__DEFINES/~doppler_defines/traits.dm index 6e69510261be72..1b293fe3f25204 100644 --- a/code/__DEFINES/~doppler_defines/traits.dm +++ b/code/__DEFINES/~doppler_defines/traits.dm @@ -15,6 +15,8 @@ #define TRAIT_ANIMALISTIC "animalistic" // Trait that lets golems put stone limbs back on #define TRAIT_GOLEM_LIMBATTACHMENT "golem_limbattachment" +// Prevents the mob from breaking tables from standing on them +#define TRAIT_LIGHT_BODY "light_body" //// // Quirks diff --git a/code/datums/components/toggle_attached_clothing.dm b/code/datums/components/toggle_attached_clothing.dm index a251fd0e38af6f..42160eafe0c308 100644 --- a/code/datums/components/toggle_attached_clothing.dm +++ b/code/datums/components/toggle_attached_clothing.dm @@ -110,6 +110,13 @@ SIGNAL_HANDLER if (isinhands || currently_deployed) return + var/obj/item/parent_gear = parent // DOPPLER EDIT ADDITION BEGIN - Autogenerated clothing ignores undeployed sprites + if (ishuman(parent_gear.loc)) + var/mob/living/carbon/human/human_owner = parent_gear.loc + if (!isnull(parent_gear.get_matching_bodyshape(human_owner))) + return // sorry, i cant wrap my head around making autogenned undeployed sprites rn... + // DOPPLER EDIT ADDITION END + overlays += undeployed_overlay /// Deploys gear if it is hidden, hides it if it is deployed diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index eff18ba1fffbc1..1b36f6427e8e12 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -571,6 +571,10 @@ /obj/structure/table/glass/proc/check_break(mob/living/M) if(is_flipped) return FALSE + // DOPPLER EDIT ADDITION START - Light-bodied species can tablerun without breaking glass tables + if(HAS_TRAIT(M, TRAIT_LIGHT_BODY)) + return FALSE + // DOPPLER EDIT ADDITION END if(M.has_gravity() && M.mob_size > MOB_SIZE_SMALL && !(M.movement_type & MOVETYPES_NOT_TOUCHING_GROUND)) table_shatter(M) diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 42317854c5debb..28e241dc6aeff5 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -103,7 +103,7 @@ if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform") if(accessory_overlay) - . += accessory_overlay + . += modify_accessory_overlay() // DOPPLER EDIT CHANGE - ORIGINAL: . += accessory_overlay /obj/item/clothing/under/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands = FALSE, icon_file) . = ..() diff --git a/code/modules/clothing/under/accessories/_accessories.dm b/code/modules/clothing/under/accessories/_accessories.dm index 0e4e2f981907ee..99df40ea163440 100644 --- a/code/modules/clothing/under/accessories/_accessories.dm +++ b/code/modules/clothing/under/accessories/_accessories.dm @@ -126,7 +126,19 @@ /obj/item/clothing/accessory/proc/generate_accessory_overlay(obj/item/clothing/under/attached_to) SHOULD_CALL_PARENT(TRUE) - var/mutable_appearance/appearance = mutable_appearance(worn_icon, icon_state) + // DOPPLER EDIT BEGIN + var/local_worn_icon = worn_icon + var/mob/living/carbon/human/human_wearer = attached_to.loc + if (istype(human_wearer)) + for(var/shape in supported_bodyshapes) + if(human_wearer.bodyshape & shape) + var/potential_file = bodyshape_icon_files["[shape]"] + if (icon_exists(potential_file, icon_state)) + local_worn_icon = bodyshape_icon_files["[shape]"] + if (shape != BODYSHAPE_HUMANOID) // EVERYTHING has this + break + // DOPPLER EDIT END + var/mutable_appearance/appearance = mutable_appearance(local_worn_icon, icon_state) // DOPPLER SHIFT EDIT - was var/mutable_appearance/appearance = mutable_appearance(worn_icon, icon_state) appearance.alpha = alpha appearance.color = color return appearance diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm index 1ee0ddb4daf43b..15e278d6e942ab 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -101,11 +101,32 @@ There are several things that need to be remembered: var/handled_by_bodyshape = TRUE var/icon_file var/woman - /// DOPPLER ADDITION BEGIN + /// DOPPLER SHIFT ADDITION BEGIN + var/found_special_sprite = FALSE for(var/shape in uniform.supported_bodyshapes) - if(bodyshape & shape) + if(!(bodyshape & shape)) + continue + var/potential_file = uniform.bodyshape_icon_files["[shape]"] + if (icon_exists(potential_file, uniform.icon_state)) icon_file = uniform.bodyshape_icon_files["[shape]"] - /// DOPPLER SHIFT REMOVAL BEGIN + if (shape == BODYSHAPE_HUMANOID) // EVERYTHING has this + continue + found_special_sprite = TRUE + break + + var/autogen_override = FALSE + if(!found_special_sprite) + var/corresponding_shape = uniform.get_matching_bodyshape(src) + if (!isnull(corresponding_shape)) + // we found a config for our body? that must mean the clothing doesnt fit. so just trust it + var/autogenerated_icon = uniform.generate_autogen_worn_icon(corresponding_shape, OFFSET_UNIFORM) + if(autogenerated_icon) + icon_file = autogenerated_icon + autogen_override = TRUE + + if (!found_special_sprite && !autogen_override) + handled_by_bodyshape = FALSE + /// DOPPLER SHIFT ADDITION END //BEGIN SPECIES HANDLING /*if((bodyshape & BODYSHAPE_DIGITIGRADE) && (uniform.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION)) icon_file = DIGITIGRADE_UNIFORM_FILE*/ @@ -125,7 +146,7 @@ There are several things that need to be remembered: isinhands = FALSE, female_uniform = woman ? uniform.female_sprite_flags : null, override_state = target_overlay, - override_file = handled_by_bodyshape ? icon_file : null, + override_file = (handled_by_bodyshape) ? icon_file : null, humie = src, /// DOPPLER SHIFT ADDITION ) @@ -160,13 +181,14 @@ There are several things that need to be remembered: icon_file = wear_id.bodyshape_icon_files["[shape]"] /// DOPPLER SHIFT ADDITION END - id_overlay = wear_id.build_worn_icon(default_layer = ID_LAYER, default_icon_file = icon_file, humie = src) /// DOPPLER SHIFT EDIT + var/obj/item/bodypart/chest/my_chest = get_bodypart(BODY_ZONE_CHEST) // DOPPLER EDIT ADDITION + id_overlay = get_updated_worn_icon(worn_item, ID_LAYER, OFFSET_ID, icon_file, my_chest.worn_id_offset) /// DOPPLER SHIFT EDIT - WAS wear_suit.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = icon_file, override_file = autogen_override ? icon_file : null, humie = src) if(!id_overlay) return - var/obj/item/bodypart/chest/my_chest = get_bodypart(BODY_ZONE_CHEST) - my_chest?.worn_id_offset?.apply_offset(id_overlay) + //var/obj/item/bodypart/chest/my_chest = get_bodypart(BODY_ZONE_CHEST) // DOPPLER EDIT REMOVAL - Moved up + //my_chest?.worn_id_offset?.apply_offset(id_overlay) // DOPPLER EDIT REMOVAL - Moved into get_updated_worn_icon overlays_standing[ID_LAYER] = id_overlay apply_overlay(ID_LAYER) @@ -206,12 +228,7 @@ There are several things that need to be remembered: var/icon_file = 'icons/mob/clothing/hands.dmi' - /// DOPPLER SHIFT ADDITION BEGIN - for(var/shape in gloves.supported_bodyshapes) - if(bodyshape & shape) - icon_file = gloves.bodyshape_icon_files["[shape]"] - /// DOPPLER SHIFT ADDITION END - var/mutable_appearance/gloves_overlay = gloves.build_worn_icon(default_layer = GLOVES_LAYER, default_icon_file = icon_file, humie = src) /// DOPPLER SHIFT EDIT + var/mutable_appearance/gloves_overlay = get_updated_worn_icon(worn_item, GLOVES_LAYER, OFFSET_GLOVES, icon_file, null) /// DOPPLER SHIFT EDIT - WAS wear_suit.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = icon_file, override_file = autogen_override ? icon_file : null, humie = src) var/feature_y_offset = 0 //needs to be typed, hand_bodyparts can have nulls @@ -258,14 +275,8 @@ There are several things that need to be remembered: var/icon_file = 'icons/mob/clothing/eyes.dmi' - /// DOPPLER SHIFT ADDITION BEGIN - for(var/shape in glasses.supported_bodyshapes) - if(bodyshape & shape) - icon_file = glasses.bodyshape_icon_files["[shape]"] - /// DOPPLER SHIFT ADDITION END - - var/mutable_appearance/glasses_overlay = glasses.build_worn_icon(default_layer = GLASSES_LAYER, default_icon_file = icon_file, humie = src) /// DOPPLER SHIFT EDIT - my_head.worn_glasses_offset?.apply_offset(glasses_overlay) + var/mutable_appearance/glasses_overlay = get_updated_worn_icon(glasses, GLASSES_LAYER, OFFSET_GLASSES, icon_file, my_head?.worn_glasses_offset) /// DOPPLER SHIFT EDIT - WAS wear_suit.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = icon_file, override_file = autogen_override ? icon_file : null, humie = src) + //my_head?.worn_glasses_offset?.apply_offset(glasses_overlay) // DOPPLER EDIT REMOVAL - Moved into get_updated_worn_icon overlays_standing[GLASSES_LAYER] = glasses_overlay apply_overlay(GLASSES_LAYER) @@ -290,14 +301,9 @@ There are several things that need to be remembered: var/icon_file = 'icons/mob/clothing/ears.dmi' - /// DOPPLER SHIFT ADDITION BEGIN - for(var/shape in ears.supported_bodyshapes) - if(bodyshape & shape) - icon_file = ears.bodyshape_icon_files["[shape]"] - /// DOPPLER SHIFT ADDITION END + var/mutable_appearance/ears_overlay = get_updated_worn_icon(ears, NECK_LAYER, OFFSET_NECK, icon_file, my_head?.worn_ears_offset) /// DOPPLER SHIFT EDIT - WAS wear_suit.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = icon_file, override_file = autogen_override ? icon_file : null, humie = src) + //my_chest?.worn_ears_offset?.apply_offset(head_overlay) // DOPPLER EDIT REMOVAL - Moved into get_updated_worn_icon - var/mutable_appearance/ears_overlay = ears.build_worn_icon(default_layer = EARS_LAYER, default_icon_file = icon_file, humie = src) /// DOPPLER SHIFT EDIT - my_head.worn_ears_offset?.apply_offset(ears_overlay) overlays_standing[EARS_LAYER] = ears_overlay apply_overlay(EARS_LAYER) @@ -317,15 +323,11 @@ There are several things that need to be remembered: var/icon_file = 'icons/mob/clothing/neck.dmi' - /// DOPPLER SHIFT ADDITION BEGIN - for(var/shape in worn_item.supported_bodyshapes) - if(bodyshape & shape) - icon_file = worn_item.bodyshape_icon_files["[shape]"] - /// DOPPLER SHIFT ADDITION END - - var/mutable_appearance/neck_overlay = worn_item.build_worn_icon(default_layer = NECK_LAYER, default_icon_file = icon_file, humie = src) /// DOPPLER SHIFT EDIT var/obj/item/bodypart/chest/my_chest = get_bodypart(BODY_ZONE_CHEST) - my_chest?.worn_belt_offset?.apply_offset(neck_overlay) + var/mutable_appearance/neck_overlay = get_updated_worn_icon(wear_neck, NECK_LAYER, OFFSET_NECK, icon_file, my_chest?.worn_neck_offset) /// DOPPLER SHIFT EDIT - WAS wear_suit.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = icon_file, override_file = autogen_override ? icon_file : null, humie = src) + //var/obj/item/bodypart/chest/my_head = get_bodypart(BODY_ZONE_HEAD) // Doppler edit removal - Moved up + //my_chest?.worn_suit_offset?.apply_offset(head_overlay) // DOPPLER EDIT REMOVAL - Moved into get_updated_worn_icon + overlays_standing[NECK_LAYER] = neck_overlay apply_overlay(NECK_LAYER) @@ -349,16 +351,8 @@ There are several things that need to be remembered: var/icon_file = DEFAULT_SHOES_FILE - /// DOPPLER SHIFT ADDITION BEGIN - if(bodyshape & BODYSHAPE_HIDE_SHOES) - return // We just don't want shoes that float if we're not displaying legs (useful for taurs, for now) + var/mutable_appearance/shoes_overlay = get_updated_worn_icon(shoes, SHOES_LAYER, OFFSET_SHOES, icon_file, null) /// DOPPLER SHIFT EDIT - WAS wear_suit.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = icon_file, override_file = autogen_override ? icon_file : null, humie = src) - for(var/shape in shoes.supported_bodyshapes) - if(bodyshape & shape) - icon_file = shoes.bodyshape_icon_files["[shape]"] - /// DOPPLER SHIFT ADDITION END - - var/mutable_appearance/shoes_overlay = shoes.build_worn_icon(default_layer = SHOES_LAYER, default_icon_file = icon_file, humie = src) /// DOPPLER SHIFT EDIT if(!shoes_overlay) return @@ -391,17 +385,11 @@ There are several things that need to be remembered: if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (obscured_slots & HIDESUITSTORAGE)) return - /// DOPPLER SHIFT ADDITION BEGIN - var/icon_file = 'icons/mob/clothing/belt_mirror.dmi' - - for(var/shape in worn_item.supported_bodyshapes) - if(bodyshape & shape) - icon_file = worn_item.bodyshape_icon_files["[shape]"] - /// DOPPLER SHIFT ADDITION END - - var/mutable_appearance/s_store_overlay = worn_item.build_worn_icon(default_layer = SUIT_STORE_LAYER, default_icon_file = icon_file, humie = src) /// DOPPLER SHIFT EDIT var/obj/item/bodypart/chest/my_chest = get_bodypart(BODY_ZONE_CHEST) - my_chest?.worn_suit_storage_offset?.apply_offset(s_store_overlay) + var/mutable_appearance/s_store_overlay = get_updated_worn_icon(s_store, SUIT_STORE_LAYER, OFFSET_S_STORE, 'icons/mob/clothing/belt_mirror.dmi', my_chest?.worn_suit_storage_offset) /// DOPPLER SHIFT EDIT - WAS wear_suit.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = icon_file, override_file = autogen_override ? icon_file : null, humie = src) + //var/obj/item/bodypart/chest/my_head = get_bodypart(BODY_ZONE_HEAD) // Doppler edit removal - Moved up + //my_chest?.worn_suit_offset?.apply_offset(head_overlay) // DOPPLER EDIT REMOVAL - Moved into get_updated_worn_icon + overlays_standing[SUIT_STORE_LAYER] = s_store_overlay apply_overlay(SUIT_STORE_LAYER) @@ -420,15 +408,11 @@ There are several things that need to be remembered: var/icon_file = 'icons/mob/clothing/head/default.dmi' - /// DOPPLER SHIFT ADDITION BEGIN - for(var/shape in head.supported_bodyshapes) - if(bodyshape & shape) - icon_file = head.bodyshape_icon_files["[shape]"] - /// DOPPLER SHIFT ADDITION END - - var/mutable_appearance/head_overlay = head.build_worn_icon(default_layer = HEAD_LAYER, default_icon_file = icon_file, humie = src) /// DOPPLER SHIFT EDIT var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) - my_head?.worn_head_offset?.apply_offset(head_overlay) + var/mutable_appearance/head_overlay = get_updated_worn_icon(head, HEAD_LAYER, OFFSET_HEAD, icon_file, my_head?.worn_head_offset) /// DOPPLER SHIFT EDIT - WAS wear_suit.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = icon_file, override_file = autogen_override ? icon_file : null, humie = src) + //var/obj/item/bodypart/chest/my_head = get_bodypart(BODY_ZONE_HEAD) // Doppler edit removal - Moved up + //my_chest?.worn_suit_offset?.apply_offset(head_overlay) // DOPPLER EDIT REMOVAL - Moved into get_updated_worn_icon + overlays_standing[HEAD_LAYER] = head_overlay apply_overlay(HEAD_LAYER) @@ -450,15 +434,10 @@ There are several things that need to be remembered: var/icon_file = 'icons/mob/clothing/belt.dmi' - /// DOPPLER SHIFT ADDITION BEGIN - for(var/shape in belt.supported_bodyshapes) - if(bodyshape & shape) - icon_file = belt.bodyshape_icon_files["[shape]"] - /// DOPPLER SHIFT ADDITION END - - var/mutable_appearance/belt_overlay = belt.build_worn_icon(default_layer = BELT_LAYER, default_icon_file = icon_file, humie = src) /// DOPPLER SHIFT EDIT var/obj/item/bodypart/chest/my_chest = get_bodypart(BODY_ZONE_CHEST) - my_chest?.worn_belt_offset?.apply_offset(belt_overlay) + var/mutable_appearance/belt_overlay = get_updated_worn_icon(belt, BELT_LAYER, OFFSET_BELT, icon_file, my_chest?.worn_belt_offset) /// DOPPLER SHIFT EDIT - WAS wear_suit.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = icon_file, override_file = autogen_override ? icon_file : null, humie = src) + //var/obj/item/bodypart/chest/my_chest = get_bodypart(BODY_ZONE_CHEST) // Doppler edit removal - Moved up + //my_chest?.worn_suit_offset?.apply_offset(suit_overlay) // DOPPLER EDIT REMOVAL - Moved into get_updated_worn_icon overlays_standing[BELT_LAYER] = belt_overlay apply_overlay(BELT_LAYER) @@ -479,15 +458,10 @@ There are several things that need to be remembered: var/icon_file = DEFAULT_SUIT_FILE - /// DOPPLER SHIFT ADDITION BEGIN - for(var/shape in wear_suit.supported_bodyshapes) - if(bodyshape & shape) - icon_file = wear_suit.bodyshape_icon_files["[shape]"] - /// DOPPLER SHIFT ADDITION END - - var/mutable_appearance/suit_overlay = wear_suit.build_worn_icon(default_layer = SUIT_LAYER, default_icon_file = icon_file, humie = src) /// DOPPLER SHIFT EDIT var/obj/item/bodypart/chest/my_chest = get_bodypart(BODY_ZONE_CHEST) - my_chest?.worn_suit_offset?.apply_offset(suit_overlay) + var/mutable_appearance/suit_overlay = get_updated_worn_icon(wear_suit, SUIT_LAYER, OFFSET_SUIT, icon_file, my_chest?.worn_suit_offset) /// DOPPLER SHIFT EDIT - WAS wear_suit.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = icon_file, override_file = autogen_override ? icon_file : null, humie = src) + //var/obj/item/bodypart/chest/my_chest = get_bodypart(BODY_ZONE_CHEST) // Doppler edit removal - Moved up + //my_chest?.worn_suit_offset?.apply_offset(suit_overlay) // DOPPLER EDIT REMOVAL - Moved into get_updated_worn_icon overlays_standing[SUIT_LAYER] = suit_overlay apply_overlay(SUIT_LAYER) @@ -534,14 +508,8 @@ There are several things that need to be remembered: var/icon_file = 'icons/mob/clothing/mask.dmi' - /// DOPPLER SHIFT ADDITION BEGIN - for(var/shape in wear_mask.supported_bodyshapes) - if(bodyshape & shape) - icon_file = wear_mask.bodyshape_icon_files["[shape]"] - /// DOPPLER SHIFT ADDITION END - - var/mutable_appearance/mask_overlay = wear_mask.build_worn_icon(default_layer = FACEMASK_LAYER, default_icon_file = icon_file, humie = src) /// DOPPLER SHIFT EDIT - my_head.worn_mask_offset?.apply_offset(mask_overlay) + var/mutable_appearance/mask_overlay = get_updated_worn_icon(wear_mask, FACEMASK_LAYER, OFFSET_FACEMASK, icon_file, my_head?.worn_mask_offset) /// DOPPLER SHIFT EDIT - WAS wear_maskback.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = icon_file, override_file = autogen_override ? icon_file : null, humie = src) + //my_head?.worn_mask_offset?.apply_offset(mask_overlay) // DOPPLER EDIT REMOVAL - Moved into get_updated_worn_icon overlays_standing[FACEMASK_LAYER] = mask_overlay apply_overlay(FACEMASK_LAYER) @@ -564,18 +532,13 @@ There are several things that need to be remembered: var/icon_file = 'icons/mob/clothing/back.dmi' - /// DOPPLER SHIFT ADDITION BEGIN - for(var/shape in worn_item.supported_bodyshapes) - if(bodyshape & shape) - icon_file = worn_item.bodyshape_icon_files["[shape]"] - /// DOPPLER SHIFT ADDITION END - - back_overlay = back.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = icon_file, humie = src) /// DOPPLER SHIFT EDIT + var/obj/item/bodypart/chest/my_chest = get_bodypart(BODY_ZONE_CHEST) + back_overlay = get_updated_worn_icon(back, BACK_LAYER, OFFSET_BACK, icon_file, my_chest?.worn_back_offset) /// DOPPLER SHIFT EDIT - WAS back.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = icon_file, override_file = autogen_override ? icon_file : null, humie = src) if(!back_overlay) return - var/obj/item/bodypart/chest/my_chest = get_bodypart(BODY_ZONE_CHEST) - my_chest?.worn_back_offset?.apply_offset(back_overlay) + //var/obj/item/bodypart/chest/my_chest = get_bodypart(BODY_ZONE_CHEST) // DOPPLER EDIT REMOVAL - Moved up + //my_chest?.worn_back_offset?.apply_offset(back_overlay) // DOPPLER EDIT REMOVAL - Moved into get_updated_worn_icon overlays_standing[BACK_LAYER] = back_overlay apply_overlay(BACK_LAYER) @@ -921,6 +884,8 @@ generate/load female uniform sprites matching all previously decided variables var/using_taur_variant = FALSE if(ishuman(humie)) for(var/shape in supported_bodyshapes) + if(shape == BODYSHAPE_HUMANOID) + continue if(humie.bodyshape & shape) using_taur_variant = (shape & BODYSHAPE_TAUR_ALL) chosen_worn_icon = bodyshape_icon_files["[shape]"] diff --git a/code/modules/research/techweb/nodes/cyborg_nodes.dm b/code/modules/research/techweb/nodes/cyborg_nodes.dm index 3b5118151f92f3..beac7f7635e201 100644 --- a/code/modules/research/techweb/nodes/cyborg_nodes.dm +++ b/code/modules/research/techweb/nodes/cyborg_nodes.dm @@ -20,6 +20,12 @@ "cybernetic_liver", "cybernetic_heart", // DOPPLER ADDITION START + "teshari_cyber_chest", + "teshari_cyber_l_arm", + "teshari_cyber_r_arm", + "teshari_cyber_l_leg", + "teshari_cyber_r_leg", + "teshari_cyber_head", "android_chest", "android_head", "android_l_arm", diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm index ae88ccb3105335..6465fe7ff79f1e 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm @@ -34,7 +34,7 @@ /obj/item/organ/cyberimp/on_bodypart_insert(obj/item/bodypart/limb) . = ..() - if (bodypart_aug) + if (bodypart_aug && !(limb.bodyshape & BODYSHAPE_TESHARI)) // DOPPLER EDIT - was if (bodypart_aug) limb.add_bodypart_overlay(bodypart_aug) /obj/item/organ/cyberimp/on_bodypart_remove(obj/item/bodypart/limb) diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_teshari.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_teshari.png new file mode 100644 index 00000000000000..7d46a08db6c53a Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_teshari.png differ diff --git a/code/~doppler_earliest_defines.dm b/code/~doppler_earliest_defines.dm index 07e5bb7fe562af..22c82e9be4134f 100644 --- a/code/~doppler_earliest_defines.dm +++ b/code/~doppler_earliest_defines.dm @@ -200,6 +200,17 @@ name = "No Horns" icon_state = "none" +// Teshari +/datum/sprite_accessory/tails/teshari/none + icon = /datum/sprite_accessory/tails/none::icon + name = DOPPLER_SPRITE_ACCESSORY_NOTAIL + icon_state = /datum/sprite_accessory/tails/none::icon_state + +/datum/sprite_accessory/ears_more/teshari/none + icon = 'modular_doppler/modular_customization/accessories/code/~overrides/icons/fallbacks.dmi' + name = DOPPLER_SPRITE_ACCESSORY_NOEARS + icon_state = /datum/sprite_accessory/ears/none::icon_state + // Taur /datum/sprite_accessory/taur/none name = DOPPLER_SPRITE_ACCESSORY_NOTAUR diff --git a/config/game_options.txt b/config/game_options.txt index dc3339d2c9effb..91fcd6903328c9 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -387,6 +387,7 @@ ROUNDSTART_RACES ethereal #ROUNDSTART_RACES jelly #ROUNDSTART_RACES abductor ROUNDSTART_RACES snail +ROUNDSTART_RACES teshari ## Races that are straight upgrades. If these are on expect powergamers to always pick them #ROUNDSTART_RACES skeleton diff --git a/icons/map_icons/clothing/head/beret.dmi b/icons/map_icons/clothing/head/beret.dmi index b4c8d3b9f1e654..8122ae8b2e8734 100644 Binary files a/icons/map_icons/clothing/head/beret.dmi and b/icons/map_icons/clothing/head/beret.dmi differ diff --git a/modular_doppler/colony_fabricator/code/clothing/clothing.dm b/modular_doppler/colony_fabricator/code/clothing/clothing.dm index 702247e3b7f9ce..652e0aac4cf79d 100644 --- a/modular_doppler/colony_fabricator/code/clothing/clothing.dm +++ b/modular_doppler/colony_fabricator/code/clothing/clothing.dm @@ -7,9 +7,10 @@ icon = 'modular_doppler/colony_fabricator/icons/clothes/clothing.dmi' icon_state = "jumpsuit" worn_icon = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi' - supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_DIGITIGRADE) + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI, BODYSHAPE_DIGITIGRADE) bodyshape_icon_files = list( BODYSHAPE_HUMANOID_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn_teshari.dmi', BODYSHAPE_DIGITIGRADE_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn_digi.dmi', ) worn_icon_state = "jumpsuit" @@ -29,9 +30,12 @@ icon = 'modular_doppler/colony_fabricator/icons/clothes/clothing.dmi' icon_state = "boots" worn_icon = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi' - supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_DIGITIGRADE) - bodyshape_icon_files = list(BODYSHAPE_HUMANOID_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi', - BODYSHAPE_DIGITIGRADE_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn_digi.dmi') + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI, BODYSHAPE_DIGITIGRADE) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn_teshari.dmi', + BODYSHAPE_DIGITIGRADE_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn_digi.dmi', + ) worn_icon_state = "boots" armor_type = /datum/armor/colonist_clothing resistance_flags = FIRE_PROOF @@ -51,6 +55,11 @@ icon_state = "jacket" worn_icon = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi' worn_icon_state = "jacket" + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn_teshari.dmi' + ) slot_flags = ITEM_SLOT_OCLOTHING|ITEM_SLOT_NECK armor_type = /datum/armor/colonist_clothing resistance_flags = NONE @@ -92,6 +101,11 @@ icon_state = "flak" worn_icon = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi' worn_icon_state = "flak" + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn_teshari.dmi' + ) body_parts_covered = CHEST cold_protection = CHEST|GROIN min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT @@ -115,6 +129,11 @@ icon_state = "cap" soft_type = "cap" soft_suffix = null + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn_teshari.dmi' + ) worn_icon = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi' worn_icon_state = "cap" @@ -138,6 +157,11 @@ icon_state = "tanker" worn_icon = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi' worn_icon_state = "tanker" + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn_teshari.dmi' + ) armor_type = /datum/armor/colonist_armor resistance_flags = NONE flags_inv = 0 @@ -157,9 +181,14 @@ icon_state = "radio" worn_icon = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi' worn_icon_state = "radio" + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn_teshari.dmi' + ) alternate_worn_layer = FACEMASK_LAYER + 0.5 subspace_transmission = FALSE -// radio_talk_sound = 'modular_doppler/kahraman_equipment/sounds/morse_signal.wav' +// radio_talk_sound = 'modular_doppler/colony_fabricator/sounds/morse_signal.wav' /obj/item/radio/headset/headset_frontier_colonist/Initialize(mapload) . = ..() @@ -194,6 +223,11 @@ icon_state = "gloves" worn_icon = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi' worn_icon_state = "gloves" + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn_teshari.dmi' + ) greyscale_colors = "#3a373e" siemens_coefficient = 0.25 // Doesn't insulate you entirely, but makes you a little more resistant cold_protection = HANDS @@ -218,9 +252,12 @@ icon_state = "mask" worn_icon = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi' supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION - supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_SNOUTED) - bodyshape_icon_files = list(BODYSHAPE_HUMANOID_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi', - BODYSHAPE_SNOUTED_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn_digi.dmi') + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI, BODYSHAPE_SNOUTED) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn_teshari.dmi', + BODYSHAPE_SNOUTED_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn_digi.dmi' + ) worn_icon_state = "mask" flags_inv = HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT armor_type = /datum/armor/colonist_hazard diff --git a/modular_doppler/colony_fabricator/code/clothing/storage.dm b/modular_doppler/colony_fabricator/code/clothing/storage.dm index 305ecd0ab02f0d..dcb7b3ae07cd0f 100644 --- a/modular_doppler/colony_fabricator/code/clothing/storage.dm +++ b/modular_doppler/colony_fabricator/code/clothing/storage.dm @@ -6,6 +6,11 @@ icon = 'modular_doppler/colony_fabricator/icons/clothes/clothing.dmi' icon_state = "backpack" worn_icon = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi' + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn_teshari.dmi' + ) supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON worn_icon_state = "backpack" inhand_icon_state = "backpack" @@ -37,6 +42,11 @@ icon_state = "harness" worn_icon = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi' supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/colony_fabricator/icons/clothes/clothing_worn_teshari.dmi' + ) worn_icon_state = "harness" inhand_icon_state = null diff --git a/modular_doppler/colony_fabricator/icons/clothes/clothing_worn_teshari.dmi b/modular_doppler/colony_fabricator/icons/clothes/clothing_worn_teshari.dmi new file mode 100644 index 00000000000000..da167942a77fbe Binary files /dev/null and b/modular_doppler/colony_fabricator/icons/clothes/clothing_worn_teshari.dmi differ diff --git a/modular_doppler/doppler_command_uniforms/hop/overrides.dm b/modular_doppler/doppler_command_uniforms/hop/overrides.dm index 3b2ac56100e61e..87b9aaef7c00e6 100644 --- a/modular_doppler/doppler_command_uniforms/hop/overrides.dm +++ b/modular_doppler/doppler_command_uniforms/hop/overrides.dm @@ -3,6 +3,8 @@ worn_icon = 'modular_doppler/doppler_command_uniforms/hop/worn.dmi' icon_state = "uniform" inhand_icon_state = null + supported_bodyshapes = null + bodyshape_icon_files = null /obj/item/clothing/under/rank/civilian/head_of_personnel/skirt icon = 'modular_doppler/doppler_command_uniforms/hop/icon.dmi' @@ -19,6 +21,8 @@ worn_icon = 'modular_doppler/doppler_command_uniforms/hop/worn.dmi' icon_state = "jacket" inhand_icon_state = null + supported_bodyshapes = null + bodyshape_icon_files = null /obj/item/clothing/head/hats/hopcap icon = 'modular_doppler/doppler_command_uniforms/hop/icon.dmi' @@ -31,6 +35,8 @@ worn_icon = 'modular_doppler/doppler_command_uniforms/hop/worn.dmi' icon_state = "wintercoat" inhand_icon_state = null + supported_bodyshapes = null + bodyshape_icon_files = null /obj/item/clothing/head/hooded/winterhood/hop icon = 'modular_doppler/doppler_command_uniforms/hop/icon.dmi' diff --git a/modular_doppler/languages/code/language menu/language_holder.dm b/modular_doppler/languages/code/language menu/language_holder.dm index 27629b53cf5b20..a1640e59400bcc 100644 --- a/modular_doppler/languages/code/language menu/language_holder.dm +++ b/modular_doppler/languages/code/language menu/language_holder.dm @@ -92,6 +92,7 @@ GLOBAL_DATUM_INIT(language_holder_adjustor, /datum/language_holder_adjustor, new /datum/language/terrum = list(LANGUAGE_ATOM), /datum/language/sylvan = list(LANGUAGE_ATOM), /datum/language/nambuni = list(LANGUAGE_ATOM), + /datum/language/schechi = list(LANGUAGE_ATOM), ) spoken_languages = list( /datum/language/common = list(LANGUAGE_ATOM), @@ -114,4 +115,5 @@ GLOBAL_DATUM_INIT(language_holder_adjustor, /datum/language_holder_adjustor, new /datum/language/terrum = list(LANGUAGE_ATOM), /datum/language/sylvan = list(LANGUAGE_ATOM), /datum/language/nambuni = list(LANGUAGE_ATOM), + /datum/language/schechi = list(LANGUAGE_ATOM), ) diff --git a/modular_doppler/languages/code/language_datums.dm b/modular_doppler/languages/code/language_datums.dm index 022d67954ab7bf..8531345666db10 100644 --- a/modular_doppler/languages/code/language_datums.dm +++ b/modular_doppler/languages/code/language_datums.dm @@ -7,6 +7,7 @@ langs += /datum/language/slime langs += /datum/language/primitive_genemod langs += /datum/language/nambuni + langs += /datum/language/schechi return langs /// ACTUAL LANGUAGES BEGIN HERE diff --git a/modular_doppler/modular_cosmetics/GAGS/icons/beret_teshari.dmi b/modular_doppler/modular_cosmetics/GAGS/icons/beret_teshari.dmi new file mode 100644 index 00000000000000..8ec9c15df73731 Binary files /dev/null and b/modular_doppler/modular_cosmetics/GAGS/icons/beret_teshari.dmi differ diff --git a/modular_doppler/modular_cosmetics/GAGS/icons/dressteshari.dmi b/modular_doppler/modular_cosmetics/GAGS/icons/dressteshari.dmi new file mode 100644 index 00000000000000..96f9df43a319fb Binary files /dev/null and b/modular_doppler/modular_cosmetics/GAGS/icons/dressteshari.dmi differ diff --git a/modular_doppler/modular_cosmetics/GAGS/icons/head_teshari.dmi b/modular_doppler/modular_cosmetics/GAGS/icons/head_teshari.dmi new file mode 100644 index 00000000000000..13ba7eebb3b94a Binary files /dev/null and b/modular_doppler/modular_cosmetics/GAGS/icons/head_teshari.dmi differ diff --git a/modular_doppler/modular_cosmetics/GAGS/icons/jumpsuit_teshari.dmi b/modular_doppler/modular_cosmetics/GAGS/icons/jumpsuit_teshari.dmi new file mode 100644 index 00000000000000..616a7fb0876482 Binary files /dev/null and b/modular_doppler/modular_cosmetics/GAGS/icons/jumpsuit_teshari.dmi differ diff --git a/modular_doppler/modular_cosmetics/GAGS/icons/labcoat_teshari.dmi b/modular_doppler/modular_cosmetics/GAGS/icons/labcoat_teshari.dmi new file mode 100644 index 00000000000000..893c561295db69 Binary files /dev/null and b/modular_doppler/modular_cosmetics/GAGS/icons/labcoat_teshari.dmi differ diff --git a/modular_doppler/modular_cosmetics/GAGS/icons/masks_teshari.dmi b/modular_doppler/modular_cosmetics/GAGS/icons/masks_teshari.dmi new file mode 100644 index 00000000000000..1aef174b09816f Binary files /dev/null and b/modular_doppler/modular_cosmetics/GAGS/icons/masks_teshari.dmi differ diff --git a/modular_doppler/modular_cosmetics/GAGS/icons/masquerade_mask_worn_teshari.dmi b/modular_doppler/modular_cosmetics/GAGS/icons/masquerade_mask_worn_teshari.dmi new file mode 100644 index 00000000000000..694f600739b33f Binary files /dev/null and b/modular_doppler/modular_cosmetics/GAGS/icons/masquerade_mask_worn_teshari.dmi differ diff --git a/modular_doppler/modular_cosmetics/GAGS/icons/neck_teshari.dmi b/modular_doppler/modular_cosmetics/GAGS/icons/neck_teshari.dmi new file mode 100644 index 00000000000000..64f35b3f30e711 Binary files /dev/null and b/modular_doppler/modular_cosmetics/GAGS/icons/neck_teshari.dmi differ diff --git a/modular_doppler/modular_cosmetics/GAGS/icons/ranger_poncho_teshari.dmi b/modular_doppler/modular_cosmetics/GAGS/icons/ranger_poncho_teshari.dmi new file mode 100644 index 00000000000000..bb6155f256bfe7 Binary files /dev/null and b/modular_doppler/modular_cosmetics/GAGS/icons/ranger_poncho_teshari.dmi differ diff --git a/modular_doppler/modular_cosmetics/GAGS/icons/shoes_teshari.dmi b/modular_doppler/modular_cosmetics/GAGS/icons/shoes_teshari.dmi new file mode 100644 index 00000000000000..480b6d94e66820 Binary files /dev/null and b/modular_doppler/modular_cosmetics/GAGS/icons/shoes_teshari.dmi differ diff --git a/modular_doppler/modular_cosmetics/GAGS/icons/sneakers_teshari.dmi b/modular_doppler/modular_cosmetics/GAGS/icons/sneakers_teshari.dmi new file mode 100644 index 00000000000000..bfc2c8b6c9ca23 Binary files /dev/null and b/modular_doppler/modular_cosmetics/GAGS/icons/sneakers_teshari.dmi differ diff --git a/modular_doppler/modular_cosmetics/GAGS/icons/suit_teshari.dmi b/modular_doppler/modular_cosmetics/GAGS/icons/suit_teshari.dmi new file mode 100644 index 00000000000000..46dc19157da04c Binary files /dev/null and b/modular_doppler/modular_cosmetics/GAGS/icons/suit_teshari.dmi differ diff --git a/modular_doppler/modular_cosmetics/GAGS/icons/teshari_fallbacks.dmi b/modular_doppler/modular_cosmetics/GAGS/icons/teshari_fallbacks.dmi new file mode 100644 index 00000000000000..313980049b62f0 Binary files /dev/null and b/modular_doppler/modular_cosmetics/GAGS/icons/teshari_fallbacks.dmi differ diff --git a/modular_doppler/modular_cosmetics/GAGS/icons/teshari_uniform.dmi b/modular_doppler/modular_cosmetics/GAGS/icons/teshari_uniform.dmi new file mode 100644 index 00000000000000..1e89e9d6ca52aa Binary files /dev/null and b/modular_doppler/modular_cosmetics/GAGS/icons/teshari_uniform.dmi differ diff --git a/modular_doppler/modular_cosmetics/GAGS/json_configs/shoes/boots_teshari.json b/modular_doppler/modular_cosmetics/GAGS/json_configs/shoes/boots_teshari.json new file mode 100644 index 00000000000000..6cac4b9a065fb8 --- /dev/null +++ b/modular_doppler/modular_cosmetics/GAGS/json_configs/shoes/boots_teshari.json @@ -0,0 +1,10 @@ +{ + "boots": [ + { + "type": "icon_state", + "icon_state": "boots", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/armor.json b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/armor.json new file mode 100644 index 00000000000000..1c3a4fa510a6a5 --- /dev/null +++ b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/armor.json @@ -0,0 +1,10 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "armor", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/backpack.json b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/backpack.json new file mode 100644 index 00000000000000..5297e1991de39e --- /dev/null +++ b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/backpack.json @@ -0,0 +1,10 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "backpack", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/cloak.json b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/cloak.json new file mode 100644 index 00000000000000..eca4ce58b99d49 --- /dev/null +++ b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/cloak.json @@ -0,0 +1,16 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "cloak0", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "cloak1", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/coat.json b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/coat.json new file mode 100644 index 00000000000000..3894f89c1533d5 --- /dev/null +++ b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/coat.json @@ -0,0 +1,10 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "coat", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/glasses.json b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/glasses.json new file mode 100644 index 00000000000000..42ffcabca5ca3f --- /dev/null +++ b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/glasses.json @@ -0,0 +1,16 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "glasses0", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "glasses1", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/gloves.json b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/gloves.json new file mode 100644 index 00000000000000..b122076b2c8313 --- /dev/null +++ b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/gloves.json @@ -0,0 +1,10 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "gloves", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/hardsuit.json b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/hardsuit.json new file mode 100644 index 00000000000000..5d436cef4c9191 --- /dev/null +++ b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/hardsuit.json @@ -0,0 +1,22 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "hardsuit0", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "hardsuit1", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "hardsuit2", + "blend_mode": "overlay", + "color_ids": [ 3 ] + } + ] +} diff --git a/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/jacket.json b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/jacket.json new file mode 100644 index 00000000000000..8c41d51d6d07fd --- /dev/null +++ b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/jacket.json @@ -0,0 +1,28 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "thickrobe0ii", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "thickrobe1ii", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "thickrobe2i", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "thickrobe-cuffs", + "blend_mode": "overlay", + "color_ids": [ 4 ] + } + ] +} diff --git a/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/longcoat.json b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/longcoat.json new file mode 100644 index 00000000000000..eae37e5cb96ad3 --- /dev/null +++ b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/longcoat.json @@ -0,0 +1,34 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "thickrobe0ii", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "thickrobe-skirtii", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "thickrobe1ii", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "thickrobe2i", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "thickrobe-cuffs", + "blend_mode": "overlay", + "color_ids": [ 4 ] + } + ] +} diff --git a/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/mantle.json b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/mantle.json new file mode 100644 index 00000000000000..688411d6413e69 --- /dev/null +++ b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/mantle.json @@ -0,0 +1,16 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "mantle0", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "mantle1", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/modcontrol.json b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/modcontrol.json new file mode 100644 index 00000000000000..34d155eb00e043 --- /dev/null +++ b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/modcontrol.json @@ -0,0 +1,10 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "mod-control", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/scarf.json b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/scarf.json new file mode 100644 index 00000000000000..d8ab8ed788998f --- /dev/null +++ b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/scarf.json @@ -0,0 +1,10 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "scarf", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/shoes.json b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/shoes.json new file mode 100644 index 00000000000000..ea9dec28fc9466 --- /dev/null +++ b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/shoes.json @@ -0,0 +1,10 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "shoes", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/spacesuit.json b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/spacesuit.json new file mode 100644 index 00000000000000..d69504a4652895 --- /dev/null +++ b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/spacesuit.json @@ -0,0 +1,10 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "spacesuit", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/thickrobe.json b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/thickrobe.json new file mode 100644 index 00000000000000..2211389863fd07 --- /dev/null +++ b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/thickrobe.json @@ -0,0 +1,34 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "thickrobe0i", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "thickrobe-skirti", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "thickrobe1i", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "thickrobe2i", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "thickrobe-cuffs", + "blend_mode": "overlay", + "color_ids": [ 4 ] + } + ] +} diff --git a/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/tie.json b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/tie.json new file mode 100644 index 00000000000000..7ca3e6ba842349 --- /dev/null +++ b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/tie.json @@ -0,0 +1,10 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "tie", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/under.json b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/under.json new file mode 100644 index 00000000000000..b0fb85d4e9fb32 --- /dev/null +++ b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/under.json @@ -0,0 +1,22 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "under0", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "under1", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "under2", + "blend_mode": "overlay", + "color_ids": [ 3 ] + } + ] +} diff --git a/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/under_skirt.json b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/under_skirt.json new file mode 100644 index 00000000000000..e840e2f014b1e0 --- /dev/null +++ b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/under_skirt.json @@ -0,0 +1,22 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "under_skirt0", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "under_skirt1", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "under_skirt2", + "blend_mode": "overlay", + "color_ids": [ 3 ] + } + ] +} diff --git a/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/wizrobe.json b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/wizrobe.json new file mode 100644 index 00000000000000..487a183b4f1fa8 --- /dev/null +++ b/modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/wizrobe.json @@ -0,0 +1,46 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "thickrobe0i", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "thickrobe-skirti", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "thickrobe1i", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "thickrobe2i", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "thickrobe-cuffs", + "blend_mode": "overlay", + "color_ids": [ 4 ] + }, + { + "type": "icon_state", + "icon_state": "thickrobe-belt", + "blend_mode": "overlay", + "color_ids": [ 5 ] + }, + { + "type": "icon_state", + "icon_state": "thickrobe-badge", + "blend_mode": "overlay", + "color_ids": [ 6 ] + } + ] +} diff --git a/modular_doppler/modular_cosmetics/code/belt/crusaderbelt.dm b/modular_doppler/modular_cosmetics/code/belt/crusaderbelt.dm index b17c8c8bf1c495..60c53c500cbfe1 100644 --- a/modular_doppler/modular_cosmetics/code/belt/crusaderbelt.dm +++ b/modular_doppler/modular_cosmetics/code/belt/crusaderbelt.dm @@ -9,6 +9,8 @@ w_class = WEIGHT_CLASS_BULKY // Can't fit a sheath in your bag. interaction_flags_click = NEED_DEXTERITY storage_type = /datum/storage/belt/crusader + supported_bodyshapes = null + bodyshape_icon_files = null /obj/item/storage/belt/crusader/Initialize(mapload) . = ..() diff --git a/modular_doppler/modular_cosmetics/code/belt/rigs.dm b/modular_doppler/modular_cosmetics/code/belt/rigs.dm index ff0037eed84390..2c3e5206c8dc4b 100644 --- a/modular_doppler/modular_cosmetics/code/belt/rigs.dm +++ b/modular_doppler/modular_cosmetics/code/belt/rigs.dm @@ -16,6 +16,8 @@ RESKIN_WORN_ICON_STATE = "evilwebbing" ) ) + supported_bodyshapes = null + bodyshape_icon_files = null //preloaded variant for a security loadout package /obj/item/storage/belt/military/pouches/security_gunner_package diff --git a/modular_doppler/modular_cosmetics/code/chest.dm b/modular_doppler/modular_cosmetics/code/chest.dm new file mode 100644 index 00000000000000..af75cc9a032cfe --- /dev/null +++ b/modular_doppler/modular_cosmetics/code/chest.dm @@ -0,0 +1,7 @@ +/obj/item/bodypart/chest + /// The offset datum for our accessory overlay. + var/datum/worn_feature_offset/worn_accessory_offset + +/obj/item/bodypart/chest/Destroy(force) + QDEL_NULL(worn_accessory_offset) + return ..() diff --git a/modular_doppler/modular_cosmetics/code/clothing_overrides.dm b/modular_doppler/modular_cosmetics/code/clothing_overrides.dm index 00ce0a6c924c32..a8ffeb6c8b62e8 100644 --- a/modular_doppler/modular_cosmetics/code/clothing_overrides.dm +++ b/modular_doppler/modular_cosmetics/code/clothing_overrides.dm @@ -6,11 +6,5 @@ return TRUE return ..() -//for making rollerskates work again - -/obj/item/clothing/shoes/wheelys - supported_bodyshapes = null - bodyshape_icon_files = null - /datum/component/riding/vehicle/scooter/skateboard/wheelys vehicle_move_delay = 1.5 diff --git a/modular_doppler/modular_cosmetics/code/eyes/mining.dm b/modular_doppler/modular_cosmetics/code/eyes/mining.dm index 563544676aa051..8385e90d312e86 100644 --- a/modular_doppler/modular_cosmetics/code/eyes/mining.dm +++ b/modular_doppler/modular_cosmetics/code/eyes/mining.dm @@ -13,6 +13,8 @@ color_cutoffs = list(15, 15, 5) resistance_flags = FIRE_PROOF glass_colour_type = /datum/client_colour/glass_colour/yellow + supported_bodyshapes = null + bodyshape_icon_files = null /obj/item/clothing/glasses/mining_meson/attack_self(mob/living/user) adjust_visor(user) @@ -37,3 +39,8 @@ icon = 'modular_doppler/modular_cosmetics/icons/obj/eyes/mining.dmi' worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/eyes/mining.dmi' glass_colour_type = /datum/client_colour/glass_colour/blue + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/modular_cosmetics/icons/mob/eyes/mining.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) diff --git a/modular_doppler/modular_cosmetics/code/face/glasses.dm b/modular_doppler/modular_cosmetics/code/face/glasses.dm index 8b4df7ce07dcca..74c59bb17f6b09 100644 --- a/modular_doppler/modular_cosmetics/code/face/glasses.dm +++ b/modular_doppler/modular_cosmetics/code/face/glasses.dm @@ -6,6 +6,11 @@ /obj/item/clothing/glasses/eyepatch/wrap name = "eye wrap" desc = "A glorified bandage. At least this one's actually made for your head..." + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/modular_cosmetics/icons/mob/face/glasses.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/eyes.dmi' + ) icon = 'modular_doppler/modular_cosmetics/icons/obj/face/glasses.dmi' worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/face/glasses.dmi' icon_state = "eyewrap" @@ -16,6 +21,11 @@ desc = "This is what happens when a pirate gets a PhD." icon = 'modular_doppler/modular_cosmetics/icons/obj/face/glasses.dmi' worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/face/glasses.dmi' + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/modular_cosmetics/icons/mob/face/glasses.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/eyes.dmi' + ) icon_state = "eyepatch_white" base_icon_state = "eyepatch_white" @@ -79,6 +89,11 @@ desc = "A simple HUD designed to interface with optical nerves of a lost eye. This one seems busted." icon = 'modular_doppler/modular_cosmetics/icons/obj/face/glasses.dmi' worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/face/glasses.dmi' + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/modular_cosmetics/icons/mob/face/glasses.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/eyes.dmi' + ) icon_state = "hudpatch" base_icon_state = "hudpatch" inhand_icon_state = "sunhudmed" @@ -235,6 +250,8 @@ worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/face/glasses.dmi' icon_state = "obsoletefold" base_icon_state = "obsoletefold" + supported_bodyshapes = null + bodyshape_icon_files = null /obj/item/clothing/glasses/hud/eyepatch/sec/blindfold name = "sec blindfold HUD" @@ -269,6 +286,8 @@ /obj/item/clothing/glasses/hud/ar name = "\improper AR glasses" icon = 'icons/obj/clothing/glasses.dmi' + supported_bodyshapes = null + bodyshape_icon_files = null icon_state = "glasses_regular" desc = "A heads-up display that provides important info in (almost) real time. These don't really seem to work" actions_types = list(/datum/action/item_action/toggle_mode) @@ -418,6 +437,8 @@ icon_state = "aviator" icon = 'modular_doppler/modular_cosmetics/icons/obj/face/glasses.dmi' worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/face/glasses.dmi' + supported_bodyshapes = null + bodyshape_icon_files = null // Security Aviators /obj/item/clothing/glasses/hud/ar/aviator/security @@ -623,7 +644,8 @@ greyscale_config = /datum/greyscale_config/recolorable_glasses greyscale_config_worn = /datum/greyscale_config/recolorable_glasses/worn flags_1 = IS_PLAYER_COLORABLE_1 - + supported_bodyshapes = null + bodyshape_icon_files = null #undef MODE_OFF #undef MODE_OFF_FLASH_PROTECTION diff --git a/modular_doppler/modular_cosmetics/code/hands/gloves.dm b/modular_doppler/modular_cosmetics/code/hands/gloves.dm index aa14eaf7a80d12..c5e9b149a8ae1e 100644 --- a/modular_doppler/modular_cosmetics/code/hands/gloves.dm +++ b/modular_doppler/modular_cosmetics/code/hands/gloves.dm @@ -24,6 +24,8 @@ greyscale_config_worn = /datum/greyscale_config/armwraps/worn greyscale_colors = "#FFFFFF" flags_1 = IS_PLAYER_COLORABLE_1 + supported_bodyshapes = null + bodyshape_icon_files = null /obj/item/clothing/gloves/doppler_mining name = "mining gloves" diff --git a/modular_doppler/modular_cosmetics/code/shoes/baseshoes.dm b/modular_doppler/modular_cosmetics/code/shoes/baseshoes.dm index a8159abcbd3d01..9ad7f138446cf0 100644 --- a/modular_doppler/modular_cosmetics/code/shoes/baseshoes.dm +++ b/modular_doppler/modular_cosmetics/code/shoes/baseshoes.dm @@ -52,5 +52,8 @@ icon_file = 'modular_doppler/modular_cosmetics/icons/mob/shoes/basefeet_digi.dmi' /obj/item/clothing/shoes/wheelys - supported_bodyshapes = null - bodyshape_icon_files = null + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/feet.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/feet_64.dmi' + ) diff --git a/modular_doppler/modular_cosmetics/code/storage/backpacks.dm b/modular_doppler/modular_cosmetics/code/storage/backpacks.dm index beec7a83028609..315e6f3bafd058 100644 --- a/modular_doppler/modular_cosmetics/code/storage/backpacks.dm +++ b/modular_doppler/modular_cosmetics/code/storage/backpacks.dm @@ -8,6 +8,8 @@ greyscale_config = /datum/greyscale_config/backpack greyscale_config_worn = /datum/greyscale_config/backpack/worn flags_1 = IS_PLAYER_COLORABLE_1 + supported_bodyshapes = null + bodyshape_icon_files = null /obj/item/storage/backpack/industrial/custom name = "custom industrial backpack" @@ -18,6 +20,8 @@ greyscale_config = /datum/greyscale_config/backpack greyscale_config_worn = /datum/greyscale_config/backpack/worn flags_1 = IS_PLAYER_COLORABLE_1 + supported_bodyshapes = null + bodyshape_icon_files = null // satchels /obj/item/storage/backpack/satchel/custom @@ -29,6 +33,8 @@ greyscale_config = /datum/greyscale_config/backpack/satchel greyscale_config_worn = /datum/greyscale_config/backpack/satchel/worn flags_1 = IS_PLAYER_COLORABLE_1 + supported_bodyshapes = null + bodyshape_icon_files = null /obj/item/storage/backpack/satchel/eng/custom name = "custom industrial satchel" @@ -39,6 +45,8 @@ greyscale_config = /datum/greyscale_config/backpack/satchel greyscale_config_worn = /datum/greyscale_config/backpack/satchel/worn flags_1 = IS_PLAYER_COLORABLE_1 + supported_bodyshapes = null + bodyshape_icon_files = null /obj/item/storage/backpack/satchel/crusader //Not very special, really just a satchel texture icon = 'modular_doppler/modular_cosmetics/icons/obj/storage/crusaderbandolier.dmi' @@ -48,6 +56,8 @@ icon_state = "crusader_bandolier" inhand_icon_state = "explorerpack" w_class = WEIGHT_CLASS_BULKY + supported_bodyshapes = null + bodyshape_icon_files = null /datum/crafting_recipe/crusader_satchel name = "Adventurer's Bandolier" @@ -67,6 +77,8 @@ greyscale_config = /datum/greyscale_config/backpack/duffel greyscale_config_worn = /datum/greyscale_config/backpack/duffel/worn flags_1 = IS_PLAYER_COLORABLE_1 + supported_bodyshapes = null + bodyshape_icon_files = null /obj/item/storage/backpack/duffelbag/engineering/custom name = "custom industrial duffelbag" @@ -77,6 +89,8 @@ greyscale_config = /datum/greyscale_config/backpack/duffel greyscale_config_worn = /datum/greyscale_config/backpack/duffel/worn flags_1 = IS_PLAYER_COLORABLE_1 + supported_bodyshapes = null + bodyshape_icon_files = null // messenger bags /obj/item/storage/backpack/messenger/custom @@ -88,6 +102,8 @@ greyscale_config = /datum/greyscale_config/backpack/messenger greyscale_config_worn = /datum/greyscale_config/backpack/messenger/worn flags_1 = IS_PLAYER_COLORABLE_1 + supported_bodyshapes = null + bodyshape_icon_files = null /obj/item/storage/backpack/messenger/eng/custom name = "custom industrial messenger bag" @@ -98,6 +114,8 @@ greyscale_config = /datum/greyscale_config/backpack/messenger greyscale_config_worn = /datum/greyscale_config/backpack/messenger/worn flags_1 = IS_PLAYER_COLORABLE_1 + supported_bodyshapes = null + bodyshape_icon_files = null // slimpacks /obj/item/storage/backpack/satchel/flat/empty/custom @@ -110,3 +128,5 @@ greyscale_config = /datum/greyscale_config/backpack/slimpack greyscale_config_worn = /datum/greyscale_config/backpack/slimpack/worn flags_1 = IS_PLAYER_COLORABLE_1 + supported_bodyshapes = null + bodyshape_icon_files = null diff --git a/modular_doppler/modular_cosmetics/code/storage/belts.dm b/modular_doppler/modular_cosmetics/code/storage/belts.dm index 496e2f90862319..20a1b7d32a5bb7 100644 --- a/modular_doppler/modular_cosmetics/code/storage/belts.dm +++ b/modular_doppler/modular_cosmetics/code/storage/belts.dm @@ -21,6 +21,11 @@ icon_state = "explorer1" worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/storage/mining.dmi' worn_icon_state = "explorer1" + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/modular_cosmetics/icons/mob/storage/mining.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/belt.dmi' + ) /obj/item/storage/belt/mining/alt icon = 'modular_doppler/modular_cosmetics/icons/obj/storage/mining.dmi' diff --git a/modular_doppler/modular_cosmetics/code/storage/medical/backpacks.dm b/modular_doppler/modular_cosmetics/code/storage/medical/backpacks.dm index 9e605601f0d3d6..070c4e3257b351 100644 --- a/modular_doppler/modular_cosmetics/code/storage/medical/backpacks.dm +++ b/modular_doppler/modular_cosmetics/code/storage/medical/backpacks.dm @@ -4,3 +4,5 @@ icon_state = "duffel_paramed" worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/storage/medical.dmi' icon = 'modular_doppler/modular_cosmetics/icons/obj/storage/medical.dmi' + supported_bodyshapes = null + bodyshape_icon_files = null diff --git a/modular_doppler/modular_cosmetics/code/storage/medical/base_overrides.dm b/modular_doppler/modular_cosmetics/code/storage/medical/base_overrides.dm index b1141ec9847b63..dca9bafde4497a 100644 --- a/modular_doppler/modular_cosmetics/code/storage/medical/base_overrides.dm +++ b/modular_doppler/modular_cosmetics/code/storage/medical/base_overrides.dm @@ -3,21 +3,29 @@ icon_state = "backpack_medical" worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/storage/medical.dmi' icon = 'modular_doppler/modular_cosmetics/icons/obj/storage/medical.dmi' + supported_bodyshapes = null + bodyshape_icon_files = null /obj/item/storage/backpack/chemistry icon_state = "backpack_chemistry" worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/storage/medical.dmi' icon = 'modular_doppler/modular_cosmetics/icons/obj/storage/medical.dmi' + supported_bodyshapes = null + bodyshape_icon_files = null /obj/item/storage/backpack/virology icon_state = "backpack_virology" worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/storage/medical.dmi' icon = 'modular_doppler/modular_cosmetics/icons/obj/storage/medical.dmi' + supported_bodyshapes = null + bodyshape_icon_files = null /obj/item/storage/backpack/coroner icon_state = "backpack_coroner" worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/storage/medical.dmi' icon = 'modular_doppler/modular_cosmetics/icons/obj/storage/medical.dmi' + supported_bodyshapes = null + bodyshape_icon_files = null // Messenger Bags /obj/item/storage/backpack/messenger/med diff --git a/modular_doppler/modular_cosmetics/code/storage/mining.dm b/modular_doppler/modular_cosmetics/code/storage/mining.dm index bb46009f92b2b6..d7e70957fe2ab7 100644 --- a/modular_doppler/modular_cosmetics/code/storage/mining.dm +++ b/modular_doppler/modular_cosmetics/code/storage/mining.dm @@ -4,6 +4,11 @@ icon_state = "backpack-explorer" worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/storage/mining.dmi' icon = 'modular_doppler/modular_cosmetics/icons/obj/storage/mining.dmi' + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/modular_cosmetics/icons/mob/storage/mining.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/back.dmi' + ) /obj/item/storage/backpack/duffelbag/explorer name = "explorer duffel bag" @@ -11,6 +16,8 @@ icon_state = "duffel-explorer" worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/storage/mining.dmi' icon = 'modular_doppler/modular_cosmetics/icons/obj/storage/mining.dmi' + supported_bodyshapes = null + bodyshape_icon_files = null /obj/item/storage/backpack/satchel/explorer name = "explorer satchel" @@ -18,6 +25,11 @@ icon_state = "satchel-explorer" worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/storage/mining.dmi' icon = 'modular_doppler/modular_cosmetics/icons/obj/storage/mining.dmi' + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/modular_cosmetics/icons/mob/storage/mining.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/back.dmi' + ) /obj/item/storage/backpack/messenger/explorer name = "explorer messenger bag" @@ -25,3 +37,5 @@ icon_state = "messenger_explorer" worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/storage/mining.dmi' icon = 'modular_doppler/modular_cosmetics/icons/obj/storage/mining.dmi' + supported_bodyshapes = null + bodyshape_icon_files = null diff --git a/modular_doppler/modular_cosmetics/code/suits/basesuits.dm b/modular_doppler/modular_cosmetics/code/suits/basesuits.dm index fc5f20b5aea288..0fe8429a180a73 100644 --- a/modular_doppler/modular_cosmetics/code/suits/basesuits.dm +++ b/modular_doppler/modular_cosmetics/code/suits/basesuits.dm @@ -2,10 +2,14 @@ supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION supported_bodyshapes = list( BODYSHAPE_HUMANOID, + BODYSHAPE_TESHARI, BODYSHAPE_DIGITIGRADE ) - bodyshape_icon_files = list(BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/suits/bio.dmi', - BODYSHAPE_DIGITIGRADE_T = 'modular_doppler/modular_cosmetics/icons/mob/suit/bio_digi.dmi') + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/suits/bio.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/suit.dmi', + BODYSHAPE_DIGITIGRADE_T = 'modular_doppler/modular_cosmetics/icons/mob/suit/bio_digi.dmi' + ) /obj/item/clothing/suit/wizrobe supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION @@ -17,8 +21,14 @@ BODYSHAPE_DIGITIGRADE_T = 'modular_doppler/modular_cosmetics/icons/mob/suit/wizard_digi.dmi') /obj/item/clothing/suit/hooded/wintercoat/medical - supported_bodyshapes = null - bodyshape_icon_files = null + supported_bodyshapes = list( + BODYSHAPE_HUMANOID, + BODYSHAPE_TESHARI, + ) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/modular_cosmetics/icons/mob/suit/wintercoat.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/suit.dmi' + ) icon = 'modular_doppler/modular_cosmetics/icons/obj/suit/wintercoat.dmi' worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/suit/wintercoat.dmi' @@ -26,10 +36,12 @@ supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION supported_bodyshapes = list( BODYSHAPE_HUMANOID, + BODYSHAPE_TESHARI, BODYSHAPE_DIGITIGRADE ) bodyshape_icon_files = list( BODYSHAPE_HUMANOID_T = 'modular_doppler/modular_cosmetics/icons/mob/suit/labcoat.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/suit.dmi', BODYSHAPE_DIGITIGRADE_T = 'modular_doppler/modular_cosmetics/icons/mob/suit/labcoat_digi.dmi' ) @@ -56,6 +68,7 @@ greyscale_config_worn_bodyshapes = list(BODYSHAPE_HUMANOID_T = /datum/greyscale_config/labcoat/worn, BODYSHAPE_DIGITIGRADE_T = /datum/greyscale_config/labcoat/worn/digi) /obj/item/clothing/suit/toggle/labcoat/cmo + worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/suit/labcoat.dmi' icon = 'modular_doppler/modular_cosmetics/icons/obj/suit/labcoat.dmi' /// SPACESUITS @@ -73,21 +86,24 @@ supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_DIGITIGRADE) bodyshape_icon_files = list(BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/suits/spacesuit.dmi', BODYSHAPE_DIGITIGRADE_T = 'modular_doppler/modular_cosmetics/icons/mob/suit/spacesuit_digi.dmi') + autogen_clothing_color_coords = list(list(SPACESUIT_COLORPIXEL_X_1, SPACESUIT_COLORPIXEL_Y_1)) + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/teshari/spacesuit) /// RADSUITS /obj/item/clothing/head/utility/radiation - supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_SNOUTED) + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI, BODYSHAPE_SNOUTED) bodyshape_icon_files = list(BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/head/utility.dmi', - BODYSHAPE_SNOUTED_T = 'modular_doppler/modular_cosmetics/icons/mob/head/basehead_muzzled.dmi') + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi', + BODYSHAPE_SNOUTED_T = 'modular_doppler/modular_cosmetics/icons/mob/head/basehead_muzzled.dmi', + ) /obj/item/clothing/suit/utility/radiation supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION - supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_DIGITIGRADE) + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI, BODYSHAPE_DIGITIGRADE) bodyshape_icon_files = list(BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/suits/utility.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/suit.dmi', BODYSHAPE_DIGITIGRADE_T = 'modular_doppler/modular_cosmetics/icons/mob/suit/suit_digi.dmi') - - /// FLAKY SUITS /obj/item/clothing/suit/chaplainsuit supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION diff --git a/modular_doppler/modular_cosmetics/code/suits/jacket.dm b/modular_doppler/modular_cosmetics/code/suits/jacket.dm index 55c5f8088d1d41..73f84ac807e08e 100644 --- a/modular_doppler/modular_cosmetics/code/suits/jacket.dm +++ b/modular_doppler/modular_cosmetics/code/suits/jacket.dm @@ -30,6 +30,11 @@ desc = "A simple and practical jacket for labor with a center front zipper closure, two handwarmer pockets, \ and two interior pockets. A venerable old design in cutting edge textile fiber." icon_state = "off_dep_jacket" + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/modular_cosmetics/icons/obj/suit/jacket.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/suit.dmi' + ) allowed = list( /obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, diff --git a/modular_doppler/modular_cosmetics/code/suits/mining.dm b/modular_doppler/modular_cosmetics/code/suits/mining.dm index 056ed0e16dac1b..bad41ce517d90d 100644 --- a/modular_doppler/modular_cosmetics/code/suits/mining.dm +++ b/modular_doppler/modular_cosmetics/code/suits/mining.dm @@ -4,6 +4,11 @@ icon_state = "explorer" icon = 'modular_doppler/modular_cosmetics/icons/obj/suit/working.dmi' worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/suit/working.dmi' + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/modular_cosmetics/icons/mob/suit/working.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/suit.dmi' + ) inhand_icon_state = null supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON @@ -19,6 +24,12 @@ desc = "An armoured hood for exploring harsh environments." icon = 'modular_doppler/modular_cosmetics/icons/obj/head/mining.dmi' worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/head/mining.dmi' + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/modular_cosmetics/icons/mob/head/mining.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) + icon_state = "explorer" /obj/item/clothing/head/hooded/explorer/syndicate @@ -41,6 +52,8 @@ max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF dog_fashion = null + supported_bodyshapes = null + bodyshape_icon_files = null /obj/item/clothing/suit/armor/vest/miningjacket/Initialize(mapload) . = ..() diff --git a/modular_doppler/modular_cosmetics/code/towels.dm b/modular_doppler/modular_cosmetics/code/towels.dm index 40fc9944c02c33..f061f2f31f08c9 100644 --- a/modular_doppler/modular_cosmetics/code/towels.dm +++ b/modular_doppler/modular_cosmetics/code/towels.dm @@ -29,6 +29,11 @@ desc = "Everyone knows what a towel is. Use it to dry yourself, or wear it around your chest, your waist or even your head!" icon = TOWEL_OBJ_ICON worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/suit/towel.dmi' + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/modular_cosmetics/icons/mob/suit/towel.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/suit.dmi' + ) icon_state = "towel" base_icon_state = "towel" lefthand_file = 'modular_doppler/modular_cosmetics/icons/mob/inhands/towel_lefthand.dmi' diff --git a/modular_doppler/modular_cosmetics/code/under/mining.dm b/modular_doppler/modular_cosmetics/code/under/mining.dm index 8717101904a2b8..d9b0b941688e2a 100644 --- a/modular_doppler/modular_cosmetics/code/under/mining.dm +++ b/modular_doppler/modular_cosmetics/code/under/mining.dm @@ -6,9 +6,10 @@ worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/under/mining.dmi' resistance_flags = FIRE_PROOF supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION - supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_DIGITIGRADE) + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI, BODYSHAPE_DIGITIGRADE) bodyshape_icon_files = list( BODYSHAPE_HUMANOID_T = 'modular_doppler/modular_cosmetics/icons/mob/under/mining.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/uniform.dmi', BODYSHAPE_DIGITIGRADE_T = 'modular_doppler/modular_cosmetics/icons/mob/under/mining_digi.dmi' ) @@ -17,8 +18,9 @@ desc = "It's a snappy turtleneck with a pair of working pants." icon_state = "explorer" supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION - supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_DIGITIGRADE) + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI, BODYSHAPE_DIGITIGRADE) bodyshape_icon_files = list( BODYSHAPE_HUMANOID_T = 'modular_doppler/modular_cosmetics/icons/mob/under/mining.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/uniform.dmi', BODYSHAPE_DIGITIGRADE_T = 'modular_doppler/modular_cosmetics/icons/mob/under/mining_digi.dmi' ) diff --git a/modular_doppler/modular_cosmetics/code/under/miscellania.dm b/modular_doppler/modular_cosmetics/code/under/miscellania.dm index dbd822f135284a..da7339dafaa293 100644 --- a/modular_doppler/modular_cosmetics/code/under/miscellania.dm +++ b/modular_doppler/modular_cosmetics/code/under/miscellania.dm @@ -59,6 +59,11 @@ desc = "A simple, inconspicuous harness replacement for a jumpsuit." icon = 'modular_doppler/modular_cosmetics/icons/obj/under/miscellania.dmi' worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/under/miscellania.dmi' + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/modular_cosmetics/icons/mob/under/miscellania.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/uniform.dmi' + ) icon_state = "gear_harness" body_parts_covered = NONE attachment_slot_override = CHEST diff --git a/modular_doppler/modular_cosmetics/code/under/under.dm b/modular_doppler/modular_cosmetics/code/under/under.dm new file mode 100644 index 00000000000000..5b8a95ef986f95 --- /dev/null +++ b/modular_doppler/modular_cosmetics/code/under/under.dm @@ -0,0 +1,29 @@ +/** + * Setup the final version of accessory_overlay given custom species options. + */ +/obj/item/clothing/under/proc/modify_accessory_overlay() + if(!ishuman(loc)) + return accessory_overlay + + var/mob/living/carbon/human/human_wearer = loc + + var/obj/item/bodypart/chest/my_chest = human_wearer.get_bodypart(BODY_ZONE_CHEST) + + if(isnull(attached_accessories)) + return accessory_overlay + for(var/obj/item/clothing/accessory/iter_accessory as anything in attached_accessories) + for(var/shape in iter_accessory.supported_bodyshapes) + if(human_wearer.bodyshape & shape) + var/potential_file = iter_accessory.bodyshape_icon_files["[shape]"] + if (icon_exists(potential_file, iter_accessory.icon_state)) + if (shape != BODYSHAPE_HUMANOID) // EVERYTHING has this + return accessory_overlay // dont modify + + // TEMPORARY TM ONLY FIX - Accesories are cached when they shouldnt be. Thus tesh accessories stack their offset forever + // REMOVE THIS ONCE WE FIX THIS ON TG + accessory_overlay.pixel_w = 0 + accessory_overlay.pixel_z = 0 + // Temporary fix end + my_chest?.worn_accessory_offset?.apply_offset(accessory_overlay) + + return accessory_overlay diff --git a/modular_doppler/modular_customization/accessories/code/teshari_accessories/teshari_ears.dm b/modular_doppler/modular_customization/accessories/code/teshari_accessories/teshari_ears.dm new file mode 100644 index 00000000000000..86b31f67ea234d --- /dev/null +++ b/modular_doppler/modular_customization/accessories/code/teshari_accessories/teshari_ears.dm @@ -0,0 +1,78 @@ +/datum/sprite_accessory/ears_more/teshari + icon = 'modular_doppler/modular_customization/accessories/icons/teshari/teshari_ears.dmi' + +/datum/sprite_accessory/ears_more/teshari/regular + name = "Teshari Regular" + icon_state = "teshari_regular" + +/datum/sprite_accessory/ears_more/teshari/feathers_bushy + name = "Teshari Feathers Bushy" + icon_state = "teshari_feathers_bushy" + +/datum/sprite_accessory/ears_more/teshari/feathers_mohawk + name = "Teshari Feathers Mohawk" + icon_state = "teshari_feathers_mohawk" + +/datum/sprite_accessory/ears_more/teshari/feathers_spiky + name = "Teshari Feathers Spiky" + icon_state = "teshari_feathers_spiky" + +/datum/sprite_accessory/ears_more/teshari/feathers_pointy + name = "Teshari Feathers Pointy" + icon_state = "teshari_feathers_pointy" + +/datum/sprite_accessory/ears_more/teshari/feathers_upright + name = "Teshari Feathers Upright" + icon_state = "teshari_feathers_upright" + +/datum/sprite_accessory/ears_more/teshari/feathers_mane + name = "Teshari Feathers Mane" + icon_state = "teshari_feathers_mane" + +/datum/sprite_accessory/ears_more/teshari/feathers_maneless + name = "Teshari Feathers Mane Fluffless" + icon_state = "teshari_feathers_maneless" + +/datum/sprite_accessory/ears_more/teshari/feathers_droopy + name = "Teshari Feathers Droopy" + icon_state = "teshari_feathers_droopy" + +/datum/sprite_accessory/ears_more/teshari/feathers_longway + name = "Teshari Feathers Longway" + icon_state = "teshari_feathers_longway" + +/datum/sprite_accessory/ears_more/teshari/feathers_tree + name = "Teshari Feathers Tree" + icon_state = "teshari_feathers_tree" + +/datum/sprite_accessory/ears_more/teshari/feathers_ponytail + name = "Teshari Feathers Ponytail" + icon_state = "teshari_feathers_ponytail" + +/datum/sprite_accessory/ears_more/teshari/feathers_mushroom + name = "Teshari Feathers Mushroom" + icon_state = "teshari_feathers_mushroom" + color_src = USE_ONE_COLOR + +/datum/sprite_accessory/ears_more/teshari/feathers_backstrafe + name = "Teshari Feathers Backstrafe" + icon_state = "teshari_feathers_backstrafe" + color_src = USE_ONE_COLOR + +/datum/sprite_accessory/ears_more/teshari/feathers_thinmohawk + name = "Teshari Feathers Thin Mohawk" + icon_state = "teshari_feathers_thinmohawk" + color_src = USE_ONE_COLOR + +/datum/sprite_accessory/ears_more/teshari/feathers_thin + name = "Teshari Feathers Thin" + icon_state = "teshari_feathers_thin" + color_src = USE_ONE_COLOR + +/datum/sprite_accessory/ears_more/teshari/feathers_thinmane + name = "Teshari Feathers Thin Mane" + icon_state = "teshari_feathers_thinmane" + +/datum/sprite_accessory/ears_more/teshari/feathers_thinmaneless + name = "Teshari Feathers Thin Mane Fluffless" + icon_state = "teshari_feathers_thinmaneless" diff --git a/modular_doppler/modular_customization/accessories/code/teshari_accessories/teshari_tail.dm b/modular_doppler/modular_customization/accessories/code/teshari_accessories/teshari_tail.dm new file mode 100644 index 00000000000000..21a9750854f060 --- /dev/null +++ b/modular_doppler/modular_customization/accessories/code/teshari_accessories/teshari_tail.dm @@ -0,0 +1,14 @@ +/datum/sprite_accessory/tails/teshari + icon = 'modular_doppler/modular_customization/accessories/icons/teshari/teshari_tails.dmi' + +/datum/sprite_accessory/tails/teshari/default + name = "Teshari (Default)" + icon_state = "teshari_default" + +/datum/sprite_accessory/tails/teshari/fluffy + name = "Teshari (Fluffy)" + icon_state = "teshari_fluffy" + +/datum/sprite_accessory/tails/teshari/thin + name = "Teshari (Thin)" + icon_state = "teshari_thin" diff --git a/modular_doppler/modular_customization/accessories/icons/teshari/teshari_ears.dmi b/modular_doppler/modular_customization/accessories/icons/teshari/teshari_ears.dmi new file mode 100644 index 00000000000000..f482d0f5826dcf Binary files /dev/null and b/modular_doppler/modular_customization/accessories/icons/teshari/teshari_ears.dmi differ diff --git a/modular_doppler/modular_customization/accessories/icons/teshari/teshari_tails.dmi b/modular_doppler/modular_customization/accessories/icons/teshari/teshari_tails.dmi new file mode 100644 index 00000000000000..767377ae3d58cf Binary files /dev/null and b/modular_doppler/modular_customization/accessories/icons/teshari/teshari_tails.dmi differ diff --git a/modular_doppler/modular_customization/markings/body_markings/teshari.dm b/modular_doppler/modular_customization/markings/body_markings/teshari.dm new file mode 100644 index 00000000000000..aada5232e39e2c --- /dev/null +++ b/modular_doppler/modular_customization/markings/body_markings/teshari.dm @@ -0,0 +1,38 @@ +/datum/sprite_accessory/body_marking/teshari + icon = 'modular_doppler/modular_customization/markings/icons/markings/teshari_markings.dmi' + gender_specific = TRUE + +/datum/sprite_accessory/body_marking/teshari/teshari_basic + name = "Teshari" + icon_state = "teshari" + body_zones = CHEST | ARM_LEFT | ARM_RIGHT + +/datum/sprite_accessory/body_marking/teshari/teshari_plain + name = "Teshari Plain" + icon_state = "teshari_plain" + body_zones = HEAD | CHEST | ARM_LEFT | ARM_RIGHT | LEG_RIGHT | LEG_LEFT + +/datum/sprite_accessory/body_marking/teshari/teshari_coat + name = "Teshari Coat" + icon_state = "teshari_coat" + body_zones = HEAD | CHEST | ARM_LEFT | ARM_RIGHT | LEG_RIGHT | LEG_LEFT + +/datum/sprite_accessory/body_marking/teshari/teshari_underfluff + name = "Teshari Underfluff" + icon_state = "teshari_underfluff" + body_zones = HEAD | CHEST | LEG_RIGHT | LEG_LEFT + +/datum/sprite_accessory/body_marking/teshari/teshari_short + name = "Teshari Short" + icon_state = "teshari_short" + body_zones = ARM_LEFT | ARM_RIGHT | LEG_RIGHT | LEG_LEFT + +/datum/sprite_accessory/body_marking/teshari/teshari_feathers_male + name = "Teshari Feathers (Light)" + icon_state = "teshari_feathers_male" + body_zones = HEAD | CHEST | ARM_LEFT | ARM_RIGHT | LEG_RIGHT | LEG_LEFT + +/datum/sprite_accessory/body_marking/teshari/teshari_feathers_female + name = "Teshari Feathers (Heavy)" + icon_state = "teshari_feathers_female" + body_zones = HEAD | CHEST | ARM_LEFT | ARM_RIGHT | LEG_RIGHT | LEG_LEFT diff --git a/modular_doppler/modular_customization/markings/icons/markings/teshari_markings.dmi b/modular_doppler/modular_customization/markings/icons/markings/teshari_markings.dmi new file mode 100644 index 00000000000000..45d4b4ca0b0424 Binary files /dev/null and b/modular_doppler/modular_customization/markings/icons/markings/teshari_markings.dmi differ diff --git a/modular_doppler/modular_customization/preferences/antennae.dm b/modular_doppler/modular_customization/preferences/antennae.dm index 0b87a521bd6c0e..2d568092ba6231 100644 --- a/modular_doppler/modular_customization/preferences/antennae.dm +++ b/modular_doppler/modular_customization/preferences/antennae.dm @@ -1,6 +1,6 @@ /datum/species/regenerate_organs(mob/living/carbon/target, datum/species/old_species, replace_current = TRUE, list/excluded_zones, visual_only = FALSE, replace_missing = TRUE) . = ..() - if(target.dna.features["moth_antennae"] && !(type in GLOB.species_blacklist_no_mutant)) + if(target.dna.features["moth_antennae"] && can_regenerate_mutant_feature("moth_antennae")) if(target.dna.features["moth_antennae"] != /datum/sprite_accessory/moth_antennae/none::name && target.dna.features["moth_antennae"] != /datum/sprite_accessory/blank::name) var/obj/item/organ/replacement = SSwardrobe.provide_type(/obj/item/organ/antennae) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) @@ -26,8 +26,8 @@ /datum/preference/toggle/antennae/is_accessible(datum/preferences/preferences) . = ..() - var/species = preferences.read_preference(/datum/preference/choiced/species) - if(species in GLOB.species_blacklist_no_mutant) + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(!species_can_access_mutant_customization(species)) return FALSE return TRUE @@ -38,7 +38,7 @@ /datum/preference/choiced/moth_antennae/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if(!species_can_access_mutant_customization(species)) return FALSE var/has_antennae = preferences.read_preference(/datum/preference/toggle/antennae) if(has_antennae == TRUE) diff --git a/modular_doppler/modular_customization/preferences/cyber_limbs.dm b/modular_doppler/modular_customization/preferences/cyber_limbs.dm index 5cfbb6d7fbe8ee..29cc3715795c75 100644 --- a/modular_doppler/modular_customization/preferences/cyber_limbs.dm +++ b/modular_doppler/modular_customization/preferences/cyber_limbs.dm @@ -21,6 +21,7 @@ GLOBAL_LIST_INIT(frame_types, list( "zhenkovdark", "shard_alpha", "polytronic", + "teshari", "empty", )) @@ -47,6 +48,7 @@ GLOBAL_LIST_INIT(frame_type_names, list( "zhenkovdark" = "Zhenkov & Co. Foundries - At Night", "shard_alpha" = "Shard Alpha Raptoral", "polytronic" = "Polytronic Modular Doll", + "teshari" = "Synthetic Teshari", "empty" = "Missing limb", )) /obj/item/bodypart/head/robot/android/empty diff --git a/modular_doppler/modular_customization/preferences/ears.dm b/modular_doppler/modular_customization/preferences/ears.dm index 735bbc69d941d4..7967fa95cbe7c8 100644 --- a/modular_doppler/modular_customization/preferences/ears.dm +++ b/modular_doppler/modular_customization/preferences/ears.dm @@ -13,6 +13,7 @@ var/list/ears_list_humanoid var/list/ears_list_synthetic var/list/ears_list_alien + var/list/ears_list_teshari /datum/controller/subsystem/accessories/setup_lists() . = ..() @@ -29,6 +30,7 @@ ears_list_humanoid = init_sprite_accessory_subtypes(/datum/sprite_accessory/ears_more/humanoid)["default_sprites"] ears_list_synthetic = init_sprite_accessory_subtypes(/datum/sprite_accessory/ears_more/cybernetic)["default_sprites"] ears_list_alien = init_sprite_accessory_subtypes(/datum/sprite_accessory/ears_more/alien)["default_sprites"] + ears_list_teshari = init_sprite_accessory_subtypes(/datum/sprite_accessory/ears_more/teshari)["default_sprites"] /datum/dna /// This variable is read by the regenerate_organs() proc to know what organ subtype to give @@ -36,7 +38,7 @@ /datum/species/regenerate_organs(mob/living/carbon/target, datum/species/old_species, replace_current = TRUE, list/excluded_zones, visual_only = FALSE, replace_missing = TRUE) . = ..() - if(target.dna.features[FEATURE_EARS] && !(type in GLOB.species_blacklist_no_mutant)) + if(target.dna.features[FEATURE_EARS] && can_regenerate_mutant_feature(FEATURE_EARS)) if(target.dna.ear_type == NO_VARIATION) return . else if(target.dna.features[FEATURE_EARS] != /datum/sprite_accessory/ears/none::name && target.dna.features[FEATURE_EARS] != /datum/sprite_accessory/blank::name) @@ -66,9 +68,7 @@ /datum/preference/choiced/ear_variation/is_accessible(datum/preferences/preferences) . = ..() var/species = preferences.read_preference(/datum/preference/choiced/species) - if(species in GLOB.species_blacklist_no_mutant) - return FALSE - return TRUE + return species_can_access_mutant_customization(species) /// All current ear types to choose from // Cat @@ -81,8 +81,9 @@ /datum/preference/choiced/felinid_ears/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE + var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == CAT) return TRUE @@ -115,7 +116,7 @@ /datum/preference/choiced/lizard_ears/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == LIZARD) @@ -148,7 +149,7 @@ /datum/preference/choiced/fox_ears/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == FOX) @@ -181,7 +182,7 @@ /datum/preference/choiced/dog_ears/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == DOG) @@ -214,7 +215,7 @@ /datum/preference/choiced/bunny_ears/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == BUNNY) @@ -247,7 +248,7 @@ /datum/preference/choiced/bird_ears/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == BIRD) @@ -280,7 +281,7 @@ /datum/preference/choiced/mouse_ears/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == MOUSE) @@ -313,7 +314,7 @@ /datum/preference/choiced/monkey_ears/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == MONKEY) @@ -346,7 +347,7 @@ /datum/preference/choiced/deer_ears/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == DEER) @@ -379,7 +380,7 @@ /datum/preference/choiced/fish_ears/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == FISH) @@ -412,7 +413,7 @@ /datum/preference/choiced/bug_ears/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == BUG) @@ -445,7 +446,7 @@ /datum/preference/choiced/humanoid_ears/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == HUMANOID) @@ -478,7 +479,7 @@ /datum/preference/choiced/synthetic_ears/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == CYBERNETIC) @@ -511,7 +512,7 @@ /datum/preference/choiced/alien_ears/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/ear_variation) if(chosen_variation == ALIEN) @@ -529,13 +530,73 @@ var/datum/sprite_accessory/chosen_ears = SSaccessories.ears_list_alien[value] return generate_ears_icon(chosen_ears) +// Teshari +// Only available to teshari, and their only choice, because of how they work on sprites +/datum/preference/choiced/teshari_ears + savefile_key = "feature_teshari_ears" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_CLOTHING + relevant_external_organ = null + should_generate_icons = TRUE + main_feature_name = "Ears" + priority = PREFERENCE_PRIORITY_SPECIES + 0.1 // ears are only applied if the human is a tesh, so we have to wait for species + +/datum/preference/choiced/teshari_ears/init_possible_values() + return assoc_to_keys_features(SSaccessories.ears_list_teshari) + +/datum/preference/choiced/teshari_ears/is_accessible(datum/preferences/preferences) + . = ..() + + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if (!ispath(species, /datum/species/teshari)) + return FALSE + + return TRUE + +/datum/preference/choiced/teshari_ears/species_can_access_mutant_customization(species_typepath) + if (ispath(species_typepath, /datum/species/teshari)) + return TRUE + return ..() + +/datum/preference/choiced/teshari_ears/create_default_value() + return /datum/sprite_accessory/ears_more/teshari/none::name + +/datum/preference/choiced/teshari_ears/apply_to_human(mob/living/carbon/human/target, value) + if(target.dna.ear_type == TESHARI) + target.dna.features[FEATURE_EARS] = value + target.regenerate_organs() + +/datum/preference/choiced/teshari_ears/icon_for(value) + var/datum/sprite_accessory/chosen_ears = SSaccessories.ears_list_teshari[value] + return generate_ears_icon(chosen_ears) + +GLOBAL_VAR(generic_uni_icon_ears) +GLOBAL_VAR(generic_uni_icon_ears_tesh) + +/datum/preference/choiced/proc/gen_uni_icon_ears() + var/icon = uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_head_f") + GLOB.generic_uni_icon_ears = icon + return icon + +/datum/preference/choiced/teshari_ears/gen_uni_icon_ears() + var/icon = uni_icon('modular_doppler/modular_species/species_types/teshari/icons/teshari_parts_greyscale.dmi', "teshari_head_f") + GLOB.generic_uni_icon_ears_tesh = icon + return icon + +/datum/preference/choiced/proc/get_uni_icon_ears_cached() + RETURN_TYPE(/datum/universal_icon) + + return GLOB.generic_uni_icon_ears + +/datum/preference/choiced/teshari_ears/get_uni_icon_ears_cached() + return GLOB.generic_uni_icon_ears_tesh /// Proc to gen that icon // We don't wanna copy paste this /datum/preference/choiced/proc/generate_ears_icon(datum/sprite_accessory/sprite_accessory) - var/static/datum/universal_icon/body + var/datum/universal_icon/body = get_uni_icon_ears_cached() if (isnull(body)) - body = uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_head_f") + body = gen_uni_icon_ears() var/datum/universal_icon/final_icon = body.copy() if(sprite_accessory.icon_state != "none") @@ -571,11 +632,18 @@ accessory_icon.blend_color(COLOR_BLUE, ICON_MULTIPLY) final_icon.blend_icon(accessory_icon, ICON_OVERLAY) + shift_ears_icon(final_icon) final_icon.crop(11, 20, 23, 32) final_icon.scale(32, 32) return final_icon +/datum/preference/choiced/proc/shift_ears_icon(var/datum/universal_icon/icon) + return + +/datum/preference/choiced/teshari_ears/shift_ears_icon(var/datum/universal_icon/icon) + icon.shift(NORTH, 5) + /// Overwrite lives here // This is for the triple color channel /datum/bodypart_overlay/mutant/ears diff --git a/modular_doppler/modular_customization/preferences/fluff.dm b/modular_doppler/modular_customization/preferences/fluff.dm index 3ad6bbb2882502..ab3f431be31947 100644 --- a/modular_doppler/modular_customization/preferences/fluff.dm +++ b/modular_doppler/modular_customization/preferences/fluff.dm @@ -7,7 +7,7 @@ /datum/species/regenerate_organs(mob/living/carbon/target, datum/species/old_species, replace_current = TRUE, list/excluded_zones, visual_only = FALSE, replace_missing = TRUE) . = ..() - if(target.dna.features[FEATURE_FLUFF] && !(type in GLOB.species_blacklist_no_mutant)) + if(target.dna.features[FEATURE_FLUFF] && can_regenerate_mutant_feature(FEATURE_FLUFF)) if(target.dna.features[FEATURE_FLUFF] != /datum/sprite_accessory/fluff/none::name && target.dna.features[FEATURE_FLUFF] != /datum/sprite_accessory/blank::name) var/obj/item/organ/replacement = SSwardrobe.provide_type(/obj/item/organ/fluff) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) @@ -34,7 +34,7 @@ /datum/preference/toggle/fluff/is_accessible(datum/preferences/preferences) . = ..() var/species = preferences.read_preference(/datum/preference/choiced/species) - if(species in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE return TRUE @@ -52,7 +52,7 @@ /datum/preference/choiced/fluff/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if(!species_can_access_mutant_customization(species)) return FALSE var/has_fluff = preferences.read_preference(/datum/preference/toggle/fluff) if(has_fluff) diff --git a/modular_doppler/modular_customization/preferences/frills.dm b/modular_doppler/modular_customization/preferences/frills.dm index eee278b5a02f3f..60e2702123d40f 100644 --- a/modular_doppler/modular_customization/preferences/frills.dm +++ b/modular_doppler/modular_customization/preferences/frills.dm @@ -25,8 +25,8 @@ /datum/preference/toggle/frills/is_accessible(datum/preferences/preferences) . = ..() - var/species = preferences.read_preference(/datum/preference/choiced/species) - if(species in GLOB.species_blacklist_no_mutant) + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + if(!species_can_access_mutant_customization(species)) return FALSE return TRUE @@ -56,7 +56,7 @@ /datum/species/regenerate_organs(mob/living/carbon/target, datum/species/old_species, replace_current = TRUE, list/excluded_zones, visual_only = FALSE, replace_missing = TRUE) . = ..() - if(target.dna.features["frills"] && !(type in GLOB.species_blacklist_no_mutant)) + if(target.dna.features["frills"] && can_regenerate_mutant_feature("frills")) if(target.dna.features["frills"] != /datum/sprite_accessory/frills/none::name && target.dna.features["frills"] != /datum/sprite_accessory/blank::name) var/obj/item/organ/replacement = SSwardrobe.provide_type(/obj/item/organ/frills) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) @@ -73,7 +73,7 @@ /datum/preference/choiced/lizard_frills/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if(!species_can_access_mutant_customization(species)) return FALSE var/has_frills = preferences.read_preference(/datum/preference/toggle/frills) if(has_frills == TRUE) diff --git a/modular_doppler/modular_customization/preferences/horns.dm b/modular_doppler/modular_customization/preferences/horns.dm index 2af4712e3f568f..1728745b4e732b 100644 --- a/modular_doppler/modular_customization/preferences/horns.dm +++ b/modular_doppler/modular_customization/preferences/horns.dm @@ -26,13 +26,13 @@ /datum/preference/toggle/horns/is_accessible(datum/preferences/preferences) . = ..() var/species = preferences.read_preference(/datum/preference/choiced/species) - if(species in GLOB.species_blacklist_no_mutant) + if(!species_can_access_mutant_customization(species)) return FALSE return TRUE /datum/species/regenerate_organs(mob/living/carbon/target, datum/species/old_species, replace_current = TRUE, list/excluded_zones, visual_only = FALSE, replace_missing = TRUE) . = ..() - if(target.dna.features[FEATURE_HORNS] && !(type in GLOB.species_blacklist_no_mutant)) + if(target.dna.features[FEATURE_HORNS] && can_regenerate_mutant_feature(FEATURE_HORNS)) if(target.dna.features[FEATURE_HORNS] != /datum/sprite_accessory/horns/none::name && target.dna.features[FEATURE_HORNS] != /datum/sprite_accessory/blank::name) var/obj/item/organ/replacement = SSwardrobe.provide_type(/obj/item/organ/horns) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) @@ -49,7 +49,7 @@ /datum/preference/choiced/lizard_horns/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if(!species_can_access_mutant_customization(species)) return FALSE var/has_horns = preferences.read_preference(/datum/preference/toggle/horns) if(has_horns == TRUE) diff --git a/modular_doppler/modular_customization/preferences/preference.dm b/modular_doppler/modular_customization/preferences/preference.dm new file mode 100644 index 00000000000000..09b1d0114213c6 --- /dev/null +++ b/modular_doppler/modular_customization/preferences/preference.dm @@ -0,0 +1,9 @@ +/** + * Only used for doppler-specific customization, such as tails, antenna... + * + * If this returns TRUE, allows the species to access our customization. + */ +/datum/preference/proc/species_can_access_mutant_customization(species_typepath) + if (species_typepath in GLOB.species_blacklist_no_mutant) + return FALSE + return TRUE diff --git a/modular_doppler/modular_customization/preferences/snout.dm b/modular_doppler/modular_customization/preferences/snout.dm index a37aee41628990..b79feb93848501 100644 --- a/modular_doppler/modular_customization/preferences/snout.dm +++ b/modular_doppler/modular_customization/preferences/snout.dm @@ -1,6 +1,6 @@ /datum/species/regenerate_organs(mob/living/carbon/target, datum/species/old_species, replace_current = TRUE, list/excluded_zones, visual_only = FALSE, replace_missing = TRUE) . = ..() - if(target.dna.features["snout"] && !(type in GLOB.species_blacklist_no_mutant)) + if(target.dna.features["snout"] && can_regenerate_mutant_feature("snout")) if(target.dna.features["snout"] != /datum/sprite_accessory/snouts/none::name && target.dna.features["snout"] != /datum/sprite_accessory/blank::name) var/obj/item/organ/replacement = SSwardrobe.provide_type(/obj/item/organ/snout) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) @@ -27,7 +27,7 @@ /datum/preference/toggle/snout/is_accessible(datum/preferences/preferences) . = ..() var/species = preferences.read_preference(/datum/preference/choiced/species) - if(species in GLOB.species_blacklist_no_mutant) + if(!species_can_access_mutant_customization(species)) return FALSE return TRUE @@ -37,7 +37,7 @@ /datum/preference/choiced/lizard_snout/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if(!species_can_access_mutant_customization(species)) return FALSE var/has_snout = preferences.read_preference(/datum/preference/toggle/snout) if(has_snout == TRUE) diff --git a/modular_doppler/modular_customization/preferences/tail.dm b/modular_doppler/modular_customization/preferences/tail.dm index 88c651df0c9cc8..fe288e13b8bc97 100644 --- a/modular_doppler/modular_customization/preferences/tail.dm +++ b/modular_doppler/modular_customization/preferences/tail.dm @@ -10,6 +10,7 @@ var/list/tails_list_synth var/list/tails_list_humanoid var/list/tails_list_alien + var/list/tails_list_teshari /datum/controller/subsystem/accessories/setup_lists() . = ..() @@ -23,6 +24,7 @@ tails_list_synth = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/cybernetic)["default_sprites"] tails_list_humanoid = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/humanoid)["default_sprites"] tails_list_alien = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/alien)["default_sprites"] + tails_list_teshari = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/teshari)["default_sprites"] /datum/dna /// This variable is read by the regenerate_organs() proc to know what organ subtype to give @@ -35,23 +37,23 @@ if(!ishuman(target)) return - if(target.dna.features[FEATURE_TAIL_LIZARD] != /datum/sprite_accessory/tails/lizard/none::name && !(type in GLOB.species_blacklist_no_mutant) && target.dna.features[FEATURE_TAIL_LIZARD] != /datum/sprite_accessory/blank::name) + if(target.dna.features[FEATURE_TAIL_LIZARD] != /datum/sprite_accessory/tails/lizard/none::name && can_regenerate_mutant_feature(FEATURE_TAIL_LIZARD) && target.dna.features[FEATURE_TAIL_LIZARD] != /datum/sprite_accessory/blank::name) var/obj/item/organ/replacement = SSwardrobe.provide_type(/obj/item/organ/tail/lizard) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) return . - else if(target.dna.features[FEATURE_TAIL] != /datum/sprite_accessory/tails/human/none::name && !(type in GLOB.species_blacklist_no_mutant) && target.dna.features[FEATURE_TAIL] != /datum/sprite_accessory/blank::name) + else if(target.dna.features[FEATURE_TAIL] != /datum/sprite_accessory/tails/human/none::name && can_regenerate_mutant_feature(FEATURE_TAIL) && target.dna.features[FEATURE_TAIL] != /datum/sprite_accessory/blank::name) var/obj/item/organ/replacement = SSwardrobe.provide_type(/obj/item/organ/tail/cat) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) return . - else if(target.dna.features[FEATURE_TAIL_MONKEY] != /datum/sprite_accessory/tails/monkey/none::name && !(type in GLOB.species_blacklist_no_mutant) && target.dna.features[FEATURE_TAIL_MONKEY] != /datum/sprite_accessory/blank::name) + else if(target.dna.features[FEATURE_TAIL_MONKEY] != /datum/sprite_accessory/tails/monkey/none::name && can_regenerate_mutant_feature(FEATURE_TAIL_MONKEY) && target.dna.features[FEATURE_TAIL_MONKEY] != /datum/sprite_accessory/blank::name) var/obj/item/organ/replacement = SSwardrobe.provide_type(/obj/item/organ/tail/monkey) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) return . - else if(target.dna.features[FEATURE_TAIL_FISH] != /datum/sprite_accessory/tails/fish/none::name && !(type in GLOB.species_blacklist_no_mutant) && target.dna.features[FEATURE_TAIL_FISH] != /datum/sprite_accessory/blank::name) + else if(target.dna.features[FEATURE_TAIL_FISH] != /datum/sprite_accessory/tails/fish/none::name && can_regenerate_mutant_feature(FEATURE_TAIL_FISH) && target.dna.features[FEATURE_TAIL_FISH] != /datum/sprite_accessory/blank::name) var/obj/item/organ/replacement = SSwardrobe.provide_type(/obj/item/organ/tail/fish) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) return . - else if((target.dna.features[FEATURE_TAIL_OTHER] != /datum/sprite_accessory/tails/lizard/none::name && !(type in GLOB.species_blacklist_no_mutant) && target.dna.features[FEATURE_TAIL_OTHER] != /datum/sprite_accessory/blank::name) && (target.dna.tail_type != NO_VARIATION)) + else if((target.dna.features[FEATURE_TAIL_OTHER] != /datum/sprite_accessory/tails/lizard/none::name && can_regenerate_mutant_feature(FEATURE_TAIL_OTHER) && target.dna.features[FEATURE_TAIL_OTHER] != /datum/sprite_accessory/blank::name) && (target.dna.tail_type != NO_VARIATION)) var/obj/item/organ/organ_path = text2path("/obj/item/organ/tail/[target.dna.tail_type]") var/obj/item/organ/replacement = SSwardrobe.provide_type(organ_path) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) @@ -75,15 +77,20 @@ return NO_VARIATION /datum/preference/choiced/tail_variation/init_possible_values() - return list(NO_VARIATION) + (GLOB.mutant_variations) + return list(NO_VARIATION) + (GLOB.mutant_variations) + list(TESHARI) /datum/preference/choiced/tail_variation/is_accessible(datum/preferences/preferences) . = ..() var/species = preferences.read_preference(/datum/preference/choiced/species) - if(species in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE return TRUE +/datum/preference/choiced/tail_variation/species_can_access_mutant_customization(species_typepath) + if (ispath(species_typepath, /datum/species/teshari)) + return TRUE + return ..() + /datum/preference/choiced/tail_variation/apply_to_human(mob/living/carbon/human/target, chosen_variation) // Read by the regenerate_organs() proc to know what organ subtype to grant target.dna.tail_type = chosen_variation @@ -130,10 +137,15 @@ should_generate_icons = TRUE main_feature_name = "Tail" +/datum/preference/choiced/lizard_tail/species_can_access_mutant_customization(species_typepath) + if (ispath(species_typepath, /datum/species/teshari)) + return TRUE + return ..() + /datum/preference/choiced/lizard_tail/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == LIZARD) @@ -160,7 +172,7 @@ /datum/preference/choiced/tail_felinid/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == CAT) @@ -186,13 +198,18 @@ should_generate_icons = TRUE main_feature_name = "Tail" +/datum/preference/choiced/dog_tail/species_can_access_mutant_customization(species_typepath) + if (ispath(species_typepath, /datum/species/teshari)) + return TRUE + return ..() + /datum/preference/choiced/dog_tail/init_possible_values() return assoc_to_keys_features(SSaccessories.tails_list_dog) /datum/preference/choiced/dog_tail/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == DOG) @@ -219,13 +236,18 @@ should_generate_icons = TRUE main_feature_name = "Tail" +/datum/preference/choiced/fox_tail/species_can_access_mutant_customization(species_typepath) + if (ispath(species_typepath, /datum/species/teshari)) + return TRUE + return ..() + /datum/preference/choiced/fox_tail/init_possible_values() return assoc_to_keys_features(SSaccessories.tails_list_fox) /datum/preference/choiced/fox_tail/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == FOX) @@ -252,13 +274,18 @@ should_generate_icons = TRUE main_feature_name = "Tail" +/datum/preference/choiced/bunny_tail/species_can_access_mutant_customization(species_typepath) + if (ispath(species_typepath, /datum/species/teshari)) + return TRUE + return ..() + /datum/preference/choiced/bunny_tail/init_possible_values() return assoc_to_keys_features(SSaccessories.tails_list_bunny) /datum/preference/choiced/bunny_tail/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == BUNNY) @@ -285,13 +312,18 @@ should_generate_icons = TRUE main_feature_name = "Tail" +/datum/preference/choiced/mouse_tail/species_can_access_mutant_customization(species_typepath) + if (ispath(species_typepath, /datum/species/teshari)) + return TRUE + return ..() + /datum/preference/choiced/mouse_tail/init_possible_values() return assoc_to_keys_features(SSaccessories.tails_list_mouse) /datum/preference/choiced/mouse_tail/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == MOUSE) @@ -318,13 +350,18 @@ should_generate_icons = TRUE main_feature_name = "Tail" +/datum/preference/choiced/bird_tail/species_can_access_mutant_customization(species_typepath) + if (ispath(species_typepath, /datum/species/teshari)) + return TRUE + return ..() + /datum/preference/choiced/bird_tail/init_possible_values() return assoc_to_keys_features(SSaccessories.tails_list_bird) /datum/preference/choiced/bird_tail/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == BIRD) @@ -349,10 +386,15 @@ should_generate_icons = TRUE main_feature_name = "Tail" +/datum/preference/choiced/monkey_tail/species_can_access_mutant_customization(species_typepath) + if (ispath(species_typepath, /datum/species/teshari)) + return TRUE + return ..() + /datum/preference/choiced/monkey_tail/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == MONKEY) @@ -378,13 +420,18 @@ should_generate_icons = TRUE main_feature_name = "Tail" +/datum/preference/choiced/deer_tail/species_can_access_mutant_customization(species_typepath) + if (ispath(species_typepath, /datum/species/teshari)) + return TRUE + return ..() + /datum/preference/choiced/deer_tail/init_possible_values() return assoc_to_keys_features(SSaccessories.tails_list_deer) /datum/preference/choiced/deer_tail/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == DEER) @@ -411,13 +458,18 @@ should_generate_icons = TRUE main_feature_name = "Tail" +/datum/preference/choiced/fish_tail/species_can_access_mutant_customization(species_typepath) + if (ispath(species_typepath, /datum/species/teshari)) + return TRUE + return ..() + /datum/preference/choiced/fish_tail/init_possible_values() return assoc_to_keys_features(SSaccessories.tails_list_fish) /datum/preference/choiced/fish_tail/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == FISH) @@ -444,13 +496,18 @@ should_generate_icons = TRUE main_feature_name = "Tail" +/datum/preference/choiced/bug_tail/species_can_access_mutant_customization(species_typepath) + if (ispath(species_typepath, /datum/species/teshari)) + return TRUE + return ..() + /datum/preference/choiced/bug_tail/init_possible_values() return assoc_to_keys_features(SSaccessories.tails_list_bug) /datum/preference/choiced/bug_tail/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == BUG) @@ -477,13 +534,18 @@ should_generate_icons = TRUE main_feature_name = "Tail" +/datum/preference/choiced/synth_tail/species_can_access_mutant_customization(species_typepath) + if (ispath(species_typepath, /datum/species/teshari)) + return TRUE + return ..() + /datum/preference/choiced/synth_tail/init_possible_values() return assoc_to_keys_features(SSaccessories.tails_list_synth) /datum/preference/choiced/synth_tail/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == CYBERNETIC) @@ -510,13 +572,18 @@ should_generate_icons = TRUE main_feature_name = "Tail" +/datum/preference/choiced/humanoid_tail/species_can_access_mutant_customization(species_typepath) + if (ispath(species_typepath, /datum/species/teshari)) + return TRUE + return ..() + /datum/preference/choiced/humanoid_tail/init_possible_values() return assoc_to_keys_features(SSaccessories.tails_list_humanoid) /datum/preference/choiced/humanoid_tail/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == HUMANOID) @@ -543,13 +610,18 @@ should_generate_icons = TRUE main_feature_name = "Tail" +/datum/preference/choiced/alien_tail/species_can_access_mutant_customization(species_typepath) + if (ispath(species_typepath, /datum/species/teshari)) + return TRUE + return ..() + /datum/preference/choiced/alien_tail/init_possible_values() return assoc_to_keys_features(SSaccessories.tails_list_alien) /datum/preference/choiced/alien_tail/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) if(chosen_variation == ALIEN) @@ -567,6 +639,47 @@ var/datum/sprite_accessory/chosen_tail = SSaccessories.tails_list_alien[value] return generate_back_icon(chosen_tail, "tail") +// Teshari +/datum/preference/choiced/teshari_tail + savefile_key = "feature_teshari_tail" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_CLOTHING + relevant_external_organ = null + should_generate_icons = TRUE + main_feature_name = "Tail" + +/datum/preference/choiced/teshari_tail/init_possible_values() + return assoc_to_keys_features(SSaccessories.tails_list_teshari) + +/datum/preference/choiced/teshari_tail/is_accessible(datum/preferences/preferences) + . = ..() + var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) + + if (!species_can_access_mutant_customization(species)) + return FALSE + + var/chosen_variation = preferences.read_preference(/datum/preference/choiced/tail_variation) + if(chosen_variation == TESHARI) + return TRUE + return FALSE + +/datum/preference/choiced/teshari_tail/species_can_access_mutant_customization(species_typepath) + if (ispath(species_typepath, /datum/species/teshari)) + return TRUE + return ..() + +/datum/preference/choiced/teshari_tail/create_default_value() + return /datum/sprite_accessory/tails/alien/none::name + +/datum/preference/choiced/teshari_tail/apply_to_human(mob/living/carbon/human/target, value) + if(target.dna.tail_type == TESHARI) + target.dna.features[FEATURE_TAIL_OTHER] = value + target.regenerate_organs() + +/datum/preference/choiced/teshari_tail/icon_for(value) + var/datum/sprite_accessory/chosen_tail = SSaccessories.tails_list_teshari[value] + return generate_back_icon(chosen_tail, "tail") + /// Proc to gen that icon // We don't wanna copy paste this /datum/preference/choiced/proc/generate_back_icon(datum/sprite_accessory/sprite_accessory, key) diff --git a/modular_doppler/modular_customization/preferences/taur.dm b/modular_doppler/modular_customization/preferences/taur.dm index aa083382a80e0e..09e7f64a7e4a3e 100644 --- a/modular_doppler/modular_customization/preferences/taur.dm +++ b/modular_doppler/modular_customization/preferences/taur.dm @@ -10,7 +10,7 @@ // dna is a string /datum/species/regenerate_organs(mob/living/carbon/target, datum/species/old_species, replace_current = TRUE, list/excluded_zones, visual_only = FALSE, replace_missing = TRUE) . = ..() - if(target.dna.features[FEATURE_TAUR] && !(type in GLOB.species_blacklist_no_mutant)) + if(target.dna.features[FEATURE_TAUR] && can_regenerate_mutant_feature(FEATURE_TAUR)) if(target.dna.features[FEATURE_TAUR] != /datum/sprite_accessory/taur/none::name && target.dna.features[FEATURE_TAUR] != /datum/sprite_accessory/blank::name) var/obj/item/organ/taur_body/body_to_use = /obj/item/organ/taur_body var/datum/sprite_accessory/taur/accessory = SSaccessories.taur_list[target.dna.features[FEATURE_TAUR]] @@ -41,7 +41,7 @@ /datum/preference/toggle/taur/is_accessible(datum/preferences/preferences) . = ..() var/species = preferences.read_preference(/datum/preference/choiced/species) - if(species in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE return TRUE @@ -89,7 +89,7 @@ return FALSE var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/has_taur = preferences.read_preference(/datum/preference/toggle/taur) if(has_taur == TRUE) diff --git a/modular_doppler/modular_customization/preferences/wings.dm b/modular_doppler/modular_customization/preferences/wings.dm index 7b190ee9e1b0c5..b3dfbf1e145eb5 100644 --- a/modular_doppler/modular_customization/preferences/wings.dm +++ b/modular_doppler/modular_customization/preferences/wings.dm @@ -17,14 +17,14 @@ if(!ishuman(target)) return - if(target.dna.features[FEATURE_MOTH_WINGS] && !(type in GLOB.species_blacklist_no_mutant)) + if(target.dna.features[FEATURE_MOTH_WINGS] && can_regenerate_mutant_feature(FEATURE_MOTH_WINGS)) if(target.dna.wing_type == NO_VARIATION) return . if((target.dna.features[FEATURE_MOTH_WINGS] != /datum/sprite_accessory/moth_wings/none::name && target.dna.features["moth_wings"] != /datum/sprite_accessory/blank::name)) var/obj/item/organ/replacement = SSwardrobe.provide_type(/obj/item/organ/wings/moth) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) return . - if(target.dna.features[FEATURE_WINGS] && !(type in GLOB.species_blacklist_no_mutant)) + if(target.dna.features[FEATURE_WINGS] && can_regenerate_mutant_feature(FEATURE_WINGS)) if(target.dna.features[FEATURE_WINGS] != /datum/sprite_accessory/wings_more/none::name && target.dna.features["wings"] != /datum/sprite_accessory/blank::name) var/obj/item/organ/replacement = SSwardrobe.provide_type(/obj/item/organ/wings/more) replacement.Insert(target, special = TRUE, movement_flags = DELETE_IF_REPLACED) @@ -63,7 +63,7 @@ /datum/preference/choiced/wing_variation/is_accessible(datum/preferences/preferences) . = ..() var/species = preferences.read_preference(/datum/preference/choiced/species) - if(species in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE return TRUE @@ -79,7 +79,7 @@ /datum/preference/choiced/wings/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/wing_variation) if(chosen_variation == "Wings") @@ -110,7 +110,7 @@ /datum/preference/choiced/moth_wings/is_accessible(datum/preferences/preferences) . = ..() var/datum/species/species = preferences.read_preference(/datum/preference/choiced/species) - if(species.type in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE var/chosen_variation = preferences.read_preference(/datum/preference/choiced/wing_variation) if(chosen_variation == "Moth Wings") diff --git a/modular_doppler/modular_customization/tri_color/ears.dm b/modular_doppler/modular_customization/tri_color/ears.dm index 3c085298a78a1d..b47363fee5da79 100644 --- a/modular_doppler/modular_customization/tri_color/ears.dm +++ b/modular_doppler/modular_customization/tri_color/ears.dm @@ -69,6 +69,10 @@ data[SUPPLEMENTAL_FEATURE_KEY] = /datum/preference/tri_color/ears_color::savefile_key return data +/datum/preference/choiced/teshari_ears/compile_constant_data() + var/list/data = ..() + data[SUPPLEMENTAL_FEATURE_KEY] = /datum/preference/tri_color/ears_color::savefile_key + return data /// Ears colors! /datum/preference/tri_color/ears_color diff --git a/modular_doppler/modular_customization/tri_color/legs.dm b/modular_doppler/modular_customization/tri_color/legs.dm index b8929c5a5cc23d..80cbce6c2f396c 100644 --- a/modular_doppler/modular_customization/tri_color/legs.dm +++ b/modular_doppler/modular_customization/tri_color/legs.dm @@ -12,7 +12,7 @@ /datum/preference/toggle/default_legs_color/is_accessible(datum/preferences/preferences) . = ..() var/species = preferences.read_preference(/datum/preference/choiced/species) - if(species in GLOB.species_blacklist_no_mutant) + if (!species_can_access_mutant_customization(species)) return FALSE return TRUE diff --git a/modular_doppler/modular_customization/tri_color/tail.dm b/modular_doppler/modular_customization/tri_color/tail.dm index 1141fa1c9cbc31..99a8b2074ff9eb 100644 --- a/modular_doppler/modular_customization/tri_color/tail.dm +++ b/modular_doppler/modular_customization/tri_color/tail.dm @@ -70,6 +70,11 @@ data[SUPPLEMENTAL_FEATURE_KEY] = /datum/preference/tri_color/tail_color::savefile_key return data +/datum/preference/choiced/teshari_tail/compile_constant_data() + var/list/data = ..() + data[SUPPLEMENTAL_FEATURE_KEY] = /datum/preference/tri_color/tail_color::savefile_key + return data + /// Tail colors! /datum/preference/tri_color/tail_color diff --git a/modular_doppler/modular_items/code/invisible_gear.dm b/modular_doppler/modular_items/code/invisible_gear.dm index d8bbd40b42fb70..0f15ca763489bc 100644 --- a/modular_doppler/modular_items/code/invisible_gear.dm +++ b/modular_doppler/modular_items/code/invisible_gear.dm @@ -9,6 +9,8 @@ icon = 'modular_doppler/modular_items/icons/belts.dmi' lefthand_file = 'modular_doppler/modular_items/icons/belt_lefthand.dmi' righthand_file = 'modular_doppler/modular_items/icons/belt_righthand.dmi' + supported_bodyshapes = null + bodyshape_icon_files = null /obj/item/storage/belt/utility/invisible/Initialize(mapload) . = ..() @@ -25,7 +27,8 @@ icon = 'modular_doppler/modular_items/icons/belts.dmi' lefthand_file = 'modular_doppler/modular_items/icons/belt_lefthand.dmi' righthand_file = 'modular_doppler/modular_items/icons/belt_righthand.dmi' - + supported_bodyshapes = null + bodyshape_icon_files = null /obj/item/storage/belt/medical/invisible/Initialize(mapload) . = ..() diff --git a/modular_doppler/modular_quirks/oversized/oversized.dm b/modular_doppler/modular_quirks/oversized/oversized.dm index 549c70676a6b7c..3f244e549ff0e6 100644 --- a/modular_doppler/modular_quirks/oversized/oversized.dm +++ b/modular_doppler/modular_quirks/oversized/oversized.dm @@ -116,6 +116,11 @@ gained.name = "oversized " + gained.name +/datum/quirk/oversized/is_species_appropriate(datum/species/mob_species) + if(mob_species == /datum/species/teshari) + return FALSE + return ..() + /datum/movespeed_modifier/oversized multiplicative_slowdown = OVERSIZED_SPEED_SLOWDOWN diff --git a/modular_doppler/modular_quirks/undersized/undersized.dm b/modular_doppler/modular_quirks/undersized/undersized.dm index 9dd66d0e377173..684cf6fc14148b 100644 --- a/modular_doppler/modular_quirks/undersized/undersized.dm +++ b/modular_doppler/modular_quirks/undersized/undersized.dm @@ -134,6 +134,11 @@ gained.name = "Tiny " + gained.name +/datum/quirk/undersized/is_species_appropriate(datum/species/mob_species) + if(mob_species == /datum/species/teshari) + return FALSE + return ..() + /datum/movespeed_modifier/undersized multiplicative_slowdown = UNDERSIZED_SPEED_SLOWDOWN diff --git a/modular_doppler/modular_species/_species.dm b/modular_doppler/modular_species/_species.dm index 6b6762927a1fa1..bc05dd09362154 100644 --- a/modular_doppler/modular_species/_species.dm +++ b/modular_doppler/modular_species/_species.dm @@ -159,3 +159,12 @@ if(.) if(dna && dna.species) dna.species.spec_revival(src) + +/** + * Determines if we're allowed to regenerate a mutant appearance/organ associated with the feature key. + * By default, returns FALSE if we cant have mutant organs. + */ +/datum/species/proc/can_regenerate_mutant_feature(feature_key) + if (type in GLOB.species_blacklist_no_mutant) + return FALSE + return TRUE diff --git a/modular_doppler/modular_species/autogen_clothing.dm b/modular_doppler/modular_species/autogen_clothing.dm new file mode 100644 index 00000000000000..fe660f3c6bf92c --- /dev/null +++ b/modular_doppler/modular_species/autogen_clothing.dm @@ -0,0 +1,174 @@ +GLOBAL_LIST_EMPTY(bodyshape_autogen_clothing_cache) + +/obj/item + /// Assoc list of (BODYSHAPE_X (Stringified) -> /datum/greyscale_config). Used for generating autogenerated clothing on non-standard species. + var/list/autogen_clothing_config + /// [autogen_clothing_config], but used when the item is 1. a uniform and 2. does not cover the legs. + var/list/autogen_clothing_config_skirt + /// List of lists in format: (X, Y) coordinates. When an autogen clothing is made, these are the coordinates on the base sprite that will be used + /// to determine the color of the created sprite. + /// Add multiple entries if the target sprite template uses multiple colors. + var/list/autogen_clothing_color_coords = null + +/** + * Modularly get the bodyshape's fallback greyscale config. + * Only used if you use generate_autogen_worn_icon() + * + * Args: + * * bodyshape: The stringified bodyshape we are considering. + */ +/obj/item/proc/get_autogen_worn_config(bodyshape_text) + RETURN_TYPE(/datum/greyscale_config) + + return autogen_clothing_config?[bodyshape_text] + +/obj/item/clothing/under/get_autogen_worn_config(bodyshape_text) + . = ..() + + if ((body_parts_covered & LEGS) || isnull(autogen_clothing_config_skirt)) + return + + return autogen_clothing_config_skirt[bodyshape_text] + +/obj/item/proc/use_autogen_worn_icon_cached() + LAZYINITLIST(GLOB.bodyshape_autogen_clothing_cache[type]) + +/obj/item/proc/get_matching_bodyshape(mob/living/carbon/human/wearer) + for (var/shape in autogen_clothing_config) + if (shape == BODYSHAPE_HUMANOID_T) // EVERYTHING has this + continue + if (!(wearer.bodyshape & text2num(shape))) + continue + return shape + +/** + * Read from freely usable cache of generated icons. + * Arguments: + * * file_to_use: icon you're substituting + * * state_to_use: icon state you're substituting + * * meta: string containing other info. + */ +/obj/item/proc/get_autogen_worn_icon_cached(file_to_use, state_to_use, meta) + RETURN_TYPE(/icon) + + return GLOB.bodyshape_autogen_clothing_cache[type]["[file_to_use]-[state_to_use]-[meta]"] + +/** + * Write to a freely usable cache of generated icons. + * Arguments: + * * file_to_use: icon you're substituting + * * state_to_use: icon state you're substituting + * * meta: string containing other info. + * * cached_value: Cached value + */ +/obj/item/proc/set_autogen_worn_icon_cached(file_to_use, state_to_use, meta, icon/cached_value) + GLOB.bodyshape_autogen_clothing_cache[type]["[file_to_use]-[state_to_use]-[meta]"] = cached_value + +/** + * Generate a fallback worn icon, if the item supports it. + * Arguments: + * * bodyshape_text: The bodyshape we are generating for. + * + * Returns: + * * A /icon, or null, if no sprite could be generated. + */ +/obj/item/proc/generate_autogen_worn_icon(bodyshape_text, item_slot) + RETURN_TYPE(/icon) + + var/icon/human_icon = worn_icon || icon + var/human_icon_state = worn_icon_state || icon_state + + // First, let's just check if we've already made this. + use_autogen_worn_icon_cached() + var/icon/cached_icon = get_autogen_worn_icon_cached(human_icon, human_icon_state, greyscale_colors || "x") + if(cached_icon) + if(!(human_icon_state in icon_states(cached_icon))) + cached_icon.Insert(cached_icon, icon_state = human_icon_state) // include the expected icon_state + return cached_icon + + // Get GAGs config + var/fallback_config = get_autogen_worn_config(bodyshape_text) + if(!fallback_config) + return null + + // The GAGs config needs this many colors. + var/expected_num_colors = SSgreyscale.configurations["[fallback_config]"].expected_colors + // The colors string. + var/fallback_greyscale_colors + + // If this outfit is already GAGs, use the existing colors. + if(greyscale_colors) + // Just use the colors already given to us, but re-align to expected colors. + var/list/colors = SSgreyscale.ParseColorString(greyscale_colors) + var/default_color = (length(colors) >= 1) ? colors[1] : COLOR_DARK + var/list/final_list = list() + for(var/i in 1 to expected_num_colors) + final_list += (i < length(colors)) ? colors[i] : default_color + fallback_greyscale_colors = final_list.Join("") + else + // OK, we have to actually guess the colors. + var/icon/final_human_icon = icon(human_icon, human_icon_state) + var/list/color_list = list() + + for(var/i in 1 to expected_num_colors) + if(isnull(autogen_clothing_color_coords) || \ + length(autogen_clothing_color_coords) < i) + color_list += COLOR_DARK + continue + var/coord = autogen_clothing_color_coords[i] + color_list += final_human_icon.GetPixel(coord[1], coord[2]) || COLOR_DARK + + fallback_greyscale_colors = color_list.Join("") + + // Finally, render with GAGs + var/icon/final_icon = icon(SSgreyscale.GetColoredIconByType(get_autogen_worn_config(bodyshape_text), fallback_greyscale_colors)) + // Duplicate to the specific icon_state and set. + final_icon.Insert(final_icon, icon_state = human_icon_state) // include the expected icon_state + // Cache the clean copy. + set_autogen_worn_icon_cached(human_icon, human_icon_state, greyscale_colors || "x", final_icon) + + var/mob/living/carbon/wearer = null + if (iscarbon(loc)) + wearer = loc + final_icon = do_bodyshape_modifiers(final_icon, bodyshape_text, wearer?.bodyshape, item_slot) + + return final_icon + +/** + * Modifies the autogenerated sprite, final_icon, by [bodyshape_text] and the bodyshapes found in [all_bodyshapes]. Used for making autogenerated sprites + * fit better. + * + * Args: + * * icon/final_icon: The icon to be modified. + * * bodyshape_text: The stringified bodyshape this autogenerated sprite was created for. + * * all_bodyshapes: The bitfield of the wearer's bodyshapes. + * * item_slot: The item slot the icon was generated for. + */ +/obj/item/proc/do_bodyshape_modifiers(icon/final_icon, bodyshape_text, all_bodyshapes, item_slot) + if (bodyshape_text == BODYSHAPE_SNOUTED_T && (all_bodyshapes & BODYSHAPE_TESHARI)) + if ((item_slot == OFFSET_FACEMASK || item_slot == OFFSET_HEAD) && (supported_bodyshapes & BODYSHAPE_SNOUTED)) + if (!ishuman(loc)) + return final_icon + var/human_icon = bodyshape_icon_files[BODYSHAPE_SNOUTED_T] + var/human_icon_state = worn_icon_state || icon_state + + // Did the snout variation flag lie to us? + if(!icon_exists(human_icon, human_icon_state)) + return + + // Use already resolved icon + use_autogen_worn_icon_cached() + var/icon/cached_icon = get_autogen_worn_icon_cached(human_icon, human_icon_state, "m") + if(cached_icon) + return cached_icon + + // Generate muzzled icon + var/icon/new_icon = icon('icons/blanks/32x32.dmi', "nothing") + new_icon.Blend(icon(human_icon, human_icon_state), ICON_OVERLAY) + new_icon.Insert(new_icon, human_icon_state) + set_autogen_worn_icon_cached(human_icon, human_icon_state, "m", new_icon) + + return new_icon + + return final_icon + diff --git a/modular_doppler/modular_species/species_types/teshari/gags_configs.dm b/modular_doppler/modular_species/species_types/teshari/gags_configs.dm new file mode 100644 index 00000000000000..5344026f148973 --- /dev/null +++ b/modular_doppler/modular_species/species_types/teshari/gags_configs.dm @@ -0,0 +1,140 @@ +/datum/greyscale_config/teshari + name = "Teshari Clothing" + icon_file = 'modular_doppler/modular_cosmetics/GAGS/icons/teshari_fallbacks.dmi' + json_config = 'modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/under.json' + +/datum/greyscale_config/teshari/under + name = "Teshari Under" + json_config = 'modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/under.json' + +/datum/greyscale_config/teshari/under_skirt + name = "Teshari Skirt" + json_config = 'modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/under_skirt.json' + +/datum/greyscale_config/teshari/shoes + name = "Teshari Shoes" + json_config = 'modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/shoes.json' + +/datum/greyscale_config/teshari/gloves + name = "Teshari Gloves" + json_config = 'modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/gloves.json' + +/datum/greyscale_config/teshari/glasses + name = "Teshari Glasses" + json_config = 'modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/glasses.json' + +/datum/greyscale_config/teshari/coat + name = "Teshari Coat" + json_config = 'modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/coat.json' + +/datum/greyscale_config/teshari/thickrobe + name = "Teshari Thick Robe" + json_config = 'modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/thickrobe.json' + +/datum/greyscale_config/teshari/thickrobe/wiz + name = "Teshari Wizard Robe" + json_config = 'modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/wizrobe.json' + +/datum/greyscale_config/teshari/thickrobe/jacket + name = "Teshari Jacket" + json_config = 'modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/jacket.json' + +/datum/greyscale_config/teshari/thickrobe/longcoat + name = "Teshari Longcoat" + json_config = 'modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/longcoat.json' + +/datum/greyscale_config/teshari/armor + name = "Teshari Armor" + json_config = 'modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/armor.json' + +/datum/greyscale_config/teshari/backpack + name = "Teshari Backpack" + json_config = 'modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/backpack.json' + +/datum/greyscale_config/teshari/spacesuit + name = "Teshari Spacesuit" + json_config = 'modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/spacesuit.json' + +/datum/greyscale_config/teshari/cloak + name = "Teshari Cloak" + json_config = 'modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/cloak.json' + +/datum/greyscale_config/teshari/mantle + name = "Teshari Mantle" + json_config = 'modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/mantle.json' + +/datum/greyscale_config/teshari/tie + name = "Teshari Tie" + json_config = 'modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/tie.json' + +/datum/greyscale_config/teshari/scarf + name = "Teshari Scarf" + json_config = 'modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/scarf.json' + +/datum/greyscale_config/teshari/modcontrol + name = "Teshari Modsuit" + json_config = 'modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/modcontrol.json' + +/datum/greyscale_config/teshari/hardsuit + name = "Teshari Hardsuit" + json_config = 'modular_doppler/modular_cosmetics/GAGS/json_configs/teshari_fallbacks/hardsuit.json' + +/datum/greyscale_config/jumpsuit/worn/teshari + name = "Jumpsuit (Worn, Teshari)" + icon_file = 'modular_doppler/modular_cosmetics/GAGS/icons/jumpsuit_teshari.dmi' + +/datum/greyscale_config/jumpsuit/prison/worn/teshari + name = "Prison Jumpsuit (Worn, Teshari)" + icon_file = 'modular_doppler/modular_cosmetics/GAGS/icons/jumpsuit_teshari.dmi' + +/datum/greyscale_config/sneakers/worn/teshari + name = "Sneakers (Worn, Teshari)" + icon_file = 'modular_doppler/modular_cosmetics/GAGS/icons/sneakers_teshari.dmi' + +/datum/greyscale_config/sneakers_orange/worn/teshari + name = "Orange Sneakers (Worn, Teshari)" + icon_file = 'modular_doppler/modular_cosmetics/GAGS/icons/sneakers_teshari.dmi' + +/datum/greyscale_config/boots/worn/teshari + json_config = 'modular_doppler/modular_cosmetics/GAGS/json_configs/shoes/boots_teshari.json' + icon_file = 'modular_doppler/modular_cosmetics/GAGS/icons/shoes_teshari.dmi' + +/datum/greyscale_config/plaidskirt/worn/teshari + name = "Plaid Skirt (Worn, Teshari)" + icon_file = 'modular_doppler/modular_cosmetics/GAGS/icons/dressteshari.dmi' + +/datum/greyscale_config/sundress/worn/teshari + name = "Sundress (Worn, Teshari)" + icon_file = 'modular_doppler/modular_cosmetics/GAGS/icons/dressteshari.dmi' + +/datum/greyscale_config/suspenders/worn/teshari + icon_file = 'modular_doppler/modular_cosmetics/GAGS/icons/suit_teshari.dmi' + +/datum/greyscale_config/labcoat/worn/teshari + name = "Labcoat (Worn, Teshari)" + icon_file = 'modular_doppler/modular_cosmetics/GAGS/icons/labcoat_teshari.dmi' + +/datum/greyscale_config/apron/worn/teshari + icon_file = 'modular_doppler/modular_cosmetics/GAGS/icons/suit_teshari.dmi' + +/datum/greyscale_config/scarf/worn/teshari + name = "Scarf (Worn, Teshari)" + icon_file = 'modular_doppler/modular_cosmetics/GAGS/icons/neck_teshari.dmi' + +/datum/greyscale_config/mantle/worn/teshari + icon_file = 'modular_doppler/modular_cosmetics/GAGS/icons/neck_teshari.dmi' + +/datum/greyscale_config/ranger_poncho/worn/teshari + name = "Ranger Poncho (Worn, Teshari)" + icon_file = 'modular_doppler/modular_cosmetics/GAGS/icons/ranger_poncho_teshari.dmi' + +/datum/greyscale_config/standalone_hood/worn/teshari + icon_file = 'modular_doppler/modular_cosmetics/GAGS/icons/head_teshari.dmi' + +/datum/greyscale_config/beret_badge/worn/teshari + name = "Badged Beret (Worn, Teshari)" + icon_file = 'modular_doppler/modular_cosmetics/GAGS/icons/beret_teshari.dmi' + +/datum/greyscale_config/beret/worn/teshari + name = "Beret (Worn, Teshari)" + icon_file = 'modular_doppler/modular_cosmetics/GAGS/icons/beret_teshari.dmi' diff --git a/modular_doppler/modular_species/species_types/teshari/icons/abilities/actions.dmi b/modular_doppler/modular_species/species_types/teshari/icons/abilities/actions.dmi new file mode 100644 index 00000000000000..fa3f51ac9c1f9e Binary files /dev/null and b/modular_doppler/modular_species/species_types/teshari/icons/abilities/actions.dmi differ diff --git a/modular_doppler/modular_species/species_types/teshari/icons/augments_teshari.dmi b/modular_doppler/modular_species/species_types/teshari/icons/augments_teshari.dmi new file mode 100644 index 00000000000000..8dac33f5889f2a Binary files /dev/null and b/modular_doppler/modular_species/species_types/teshari/icons/augments_teshari.dmi differ diff --git a/modular_doppler/modular_species/species_types/teshari/icons/clothing/accessories.dmi b/modular_doppler/modular_species/species_types/teshari/icons/clothing/accessories.dmi new file mode 100644 index 00000000000000..0f299e4d3beff3 Binary files /dev/null and b/modular_doppler/modular_species/species_types/teshari/icons/clothing/accessories.dmi differ diff --git a/modular_doppler/modular_species/species_types/teshari/icons/clothing/back.dmi b/modular_doppler/modular_species/species_types/teshari/icons/clothing/back.dmi new file mode 100644 index 00000000000000..3c049a590f7ee5 Binary files /dev/null and b/modular_doppler/modular_species/species_types/teshari/icons/clothing/back.dmi differ diff --git a/modular_doppler/modular_species/species_types/teshari/icons/clothing/belt.dmi b/modular_doppler/modular_species/species_types/teshari/icons/clothing/belt.dmi new file mode 100644 index 00000000000000..02ed9bf8514a61 Binary files /dev/null and b/modular_doppler/modular_species/species_types/teshari/icons/clothing/belt.dmi differ diff --git a/modular_doppler/modular_species/species_types/teshari/icons/clothing/ears.dmi b/modular_doppler/modular_species/species_types/teshari/icons/clothing/ears.dmi new file mode 100644 index 00000000000000..0d7426088718bf Binary files /dev/null and b/modular_doppler/modular_species/species_types/teshari/icons/clothing/ears.dmi differ diff --git a/modular_doppler/modular_species/species_types/teshari/icons/clothing/eyes.dmi b/modular_doppler/modular_species/species_types/teshari/icons/clothing/eyes.dmi new file mode 100644 index 00000000000000..4868ae09f72682 Binary files /dev/null and b/modular_doppler/modular_species/species_types/teshari/icons/clothing/eyes.dmi differ diff --git a/modular_doppler/modular_species/species_types/teshari/icons/clothing/feet.dmi b/modular_doppler/modular_species/species_types/teshari/icons/clothing/feet.dmi new file mode 100644 index 00000000000000..53a2f1f70e9256 Binary files /dev/null and b/modular_doppler/modular_species/species_types/teshari/icons/clothing/feet.dmi differ diff --git a/modular_doppler/modular_species/species_types/teshari/icons/clothing/feet_64.dmi b/modular_doppler/modular_species/species_types/teshari/icons/clothing/feet_64.dmi new file mode 100644 index 00000000000000..72d7453676073c Binary files /dev/null and b/modular_doppler/modular_species/species_types/teshari/icons/clothing/feet_64.dmi differ diff --git a/modular_doppler/modular_species/species_types/teshari/icons/clothing/hands.dmi b/modular_doppler/modular_species/species_types/teshari/icons/clothing/hands.dmi new file mode 100644 index 00000000000000..885c3895fa5cf3 Binary files /dev/null and b/modular_doppler/modular_species/species_types/teshari/icons/clothing/hands.dmi differ diff --git a/modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi b/modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi new file mode 100644 index 00000000000000..704d99f04291ec Binary files /dev/null and b/modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi differ diff --git a/modular_doppler/modular_species/species_types/teshari/icons/clothing/mask.dmi b/modular_doppler/modular_species/species_types/teshari/icons/clothing/mask.dmi new file mode 100644 index 00000000000000..b3e9575b1236d2 Binary files /dev/null and b/modular_doppler/modular_species/species_types/teshari/icons/clothing/mask.dmi differ diff --git a/modular_doppler/modular_species/species_types/teshari/icons/clothing/neck.dmi b/modular_doppler/modular_species/species_types/teshari/icons/clothing/neck.dmi new file mode 100644 index 00000000000000..065e2550b8a085 Binary files /dev/null and b/modular_doppler/modular_species/species_types/teshari/icons/clothing/neck.dmi differ diff --git a/modular_doppler/modular_species/species_types/teshari/icons/clothing/suit.dmi b/modular_doppler/modular_species/species_types/teshari/icons/clothing/suit.dmi new file mode 100644 index 00000000000000..7e74a48e208b98 Binary files /dev/null and b/modular_doppler/modular_species/species_types/teshari/icons/clothing/suit.dmi differ diff --git a/modular_doppler/modular_species/species_types/teshari/icons/clothing/uniform.dmi b/modular_doppler/modular_species/species_types/teshari/icons/clothing/uniform.dmi new file mode 100644 index 00000000000000..1c4c6585ab2cc9 Binary files /dev/null and b/modular_doppler/modular_species/species_types/teshari/icons/clothing/uniform.dmi differ diff --git a/modular_doppler/modular_species/species_types/teshari/icons/teshari_eyes.dmi b/modular_doppler/modular_species/species_types/teshari/icons/teshari_eyes.dmi new file mode 100644 index 00000000000000..2fc092c7de7338 Binary files /dev/null and b/modular_doppler/modular_species/species_types/teshari/icons/teshari_eyes.dmi differ diff --git a/modular_doppler/modular_species/species_types/teshari/icons/teshari_parts_greyscale.dmi b/modular_doppler/modular_species/species_types/teshari/icons/teshari_parts_greyscale.dmi new file mode 100644 index 00000000000000..8bcfd9c2aaeca9 Binary files /dev/null and b/modular_doppler/modular_species/species_types/teshari/icons/teshari_parts_greyscale.dmi differ diff --git a/modular_doppler/modular_species/species_types/teshari/prosthetics/mechfabricator_designs.dm b/modular_doppler/modular_species/species_types/teshari/prosthetics/mechfabricator_designs.dm new file mode 100644 index 00000000000000..b5f4433ef78762 --- /dev/null +++ b/modular_doppler/modular_species/species_types/teshari/prosthetics/mechfabricator_designs.dm @@ -0,0 +1,73 @@ +//adding teshari silicon stuff to the mechfabricator + +#define RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL "/Raptoral" +#define RND_SUBCATEGORY_CYBERNETICS_ADVANCED_RAPTORAL "/Advanced Raptoral Limbs" + +/datum/design/teshari_cyber_chest + name = "Raptoral Cybernetic Torso" + id = "teshari_cyber_chest" + build_type = MECHFAB + build_path = /obj/item/bodypart/chest/robot/android/teshari + materials = list(/datum/material/iron= SHEET_MATERIAL_AMOUNT * 18) + construction_time = 30 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL, + ) + +/datum/design/teshari_cyber_head + name = "Raptoral Cybernetic Head" + id = "teshari_cyber_head" + build_type = MECHFAB + build_path = /obj/item/bodypart/head/robot/android/teshari + materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 2) + construction_time = 30 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL, + ) + +/datum/design/teshari_cyber_l_arm + name = "Raptoral Cybernetic Left Forelimb" + id = "teshari_cyber_l_arm" + build_type = MECHFAB + build_path = /obj/item/bodypart/arm/left/robot/android/teshari + materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 4) + construction_time = 18 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL, + ) + +/datum/design/teshari_cyber_r_arm + name = "Raptoral Cybernetic Right Forelimb" + id = "teshari_cyber_r_arm" + build_type = MECHFAB + build_path = /obj/item/bodypart/arm/right/robot/android/teshari + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 4) + construction_time = 18 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL, + ) + +/datum/design/teshari_cyber_l_leg + name = "Raptoral Cybernetic Left Hindlimb" + id = "teshari_cyber_l_leg" + build_type = MECHFAB + build_path = /obj/item/bodypart/leg/left/robot/android/teshari + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 4) + construction_time = 18 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL, + ) + +/datum/design/teshari_cyber_r_leg + name = "Raptoral Cybernetic Right Hindlimb" + id = "teshari_cyber_r_leg" + build_type = MECHFAB + build_path = /obj/item/bodypart/leg/right/robot/android/teshari + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 4) + construction_time = 18 SECONDS + category = list( + RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL, + ) + +#undef RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL +#undef RND_SUBCATEGORY_CYBERNETICS_ADVANCED_RAPTORAL diff --git a/modular_doppler/modular_species/species_types/teshari/prosthetics/robot_bodyparts.dm b/modular_doppler/modular_species/species_types/teshari/prosthetics/robot_bodyparts.dm new file mode 100644 index 00000000000000..843bc6bb9ff31a --- /dev/null +++ b/modular_doppler/modular_species/species_types/teshari/prosthetics/robot_bodyparts.dm @@ -0,0 +1,116 @@ +#define ROBOTIC_LIGHT_BRUTE_MSG "marred" +#define ROBOTIC_MEDIUM_BRUTE_MSG "dented" +#define ROBOTIC_HEAVY_BRUTE_MSG "falling apart" + +#define ROBOTIC_LIGHT_BURN_MSG "scorched" +#define ROBOTIC_MEDIUM_BURN_MSG "charred" +#define ROBOTIC_HEAVY_BURN_MSG "smoldering" + +//Teshari normal + +/obj/item/bodypart/arm/left/robot/android/teshari + name = "cybernetic left raptoral forelimb" + desc = "A skeletal limb wrapped in pseudomuscles and membranous feathers, with a low-conductivity case." + icon = 'modular_doppler/modular_species/species_types/teshari/icons/augments_teshari.dmi' + icon_static = 'modular_doppler/modular_species/species_types/teshari/icons/augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_TESHARI + + unarmed_damage_low = TESHARI_PUNCH_LOW + unarmed_damage_high = TESHARI_PUNCH_HIGH + + brute_modifier = TESHARI_BRUTE_MODIFIER - (1 - parent_type::brute_modifier) + burn_modifier = TESHARI_BURN_MODIFIER - (1 - parent_type::brute_modifier) + + limb_id = "teshari" + icon_state = "teshari_l_arm" + +/obj/item/bodypart/arm/right/robot/android/teshari + name = "cybernetic right raptoral forelimb" + desc = "A skeletal limb wrapped in pseudomuscles and membranous feathers, with a low-conductivity case." + icon_static = 'modular_doppler/modular_species/species_types/teshari/icons/augments_teshari.dmi' + icon = 'modular_doppler/modular_species/species_types/teshari/icons/augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_TESHARI + + unarmed_damage_low = TESHARI_PUNCH_LOW + unarmed_damage_high = TESHARI_PUNCH_HIGH + + brute_modifier = TESHARI_BRUTE_MODIFIER - (1 - parent_type::brute_modifier) + burn_modifier = TESHARI_BURN_MODIFIER - (1 - parent_type::brute_modifier) + + limb_id = "teshari" + icon_state = "teshari_r_arm" + +/obj/item/bodypart/leg/left/robot/android/teshari + name = "cybernetic left raptoral hindlimb" + desc = "A skeletal limb wrapped in pseudomuscles and membranous feathers, with a low-conductivity case." + icon_static = 'modular_doppler/modular_species/species_types/teshari/icons/augments_teshari.dmi' + icon = 'modular_doppler/modular_species/species_types/teshari/icons/augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_TESHARI + + unarmed_damage_low = TESHARI_PUNCH_LOW + unarmed_damage_high = TESHARI_PUNCH_HIGH + + brute_modifier = TESHARI_BRUTE_MODIFIER - (1 - parent_type::brute_modifier) + burn_modifier = TESHARI_BURN_MODIFIER - (1 - parent_type::brute_modifier) + speed_modifier = -0.1 + + limb_id = "teshari" + icon_state = "teshari_l_leg" + +/obj/item/bodypart/leg/right/robot/android/teshari + name = "cybernetic right raptoral hindlimb" + desc = "A skeletal limb wrapped in pseudomuscles and membranous feathers, with a low-conductivity case." + icon_static = 'modular_doppler/modular_species/species_types/teshari/icons/augments_teshari.dmi' + icon = 'modular_doppler/modular_species/species_types/teshari/icons/augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_TESHARI + + unarmed_damage_low = TESHARI_PUNCH_LOW + unarmed_damage_high = TESHARI_PUNCH_HIGH + + brute_modifier = TESHARI_BRUTE_MODIFIER - (1 - parent_type::brute_modifier) + burn_modifier = TESHARI_BURN_MODIFIER - (1 - parent_type::brute_modifier) + speed_modifier = -0.1 + + limb_id = "teshari" + icon_state = "teshari_r_leg" + +/obj/item/bodypart/chest/robot/android/teshari + name = "cybernetic raptoral torso" + desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell, covered in a layer of membranous feathers." + icon_static = 'modular_doppler/modular_species/species_types/teshari/icons/augments_teshari.dmi' + icon = 'modular_doppler/modular_species/species_types/teshari/icons/augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_TESHARI + + brute_modifier = TESHARI_BRUTE_MODIFIER - (1 - parent_type::brute_modifier) + burn_modifier = TESHARI_BURN_MODIFIER - (1 - parent_type::brute_modifier) + + robotic_emp_paralyze_damage_percent_threshold = 0.5 + + limb_id = "teshari" + icon_state = "teshari_chest" + +/obj/item/bodypart/head/robot/android/teshari + name = "cybernetic raptoral head" + desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals. A layer of membranous feathers covers the stark metal." + icon_static = 'modular_doppler/modular_species/species_types/teshari/icons/augments_teshari.dmi' + icon = 'modular_doppler/modular_species/species_types/teshari/icons/augments_teshari.dmi' + bodyshape = parent_type::bodyshape | BODYSHAPE_TESHARI + + unarmed_damage_low = TESHARI_PUNCH_LOW + unarmed_damage_high = TESHARI_PUNCH_HIGH + + brute_modifier = TESHARI_BRUTE_MODIFIER - (1 - parent_type::brute_modifier) + burn_modifier = TESHARI_BURN_MODIFIER - (1 - parent_type::brute_modifier) + + head_flags = HEAD_EYESPRITES + + limb_id = "teshari" + icon_state = "teshari_head" + +#undef ROBOTIC_LIGHT_BRUTE_MSG +#undef ROBOTIC_MEDIUM_BRUTE_MSG +#undef ROBOTIC_HEAVY_BRUTE_MSG + +#undef ROBOTIC_LIGHT_BURN_MSG +#undef ROBOTIC_MEDIUM_BURN_MSG +#undef ROBOTIC_HEAVY_BURN_MSG diff --git a/modular_doppler/modular_species/species_types/teshari/schechi.dm b/modular_doppler/modular_species/species_types/teshari/schechi.dm new file mode 100644 index 00000000000000..5ab68e4ce13609 --- /dev/null +++ b/modular_doppler/modular_species/species_types/teshari/schechi.dm @@ -0,0 +1,30 @@ +/datum/language/schechi + name = "Schechi" + desc = "The very structurally loose creole tongue of the Teshari, host to hundreds of dialects almost different enough to resemble their own languages. \ + Originally developed on Sirisai, Schechi has made its way across the Teshari diaspora as a commonly agreed upon way for entirely different packs to communicate." + key = "F" + space_chance = 40 + syllables = list( + "i", "ii", "si", "aci", "hi", "ni", "li", "schi", "tari", + "e", "she", "re", "me", "ne", "te", "se", "le", "ai", + "a", "ra", "ca", "scha", "tara", "sa", "la", "na", "ce", + "re", "se", "shi", "ti", "le", "la", "lu", "tu", "shu", + ) + icon = 'modular_doppler/languages/icons/language.dmi' + icon_state = "schechi" + default_priority = 90 + +/datum/language/schechi/get_random_name( + gender = NEUTER, + name_count = default_name_count, + syllable_min = default_name_syllable_min, + syllable_max = default_name_syllable_max, + force_use_syllables = FALSE, +) + if(force_use_syllables) + return ..() + + var/newname = "" + for(var/i in 1 to rand(2, 3)) + newname += pick(list("chi", "chu", "ka", "ki", "kyo", "ko", "la", "li", "mi", "ni", "nu", "nyu", "se", "ri", "ro", "ru", "ryu", "sa", "si", "syo")) + return capitalize(newname) diff --git a/modular_doppler/modular_species/species_types/teshari/sounds/raptorscream.ogg b/modular_doppler/modular_species/species_types/teshari/sounds/raptorscream.ogg new file mode 100644 index 00000000000000..9beb0106a3bbd2 Binary files /dev/null and b/modular_doppler/modular_species/species_types/teshari/sounds/raptorscream.ogg differ diff --git a/modular_doppler/modular_species/species_types/teshari/teshari.dm b/modular_doppler/modular_species/species_types/teshari/teshari.dm new file mode 100644 index 00000000000000..17b353c7b68cca --- /dev/null +++ b/modular_doppler/modular_species/species_types/teshari/teshari.dm @@ -0,0 +1,132 @@ +#define TESHARI_TEMP_OFFSET -10 // K, added to comfort/damage limit etc +#define TESHARI_HEATMOD 1.3 +#define TESHARI_COLDMOD 0.67 // Except cold. + +/mob/living/carbon/human/species/teshari + race = /datum/species/teshari + +/datum/species/teshari + name = "Teshari" + plural_form = "Teshari" + id = SPECIES_TESHARI + inherent_traits = list( + TRAIT_MUTANT_COLORS, + TRAIT_NO_UNDERWEAR, + TRAIT_STRONG_STOMACH + ) + mutantears = /obj/item/organ/ears/teshari + digitigrade_customization = DIGITIGRADE_NEVER + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT + payday_modifier = 1.0 + mutanttongue = /obj/item/organ/tongue/teshari + mutanteyes = /obj/item/organ/eyes/teshari + coldmod = TESHARI_COLDMOD + heatmod = TESHARI_HEATMOD + bodytemp_normal = BODYTEMP_NORMAL + TESHARI_TEMP_OFFSET + bodytemp_heat_damage_limit = (BODYTEMP_HEAT_DAMAGE_LIMIT + TESHARI_TEMP_OFFSET) + bodytemp_cold_damage_limit = (BODYTEMP_COLD_DAMAGE_LIMIT + TESHARI_TEMP_OFFSET) + species_language_holder = /datum/language_holder/teshari + bodypart_overrides = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/mutant/teshari, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/mutant/teshari, + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/mutant/teshari, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/mutant/teshari, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/mutant/teshari, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/mutant/teshari, + ) + meat = /obj/item/food/meat/slab/chicken/teshari + species_cookie = /obj/item/food/meat/slab + // species are instanced, so this is ok + /// The tablerun ability we will give to our teshari. + var/datum/action/innate/teshari_tablerun/tablerun + +/datum/language_holder/teshari + understood_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/schechi = list(LANGUAGE_ATOM) + ) + spoken_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/schechi = list(LANGUAGE_ATOM) + ) + +/datum/species/teshari/get_scream_sound(mob/living/carbon/human/human) + return 'modular_doppler/modular_species/species_types/teshari/sounds/raptorscream.ogg' + +/obj/item/organ/eyes/teshari + blink_animation = FALSE + +/obj/item/organ/tongue/teshari + liked_foodtypes = RAW | MEAT | GORE + disliked_foodtypes = GROSS | CLOTH | BUGS + toxic_foodtypes = parent_type::toxic_foodtypes | FRUIT + +/datum/species/teshari/prepare_human_for_preview(mob/living/carbon/human/tesh) + var/base_color = "#c0965f" + var/ear_color = "#e4c49b" + + tesh.dna.ear_type = TESHARI + tesh.dna.features[FEATURE_MUTANT_COLOR] = base_color + tesh.dna.features[FEATURE_EARS] = "Teshari Feathers Upright" + tesh.dna.features[FEATURE_EARS_COLORS][1] = base_color + tesh.dna.features[FEATURE_EARS_COLORS][2] = ear_color + regenerate_organs(tesh, src, visual_only = TRUE) + tesh.update_body(TRUE) + +/datum/species/teshari/on_species_gain(mob/living/carbon/human/new_teshari, datum/species/old_species, pref_load, regenerate_icons) + new_teshari.dna.ear_type = TESHARI + . = ..() + tablerun = new /datum/action/innate/teshari_tablerun() + tablerun.Grant(new_teshari) + +/datum/species/teshari/on_species_loss(mob/living/carbon/C, datum/species/new_species, pref_load) + . = ..() + QDEL_NULL(tablerun) + +/datum/species/teshari/create_pref_unique_perks() + var/list/perk_descriptions = list() + + perk_descriptions += list(list( + SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, + SPECIES_PERK_ICON = FA_ICON_EAR_LISTEN, + SPECIES_PERK_NAME = "Sensitive Hearing", + SPECIES_PERK_DESC = "Your ears are extremely sensitive, and can hear whispers. Unfortunately, this also increases ear damage taken..." + )) + perk_descriptions += list(list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = FA_ICON_BIOHAZARD, + SPECIES_PERK_NAME = "Carrion Eater", + SPECIES_PERK_DESC = "Your biology is well suited to eating stale food. You don't get disgusted, nor get diseases, from eating old or rotting food." + )) + perk_descriptions += list(list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = FA_ICON_RUNNING, + SPECIES_PERK_NAME = "Tablerunning", + SPECIES_PERK_DESC = "A being of extreme agility, you can jump on tables just by running into them!" + )) + + return perk_descriptions + +/datum/species/teshari/get_species_description() + return "Short of stature, full of heart, the Teshari race has recently entered the galactic stage after a cataclysmic event wrecked their homeworld Sirisai. \ + Having - somewhat - bounced back, these agile avians are slowly spreading throughout all of space, bringing their death-worship and 'interesting' cuisine (read: carrion) with them." + +/datum/species/teshari/get_species_lore() + var/static/desc = list( + "A race of feathered, carnivous scavengers, the Teshari descend from the tundra moon Sirisai IV, in orbit around the much larger Sirisai Prime - a gas giant often revered and feared as a portal to the underworld. \ + Teshari are a tribal, scattered people. Making do with scavenged and reverse-engineered technology, the Teshari roam their ruined homeworld to recover their dead, find treasures, and find a new future.", + "Teshari consider their dead sacred. In order for a soul to be \"light\", the body which houses it must be well kept. Burning a corpse is to damn a Teshari - keeping their bones, embroidering them, preserving their corpse - all ways to make a soul lighter. \ + Some Teshari are even made into meals to be consumed by their tribemates, their lovers, their friends - such an act is extremely meaningful in Teshari culture, even if outside observers are often reviled by it.", + "", + "Much of Teshari history is formed, and lost, by and due to the event termed the \"Cataclysm\". Two hundred years ago, what is now understood as stray ordnance from a long-ended war struck the planet, destroying its ecosystem and \ + plunging its inhabitants into a dark age. Its colonies withered and died, many taken over by the Tiziran clan Talunan, while the planet itself was left to recover, with its massively dwindled population.", + "It is not certain if Teshari were always so self-sufficient, so obsessed with death and rememberence, but it is clear that the cataclysm boosted these ideologies massively. \ + Now, in the modern day, Teshari are seen as eerie, strange, and in violation of more than a few social norms. Yet, they find their place, as difficult as it may be sometimes." + ) + + return desc + +/datum/species/teshari/can_regenerate_mutant_feature(feature_key) + if (feature_key == FEATURE_EARS || feature_key == FEATURE_TAIL_OTHER) + return TRUE + return ..() diff --git a/modular_doppler/modular_species/species_types/teshari/teshari_bodyparts.dm b/modular_doppler/modular_species/species_types/teshari/teshari_bodyparts.dm new file mode 100644 index 00000000000000..80876512a5565a --- /dev/null +++ b/modular_doppler/modular_species/species_types/teshari/teshari_bodyparts.dm @@ -0,0 +1,115 @@ +/obj/item/bodypart/head/mutant/teshari + icon_greyscale = BODYPART_ICON_TESHARI + bodyshape = parent_type::bodyshape | BODYSHAPE_TESHARI + eyes_icon = 'modular_doppler/modular_species/species_types/teshari/icons/teshari_eyes.dmi' + limb_id = SPECIES_TESHARI + brute_modifier = TESHARI_BRUTE_MODIFIER + burn_modifier = TESHARI_BURN_MODIFIER + head_flags = HEAD_EYESPRITES|HEAD_EYECOLOR|HEAD_EYEHOLES|HEAD_DEBRAIN + +/obj/item/bodypart/head/mutant/teshari/Initialize(mapload) + worn_ears_offset = new( + attached_part = src, + feature_key = OFFSET_EARS, + offset_y = list("north" = -4, "south" = -4, "east" = -4, "west" = -4), + ) + worn_head_offset = new( + attached_part = src, + feature_key = OFFSET_HEAD, + offset_x = list("north" = 1, "south" = 1, "east" = 1, "west" = -1, "northwest" = -1, "southwest" = -1, "northeast" = 1, "southeast" = 1), + offset_y = list("north" = -4, "south" = -4, "east" = -4, "west" = -4), + ) + worn_mask_offset = new( + attached_part = src, + feature_key = OFFSET_FACEMASK, + offset_y = list("north" = -5, "south" = -5, "east" = -5, "west" = -5), + ) + return ..() + + +/obj/item/bodypart/chest/mutant/teshari + icon_greyscale = BODYPART_ICON_TESHARI + bodyshape = parent_type::bodyshape | BODYSHAPE_TESHARI + limb_id = SPECIES_TESHARI + brute_modifier = TESHARI_BRUTE_MODIFIER + burn_modifier = TESHARI_BURN_MODIFIER + bodypart_traits = list(TRAIT_LIGHT_BODY) + +/obj/item/bodypart/chest/mutant/teshari/Initialize(mapload) + worn_back_offset = new( + attached_part = src, + feature_key = OFFSET_BACK, + offset_y = list("north" = -4, "south" = -4, "east" = -4, "west" = -4), + ) + worn_accessory_offset = new( + attached_part = src, + feature_key = OFFSET_ACCESSORY, + offset_y = list("north" = -4, "south" = -4, "east" = -4, "west" = -4), + ) + return ..() + +/obj/item/bodypart/arm/left/mutant/teshari/Initialize(mapload) + held_hand_offset = new( + attached_part = src, + feature_key = OFFSET_HELD, + offset_x = list("north" = 0, "south" = 0, "east" = 0, "west" = -6, "northwest" = -6, "southwest" = -6, "northeast" = 0, "southeast" = 0), + offset_y = list("north" = -3, "south" = -3, "east" = -3, "west" = -3), + ) + return ..() + +/obj/item/bodypart/arm/right/mutant/teshari/Initialize(mapload) + held_hand_offset = new( + attached_part = src, + feature_key = OFFSET_HELD, + offset_x = list("north" = 0, "south" = 0, "east" = 6, "west" = 0, "northwest" = 0, "southwest" = 0, "northeast" = 6, "southeast" = 6), + offset_y = list("north" = -3, "south" = -3, "east" = -3, "west" = -3), + ) + return ..() + +/obj/item/bodypart/arm/left/mutant/teshari + icon_greyscale = BODYPART_ICON_TESHARI + bodyshape = parent_type::bodyshape | BODYSHAPE_TESHARI + limb_id = SPECIES_TESHARI + unarmed_damage_low = TESHARI_PUNCH_LOW + unarmed_damage_high = TESHARI_PUNCH_HIGH + brute_modifier = TESHARI_BRUTE_MODIFIER + burn_modifier = TESHARI_BURN_MODIFIER + + +/obj/item/bodypart/arm/right/mutant/teshari + icon_greyscale = BODYPART_ICON_TESHARI + bodyshape = parent_type::bodyshape | BODYSHAPE_TESHARI + limb_id = SPECIES_TESHARI + unarmed_damage_low = TESHARI_PUNCH_LOW + unarmed_damage_high = TESHARI_PUNCH_HIGH + brute_modifier = TESHARI_BRUTE_MODIFIER + burn_modifier = TESHARI_BURN_MODIFIER + + +/obj/item/bodypart/leg/left/mutant/teshari + icon_greyscale = BODYPART_ICON_TESHARI + bodyshape = parent_type::bodyshape | BODYSHAPE_TESHARI + limb_id = SPECIES_TESHARI + brute_modifier = TESHARI_BRUTE_MODIFIER + burn_modifier = TESHARI_BURN_MODIFIER + +/obj/item/bodypart/leg/right/mutant/teshari + icon_greyscale = BODYPART_ICON_TESHARI + bodyshape = parent_type::bodyshape | BODYSHAPE_TESHARI + limb_id = SPECIES_TESHARI + brute_modifier = TESHARI_BRUTE_MODIFIER + burn_modifier = TESHARI_BURN_MODIFIER + +/obj/item/bodypart/leg/left/digitigrade/teshari + icon_greyscale = BODYPART_ICON_TESHARI + bodyshape = parent_type::bodyshape | BODYSHAPE_TESHARI + brute_modifier = TESHARI_BRUTE_MODIFIER + burn_modifier = TESHARI_BURN_MODIFIER + speed_modifier = -0.1 + +/obj/item/bodypart/leg/right/digitigrade/teshari + icon_greyscale = BODYPART_ICON_TESHARI + bodyshape = parent_type::bodyshape | BODYSHAPE_TESHARI + brute_modifier = TESHARI_BRUTE_MODIFIER + burn_modifier = TESHARI_BURN_MODIFIER + speed_modifier = -0.1 diff --git a/modular_doppler/modular_species/species_types/teshari/teshari_clothes.dm b/modular_doppler/modular_species/species_types/teshari/teshari_clothes.dm new file mode 100644 index 00000000000000..bc56990a6159bf --- /dev/null +++ b/modular_doppler/modular_species/species_types/teshari/teshari_clothes.dm @@ -0,0 +1,785 @@ +// For defining teshari autogen sprite variables on TG clothes. Use your own doppler definition for doppler-made clothing. + +/obj/item/storage/backpack + autogen_clothing_color_coords = list(list(BACK_COLORPIXEL_X_1, BACK_COLORPIXEL_Y_1)) + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/teshari/backpack) + +/obj/item/clothing/glasses + autogen_clothing_color_coords = list(list(GLASSES_COLORPIXEL_X_1, GLASSES_COLORPIXEL_Y_1), list(GLASSES_COLORPIXEL_X_2, GLASSES_COLORPIXEL_Y_2)) + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/teshari/glasses) + +/obj/item/clothing/gloves + autogen_clothing_color_coords = list(list(GLOVES_COLORPIXEL_X_1, GLOVES_COLORPIXEL_Y_1)) + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/teshari/gloves) + +/obj/item/clothing/neck + autogen_clothing_color_coords = list(list(SCARF_COLORPIXEL_X_1, SCARF_COLORPIXEL_Y_1)) + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/teshari/scarf) + +/obj/item/clothing/neck/cloak + autogen_clothing_color_coords = list(list(CLOAK_COLORPIXEL_X_1, CLOAK_COLORPIXEL_Y_1), list(CLOAK_COLORPIXEL_X_2, CLOAK_COLORPIXEL_Y_2)) + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/teshari/cloak) + +/obj/item/clothing/neck/mantle + autogen_clothing_color_coords = list(list(MANTLE_COLORPIXEL_X_1, MANTLE_COLORPIXEL_Y_1), list(MANTLE_COLORPIXEL_X_2, MANTLE_COLORPIXEL_Y_2)) + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/teshari/mantle) + +/obj/item/clothing/neck/tie + autogen_clothing_color_coords = list(list(TIE_COLORPIXEL_X_1, TIE_COLORPIXEL_Y_1)) + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/teshari/tie) + +/obj/item/clothing/shoes + autogen_clothing_color_coords = list(list(SHOES_COLORPIXEL_X_1, SHOES_COLORPIXEL_Y_1)) + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/teshari/shoes) + +/obj/item/clothing/suit + autogen_clothing_color_coords = list(list(COAT_COLORPIXEL_X_1, COAT_COLORPIXEL_Y_1)) + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/teshari/coat) + +/obj/item/clothing/suit/wizrobe + autogen_clothing_color_coords = list(list(THICKROBE_COLORPIXEL_X_1, THICKROBE_COLORPIXEL_Y_1), list(THICKROBE_COLORPIXEL_X_2, THICKROBE_COLORPIXEL_Y_2), list(THICKROBE_COLORPIXEL_X_3, THICKROBE_COLORPIXEL_Y_3), list(THICKROBE_COLORPIXEL_X_4, THICKROBE_COLORPIXEL_Y_4), list(THICKROBE_COLORPIXEL_X_5, THICKROBE_COLORPIXEL_Y_5), list(THICKROBE_COLORPIXEL_X_6, THICKROBE_COLORPIXEL_Y_6)) + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/teshari/thickrobe/wiz) + +/obj/item/clothing/suit/jacket/trenchcoat + autogen_clothing_color_coords = list(list(LONGCOAT_COLORPIXEL_X_1, LONGCOAT_COLORPIXEL_Y_1), list(THICKROBE_COLORPIXEL_X_2, THICKROBE_COLORPIXEL_Y_2), list(THICKROBE_COLORPIXEL_X_3, THICKROBE_COLORPIXEL_Y_3), list(LONGCOAT_COLORPIXEL_X_4, LONGCOAT_COLORPIXEL_Y_4)) + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/teshari/thickrobe/longcoat) + +/obj/item/clothing/suit/jacket + autogen_clothing_color_coords = list(list(JACKET_COLORPIXEL_X_1, JACKET_COLORPIXEL_Y_1), list(JACKET_COLORPIXEL_X_2, JACKET_COLORPIXEL_Y_2), list(THICKROBE_COLORPIXEL_X_3, THICKROBE_COLORPIXEL_Y_3), list(JACKET_COLORPIXEL_X_4, JACKET_COLORPIXEL_Y_4)) + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/teshari/thickrobe/jacket) + +/obj/item/clothing/suit/armor + autogen_clothing_color_coords = list(list(ARMOR_COLORPIXEL_X_1, ARMOR_COLORPIXEL_Y_1)) + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/teshari/armor) + +/obj/item/clothing/suit/mod + autogen_clothing_color_coords = list(list(MODSUIT_COLORPIXEL_X_1, MODSUIT_COLORPIXEL_Y_1), list(MODSUIT_COLORPIXEL_X_2, MODSUIT_COLORPIXEL_Y_2), list(MODSUIT_COLORPIXEL_X_3, MODSUIT_COLORPIXEL_Y_3)) + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/teshari/hardsuit) + +/obj/item/clothing/under + autogen_clothing_color_coords = list(list(UNDER_COLORPIXEL_X_1, UNDER_COLORPIXEL_Y_1), list(UNDER_COLORPIXEL_X_2, UNDER_COLORPIXEL_Y_2), list(UNDER_COLORPIXEL_X_3, UNDER_COLORPIXEL_Y_3)) + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/teshari/under) + autogen_clothing_config_skirt = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/teshari/under_skirt) + +/obj/item/mod/control + autogen_clothing_color_coords = list(list(MODCONTROL_COLORPIXEL_X_1, MODCONTROL_COLORPIXEL_Y_1)) + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/teshari/modcontrol) + +///GAGS below here + +/obj/item/clothing/under/color + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/jumpsuit/worn/teshari) + +/obj/item/clothing/under/color/jumpskirt + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/jumpsuit/worn/teshari) + +/obj/item/clothing/shoes/sneakers + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/sneakers/worn/teshari) + +/obj/item/clothing/shoes/sneakers/orange + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/sneakers_orange/worn/teshari) + +/obj/item/clothing/head/collectable/beret + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret/worn/teshari) + +/obj/item/clothing/head/collectable/flatcap + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret/worn/teshari) + +/obj/item/clothing/head/frenchberet + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret/worn/teshari) + +/obj/item/clothing/head/flatcap + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret/worn/teshari) + +/obj/item/clothing/head/caphat/beret + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret_badge/worn/teshari) + +/obj/item/clothing/head/beret + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret/worn/teshari) + +/obj/item/clothing/head/beret/badge + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret_badge/worn/teshari) + +/obj/item/clothing/head/hats/hos/beret + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret_badge/worn/teshari) + +/obj/item/clothing/head/beret/sec + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret_badge/worn/teshari) + +/obj/item/clothing/head/beret/science/fancy + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret_badge/worn/teshari) + +/obj/item/clothing/head/beret/science/rd + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret_badge/worn/teshari) + +/obj/item/clothing/head/beret/durathread + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret_badge/worn/teshari) + +/obj/item/clothing/head/beret/centcom_formal + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret_badge/worn/teshari) + +/obj/item/clothing/head/beret/militia + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret_badge/worn/teshari) + +/obj/item/clothing/head/beret/sec/navywarden + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret_badge/worn/teshari) + +/obj/item/clothing/head/beret/medical + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret_badge/worn/teshari) + +/obj/item/clothing/head/beret/engi + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret_badge/worn/teshari) + +/obj/item/clothing/head/beret/atmos + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret_badge/worn/teshari) + +/obj/item/clothing/head/beret/cargo/qm + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret_badge/worn/teshari) + +/obj/item/clothing/head/hopcap/beret + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret_badge/worn/teshari) + +/obj/item/clothing/head/beret/blueshield + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret_badge/worn/teshari) + +/obj/item/clothing/head/flatcap + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret/worn/teshari) + +/obj/item/clothing/head/frenchberet + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret/worn/teshari) + +/obj/item/clothing/head/beret/sec/navywarden/syndicate + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret_badge/worn/teshari) + +/obj/item/clothing/head/nanotrasen_consultant/beret + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret_badge/worn/teshari) + +/obj/item/clothing/head/beret/sec/peacekeeper/armadyne + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret_badge/worn/teshari) + +/obj/item/clothing/head/beret/sec/peacekeeper + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/beret_badge/worn/teshari) + +/obj/item/clothing/neck/ranger_poncho + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/ranger_poncho/worn/teshari) + +/obj/item/clothing/under/dress/skirt/plaid + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/plaidskirt/worn/teshari) + +/obj/item/clothing/under/dress/sundress + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/sundress/worn/teshari) + +/obj/item/clothing/neck/scarf + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/scarf/worn/teshari) + +/obj/item/clothing/suit/toggle/suspenders + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/suspenders/worn/teshari) + +// Unique clothing here + +/obj/item/clothing/suit/kimjacket + autogen_clothing_color_coords = list(list(JACKET_COLORPIXEL_X_1, JACKET_COLORPIXEL_Y_1), list(JACKET_COLORPIXEL_X_2, JACKET_COLORPIXEL_Y_2), list(THICKROBE_COLORPIXEL_X_3, THICKROBE_COLORPIXEL_Y_3), list(JACKET_COLORPIXEL_X_4, JACKET_COLORPIXEL_Y_4)) + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/teshari/thickrobe/jacket) + +/obj/item/clothing/suit/discoblazer + autogen_clothing_color_coords = list(list(JACKET_COLORPIXEL_X_1, JACKET_COLORPIXEL_Y_1), list(JACKET_COLORPIXEL_X_2, JACKET_COLORPIXEL_Y_2), list(THICKROBE_COLORPIXEL_X_3, THICKROBE_COLORPIXEL_Y_3), list(JACKET_COLORPIXEL_X_4, JACKET_COLORPIXEL_Y_4)) + autogen_clothing_config = list(BODYSHAPE_TESHARI_T = /datum/greyscale_config/teshari/thickrobe/jacket) + +// Wintercoats and Satchels and stuff + +// unfortunately the basetype backpack has a sprite, so... +/obj/item/storage/backpack + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/back/backpack.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/back.dmi' + ) + +/obj/item/storage/backpack/messenger + supported_bodyshapes = null + bodyshape_icon_files = null + +/obj/item/gravity_harness + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/gravity_harness/icons/gravity_harness_back.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/back.dmi' + ) + +/obj/item/tank/jetpack + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/back.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/back.dmi' + ) + +// mods +/obj/item/mod/control/pre_equipped/loader + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/modsuit/mod_clothing.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/back.dmi' + ) + +// belts + +/obj/item/storage/belt/utility + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/belt.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/belt.dmi' + ) + +/obj/item/storage/belt/medical + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/modular_cosmetics/icons/mob/storage/medical.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/belt.dmi' + ) + +/obj/item/storage/belt/janitor + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/belt.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/belt.dmi' + ) + + +/obj/item/storage/belt/military + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/belt.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/belt.dmi' + ) + +/obj/item/storage/belt/security/webbing + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/belt.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/belt.dmi' + ) + +/obj/item/tank/internals/emergency_oxygen + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/back.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/belt.dmi' + ) + +/obj/item/storage/belt/bandolier + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/belt.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/belt.dmi' + ) + +/obj/item/storage/belt/sheath/sabre + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/belt.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/belt.dmi' + ) + +/obj/item/storage/bag/trash + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/belt.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/belt.dmi' + ) +// ears + +// the basetype has a sprite; the has_icon will remedy the overlap +/obj/item/radio/headset + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/ears.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/ears.dmi' + ) + +// eyes + +// yet another basetype w/ a sprite :( +/obj/item/clothing/glasses + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/eyes.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/eyes.dmi' + ) + +// shoes + +// empty + +// gloves + +/obj/item/clothing/gloves/captain + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/hands.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/hands.dmi' + ) + +/obj/item/clothing/gloves/color/black + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/hands.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/hands.dmi' + ) + +/obj/item/clothing/gloves/fingerless + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/hands.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/hands.dmi' + ) + + +/obj/item/clothing/gloves/combat + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/hands.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/hands.dmi' + ) + +/obj/item/clothing/gloves/combat/wizard + supported_bodyshapes = null + bodyshape_icon_files = null + +/obj/item/clothing/gloves/radio + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/hands.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/hands.dmi' + ) + +/obj/item/clothing/gloves/chief_engineer + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/hands.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/hands.dmi' + ) + +/obj/item/clothing/gloves/bracer + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/hands.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/hands.dmi' + ) + +// head + +/obj/item/clothing/head/utility/welding + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/head/utility.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) + +/obj/item/clothing/head/hooded/cloakhood/drake + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/head/helmet.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) + +/obj/item/clothing/head/soft + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/head/hats.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) + +/obj/item/clothing/head/costume/weddingveil + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/head/costume.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) + +/obj/item/reagent_containers/cup/bucket + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/head/utility.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) + +/obj/item/clothing/head/cone + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/head/utility.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) + +/obj/item/clothing/head/helmet/alt + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/head/helmet.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) + +/obj/item/clothing/head/helmet/swat + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/head/helmet.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) + +// i cant be assed to maintain parity between every single collectible hat so here. basetype. +/obj/item/clothing/head/collectable + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/head/helmet.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) + +/obj/item/clothing/head/helmet/toggleable/riot + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/head/helmet.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) + +/obj/item/clothing/head/hooded/winterhood + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/head/winterhood.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) + +/obj/item/clothing/head/hats/hos/cap + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/head/hats.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) + +/obj/item/clothing/head/hats/hopcap + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/head/hats.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) + +/obj/item/clothing/head/hats/caphat + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/head/hats.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) + +/obj/item/clothing/head/hats/centcom_cap + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/head/hats.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) + +/obj/item/clothing/head/hats/centhat + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/head/hats.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) + +/obj/item/clothing/head/hats/warden + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/head/hats.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) + +/obj/item/clothing/head/utility/hardhat/cakehat + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/head/costume.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) + +/obj/item/clothing/head/wizard + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/head/wizard.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) + +/obj/item/clothing/head/wizard/marisa + supported_bodyshapes = null + bodyshape_icon_files = null + +/obj/item/clothing/head/costume/maid_headband + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/head/costume.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) + +/obj/item/clothing/head/armor/captain + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/head/utility.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/head.dmi' + ) + +// masks + +/obj/item/clothing/mask/gas + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI, BODYSHAPE_SNOUTED) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/mask.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/mask.dmi', + BODYSHAPE_SNOUTED_T = 'modular_doppler/modular_cosmetics/icons/mob/face/basemask_muzzled.dmi', + ) + +/obj/item/clothing/mask/gas/atmos + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_SNOUTED) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/mask.dmi', + BODYSHAPE_SNOUTED_T = 'modular_doppler/modular_cosmetics/icons/mob/face/basemask_muzzled.dmi', + ) + +/obj/item/clothing/mask/joy + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI, BODYSHAPE_SNOUTED) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/mask.dmi', + BODYSHAPE_SNOUTED_T = 'modular_doppler/modular_cosmetics/icons/mob/face/basemask_muzzled.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/mask.dmi' + ) + +/obj/item/clothing/mask/breath + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI, BODYSHAPE_SNOUTED) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/mask.dmi', + BODYSHAPE_SNOUTED_T = 'modular_doppler/modular_cosmetics/icons/mob/face/basemask_muzzled.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/mask.dmi' + ) + +/obj/item/cigarette + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI, BODYSHAPE_SNOUTED) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/mask.dmi', + BODYSHAPE_SNOUTED_T = 'modular_doppler/modular_cosmetics/icons/mob/face/basemask_muzzled.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/mask.dmi' + ) + +/obj/item/clothing/mask/muzzle + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI, BODYSHAPE_SNOUTED) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/mask.dmi', + BODYSHAPE_SNOUTED_T = 'modular_doppler/modular_cosmetics/icons/mob/face/basemask_muzzled.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/mask.dmi' + ) + +/obj/item/clothing/mask/balaclava + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI, BODYSHAPE_SNOUTED) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/mask.dmi', + BODYSHAPE_SNOUTED_T = 'modular_doppler/modular_cosmetics/icons/mob/face/basemask_muzzled.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/mask.dmi' + ) + +// uniforms + +/obj/item/clothing/under/rank/engineering + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/under/engineering.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/uniform.dmi' + ) + +// disabled; we use custom medical clothing +/*/obj/item/clothing/under/rank/medical + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/under/medical.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/uniform.dmi' + )*/ + +/obj/item/clothing/under/rank/security + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/under/security.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/uniform.dmi' + ) + +/obj/item/clothing/under/rank/rnd + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/under/rnd.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/uniform.dmi' + ) + +/obj/item/clothing/under/rank/civilian + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/under/civilian.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/uniform.dmi' + ) + +/obj/item/clothing/under/rank/cargo + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/under/cargo.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/uniform.dmi' + ) + +/obj/item/clothing/under/syndicate + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/under/syndicate.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/uniform.dmi' + ) + +/obj/item/clothing/under/costume/kilt + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/under/costume.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/uniform.dmi' + ) + +/obj/item/clothing/under/dress/wedding_dress + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/under/dress.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/uniform.dmi' + ) + +/obj/item/clothing/under/suit + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/under/suits.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/uniform.dmi' + ) + +// suits + +/obj/item/clothing/suit/hooded/cloak/drake + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/suits/armor.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/suit.dmi' + ) + +/obj/item/clothing/suit/armor + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/suits/armor.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/suit.dmi' + ) + +/obj/item/clothing/suit/hooded/wintercoat + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/suits/wintercoat.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/suit.dmi' + ) + +/obj/item/clothing/suit/wizrobe/tape + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/suits/wizard.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/suit.dmi' + ) + +/obj/item/clothing/suit/costume/poncho + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/suits/costume.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/suit.dmi' + ) + +// neck + +/obj/item/clothing/neck/cloak + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/neck.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/neck.dmi' + ) + +/obj/item/clothing/neck/tie + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/neck.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/neck.dmi' + ) + +// misc + +/obj/item/storage/medkit/robotic_repair + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/deforest_medical_items/icons/worn/worn.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/deforest_medical_items/icons/worn/worn_teshari.dmi' + ) + +/obj/item/storage/medkit/frontier + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/deforest_medical_items/icons/worn/worn.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/deforest_medical_items/icons/worn/worn_teshari.dmi' + ) + +/obj/item/storage/medkit/combat_surgeon + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/deforest_medical_items/icons/worn/worn.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/deforest_medical_items/icons/worn/worn_teshari.dmi' + ) + +/obj/item/storage/backpack/duffelbag/deforest_medkit + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/deforest_medical_items/icons/worn/worn.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/deforest_medical_items/icons/worn/worn_teshari.dmi' + ) + +/obj/item/storage/backpack/duffelbag/deforest_surgical + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/deforest_medical_items/icons/worn/worn.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/deforest_medical_items/icons/worn/worn_teshari.dmi' + ) + +/obj/item/storage/backpack/duffelbag/deforest_paramedic + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/deforest_medical_items/icons/worn/worn.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/deforest_medical_items/icons/worn/worn_teshari.dmi' + ) + +// accessories + +/obj/item/clothing/accessory/maidapron + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/accessories.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/accessories.dmi' + ) + +/obj/item/clothing/accessory/maidapron + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/accessories.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/accessories.dmi' + ) + +/obj/item/clothing/accessory/talisman + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/accessories.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/accessories.dmi' + ) + +/obj/item/clothing/accessory/pocketprotector + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/accessories.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/accessories.dmi' + ) + +/obj/item/clothing/accessory/armband + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'icons/mob/clothing/accessories.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/modular_species/species_types/teshari/icons/clothing/accessories.dmi' + ) diff --git a/modular_doppler/modular_species/species_types/teshari/teshari_meat.dm b/modular_doppler/modular_species/species_types/teshari/teshari_meat.dm new file mode 100644 index 00000000000000..80f630169fb472 --- /dev/null +++ b/modular_doppler/modular_species/species_types/teshari/teshari_meat.dm @@ -0,0 +1,131 @@ +#define TESHARI_QUALITY_MALUS -3 + +/obj/item/food/meat/slab/chicken/teshari + name = "teshari meat" + desc = "A slab of teshari muscle, notoriously thick and chock-full of heavy metals. Does not taste very good, and is certainly not good for you." + tastes = list("metal" = 1, "tough meat" = 1) + foodtypes = MEAT | RAW | GORE + venue_value = FOOD_MEAT_MUTANT + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 5, + /datum/reagent/consumable/nutriment/fat = 1, + /datum/reagent/consumable/nutriment/vitamin = 1, + /datum/reagent/mercury = 1, + ) + +/obj/item/food/meat/slab/chicken/teshari/Initialize(mapload) + . = ..() + + AddElement(/datum/element/quality_food_ingredient, TESHARI_QUALITY_MALUS) + RegisterSignal(src, COMSIG_FOOD_GET_EXTRA_COMPLEXITY, GLOBAL_PROC_REF(adjust_teshari_meat_quality)) + +/obj/item/food/meat/slab/chicken/teshari/make_grillable() + AddComponent(/datum/component/grillable, /obj/item/food/meat/steak/chicken/teshari, rand(30 SECONDS, 90 SECONDS), TRUE, TRUE) + +/obj/item/food/meat/slab/chicken/teshari/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/meat/rawcutlet/chicken/teshari, 3, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") + +/obj/item/food/meat/steak/chicken/teshari + name = "teshari steak" + desc = "A prepared slab of teshari muscle. Marginally better tasting. Still as unhealthy." + tastes = list("metal" = 1, "tough meat" = 1) + foodtypes = MEAT | GORE + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 5, + /datum/reagent/consumable/nutriment/fat = 1, + /datum/reagent/consumable/nutriment/vitamin = 1, + /datum/reagent/mercury = 1, + ) + +/obj/item/food/meat/steak/chicken/teshari/Initialize(mapload) + . = ..() + + AddElement(/datum/element/quality_food_ingredient, TESHARI_QUALITY_MALUS) + RegisterSignal(src, COMSIG_FOOD_GET_EXTRA_COMPLEXITY, GLOBAL_PROC_REF(adjust_teshari_meat_quality)) + +/obj/item/food/meat/rawcutlet/chicken/teshari + name = "raw teshari cutlet" + tastes = list("metal" = 1, "tough meat" = 1) + foodtypes = MEAT | RAW | GORE + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/mercury = 0.2) + +/obj/item/food/meat/rawcutlet/chicken/teshari/Initialize(mapload) + . = ..() + + AddElement(/datum/element/quality_food_ingredient, TESHARI_QUALITY_MALUS) + RegisterSignal(src, COMSIG_FOOD_GET_EXTRA_COMPLEXITY, GLOBAL_PROC_REF(adjust_teshari_meat_quality)) + +/obj/item/food/meat/cutlet/chicken/teshari + name = "teshari cutlet" + tastes = list("metal" = 1, "tough meat" = 1) + foodtypes = MEAT | GORE + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/mercury = 0.2) + +/obj/item/food/meat/cutlet/chicken/teshari/Initialize(mapload) + . = ..() + + AddElement(/datum/element/quality_food_ingredient, TESHARI_QUALITY_MALUS) + RegisterSignal(src, COMSIG_FOOD_GET_EXTRA_COMPLEXITY, GLOBAL_PROC_REF(adjust_teshari_meat_quality)) + +/obj/item/food/raw_meatball/chicken/teshari + name = "raw teshari meatball" + tastes = list("metal" = 1, "tough meat" = 1) + meatball_type = /obj/item/food/meatball/chicken/teshari + patty_type = /obj/item/food/raw_patty/chicken/teshari + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/mercury = 0.2) + +/obj/item/food/raw_meatball/chicken/teshari/Initialize(mapload) + . = ..() + + AddElement(/datum/element/quality_food_ingredient, TESHARI_QUALITY_MALUS) + RegisterSignal(src, COMSIG_FOOD_GET_EXTRA_COMPLEXITY, GLOBAL_PROC_REF(adjust_teshari_meat_quality)) + +/obj/item/food/meatball/chicken/teshari + name = "teshari meatball" + tastes = list("metal" = 1, "tough meat" = 1) + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/mercury = 0.2) + +/obj/item/food/meatball/chicken/teshari/Initialize(mapload) + . = ..() + + AddElement(/datum/element/quality_food_ingredient, TESHARI_QUALITY_MALUS) + +/obj/item/food/raw_patty/chicken/teshari + name = "raw teshari patty" + tastes = list("metal" = 1, "tough meat" = 1) + patty_type = /obj/item/food/patty/human/teshari + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/mercury = 0.2) + +/obj/item/food/raw_patty/chicken/teshari/Initialize(mapload) + . = ..() + + AddElement(/datum/element/quality_food_ingredient, TESHARI_QUALITY_MALUS) + RegisterSignal(src, COMSIG_FOOD_GET_EXTRA_COMPLEXITY, GLOBAL_PROC_REF(adjust_teshari_meat_quality)) + +/obj/item/food/patty/human/teshari + name = "teshari patty" + tastes = list("metal" = 1, "tough meat" = 1) + icon_state = "chicken_patty" + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/mercury = 0.2) + +/obj/item/food/patty/human/teshari/Initialize(mapload) + . = ..() + + AddElement(/datum/element/quality_food_ingredient, TESHARI_QUALITY_MALUS) + RegisterSignal(src, COMSIG_FOOD_GET_EXTRA_COMPLEXITY, GLOBAL_PROC_REF(adjust_teshari_meat_quality)) + +/datum/food_processor_process/meat/chicken + blacklist = list(/obj/item/food/meat/slab/chicken/teshari) + +/datum/food_processor_process/meat/chicken/teshari + input = /obj/item/food/meat/slab/chicken/teshari + output = /obj/item/food/raw_meatball/chicken/teshari + blacklist = null + +/// A simple callback function for COMSIG_FOOD_GET_EXTRA_COMPLEXITY. +/proc/adjust_teshari_meat_quality(datum/signal_source, list/extra_complexity) + SIGNAL_HANDLER + + extra_complexity[1] += TESHARI_QUALITY_MALUS + +#undef TESHARI_QUALITY_MALUS diff --git a/modular_doppler/modular_species/species_types/teshari/teshari_organs.dm b/modular_doppler/modular_species/species_types/teshari/teshari_organs.dm new file mode 100644 index 00000000000000..a4671e65ab03c3 --- /dev/null +++ b/modular_doppler/modular_species/species_types/teshari/teshari_organs.dm @@ -0,0 +1,96 @@ +/obj/item/organ/ears/teshari + name = "teshari ears" + desc = "A set of four long rabbit-like ears, a Teshari's main tool while hunting. Naturally extremely sensitive to loud sounds." + damage_multiplier = 1.5 + actions_types = list(/datum/action/cooldown/teshari_hearing) + preference = "feature_teshari_ears" + bodypart_overlay = /datum/bodypart_overlay/mutant/ears/teshari + +/obj/item/organ/ears/teshari/on_mob_remove(mob/living/carbon/ear_owner) + . = ..() + REMOVE_TRAIT(ear_owner, TRAIT_GOOD_HEARING, ORGAN_TRAIT) + +/datum/action/cooldown/teshari_hearing + name = "Toggle Sensitive Hearing" + desc = "Perk up your ears to listen for quiet sounds, useful for picking up whispering." + button_icon = 'modular_doppler/modular_species/species_types/teshari/icons/abilities/actions.dmi' + button_icon_state = "echolocation_off" + background_icon_state = "bg_alien" + overlay_icon_state = "bg_alien_border" + + cooldown_time = 1 SECONDS + +/datum/action/cooldown/teshari_hearing/proc/update_button_state(new_state) //This makes it so that the button icon changes dynamically based on ears being up or not. + button_icon_state = new_state + owner.update_action_buttons() + +/datum/action/cooldown/teshari_hearing/Remove(mob/living/remove_from) + REMOVE_TRAIT(remove_from, TRAIT_GOOD_HEARING, ORGAN_TRAIT) + remove_from.update_sight() + return ..() + +/datum/action/cooldown/teshari_hearing/Activate(atom/target) + . = ..() + + var/mob/living/living_target = target + if (!istype(living_target)) + return + + if(HAS_TRAIT(living_target, TRAIT_GOOD_HEARING)) + teshari_hearing_deactivate(living_target) + return + + living_target.apply_status_effect(/datum/status_effect/teshari_hearing) + living_target.visible_message(span_notice("[living_target], pricks up [living_target.p_their()] four ears, each twitching intently!"), span_notice("You perk up all four of your ears, hunting for even the quietest sounds.")) + update_button_state("echolocation_on") + + var/obj/item/organ/ears/ears = living_target.get_organ_slot(ORGAN_SLOT_EARS) + if(ears) + ears.damage_multiplier = 3 + +/datum/action/cooldown/teshari_hearing/proc/teshari_hearing_deactivate(mob/living/carbon/human/user) //Called when you activate it again after casting the ability-- turning them off, so to say. + if(!HAS_TRAIT_FROM(user, TRAIT_GOOD_HEARING, ORGAN_TRAIT)) + return + + user.remove_status_effect(/datum/status_effect/teshari_hearing) + user.visible_message(span_notice("[user] drops [user.p_their()] ears down a bit, no longer listening as closely."), span_notice("You drop your ears down, no longer paying close attention.")) + update_button_state("echolocation_off") + + var/obj/item/organ/ears/ears = user.get_organ_slot(ORGAN_SLOT_EARS) + if(ears) + ears.damage_multiplier = 1.5 + +/datum/status_effect/teshari_hearing + id = "teshari_hearing" + alert_type = null + status_type = STATUS_EFFECT_UNIQUE + +/datum/status_effect/teshari_hearing/on_apply() + ADD_TRAIT(owner, TRAIT_GOOD_HEARING, ORGAN_TRAIT) + return ..() + +/datum/status_effect/teshari_hearing/on_remove() + REMOVE_TRAIT(owner, TRAIT_GOOD_HEARING, ORGAN_TRAIT) + return ..() + +/datum/status_effect/teshari_hearing/get_examine_text() + return span_notice("[owner.p_They()] [owner.p_have()] [owner.p_their()] ears perked up, listening closely to whisper-quiet sounds.") + +/datum/bodypart_overlay/mutant/ears/teshari + +/datum/bodypart_overlay/mutant/ears/teshari/get_global_feature_list() + return SSaccessories.ears_list_teshari + +/obj/item/organ/tail/teshari + name = "teshari tail" + desc = "A long, sinuous tail typically found in teshari. Whoever lost it probably isn't very pleased." + preference = "feature_teshari_tail" + dna_block = null + bodypart_overlay = /datum/bodypart_overlay/mutant/tail/teshari + +/datum/bodypart_overlay/mutant/tail/teshari + feature_key = FEATURE_TAIL_OTHER + +/datum/bodypart_overlay/mutant/tail/teshari/get_global_feature_list() + return SSaccessories.tails_list_teshari + diff --git a/modular_doppler/modular_species/species_types/teshari/teshari_tablerun.dm b/modular_doppler/modular_species/species_types/teshari/teshari_tablerun.dm new file mode 100644 index 00000000000000..1369ef7436160f --- /dev/null +++ b/modular_doppler/modular_species/species_types/teshari/teshari_tablerun.dm @@ -0,0 +1,22 @@ +/datum/action/innate/teshari_tablerun + name = "Enable Tablerunning" + desc = "Toggle your ability to effortlessly jump over and on top of tables." + check_flags = NONE + button_icon = 'modular_doppler/modular_species/species_types/teshari/icons/abilities/actions.dmi' + button_icon_state = "teshari_tablerunning" + +/datum/action/innate/teshari_tablerun/Activate() + active = TRUE + passtable_on(owner, SPECIES_TRAIT) + owner.balloon_alert(owner, "now tablerunning") + build_all_button_icons(UPDATE_BUTTON_BACKGROUND) + +/datum/action/innate/teshari_tablerun/Deactivate() + active = FALSE + passtable_off(owner, SPECIES_TRAIT) + owner.balloon_alert(owner, "no longer tablerunning") + build_all_button_icons(UPDATE_BUTTON_BACKGROUND) + +/datum/action/innate/teshari_tablerun/Remove(mob/removed_from) + . = ..() + passtable_off(removed_from, SPECIES_TRAIT) diff --git a/modular_doppler/reagent_forging/code/forge_clothing.dm b/modular_doppler/reagent_forging/code/forge_clothing.dm index fb3a9ddc9a3518..b6e89824b7a7a5 100644 --- a/modular_doppler/reagent_forging/code/forge_clothing.dm +++ b/modular_doppler/reagent_forging/code/forge_clothing.dm @@ -4,6 +4,11 @@ desc = "An armor vest made of hammered, interlocking plates." icon = 'modular_doppler/reagent_forging/icons/obj/forge_clothing.dmi' worn_icon = 'modular_doppler/reagent_forging/icons/mob/clothing/forge_clothing.dmi' + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/reagent_forging/icons/mob/clothing/forge_clothing.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/reagent_forging/icons/mob/clothing/forge_clothing_teshari.dmi' + ) icon_state = "plate_vest" supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON resistance_flags = FIRE_PROOF @@ -30,6 +35,11 @@ desc = "A set of leather gloves with protective armor plates connected to the wrists." icon = 'modular_doppler/reagent_forging/icons/obj/forge_clothing.dmi' worn_icon = 'modular_doppler/reagent_forging/icons/mob/clothing/forge_clothing.dmi' + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/reagent_forging/icons/mob/clothing/forge_clothing.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/reagent_forging/icons/mob/clothing/forge_clothing_teshari.dmi' + ) icon_state = "plate_gloves" resistance_flags = FIRE_PROOF obj_flags_doppler = ANVIL_REPAIR @@ -54,6 +64,11 @@ desc = "A helmet out of hammered plates with a leather neck guard and chin strap." icon = 'modular_doppler/reagent_forging/icons/obj/forge_clothing.dmi' worn_icon = 'modular_doppler/reagent_forging/icons/mob/clothing/forge_clothing.dmi' + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/reagent_forging/icons/mob/clothing/forge_clothing.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/reagent_forging/icons/mob/clothing/forge_clothing_teshari.dmi' + ) icon_state = "plate_helmet" resistance_flags = FIRE_PROOF flags_inv = null @@ -78,6 +93,11 @@ desc = "A pair of leather boots with protective armor plates over the shins and toes." icon = 'modular_doppler/reagent_forging/icons/obj/forge_clothing.dmi' worn_icon = 'modular_doppler/reagent_forging/icons/mob/clothing/forge_clothing.dmi' + supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_TESHARI) + bodyshape_icon_files = list( + BODYSHAPE_HUMANOID_T = 'modular_doppler/reagent_forging/icons/mob/clothing/forge_clothing.dmi', + BODYSHAPE_TESHARI_T = 'modular_doppler/reagent_forging/icons/mob/clothing/forge_clothing_teshari.dmi' + ) supported_bodyshapes = list(BODYSHAPE_HUMANOID, BODYSHAPE_DIGITIGRADE) bodyshape_icon_files = list(BODYSHAPE_HUMANOID_T = 'modular_doppler/reagent_forging/icons/mob/clothing/forge_clothing.dmi', BODYSHAPE_DIGITIGRADE_T = 'modular_doppler/reagent_forging/icons/mob/clothing/forge_clothing_digi.dmi') diff --git a/modular_doppler/species_clothes/code/coalition/clothing.dm b/modular_doppler/species_clothes/code/coalition/clothing.dm index d3b57e97904e1f..0d6ab0b9f0b47f 100644 --- a/modular_doppler/species_clothes/code/coalition/clothing.dm +++ b/modular_doppler/species_clothes/code/coalition/clothing.dm @@ -46,6 +46,8 @@ lefthand_file = 'modular_doppler/species_clothes/icons/generic/lefthand.dmi' righthand_file = 'modular_doppler/species_clothes/icons/generic/righthand.dmi' inhand_icon_state = null + supported_bodyshapes = null + bodyshape_icon_files = null /obj/item/clothing/glasses/tajaran_hud/Initialize(mapload) . = ..() diff --git a/modular_doppler/species_clothes/code/human_update_icons.dm b/modular_doppler/species_clothes/code/human_update_icons.dm new file mode 100644 index 00000000000000..299d279ecee824 --- /dev/null +++ b/modular_doppler/species_clothes/code/human_update_icons.dm @@ -0,0 +1,44 @@ +/** + * Returns a mutable appearance of [clothing], adjusted for bodyshape and offsets. Effectively the final step in update icons for clothing. + * + * Args: + * * obj/item/clothing: The clothing item we are getting a new appearance for. + * * layer: The layer the resultant appearance will be using. + * * slot: The item slot of the clothing item. OFFSET_UNIFORM, etc + * * icon_file: The DEFAULT icon file that will be used. Will be overridden by bodyshape modifiers if applicable! + * * datum/worn_feature_offset/offset: The offset to be applied to the resultant appearance, if no bodyshape override was found/created. Nullable. + * + * Returns: + * * A /mutable_appearance, either from a cache or newly created, adjusted by bodyshape and offsets. + */ +/mob/living/carbon/human/proc/get_updated_worn_icon(obj/item/clothing, layer, slot, icon_file, datum/worn_feature_offset/offset) + RETURN_TYPE(/mutable_appearance) + + var/found_special_sprite = FALSE + for(var/shape in clothing.supported_bodyshapes) + if(!(bodyshape & shape)) + continue + var/potential_file = clothing.bodyshape_icon_files["[shape]"] + if (icon_exists(potential_file, clothing.icon_state)) + icon_file = clothing.bodyshape_icon_files["[shape]"] + if (shape == BODYSHAPE_HUMANOID) // EVERYTHING has this + continue + found_special_sprite = TRUE + break + + var/autogen_override = FALSE + if(!found_special_sprite) + var/corresponding_shape = clothing.get_matching_bodyshape(src) + if (!isnull(corresponding_shape)) + // we found a config for our body? that must mean the clothing doesnt fit. so just trust it + var/autogenerated_icon = clothing.generate_autogen_worn_icon(corresponding_shape, slot) + if(autogenerated_icon) + icon_file = autogenerated_icon + autogen_override = TRUE + + var/icon/final_icon = clothing.build_worn_icon(default_layer = layer, default_icon_file = icon_file, override_file = (found_special_sprite || autogen_override) ? icon_file : null, humie = src) + + if (!autogen_override && !found_special_sprite) + offset?.apply_offset(final_icon) + + return final_icon diff --git a/modular_doppler/species_clothes/code/tiziria/clothing.dm b/modular_doppler/species_clothes/code/tiziria/clothing.dm index c34a1f16752b9a..f3ff80cf0853e8 100644 --- a/modular_doppler/species_clothes/code/tiziria/clothing.dm +++ b/modular_doppler/species_clothes/code/tiziria/clothing.dm @@ -37,6 +37,8 @@ righthand_file = 'modular_doppler/species_clothes/icons/generic/righthand.dmi' inhand_icon_state = null flags_cover = GLASSESCOVERSEYES + supported_bodyshapes = null + bodyshape_icon_files = null /obj/item/clothing/glasses/lizard_hud/Initialize(mapload) . = ..() diff --git a/modular_doppler/super_glasses/code/techno_visors.dm b/modular_doppler/super_glasses/code/techno_visors.dm index b951cd65db4c9a..b67bd0dc8ef3e6 100644 --- a/modular_doppler/super_glasses/code/techno_visors.dm +++ b/modular_doppler/super_glasses/code/techno_visors.dm @@ -7,6 +7,8 @@ icon = 'modular_doppler/super_glasses/icons/visors.dmi' icon_state = "black" worn_icon = 'modular_doppler/super_glasses/icons/worn/visors.dmi' + supported_bodyshapes = null + bodyshape_icon_files = null worn_icon_state = "black" obj_flags = UNIQUE_RENAME | INFINITE_RESKIN uses_advanced_reskins = TRUE diff --git a/tgstation.dme b/tgstation.dme index fd750de46c9da8..f7f9af9b6f4879 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -414,6 +414,7 @@ #include "code\__DEFINES\traits\declarations.dm" #include "code\__DEFINES\traits\macros.dm" #include "code\__DEFINES\traits\sources.dm" +#include "code\__DEFINES\~doppler_defines\_autogen_clothing_defines.dm" #include "code\__DEFINES\~doppler_defines\admin.dm" #include "code\__DEFINES\~doppler_defines\armor_defines.dm" #include "code\__DEFINES\~doppler_defines\automapper.dm" @@ -464,6 +465,7 @@ #include "code\__DEFINES\~doppler_defines\species_clothing_paths.dm" #include "code\__DEFINES\~doppler_defines\speech_channels.dm" #include "code\__DEFINES\~doppler_defines\strippable.dm" +#include "code\__DEFINES\~doppler_defines\teshari.dm" #include "code\__DEFINES\~doppler_defines\text.dm" #include "code\__DEFINES\~doppler_defines\traits.dm" #include "code\__DEFINES\~doppler_defines\vehicles.dm" @@ -7124,6 +7126,7 @@ #include "modular_doppler\modular_antagonists\datums\antag_recipes.dm" #include "modular_doppler\modular_cargo\doppler_cargo_packs.dm" #include "modular_doppler\modular_cosmetics\toggle_clothes.dm" +#include "modular_doppler\modular_cosmetics\code\chest.dm" #include "modular_doppler\modular_cosmetics\code\clothing_overrides.dm" #include "modular_doppler\modular_cosmetics\code\garment_bag_overrides.dm" #include "modular_doppler\modular_cosmetics\code\suit_overrides.dm" @@ -7187,6 +7190,7 @@ #include "modular_doppler\modular_cosmetics\code\under\pants.dm" #include "modular_doppler\modular_cosmetics\code\under\rad_alt.dm" #include "modular_doppler\modular_cosmetics\code\under\syndicate.dm" +#include "modular_doppler\modular_cosmetics\code\under\under.dm" #include "modular_doppler\modular_cosmetics\GAGS\greyscale_configs_face.dm" #include "modular_doppler\modular_cosmetics\GAGS\greyscale_configs_hand.dm" #include "modular_doppler\modular_cosmetics\GAGS\greyscale_configs_head.dm" @@ -7260,6 +7264,8 @@ #include "modular_doppler\modular_customization\accessories\code\ramatan_accessories\ramatan_frills.dm" #include "modular_doppler\modular_customization\accessories\code\ramatan_accessories\ramatan_snout.dm" #include "modular_doppler\modular_customization\accessories\code\ramatan_accessories\ramatan_tail.dm" +#include "modular_doppler\modular_customization\accessories\code\teshari_accessories\teshari_ears.dm" +#include "modular_doppler\modular_customization\accessories\code\teshari_accessories\teshari_tail.dm" #include "modular_doppler\modular_customization\accessories\code\underwear_accessories\bras.dm" #include "modular_doppler\modular_customization\accessories\code\underwear_accessories\socks.dm" #include "modular_doppler\modular_customization\accessories\code\underwear_accessories\undershirts.dm" @@ -7274,6 +7280,7 @@ #include "modular_doppler\modular_customization\markings\body_markings\secondary.dm" #include "modular_doppler\modular_customization\markings\body_markings\tattoos.dm" #include "modular_doppler\modular_customization\markings\body_markings\tertiary.dm" +#include "modular_doppler\modular_customization\markings\body_markings\teshari.dm" #include "modular_doppler\modular_customization\markings\body_markings\vox.dm" #include "modular_doppler\modular_customization\markings\preferences\markings.dm" #include "modular_doppler\modular_customization\organs\_organs.dm" @@ -7296,6 +7303,7 @@ #include "modular_doppler\modular_customization\preferences\fluff.dm" #include "modular_doppler\modular_customization\preferences\frills.dm" #include "modular_doppler\modular_customization\preferences\horns.dm" +#include "modular_doppler\modular_customization\preferences\preference.dm" #include "modular_doppler\modular_customization\preferences\preferences.dm" #include "modular_doppler\modular_customization\preferences\preferences_setup.dm" #include "modular_doppler\modular_customization\preferences\snout.dm" @@ -7487,6 +7495,7 @@ #include "modular_doppler\modular_skillchips\code\modular_skillchips.dm" #include "modular_doppler\modular_sounds\code\sounds.dm" #include "modular_doppler\modular_species\_species.dm" +#include "modular_doppler\modular_species\autogen_clothing.dm" #include "modular_doppler\modular_species\blood_types.dm" #include "modular_doppler\modular_species\species_types\akula\code\wetsuit.dm" #include "modular_doppler\modular_species\species_types\android\android.dm" @@ -7540,6 +7549,16 @@ #include "modular_doppler\modular_species\species_types\snails\snail_bodyparts.dm" #include "modular_doppler\modular_species\species_types\snails\organs\snail_heart.dm" #include "modular_doppler\modular_species\species_types\snails\organs\snail_liver.dm" +#include "modular_doppler\modular_species\species_types\teshari\gags_configs.dm" +#include "modular_doppler\modular_species\species_types\teshari\schechi.dm" +#include "modular_doppler\modular_species\species_types\teshari\teshari.dm" +#include "modular_doppler\modular_species\species_types\teshari\teshari_bodyparts.dm" +#include "modular_doppler\modular_species\species_types\teshari\teshari_clothes.dm" +#include "modular_doppler\modular_species\species_types\teshari\teshari_meat.dm" +#include "modular_doppler\modular_species\species_types\teshari\teshari_organs.dm" +#include "modular_doppler\modular_species\species_types\teshari\teshari_tablerun.dm" +#include "modular_doppler\modular_species\species_types\teshari\prosthetics\mechfabricator_designs.dm" +#include "modular_doppler\modular_species\species_types\teshari\prosthetics\robot_bodyparts.dm" #include "modular_doppler\modular_species\species_types\viridian\podpeople.dm" #include "modular_doppler\modular_species\species_types\viridian\podpeople_bodyparts.dm" #include "modular_doppler\modular_species\species_types\viridian\organs\_appendix.dm" @@ -7708,6 +7727,7 @@ #include "modular_doppler\soulcatcher\code\soulcatcher_tgui.dm" #include "modular_doppler\soulcatcher\code\soulcatcher_verbs.dm" #include "modular_doppler\spacer_swimming\spacer_swim.dm" +#include "modular_doppler\species_clothes\code\human_update_icons.dm" #include "modular_doppler\species_clothes\code\coalition\armor.dm" #include "modular_doppler\species_clothes\code\coalition\clothing.dm" #include "modular_doppler\species_clothes\code\coalition\storage.dm"