diff --git a/code/__DEFINES/~~bubber_defines/DNA.dm b/code/__DEFINES/~~bubber_defines/DNA.dm index 3bc2e66b426..30170e8be1e 100644 --- a/code/__DEFINES/~~bubber_defines/DNA.dm +++ b/code/__DEFINES/~~bubber_defines/DNA.dm @@ -138,6 +138,7 @@ #define SPECIES_HEMOPHAGE "hemophage" #define SPECIES_FELINE_PRIMITIVE "primitive_felinid" #define SPECIES_PROTEAN "protean" +#define SPECIES_GAS "serpentid" #define SPECIES_MUTANT "mutant" #define SPECIES_MUTANT_INFECTIOUS "infectious_mutant" diff --git a/code/__DEFINES/~~bubber_defines/gas_clothing_paths.dm b/code/__DEFINES/~~bubber_defines/gas_clothing_paths.dm new file mode 100644 index 00000000000..9d67c295fd6 --- /dev/null +++ b/code/__DEFINES/~~bubber_defines/gas_clothing_paths.dm @@ -0,0 +1,11 @@ +#define SERPENTID_ACCESSORIES_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/serpentid/accessories.dmi' +#define SERPENTID_BACK_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/serpentid/back.dmi' +#define SERPENTID_BELT_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/serpentid/belt.dmi' +#define SERPENTID_EYES_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/serpentid/eyes.dmi' +#define SERPENTID_HANDS_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/serpentid/hands.dmi' +#define SERPENTID_HEAD_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/serpentid/head.dmi' +#define SERPENTID_MASK_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/serpentid/mask.dmi' +#define SERPENTID_NECK_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/serpentid/neck.dmi' +#define SERPENTID_SUIT_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/serpentid/suit.dmi' +#define SERPENTID_UNIFORM_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/serpentid/uniform.dmi' +#define SERPENTID_EARS_ICON 'modular_skyrat/master_files/icons/mob/clothing/species/serpentid/ears.dmi' diff --git a/code/__DEFINES/~~bubber_defines/mobs.dm b/code/__DEFINES/~~bubber_defines/mobs.dm index 19ff5ec91da..9f546b9e889 100644 --- a/code/__DEFINES/~~bubber_defines/mobs.dm +++ b/code/__DEFINES/~~bubber_defines/mobs.dm @@ -41,3 +41,5 @@ #define AI_HOLOGRAM_BEE "Bee" #define AI_HOLOGRAM_REDPANDA "Red Panda" #define AI_HOLOGRAM_FENNEC "Fennec" + +#define BODYPART_ICON_GAS 'modular_skyrat/modules/bodyparts/icons/serpentid_parts_greyscale.dmi' diff --git a/code/__HELPERS/~skyrat_helpers/is_helpers.dm b/code/__HELPERS/~skyrat_helpers/is_helpers.dm index 1be4d08e652..7aa97cbbe35 100644 --- a/code/__HELPERS/~skyrat_helpers/is_helpers.dm +++ b/code/__HELPERS/~skyrat_helpers/is_helpers.dm @@ -22,6 +22,7 @@ #define isprotean(A) (is_species(A, /datum/species/protean)) #define iscursekin(A) (is_species(A, /datum/species/human/cursekin)) #define islycan(A) (is_species(A, /datum/species/lycan)) +#define isgas(A) (is_species(A, /datum/species/gas)) //Antags #define ishorrorling(A) (istype(A, /mob/living/simple_animal/hostile/true_changeling)) #define iscorticalborer(A) (istype(A, /mob/living/basic/cortical_borer)) diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_gas.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_gas.png new file mode 100644 index 00000000000..be831668f7f Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_gas.png differ diff --git a/config/game_options.txt b/config/game_options.txt index 2bf541abec5..6744ad194a1 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -425,6 +425,7 @@ ROUNDSTART_RACES lesser_abductor ROUNDSTART_RACES zombie ROUNDSTART_RACES protean ROUNDSTART_RACES cursekin +ROUNDSTART_RACES serpentid ##------------------------------------------------------------------------------------------- diff --git a/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/accessories.dmi b/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/accessories.dmi new file mode 100644 index 00000000000..d21127651db Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/accessories.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/back.dmi b/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/back.dmi new file mode 100644 index 00000000000..d21127651db Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/back.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/belt.dmi b/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/belt.dmi new file mode 100644 index 00000000000..24c8a00a63b Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/belt.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/ears.dmi b/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/ears.dmi new file mode 100644 index 00000000000..d21127651db Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/ears.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/eyes.dmi b/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/eyes.dmi new file mode 100644 index 00000000000..d21127651db Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/eyes.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/hands.dmi b/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/hands.dmi new file mode 100644 index 00000000000..d21127651db Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/hands.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/head.dmi b/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/head.dmi new file mode 100644 index 00000000000..d21127651db Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/head.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/mask.dmi b/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/mask.dmi new file mode 100644 index 00000000000..d21127651db Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/mask.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/neck.dmi b/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/neck.dmi new file mode 100644 index 00000000000..d21127651db Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/neck.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/suit.dmi b/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/suit.dmi new file mode 100644 index 00000000000..d21127651db Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/suit.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/uniform.dmi b/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/uniform.dmi new file mode 100644 index 00000000000..487eb53f569 Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/clothing/species/serpentid/uniform.dmi differ diff --git a/modular_skyrat/modules/GAGS/greyscale_configs.dm b/modular_skyrat/modules/GAGS/greyscale_configs.dm index 676db537860..628e7c17e1d 100644 --- a/modular_skyrat/modules/GAGS/greyscale_configs.dm +++ b/modular_skyrat/modules/GAGS/greyscale_configs.dm @@ -1502,6 +1502,41 @@ TREK name = "Teshari Hardsuit" json_config = 'modular_skyrat/modules/GAGS/json_configs/teshari_fallbacks/hardsuit.json' +/** + * Serpentid fallbacks. + * In case what we have another species with specials Json config file. We use this for our case. + * Check teshari fasllbacks .json config files for more datails. + */ + +/datum/greyscale_config/serpentid + name = "Serpentid clothing" + icon_file = 'modular_skyrat/modules/GAGS/icons/serpentid_fallbacks.dmi' + json_config = 'modular_skyrat/modules/GAGS/json_configs/serpentid_fallbacks/uniform.json' + +/datum/greyscale_config/serpentid/cloak + name = "Serpentid Poncho" + json_config = 'modular_skyrat/modules/GAGS/json_configs/serpentid_fallbacks/neck.json' + +/datum/greyscale_config/serpentid/tie + name = "Serpentid Tie" + json_config = 'modular_skyrat/modules/GAGS/json_configs/serpentid_fallbacks/neck.json' + +/datum/greyscale_config/serpentid/scarf + name = "Serpentid Scarf" + json_config = 'modular_skyrat/modules/GAGS/json_configs/serpentid_fallbacks/neck.json' + +/datum/greyscale_config/serpentid/gloves + name = "Serpentid Gloves" + json_config = 'modular_skyrat/modules/GAGS/json_configs/serpentid_fallbacks/gloves.json' + +/datum/greyscale_config/serpentid/eyes + name = "Serpentid Eyes" + json_config = 'modular_skyrat/modules/GAGS/json_configs/serpentid_fallbacks/eyes.json' + +/datum/greyscale_config/serpentid/belt + name = "Serpentid Belt" + json_config = 'modular_skyrat/modules/GAGS/json_configs/serpentid_fallbacks/belt.json' + /* * CIN SURPLUS ARMOR */ diff --git a/modular_skyrat/modules/GAGS/icons/serpentid_fallbacks.dmi b/modular_skyrat/modules/GAGS/icons/serpentid_fallbacks.dmi new file mode 100644 index 00000000000..edf1d4215ad Binary files /dev/null and b/modular_skyrat/modules/GAGS/icons/serpentid_fallbacks.dmi differ diff --git a/modular_skyrat/modules/GAGS/json_configs/serpentid_fallbacks/belt.json b/modular_skyrat/modules/GAGS/json_configs/serpentid_fallbacks/belt.json new file mode 100644 index 00000000000..a417197c74e --- /dev/null +++ b/modular_skyrat/modules/GAGS/json_configs/serpentid_fallbacks/belt.json @@ -0,0 +1,10 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "belt", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/modular_skyrat/modules/GAGS/json_configs/serpentid_fallbacks/eyes.json b/modular_skyrat/modules/GAGS/json_configs/serpentid_fallbacks/eyes.json new file mode 100644 index 00000000000..3d942dffc3c --- /dev/null +++ b/modular_skyrat/modules/GAGS/json_configs/serpentid_fallbacks/eyes.json @@ -0,0 +1,10 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "eyes", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/modular_skyrat/modules/GAGS/json_configs/serpentid_fallbacks/gloves.json b/modular_skyrat/modules/GAGS/json_configs/serpentid_fallbacks/gloves.json new file mode 100644 index 00000000000..b122076b2c8 --- /dev/null +++ b/modular_skyrat/modules/GAGS/json_configs/serpentid_fallbacks/gloves.json @@ -0,0 +1,10 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "gloves", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/modular_skyrat/modules/GAGS/json_configs/serpentid_fallbacks/neck.json b/modular_skyrat/modules/GAGS/json_configs/serpentid_fallbacks/neck.json new file mode 100644 index 00000000000..d52da8a1265 --- /dev/null +++ b/modular_skyrat/modules/GAGS/json_configs/serpentid_fallbacks/neck.json @@ -0,0 +1,10 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "poncho", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/modular_skyrat/modules/GAGS/json_configs/serpentid_fallbacks/uniform.json b/modular_skyrat/modules/GAGS/json_configs/serpentid_fallbacks/uniform.json new file mode 100644 index 00000000000..1d4ac28564a --- /dev/null +++ b/modular_skyrat/modules/GAGS/json_configs/serpentid_fallbacks/uniform.json @@ -0,0 +1,10 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "uniform", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/modular_skyrat/modules/bodyparts/code/serpentid_bodyparts.dm b/modular_skyrat/modules/bodyparts/code/serpentid_bodyparts.dm new file mode 100644 index 00000000000..4f197313db0 --- /dev/null +++ b/modular_skyrat/modules/bodyparts/code/serpentid_bodyparts.dm @@ -0,0 +1,97 @@ +#define GAS_PUNCH_LOW 3 // Humanoid pair of hands is extremely weak and deals reduced damage. +#define GAS_PUNCH_HIGH 5 +//GAS + +/obj/item/bodypart/head/mutant/serpentid + icon_greyscale = BODYPART_ICON_GAS + bodytype = BODYTYPE_ORGANIC + limb_id = SPECIES_GAS + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + head_flags = HEAD_EYESPRITES|HEAD_EYECOLOR|HEAD_EYEHOLES|HEAD_DEBRAIN + +/obj/item/bodypart/head/mutant/serpentid/Initialize(mapload) + worn_ears_offset = new( + attached_part = src, + feature_key = OFFSET_EARS, + offset_y = list("north" = 9, "south" = 9, "east" = 9, "west" = 9), + ) + worn_head_offset = new( + attached_part = src, + feature_key = OFFSET_HEAD, + offset_y = list("north" = 8, "south" = 8, "east" = 8, "west" = 8), + ) + worn_mask_offset = new( + attached_part = src, + feature_key = OFFSET_FACEMASK, + offset_y = list("north" = 7, "south" = 7, "east" = 7, "west" = 7), + ) + return ..() + + +/obj/item/bodypart/chest/mutant/serpentid + icon_greyscale = BODYPART_ICON_GAS + bodytype = BODYTYPE_ORGANIC + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + limb_id = SPECIES_GAS + +/obj/item/bodypart/chest/mutant/serpentid/Initialize(mapload) + worn_back_offset = new( + attached_part = src, + feature_key = OFFSET_BACK, + offset_y = list("north" = 5, "south" = 5, "east" = 5, "west" = 5), + ) + worn_accessory_offset = new( + attached_part = src, + feature_key = OFFSET_ACCESSORY, + offset_y = list("north" = 5, "south" = 5, "east" = 5, "west" = 5), + ) + return ..() + + +/obj/item/bodypart/arm/left/mutant/serpentid + icon_greyscale = BODYPART_ICON_GAS + bodytype = BODYTYPE_ORGANIC + limb_id = SPECIES_GAS + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + unarmed_damage_low = GAS_PUNCH_LOW + unarmed_damage_high = GAS_PUNCH_HIGH + + + brute_modifier = 0.8 + burn_modifier = 1.4 + + +/obj/item/bodypart/arm/right/mutant/serpentid + icon_greyscale = BODYPART_ICON_GAS + bodytype = BODYTYPE_ORGANIC + limb_id = SPECIES_GAS + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + unarmed_damage_low = GAS_PUNCH_LOW + unarmed_damage_high = GAS_PUNCH_HIGH + + brute_modifier = 0.8 + burn_modifier = 1.4 + + +/obj/item/bodypart/leg/left/mutant/serpentid + icon_greyscale = BODYPART_ICON_GAS + bodytype = BODYTYPE_ORGANIC + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + limb_id = SPECIES_GAS + + brute_modifier = 0.8 + burn_modifier = 1.4 + + +/obj/item/bodypart/leg/right/mutant/serpentid + icon_greyscale = BODYPART_ICON_GAS + bodytype = BODYTYPE_ORGANIC + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM + limb_id = SPECIES_GAS + brute_modifier = 0.8 + burn_modifier = 1.4 + + + +#undef GAS_PUNCH_LOW +#undef GAS_PUNCH_HIGH diff --git a/modular_skyrat/modules/bodyparts/icons/serpentid_parts_greyscale.dmi b/modular_skyrat/modules/bodyparts/icons/serpentid_parts_greyscale.dmi new file mode 100644 index 00000000000..91ffa86e957 Binary files /dev/null and b/modular_skyrat/modules/bodyparts/icons/serpentid_parts_greyscale.dmi differ diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/human.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/human.dm index 4d628cc8026..19a070f78bd 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/human.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/human.dm @@ -71,6 +71,9 @@ /mob/living/carbon/human/species/skrell race = /datum/species/skrell +/mob/living/carbon/human/species/serpentid + race = /datum/species/gas + /mob/living/carbon/human/verb/toggle_undies() set category = "IC" set name = "Toggle underwear visibility" diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/serpentid.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/serpentid.dm new file mode 100644 index 00000000000..9446addced3 --- /dev/null +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/serpentid.dm @@ -0,0 +1,296 @@ +#define BASE_CLOTH_X_1 1 +#define BASE_CLOTH_Y_1 1 + +#define SERPENTID_COLD_THRESHOLD_1 180 +#define SERPENTID_COLD_THRESHOLD_2 140 +#define SERPENTID_COLD_THRESHOLD_3 100 + +#define SERPENTID_HEAT_THRESHOLD_1 300 +#define SERPENTID_HEAT_THRESHOLD_2 440 +#define SERPENTID_HEAT_THRESHOLD_3 600 + +/datum/species/gas + name = "Giant Armored Serpentid" + id = SPECIES_GAS + eyes_icon = 'modular_skyrat/modules/organs/icons/serpentid_eyes.dmi' + can_augment = FALSE + + inherent_traits = list( + TRAIT_ADVANCEDTOOLUSER, + TRAIT_CHUNKYFINGERS_IGNORE_BATON, + TRAIT_PUSHIMMUNE, + TRAIT_RESISTHIGHPRESSURE, + TRAIT_RESISTLOWPRESSURE, + TRAIT_MUTANT_COLORS, + TRAIT_NO_UNDERWEAR, + TRAIT_NO_SLIP_ALL, + ) + + no_equip_flags = ITEM_SLOT_FEET | ITEM_SLOT_OCLOTHING | ITEM_SLOT_SUITSTORE + inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID + no_gender_shaping = TRUE + mutanttongue = /obj/item/organ/tongue/insect + + always_customizable = FALSE + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT + bodytemp_heat_damage_limit = (BODYTEMP_HEAT_DAMAGE_LIMIT - 10) + bodytemp_cold_damage_limit = (BODYTEMP_COLD_DAMAGE_LIMIT - 25) + + mutantbrain = /obj/item/organ/brain/serpentid + mutanteyes = /obj/item/organ/eyes/serpentid + mutantlungs = /obj/item/organ/lungs/serpentid + mutantheart = /obj/item/organ/heart/serpentid + mutantliver = /obj/item/organ/liver/serpentid + mutantears = /obj/item/organ/ears/serpentid + mutanttongue = /obj/item/organ/tongue/synth + bodypart_overrides = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/mutant/serpentid, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/mutant/serpentid, + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/mutant/serpentid, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/mutant/serpentid, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/mutant/serpentid, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/mutant/serpentid, + ) + custom_worn_icons = list( + LOADOUT_ITEM_HEAD = SERPENTID_HEAD_ICON, + LOADOUT_ITEM_MASK = SERPENTID_MASK_ICON, + LOADOUT_ITEM_UNIFORM = SERPENTID_UNIFORM_ICON, + LOADOUT_ITEM_HANDS = SERPENTID_HANDS_ICON, + LOADOUT_ITEM_GLASSES = SERPENTID_EYES_ICON, + LOADOUT_ITEM_BELT = SERPENTID_BELT_ICON, + LOADOUT_ITEM_MISC = SERPENTID_BACK_ICON, + LOADOUT_ITEM_EARS = SERPENTID_EARS_ICON + ) + +/datum/species/gas/randomize_features() + var/list/features = ..() + var/main_color + var/random = rand(1, 6) + switch(random) + if(1) + main_color = "#44FF77" + if(2) + main_color = "#227900" + if(3) + main_color = "#c40000" + if(4) + main_color = "#660000" + if(5) + main_color = "#c0ad00" + if(6) + main_color = "#e6ff03" + features[FEATURE_MUTANT_COLOR] = main_color + features[FEATURE_MUTANT_COLOR_TWO] = main_color + features[FEATURE_MUTANT_COLOR_THREE] = main_color + return features + +/datum/species/gas/prepare_human_for_preview(mob/living/carbon/human/serpentid) + var/serpentid_color = "#00ac1d" + serpentid.dna.features[FEATURE_MUTANT_COLOR] = serpentid_color + serpentid.dna.features[FEATURE_MUTANT_COLOR_TWO] = serpentid_color + serpentid.dna.features[FEATURE_MUTANT_COLOR_THREE] = serpentid_color + regenerate_organs(serpentid, src, visual_only = TRUE) + serpentid.update_body(TRUE) + +/datum/species/gas/create_pref_unique_perks() + var/list/perk_descriptions = list() + + perk_descriptions += list(list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = FA_ICON_SHIELD, + SPECIES_PERK_NAME = "Durable Chitin", + SPECIES_PERK_DESC = "The Giant Armored Serpentid chitin is very robust and protects them from pressure and low temperature hazards, while also providing decent brute resistance." + )) + + perk_descriptions += list(list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = FA_ICON_WEIGHT_HANGING, + SPECIES_PERK_NAME = "Heavy Skeleton", + SPECIES_PERK_DESC = "Giant Armored Serpentid are large and heavy, this makes them excellent at avoiding slipping and being grabbed." + )) + + perk_descriptions += list(list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = FA_ICON_USER_NINJA, + SPECIES_PERK_NAME = "Active Camouflage", + SPECIES_PERK_DESC = "The cells in a Giant Armored Serpentid's body are able to camouflage themselves to an extent, making the GAS appear translucent to the naked eye." + )) + + perk_descriptions += list(list( + SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, + SPECIES_PERK_ICON = FA_ICON_EYE, + SPECIES_PERK_NAME = "Shielded Eyes", + SPECIES_PERK_DESC = "Giant Armored Serpentid have sensitive eyes, luckily they have eyeshields that can be used to make up for this." + )) + + perk_descriptions += list(list( + SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, + SPECIES_PERK_ICON = FA_ICON_FACE_ANGRY, + SPECIES_PERK_NAME = "Threat Display", + SPECIES_PERK_DESC = "Giant Armored Serpentid are not good at communication, however, they can perform a threat display to show when they want to attack someone." + )) + + perk_descriptions += list(list( + SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, + SPECIES_PERK_ICON = "star-of-life", + SPECIES_PERK_NAME = "Custom Body", + SPECIES_PERK_DESC = "Giant Armored Serpentid have a non-humanoid body and can't wear most clothes." + )) + + perk_descriptions += list(list( + SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, + SPECIES_PERK_ICON = FA_ICON_TEMPERATURE_HALF, + SPECIES_PERK_NAME = "Cold-Blooded", + SPECIES_PERK_DESC = "Giant Armored Serpentid are a cold blooded species and are vulnerable to temperature changes in their environment." + )) + + return perk_descriptions + +/datum/species/gas/get_species_description() + return list( + "Giant Armoured Serpentids, or GAS as they are often called are large insectoids hailing from a planet in the Tiziran Empire. \ + They are excellent hunters, with phenomenal stealth capabilities, but are lacking in communication skills." + ) + +/datum/species/gas/get_species_lore() + return list( + "The Giant Armoured Serpentids are an old race, of insectoid creatures from a high gravity world in the Tiziran Empire. \ + Covered in intersecting scales, with a pair of huge claws as their main limbs, they vaguely resemble Terran mantids, though they've more \ + in common with snakes and other reptiles from a Terran point of view.", + "Living in a semi-hive/colony state, GAS, as they're referred to by Nanotrasen, have a lack of self identity compared to most species, \ + with few having a given name. This however is routinely ignored by most other races, and often they assign one to one they're working with, \ + for ease of communication. While they live in large colonies with other GAS, up to and rarely exceeding two hundred individuals, they do not \ + care for physical interaction with most, preferring to be left alone and given their personal space, such that they can seem aggressive even \ + when normal actions such as a handshake or hug are offered by ignorant members of other species." + ) +/datum/species/gas/body_temperature_core(mob/living/carbon/human/humi, seconds_per_tick, times_fired) + return + +/obj/item/organ/ears/serpentid + name = "antennae" + icon = 'modular_skyrat/modules/organs/icons/serpentid_organs.dmi' + icon_state = "ears" + +/obj/item/organ/heart/serpentid + name = "serpentid heart" + icon = 'modular_skyrat/modules/organs/icons/serpentid_organs.dmi' + icon_state = "heart" + actions_types = list(/datum/action/cooldown/spell/toggle_active_camo) + var/camouflaged = FALSE + +/obj/item/organ/heart/serpentid/proc/toggle_camo() + if(!camouflaged) + owner.alpha = 100 + camouflaged = TRUE + else + owner.alpha = 255 + camouflaged = FALSE + +/obj/item/organ/brain/serpentid + name = "distributed nervous system" + icon = 'modular_skyrat/modules/organs/icons/serpentid_organs.dmi' + icon_state = "brain" + actions_types = list(/datum/action/cooldown/spell/toggle_threat_display) + +/obj/item/organ/eyes/serpentid + name = "compound eyes" + desc = "Small orange orbs." + icon = 'modular_skyrat/modules/organs/icons/serpentid_organs.dmi' + icon_state = "eyes" + flash_protect = FLASH_PROTECTION_HYPER_SENSITIVE + iris_overlay = null + blink_animation = FALSE + eye_icon = 'modular_skyrat/modules/organs/icons/serpentid_eyes.dmi' + eye_icon_state = "eyes" + actions_types = list(/datum/action/cooldown/spell/toggle_eye_shields) + var/eyes_shielded + +/obj/item/organ/lungs/serpentid + name = "tracheae" + icon = 'modular_skyrat/modules/organs/icons/serpentid_organs.dmi' + icon_state = "lungs" + + cold_message = "You can't stand the freezing cold with every breath you take!" + cold_level_1_threshold = SERPENTID_COLD_THRESHOLD_1 + cold_level_2_threshold = SERPENTID_COLD_THRESHOLD_2 + cold_level_3_threshold = SERPENTID_COLD_THRESHOLD_3 + cold_level_1_damage = COLD_GAS_DAMAGE_LEVEL_1 //Keep in mind with gas damage levels, you can set these to be negative, if you want someone to heal, instead. + cold_level_2_damage = COLD_GAS_DAMAGE_LEVEL_1 + cold_level_3_damage = COLD_GAS_DAMAGE_LEVEL_2 + cold_damage_type = BRUTE + + + hot_message = "You can't stand the searing heat with every breath you take!" + heat_level_1_threshold = SERPENTID_HEAT_THRESHOLD_1 + heat_level_2_threshold = SERPENTID_HEAT_THRESHOLD_2 + heat_level_3_threshold = SERPENTID_HEAT_THRESHOLD_3 + heat_level_1_damage = HEAT_GAS_DAMAGE_LEVEL_2 + heat_level_2_damage = HEAT_GAS_DAMAGE_LEVEL_3 + heat_level_3_damage = HEAT_GAS_DAMAGE_LEVEL_3 + heat_damage_type = BURN + +/obj/item/organ/liver/serpentid + name = "toxin filter" + icon_state = "liver" + icon = 'modular_skyrat/modules/organs/icons/serpentid_organs.dmi' + liver_resistance = 0.8 * LIVER_DEFAULT_TOX_RESISTANCE // -40% + +/obj/item + var/datum/greyscale_config/greyscale_config_worn_serpentid_fallback + +/datum/species/gas/get_custom_worn_icon(item_slot, obj/item/item) + return item.worn_icon_gas + +/datum/species/gas/set_custom_worn_icon(item_slot, obj/item/item, icon/icon) + item.worn_icon_gas = icon + +/datum/species/gas/get_custom_worn_config_fallback(item_slot, obj/item/item) + return item.greyscale_config_worn_serpentid_fallback + +/datum/species/gas/generate_custom_worn_icon(item_slot, obj/item/item, mob/living/carbon/human/human_owner) + . = ..() + if(.) + return + + . = generate_custom_worn_icon_fallback(item_slot, item, human_owner) + if(.) + return + +/obj/item/clothing/under + species_clothing_color_coords = list(list(BASE_CLOTH_X_1, BASE_CLOTH_Y_1)) + greyscale_config_worn_serpentid_fallback = /datum/greyscale_config/serpentid + +/obj/item/clothing/neck + species_clothing_color_coords = list(list(BASE_CLOTH_X_1, BASE_CLOTH_Y_1)) + greyscale_config_worn_serpentid_fallback = /datum/greyscale_config/serpentid/scarf + +/obj/item/clothing/neck/cloak + species_clothing_color_coords = list(list(BASE_CLOTH_X_1, BASE_CLOTH_Y_1)) + greyscale_config_worn_serpentid_fallback = /datum/greyscale_config/serpentid/cloak + +/obj/item/clothing/neck/tie + species_clothing_color_coords = list(list(BASE_CLOTH_X_1, BASE_CLOTH_Y_1)) + greyscale_config_worn_serpentid_fallback = /datum/greyscale_config/serpentid/tie + +/obj/item/clothing/gloves + species_clothing_color_coords = list(list(BASE_CLOTH_X_1, BASE_CLOTH_Y_1)) + greyscale_config_worn_serpentid_fallback = /datum/greyscale_config/serpentid/gloves + +/obj/item/clothing/glasses + species_clothing_color_coords = list(list(BASE_CLOTH_X_1, BASE_CLOTH_Y_1)) + greyscale_config_worn_serpentid_fallback = /datum/greyscale_config/serpentid/eyes + +/obj/item/clothing/belt + species_clothing_color_coords = list(list(BASE_CLOTH_X_1, BASE_CLOTH_Y_1)) + greyscale_config_worn_serpentid_fallback = /datum/greyscale_config/serpentid/belt + +#undef BASE_CLOTH_X_1 +#undef BASE_CLOTH_Y_1 + +#undef SERPENTID_COLD_THRESHOLD_1 +#undef SERPENTID_COLD_THRESHOLD_2 +#undef SERPENTID_COLD_THRESHOLD_3 + +#undef SERPENTID_HEAT_THRESHOLD_1 +#undef SERPENTID_HEAT_THRESHOLD_2 +#undef SERPENTID_HEAT_THRESHOLD_3 diff --git a/modular_skyrat/modules/emotes/code/dna_screams.dm b/modular_skyrat/modules/emotes/code/dna_screams.dm index ed779a2833f..14ee7de983e 100644 --- a/modular_skyrat/modules/emotes/code/dna_screams.dm +++ b/modular_skyrat/modules/emotes/code/dna_screams.dm @@ -53,3 +53,6 @@ /datum/species/teshari/get_scream_sound(mob/living/carbon/human/teshari) return 'modular_skyrat/modules/emotes/sound/emotes/raptorscream.ogg' + +/datum/species/gas/get_scream_sound(mob/living/carbon/human/serpentid) + return 'modular_skyrat/modules/emotes/sound/emotes/serpentidscream.ogg' diff --git a/modular_skyrat/modules/emotes/code/laugh_datums.dm b/modular_skyrat/modules/emotes/code/laugh_datums.dm index cb1b9042a11..f19effe2286 100644 --- a/modular_skyrat/modules/emotes/code/laugh_datums.dm +++ b/modular_skyrat/modules/emotes/code/laugh_datums.dm @@ -67,3 +67,8 @@ GLOBAL_LIST_EMPTY(laugh_types) name = "Vox Laugh" male_laughsounds = list('modular_zubbers/sound/mobs/humanoids/vox/vox_laugh.ogg') female_laughsounds = null + +/datum/laugh_type/serpentid + name = "Ascent Laugh" + male_laughsounds = list('modular_skyrat/modules/emotes/sound/emotes/serpentidlaugh.ogg') + female_laughsounds = null diff --git a/modular_skyrat/modules/emotes/sound/emotes/angryserpentid.ogg b/modular_skyrat/modules/emotes/sound/emotes/angryserpentid.ogg new file mode 100644 index 00000000000..b6086a16cdf Binary files /dev/null and b/modular_skyrat/modules/emotes/sound/emotes/angryserpentid.ogg differ diff --git a/modular_skyrat/modules/emotes/sound/emotes/serpentidcough.ogg b/modular_skyrat/modules/emotes/sound/emotes/serpentidcough.ogg new file mode 100644 index 00000000000..36779fcf692 Binary files /dev/null and b/modular_skyrat/modules/emotes/sound/emotes/serpentidcough.ogg differ diff --git a/modular_skyrat/modules/emotes/sound/emotes/serpentidlaugh.ogg b/modular_skyrat/modules/emotes/sound/emotes/serpentidlaugh.ogg new file mode 100644 index 00000000000..3f8df21a71b Binary files /dev/null and b/modular_skyrat/modules/emotes/sound/emotes/serpentidlaugh.ogg differ diff --git a/modular_skyrat/modules/emotes/sound/emotes/serpentidscream.ogg b/modular_skyrat/modules/emotes/sound/emotes/serpentidscream.ogg new file mode 100644 index 00000000000..335f3f01b32 Binary files /dev/null and b/modular_skyrat/modules/emotes/sound/emotes/serpentidscream.ogg differ diff --git a/modular_skyrat/modules/emotes/sound/emotes/serpentidsneeze.ogg b/modular_skyrat/modules/emotes/sound/emotes/serpentidsneeze.ogg new file mode 100644 index 00000000000..80b91057bab Binary files /dev/null and b/modular_skyrat/modules/emotes/sound/emotes/serpentidsneeze.ogg differ diff --git a/modular_skyrat/modules/organs/icons/serpentid_eyes.dmi b/modular_skyrat/modules/organs/icons/serpentid_eyes.dmi new file mode 100644 index 00000000000..4658998623c Binary files /dev/null and b/modular_skyrat/modules/organs/icons/serpentid_eyes.dmi differ diff --git a/modular_skyrat/modules/organs/icons/serpentid_organs.dmi b/modular_skyrat/modules/organs/icons/serpentid_organs.dmi new file mode 100644 index 00000000000..e44606f5789 Binary files /dev/null and b/modular_skyrat/modules/organs/icons/serpentid_organs.dmi differ diff --git a/modular_zubbers/code/modules/customization/species/gas/code/actions.dm b/modular_zubbers/code/modules/customization/species/gas/code/actions.dm new file mode 100644 index 00000000000..213cbd3850c --- /dev/null +++ b/modular_zubbers/code/modules/customization/species/gas/code/actions.dm @@ -0,0 +1,84 @@ +/datum/action/cooldown/spell/toggle_eye_shields + name = "Toggle Eye Shields" + desc = "Toggle your protective eye shields." + button_icon = 'modular_zubbers/icons/actions/gas.dmi' + button_icon_state = "gas_eyeshield" + spell_requirements = null + +/datum/action/cooldown/spell/toggle_eye_shields/cast(atom/cast_on) + . = ..() + var/obj/item/organ/eyes/serpentid/eyes = owner?.get_organ_slot(ORGAN_SLOT_EYES) + var/mob/living/carbon/human/human_owner = owner + if(!eyes) + return + if(!eyes.eyes_shielded) + to_chat(owner, span_notice("Nearly opaque lenses slide down to shield your eyes.")) + eyes.eyes_shielded = TRUE + eyes.flash_protect = FLASH_PROTECTION_WELDER_SENSITIVE + owner.overlay_fullscreen("eyeshield", /atom/movable/screen/fullscreen/blind) + human_owner.set_eye_color("#AAAAAA") + human_owner.dna.update_ui_block((/datum/dna_block/identity/eye_colors)) + human_owner.update_body() + else + to_chat(owner, span_notice("Your protective lenses retract out of the way.")) + eyes.eyes_shielded = FALSE + eyes.flash_protect = FLASH_PROTECTION_HYPER_SENSITIVE + owner.clear_fullscreen("eyeshield") + human_owner.set_eye_color(sanitize_hexcolor(human_owner.client?.prefs?.read_preference(/datum/preference/color/eye_color))) + human_owner.dna.update_ui_block(/datum/dna_block/identity/eye_colors) + human_owner.update_body() + +/datum/action/cooldown/spell/toggle_active_camo + name = "Toggle Active Camo" + desc = "Toggle your active camo ability, becoming more translucent." + button_icon = 'modular_zubbers/icons/actions/gas.dmi' + button_icon_state = "gas-cloak-0" + spell_requirements = null + +/datum/action/cooldown/spell/toggle_active_camo/proc/update_button_state(new_state) + button_icon_state = new_state + owner.update_action_buttons() + +/datum/action/cooldown/spell/toggle_active_camo/cast(atom/target) + . = ..() + var/obj/item/organ/heart/serpentid/heart = owner?.get_organ_slot(ORGAN_SLOT_HEART) + heart.toggle_camo(target) + if(heart.camouflaged) + update_button_state("gas-cloak-1") + else + update_button_state("gas-cloak-0") + +/datum/action/cooldown/spell/toggle_threat_display + name = "Toggle Threat Display" + desc = "Toggle your threat display, letting your enemies know that you are ready for a fight!" + button_icon = 'modular_zubbers/icons/actions/gas.dmi' + button_icon_state = "gas-threat" + spell_requirements = null + +/datum/species/gas + var/displaying_threat = FALSE + var/image/threat_overlay + +/datum/action/cooldown/spell/toggle_threat_display/cast(atom/target) + . = ..() + if(!isgas(owner)) + return + var/mob/living/carbon/human/snake_owner = owner + var/datum/species/gas/gas_species = snake_owner.dna.species + if(owner.incapacitated) + to_chat(owner, span_warning("You can't do a threat display in your current state.")) + return + if(gas_species.displaying_threat == FALSE) + gas_species.threat_overlay = image('modular_skyrat/modules/bodyparts/icons/serpentid_parts_greyscale.dmi', "threat", MOB_LAYER) + var/message = tgui_alert(owner, "Would you like to show a scary message?", "Be Scary", list("Yes", "No", "Cancel")) + if(message == "Cancel") + return + else if(message == "Yes") + owner.visible_message(span_warning("\The [owner]'s skin shifts to a deep red colour with dark chevrons running down in an almost hypnotic \ + pattern. Standing tall, [owner.p_they()] strikes, sharp spikes aimed at those threatening [owner.p_them()], claws whooshing through the air past them.")) + playsound(owner.loc, 'modular_skyrat/modules/emotes/sound/emotes/angryserpentid.ogg', 60, 0) + gas_species.displaying_threat = TRUE + snake_owner.add_overlay(gas_species.threat_overlay) + else + snake_owner.cut_overlay(gas_species.threat_overlay) + gas_species.displaying_threat = FALSE diff --git a/modular_zubbers/code/modules/customization/species/gas/code/clothes.dm b/modular_zubbers/code/modules/customization/species/gas/code/clothes.dm new file mode 100644 index 00000000000..6a2197229d4 --- /dev/null +++ b/modular_zubbers/code/modules/customization/species/gas/code/clothes.dm @@ -0,0 +1,3 @@ +/obj/item + /// Icon file for mob worn overylays, if the user is a serpentid + var/icon/worn_icon_gas diff --git a/modular_zubbers/code/modules/customization/species/gas/code/emote.dm b/modular_zubbers/code/modules/customization/species/gas/code/emote.dm new file mode 100644 index 00000000000..01ab72ebbc6 --- /dev/null +++ b/modular_zubbers/code/modules/customization/species/gas/code/emote.dm @@ -0,0 +1,9 @@ +/datum/emote/living/cough/get_sound(mob/living/user) + if(isgas(user)) + return 'modular_skyrat/modules/emotes/sound/emotes/serpentidcough.ogg' + . = ..() + +/datum/emote/living/sneeze/get_sound(mob/living/user) + if(isgas(user)) + return 'modular_skyrat/modules/emotes/sound/emotes/serpentidsneeze.ogg' + . = ..() diff --git a/modular_zubbers/code/modules/emotes/scream_datums.dm b/modular_zubbers/code/modules/emotes/scream_datums.dm index 38d2a1bbb1f..237fbff4c81 100644 --- a/modular_zubbers/code/modules/emotes/scream_datums.dm +++ b/modular_zubbers/code/modules/emotes/scream_datums.dm @@ -7,3 +7,8 @@ name = "Slug Scream" male_screamsounds = list('modular_zubbers/sound/emotes/screams/slug_scream.ogg') // From Splurt, further credit to https://www.youtube.com/watch?v=AdGk4PHQDOE female_screamsounds = null + +/datum/scream_type/serpentid + name = "Ascent Scream" + male_screamsounds = list('modular_skyrat/modules/emotes/sound/emotes/serpentidscream.ogg') + female_screamsounds = null diff --git a/modular_zubbers/icons/actions/gas.dmi b/modular_zubbers/icons/actions/gas.dmi new file mode 100644 index 00000000000..1785b220137 Binary files /dev/null and b/modular_zubbers/icons/actions/gas.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 4d63e298d3f..a44949c11fd 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -526,6 +526,7 @@ #include "code\__DEFINES\~~bubber_defines\economy.dm" #include "code\__DEFINES\~~bubber_defines\experisci.dm" #include "code\__DEFINES\~~bubber_defines\footsteps.dm" +#include "code\__DEFINES\~~bubber_defines\gas_clothing_paths.dm" #include "code\__DEFINES\~~bubber_defines\guns.dm" #include "code\__DEFINES\~~bubber_defines\hud.dm" #include "code\__DEFINES\~~bubber_defines\item.dm" @@ -7518,6 +7519,7 @@ #include "modular_skyrat\modules\bodyparts\code\parts.dm" #include "modular_skyrat\modules\bodyparts\code\podperson_bodyparts.dm" #include "modular_skyrat\modules\bodyparts\code\roundstartslime_bodyparts.dm" +#include "modular_skyrat\modules\bodyparts\code\serpentid_bodyparts.dm" #include "modular_skyrat\modules\bodyparts\code\skrell_bodyparts.dm" #include "modular_skyrat\modules\bodyparts\code\slime_bodyparts.dm" #include "modular_skyrat\modules\bodyparts\code\snail_bodyparts.dm" @@ -7876,6 +7878,7 @@ #include "modular_skyrat\modules\customization\modules\mob\living\carbon\human\species\mushpeople.dm" #include "modular_skyrat\modules\customization\modules\mob\living\carbon\human\species\placeholder_helper.dm" #include "modular_skyrat\modules\customization\modules\mob\living\carbon\human\species\podweak.dm" +#include "modular_skyrat\modules\customization\modules\mob\living\carbon\human\species\serpentid.dm" #include "modular_skyrat\modules\customization\modules\mob\living\carbon\human\species\skrell.dm" #include "modular_skyrat\modules\customization\modules\mob\living\carbon\human\species\tajaran.dm" #include "modular_skyrat\modules\customization\modules\mob\living\carbon\human\species\unathi.dm" @@ -9365,6 +9368,9 @@ #include "modular_zubbers\code\modules\customization\modules\client\augment\limbs.dm" #include "modular_zubbers\code\modules\customization\modules\reagents\drink_reagents.dm" #include "modular_zubbers\code\modules\customization\quad_eyes\preferences.dm" +#include "modular_zubbers\code\modules\customization\species\gas\code\actions.dm" +#include "modular_zubbers\code\modules\customization\species\gas\code\clothes.dm" +#include "modular_zubbers\code\modules\customization\species\gas\code\emote.dm" #include "modular_zubbers\code\modules\customization\species\lycans\__DEFINES.dm" #include "modular_zubbers\code\modules\customization\species\lycans\_cursekin_species.dm" #include "modular_zubbers\code\modules\customization\species\lycans\_lycan_species.dm"