GAS: Giant Armored Serpentids (Snake Bugs) (#5139)

## About The Pull Request
**The majority of the work was done by Ozzo in #1471.**

GAS are snake bugs hailing from Baystation 12. 

- They hate the heat, but are durable against low-pressure environments
and the cold.
- They cannot wear suits and most clothes, but have built in armor (it's
in their name).
- It is harder to grab GAS.
- They are taller than the average spaceman.


https://github.com/user-attachments/assets/f9ac1078-0d41-4a26-850f-26a2cd7bbf01

They currently have no lore or species description, but plans are in the
works for both to be made.
## Why It's Good For The Game
It's a new species that was well-recieved when it was tested the first
time around, before being lost due to a lack of work on it. I am here to
continue work on it and add new features to it if they are requested by
the person that wanted them.
## Proof Of Testing
It compiled and ran, hence me being able to take the video. There were
no runtimes. I attached an image of a stylish GAS as further proof of
testing.
<details>
<summary>Screenshots/Videos</summary>
<img width="137" height="111" alt="image"
src="https://github.com/user-attachments/assets/4b2ddd78-9312-4f0e-bbac-37bd51290490"
/>
</details>

## Changelog
🆑
add: Added a new species: Giant Armored Serpentids (GAS)!
/🆑
This commit is contained in:
Alexis
2026-02-26 17:31:43 +01:00
committed by GitHub
parent c02a3edd37
commit e458eaee4a
43 changed files with 612 additions and 0 deletions
+1
View File
@@ -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"
@@ -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'
+2
View File
@@ -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'
@@ -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))
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

+1
View File
@@ -425,6 +425,7 @@ ROUNDSTART_RACES lesser_abductor
ROUNDSTART_RACES zombie
ROUNDSTART_RACES protean
ROUNDSTART_RACES cursekin
ROUNDSTART_RACES serpentid
##-------------------------------------------------------------------------------------------
Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 636 B

@@ -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
*/
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

@@ -0,0 +1,10 @@
{
"": [
{
"type": "icon_state",
"icon_state": "belt",
"blend_mode": "overlay",
"color_ids": [ 1 ]
}
]
}
@@ -0,0 +1,10 @@
{
"": [
{
"type": "icon_state",
"icon_state": "eyes",
"blend_mode": "overlay",
"color_ids": [ 1 ]
}
]
}
@@ -0,0 +1,10 @@
{
"": [
{
"type": "icon_state",
"icon_state": "gloves",
"blend_mode": "overlay",
"color_ids": [ 1 ]
}
]
}
@@ -0,0 +1,10 @@
{
"": [
{
"type": "icon_state",
"icon_state": "poncho",
"blend_mode": "overlay",
"color_ids": [ 1 ]
}
]
}
@@ -0,0 +1,10 @@
{
"": [
{
"type": "icon_state",
"icon_state": "uniform",
"blend_mode": "overlay",
"color_ids": [ 1 ]
}
]
}
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

@@ -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"
@@ -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
@@ -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'
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 886 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

@@ -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
@@ -0,0 +1,3 @@
/obj/item
/// Icon file for mob worn overylays, if the user is a serpentid
var/icon/worn_icon_gas
@@ -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'
. = ..()
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

+6
View File
@@ -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"