diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm
index f732287cf8..4a3618e941 100644
--- a/code/__DEFINES/DNA.dm
+++ b/code/__DEFINES/DNA.dm
@@ -81,9 +81,6 @@
#define DNA_MUTANTTAIL_BLOCK 17
#define DNA_MUTANTWING_BLOCK 18
#define DNA_WINGCOLOR_BLOCK 19
-//#define DNA_SUBSPECIES_BLOCK 20
-//#define DNA_TAUR_BLOCK 21 //Taurs will be tails for now, easier - Pooj
-
#define DNA_STRUC_ENZYMES_BLOCKS 19
#define DNA_UNIQUE_ENZYMES_LEN 32
@@ -128,9 +125,9 @@
#define EASYLIMBATTACHMENT 23
#define TOXINLOVER 24
#define DIGITIGRADE 25 //Uses weird leg sprites. Optional for Lizards, required for ashwalkers. Don't give it to other races unless you make sprites for this (see human_parts_greyscale.dmi)
-#define MUTCOLORS2 26
-#define MUTCOLORS3 27
+#define NO_UNDERWEAR 26
+#define MUTCOLORS2 27
+#define MUTCOLORS3 28
//citadel code
-#define NOAROUSAL 28//Stops all arousal effects
-#define NOGENITALS 29//Cannot create, use, or otherwise have genitals
-//#define SUBSPECIES 28
\ No newline at end of file
+#define NOAROUSAL 29//Stops all arousal effects
+#define NOGENITALS 30//Cannot create, use, or otherwise have genitals
\ No newline at end of file
diff --git a/code/datums/wires/explosive.dm b/code/datums/wires/explosive.dm
index 0b75d86905..0715867fe6 100644
--- a/code/datums/wires/explosive.dm
+++ b/code/datums/wires/explosive.dm
@@ -13,16 +13,16 @@
/datum/wires/explosive/c4
- holder_type = /obj/item/weapon/grenade/plastic/c4
+ holder_type = /obj/item/weapon/grenade/plastic/c4
randomize = TRUE //Same behaviour since no wire actually disarms it
/datum/wires/explosive/c4/interactable(mob/user)
- var/obj/item/weapon/grenade/plastic/c4/P = holder
+ var/obj/item/weapon/grenade/plastic/c4/P = holder
if(P.open_panel)
return TRUE
/datum/wires/explosive/c4/explode()
- var/obj/item/weapon/grenade/plastic/c4/P = holder
+ var/obj/item/weapon/grenade/plastic/c4/P = holder
P.explode()
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index 6cb89ecaf3..14e4f5a01c 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -118,9 +118,9 @@ GLOBAL_LIST_INIT(xeno_recipes, list ( \
var/wetness = 30 //Reduced when exposed to high temperautres
var/drying_threshold_temperature = 500 //Kelvin to start drying
-/*
- * Leather SHeet
- */
+/*
+ * Leather SHeet
+ */
/obj/item/stack/sheet/leather
name = "leather"
desc = "The by-product of mob grinding."
@@ -128,24 +128,24 @@ GLOBAL_LIST_INIT(xeno_recipes, list ( \
icon_state = "sheet-leather"
origin_tech = "materials=2"
-GLOBAL_LIST_INIT(leather_recipes, list ( \
- new/datum/stack_recipe("wallet", /obj/item/weapon/storage/wallet, 1), \
- new/datum/stack_recipe("muzzle", /obj/item/clothing/mask/muzzle, 2), \
- new/datum/stack_recipe("botany gloves", /obj/item/clothing/gloves/botanic_leather, 3), \
- new/datum/stack_recipe("toolbelt", /obj/item/weapon/storage/belt/utility, 4), \
- new/datum/stack_recipe("leather satchel", /obj/item/weapon/storage/backpack/satchel, 5), \
- new/datum/stack_recipe("bandolier", /obj/item/weapon/storage/belt/bandolier, 5), \
- new/datum/stack_recipe("leather jacket", /obj/item/clothing/suit/jacket/leather, 7), \
- new/datum/stack_recipe("leather overcoat", /obj/item/clothing/suit/jacket/leather/overcoat, 10), \
-))
-
-/obj/item/stack/sheet/leather/Initialize(mapload, new_amount, merge = TRUE)
- recipes = GLOB.leather_recipes
- return ..()
-
-/*
- * Sinew
- */
+GLOBAL_LIST_INIT(leather_recipes, list ( \
+ new/datum/stack_recipe("wallet", /obj/item/weapon/storage/wallet, 1), \
+ new/datum/stack_recipe("muzzle", /obj/item/clothing/mask/muzzle, 2), \
+ new/datum/stack_recipe("botany gloves", /obj/item/clothing/gloves/botanic_leather, 3), \
+ new/datum/stack_recipe("toolbelt", /obj/item/weapon/storage/belt/utility, 4), \
+ new/datum/stack_recipe("leather satchel", /obj/item/weapon/storage/backpack/satchel, 5), \
+ new/datum/stack_recipe("bandolier", /obj/item/weapon/storage/belt/bandolier, 5), \
+ new/datum/stack_recipe("leather jacket", /obj/item/clothing/suit/jacket/leather, 7), \
+ new/datum/stack_recipe("leather overcoat", /obj/item/clothing/suit/jacket/leather/overcoat, 10), \
+))
+
+/obj/item/stack/sheet/leather/Initialize(mapload, new_amount, merge = TRUE)
+ recipes = GLOB.leather_recipes
+ return ..()
+
+/*
+ * Sinew
+ */
/obj/item/stack/sheet/sinew
name = "watcher sinew"
icon = 'icons/obj/mining.dmi'
@@ -157,12 +157,12 @@ GLOBAL_LIST_INIT(leather_recipes, list ( \
GLOBAL_LIST_INIT(sinew_recipes, list ( \
new/datum/stack_recipe("sinew restraints", /obj/item/weapon/restraints/handcuffs/sinew, 1, on_floor = 1), \
-))
+))
/obj/item/stack/sheet/sinew/Initialize(mapload, new_amount, merge = TRUE)
recipes = GLOB.sinew_recipes
return ..()
-
+
/*
* Plates
*/
@@ -229,4 +229,4 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \
var/obj/item/stack/sheet/leather/HS = new(src.loc)
HS.amount = 1
wetness = initial(wetness)
- src.use(1)
+ src.use(1)
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 64e2a5e8fd..5b1c641383 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -296,7 +296,7 @@
/obj/item/weapon/lighter,
/obj/item/device/multitool,
/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov,
- /obj/item/weapon/grenade/plastic/c4,
+ /obj/item/weapon/grenade/plastic/c4,
)
/obj/item/weapon/storage/belt/grenade/full/PopulateContents()
new /obj/item/weapon/grenade/flashbang(src)
diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm
index c072c052e5..6c8edec9f8 100644
--- a/code/game/objects/structures/dresser.dm
+++ b/code/game/objects/structures/dresser.dm
@@ -12,6 +12,10 @@
if(ishuman(user))
var/mob/living/carbon/human/H = user
+ if(H.dna && H.dna.species && (NO_UNDERWEAR in H.dna.species.species_traits))
+ to_chat(user, "You are not capable of wearing underwear.")
+ return
+
var/choice = input(user, "Underwear, Undershirt, or Socks?", "Changing") as null|anything in list("Underwear","Undershirt","Socks")
if(!Adjacent(user))
@@ -32,4 +36,4 @@
H.socks= new_socks
add_fingerprint(H)
- H.update_body()
\ No newline at end of file
+ H.update_body()
diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm
index 71b1355ef5..8675049cee 100644
--- a/code/modules/mob/dead/observer/say.dm
+++ b/code/modules/mob/dead/observer/say.dm
@@ -1,25 +1,25 @@
-/mob/dead/observer/say(message)
- message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
-
- if (!message)
- return
-
- log_say("Ghost/[src.key] : [message]")
-
- . = src.say_dead(message)
-
-/mob/dead/observer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
- var/atom/movable/to_follow = speaker
- if(radio_freq)
- var/atom/movable/virtualspeaker/V = speaker
-
- if(isAI(V.source))
- var/mob/living/silicon/ai/S = V.source
- to_follow = S.eyeobj
- else
- to_follow = V.source
- var/link = FOLLOW_LINK(src, to_follow)
- // Recompose the message, because it's scrambled by default
- message = compose_message(speaker, message_language, raw_message, radio_freq, spans)
- to_chat(src, "[link] [message]")
-
+/mob/dead/observer/say(message)
+ message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
+
+ if (!message)
+ return
+
+ log_say("Ghost/[src.key] : [message]")
+
+ . = src.say_dead(message)
+
+/mob/dead/observer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
+ var/atom/movable/to_follow = speaker
+ if(radio_freq)
+ var/atom/movable/virtualspeaker/V = speaker
+
+ if(isAI(V.source))
+ var/mob/living/silicon/ai/S = V.source
+ to_follow = S.eyeobj
+ else
+ to_follow = V.source
+ var/link = FOLLOW_LINK(src, to_follow)
+ // Recompose the message, because it's scrambled by default
+ message = compose_message(speaker, message_language, raw_message, radio_freq, spans)
+ to_chat(src, "[link] [message]")
+
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 9be254e4bc..b3f436ec68 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -368,23 +368,23 @@
standing += eye_overlay
//Underwear, Undershirts & Socks
- if(H.underwear)
- var/datum/sprite_accessory/underwear/underwear = GLOB.underwear_list[H.underwear]
- if(underwear)
- standing += mutable_appearance(underwear.icon, underwear.icon_state, -BODY_LAYER)
+ if(!(NO_UNDERWEAR in species_traits))
+ if(H.underwear)
+ var/datum/sprite_accessory/underwear/underwear = GLOB.underwear_list[H.underwear]
+ if(underwear)
+ standing += mutable_appearance(underwear.icon, underwear.icon_state, -BODY_LAYER)
- if(H.undershirt)
- var/datum/sprite_accessory/undershirt/undershirt = GLOB.undershirt_list[H.undershirt]
- if(undershirt)
- if(H.dna.species.sexes && H.gender == FEMALE)
- standing += wear_female_version(undershirt.icon_state, undershirt.icon, BODY_LAYER)
- else
- standing += mutable_appearance(undershirt.icon, undershirt.icon_state, -BODY_LAYER)
-
- if(H.socks && H.get_num_legs() >= 2 && !(DIGITIGRADE in species_traits))
- var/datum/sprite_accessory/socks/socks = GLOB.socks_list[H.socks]
- if(socks)
- standing += mutable_appearance(socks.icon, socks.icon_state, -BODY_LAYER)
+ if(H.undershirt)
+ var/datum/sprite_accessory/undershirt/undershirt = GLOB.undershirt_list[H.undershirt]
+ if(undershirt)
+ if(H.dna.species.sexes && H.gender == FEMALE)
+ standing += wear_female_version(undershirt.icon_state, undershirt.icon, BODY_LAYER)
+ else
+ standing += mutable_appearance(undershirt.icon, undershirt.icon_state, -BODY_LAYER)
+ if(H.socks && H.get_num_legs() >= 2 && !(DIGITIGRADE in species_traits))
+ var/datum/sprite_accessory/socks/socks = GLOB.socks_list[H.socks]
+ if(socks)
+ standing += mutable_appearance(socks.icon, socks.icon_state, -BODY_LAYER)
if(standing.len)
H.overlays_standing[BODY_LAYER] = standing
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index 65bfaf3fd5..741ceef951 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -2,14 +2,14 @@
// Animated beings of stone. They have increased defenses, and do not need to breathe. They're also slow as fuuuck.
name = "Golem"
id = "iron golem"
- species_traits = list(NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS)
+ species_traits = list(NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS,NO_UNDERWEAR)
speedmod = 2
armor = 55
siemens_coeff = 0
punchdamagelow = 5
punchdamagehigh = 14
punchstunthreshold = 11 //about 40% chance to stun
- no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_w_uniform, slot_s_store)
+ no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_w_uniform)
nojumpsuit = 1
sexes = 1
damage_overlay_type = ""
@@ -20,7 +20,6 @@
dangerous_existence = TRUE
limbs_id = "golem"
fixed_mut_color = "aaa"
- mutant_organs = list(/obj/item/organ/adamantine_resonator)
var/info_text = "As an Iron Golem, you don't have any special traits."
var/prefix = "Iron"
@@ -55,9 +54,8 @@
name = "Adamantine Golem"
id = "adamantine golem"
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem/adamantine
- mutant_organs = list(/obj/item/organ/adamantine_resonator, /obj/item/organ/vocal_cords/adamantine)
fixed_mut_color = "4ed"
- info_text = "As an Adamantine Golem, you possess special vocal cords allowing you to \"resonate\" messages to all golems."
+ info_text = "As an Adamantine Golem, you don't have any special traits."
prefix = "Adamantine"
//Explodes on death
@@ -67,7 +65,7 @@
fixed_mut_color = "a3d"
meat = /obj/item/weapon/ore/plasma
//Can burn and takes damage from heat
- species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS)
+ species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS,NO_UNDERWEAR)
info_text = "As a Plasma Golem, you explode on death!"
burnmod = 1.5
prefix = "Plasma"
@@ -196,7 +194,7 @@
fixed_mut_color = "49311c"
meat = /obj/item/stack/sheet/mineral/wood
//Can burn and take damage from heat
- species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS)
+ species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER,MUTCOLORS,NO_UNDERWEAR)
armor = 30
burnmod = 1.25
heatmod = 1.5
@@ -506,7 +504,7 @@
limbs_id = "cultgolem"
sexes = FALSE
info_text = "As a Runic Golem, you possess eldritch powers granted by the Elder God Nar'Sie."
- species_traits = list(NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER) //no mutcolors
+ species_traits = list(NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER,NO_UNDERWEAR) //no mutcolors
prefix = "Runic"
var/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/golem/phase_shift
@@ -555,7 +553,7 @@
limbs_id = "clothgolem"
sexes = FALSE
info_text = "As a Cloth Golem, you are able to reform yourself after death, provided your remains aren't burned or destroyed. You are, of course, very flammable."
- species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER) //no mutcolors, and can burn
+ species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER,NO_UNDERWEAR) //no mutcolors, and can burn
armor = 15 //feels no pain, but not too resistant
burnmod = 2 // don't get burned
speedmod = 1 // not as heavy as stone
@@ -645,8 +643,8 @@
if(P.is_hot())
visible_message("[src] bursts into flames!")
-
fire_act()
+
/datum/species/golem/plastic
name = "Plastic"
id = "plastic golem"