"+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!"))
@@ -1183,8 +1181,7 @@
if(!heart_attack)
return
else
- if(losebreath < 3)
- losebreath += 2
+ AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3)
adjustOxyLoss(5)
adjustBruteLoss(1)
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 72e6ff63314..26ca4af83e8 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -142,7 +142,7 @@
message = uppertext(message)
verb = "yells loudly"
- if(locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs)
+ if((COMIC in mutations) || (locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs))
message = "[message]"
returns[1] = message
diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm
index d8434a87223..49d6d7fe245 100644
--- a/code/modules/mob/living/carbon/human/species/plasmaman.dm
+++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm
@@ -189,7 +189,7 @@
if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit
H.Paralyse(3) // 3 gives them one second to wake up and run away a bit!
if(SA_pp > SA_sleep_min) // Enough to make us sleep as well
- H.sleeping = min(H.sleeping+2, 10)
+ H.AdjustSleeping(2, bound_lower = 0, bound_upper = 10)
else if(SA_pp > 0.15) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning
if(prob(20))
spawn(0)
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 33aa58b94d4..7b91d51261c 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -120,11 +120,11 @@
var/female_scream_sound = 'sound/goonstation/voice/female_scream.ogg'
//Default hair/headacc style vars.
- var/default_hair = "Bald" //Default hair style for newly created humans unless otherwise set.
+ var/default_hair //Default hair style for newly created humans unless otherwise set.
var/default_hair_colour
- var/default_fhair = "Shaved" //Default facial hair style for newly created humans unless otherwise set.
+ var/default_fhair //Default facial hair style for newly created humans unless otherwise set.
var/default_fhair_colour
- var/default_headacc = "None" //Default head accessory style for newly created humans unless otherwise set.
+ var/default_headacc //Default head accessory style for newly created humans unless otherwise set.
var/default_headacc_colour
//Defining lists of icon skin tones for species that have them.
@@ -332,7 +332,7 @@
if(SA_pp > atmos_requirements["sa_para"]) // Enough to make us paralysed for a bit
H.Paralyse(3) // 3 gives them one second to wake up and run away a bit!
if(SA_pp > atmos_requirements["sa_sleep"]) // Enough to make us sleep as well
- H.sleeping = max(H.sleeping + 2, 10)
+ H.AdjustSleeping(2, bound_lower = 0, bound_upper = 10)
else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning
if(prob(20))
spawn(0)
@@ -509,7 +509,7 @@
if(tinted_weldhelh)
H.overlay_fullscreen("tint", /obj/screen/fullscreen/impaired, 2)
if(H.tinttotal >= TINT_BLIND)
- H.eye_blind = max(H.eye_blind, 1)
+ H.EyeBlind(1)
else
H.clear_fullscreen("tint")
diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm
index 924a7c03bf4..1a6c8254a3e 100644
--- a/code/modules/mob/living/carbon/human/species/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station.dm
@@ -8,7 +8,7 @@
language = "Sol Common"
flags = HAS_LIPS | CAN_BE_FAT
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = HAS_SKIN_TONE
+ bodyflags = HAS_SKIN_TONE | HAS_BODY_MARKINGS
dietflags = DIET_OMNI
unarmed_type = /datum/unarmed_attack/punch
blurb = "Humanity originated in the Sol system, and over the last five centuries has spread \
@@ -40,7 +40,7 @@
flags = HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = FEET_CLAWS | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING
+ bodyflags = FEET_CLAWS | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_BODY_MARKINGS | HAS_HEAD_MARKINGS | HAS_SKIN_COLOR | HAS_ALT_HEADS | TAIL_WAGGING
dietflags = DIET_CARN
cold_level_1 = 280 //Default 260 - Lower is better
@@ -112,13 +112,11 @@
flags = HAS_LIPS | CAN_BE_FAT
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING | HAS_FUR
+ bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING | HAS_FUR
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
flesh_color = "#AFA59E"
- base_color = "#333333"
- //Default styles for created mobs.
- default_headacc = "Tajaran Ears"
+ base_color = "#424242"
butt_sprite = "tajaran"
has_organ = list(
@@ -164,11 +162,11 @@
flags = HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING | HAS_FUR
+ bodyflags = FEET_PADDED | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | HAS_FUR
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
flesh_color = "#966464"
- base_color = "#B43214"
+ base_color = "#CF4D2F"
butt_sprite = "vulp"
has_organ = list(
@@ -212,7 +210,7 @@
flags = HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = HAS_SKIN_COLOR
+ bodyflags = HAS_SKIN_COLOR | HAS_BODY_MARKINGS
dietflags = DIET_HERB
flesh_color = "#8CD7A3"
blood_color = "#1D2CBF"
@@ -287,7 +285,7 @@
flags = NO_SCAN | IS_WHITELISTED
clothing_flags = HAS_SOCKS
dietflags = DIET_OMNI
- bodyflags = HAS_ICON_SKIN_TONE | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED
+ bodyflags = HAS_ICON_SKIN_TONE | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_BODY_MARKINGS | HAS_TAIL_MARKINGS
blood_color = "#2299FC"
flesh_color = "#808D11"
@@ -705,6 +703,7 @@
flags = IS_WHITELISTED | HAS_LIPS | CAN_BE_FAT
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
+ bodyflags = HAS_BODY_MARKINGS
dietflags = DIET_HERB
reagent_tag = PROCESS_ORG
blood_color = "#A200FF"
@@ -855,7 +854,7 @@
flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA | NO_POISON | RADIMMUNE | ALL_RPARTS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = HAS_SKIN_COLOR | HAS_MARKINGS | HAS_HEAD_ACCESSORY
+ bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY
dietflags = 0 //IPCs can't eat, so no diet
blood_color = "#1F181F"
flesh_color = "#AAAAAA"
@@ -946,7 +945,7 @@
flags = IS_WHITELISTED | HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT
- bodyflags = FEET_CLAWS | HAS_SKIN_TONE
+ bodyflags = FEET_CLAWS | HAS_SKIN_TONE | HAS_BODY_MARKINGS
dietflags = DIET_OMNI
cold_level_1 = -1 //Default 260 - Lower is better
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 8f7ed81a5fa..037e5234d27 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -212,15 +212,15 @@ var/global/list/damage_icon_parts = list()
if(update_icons) update_icons()
//BASE MOB SPRITE
-/mob/living/carbon/human/proc/update_body(var/update_icons=1)
+/mob/living/carbon/human/proc/update_body(var/update_icons=1, var/rebuild_base=0)
var/husk_color_mod = rgb(96,88,80)
var/hulk_color_mod = rgb(48,224,40)
- var/husk = (HUSK in src.mutations)
- var/fat = (FAT in src.mutations)
- var/hulk = (HULK in src.mutations)
- var/skeleton = (SKELETON in src.mutations)
+ var/husk = (HUSK in mutations)
+ var/fat = (FAT in mutations)
+ var/hulk = (HULK in mutations)
+ var/skeleton = (SKELETON in mutations)
if(species && species.bodyflags & HAS_ICON_SKIN_TONE)
species.updatespeciescolor(src)
@@ -262,7 +262,7 @@ var/global/list/damage_icon_parts = list()
icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]"
var/icon/base_icon
- if(human_icon_cache[icon_key])
+ if(human_icon_cache[icon_key] && !rebuild_base)
base_icon = human_icon_cache[icon_key]
else
//BEGIN CACHED ICON GENERATION.
@@ -309,7 +309,7 @@ var/global/list/damage_icon_parts = list()
//END CACHED ICON GENERATION.
stand_icon.Blend(base_icon,ICON_OVERLAY)
- if(src.species.bodyflags & TAIL_OVERLAPPED) // If the user's species is flagged to have a tail that needs to be overlapped by limbs...
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the user's species is flagged to have a tail that needs to be overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
overlays_standing[LIMBS_LAYER] = image(stand_icon) // Diverts limbs to their own layer so they can overlay things (i.e. tails).
else
overlays_standing[LIMBS_LAYER] = null // So we don't get the old species' sprite splatted on top of the new one's
@@ -360,29 +360,32 @@ var/global/list/damage_icon_parts = list()
//MARKINGS OVERLAY
/mob/living/carbon/human/proc/update_markings(var/update_icons=1)
- //Reset our markings
+ //Reset our markings.
overlays_standing[MARKINGS_LAYER] = null
+ //Base icon.
+ var/icon/markings_standing = new/icon('icons/mob/body_accessory.dmi',"accessory_none_s")
+
+ //Body markings.
var/obj/item/organ/external/chest/chest_organ = get_organ("chest")
- if(!chest_organ || chest_organ.is_stump() || (chest_organ.status & ORGAN_DESTROYED) )
- if(update_icons) update_icons()
- return
-
- //base icons
- var/icon/markings_standing = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
-
- if(m_style && m_style != "None")
- var/datum/sprite_accessory/marking_style = marking_styles_list[m_style]
- if(marking_style)
- var/obj/item/organ/external/head/head_organ = get_organ("head")
- if((!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED)) && marking_style.marking_location == "head")
- return //If the head is destroyed and it is the organ the marking is located on, get us out of here. This prevents floating optical markings on decapitated IPCs, for example.
- var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s")
- if(marking_style.do_colouration)
- markings_s.Blend(rgb(r_markings, g_markings, b_markings), ICON_ADD)
- markings_standing.Blend(markings_s, ICON_OVERLAY)
- else
- //warning("Invalid m_style for [species.name]: [m_style]")
+ if(chest_organ && !chest_organ.is_stump() && !(chest_organ.status & ORGAN_DESTROYED) && m_styles["body"])
+ var/body_marking = m_styles["body"]
+ var/datum/sprite_accessory/body_marking_style = marking_styles_list[body_marking]
+ if(body_marking_style && body_marking_style.species_allowed && (species.name in body_marking_style.species_allowed))
+ var/icon/b_marking_s = new/icon("icon" = body_marking_style.icon, "icon_state" = "[body_marking_style.icon_state]_s")
+ if(body_marking_style.do_colouration)
+ b_marking_s.Blend(m_colours["body"], ICON_ADD)
+ markings_standing.Blend(b_marking_s, ICON_OVERLAY)
+ //Head markings.
+ var/obj/item/organ/external/head/head_organ = get_organ("head")
+ if(head_organ && !head_organ.is_stump() && !(head_organ.status & ORGAN_DESTROYED) && m_styles["head"]) //If the head is destroyed, forget the head markings. This prevents floating optical markings on decapitated IPCs, for example.
+ var/head_marking = m_styles["head"]
+ var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
+ if(head_marking_style && head_marking_style.species_allowed && (head_organ.species.name in head_marking_style.species_allowed))
+ var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s")
+ if(head_marking_style.do_colouration)
+ h_marking_s.Blend(m_colours["head"], ICON_ADD)
+ markings_standing.Blend(h_marking_s, ICON_OVERLAY)
overlays_standing[MARKINGS_LAYER] = image(markings_standing)
@@ -399,7 +402,7 @@ var/global/list/damage_icon_parts = list()
return
//masks and helmets can obscure our head accessory
- if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
+ if((head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
if(update_icons) update_icons()
return
@@ -426,15 +429,15 @@ var/global/list/damage_icon_parts = list()
//HAIR OVERLAY
/mob/living/carbon/human/proc/update_hair(var/update_icons=1)
//Reset our hair
- overlays_standing[HAIR_LAYER] = null
+ overlays_standing[HAIR_LAYER] = null
var/obj/item/organ/external/head/head_organ = get_organ("head")
- if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED) )
+ if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED))
if(update_icons) update_icons()
return
//masks and helmets can obscure our hair, unless we're a synthetic
- if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
+ if((head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
if(update_icons) update_icons()
return
@@ -454,13 +457,19 @@ var/global/list/damage_icon_parts = list()
else if(hair_style.do_colouration)
hair_s.Blend(rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair), ICON_ADD)
+ if(hair_style.secondary_theme)
+ var/icon/hair_secondary_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_[hair_style.secondary_theme]_s")
+ if(!hair_style.no_sec_colour)
+ hair_secondary_s.Blend(rgb(head_organ.r_hair_sec, head_organ.g_hair_sec, head_organ.b_hair_sec), ICON_ADD)
+ hair_s.Blend(hair_secondary_s, ICON_OVERLAY)
+
hair_standing = hair_s //hair_standing.Blend(hair_s, ICON_OVERLAY)
//Having it this way preserves animations. Useful for IPC screens.
else
//warning("Invalid h_style for [species.name]: [h_style]")
//hair_standing.Blend(debrained_s, ICON_OVERLAY)//how does i overlay for fish?
- overlays_standing[HAIR_LAYER] = image(hair_standing)
+ overlays_standing[HAIR_LAYER] = image(hair_standing)
if(update_icons) update_icons()
@@ -468,15 +477,15 @@ var/global/list/damage_icon_parts = list()
//FACIAL HAIR OVERLAY
/mob/living/carbon/human/proc/update_fhair(var/update_icons=1)
//Reset our facial hair
- overlays_standing[FHAIR_LAYER] = null
+ overlays_standing[FHAIR_LAYER] = null
var/obj/item/organ/external/head/head_organ = get_organ("head")
- if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED) )
+ if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED))
if(update_icons) update_icons()
return
//masks and helmets can obscure our facial hair, unless we're a synthetic
- if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
+ if((head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
if(update_icons) update_icons()
return
@@ -492,11 +501,18 @@ var/global/list/damage_icon_parts = list()
facial_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_AND)
else if(facial_hair_style.do_colouration)
facial_s.Blend(rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial), ICON_ADD)
+
+ if(facial_hair_style.secondary_theme)
+ var/icon/facial_secondary_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_[facial_hair_style.secondary_theme]_s")
+ if(!facial_hair_style.no_sec_colour)
+ facial_secondary_s.Blend(rgb(head_organ.r_facial_sec, head_organ.g_facial_sec, head_organ.b_facial_sec), ICON_ADD)
+ facial_s.Blend(facial_secondary_s, ICON_OVERLAY)
+
face_standing.Blend(facial_s, ICON_OVERLAY)
else
//warning("Invalid f_style for [species.name]: [f_style]")
- overlays_standing[FHAIR_LAYER] = image(face_standing)
+ overlays_standing[FHAIR_LAYER] = image(face_standing)
if(update_icons) update_icons()
@@ -536,7 +552,7 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/proc/update_mutantrace(var/update_icons=1)
//BS12 EDIT
- var/skel = (SKELETON in src.mutations)
+ var/skel = (SKELETON in mutations)
if(skel)
skeleton = 'icons/mob/human_races/r_skeleton.dmi'
else
@@ -562,7 +578,7 @@ var/global/list/damage_icon_parts = list()
..()
if(notransform) return
update_mutations(0)
- update_body(0)
+ update_body(0, 1) //Update the body and force limb icon regeneration.
update_hair(0)
update_head_accessory(0)
update_fhair(0)
@@ -997,13 +1013,21 @@ var/global/list/damage_icon_parts = list()
if(inv)
inv.update_icon()
if(wear_mask && (istype(wear_mask, /obj/item/clothing/mask) || istype(wear_mask, /obj/item/clothing/accessory)))
+ var/obj/item/organ/external/head/head_organ = get_organ("head")
+ var/datum/sprite_accessory/alt_heads/alternate_head
+ if(head_organ.alt_head && head_organ.alt_head != "None")
+ alternate_head = alt_heads_list[head_organ.alt_head]
+
var/image/standing
+ var/icon/mask_icon = new(wear_mask.icon)
if(wear_mask.icon_override)
- standing = image("icon" = wear_mask.icon_override, "icon_state" = "[wear_mask.icon_state]")
+ mask_icon = new(wear_mask.icon_override)
+ standing = image("icon" = wear_mask.icon_override, "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]")
else if(wear_mask.sprite_sheets && wear_mask.sprite_sheets[species.name])
- standing = image("icon" = wear_mask.sprite_sheets[species.name], "icon_state" = "[wear_mask.icon_state]")
+ mask_icon = new(wear_mask.sprite_sheets[species.name])
+ standing = image("icon" = wear_mask.sprite_sheets[species.name], "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]")
else
- standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state]")
+ standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]")
if(!istype(wear_mask, /obj/item/clothing/mask/cigarette) && wear_mask.blood_DNA)
var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "maskblood")
@@ -1053,7 +1077,7 @@ var/global/list/damage_icon_parts = list()
clear_alert("legcuffed")
if(legcuffed)
overlays_standing[LEGCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "legcuff1")
- throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = src.legcuffed)
+ throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed)
if(m_intent != "walk")
m_intent = "walk"
if(hud_used && hud_used.move_intent)
@@ -1121,71 +1145,66 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/proc/update_tail_layer(var/update_icons=1)
overlays_standing[TAIL_UNDERLIMBS_LAYER] = null // SEW direction icons, overlayed by LIMBS_LAYER.
- overlays_standing[TAIL_LAYER] = null // This will be one of two things:
- // If the species' tail is overlapped by limbs, this will be only the N direction icon so tails can still appear on the outside of uniforms and such.
- // Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions.
+ overlays_standing[TAIL_LAYER] = null /* This will be one of two things:
+ If the species' tail is overlapped by limbs, this will be only the N direction icon so tails can still appear on the outside of uniforms and such.
+ Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions. */
+
+ var/icon/tail_marking_icon
+ var/datum/sprite_accessory/body_markings/tail/tail_marking_style
+ if(m_styles["tail"] != "None" && (species.bodyflags & HAS_TAIL_MARKINGS))
+ var/tail_marking = m_styles["tail"]
+ tail_marking_style = marking_styles_list[tail_marking]
+ tail_marking_icon = new/icon("icon" = tail_marking_style.icon, "icon_state" = "[tail_marking_style.icon_state]_s")
+ tail_marking_icon.Blend(m_colours["tail"], ICON_ADD)
if(body_accessory)
if(body_accessory.try_restrictions(src))
var/icon/accessory_s = new/icon("icon" = body_accessory.icon, "icon_state" = body_accessory.icon_state)
if(species.bodyflags & HAS_SKIN_COLOR)
accessory_s.Blend(rgb(r_skin, g_skin, b_skin), body_accessory.blend_mode)
-
- if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs...
+ if(tail_marking_icon && (body_accessory.name in tail_marking_style.tails_allowed))
+ accessory_s.Blend(tail_marking_icon, ICON_OVERLAY)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
- var/icon/temp1 = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
- if(species.name in body_accessory.allowed_species)
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "[species.tail]_delay")
- temp1 = temp
- else
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "vulptail_delay")
- temp1 = temp
+ var/icon/under = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "accessory_none_s")
+ under.Insert(new/icon(accessory_s, dir=SOUTH), dir=SOUTH)
+ under.Insert(new/icon(accessory_s, dir=EAST), dir=EAST)
+ under.Insert(new/icon(accessory_s, dir=WEST), dir=WEST)
- temp1.Insert(new/icon(accessory_s,dir=SOUTH),dir=SOUTH)
- temp1.Insert(new/icon(accessory_s,dir=EAST),dir=EAST)
- temp1.Insert(new/icon(accessory_s,dir=WEST),dir=WEST)
-
- overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(temp1, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
// Creates a blank icon, and copies accessory_s' north direction sprite into it
// before passing that to the tail layer that overlays uniforms and such.
- var/icon/temp2 = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
- if(species.name in body_accessory.allowed_species)
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "[species.tail]_delay")
- temp2 = temp
- else
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "vulptail_delay")
- temp2 = temp
+ var/icon/over = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "accessory_none_s")
+ over.Insert(new/icon(accessory_s, dir=NORTH), dir=NORTH)
- temp2.Insert(new/icon(accessory_s,dir=NORTH),dir=NORTH)
-
- overlays_standing[TAIL_LAYER] = image(temp2, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ overlays_standing[TAIL_LAYER] = image(over, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation.
- overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
else if(species.tail && species.bodyflags & HAS_TAIL) //no tailless tajaran
if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space))
var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s")
if(species.bodyflags & HAS_SKIN_COLOR)
tail_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
-
- if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs...
+ if(tail_marking_icon)
+ tail_s.Blend(tail_marking_icon, ICON_OVERLAY)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
- var/icon/temp1 = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_delay")
- temp1.Insert(new/icon(tail_s,dir=SOUTH),dir=SOUTH)
- temp1.Insert(new/icon(tail_s,dir=EAST),dir=EAST)
- temp1.Insert(new/icon(tail_s,dir=WEST),dir=WEST)
+ var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "blank")
+ under.Insert(new/icon(tail_s, dir=SOUTH), dir=SOUTH)
+ under.Insert(new/icon(tail_s, dir=EAST), dir=EAST)
+ under.Insert(new/icon(tail_s, dir=WEST), dir=WEST)
- overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(temp1)
+ overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under)
- // Creates a blank icon, and copies accessory_s' north direction sprite into it
- // before passing that to the tail layer that overlays uniforms and such.
- var/icon/temp2 = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_delay")
- temp2.Insert(new/icon(tail_s,dir=NORTH),dir=NORTH)
+ // Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such.
+ var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "blank")
+ over.Insert(new/icon(tail_s, dir=NORTH), dir=NORTH)
- overlays_standing[TAIL_LAYER] = image(temp2)
+ overlays_standing[TAIL_LAYER] = image(over)
else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation.
- overlays_standing[TAIL_LAYER] = image(tail_s)
+ overlays_standing[TAIL_LAYER] = image(tail_s)
if(update_icons)
update_icons()
@@ -1193,70 +1212,67 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/proc/start_tail_wagging(var/update_icons=1)
overlays_standing[TAIL_UNDERLIMBS_LAYER] = null // SEW direction icons, overlayed by LIMBS_LAYER.
- overlays_standing[TAIL_LAYER] = null // This will be one of two things:
- // If the species' tail is overlapped by limbs, this will be only the N direction icon so tails can still appear on the outside of uniforms and such.
- // Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions.
+ overlays_standing[TAIL_LAYER] = null /* This will be one of two things:
+ If the species' tail is overlapped by limbs, this will be only the N direction icon so tails can still appear on the outside of uniforms and such.
+ Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions. */
+
+ var/icon/tail_marking_icon
+ var/datum/sprite_accessory/body_markings/tail/tail_marking_style
+ if(m_styles["tail"] != "None" && (species.bodyflags & HAS_TAIL_MARKINGS))
+ var/tail_marking = m_styles["tail"]
+ tail_marking_style = marking_styles_list[tail_marking]
+ tail_marking_icon = new/icon("icon" = tail_marking_style.icon, "icon_state" = "[tail_marking_style.icon_state]w_s")
+ tail_marking_icon.Blend(m_colours["tail"], ICON_ADD)
if(body_accessory)
var/icon/accessory_s = new/icon("icon" = body_accessory.get_animated_icon(), "icon_state" = body_accessory.get_animated_icon_state())
if(species.bodyflags & HAS_SKIN_COLOR)
accessory_s.Blend(rgb(r_skin, g_skin, b_skin), body_accessory.blend_mode)
-
- if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs...
+ if(tail_marking_icon && (body_accessory.name in tail_marking_style.tails_allowed))
+ accessory_s.Blend(tail_marking_icon, ICON_OVERLAY)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
- var/icon/temp1 = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
- if(body_accessory.allowed_species)
- if(species.name in body_accessory.allowed_species)
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "[species.tail]_delay")
- temp1 = temp
- else
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "vulptail_delay")
- temp1 = temp
+ var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "Vulpkanin_tail_delay")
+ if(body_accessory.allowed_species && (species.name in body_accessory.allowed_species))
+ under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ under.Insert(new/icon(accessory_s, dir=SOUTH), dir=SOUTH)
+ under.Insert(new/icon(accessory_s, dir=EAST), dir=EAST)
+ under.Insert(new/icon(accessory_s, dir=WEST), dir=WEST)
- temp1.Insert(accessory_s,dir=SOUTH)
- temp1.Insert(accessory_s,dir=EAST)
- temp1.Insert(accessory_s,dir=WEST)
+ overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
- overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(temp1, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ // Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such.
+ var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "Vulpkanin_tail_delay")
+ if(body_accessory.allowed_species && (species.name in body_accessory.allowed_species)) // If the user's species is in the list of allowed species for the currently selected body accessory, use the appropriate animation timing blank
+ over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ over.Insert(new/icon(accessory_s, dir=NORTH), dir=NORTH)
- // Creates a blank icon, and copies accessory_s' north direction sprite into it
- // before passing that to the tail layer that overlays uniforms and such.
- var/icon/temp2 = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
- if(species.name in body_accessory.allowed_species) // If the user's species is in the list of allowed species for the currently selected body accessory, use the appropriate animation timing blank
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "[species.tail]_delay")
- temp2 = temp
- else // Else if the user's species is not in the list of allowed species for the currently selected body accessory, this point must have been reached by admin-override. Use vulpkanin timings as default.
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "vulptail_delay")
- temp2 = temp
-
- temp2.Insert(accessory_s,dir=NORTH)
-
- overlays_standing[TAIL_LAYER] = image(temp2, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ overlays_standing[TAIL_LAYER] = image(over, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation.
- overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
else if(species.tail && species.bodyflags & HAS_TAIL)
var/icon/tailw_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]w_s")
if(species.bodyflags & HAS_SKIN_COLOR)
tailw_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
-
- if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs...
+ if(tail_marking_icon)
+ tailw_s.Blend(tail_marking_icon, ICON_OVERLAY)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
- var/icon/temp1 = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_delay")
- temp1.Insert(tailw_s,dir=SOUTH)
- temp1.Insert(tailw_s,dir=EAST)
- temp1.Insert(tailw_s,dir=WEST)
+ var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ under.Insert(new/icon(tailw_s, dir=SOUTH), dir=SOUTH)
+ under.Insert(new/icon(tailw_s, dir=EAST), dir=EAST)
+ under.Insert(new/icon(tailw_s, dir=WEST), dir=WEST)
- overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(temp1)
+ overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under)
- // Creates a blank icon, and copies accessory_s' north direction sprite into it
- // before passing that to the tail layer that overlays uniforms and such.
- var/icon/temp2 = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_delay")
- temp2.Insert(tailw_s,dir=NORTH)
+ // Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such.
+ var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ over.Insert(new/icon(tailw_s, dir=NORTH), dir=NORTH)
- overlays_standing[TAIL_LAYER] = image(temp2)
+ overlays_standing[TAIL_LAYER] = image(over)
else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation.
- overlays_standing[TAIL_LAYER] = image(tailw_s)
+ overlays_standing[TAIL_LAYER] = image(tailw_s)
if(update_icons)
update_icons()
@@ -1282,17 +1298,17 @@ var/global/list/damage_icon_parts = list()
if(wear_suit.icon_override)
var/icon_path = "[wear_suit.icon_override]"
icon_path = "[copytext(icon_path, 1, findtext(icon_path, "/suit.dmi"))]/collar.dmi" //If this file doesn't exist, the end result is that COLLAR_LAYER will be unchanged (empty).
- var/icon/icon_file
if(fexists(icon_path)) //Just ensuring the nonexistance of a file with the above path won't cause a runtime.
- icon_file = new(icon_path)
- standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]")
+ var/icon/icon_file = new(icon_path)
+ if(wear_suit.icon_state in icon_file.IconStates())
+ standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]")
else if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[species.name])
var/icon_path = "[wear_suit.sprite_sheets[species.name]]"
icon_path = "[copytext(icon_path, 1, findtext(icon_path, "/suit.dmi"))]/collar.dmi" //If this file doesn't exist, the end result is that COLLAR_LAYER will be unchanged (empty).
- var/icon/icon_file
if(fexists(icon_path)) //Just ensuring the nonexistance of a file with the above path won't cause a runtime.
- icon_file = new(icon_path)
- standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]")
+ var/icon/icon_file = new(icon_path)
+ if(wear_suit.icon_state in icon_file.IconStates())
+ standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]")
else
if(wear_suit.icon_state in C.IconStates())
standing = image("icon" = C, "icon_state" = "[wear_suit.icon_state]")
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 985047a8284..5e0841168e0 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -49,10 +49,10 @@
var/datum/gas_mixture/breath
if(health <= config.health_threshold_crit)
- losebreath++
+ AdjustLoseBreath(1)
if(losebreath > 0)
- losebreath--
+ AdjustLoseBreath(-1)
if(prob(10))
spawn emote("gasp")
if(istype(loc, /obj/))
@@ -165,7 +165,7 @@
if(SA_partialpressure > SA_para_min)
Paralyse(3)
if(SA_partialpressure > SA_sleep_min)
- sleeping = max(sleeping+2, 10)
+ AdjustSleeping(2, bound_lower = 0, bound_upper = 10)
else if(SA_partialpressure > 0.01)
if(prob(20))
spawn(0) emote(pick("giggle","laugh"))
@@ -319,30 +319,27 @@
C.pixel_x -= pixel_x_diff
C.pixel_y -= pixel_y_diff
src = oldsrc
- dizziness = max(dizziness - restingpwr, 0)
+ AdjustDizzy(-restingpwr)
if(drowsyness)
- drowsyness = max(drowsyness - restingpwr, 0)
- eye_blurry = max(2, eye_blurry)
+ AdjustDrowsy(-restingpwr)
+ EyeBlurry(2)
if(prob(5))
- sleeping += 1
+ AdjustSleeping(1)
Paralyse(5)
if(confused)
- confused = max(0, confused - 1)
+ AdjustConfused(-1)
//Jitteryness
if(jitteriness)
do_jitter_animation(jitteriness)
- jitteriness = max(jitteriness - restingpwr, 0)
+ AdjustJitter(-restingpwr)
if(hallucination)
spawn handle_hallucinations()
- if(hallucination<=2)
- hallucination = 0
- else
- hallucination -= 2
+ AdjustHallucinate(-2)
/mob/living/carbon/handle_sleeping()
if(..())
@@ -352,8 +349,8 @@
spawn(0)
emote("snore")
// Keep SSD people asleep
- if(player_logged && sleeping < 2)
- sleeping = 2
+ if(player_logged)
+ Sleeping(2)
return sleeping
diff --git a/code/modules/mob/living/carbon/slime/life.dm b/code/modules/mob/living/carbon/slime/life.dm
index b51e0084ee3..6e3221c19fa 100644
--- a/code/modules/mob/living/carbon/slime/life.dm
+++ b/code/modules/mob/living/carbon/slime/life.dm
@@ -208,25 +208,25 @@
if(src.stuttering) src.stuttering = 0
if(src.eye_blind)
- src.eye_blind = 0
+ src.SetEyeBlind(0)
src.blinded = 1
- if(src.ear_deaf > 0) src.ear_deaf = 0
+ if(src.ear_deaf > 0) SetEarDeaf(0)
if(src.ear_damage < 25)
- src.ear_damage = 0
+ SetEarDamage(0)
src.density = !( src.lying )
if(src.disabilities & BLIND)
src.blinded = 1
if(src.disabilities & DEAF)
- src.ear_deaf = 1
+ EarDeaf(1)
if(src.eye_blurry > 0)
- src.eye_blurry = 0
+ SetEyeBlurry(0)
if(src.druggy > 0)
- src.druggy = 0
+ SetDruggy(0)
return 1
diff --git a/code/modules/mob/living/carbon/update_status.dm b/code/modules/mob/living/carbon/update_status.dm
new file mode 100644
index 00000000000..3b0d3a045fc
--- /dev/null
+++ b/code/modules/mob/living/carbon/update_status.dm
@@ -0,0 +1,17 @@
+/mob/living/carbon/update_stat()
+ if(status_flags & GODMODE)
+ return
+ if(stat != DEAD)
+// if(health <= min_health)
+ if(health <= config.health_threshold_dead)
+ death()
+ return
+// if(paralysis || sleeping || getOxyLoss() > low_oxy_ko || (status_flags & FAKEDEATH) || health <= crit_health)
+ if(paralysis || sleeping || getOxyLoss() > 50 || (status_flags & FAKEDEATH) || health <= config.health_threshold_crit)
+ if(stat == CONSCIOUS)
+ KnockOut()
+ else
+ if(stat == UNCONSCIOUS)
+ // updating=FALSE because `WakeUp` will handle canmove up for us
+ StopResting(updating=FALSE)
+ WakeUp()
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index 921080c989a..ffd1fb9cd60 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -57,17 +57,16 @@
rad_damage = max(effect * ((100-run_armor_check(null, "rad", "Your clothes feel warm.", "Your clothes feel warm."))/100),0)
radiation += rad_damage
if(SLUR)
- slurring = max(slurring,(effect * blocked))
+ Slur(effect * blocked)
if(STUTTER)
- if(status_flags & CANSTUN) // stun is usually associated with stutter
- stuttering = max(stuttering,(effect * blocked))
+ Stuttering(effect * blocked)
if(EYE_BLUR)
- eye_blurry = max(eye_blurry,(effect * blocked))
+ EyeBlurry(effect * blocked)
if(DROWSY)
- drowsyness = max(drowsyness,(effect * blocked))
+ Drowsy(effect * blocked)
if(JITTER)
if(status_flags & CANSTUN)
- jitteriness = max(jitteriness,(effect * blocked))
+ Jitter(effect * blocked)
updatehealth()
return 1
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index a151a062bce..308025e0204 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -136,17 +136,17 @@
/mob/living/proc/handle_silent()
if(silent)
- silent = max(silent-1, 0)
+ AdjustSilence(-1)
return silent
/mob/living/proc/handle_drugged()
if(druggy)
- druggy = max(druggy-1, 0)
+ AdjustDruggy(-1)
return druggy
/mob/living/proc/handle_slurring()
if(slurring)
- slurring = max(slurring-1, 0)
+ AdjustSlur(-1)
return slurring
/mob/living/proc/handle_paralysed()
@@ -164,7 +164,7 @@
/mob/living/proc/handle_slowed()
if(slowed)
- slowed = max(slowed-1, 0)
+ AdjustSlowed(-1)
return slowed
/mob/living/proc/handle_drunk()
@@ -175,19 +175,20 @@
/mob/living/proc/handle_disabilities()
//Eyes
if(disabilities & BLIND || stat) //blindness from disability or unconsciousness doesn't get better on its own
- eye_blind = max(eye_blind, 1)
+ EyeBlind(1)
else if(eye_blind) //blindness, heals slowly over time
- eye_blind = max(eye_blind-1,0)
+ AdjustEyeBlind(-1)
else if(eye_blurry) //blurry eyes heal slowly
- eye_blurry = max(eye_blurry-1, 0)
+ AdjustEyeBlurry(-1)
//Ears
if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own
- setEarDamage(-1, max(ear_deaf, 1))
+ EarDeaf(1)
else
// deafness heals slowly over time, unless ear_damage is over 100
if(ear_damage < 100)
- adjustEarDamage(-0.05,-1)
+ AdjustEarDamage(-0.05)
+ AdjustEarDeaf(-1)
//this handles hud updates. Calls update_vision() and handle_hud_icons()
/mob/living/proc/handle_regular_hud_updates()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 72cc4789779..dd9e9f7cbd6 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -261,19 +261,6 @@
var/obj/item/organ/external/def_zone = ran_zone(t)
return def_zone
-
-//damage/heal the mob ears and adjust the deaf amount
-/mob/living/adjustEarDamage(damage, deaf)
- ear_damage = max(0, ear_damage + damage)
- ear_deaf = max(0, ear_deaf + deaf)
-
-//pass a negative argument to skip one of the variable
-/mob/living/setEarDamage(damage, deaf)
- if(damage >= 0)
- ear_damage = damage
- if(deaf >= 0)
- ear_deaf = deaf
-
// heal ONE external organ, organ gets randomly selected from damaged ones.
/mob/living/proc/heal_organ_damage(var/brute, var/burn)
adjustBruteLoss(-brute)
@@ -323,14 +310,6 @@
C.reagents.clear_reagents()
C.reagents.addiction_list.Cut()
-/mob/living/proc/update_revive() // handles revival through other means than cloning or adminbus (defib, IPC repair)
- stat = CONSCIOUS
- dead_mob_list -= src
- living_mob_list |= src
- mob_list |= src
- setEarDamage(-1,0)
- timeofdeath = 0
-
/mob/living/proc/rejuvenate()
var/mob/living/carbon/human/human_mob = null //Get this declared for use later.
@@ -344,22 +323,30 @@
SetParalysis(0)
SetStunned(0)
SetWeakened(0)
- slowed = 0
- losebreath = 0
- dizziness = 0
- jitteriness = 0
- confused = 0
- drowsyness = 0
+ SetSlowed(0)
+ SetLoseBreath(0)
+ SetDizzy(0)
+ SetJitter(0)
+ SetConfused(0)
+ SetDrowsy(0)
radiation = 0
- druggy = 0
- hallucination = 0
+ SetDruggy(0)
+ SetHallucinate(0)
+ blinded = 0
nutrition = 400
bodytemperature = 310
- disabilities = 0
- blinded = 0
- eye_blind = 0
- eye_blurry = 0
- setEarDamage(0,0)
+ CureBlind()
+ CureNearsighted()
+ CureMute()
+ CureDeaf()
+ CureTourettes()
+ CureEpilepsy()
+ CureCoughing()
+ CureNervous()
+ SetEyeBlind(0)
+ SetEyeBlurry(0)
+ SetEarDamage(0)
+ SetEarDeaf(0)
heal_overall_damage(1000, 1000)
ExtinguishMob()
fire_stacks = 0
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index c142c8d28d1..c3dab651906 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -15,8 +15,6 @@
var/brainloss = 0 //'Retardation' damage caused by someone hitting you in the head with a bible or being infected with brainrot.
var/staminaloss = 0 //Stamina damage, or exhaustion. You recover it slowly naturally, and are stunned if it gets too high. Holodeck and hallucinations deal this.
- var/hallucination = 0 //Directly affects how long a mob will hallucinate for
-
var/last_special = 0 //Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out.
@@ -32,7 +30,6 @@
var/update_slimes = 1
var/implanting = 0 //Used for the mind-slave implant
- var/silent = 0 //Can't talk. Value goes down every life proc. //NOTE TO FUTURE CODERS: DO NOT INITIALIZE NUMERICAL VARS AS NULL OR I WILL MURDER YOU.
var/floating = 0
var/mob_size = MOB_SIZE_HUMAN
var/nightvision = 0
diff --git a/code/modules/mob/living/logout.dm b/code/modules/mob/living/logout.dm
index 71e26e60858..10ba19b4302 100644
--- a/code/modules/mob/living/logout.dm
+++ b/code/modules/mob/living/logout.dm
@@ -4,6 +4,6 @@
if(!key) //key and mind have become seperated. I believe this is for when a staff member aghosts.
mind.active = 0 //This is to stop say, a mind.transfer_to call on a corpse causing a ghost to re-enter its body.
//This causes instant sleep and tags a player as SSD. See life.dm for furthering SSD.
- if(sleeping < 2 && mind.active)
- sleeping = 2
- player_logged = 1
\ No newline at end of file
+ if(mind.active)
+ Sleeping(2)
+ player_logged = 1
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 2f44caf161a..3987b709e3e 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -80,9 +80,6 @@ proc/get_radio_key_from_channel(var/channel)
verb = "stammers"
speech_problem_flag = 1
- if(COMIC in mutations)
- message = "[message]"
-
if(!IsVocal())
message = ""
speech_problem_flag = 1
diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm
index 8cf6863eafb..2a3b39c1c9b 100644
--- a/code/modules/mob/living/silicon/ai/say.dm
+++ b/code/modules/mob/living/silicon/ai/say.dm
@@ -82,7 +82,7 @@ var/const/VOX_PATH = "sound/vox_fem/"
for(var/mob/M in player_list)
if(M.client)
var/turf/T = get_turf(M)
- if(T && T.z == z_level && !isdeaf(M))
+ if(T && T.z == z_level && M.can_hear())
M << voice
else
only_listener << voice
diff --git a/code/modules/mob/living/silicon/ai/update_status.dm b/code/modules/mob/living/silicon/ai/update_status.dm
new file mode 100644
index 00000000000..4fa060abf39
--- /dev/null
+++ b/code/modules/mob/living/silicon/ai/update_status.dm
@@ -0,0 +1,10 @@
+/mob/living/silicon/ai/update_stat()
+ if(status_flags & GODMODE)
+ return
+ if(stat != DEAD)
+ if(health <= config.health_threshold_dead)
+ death()
+ return
+ else if(stat == UNCONSCIOUS)
+ WakeUp()
+ //diag_hud_set_status()
diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm
index bd93fd6c3c4..01240adf942 100644
--- a/code/modules/mob/living/silicon/login.dm
+++ b/code/modules/mob/living/silicon/login.dm
@@ -1,5 +1,5 @@
/mob/living/silicon/Login()
- sleeping = 0
+ SetSleeping(0)
if(mind && ticker && ticker.mode)
ticker.mode.remove_revolutionary(mind, 1)
ticker.mode.remove_cultist(mind, 1)
@@ -9,4 +9,4 @@
ticker.mode.remove_thrall(mind, 0)
ticker.mode.remove_shadowling(mind)
ticker.mode.remove_abductor(mind)
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm
index dfa79a0d0d1..104c2746d16 100644
--- a/code/modules/mob/living/silicon/pai/software_modules.dm
+++ b/code/modules/mob/living/silicon/pai/software_modules.dm
@@ -547,8 +547,7 @@
else
var/datum/gas_mixture/env = T.return_air()
data["reading"] = 1
- var/pres = env.return_pressure() * 10
- data["pressure"] = "[round(pres/10)].[pres%10]"
+ data["pressure"] = env.return_pressure()
data["temperature"] = round(env.temperature)
data["temperatureC"] = round(env.temperature-T0C)
diff --git a/code/modules/mob/living/silicon/pai/update_status.dm b/code/modules/mob/living/silicon/pai/update_status.dm
new file mode 100644
index 00000000000..155ecc84a28
--- /dev/null
+++ b/code/modules/mob/living/silicon/pai/update_status.dm
@@ -0,0 +1,3 @@
+/mob/living/silicon/pai/update_stat()
+ if(health <= 0)
+ death(gibbed = 0)
diff --git a/code/modules/mob/living/silicon/robot/drone/update_status.dm b/code/modules/mob/living/silicon/robot/drone/update_status.dm
new file mode 100644
index 00000000000..97d2214c2e2
--- /dev/null
+++ b/code/modules/mob/living/silicon/robot/drone/update_status.dm
@@ -0,0 +1,10 @@
+//Easiest to check this here, then check again in the robot proc.
+//Standard robots use config for crit, which is somewhat excessive for these guys.
+//Drones killed by damage will gib.
+/mob/living/silicon/robot/drone/update_stat()
+ if(status_flags & GODMODE)
+ return
+ if(health <= -35 && stat != DEAD)
+ gib()
+ return
+ return ..()
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index b2c8857f040..ca480d987f8 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -62,7 +62,7 @@
if(sleeping)
Paralyse(3)
- sleeping--
+ AdjustSleeping(-1)
if(resting)
Weaken(5)
@@ -90,7 +90,7 @@
stat = UNCONSCIOUS
if(!paralysis > 0)
- eye_blind = 0
+ SetEyeBlind(0)
else
stat = CONSCIOUS
@@ -98,7 +98,7 @@
diag_hud_set_health()
diag_hud_set_status()
else //dead
- eye_blind = 1
+ SetEyeBlind(0)
//update the state of modules and components here
if(stat != CONSCIOUS)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 7e771b2f372..335ecbcd1f6 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -730,18 +730,18 @@ var/list/robot_verbs_default = list(
else
to_chat(user, "Unable to locate a radio.")
- else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card
+ else if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card
if(emagged)//still allow them to open the cover
- to_chat(user, "The interface seems slightly damaged")
+ to_chat(user, "The interface seems slightly damaged.")
if(opened)
to_chat(user, "You must close the cover to swipe an ID card.")
else
- if(allowed(usr))
+ if(allowed(W))
locked = !locked
to_chat(user, "You [ locked ? "lock" : "unlock"] [src]'s interface.")
update_icons()
else
- to_chat(user, "\red Access denied.")
+ to_chat(user, "Access denied.")
else if(istype(W, /obj/item/borg/upgrade/))
var/obj/item/borg/upgrade/U = W
@@ -957,29 +957,15 @@ var/list/robot_verbs_default = list(
user.visible_message("[user] pets [src]!", \
"You pet [src]!")
-/mob/living/silicon/robot/proc/allowed(mob/M)
- //check if it doesn't require any access at all
- if(check_access(null))
+/mob/living/silicon/robot/proc/allowed(obj/item/I)
+ var/obj/dummy = new /obj(null) // Create a dummy object to check access on as to avoid having to snowflake check_access on every mob
+ dummy.req_access = req_access
+
+ if(dummy.check_access(I))
+ qdel(dummy)
return 1
- if(istype(M, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- //if they are holding or wearing a card that has access, that works
- if(check_access(H.get_active_hand()) || check_access(H.wear_id))
- return 1
- return 0
-
-/mob/living/silicon/robot/proc/check_access(obj/item/weapon/card/id/I)
- if(!istype(req_access, /list)) //something's very wrong
- return 1
-
- var/list/L = req_access
- if(!L.len) //no requirements
- return 1
- if(!I || !istype(I, /obj/item/weapon/card/id) || !I.access) //not ID or no access
- return 0
- for(var/req in req_access)
- if(req in I.access) //have one of the required accesses
- return 1
+
+ qdel(dummy)
return 0
/mob/living/silicon/robot/update_icons()
diff --git a/code/modules/mob/living/silicon/robot/update_status.dm b/code/modules/mob/living/silicon/robot/update_status.dm
new file mode 100644
index 00000000000..a28aae28278
--- /dev/null
+++ b/code/modules/mob/living/silicon/robot/update_status.dm
@@ -0,0 +1,21 @@
+// No args for restraints because robots don't have those
+/mob/living/silicon/robot/incapacitated()
+ if(stat || lockcharge || weakened || stunned || paralysis || !is_component_functioning("actuator"))
+ return 1
+
+/mob/living/silicon/robot/update_stat()
+ if(status_flags & GODMODE)
+ return
+ if(stat != DEAD)
+ if(health <= -maxHealth) //die only once
+ death()
+ return
+ if(!is_component_functioning("actuator") || paralysis || sleeping || stunned || weakened || getOxyLoss() > maxHealth * 0.5)
+ if(stat == CONSCIOUS)
+ KnockOut()
+ else
+ if(stat == UNCONSCIOUS)
+ WakeUp()
+ // diag_hud_set_status()
+ // diag_hud_set_health()
+ // update_health_hud()
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 75bbec89a1b..469b6e86574 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -152,7 +152,7 @@
//Silicon mob language procs
-/mob/living/silicon/can_speak(datum/language/speaking)
+/mob/living/silicon/can_speak_language(datum/language/speaking)
return universal_speak || (speaking in src.speech_synthesizer_langs) //need speech synthesizer support to vocalize a language
/mob/living/silicon/add_language(var/language, var/can_speak=1)
@@ -355,8 +355,8 @@
/////////////////////////////////// EAR DAMAGE ////////////////////////////////////
-/mob/living/silicon/adjustEarDamage()
+/mob/living/silicon/SetEarDamage()
return
-/mob/living/silicon/setEarDamage()
- return
\ No newline at end of file
+/mob/living/silicon/SetEarDeaf()
+ return
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index 4c974c46c16..47c243e970e 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -466,6 +466,9 @@
return
if(istype(target, /obj/mecha/working/ripley))
var/obj/mecha/D = target
+ if(D.icon_state != "ripley-open")
+ to_chat(user, "You can't add armour onto the mech while someone is inside!")
+ return
var/list/damage_absorption = D.damage_absorption
if(damage_absorption["brute"] > 0.3)
damage_absorption["brute"] = max(damage_absorption["brute"] - 0.1, 0.3)
@@ -474,17 +477,11 @@
damage_absorption["laser"] = damage_absorption["laser"] - 0.025
to_chat(user, "You strengthen [target], improving its resistance against melee attacks.")
qdel(src)
- if(D.icon_state == "ripley-open")
- D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-open")
- D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates."
- else
- to_chat(user, "You can't add armour onto the mech while someone is inside!")
+ D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-open")
+ D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates."
if(damage_absorption.["brute"] == 0.3)
- if(D.icon_state == "ripley-open")
- D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open")
- D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter."
- else
- to_chat(user, "You can't add armour onto the mech while someone is inside!")
+ D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open")
+ D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter."
else
to_chat(user, "You can't improve [D] any further!")
return
diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm
index cb48c63b66f..d0e8e0e4bad 100644
--- a/code/modules/mob/living/simple_animal/hostile/statue.dm
+++ b/code/modules/mob/living/simple_animal/hostile/statue.dm
@@ -118,11 +118,11 @@
for(var/atom/check in check_list)
for(var/mob/living/M in viewers(world.view + 1, check) - src)
if(M.client && CanAttack(M) && !M.has_unlimited_silicon_privilege)
- if(!M.eye_blind)
+ if(M.can_see())
return M
for(var/obj/mecha/M in view(world.view + 1, check)) //assuming if you can see them they can see you
if(M.occupant && M.occupant.client)
- if(!M.occupant.eye_blind)
+ if(M.occupant.can_see())
return M.occupant
return null
@@ -185,7 +185,7 @@
continue
var/turf/T = get_turf(L.loc)
if(T && T in targets)
- L.eye_blind = max(L.eye_blind, 4)
+ L.EyeBlind(4)
return
//Toggle Night Vision
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 06160dca1fd..cc5b319c84f 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -706,8 +706,8 @@
/mob/living/simple_animal/proc/sentience_act() //Called when a simple animal gains sentience via gold slime potion
return
-/mob/living/simple_animal/adjustEarDamage()
+/mob/living/simple_animal/SetEarDamage()
return
-/mob/living/simple_animal/setEarDamage()
- return
\ No newline at end of file
+/mob/living/simple_animal/SetEarDeaf()
+ return
diff --git a/code/modules/mob/living/stat_states.dm b/code/modules/mob/living/stat_states.dm
new file mode 100644
index 00000000000..49c91a10d99
--- /dev/null
+++ b/code/modules/mob/living/stat_states.dm
@@ -0,0 +1,50 @@
+// There, now `stat` is a proper state-machine
+
+/mob/living/proc/KnockOut(updating = 1)
+ if(stat == DEAD)
+ log_runtime(EXCEPTION("KnockOut called on a dead mob."), src)
+ return 0
+ else if(stat == UNCONSCIOUS)
+ return 0
+ add_logs(src, null, "fallen unconscious at [atom_loc_line(get_turf(src))]", admin=0)
+ stat = UNCONSCIOUS
+ if(updating)
+ // update_blind_effects()
+ update_canmove()
+ return 1
+
+/mob/living/proc/WakeUp(updating = 1)
+ if(stat == DEAD)
+ log_runtime(EXCEPTION("WakeUp called on a dead mob."), src)
+ return 0
+ else if(stat == CONSCIOUS)
+ return 0
+ add_logs(src, null, "woken up at [atom_loc_line(get_turf(src))]", admin=0)
+ stat = CONSCIOUS
+ if(updating)
+ // update_blind_effects()
+ update_canmove()
+ return 1
+
+/mob/living/proc/can_be_revived()
+ . = TRUE
+ // if(health <= min_health)
+ if(health <= config.health_threshold_dead)
+ return FALSE
+
+// death() is used to make a mob die
+
+// handles revival through other means than cloning or adminbus (defib, IPC repair)
+/mob/living/proc/update_revive()
+ if(stat != DEAD)
+ return
+ if(!can_be_revived())
+ return
+ add_logs(src, null, "came back to life at [atom_loc_line(get_turf(src))]", admin=0)
+ stat = CONSCIOUS
+ dead_mob_list -= src
+ living_mob_list += src
+ timeofdeath = null
+ update_canmove()
+ // update_blind_effects()
+ updatehealth()
diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm
new file mode 100644
index 00000000000..bc12dfdeb87
--- /dev/null
+++ b/code/modules/mob/living/status_procs.dm
@@ -0,0 +1,513 @@
+//Here are the procs used to modify status effects of a mob.
+
+// We use these to automatically apply their effects when they are changed, as
+// opposed to setting them manually and having to either wait for the next `Life`
+// or update by hand
+
+// The `updating` argument is only available on effects that cause a visual/physical effect on the mob itself
+// when applied, such as Stun, Weaken, and Jitter - stuff like Blindness, which has a client-side effect,
+// lacks this argument.
+
+// Ideally, code should only read the vars in this file, and not ever directly
+// modify them
+
+// If you want a mob type to ignore a given status effect, just override the corresponding
+// `SetSTATE` proc - since all of the other procs are wrappers around that,
+// calling them will have no effect
+
+// BOOLEAN STATES
+
+/*
+ * EyesBlocked
+ Your eyes are covered somehow
+ * EarsBlocked
+ Your ears are covered somehow
+ * Resting
+ You are lying down of your own volition
+ * Flying
+ For some reason or another you can move while not touching the ground
+*/
+
+
+// STATUS EFFECTS
+// All of these decrement over time - at a rate of 1 per life cycle unless otherwise noted
+// Status effects sorted alphabetically:
+/*
+ * Confused *
+ Movement is scrambled
+ * Dizzy *
+ The screen goes all warped
+ * Drowsy
+ You begin to yawn, and have a chance of incrementing "Paralysis"
+ * Druggy *
+ A trippy overlay appears.
+ * Drunk *
+ Essentially what your "BAC" is - the higher it is, the more alcohol you have in you
+ * EarDamage *
+ Doesn't do much, but if it's 25+, you go deaf. Heals much slower than other statuses - 0.05 normally
+ * EarDeaf *
+ You cannot hear. Prevents EarDamage from healing naturally.
+ * EyeBlind *
+ You cannot see. Prevents EyeBlurry from healing naturally.
+ * EyeBlurry *
+ A hazy overlay appears on your screen.
+ * Hallucination *
+ Your character will imagine various effects happening to them, vividly.
+ * Jitter *
+ Your character will visibly twitch. Higher values amplify the effect.
+ * LoseBreath *
+ Your character is unable to breathe.
+ * Paralysis *
+ Your character is knocked out.
+ * Silent *
+ Your character is unable to speak.
+ * Sleeping *
+ Your character is asleep.
+ * Slowed *
+ Your character moves slower.
+ * Slurring *
+ Your character cannot enunciate clearly.
+ * Stunned *
+ Your character is unable to move, and drops stuff in their hands. They keep standing, though.
+ * Stuttering *
+ Your character stutters parts of their messages.
+ * Weakened *
+ Your character collapses, but is still conscious.
+*/
+
+// DISABILITIES
+// These are more permanent than the above.
+// Disabilities sorted alphabetically
+/*
+ * Blind (32)
+ Can't see. EyeBlind does not heal when this is active.
+ * Coughing (4)
+ Cough occasionally, causing you to drop your items
+ * Deaf (128)
+ Can't hear. EarDeaf does not heal when this is active
+ * Epilepsy (2)
+ Occasionally go "Epileptic", causing you to become very twitchy, drop all items, and fall to the floor
+ * Mute (64)
+ Cannot talk.
+ * Nearsighted (1)
+ My glasses! I can't see without my glasses! (Nearsighted overlay when not wearing prescription eyewear)
+ * Nervous (16)
+ Occasionally begin to stutter.
+ * Tourettes (8)
+ SHIT (say bad words, and drop stuff occasionally)
+*/
+
+/mob/living
+
+ // Booleans
+ var/resting = FALSE
+
+ /*
+ STATUS EFFECTS
+ */
+
+/mob // On `/mob` for now, to support legacy code
+ var/confused = 0
+ var/dizziness = 0
+ var/drowsyness = 0
+ var/druggy = 0
+ var/drunk = 0
+ var/ear_damage = 0
+ var/ear_deaf = 0
+ var/eye_blind = 0
+ var/eye_blurry = 0
+ var/hallucination = 0
+ var/jitteriness = 0
+ var/losebreath = 0
+ var/paralysis = 0
+ var/silent = 0
+ var/sleeping = 0
+ var/slowed = 0
+ var/slurring = 0
+ var/stunned = 0
+ var/stuttering = 0
+ var/weakened = 0
+
+/mob/living
+ // Bitfields
+ var/disabilities = 0
+
+// RESTING
+
+/mob/living/proc/StartResting(updating = 1)
+ var/val_change = !resting
+ resting = TRUE
+ if(updating && val_change)
+ update_canmove()
+
+/mob/living/proc/StopResting(updating = 1)
+ var/val_change = !!resting
+ resting = FALSE
+ if(updating && val_change)
+ update_canmove()
+
+/mob/living/proc/StartFlying()
+ var/val_change = !flying
+ flying = TRUE
+ if(val_change)
+ update_animations()
+
+/mob/living/proc/StopFlying()
+ var/val_change = !!flying
+ flying = FALSE
+ if(val_change)
+ update_animations()
+
+
+// SCALAR STATUS EFFECTS
+
+// CONFUSED
+
+/mob/living/Confused(amount)
+ SetConfused(max(confused, amount))
+
+/mob/living/SetConfused(amount)
+ confused = max(amount, 0)
+
+/mob/living/AdjustConfused(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(confused, amount, bound_lower, bound_upper)
+ SetConfused(new_value)
+
+// DIZZY
+
+/mob/living/Dizzy(amount)
+ SetDizzy(max(dizziness, amount))
+
+/mob/living/SetDizzy(amount)
+ dizziness = max(amount, 0)
+
+/mob/living/AdjustDizzy(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(dizziness, amount, bound_lower, bound_upper)
+ SetDizzy(new_value)
+
+// DROWSY
+
+/mob/living/Drowsy(amount)
+ SetDrowsy(max(drowsyness, amount))
+
+/mob/living/SetDrowsy(amount)
+ drowsyness = max(amount, 0)
+
+/mob/living/AdjustDrowsy(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(drowsyness, amount, bound_lower, bound_upper)
+ SetDrowsy(new_value)
+
+// DRUNK
+
+/mob/living/Drunk(amount)
+ SetDrunk(max(drunk, amount))
+
+/mob/living/SetDrunk(amount)
+ drunk = max(amount, 0)
+
+/mob/living/AdjustDrunk(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(drunk, amount, bound_lower, bound_upper)
+ SetDrunk(new_value)
+
+// DRUGGY
+
+/mob/living/Druggy(amount)
+ SetDruggy(max(druggy, amount))
+
+/mob/living/SetDruggy(amount)
+ var/old_val = druggy
+ druggy = max(amount, 0)
+ // We transitioned to/from 0, so update the druggy overlays
+ if((old_val == 0 || druggy == 0) && (old_val != druggy))
+ update_druggy_effects()
+
+/mob/living/AdjustDruggy(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(druggy, amount, bound_lower, bound_upper)
+ SetDruggy(new_value)
+
+// EAR_DAMAGE
+
+/mob/living/EarDamage(amount)
+ SetEarDamage(max(ear_damage, amount))
+
+/mob/living/SetEarDamage(amount)
+ ear_damage = max(amount, 0)
+
+/mob/living/AdjustEarDamage(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(ear_damage, amount, bound_lower, bound_upper)
+ SetEarDamage(new_value)
+
+// EAR_DEAF
+
+/mob/living/EarDeaf(amount)
+ SetEarDeaf(max(ear_deaf, amount))
+
+/mob/living/SetEarDeaf(amount)
+ ear_deaf = max(amount, 0)
+
+/mob/living/AdjustEarDeaf(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(ear_deaf, amount, bound_lower, bound_upper)
+ SetEarDeaf(new_value)
+
+// EYE_BLIND
+
+/mob/living/EyeBlind(amount)
+ SetEyeBlind(max(eye_blind, amount))
+
+/mob/living/SetEyeBlind(amount)
+ var/old_val = eye_blind
+ eye_blind = max(amount, 0)
+ // We transitioned to/from 0, so update the eye blind overlays
+ if((old_val == 0 || eye_blind == 0) && (old_val != eye_blind))
+ update_blind_effects()
+
+/mob/living/AdjustEyeBlind(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(eye_blind, amount, bound_lower, bound_upper)
+ SetEyeBlind(new_value)
+
+// EYE_BLURRY
+
+/mob/living/EyeBlurry(amount)
+ SetEyeBlurry(max(eye_blurry, amount))
+
+/mob/living/SetEyeBlurry(amount)
+ var/old_val = eye_blurry
+ eye_blurry = max(amount, 0)
+ // We transitioned to/from 0, so update the eye blur overlays
+ if((old_val == 0 || eye_blurry == 0) && (old_val != eye_blurry))
+ update_blurry_effects()
+
+/mob/living/AdjustEyeBlurry(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(eye_blurry, amount, bound_lower, bound_upper)
+ SetEyeBlurry(new_value)
+
+// HALLUCINATION
+
+/mob/living/Hallucinate(amount)
+ SetHallucinate(max(hallucination, amount))
+
+/mob/living/SetHallucinate(amount)
+ hallucination = max(amount, 0)
+
+/mob/living/AdjustHallucinate(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(hallucination, amount, bound_lower, bound_upper)
+ SetHallucinate(new_value)
+
+// JITTER
+
+/mob/living/Jitter(amount, force = 0)
+ SetJitter(max(jitteriness, amount), force)
+
+/mob/living/SetJitter(amount, force = 0)
+ // Jitter is also associated with stun
+ if(status_flags & CANSTUN || force)
+ jitteriness = max(amount, 0)
+
+/mob/living/AdjustJitter(amount, bound_lower = 0, bound_upper = INFINITY, force = 0)
+ var/new_value = directional_bounded_sum(jitteriness, amount, bound_lower, bound_upper)
+ SetJitter(new_value, force)
+
+// LOSE_BREATH
+
+/mob/living/LoseBreath(amount)
+ SetLoseBreath(max(losebreath, amount))
+
+/mob/living/SetLoseBreath(amount)
+ losebreath = max(amount, 0)
+
+/mob/living/AdjustLoseBreath(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(losebreath, amount, bound_lower, bound_upper)
+ SetLoseBreath(new_value)
+
+// PARALYSE
+
+/mob/living/Paralyse(amount, updating = 1, force = 0)
+ SetParalysis(max(paralysis, amount), updating, force)
+
+/mob/living/SetParalysis(amount, updating = 1, force = 0)
+ if(status_flags & CANPARALYSE || force)
+ paralysis = max(amount, 0)
+ if(updating)
+ update_canmove()
+ update_stat()
+
+/mob/living/AdjustParalysis(amount, bound_lower = 0, bound_upper = INFINITY, updating = 1, force = 0)
+ var/new_value = directional_bounded_sum(paralysis, amount, bound_lower, bound_upper)
+ SetParalysis(new_value, updating, force)
+
+// SILENT
+
+/mob/living/Silence(amount)
+ SetSilence(max(silent, amount))
+
+/mob/living/SetSilence(amount)
+ silent = max(amount, 0)
+
+/mob/living/AdjustSilence(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(silent, amount, bound_lower, bound_upper)
+ SetSilence(new_value)
+
+// SLEEPING
+
+/mob/living/Sleeping(amount, updating = 1)
+ SetSleeping(max(sleeping, amount), updating)
+
+/mob/living/SetSleeping(amount, updating = 1)
+ sleeping = max(amount, 0)
+ update_sleeping_effects()
+ if(updating)
+ update_stat()
+ update_canmove()
+
+/mob/living/AdjustSleeping(amount, bound_lower = 0, bound_upper = INFINITY, updating = 1)
+ var/new_value = directional_bounded_sum(sleeping, amount, bound_lower, bound_upper)
+ SetSleeping(new_value, updating)
+
+// SLOWED
+
+/mob/living/Slowed(amount, updating = 1)
+ SetSlowed(max(slowed, amount), updating)
+
+/mob/living/SetSlowed(amount, updating = 1)
+ slowed = max(amount, 0)
+
+/mob/living/AdjustSlowed(amount, bound_lower = 0, bound_upper = INFINITY, updating = 1)
+ var/new_value = directional_bounded_sum(slowed, amount, bound_lower, bound_upper)
+ SetSlowed(new_value, updating)
+
+// SLURRING
+
+/mob/living/Slur(amount)
+ SetSlur(max(slurring, amount))
+
+/mob/living/SetSlur(amount)
+ slurring = max(amount, 0)
+
+/mob/living/AdjustSlur(amount, bound_lower = 0, bound_upper = INFINITY)
+ var/new_value = directional_bounded_sum(slurring, amount, bound_lower, bound_upper)
+ SetSlur(new_value)
+
+// STUN
+
+/mob/living/Stun(amount, updating = 1, force = 0)
+ SetStunned(max(stunned, amount), updating, force)
+
+/mob/living/SetStunned(amount, updating = 1, force = 0) //if you REALLY need to set stun to a set amount without the whole "can't go below current stunned"
+ if(status_flags & CANSTUN || force)
+ stunned = max(amount, 0)
+ if(updating)
+ update_canmove()
+
+/mob/living/AdjustStunned(amount, bound_lower = 0, bound_upper = INFINITY, updating = 1, force = 0)
+ var/new_value = directional_bounded_sum(stunned, amount, bound_lower, bound_upper)
+ SetStunned(new_value, updating, force)
+
+// STUTTERING
+
+
+/mob/living/Stuttering(amount, force = 0)
+ SetStuttering(max(stuttering, amount), force)
+
+/mob/living/SetStuttering(amount, force = 0)
+ //From mob/living/apply_effect: "Stuttering is often associated with Stun"
+ if(status_flags & CANSTUN || force)
+ stuttering = max(stuttering, 0)
+
+/mob/living/AdjustStuttering(amount, bound_lower = 0, bound_upper = INFINITY, force = 0)
+ var/new_value = directional_bounded_sum(stuttering, amount, bound_lower, bound_upper)
+ SetStuttering(new_value, force)
+
+// WEAKEN
+
+/mob/living/Weaken(amount, updating = 1, force = 0)
+ SetWeakened(max(weakened, amount), updating, force)
+
+/mob/living/SetWeakened(amount, updating = 1, force = 0)
+ if(status_flags & CANWEAKEN || force)
+ weakened = max(amount, 0)
+ if(updating)
+ update_canmove() //updates lying, canmove and icons
+
+/mob/living/AdjustWeakened(amount, bound_lower = 0, bound_upper = INFINITY, updating = 1, force = 0)
+ var/new_value = directional_bounded_sum(weakened, amount, bound_lower, bound_upper)
+ SetWeakened(new_value, updating, force)
+
+//
+// DISABILITIES
+//
+
+// Blind
+
+/mob/living/proc/BecomeBlind()
+ var/val_change = !(disabilities & BLIND)
+ disabilities |= BLIND
+ if(val_change)
+ update_blind_effects()
+
+/mob/living/proc/CureBlind()
+ var/val_change = !!(disabilities & BLIND)
+ disabilities &= ~BLIND
+ if(val_change)
+ update_blind_effects()
+
+// Coughing
+
+/mob/living/proc/BecomeCoughing()
+ disabilities |= COUGHING
+
+/mob/living/proc/CureCoughing()
+ disabilities &= ~COUGHING
+
+// Deaf
+
+/mob/living/proc/BecomeDeaf()
+ disabilities |= DEAF
+
+/mob/living/proc/CureDeaf()
+ disabilities &= ~DEAF
+
+// Epilepsy
+
+/mob/living/proc/BecomeEpilepsy()
+ disabilities |= EPILEPSY
+
+/mob/living/proc/CureEpilepsy()
+ disabilities &= ~EPILEPSY
+
+// Mute
+
+/mob/living/proc/BecomeMute()
+ disabilities |= MUTE
+
+/mob/living/proc/CureMute()
+ disabilities &= ~MUTE
+
+// Nearsighted
+
+/mob/living/proc/BecomeNearsighted()
+ var/val_change = !(disabilities & NEARSIGHTED)
+ disabilities |= NEARSIGHTED
+ if(val_change)
+ update_nearsighted_effects()
+
+/mob/living/proc/CureNearsighted()
+ var/val_change = !!(disabilities & NEARSIGHTED)
+ disabilities &= ~NEARSIGHTED
+ if(val_change)
+ update_nearsighted_effects()
+
+// Nervous
+
+/mob/living/proc/BecomeNervous()
+ disabilities |= NERVOUS
+
+/mob/living/proc/CureNervous()
+ disabilities &= ~NERVOUS
+
+// Tourettes
+
+/mob/living/proc/BecomeTourettes()
+ disabilities |= TOURETTES
+
+/mob/living/proc/CureTourettes()
+ disabilities &= ~TOURETTES
diff --git a/code/modules/mob/living/update_status.dm b/code/modules/mob/living/update_status.dm
new file mode 100644
index 00000000000..5cbf7cae450
--- /dev/null
+++ b/code/modules/mob/living/update_status.dm
@@ -0,0 +1,97 @@
+/mob/living/update_blind_effects()
+ if(!can_see())
+ overlay_fullscreen("blind", /obj/screen/fullscreen/blind)
+ throw_alert("blind", /obj/screen/alert/blind)
+ return 1
+ else
+ clear_fullscreen("blind")
+ clear_alert("blind")
+ return 0
+
+/mob/living/update_blurry_effects()
+ if(eyes_blurred())
+ overlay_fullscreen("blurry", /obj/screen/fullscreen/blurry)
+ return 1
+ else
+ clear_fullscreen("blurry")
+ return 0
+
+/mob/living/update_druggy_effects()
+ if(druggy)
+ overlay_fullscreen("high", /obj/screen/fullscreen/high)
+ throw_alert("high", /obj/screen/alert/high)
+ else
+ clear_fullscreen("high")
+ clear_alert("high")
+
+/mob/living/update_nearsighted_effects()
+ if(disabilities & NEARSIGHTED)
+ overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1)
+ else
+ clear_fullscreen("nearsighted")
+
+/mob/living/update_sleeping_effects()
+ if(sleeping)
+ throw_alert("asleep", /obj/screen/alert/asleep)
+ else
+ clear_alert("asleep")
+
+// Querying status of the mob
+
+// Whether the mob can hear things
+/mob/living/can_hear()
+ return !(ear_deaf || (disabilities & DEAF))
+
+// Whether the mob is able to see
+/mob/living/can_see()
+ return !(eye_blind || (disabilities & BLIND) || stat)
+
+// Whether the mob is capable of talking
+/mob/living/can_speak()
+ return !(silent || (disabilities & MUTE) || is_muzzled())
+
+// Whether the mob is capable of standing or not
+/mob/living/proc/can_stand()
+ return !(weakened || paralysis || stat || (status_flags & FAKEDEATH))
+
+// Whether the mob is capable of actions or not
+/mob/living/incapacitated(ignore_restraints = 0, ignore_grab = 0, ignore_lying = 0)
+ if(stat || paralysis || stunned || (weakened && lying) || (!ignore_restraints && restrained()) || (!ignore_lying && lying))
+ return 1
+
+// wonderful proc names, I know - used to check whether the blur overlay
+// should show or not
+/mob/living/proc/eyes_blurred()
+ return eye_blurry
+
+//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it.
+/mob/living/update_canmove(delay_action_updates = 0)
+ var/fall_over = !can_stand()
+ var/buckle_lying = !(buckled && !buckled.buckle_lying)
+ if(fall_over || resting || stunned)
+ drop_r_hand()
+ drop_l_hand()
+ else
+ lying = 0
+ canmove = 1
+ if(buckled)
+ lying = 90 * buckle_lying
+ else if((fall_over || resting) && !lying)
+ fall(fall_over)
+
+ canmove = !(fall_over || resting || stunned || buckled)
+ density = !lying
+ if(lying)
+ if(layer == initial(layer))
+ layer = MOB_LAYER - 0.2
+ else
+ if(layer == MOB_LAYER - 0.2)
+ layer = initial(layer)
+
+ update_transform()
+ if(!delay_action_updates)
+ update_action_buttons_icon()
+ return canmove
+
+/mob/living/proc/update_stamina()
+ return
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 4a292328fb6..e312ff9556b 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -62,22 +62,22 @@
if(!client) return
if(type)
- if(type & 1 && (disabilities & BLIND || blinded || paralysis) )//Vision related
+ if(type & 1 && !can_see())//Vision related
if(!( alt ))
return
else
msg = alt
type = alt_type
- if(type & 2 && (disabilities & DEAF || ear_deaf))//Hearing related
+ if(type & 2 && !can_hear())//Hearing related
if(!( alt ))
return
else
msg = alt
type = alt_type
- if((type & 1 && disabilities & BLIND))
+ if(type & 1 && !can_see())
return
// Added voice muffling for Issue 41.
- if(stat == UNCONSCIOUS || (sleeping > 0 && stat != 2))
+ if(stat == UNCONSCIOUS || (sleeping > 0 && stat != DEAD))
to_chat(src, "... You can almost hear someone talking ...")
else
to_chat(src, msg)
@@ -163,13 +163,6 @@
// handle_typing_indicator()
return
-
-/mob/proc/restrained()
- return
-
-/mob/proc/incapacitated()
- return
-
//This proc is called whenever someone clicks an inventory ui slot.
/mob/proc/attack_ui(slot)
var/obj/item/W = get_active_hand()
@@ -1031,36 +1024,6 @@ var/list/slot_equipment_priority = list( \
if(restrained()) return 0
return 1
-//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it.
-/mob/proc/update_canmove(delay_action_updates = 0)
- var/ko = weakened || paralysis || stat || (status_flags & FAKEDEATH)
- var/buckle_lying = !(buckled && !buckled.buckle_lying)
- if(ko || resting || stunned)
- drop_r_hand()
- drop_l_hand()
- else
- lying = 0
- canmove = 1
- if(buckled)
- lying = 90 * buckle_lying
- else
- if((ko || resting) && !lying)
- fall(ko)
-
- canmove = !(ko || resting || stunned || buckled)
- density = !lying
- if(lying)
- if(layer == initial(layer))
- layer = MOB_LAYER - 0.2
- else
- if(layer == MOB_LAYER - 0.2)
- layer = initial(layer)
-
- update_transform()
- if(!delay_action_updates)
- update_action_buttons_icon()
- return canmove
-
/mob/proc/fall(var/forced)
drop_l_hand()
drop_r_hand()
@@ -1101,77 +1064,6 @@ var/list/slot_equipment_priority = list( \
/mob/proc/activate_hand(selhand)
return
-/mob/proc/Jitter(amount)
- jitteriness = max(jitteriness, amount, 0)
-
-/mob/proc/Dizzy(amount)
- dizziness = max(dizziness, amount, 0)
-
-/mob/proc/AdjustDrunk(amount)
- drunk = max(drunk + amount, 0)
-
-/mob/proc/Stun(amount)
- SetStunned(max(stunned, amount))
-
-/mob/proc/SetStunned(amount) //if you REALLY need to set stun to a set amount without the whole "can't go below current stunned"
- if(status_flags & CANSTUN)
- stunned = max(amount, 0)
- update_canmove()
- else if(stunned)
- stunned = 0
- update_canmove()
-
-/mob/proc/AdjustStunned(amount)
- SetStunned(stunned + amount)
-
-/mob/proc/Weaken(amount)
- SetWeakened(max(weakened, amount))
-
-/mob/proc/SetWeakened(amount)
- if(status_flags & CANWEAKEN)
- weakened = max(amount, 0)
- update_canmove() //updates lying, canmove and icons
- else if(weakened)
- weakened = 0
- update_canmove()
-
-/mob/proc/AdjustWeakened(amount)
- SetWeakened(weakened + amount)
-
-/mob/proc/Paralyse(amount)
- SetParalysis(max(paralysis, amount))
-
-/mob/proc/SetParalysis(amount)
- if(status_flags & CANPARALYSE)
- paralysis = max(amount, 0)
- update_canmove()
- else if(paralysis)
- paralysis = 0
- update_canmove()
-
-/mob/proc/AdjustParalysis(amount)
- SetParalysis(paralysis + amount)
-
-/mob/proc/Sleeping(amount)
- SetSleeping(max(sleeping, amount))
-
-/mob/proc/SetSleeping(amount)
- sleeping = max(amount, 0)
- update_canmove()
-
-/mob/proc/AdjustSleeping(amount)
- SetSleeping(sleeping + amount)
-
-/mob/proc/Resting(amount)
- SetResting(max(resting, amount))
-
-/mob/proc/SetResting(amount)
- resting = max(amount, 0)
- update_canmove()
-
-/mob/proc/AdjustResting(amount)
- SetResting(resting + amount)
-
/mob/proc/get_species()
return ""
@@ -1365,13 +1257,6 @@ mob/proc/yank_out_object()
location.add_vomit_floor(src, 1)
playsound(location, 'sound/effects/splat.ogg', 50, 1)
-
-/mob/proc/adjustEarDamage()
- return
-
-/mob/proc/setEarDamage()
- return
-
/mob/proc/AddSpell(obj/effect/proc_holder/spell/S)
mob_spell_list += S
S.action.Grant(src)
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index f7bd04906ea..6cb582e94c1 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -33,18 +33,11 @@
var/obj/machinery/machine = null
var/other_mobs = null
var/memory = ""
- var/disabilities = 0 //Carbon
var/atom/movable/pulling = null
var/next_move = null
var/notransform = null //Carbon
var/other = 0.0
var/hand = null
- var/eye_blind = 0 //Carbon
- var/eye_blurry = 0 //Carbon
- var/ear_deaf = 0 //Carbon
- var/ear_damage = 0 //Carbon
- var/stuttering = 0 //Carbon
- var/slurring = 0 //Carbon
var/real_name = null
var/flavor_text = ""
var/med_record = ""
@@ -53,11 +46,6 @@
var/blinded = null
var/bhunger = 0 //Carbon
var/ajourn = 0
- var/druggy = 0 //Carbon
- var/confused = 0 //Carbon
- var/drunk = 0
- var/sleeping = 0 //Carbon
- var/resting = 0 //Carbon
var/lying = 0
var/lying_prev = 0
var/canmove = 1
@@ -77,19 +65,11 @@
var/bodytemperature = 310.055 //98.7 F
- var/drowsyness = 0.0//Carbon
- var/dizziness = 0//Carbon
- var/jitteriness = 0//Carbon
var/flying = 0
var/charges = 0.0
var/nutrition = 400.0//Carbon
var/overeatduration = 0 // How long this guy is overeating //Carbon
- var/paralysis = 0
- var/stunned = 0
- var/weakened = 0
- var/slowed = 0
- var/losebreath = 0 //Carbon
var/intent = null//Living
var/shakecamera = 0
var/a_intent = I_HELP//Living
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 90f84b7fc74..a22d9bf3c6b 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -175,9 +175,9 @@
if(state >= GRAB_KILL)
//affecting.apply_effect(STUTTER, 5) //would do this, but affecting isn't declared as mob/living for some stupid reason.
- affecting.stuttering = max(affecting.stuttering, 5) //It will hamper your voice, being choked and all.
+ affecting.Stuttering(5) //It will hamper your voice, being choked and all.
affecting.Weaken(5) //Should keep you down unless you get help.
- affecting.losebreath = max(affecting.losebreath + 2, 3)
+ affecting.AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3)
adjust_position()
@@ -290,7 +290,7 @@
msg_admin_attack("[key_name(assailant)] strangled (kill intent) [key_name(affecting)]")
assailant.next_move = world.time + 10
- affecting.losebreath += 1
+ affecting.AdjustLoseBreath(1)
affecting.set_dir(WEST)
adjust_position()
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index aa59991a6cb..b03b9562949 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -75,12 +75,6 @@ proc/iscuffed(A)
return 1
return 0
-proc/isdeaf(A)
- if(istype(A, /mob))
- var/mob/M = A
- return (M.disabilities & DEAF) || M.ear_deaf
- return 0
-
proc/hassensorlevel(A, var/level)
var/mob/living/carbon/human/H = A
if(istype(H) && istype(H.w_uniform, /obj/item/clothing/under))
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index dd48c1ce1a4..f8a73364264 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -565,3 +565,7 @@
/mob/new_player/is_ready()
return ready && ..()
+
+// No hearing announcements
+/mob/new_player/can_hear()
+ return 0
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index cf8a7f05574..f0bcbfe0312 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -1,6 +1,10 @@
/datum/preferences
//The mob should have a gender you want before running this proc. Will run fine without H
/datum/preferences/proc/random_character(gender_override)
+ var/datum/robolimb/robohead
+ if(species == "Machine")
+ var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]"
+ robohead = all_robolimbs[head_model]
if(gender_override)
gender = gender_override
else
@@ -8,18 +12,41 @@
underwear = random_underwear(gender, species)
undershirt = random_undershirt(gender, species)
socks = random_socks(gender, species)
- if(species in list("Human", "Drask"))
- s_tone = random_skin_tone()
- h_style = random_hair_style(gender, species)
- f_style = random_facial_hair_style(gender, species)
- if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine" || species == "Vulpkanin")
+ if(species == "Vulpkanin")
+ body_accessory = random_body_accessory(species)
+ if(body_accessory == "None") //Required to prevent a bug where the information/icons in the character preferences screen wouldn't update despite the data being changed.
+ body_accessory = null
+ if(species in list("Human", "Drask", "Vox"))
+ s_tone = random_skin_tone(species)
+ h_style = random_hair_style(gender, species, robohead)
+ f_style = random_facial_hair_style(gender, species, robohead)
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
randomize_hair_color("hair")
- randomize_hair_color("facial")
- randomize_eyes_color()
- if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Vulpkanin")
+ randomize_hair_color("facial")
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine"))
+ ha_style = random_head_accessory(species)
+ var/list/colours = randomize_skin_color(1)
+ r_headacc = colours["red"]
+ g_headacc = colours["green"]
+ b_headacc = colours["blue"]
+ if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin"))
+ m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head)
+ var/list/colours = randomize_skin_color(1)
+ m_colours["head"] = rgb(colours["red"], colours["green"], colours["blue"])
+ if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask"))
+ m_styles["body"] = random_marking_style("body", species)
+ var/list/colours = randomize_skin_color(1)
+ m_colours["body"] = rgb(colours["red"], colours["green"], colours["blue"])
+ if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ m_styles["tail"] = random_marking_style("tail", species, null, body_accessory)
+ var/list/colours = randomize_skin_color(1)
+ m_colours["tail"] = rgb(colours["red"], colours["green"], colours["blue"])
+ if(species != "Machine")
+ randomize_eyes_color()
+ if(species in list("Unathi", "Tajaran", "Skrell", "Vulpkanin"))
randomize_skin_color()
backbag = 2
- age = rand(AGE_MIN,AGE_MAX)
+ age = rand(AGE_MIN, AGE_MAX)
/datum/preferences/proc/randomize_hair_color(var/target = "hair")
@@ -130,7 +157,7 @@
g_eyes = green
b_eyes = blue
-/datum/preferences/proc/randomize_skin_color()
+/datum/preferences/proc/randomize_skin_color(var/pass_to_list)
var/red
var/green
var/blue
@@ -174,9 +201,17 @@
green = max(min(green + rand (-25, 25), 255), 0)
blue = max(min(blue + rand (-25, 25), 255), 0)
- r_skin = red
- g_skin = green
- b_skin = blue
+ if(pass_to_list)
+ var/list/colours = list(
+ "red" = red,
+ "blue" = blue,
+ "green" = green
+ )
+ return colours
+ else
+ r_skin = red
+ g_skin = green
+ b_skin = blue
/datum/preferences/proc/blend_backpack(var/icon/clothes_s,var/backbag,var/satchel,var/backpack="backpack")
switch(backbag)
@@ -222,26 +257,12 @@
fat="_fat"
preview_icon = new /icon(icobase, "torso_[g][fat]")
preview_icon.Blend(new /icon(icobase, "groin_[g]"), ICON_OVERLAY)
- preview_icon.Blend(new /icon(icobase, "head_[g]"), ICON_OVERLAY)
-
- //Tail
- if(current_species && (current_species.bodyflags & HAS_TAIL))
- var/tail_icon
- var/tail_icon_state
-
- if(body_accessory)
- var/datum/body_accessory/accessory = body_accessory_by_name[body_accessory]
- tail_icon = accessory.icon
- tail_icon_state = accessory.icon_state
- else
- tail_icon = "icons/effects/species.dmi"
- if(coloured_tail)
- tail_icon_state = "[coloured_tail]_s"
- else
- tail_icon_state = "[current_species.tail]_s"
-
- var/icon/temp = new /icon("icon" = tail_icon, "icon_state" = tail_icon_state)
- preview_icon.Blend(temp, ICON_OVERLAY)
+ var/head = "head"
+ if(alt_head && current_species.bodyflags & HAS_ALT_HEADS)
+ var/datum/sprite_accessory/alt_heads/H = alt_heads_list[alt_head]
+ if(H.icon_state)
+ head = H.icon_state
+ preview_icon.Blend(new /icon(icobase, "[head]_[g]"), ICON_OVERLAY)
for(var/name in list("chest", "groin", "head", "r_arm", "r_hand", "r_leg", "r_foot", "l_leg", "l_foot", "l_arm", "l_hand"))
if(organ_data[name] == "amputated") continue
@@ -266,13 +287,53 @@
else
preview_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
- //Body Markings
- if(current_species && (current_species.bodyflags & HAS_MARKINGS))
- var/datum/sprite_accessory/marking_style = marking_styles_list[m_style]
- if(marking_style && marking_style.species_allowed)
- var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s")
- markings_s.Blend(rgb(r_markings, g_markings, b_markings), ICON_ADD)
- preview_icon.Blend(markings_s, ICON_OVERLAY)
+ //Tail
+ if(current_species && (current_species.bodyflags & HAS_TAIL))
+ var/tail_icon
+ var/tail_icon_state
+
+ if(body_accessory)
+ var/datum/body_accessory/accessory = body_accessory_by_name[body_accessory]
+ tail_icon = accessory.icon
+ tail_icon_state = accessory.icon_state
+ else
+ tail_icon = "icons/effects/species.dmi"
+ if(coloured_tail)
+ tail_icon_state = "[coloured_tail]_s"
+ else
+ tail_icon_state = "[current_species.tail]_s"
+
+ var/icon/temp = new /icon("icon" = tail_icon, "icon_state" = tail_icon_state)
+
+ if(current_species && (current_species.bodyflags & HAS_SKIN_COLOR))
+ temp.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
+
+ if(current_species && (current_species.bodyflags & HAS_TAIL_MARKINGS))
+ var/tail_marking = m_styles["tail"]
+ var/datum/sprite_accessory/tail_marking_style = marking_styles_list[tail_marking]
+ if(tail_marking_style && tail_marking_style.species_allowed)
+ var/icon/t_marking_s = new/icon("icon" = tail_marking_style.icon, "icon_state" = "[tail_marking_style.icon_state]_s")
+ t_marking_s.Blend(m_colours["tail"], ICON_ADD)
+ temp.Blend(t_marking_s, ICON_OVERLAY)
+
+ preview_icon.Blend(temp, ICON_OVERLAY)
+
+ //Markings
+ if(current_species && ((current_species.bodyflags & HAS_HEAD_MARKINGS) || (current_species.bodyflags & HAS_BODY_MARKINGS)))
+ if(current_species.bodyflags & HAS_BODY_MARKINGS) //Body markings.
+ var/body_marking = m_styles["body"]
+ var/datum/sprite_accessory/body_marking_style = marking_styles_list[body_marking]
+ if(body_marking_style && body_marking_style.species_allowed)
+ var/icon/b_marking_s = new/icon("icon" = body_marking_style.icon, "icon_state" = "[body_marking_style.icon_state]_s")
+ b_marking_s.Blend(m_colours["body"], ICON_ADD)
+ preview_icon.Blend(b_marking_s, ICON_OVERLAY)
+ if(current_species.bodyflags & HAS_HEAD_MARKINGS) //Head markings.
+ var/head_marking = m_styles["head"]
+ var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
+ if(head_marking_style && head_marking_style.species_allowed)
+ var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s")
+ h_marking_s.Blend(m_colours["head"], ICON_ADD)
+ preview_icon.Blend(h_marking_s, ICON_OVERLAY)
var/icon/face_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "bald_s")
@@ -289,6 +350,13 @@
hair_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_ADD)
else
hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
+
+ if(hair_style.secondary_theme)
+ var/icon/hair_secondary_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_[hair_style.secondary_theme]_s")
+ if(!hair_style.no_sec_colour)
+ hair_secondary_s.Blend(rgb(r_hair_sec, g_hair_sec, b_hair_sec), ICON_ADD)
+ hair_s.Blend(hair_secondary_s, ICON_OVERLAY)
+
face_s.Blend(hair_s, ICON_OVERLAY)
//Head Accessory
@@ -306,6 +374,13 @@
facial_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_ADD)
else
facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
+
+ if(facial_hair_style.secondary_theme)
+ var/icon/facial_secondary_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_[facial_hair_style.secondary_theme]_s")
+ if(!facial_hair_style.no_sec_colour)
+ facial_secondary_s.Blend(rgb(r_facial_sec, g_facial_sec, b_facial_sec), ICON_ADD)
+ facial_s.Blend(facial_secondary_s, ICON_OVERLAY)
+
face_s.Blend(facial_s, ICON_OVERLAY)
var/icon/underwear_s = null
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index 3ade5970d03..0e8f3456335 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -25,14 +25,15 @@
for(var/path in subtypesof(prototype))
var/datum/sprite_accessory/D = new path()
- L[D.name] = D
+ if(D.name)
+ L[D.name] = D
- switch(D.gender)
- if(MALE) male[D.name] = D
- if(FEMALE) female[D.name] = D
- else
- male[D.name] = D
- female[D.name] = D
+ switch(D.gender)
+ if(MALE) male[D.name] = D
+ if(FEMALE) female[D.name] = D
+ else
+ male[D.name] = D
+ female[D.name] = D
return L
/datum/sprite_accessory
@@ -43,8 +44,12 @@
// Restrict some styles to specific species
var/list/species_allowed = list("Human", "Slime People")
- var/models_allowed = list() //Specifies which, if any, hairstyles can be accessed by which prosthetics. Should equal the manufacturing company name in robolimbs.dm.
+ var/list/models_allowed = list() //Specifies which, if any, hairstyles or markings can be accessed by which prosthetics. Should equal the manufacturing company name in robolimbs.dm.
+ var/list/heads_allowed = null //Specifies which, if any, alt heads a head marking, hairstyle or facial hair style is compatible with.
+ var/list/tails_allowed = null //Specifies which, if any, tails a tail marking is compatible with.
var/marking_location //Specifies which bodypart a body marking is located on.
+ var/secondary_theme = null //If exists, there's a secondary colour to that hair style and the secondary theme's icon state's suffix is equal to this.
+ var/no_sec_colour = null //If exists, prohibit the colouration of the secondary theme.
// Whether or not the accessory can be affected by colouration
var/do_colouration = 1
@@ -61,492 +66,762 @@
/datum/sprite_accessory/hair
icon = 'icons/mob/human_face.dmi' // default icon for all hairs
- bald
- name = "Bald"
- icon_state = "bald"
- gender = MALE
- species_allowed = list("Human", "Unathi", "Vox", "Diona", "Kidan", "Grey", "Plasmaman", "Skeleton")
+/datum/sprite_accessory/hair/bald
+ name = "Bald"
+ icon_state = "bald"
+ species_allowed = list("Human", "Unathi", "Vox", "Diona", "Kidan", "Grey", "Plasmaman", "Skeleton", "Vulpkanin", "Tajaran")
- short
- name = "Short Hair" // try to capatilize the names please~
- icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you
+/datum/sprite_accessory/hair/short
+ name = "Short Hair" // try to capatilize the names please~
+ icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you
- cut
- name = "Cut Hair"
- icon_state = "hair_c"
+/datum/sprite_accessory/hair/cut
+ name = "Cut Hair"
+ icon_state = "hair_c"
- long
- name = "Shoulder-length Hair"
- icon_state = "hair_b"
+/datum/sprite_accessory/hair/long
+ name = "Shoulder-length Hair"
+ icon_state = "hair_b"
- longalt
- name = "Shoulder-length Hair Alt"
- icon_state = "hair_longfringe"
+/datum/sprite_accessory/hair/longalt
+ name = "Shoulder-length Hair Alt"
+ icon_state = "hair_longfringe"
- /*longish
- name = "Longer Hair"
- icon_state = "hair_b2"*/
+/*/datum/sprite_accessory/hair/longish
+ name = "Longer Hair"
+ icon_state = "hair_b2"*/
- longer
- name = "Long Hair"
- icon_state = "hair_vlong"
+/datum/sprite_accessory/hair/longer
+ name = "Long Hair"
+ icon_state = "hair_vlong"
- longeralt
- name = "Long Hair Alt"
- icon_state = "hair_vlongfringe"
+/datum/sprite_accessory/hair/longeralt
+ name = "Long Hair Alt"
+ icon_state = "hair_vlongfringe"
- longest
- name = "Very Long Hair"
- icon_state = "hair_longest"
+/datum/sprite_accessory/hair/longest
+ name = "Very Long Hair"
+ icon_state = "hair_longest"
- longfringe
- name = "Long Fringe"
- icon_state = "hair_longfringe"
+/datum/sprite_accessory/hair/longfringe
+ name = "Long Fringe"
+ icon_state = "hair_longfringe"
- longestalt
- name = "Longer Fringe"
- icon_state = "hair_vlongfringe"
+/datum/sprite_accessory/hair/longestalt
+ name = "Longer Fringe"
+ icon_state = "hair_vlongfringe"
- halfbang
- name = "Half-banged Hair"
- icon_state = "hair_halfbang"
+/datum/sprite_accessory/hair/halfbang
+ name = "Half-banged Hair"
+ icon_state = "hair_halfbang"
- halfbangalt
- name = "Half-banged Hair Alt"
- icon_state = "hair_halfbang_alt"
+/datum/sprite_accessory/hair/halfbangalt
+ name = "Half-banged Hair Alt"
+ icon_state = "hair_halfbang_alt"
- ponytail1
- name = "Ponytail male"
- icon_state = "hair_ponytailm"
- gender = MALE
+/datum/sprite_accessory/hair/ponytail1
+ name = "Ponytail male"
+ icon_state = "hair_ponytailm"
+ gender = MALE
- ponytail2
- name = "Ponytail female"
- icon_state = "hair_ponytailf"
- gender = FEMALE
+/datum/sprite_accessory/hair/ponytail2
+ name = "Ponytail female"
+ icon_state = "hair_ponytailf"
+ gender = FEMALE
- ponytail3
- name = "Ponytail alt"
- icon_state = "hair_ponytail3"
+/datum/sprite_accessory/hair/ponytail3
+ name = "Ponytail alt"
+ icon_state = "hair_ponytail3"
- sideponytail
- name = "Side Ponytail"
- icon_state = "hair_stail"
- gender = FEMALE
+/datum/sprite_accessory/hair/sideponytail
+ name = "Side Ponytail"
+ icon_state = "hair_stail"
+ gender = FEMALE
- highponytail
- name = "High Ponytail"
- icon_state = "hair_highponytail"
- gender = FEMALE
+/datum/sprite_accessory/hair/highponytail
+ name = "High Ponytail"
+ icon_state = "hair_highponytail"
+ gender = FEMALE
+/datum/sprite_accessory/hair/wisp
+ name = "Wisp"
+ icon_state = "hair_wisp"
+ gender = FEMALE
- wisp
- name = "Wisp"
- icon_state = "hair_wisp"
- gender = FEMALE
+/datum/sprite_accessory/hair/parted
+ name = "Parted"
+ icon_state = "hair_parted"
- parted
- name = "Parted"
- icon_state = "hair_parted"
+/datum/sprite_accessory/hair/pompadour
+ name = "Pompadour"
+ icon_state = "hair_pompadour"
+ gender = MALE
+ species_allowed = list("Human", "Slime People", "Unathi")
- pompadour
- name = "Pompadour"
- icon_state = "hair_pompadour"
- gender = MALE
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/quiff
+ name = "Quiff"
+ icon_state = "hair_quiff"
+ gender = MALE
- quiff
- name = "Quiff"
- icon_state = "hair_quiff"
- gender = MALE
+/datum/sprite_accessory/hair/bedhead
+ name = "Bedhead"
+ icon_state = "hair_bedhead"
- bedhead
- name = "Bedhead"
- icon_state = "hair_bedhead"
+/datum/sprite_accessory/hair/bedhead2
+ name = "Bedhead 2"
+ icon_state = "hair_bedheadv2"
- bedhead2
- name = "Bedhead 2"
- icon_state = "hair_bedheadv2"
+/datum/sprite_accessory/hair/bedhead3
+ name = "Bedhead 3"
+ icon_state = "hair_bedheadv3"
- bedhead3
- name = "Bedhead 3"
- icon_state = "hair_bedheadv3"
+/datum/sprite_accessory/hair/beehive
+ name = "Beehive"
+ icon_state = "hair_beehive"
+ gender = FEMALE
+ species_allowed = list("Human", "Slime People", "Unathi")
- beehive
- name = "Beehive"
- icon_state = "hair_beehive"
- gender = FEMALE
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/bobcurl
+ name = "Bobcurl"
+ icon_state = "hair_bobcurl"
+ gender = FEMALE
+ species_allowed = list("Human", "Slime People", "Unathi")
- bobcurl
- name = "Bobcurl"
- icon_state = "hair_bobcurl"
- gender = FEMALE
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/bob
+ name = "Bob"
+ icon_state = "hair_bobcut"
+ gender = FEMALE
+ species_allowed = list("Human", "Slime People", "Unathi")
- bob
- name = "Bob"
- icon_state = "hair_bobcut"
- gender = FEMALE
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/bowl
+ name = "Bowl"
+ icon_state = "hair_bowlcut"
+ gender = MALE
- bowl
- name = "Bowl"
- icon_state = "hair_bowlcut"
- gender = MALE
+/datum/sprite_accessory/hair/braid2
+ name = "Long Braid"
+ icon_state = "hair_hbraid"
+ gender = FEMALE
- braid2
- name = "Long Braid"
- icon_state = "hair_hbraid"
- gender = FEMALE
+/datum/sprite_accessory/hair/braid_hip
+ name = "Hippie Braid"
+ icon_state = "hair_hipbraid"
+ secondary_theme = "beads"
- buzz
- name = "Buzzcut"
- icon_state = "hair_buzzcut"
- gender = MALE
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/braid_hip_una
+ name = "Unathi Hippie Braid"
+ icon_state = "hair_ubraid"
+ species_allowed = list("Unathi")
+ secondary_theme = "beads"
- crew
- name = "Crewcut"
- icon_state = "hair_crewcut"
- gender = MALE
+/datum/sprite_accessory/hair/buzz
+ name = "Buzzcut"
+ icon_state = "hair_buzzcut"
+ gender = MALE
+ species_allowed = list("Human", "Slime People", "Unathi")
- combover
- name = "Combover"
- icon_state = "hair_combover"
- gender = MALE
+/datum/sprite_accessory/hair/crew
+ name = "Crewcut"
+ icon_state = "hair_crewcut"
+ gender = MALE
- devillock
- name = "Devil Lock"
- icon_state = "hair_devilock"
+/datum/sprite_accessory/hair/combover
+ name = "Combover"
+ icon_state = "hair_combover"
+ gender = MALE
- dreadlocks
- name = "Dreadlocks"
- icon_state = "hair_dreads"
+/datum/sprite_accessory/hair/devillock
+ name = "Devil Lock"
+ icon_state = "hair_devilock"
- curls
- name = "Curls"
- icon_state = "hair_curls"
+/datum/sprite_accessory/hair/dreadlocks
+ name = "Dreadlocks"
+ icon_state = "hair_dreads"
- afro
- name = "Afro"
- icon_state = "hair_afro"
+/datum/sprite_accessory/hair/curls
+ name = "Curls"
+ icon_state = "hair_curls"
- afro2
- name = "Afro 2"
- icon_state = "hair_afro2"
+/datum/sprite_accessory/hair/afro
+ name = "Afro"
+ icon_state = "hair_afro"
- afro_large
- name = "Big Afro"
- icon_state = "hair_bigafro"
- gender = MALE
+/datum/sprite_accessory/hair/afro2
+ name = "Afro 2"
+ icon_state = "hair_afro2"
- sargeant
- name = "Flat Top"
- icon_state = "hair_sargeant"
- gender = MALE
+/datum/sprite_accessory/hair/afro_large
+ name = "Big Afro"
+ icon_state = "hair_bigafro"
+ gender = MALE
- emo
- name = "Emo"
- icon_state = "hair_emo"
+/datum/sprite_accessory/hair/sergeant
+ name = "Flat Top"
+ icon_state = "hair_sergeant"
+ gender = MALE
- fag
- name = "Flow Hair"
- icon_state = "hair_f"
+/datum/sprite_accessory/hair/emo
+ name = "Emo"
+ icon_state = "hair_emo"
- feather
- name = "Feather"
- icon_state = "hair_feather"
+/datum/sprite_accessory/hair/fag
+ name = "Flow Hair"
+ icon_state = "hair_f"
- hitop
- name = "Hitop"
- icon_state = "hair_hitop"
- gender = MALE
+/datum/sprite_accessory/hair/feather
+ name = "Feather"
+ icon_state = "hair_feather"
- mohawk
- name = "Mohawk"
- icon_state = "hair_d"
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/hitop
+ name = "Hitop"
+ icon_state = "hair_hitop"
+ gender = MALE
- jensen
- name = "Adam Jensen Hair"
- icon_state = "hair_jensen"
- gender = MALE
+/datum/sprite_accessory/hair/mohawk
+ name = "Mohawk"
+ icon_state = "hair_d"
+ species_allowed = list("Human", "Slime People", "Unathi")
- cia
- name = "CIA"
- icon_state = "hair_cia"
- gender = MALE
+/datum/sprite_accessory/hair/jensen
+ name = "Adam Jensen Hair"
+ icon_state = "hair_jensen"
+ gender = MALE
- mulder
- name = "Mulder"
- icon_state = "hair_mulder"
- gender = MALE
+/datum/sprite_accessory/hair/cia
+ name = "CIA"
+ icon_state = "hair_cia"
+ gender = MALE
- gelled
- name = "Gelled Back"
- icon_state = "hair_gelled"
- gender = FEMALE
+/datum/sprite_accessory/hair/mulder
+ name = "Mulder"
+ icon_state = "hair_mulder"
+ gender = MALE
- gentle
- name = "Gentle"
- icon_state = "hair_gentle"
- gender = FEMALE
+/datum/sprite_accessory/hair/gelled
+ name = "Gelled Back"
+ icon_state = "hair_gelled"
+ gender = FEMALE
- spiky
- name = "Spiky"
- icon_state = "hair_spikey"
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/gentle
+ name = "Gentle"
+ icon_state = "hair_gentle"
+ gender = FEMALE
- kusangi
- name = "Kusanagi Hair"
- icon_state = "hair_kusanagi"
+/datum/sprite_accessory/hair/spiky
+ name = "Spiky"
+ icon_state = "hair_spikey"
+ species_allowed = list("Human", "Slime People", "Unathi")
- kagami
- name = "Pigtails"
- icon_state = "hair_kagami"
- gender = FEMALE
+/datum/sprite_accessory/hair/kusanagi
+ name = "Kusanagi Hair"
+ icon_state = "hair_kusanagi"
- himecut
- name = "Hime Cut"
- icon_state = "hair_himecut"
- gender = FEMALE
+/datum/sprite_accessory/hair/kagami
+ name = "Pigtails"
+ icon_state = "hair_kagami"
+ gender = FEMALE
- braid
- name = "Floorlength Braid"
- icon_state = "hair_braid"
- gender = FEMALE
+/datum/sprite_accessory/hair/himecut
+ name = "Hime Cut"
+ icon_state = "hair_himecut"
+ gender = FEMALE
- odango
- name = "Odango"
- icon_state = "hair_odango"
- gender = FEMALE
+/datum/sprite_accessory/hair/braid
+ name = "Floorlength Braid"
+ icon_state = "hair_braid"
+ gender = FEMALE
- ombre
- name = "Ombre"
- icon_state = "hair_ombre"
- gender = FEMALE
+/datum/sprite_accessory/hair/odango
+ name = "Odango"
+ icon_state = "hair_odango"
+ gender = FEMALE
- updo
- name = "Updo"
- icon_state = "hair_updo"
- gender = FEMALE
+/datum/sprite_accessory/hair/ombre
+ name = "Ombre"
+ icon_state = "hair_ombre"
+ gender = FEMALE
- skinhead
- name = "Skinhead"
- icon_state = "hair_skinhead"
+/datum/sprite_accessory/hair/updo
+ name = "Updo"
+ icon_state = "hair_updo"
+ gender = FEMALE
- balding
- name = "Balding Hair"
- icon_state = "hair_e"
- gender = MALE // turnoff!
+/datum/sprite_accessory/hair/skinhead
+ name = "Skinhead"
+ icon_state = "hair_skinhead"
- longemo
- name = "Long Emo"
- icon_state = "hair_emolong"
- gender = FEMALE
+/datum/sprite_accessory/hair/balding
+ name = "Balding Hair"
+ icon_state = "hair_e"
+ gender = MALE // turnoff!
+
+/datum/sprite_accessory/hair/longemo
+ name = "Long Emo"
+ icon_state = "hair_emolong"
+ gender = FEMALE
//////////////////////////////
//////START VG HAIRSTYLES/////
//////////////////////////////
- birdnest
- name = "Bird Nest"
- icon_state = "hair_birdnest"
+/datum/sprite_accessory/hair/birdnest
+ name = "Bird Nest"
+ icon_state = "hair_birdnest"
- unkept
- name = "Unkempt"
- icon_state = "hair_unkept"
+/datum/sprite_accessory/hair/unkept
+ name = "Unkempt"
+ icon_state = "hair_unkept"
- duelist
- name = "Duelist"
- icon_state = "hair_duelist"
- gender = MALE
+/datum/sprite_accessory/hair/duelist
+ name = "Duelist"
+ icon_state = "hair_duelist"
+ gender = MALE
- modern
- name = "Modern"
- icon_state = "hair_modern"
- gender = FEMALE
+/datum/sprite_accessory/hair/modern
+ name = "Modern"
+ icon_state = "hair_modern"
+ gender = FEMALE
- unshavenmohawk
- name = "Unshaven Mohawk"
- icon_state = "hair_unshavenmohawk"
- gender = MALE
+/datum/sprite_accessory/hair/unshavenmohawk
+ name = "Unshaven Mohawk"
+ icon_state = "hair_unshavenmohawk"
+ gender = MALE
- drills
- name = "Twincurls"
- icon_state = "hair_twincurl"
- gender = FEMALE
+/datum/sprite_accessory/hair/drills
+ name = "Twincurls"
+ icon_state = "hair_twincurl"
+ gender = FEMALE
- minidrills
- name = "Twincurls 2"
- icon_state = "hair_twincurl2"
- gender = FEMALE
+/datum/sprite_accessory/hair/minidrills
+ name = "Twincurls 2"
+ icon_state = "hair_twincurl2"
+ gender = FEMALE
//////////////////////////////
//////END VG HAIRSTYLES///////
//////////////////////////////
+/datum/sprite_accessory/hair/ipc
+ species_allowed = list("Machine")
- ipc_screen_pink
- name = "Pink IPC Screen"
- icon_state = "ipc_pink"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_pink
+ name = "Pink IPC Screen"
+ icon_state = "ipc_pink"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_red
- name = "Red IPC Screen"
- icon_state = "ipc_red"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_red
+ name = "Red IPC Screen"
+ icon_state = "ipc_red"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_green
- name = "Green IPC Screen"
- icon_state = "ipc_green"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_green
+ name = "Green IPC Screen"
+ icon_state = "ipc_green"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_blue
- name = "Blue IPC Screen"
- icon_state = "ipc_blue"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_blue
+ name = "Blue IPC Screen"
+ icon_state = "ipc_blue"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_breakout
- name = "Breakout IPC Screen"
- icon_state = "ipc_breakout"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_breakout
+ name = "Breakout IPC Screen"
+ icon_state = "ipc_breakout"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_eight
- name = "Eight IPC Screen"
- icon_state = "ipc_eight"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_eight
+ name = "Eight IPC Screen"
+ icon_state = "ipc_eight"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_rainbow
- name = "Rainbow IPC Screen"
- icon_state = "ipc_rainbow"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_rainbow
+ name = "Rainbow IPC Screen"
+ icon_state = "ipc_rainbow"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_goggles
- name = "Goggles IPC Screen"
- icon_state = "ipc_goggles"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_goggles
+ name = "Goggles IPC Screen"
+ icon_state = "ipc_goggles"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_heart
- name = "Heart IPC Screen"
- icon_state = "ipc_heart"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_heart
+ name = "Heart IPC Screen"
+ icon_state = "ipc_heart"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_monoeye
- name = "Monoeye IPC Screen"
- icon_state = "ipc_monoeye"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_monoeye
+ name = "Monoeye IPC Screen"
+ icon_state = "ipc_monoeye"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_nature
- name = "Nature IPC Screen"
- icon_state = "ipc_nature"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_nature
+ name = "Nature IPC Screen"
+ icon_state = "ipc_nature"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_orange
- name = "Orange IPC Screen"
- icon_state = "ipc_orange"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_orange
+ name = "Orange IPC Screen"
+ icon_state = "ipc_orange"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_purple
- name = "Purple IPC Screen"
- icon_state = "ipc_purple"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_purple
+ name = "Purple IPC Screen"
+ icon_state = "ipc_purple"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_shower
- name = "Shower IPC Screen"
- icon_state = "ipc_shower"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_shower
+ name = "Shower IPC Screen"
+ icon_state = "ipc_shower"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_static
- name = "Static IPC Screen"
- icon_state = "ipc_static"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_static
+ name = "Static IPC Screen"
+ icon_state = "ipc_static"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_yellow
- name = "Yellow IPC Screen"
- icon_state = "ipc_yellow"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_yellow
+ name = "Yellow IPC Screen"
+ icon_state = "ipc_yellow"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_scrolling
- name = "Scanline IPC Screen"
- icon_state = "ipc_scroll"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_scrolling
+ name = "Scanline IPC Screen"
+ icon_state = "ipc_scroll"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_console
- name = "Console IPC Screen"
- icon_state = "ipc_console"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_console
+ name = "Console IPC Screen"
+ icon_state = "ipc_console"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_rgb
- name = "RGB IPC Screen"
- icon_state = "ipc_rgb"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_rgb
+ name = "RGB IPC Screen"
+ icon_state = "ipc_rgb"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_glider
- name = "Glider IPC Screen"
- icon_state = "ipc_gol_glider"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_glider
+ name = "Glider IPC Screen"
+ icon_state = "ipc_gol_glider"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- hesphiastos_alt_off
- name = "Dark Hesphiastos Screen"
- icon_state = "hesphiastos_alt_off"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_off
+ name = "Dark Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_off"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_pink
- name = "Pink Hesphiastos Screen"
- icon_state = "hesphiastos_alt_pink"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_pink
+ name = "Pink Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_pink"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_orange
- name = "Orange Hesphiastos Screen"
- icon_state = "hesphiastos_alt_orange"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_orange
+ name = "Orange Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_orange"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_goggle
- name = "Goggles Hesphiastos Screen"
- icon_state = "hesphiastos_alt_goggles"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_goggle
+ name = "Goggles Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_goggles"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_scroll
- name = "Scrolling Hesphiastos Screen"
- icon_state = "hesphiastos_alt_scroll"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_scroll
+ name = "Scrolling Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_scroll"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_rgb
- name = "RGB Hesphiastos Screen"
- icon_state = "hesphiastos_alt_rgb"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_rgb
+ name = "RGB Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_rgb"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_rainbow
- name = "Rainbow Hesphiastos Screen"
- icon_state = "hesphiastos_alt_rainbow"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_rainbow
+ name = "Rainbow Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_rainbow"
+ models_allowed = list("Hesphiastos Industries alt.")
+
+/*
+///////////////////////////////////
+/ =---------------------------= /
+/ == Alien Style Definitions == /
+/ =---------------------------= /
+///////////////////////////////////
+*/
+
+/datum/sprite_accessory/hair/unathi
+ species_allowed = list("Unathi")
+
+/datum/sprite_accessory/hair/unathi/una_horns
+ name = "Unathi Horns"
+ icon_state = "soghun_horns"
+
+/datum/sprite_accessory/hair/skrell
+ species_allowed = list("Skrell")
+
+/datum/sprite_accessory/hair/skrell/skr_tentacle_m
+ name = "Skrell Male Tentacles"
+ icon_state = "skrell_hair_m"
+ gender = MALE
+
+/datum/sprite_accessory/hair/skrell/skr_tentacle_f
+ name = "Skrell Female Tentacles"
+ icon_state = "skrell_hair_f"
+ gender = FEMALE
+
+/datum/sprite_accessory/hair/skrell/skr_gold_m
+ name = "Gold plated Skrell Male Tentacles"
+ icon_state = "skrell_hair_m"
+ gender = MALE
+ secondary_theme = "gold"
+ no_sec_colour = 1
+
+/datum/sprite_accessory/hair/skrell/skr_gold_f
+ name = "Gold chained Skrell Female Tentacles"
+ icon_state = "skrell_hair_f"
+ gender = FEMALE
+ secondary_theme = "gold"
+ no_sec_colour = 1
+
+/datum/sprite_accessory/hair/skrell/skr_clothtentacle_m
+ name = "Cloth draped Skrell Male Tentacles"
+ icon_state = "skrell_hair_m"
+ gender = MALE
+ secondary_theme = "cloth"
+
+/datum/sprite_accessory/hair/skrell/skr_clothtentacle_f
+ name = "Cloth draped Skrell Female Tentacles"
+ icon_state = "skrell_hair_f"
+ gender = FEMALE
+ secondary_theme = "cloth"
+
+/datum/sprite_accessory/hair/tajara
+ species_allowed = list("Tajaran")
+
+/datum/sprite_accessory/hair/tajara/taj_hair_clean
+ name = "Tajara Clean"
+ icon_state = "hair_clean"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_bangs
+ name = "Tajara Bangs"
+ icon_state = "hair_bangs"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_braid
+ name = "Tajara Braid"
+ icon_state = "hair_tbraid"
+ secondary_theme = "beads"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_shaggy
+ name = "Tajara Shaggy"
+ icon_state = "hair_shaggy"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_mohawk
+ name = "Tajaran Mohawk"
+ icon_state = "hair_mohawk"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_plait
+ name = "Tajara Plait"
+ icon_state = "hair_plait"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_straight
+ name = "Tajara Straight"
+ icon_state = "hair_straight"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_long
+ name = "Tajara Long"
+ icon_state = "hair_long"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_rattail
+ name = "Tajara Rat Tail"
+ icon_state = "hair_rattail"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_spiky
+ name = "Tajara Spikey"
+ icon_state = "hair_tajspikey"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_messy
+ name = "Tajara Messy"
+ icon_state = "hair_messy"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_curls
+ name = "Tajara Curly"
+ icon_state = "hair_curly"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_retro
+ name = "Tajaran Ladies' Retro"
+ icon_state = "hair_ladies_retro"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_victory
+ name = "Tajara Victory Curls"
+ icon_state = "hair_victory"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_bob
+ name = "Tajara Bob"
+ icon_state = "hair_tbob"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_fingercurl
+ name = "Tajara Finger Curls"
+ icon_state = "hair_fingerwave"
+
+/datum/sprite_accessory/hair/vulpkanin
+ species_allowed = list("Vulpkanin")
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_kajam
+ name = "Kajam"
+ icon_state = "kajam"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_keid
+ name = "Keid"
+ icon_state = "keid"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_adhara
+ name = "Adhara"
+ icon_state = "adhara"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_kleeia
+ name = "Kleeia"
+ icon_state = "kleeia"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_mizar
+ name = "Mizar"
+ icon_state = "mizar"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_apollo
+ name = "Apollo"
+ icon_state = "apollo"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_belle
+ name = "Belle"
+ icon_state = "belle"
+ secondary_theme = "bands"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_bun
+ name = "Bun"
+ icon_state = "bun"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_jagged
+ name = "Jagged"
+ icon_state = "jagged"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_curl
+ name = "Curl"
+ icon_state = "curl"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_hawk
+ name = "Hawk"
+ icon_state = "hawk"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_anita
+ name = "Anita"
+ icon_state = "anita"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_short
+ name = "Short"
+ icon_state = "short"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_spike
+ name = "Spike"
+ icon_state = "spike"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_braided
+ name = "Braided"
+ icon_state = "braided"
+ secondary_theme = "beads"
+
+/datum/sprite_accessory/hair/vox
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/hair/vox/vox_quills_short
+ name = "Short Vox Quills"
+ icon_state = "vox_shortquills"
+
+/datum/sprite_accessory/hair/vox/vox_crestedquills
+ name = "Crested Vox Quills"
+ icon_state = "vox_crestedquills"
+
+/datum/sprite_accessory/hair/vox/vox_tielquills
+ name = "Vox Tiel Quills"
+ icon_state = "vox_tielquills"
+
+/datum/sprite_accessory/hair/vox/vox_emperorquills
+ name = "Vox Emperor Quills"
+ icon_state = "vox_emperorquills"
+
+/datum/sprite_accessory/hair/vox/vox_keelquills
+ name = "Vox Keel Quills"
+ icon_state = "vox_keelquills"
+
+/datum/sprite_accessory/hair/vox/vox_keetquills
+ name = "Vox Keet Quills"
+ icon_state = "vox_keetquills"
+
+/datum/sprite_accessory/hair/vox/vox_quills_kingly
+ name = "Kingly Vox Quills"
+ icon_state = "vox_kingly"
+
+/datum/sprite_accessory/hair/vox/vox_quills_fluff
+ name = "Fluffy Vox Quills"
+ icon_state = "vox_afro"
+
+/datum/sprite_accessory/hair/vox/vox_quills_mohawk
+ name = "Vox Quill Mohawk"
+ icon_state = "vox_mohawk"
+
+/datum/sprite_accessory/hair/vox/vox_quills_long
+ name = "Long Vox Quills"
+ icon_state = "vox_yasu"
+
+/datum/sprite_accessory/hair/vox/vox_horns
+ name = "Vox Spikes"
+ icon_state = "vox_horns"
+
+/datum/sprite_accessory/hair/vox/vox_nights
+ name = "Vox Pigtails"
+ icon_state = "vox_nights"
+
+/datum/sprite_accessory/hair/vox/vox_razor
+ name = "Vox Razorback"
+ icon_state = "vox_razor"
+
+/datum/sprite_accessory/hair/vox/vox_razor_clipped
+ name = "Clipped Vox Razorback"
+ icon_state = "vox_razor_clipped"
+
+// Apollo-specific
+
+/datum/sprite_accessory/hair/wryn
+ species_allowed = list("Wryn")
+
+/datum/sprite_accessory/hair/wryn/wry_antennae_default
+ name = "Antennae"
+ icon_state = "wryn_antennae"
+
+/datum/sprite_accessory/hair/nucleation
+ species_allowed = list("Nucleation")
+
+/datum/sprite_accessory/hair/nucleation/nuc_crystals
+ name = "Nucleation Crystals"
+ icon_state = "nuc_crystal"
+
+/datum/sprite_accessory/hair/nucleation/nuc_betaburns
+ name = "Nucleation Beta Burns"
+ icon_state = "nuc_betaburns"
+
+/datum/sprite_accessory/hair/nucleation/nuc_fallout
+ name = "Nucleation Fallout"
+ icon_state = "nuc_fallout"
+
+/datum/sprite_accessory/hair/nucleation/nuc_frission
+ name = "Nucleation Frission"
+ icon_state = "nuc_frission"
+
+/datum/sprite_accessory/hair/nucleation/nuc_radical
+ name = "Nucleation Free Radical"
+ icon_state = "nuc_radical"
+
+/datum/sprite_accessory/hair/nucleation/nuc_gammaray
+ name = "Nucleation Gamma Ray"
+ icon_state = "nuc_gammaray"
+
+/datum/sprite_accessory/hair/nucleation/nuc_neutron
+ name = "Nucleation Neutron Bomb"
+ icon_state = "nuc_neutron"
/*
@@ -558,559 +833,232 @@
*/
/datum/sprite_accessory/facial_hair
-
icon = 'icons/mob/human_face.dmi'
gender = MALE // barf (unless you're a dorf, dorfs dig chix /w beards :P)
- shaved
- name = "Shaved"
- icon_state = "bald"
- gender = NEUTER
- species_allowed = list("Human", "Unathi", "Tajaran", "Skrell", "Vox", "Diona", "Kidan", "Greys", "Vulpkanin", "Slime People")
+/datum/sprite_accessory/facial_hair/shaved
+ name = "Shaved"
+ icon_state = "bald"
+ gender = NEUTER
+ species_allowed = list("Human", "Unathi", "Tajaran", "Skrell", "Vox", "Diona", "Kidan", "Greys", "Vulpkanin", "Slime People")
- watson
- name = "Watson Mustache"
- icon_state = "facial_watson"
+/datum/sprite_accessory/facial_hair/watson
+ name = "Watson Mustache"
+ icon_state = "facial_watson"
- hogan
- name = "Hulk Hogan Mustache"
- icon_state = "facial_hogan" //-Neek
+/datum/sprite_accessory/facial_hair/hogan
+ name = "Hulk Hogan Mustache"
+ icon_state = "facial_hogan" //-Neek
- vandyke
- name = "Van Dyke Mustache"
- icon_state = "facial_vandyke"
+/datum/sprite_accessory/facial_hair/vandyke
+ name = "Van Dyke Mustache"
+ icon_state = "facial_vandyke"
- chaplin
- name = "Square Mustache"
- icon_state = "facial_chaplin"
+/datum/sprite_accessory/facial_hair/chaplin
+ name = "Square Mustache"
+ icon_state = "facial_chaplin"
- selleck
- name = "Selleck Mustache"
- icon_state = "facial_selleck"
+/datum/sprite_accessory/facial_hair/selleck
+ name = "Selleck Mustache"
+ icon_state = "facial_selleck"
- neckbeard
- name = "Neckbeard"
- icon_state = "facial_neckbeard"
+/datum/sprite_accessory/facial_hair/neckbeard
+ name = "Neckbeard"
+ icon_state = "facial_neckbeard"
- fullbeard
- name = "Full Beard"
- icon_state = "facial_fullbeard"
+/datum/sprite_accessory/facial_hair/fullbeard
+ name = "Full Beard"
+ icon_state = "facial_fullbeard"
- longbeard
- name = "Long Beard"
- icon_state = "facial_longbeard"
+/datum/sprite_accessory/facial_hair/longbeard
+ name = "Long Beard"
+ icon_state = "facial_longbeard"
- vlongbeard
- name = "Very Long Beard"
- icon_state = "facial_wise"
+/datum/sprite_accessory/facial_hair/vlongbeard
+ name = "Very Long Beard"
+ icon_state = "facial_wise"
- elvis
- name = "Elvis Sideburns"
- icon_state = "facial_elvis"
- species_allowed = list("Human","Unathi")
+/datum/sprite_accessory/facial_hair/elvis
+ name = "Elvis Sideburns"
+ icon_state = "facial_elvis"
+ species_allowed = list("Human", "Slime People", "Unathi")
- abe
- name = "Abraham Lincoln Beard"
- icon_state = "facial_abe"
+/datum/sprite_accessory/facial_hair/abe
+ name = "Abraham Lincoln Beard"
+ icon_state = "facial_abe"
- chinstrap
- name = "Chinstrap"
- icon_state = "facial_chin"
+/datum/sprite_accessory/facial_hair/chinstrap
+ name = "Chinstrap"
+ icon_state = "facial_chin"
- hip
- name = "Hipster Beard"
- icon_state = "facial_hip"
+/datum/sprite_accessory/facial_hair/hip
+ name = "Hipster Beard"
+ icon_state = "facial_hip"
- gt
- name = "Goatee"
- icon_state = "facial_gt"
+/datum/sprite_accessory/facial_hair/gt
+ name = "Goatee"
+ icon_state = "facial_gt"
- jensen
- name = "Adam Jensen Beard"
- icon_state = "facial_jensen"
+/datum/sprite_accessory/facial_hair/jensen
+ name = "Adam Jensen Beard"
+ icon_state = "facial_jensen"
- dwarf
- name = "Dwarf Beard"
- icon_state = "facial_dwarf"
+/datum/sprite_accessory/facial_hair/dwarf
+ name = "Dwarf Beard"
+ icon_state = "facial_dwarf"
//////////////////////////////
//////START VG HAIRSTYLES/////
//////////////////////////////
- britstache
- name = "Brit Stache"
- icon_state = "facial_britstache"
+/datum/sprite_accessory/facial_hair/britstache
+ name = "Brit Stache"
+ icon_state = "facial_britstache"
- martialartist
- name = "Martial Artist"
- icon_state = "facial_martialartist"
+/datum/sprite_accessory/facial_hair/martialartist
+ name = "Martial Artist"
+ icon_state = "facial_martialartist"
- moonshiner
- name = "Moonshiner"
- icon_state = "facial_moonshiner"
+/datum/sprite_accessory/facial_hair/moonshiner
+ name = "Moonshiner"
+ icon_state = "facial_moonshiner"
- tribeard
- name = "Tri-beard"
- icon_state = "facial_tribeard"
+/datum/sprite_accessory/facial_hair/tribeard
+ name = "Tri-beard"
+ icon_state = "facial_tribeard"
- unshaven
- name = "Unshaven"
- icon_state = "facial_unshaven"
+/datum/sprite_accessory/facial_hair/unshaven
+ name = "Unshaven"
+ icon_state = "facial_unshaven"
//////////////////////////////
//////END VG HAIRSTYLES///////
//////////////////////////////
-/*
-///////////////////////////////////
-/ =---------------------------= /
-/ == Alien Style Definitions == /
-/ =---------------------------= /
-///////////////////////////////////
-*/
+/datum/sprite_accessory/facial_hair/tajara
+ species_allowed = list("Tajaran")
-/datum/sprite_accessory/hair
+/datum/sprite_accessory/facial_hair/tajara/taj_sideburns
+ name = "Tajara Sideburns"
+ icon_state = "facial_sideburns"
- una_horns
- name = "Unathi Horns"
- icon_state = "soghun_horns"
- species_allowed = list("Unathi")
+/datum/sprite_accessory/facial_hair/tajara/taj_mutton
+ name = "Tajara Mutton"
+ icon_state = "facial_mutton"
- skr_tentacle_m
- name = "Skrell Male Tentacles"
- icon_state = "skrell_hair_m"
- species_allowed = list("Skrell")
- gender = MALE
+/datum/sprite_accessory/facial_hair/tajara/taj_pencilstache
+ name = "Tajara Pencilstache"
+ icon_state = "facial_pencilstache"
- skr_tentacle_f
- name = "Skrell Female Tentacles"
- icon_state = "skrell_hair_f"
- species_allowed = list("Skrell")
- gender = FEMALE
+/datum/sprite_accessory/facial_hair/tajara/taj_moustache
+ name = "Tajara Moustache"
+ icon_state = "facial_moustache"
- skr_gold_m
- name = "Gold plated Skrell Male Tentacles"
- icon_state = "skrell_goldhair_m"
- species_allowed = list("Skrell")
- gender = MALE
+/datum/sprite_accessory/facial_hair/tajara/taj_goatee
+ name = "Tajara Goatee"
+ icon_state = "facial_goatee"
- skr_gold_f
- name = "Gold chained Skrell Female Tentacles"
- icon_state = "skrell_goldhair_f"
- species_allowed = list("Skrell")
- gender = FEMALE
+/datum/sprite_accessory/facial_hair/tajara/taj_smallstache
+ name = "Tajara Smallstache"
+ icon_state = "facial_smallstache"
+
+/datum/sprite_accessory/facial_hair/vox
+ species_allowed = list("Vox")
+ gender = NEUTER
+
+/datum/sprite_accessory/facial_hair/vox/vox_colonel
+ name = "Vox Colonel Beard"
+ icon_state = "vox_colonel"
+
+/datum/sprite_accessory/facial_hair/vox/vox_long
+ name = "Long Mustache"
+ icon_state = "vox_fu"
+
+/datum/sprite_accessory/facial_hair/vox/vox_neck
+ name = "Neck Quills"
+ icon_state = "vox_neck"
+
+/datum/sprite_accessory/facial_hair/vox/vox_beard
+ name = "Vox Quill Beard"
+ icon_state = "vox_beard"
+
+/datum/sprite_accessory/facial_hair/vulpkanin
+ species_allowed = list("Vulpkanin")
+ gender = NEUTER
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_blaze
+ name = "Blaze"
+ icon_state = "vulp_facial_blaze"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_vulpine
+ name = "Vulpine"
+ icon_state = "vulp_facial_vulpine"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_vulpine_brows
+ name = "Vulpine and Brows"
+ icon_state = "vulp_facial_vulpine_brows"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_vulpine_fluff
+ name = "Vulpine and Earfluff"
+ icon_state = "vulp_facial_vulpine_fluff"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_mask
+ name = "Mask"
+ icon_state = "vulp_facial_mask"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_patch
+ name = "Patch"
+ icon_state = "vulp_facial_patch"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_ruff
+ name = "Ruff"
+ icon_state = "vulp_facial_ruff"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_kita
+ name = "Kita"
+ icon_state = "vulp_facial_kita"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_swift
+ name = "Swift"
+ icon_state = "vulp_facial_swift"
+
+/datum/sprite_accessory/facial_hair/unathi
+ species_allowed = list("Unathi")
+ gender = NEUTER
+
+/datum/sprite_accessory/facial_hair/unathi/una_spines_long
+ name = "Long Spines"
+ icon_state = "soghun_longspines"
+
+/datum/sprite_accessory/facial_hair/unathi/una_spines_short
+ name = "Short Spines"
+ icon_state = "soghun_shortspines"
+
+/datum/sprite_accessory/facial_hair/unathi/una_frills_aquatic
+ name = "Aquatic Frills"
+ icon_state = "soghun_aquaticfrills"
- skr_clothtentacle_m
- name = "Cloth draped Skrell Male Tentacles"
- icon_state = "skrell_clothhair_m"
- species_allowed = list("Skrell")
- gender = MALE
+/datum/sprite_accessory/facial_hair/unathi/una_frills_long
+ name = "Long Frills"
+ icon_state = "soghun_longfrills"
- skr_clothtentacle_f
- name = "Cloth draped Skrell Female Tentacles"
- icon_state = "skrell_clothhair_f"
- species_allowed = list("Skrell")
- gender = FEMALE
-
- taj_ears
- name = "Tajaran Ears"
- icon_state = "ears_plain"
- species_allowed = list("Tajaran")
-
- taj_ears_clean
- name = "Tajara Clean"
- icon_state = "hair_clean"
- species_allowed = list("Tajaran")
-
- taj_ears_bangs
- name = "Tajara Bangs"
- icon_state = "hair_bangs"
- species_allowed = list("Tajaran")
-
- taj_ears_braid
- name = "Tajara Braid"
- icon_state = "hair_tbraid"
- species_allowed = list("Tajaran")
-
- taj_ears_shaggy
- name = "Tajara Shaggy"
- icon_state = "hair_shaggy"
- species_allowed = list("Tajaran")
-
- taj_ears_mohawk
- name = "Tajaran Mohawk"
- icon_state = "hair_mohawk"
- species_allowed = list("Tajaran")
-
- taj_ears_plait
- name = "Tajara Plait"
- icon_state = "hair_plait"
- species_allowed = list("Tajaran")
-
- taj_ears_straight
- name = "Tajara Straight"
- icon_state = "hair_straight"
- species_allowed = list("Tajaran")
-
- taj_ears_long
- name = "Tajara Long"
- icon_state = "hair_long"
- species_allowed = list("Tajaran")
-
- taj_ears_rattail
- name = "Tajara Rat Tail"
- icon_state = "hair_rattail"
- species_allowed = list("Tajaran")
-
- taj_ears_spiky
- name = "Tajara Spiky"
- icon_state = "hair_tajspiky"
- species_allowed = list("Tajaran")
-
- taj_ears_messy
- name = "Tajara Messy"
- icon_state = "hair_messy"
- species_allowed = list("Tajaran")
-
-//Vulpkanin
-
- vulp_hair_none
- name = "None"
- icon_state = "bald"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_kajam
- name = "Kajam"
- icon_state = "kajam"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_keid
- name = "Keid"
- icon_state = "keid"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_adhara
- name = "Adhara"
- icon_state = "adhara"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_kleeia
- name = "Kleeia"
- icon_state = "kleeia"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_mizar
- name = "Mizar"
- icon_state = "mizar"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_apollo
- name = "Apollo"
- icon_state = "apollo"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_belle
- name = "Belle"
- icon_state = "belle"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_bun
- name = "Bun"
- icon_state = "bun"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_jagged
- name = "Jagged"
- icon_state = "jagged"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_curl
- name = "Curl"
- icon_state = "curl"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_hawk
- name = "Hawk"
- icon_state = "hawk"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_anita
- name = "Anita"
- icon_state = "anita"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_short
- name = "Short"
- icon_state = "short"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_spike
- name = "Spike"
- icon_state = "spike"
- species_allowed = list("Vulpkanin")
-
-//Vox
-
- vox_quills_short
- name = "Short Vox Quills"
- icon_state = "vox_shortquills"
- species_allowed = list("Vox")
-
- vox_crestedquills
- name = "Crested Vox Quills"
- icon_state = "vox_crestedquills"
- species_allowed = list("Vox")
-
- vox_tielquills
- name = "Vox Tiel Quills"
- icon_state = "vox_tielquills"
- species_allowed = list("Vox")
-
- vox_emperorquills
- name = "Vox Emperor Quills"
- icon_state = "vox_emperorquills"
- species_allowed = list("Vox")
-
- vox_keelquills
- name = "Vox Keel Quills"
- icon_state = "vox_keelquills"
- species_allowed = list("Vox")
-
- vox_keetquills
- name = "Vox Keet Quills"
- icon_state = "vox_keetquills"
- species_allowed = list("Vox")
-
- vox_quills_kingly
- name = "Kingly Vox Quills"
- icon_state = "vox_kingly"
- species_allowed = list("Vox")
-
- vox_quills_fluff
- name = "Fluffy Vox Quills"
- icon_state = "vox_afro"
- species_allowed = list("Vox")
-
- vox_quills_mohawk
- name = "Vox Quill Mohawk"
- icon_state = "vox_mohawk"
- species_allowed = list("Vox")
-
- vox_quills_long
- name = "Long Vox Quills"
- icon_state = "vox_yasu"
- species_allowed = list("Vox")
-
- vox_horns
- name = "Vox Spikes"
- icon_state = "vox_horns"
- species_allowed = list("Vox")
-
- vox_nights
- name = "Vox Pigtails"
- icon_state = "vox_nights"
- species_allowed = list("Vox")
-
- vox_razor
- name = "Vox Razorback"
- icon_state = "vox_razor"
- species_allowed = list("Vox")
-
-// Apollo-specific
-
- //Wryn antennae
-
- wry_antennae_default
- name = "Antennae"
- icon_state = "wryn_antennae"
- species_allowed = list("Wryn")
-
- //Nucleation "hairstyles"
-
- nuc_crystals
- name = "Nucleation Crystals"
- icon_state = "nuc_crystal"
- species_allowed = list("Nucleation")
-
- nuc_betaburns
- name = "Nucleation Beta Burns"
- icon_state = "nuc_betaburns"
- species_allowed = list("Nucleation")
-
- nuc_fallout
- name = "Nucleation Fallout"
- icon_state = "nuc_fallout"
- species_allowed = list("Nucleation")
-
- nuc_frission
- name = "Nucleation Frission"
- icon_state = "nuc_frission"
- species_allowed = list("Nucleation")
-
- nuc_radical
- name = "Nucleation Free Radical"
- icon_state = "nuc_radical"
- species_allowed = list("Nucleation")
-
- nuc_gammaray
- name = "Nucleation Gamma Ray"
- icon_state = "nuc_gammaray"
- species_allowed = list("Nucleation")
-
- nuc_neutron
- name = "Nucleation Neutron Bomb"
- icon_state = "nuc_neutron"
- species_allowed = list("Nucleation")
-
-/datum/sprite_accessory/facial_hair
-
-//Tajara
-
- taj_sideburns
- name = "Tajara Sideburns"
- icon_state = "facial_sideburns"
- species_allowed = list("Tajaran")
-
- taj_mutton
- name = "Tajara Mutton"
- icon_state = "facial_mutton"
- species_allowed = list("Tajaran")
-
- taj_pencilstache
- name = "Tajara Pencilstache"
- icon_state = "facial_pencilstache"
- species_allowed = list("Tajaran")
-
- taj_moustache
- name = "Tajara Moustache"
- icon_state = "facial_moustache"
- species_allowed = list("Tajaran")
-
- taj_goatee
- name = "Tajara Goatee"
- icon_state = "facial_goatee"
- species_allowed = list("Tajaran")
-
- taj_smallstache
- name = "Tajara Smallstache"
- icon_state = "facial_smallstache"
- species_allowed = list("Tajaran")
-
-//Vox
-
- vox_colonel
- name = "Vox Colonel Beard"
- icon_state = "vox_colonel"
- species_allowed = list("Vox")
-
- vox_long
- name = "Long Mustache"
- icon_state = "vox_fu"
- species_allowed = list("Vox")
-
- vox_neck
- name = "Neck Quills"
- icon_state = "vox_neck"
- species_allowed = list("Vox")
-
- vox_beard
- name = "Vox Quill Beard"
- icon_state = "vox_beard"
- species_allowed = list("Vox")
-
-//Vulpkanin
-
- vulp_blaze
- name = "Blaze"
- icon_state = "vulp_facial_blaze"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_vulpine
- name = "Vulpine"
- icon_state = "vulp_facial_vulpine"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_vulpine_fluff
- name = "Vulpine and Earfluff"
- icon_state = "vulp_facial_vulpine_fluff"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_mask
- name = "Mask"
- icon_state = "vulp_facial_mask"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_patch
- name = "Patch"
- icon_state = "vulp_facial_patch"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_ruff
- name = "Ruff"
- icon_state = "vulp_facial_ruff"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_kita
- name = "Kita"
- icon_state = "vulp_facial_kita"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_swift
- name = "Swift"
- icon_state = "vulp_facial_swift"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
-//Unathi
-
- una_spines_long
- name = "Long Spines"
- icon_state = "soghun_longspines"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_spines_short
- name = "Short Spines"
- icon_state = "soghun_shortspines"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_frills_long
- name = "Long Frills"
- icon_state = "soghun_longfrills"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_frills_short
- name = "Short Frills"
- icon_state = "soghun_shortfrills"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_frills_webbed_long
- name = "Long Webbed Frills"
- icon_state = "soghun_longfrills_webbed"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_frills_webbed_short
- name = "Short Webbed Frills"
- icon_state = "soghun_shortfrills_webbed"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_frills_webbed_aquatic
- name = "Aquatic Frills"
- icon_state = "soghun_aquaticfrills_webbed"
- species_allowed = list("Unathi")
- gender = NEUTER
+/datum/sprite_accessory/facial_hair/unathi/una_frills_short
+ name = "Short Frills"
+ icon_state = "soghun_shortfrills"
+/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_aquatic
+ name = "Aquatic Webbed Frills"
+ icon_state = "soghun_aquaticfrills"
+ secondary_theme = "webbing"
+
+/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_long
+ name = "Long Webbed Frills"
+ icon_state = "soghun_longfrills"
+ secondary_theme = "webbing"
+
+/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_short
+ name = "Short Webbed Frills"
+ icon_state = "soghun_shortfrills"
+ secondary_theme = "webbing"
//skin styles - WIP
//going to have to re-integrate this with surgery
@@ -1118,420 +1066,355 @@
/datum/sprite_accessory/skin
icon = 'icons/mob/human_races/r_human.dmi'
- human
- name = "Default human skin"
- icon_state = "default"
- species_allowed = list("Human")
+/datum/sprite_accessory/skin/human
+ name = "Default human skin"
+ icon_state = "default"
+ species_allowed = list("Human")
- human_tatt01
- name = "Tatt01 human skin"
- icon_state = "tatt1"
- species_allowed = list("Human")
+/datum/sprite_accessory/skin/human/human_tatt01
+ name = "Tatt01 human skin"
+ icon_state = "tatt1"
- tajaran
- name = "Default tajaran skin"
- icon_state = "default"
- icon = 'icons/mob/human_races/r_tajaran.dmi'
- species_allowed = list("Tajaran")
+/datum/sprite_accessory/skin/tajaran
+ name = "Default tajaran skin"
+ icon_state = "default"
+ icon = 'icons/mob/human_races/r_tajaran.dmi'
+ species_allowed = list("Tajaran")
- vulpkanin
- name = "Default Vulpkanin skin"
- icon_state = "default"
- icon = 'icons/mob/human_races/r_vulpkanin.dmi'
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/skin/vulpkanin
+ name = "Default Vulpkanin skin"
+ icon_state = "default"
+ icon = 'icons/mob/human_races/r_vulpkanin.dmi'
+ species_allowed = list("Vulpkanin")
- unathi
- name = "Default Unathi skin"
- icon_state = "default"
- icon = 'icons/mob/human_races/r_lizard.dmi'
- species_allowed = list("Unathi")
+/datum/sprite_accessory/skin/unathi
+ name = "Default Unathi skin"
+ icon_state = "default"
+ icon = 'icons/mob/human_races/r_lizard.dmi'
+ species_allowed = list("Unathi")
- skrell
- name = "Default skrell skin"
- icon_state = "default"
- icon = 'icons/mob/human_races/r_skrell.dmi'
- species_allowed = list("Skrell")
+/datum/sprite_accessory/skin/skrell
+ name = "Default skrell skin"
+ icon_state = "default"
+ icon = 'icons/mob/human_races/r_skrell.dmi'
+ species_allowed = list("Skrell")
///////////////////////////
// Underwear Definitions //
///////////////////////////
/datum/sprite_accessory/underwear
icon = 'icons/mob/underwear.dmi'
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask")
+ gender = NEUTER
- species_allowed = list("Human", "Unathi", "Vox", "Diona", "Vulpkanin", "Kidan", "Grey", "Plasmaman", "Skeleton", "Machine")
+/datum/sprite_accessory/underwear/nude
+ name = "Nude"
+ icon_state = null
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask", "Vox")
- nude
- name = "Nude"
- icon_state = null
- gender = NEUTER
+/datum/sprite_accessory/underwear/male
+ gender = MALE
- male_white
- name = "Mens White"
- icon_state = "male_white"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_white
+ name = "Mens White"
+ icon_state = "male_white"
- male_grey
- name = "Mens Grey"
- icon_state = "male_grey"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_grey
+ name = "Mens Grey"
+ icon_state = "male_grey"
- male_grey
- name = "Mens Grey Alt"
- icon_state = "male_greyalt"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_grey
+ name = "Mens Grey Alt"
+ icon_state = "male_greyalt"
- male_green
- name = "Mens Green"
- icon_state = "male_green"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_green
+ name = "Mens Green"
+ icon_state = "male_green"
- male_blue
- name = "Mens Blue"
- icon_state = "male_blue"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_blue
+ name = "Mens Blue"
+ icon_state = "male_blue"
- male_red
- name = "Mens Red"
- icon_state = "male_red"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_red
+ name = "Mens Red"
+ icon_state = "male_red"
- male_black
- name = "Mens Black"
- icon_state = "male_black"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_black
+ name = "Mens Black"
+ icon_state = "male_black"
- male_black_alt
- name = "Mens Black Alt"
- icon_state = "male_blackalt"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_black_alt
+ name = "Mens Black Alt"
+ icon_state = "male_blackalt"
- male_striped
- name = "Mens Striped"
- icon_state = "male_stripe"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_striped
+ name = "Mens Striped"
+ icon_state = "male_stripe"
- male_heart
- name = "Mens Hearts"
- icon_state = "male_hearts"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_heart
+ name = "Mens Hearts"
+ icon_state = "male_hearts"
- male_kinky
- name = "Mens Kinky"
- icon_state = "male_kinky"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_kinky
+ name = "Mens Kinky"
+ icon_state = "male_kinky"
- male_mankini
- name = "Mankini"
- icon_state = "male_mankini"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_mankini
+ name = "Mankini"
+ icon_state = "male_mankini"
- female_red
- name = "Ladies Red"
- icon_state = "female_red"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female
+ gender = FEMALE
- female_green
- name = "Ladies Green"
- icon_state = "female_green"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_red
+ name = "Ladies Red"
+ icon_state = "female_red"
- female_white
- name = "Ladies White"
- icon_state = "female_white"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_green
+ name = "Ladies Green"
+ icon_state = "female_green"
- female_whiter
- name = "Ladies Whiter"
- icon_state = "female_whiter"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_white
+ name = "Ladies White"
+ icon_state = "female_white"
- female_whitealt
- name = "Ladies White Alt"
- icon_state = "female_whitealt"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_whiter
+ name = "Ladies Whiter"
+ icon_state = "female_whiter"
- female_yellow
- name = "Ladies Yellow"
- icon_state = "female_yellow"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_whitealt
+ name = "Ladies White Alt"
+ icon_state = "female_whitealt"
- female_blue
- name = "Ladies Blue"
- icon_state = "female_blue"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_yellow
+ name = "Ladies Yellow"
+ icon_state = "female_yellow"
- female_babyblue
- name = "Ladies Baby Blue"
- icon_state = "female_babyblue"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_blue
+ name = "Ladies Blue"
+ icon_state = "female_blue"
+/datum/sprite_accessory/underwear/female/female_babyblue
+ name = "Ladies Baby Blue"
+ icon_state = "female_babyblue"
- female_black
- name = "Ladies Black"
- icon_state = "female_black"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_black
+ name = "Ladies Black"
+ icon_state = "female_black"
- female_blacker
- name = "Ladies Blacker"
- icon_state = "female_blacker"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_blacker
+ name = "Ladies Blacker"
+ icon_state = "female_blacker"
- female_blackalt
- name = "Ladies Black Alt"
- icon_state = "female_blackalt"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_blackalt
+ name = "Ladies Black Alt"
+ icon_state = "female_blackalt"
- female_kinky
- name = "Ladies Kinky"
- icon_state = "female_kinky"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_kinky
+ name = "Ladies Kinky"
+ icon_state = "female_kinky"
- female_babydoll
- name = "Ladies Full Grey"
- icon_state = "female_babydoll"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_babydoll
+ name = "Ladies Full Grey"
+ icon_state = "female_babydoll"
- female_pink
- name = "Ladies Pink"
- icon_state = "female_pink"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_pink
+ name = "Ladies Pink"
+ icon_state = "female_pink"
- female_thong
- name = "Ladies Thong"
- icon_state = "female_thong"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_thong
+ name = "Ladies Thong"
+ icon_state = "female_thong"
////////////////////////////
// Undershirt Definitions //
////////////////////////////
/datum/sprite_accessory/undershirt
icon = 'icons/mob/underwear.dmi'
-
- species_allowed = list("Human", "Unathi", "Vox", "Diona", "Vulpkanin", "Kidan", "Grey", "Plasmaman", "Skeleton", "Machine")
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask")
+ gender = NEUTER
/datum/sprite_accessory/undershirt/nude
name = "Nude"
icon_state = null
- gender = NEUTER
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask", "Vox")
//plain color shirts
/datum/sprite_accessory/undershirt/shirt_white
name = "White Shirt"
icon_state = "shirt_white"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_black
name = "Black Shirt"
icon_state = "shirt_black"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_blacker
name = "Blacker Shirt"
icon_state = "shirt_blacker"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_grey
name = "Grey Shirt"
icon_state = "shirt_grey"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_red
name = "Red Shirt"
icon_state = "shirt_red"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_blue
name = "Blue Shirt"
icon_state = "shirt_blue"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_yellow
name = "Yellow Shirt"
icon_state = "shirt_yellow"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_green
name = "Green Shirt"
icon_state = "shirt_green"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_darkblue
name = "Dark Blue Shirt"
icon_state = "shirt_darkblue"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_darkred
name = "Dark Red Shirt"
icon_state = "shirt_darkred"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_darkgreen
name = "Dark Green Shirt"
icon_state = "shirt_darkgreen"
- gender = NEUTER
//end plain color shirts
+//graphic shirts
/datum/sprite_accessory/undershirt/shirt_heart
name = "Heart Shirt"
icon_state = "shirt_heart"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_corgi
name = "Corgi Shirt"
icon_state = "shirt_corgi"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_clown
name = "Clown Shirt"
icon_state = "shirt_clown"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_alien
name = "Alien Shirt"
icon_state = "shirt_alien"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_jack
name = "Union Jack Shirt"
icon_state = "shirt_jack"
- gender = NEUTER
/datum/sprite_accessory/undershirt/love_nt
name = "I Love NT Shirt"
icon_state = "shirt_lovent"
- gender = NEUTER
/datum/sprite_accessory/undershirt/peace
name = "Peace Shirt"
icon_state = "shirt_peace"
- gender = NEUTER
/datum/sprite_accessory/undershirt/mondmondjaja
name = "Band Shirt"
icon_state = "shirt_band"
- gender = NEUTER
/datum/sprite_accessory/undershirt/pacman
name = "Pogoman Shirt"
icon_state = "shirt_pogoman"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_ss13
name = "SS13 Shirt"
icon_state = "shirt_ss13"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_question
name = "Question Mark Shirt"
icon_state = "shirt_question"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_skull
name = "Skull Shirt"
icon_state = "shirt_skull"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_commie
name = "Communist Shirt"
icon_state = "shirt_commie"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_nano
name = "Nanotrasen Shirt"
icon_state = "shirt_nano"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_meat
name = "Meat Shirt"
icon_state = "shirt_meat"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_tiedie
name = "Tiedie Shirt"
icon_state = "shirt_tiedie"
- gender = NEUTER
/datum/sprite_accessory/undershirt/blue_striped
name = "Striped Blue Shirt"
icon_state = "shirt_bluestripe"
- gender = NEUTER
/datum/sprite_accessory/undershirt/brightblue_striped
name = "Striped Bright Blue Shirt"
icon_state = "shirt_brightbluestripe"
- gender = NEUTER
-
+//end graphic shirts
//short sleeved
/datum/sprite_accessory/undershirt/short_white
name = "White Short-sleeved Shirt"
icon_state = "short_white"
- gender = NEUTER
/datum/sprite_accessory/undershirt/short_purple
name = "Purple Short-sleeved Shirt"
icon_state = "short_purple"
- gender = NEUTER
/datum/sprite_accessory/undershirt/short_blue
name = "Blue Short-sleeved Shirt"
icon_state = "short_blue"
- gender = NEUTER
/datum/sprite_accessory/undershirt/short_green
name = "Green Short-sleeved Shirt"
icon_state = "short_green"
- gender = NEUTER
/datum/sprite_accessory/undershirt/short_black
name = "Black Short-sleeved Shirt"
icon_state = "short_black"
- gender = NEUTER
//end short sleeved
//polo shirts
/datum/sprite_accessory/undershirt/polo_blue
name = "Blue Polo Shirt"
icon_state = "polo_blue"
- gender = NEUTER
/datum/sprite_accessory/undershirt/polo_red
name = "Red Polo Shirt"
icon_state = "polo_red"
- gender = NEUTER
/datum/sprite_accessory/undershirt/polo_greyelllow
name = "Grey-Yellow Polo Shirt"
icon_state = "polo_greyellow"
- gender = NEUTER
//end polo shirts
//sport shirts
/datum/sprite_accessory/undershirt/sport_green
name = "Green Sports Shirt"
icon_state = "sport_green"
- gender = NEUTER
/datum/sprite_accessory/undershirt/sport_red
name = "Red Sports Shirt"
icon_state = "sport_red"
- gender = NEUTER
/datum/sprite_accessory/undershirt/sport_blue
name = "Blue Sports Shirt"
icon_state = "sport_blue"
- gender = NEUTER
-//end sport shirts
/datum/sprite_accessory/undershirt/jersey_red
name = "Red Jersey"
icon_state = "jersey_red"
- gender = NEUTER
/datum/sprite_accessory/undershirt/jersey_blue
name = "Blue Jersey"
icon_state = "jersey_blue"
- gender = NEUTER
-
+//end sport shirts
//tanktops
/datum/sprite_accessory/undershirt/tank_redtop
@@ -1552,39 +1435,30 @@
/datum/sprite_accessory/undershirt/tank_white
name = "White Tank-Top"
icon_state = "tank_white"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_black
name = "Black Tank-Top"
icon_state = "tank_black"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_blacker
name = "Blacker Tank-Top"
icon_state = "tank_blacker"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_grey
name = "Grey Tank-Top"
icon_state = "tank_grey"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_red
name = "Red Tank-Top"
icon_state = "tank_red"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_fire
name = "Fire Tank-Top"
icon_state = "tank_fire"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_stripes
name = "Striped Tank-Top"
icon_state = "tank_stripes"
- gender = NEUTER
-
-
//end tanktops
///////////////////////
@@ -1592,174 +1466,127 @@
///////////////////////
/datum/sprite_accessory/socks
icon = 'icons/mob/underwear.dmi'
- species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton")
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask")
+ gender = NEUTER
/datum/sprite_accessory/socks/nude
name = "Nude"
icon_state = null
- gender = NEUTER
- species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox")
-
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask", "Vox")
/datum/sprite_accessory/socks/white_norm
name = "Normal White"
icon_state = "white_norm"
- gender = NEUTER
-
/datum/sprite_accessory/socks/black_norm
name = "Normal Black"
icon_state = "black_norm"
- gender = NEUTER
-
/datum/sprite_accessory/socks/white_short
name = "Short White"
icon_state = "white_short"
- gender = NEUTER
-
/datum/sprite_accessory/socks/black_short
name = "Short Black"
icon_state = "black_short"
- gender = NEUTER
-
/datum/sprite_accessory/socks/white_knee
name = "Knee-high White"
icon_state = "white_knee"
- gender = NEUTER
-
/datum/sprite_accessory/socks/black_knee
name = "Knee-high Black"
icon_state = "black_knee"
- gender = NEUTER
-
/datum/sprite_accessory/socks/thin_knee
name = "Knee-high Thin"
icon_state = "thin_knee"
gender = FEMALE
-
/datum/sprite_accessory/socks/striped_knee
name = "Knee-high Striped"
icon_state = "striped_knee"
- gender = NEUTER
-
/datum/sprite_accessory/socks/rainbow_knee
name = "Knee-high Rainbow"
icon_state = "rainbow_knee"
- gender = NEUTER
-
/datum/sprite_accessory/socks/white_thigh
name = "Thigh-high White"
icon_state = "white_thigh"
- gender = NEUTER
/datum/sprite_accessory/socks/black_thigh
name = "Thigh-high Black"
icon_state = "black_thigh"
- gender = NEUTER
-
/datum/sprite_accessory/socks/thin_thigh
name = "Thigh-high Thin"
icon_state = "thin_thigh"
gender = FEMALE
-
/datum/sprite_accessory/socks/striped_thigh
name = "Thigh-high Striped"
icon_state = "striped_thigh"
- gender = NEUTER
-
/datum/sprite_accessory/socks/rainbow_thigh
name = "Thigh-high Rainbow"
icon_state = "rainbow_thigh"
- gender = NEUTER
-
/datum/sprite_accessory/socks/pantyhose
name = "Pantyhose"
icon_state = "pantyhose"
gender = FEMALE
-
/datum/sprite_accessory/socks/black_fishnet
name = "Black Fishnet"
icon_state = "black_fishnet"
- gender = NEUTER
-/datum/sprite_accessory/socks/vox_white
+/datum/sprite_accessory/socks/vox
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox/vox_white
name = "Vox White"
icon_state = "vox_white"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_black
+/datum/sprite_accessory/socks/vox/vox_black
name = "Vox Black"
icon_state = "vox_black"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_thin
+/datum/sprite_accessory/socks/vox/vox_thin
name = "Vox Black Thin"
icon_state = "vox_blackthin"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_rainbow
+/datum/sprite_accessory/socks/vox/vox_rainbow
name = "Vox Rainbow"
icon_state = "vox_rainbow"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_stripped
+/datum/sprite_accessory/socks/vox/vox_stripped
name = "Vox Striped"
icon_state = "vox_white"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_white_thigh
+/datum/sprite_accessory/socks/vox/vox_white_thigh
name = "Vox Thigh-high White"
icon_state = "vox_whiteTH"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_black_thigh
+/datum/sprite_accessory/socks/vox/vox_black_thigh
name = "Vox Thigh-high Black"
icon_state = "vox_blackTH"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_thin_thigh
+/datum/sprite_accessory/socks/vox/vox_thin_thigh
name = "Vox Thigh-high Thin"
icon_state = "vox_blackthinTH"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_rainbow_thigh
+/datum/sprite_accessory/socks/vox/vox_rainbow_thigh
name = "Vox Thigh-high Rainbow"
icon_state = "vox_rainbowTH"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_striped_thigh
+/datum/sprite_accessory/socks/vox/vox_striped_thigh
name = "Vox Thigh-high Striped"
icon_state = "vox_stripedTH"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_fishnet
+/datum/sprite_accessory/socks/vox/vox_fishnet
name = "Vox Fishnets"
icon_state = "vox_fishnet"
- gender = NEUTER
- species_allowed = list("Vox")
/* HEAD ACCESSORY */
@@ -1773,185 +1600,494 @@
species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox")
icon_state = "accessory_none"
-/datum/sprite_accessory/head_accessory/simple
- name = "Simple"
+/datum/sprite_accessory/head_accessory/unathi
species_allowed = list("Unathi")
+
+/datum/sprite_accessory/head_accessory/unathi/simple
+ name = "Simple"
icon_state = "horns_simple"
-/datum/sprite_accessory/head_accessory/short
+/datum/sprite_accessory/head_accessory/unathi/short
name = "Short"
- species_allowed = list("Unathi")
icon_state = "horns_short"
-/datum/sprite_accessory/head_accessory/curled
+/datum/sprite_accessory/head_accessory/unathi/curled
name = "Curled"
- species_allowed = list("Unathi")
icon_state = "horns_curled"
-/datum/sprite_accessory/head_accessory/ram
+/datum/sprite_accessory/head_accessory/unathi/ram
name = "Ram"
- species_allowed = list("Unathi")
icon_state = "horns_ram"
-/datum/sprite_accessory/head_accessory/vulp_earfluff
- icon = 'icons/mob/human_face.dmi'
- name = "Vulpkanin Earfluff"
- icon_state = "vulp_facial_earfluff"
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/head_accessory/tajara
+ species_allowed = list("Tajaran")
-/datum/sprite_accessory/head_accessory/vulp_blaze
- icon = 'icons/mob/human_face.dmi'
- name = "Blaze"
- icon_state = "vulp_facial_blaze"
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/head_accessory/tajara/outears_taj
+ name = "Tajaran Outer Ears"
+ icon_state = "markings_face_outears_taj"
-/datum/sprite_accessory/head_accessory/vulp_vulpine
- icon = 'icons/mob/human_face.dmi'
- name = "Vulpine"
- icon_state = "vulp_facial_vulpine"
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/head_accessory/tajara/inears_taj
+ name = "Tajaran Inner Ears"
+ icon_state = "markings_face_inears_taj"
-/datum/sprite_accessory/head_accessory/vulp_vulpine_fluff
- icon = 'icons/mob/human_face.dmi'
- name = "Vulpine and Earfluff"
- icon_state = "vulp_facial_vulpine_fluff"
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/head_accessory/tajara/muzzle_taj
+ name = "Tajaran Muzzle"
+ icon_state = "markings_face_muzzle_taj"
-/datum/sprite_accessory/head_accessory/vulp_mask
- icon = 'icons/mob/human_face.dmi'
- name = "Mask"
- icon_state = "vulp_facial_mask"
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/head_accessory/tajara/muzzle_and_inears_taj
+ name = "Tajaran Muzzle and Inner Ears"
+ icon_state = "markings_face_muzzle_and_inears_taj"
-/datum/sprite_accessory/head_accessory/vulp_patch
- icon = 'icons/mob/human_face.dmi'
- name = "Patch"
- icon_state = "vulp_facial_patch"
- species_allowed = list("Vulpkanin")
-
-/datum/sprite_accessory/head_accessory/vulp_ruff
- icon = 'icons/mob/human_face.dmi'
- name = "Ruff"
- icon_state = "vulp_facial_ruff"
- species_allowed = list("Vulpkanin")
-
-/datum/sprite_accessory/head_accessory/vulp_kita
- icon = 'icons/mob/human_face.dmi'
- name = "Kita"
- icon_state = "vulp_facial_kita"
- species_allowed = list("Vulpkanin")
-
-/datum/sprite_accessory/head_accessory/vulp_swift
- icon = 'icons/mob/human_face.dmi'
- name = "Swift"
- icon_state = "vulp_facial_swift"
- species_allowed = list("Vulpkanin")
-
-/datum/sprite_accessory/head_accessory/taj_ears
+/datum/sprite_accessory/head_accessory/tajara/taj_ears
icon = 'icons/mob/human_face.dmi'
name = "Tajaran Ears"
icon_state = "ears_plain"
- species_allowed = list("Tajaran")
-/datum/sprite_accessory/head_accessory/ipc_antennae
+/datum/sprite_accessory/head_accessory/tajara/taj_nose
+ name = "Tajaran Nose"
+ icon_state = "markings_face_nose_taj"
+
+/datum/sprite_accessory/head_accessory/vulpkanin
+ species_allowed = list("Vulpkanin")
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_earfluff
+ icon = 'icons/mob/human_face.dmi'
+ name = "Vulpkanin Earfluff"
+ icon_state = "vulp_facial_earfluff"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_blaze
+ icon = 'icons/mob/human_face.dmi'
+ name = "Blaze"
+ icon_state = "vulp_facial_blaze"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_vulpine
+ icon = 'icons/mob/human_face.dmi'
+ name = "Vulpine"
+ icon_state = "vulp_facial_vulpine"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_vulpine_fluff
+ icon = 'icons/mob/human_face.dmi'
+ name = "Vulpine and Earfluff"
+ icon_state = "vulp_facial_vulpine_fluff"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_mask
+ icon = 'icons/mob/human_face.dmi'
+ name = "Mask"
+ icon_state = "vulp_facial_mask"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_patch
+ icon = 'icons/mob/human_face.dmi'
+ name = "Patch"
+ icon_state = "vulp_facial_patch"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_ruff
+ icon = 'icons/mob/human_face.dmi'
+ name = "Ruff"
+ icon_state = "vulp_facial_ruff"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_kita
+ icon = 'icons/mob/human_face.dmi'
+ name = "Kita"
+ icon_state = "vulp_facial_kita"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_swift
+ icon = 'icons/mob/human_face.dmi'
+ name = "Swift"
+ icon_state = "vulp_facial_swift"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_nose
+ name = "Vulpkanin Nose"
+ icon_state = "markings_face_nose_vulp"
+
+/datum/sprite_accessory/head_accessory/ipc
+ species_allowed = list("Machine")
+
+/datum/sprite_accessory/head_accessory/ipc/ipc_antennae
name = "Antennae"
icon_state = "antennae"
- species_allowed = list("Machine")
-/datum/sprite_accessory/head_accessory/ipc_tv_antennae
+/datum/sprite_accessory/head_accessory/ipc/ipc_tv_antennae
name = "T.V. Antennae"
icon_state = "tvantennae"
- species_allowed = list("Machine")
-/datum/sprite_accessory/head_accessory/ipc_tesla_antennae
+/datum/sprite_accessory/head_accessory/ipc/ipc_tesla_antennae
name = "Tesla Antennae"
icon_state = "tesla"
- species_allowed = list("Machine")
-/datum/sprite_accessory/head_accessory/ipc_light
+/datum/sprite_accessory/head_accessory/ipc/ipc_light
name = "Head Light"
icon_state = "light"
- species_allowed = list("Machine")
/* BODY MARKINGS */
/datum/sprite_accessory/body_markings
icon = 'icons/mob/body_accessory.dmi'
- species_allowed = list("Unathi", "Tajaran", "Vulpkanin", "Machine")
+ species_allowed = list("Unathi", "Tajaran", "Vulpkanin", "Machine", "Vox")
icon_state = "accessory_none"
+ marking_location = "body"
/datum/sprite_accessory/body_markings/none
name = "None"
species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox")
icon_state = "accessory_none"
-/datum/sprite_accessory/body_markings/stripe
- name = "Stripe"
- species_allowed = list("Unathi")
- icon_state = "markings_stripe"
-
/datum/sprite_accessory/body_markings/tiger
name = "Tiger Body"
species_allowed = list("Unathi", "Tajaran", "Vulpkanin")
icon_state = "markings_tiger"
-/datum/sprite_accessory/body_markings/tigerhead
- name = "Tiger Body and Head"
- species_allowed = list("Unathi", "Tajaran", "Vulpkanin")
- icon_state = "markings_tigerhead"
-
-/datum/sprite_accessory/body_markings/tigerheadface_taj
- name = "Tajaran Tiger Body, Head and Face"
- species_allowed = list("Tajaran")
- icon_state = "markings_tigerheadface_taj"
-
-/datum/sprite_accessory/body_markings/tigerheadface_vulp
- name = "Vulpkanin Tiger Body, Head and Face"
- species_allowed = list("Vulpkanin")
- icon_state = "markings_tigerheadface_vulp"
-
-/datum/sprite_accessory/body_markings/tigerheadface_una
- name = "Unathi Tiger Body, Head and Face"
+/datum/sprite_accessory/body_markings/unathi
species_allowed = list("Unathi")
- icon_state = "markings_tigerheadface_una"
-/datum/sprite_accessory/body_markings/optics
+/datum/sprite_accessory/body_markings/unathi/stripe_una
+ name = "Unathi Stripe"
+ icon_state = "markings_stripe_una"
+
+/datum/sprite_accessory/body_markings/unathi/belly_narrow_una
+ name = "Unathi Belly"
+ icon_state = "markings_belly_narrow_una"
+
+/datum/sprite_accessory/body_markings/unathi/banded_una
+ name = "Unathi Banded"
+ icon_state = "markings_banded_una"
+
+/datum/sprite_accessory/body_markings/unathi/points_una
+ name = "Unathi Points"
+ icon_state = "markings_points_una"
+
+/datum/sprite_accessory/body_markings/tajara
+ species_allowed = list("Tajaran")
+
+/datum/sprite_accessory/body_markings/tajara/belly_flat_taj
+ name = "Tajaran Belly"
+ icon_state = "markings_belly_flat_taj"
+
+/datum/sprite_accessory/body_markings/tajara/belly_crest_taj
+ name = "Tajaran Chest Crest"
+ icon_state = "markings_belly_crest_taj"
+
+/datum/sprite_accessory/body_markings/tajara/belly_full_taj
+ name = "Tajaran Belly 2"
+ icon_state = "markings_belly_full_taj"
+
+/datum/sprite_accessory/body_markings/tajara/points_taj
+ name = "Tajaran Points"
+ icon_state = "markings_points_taj"
+
+/datum/sprite_accessory/body_markings/tajara/patchy_taj
+ name = "Tajaran Patches"
+ icon_state = "markings_patch_taj"
+
+/datum/sprite_accessory/body_markings/vulpkanin
+ species_allowed = list("Vulpkanin")
+
+/datum/sprite_accessory/body_markings/vulpkanin/belly_fox_vulp
+ name = "Vulpkanin Belly"
+ icon_state = "markings_belly_fox_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/belly_full_vulp
+ name = "Vulpkanin Belly 2"
+ icon_state = "markings_belly_full_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/belly_crest_vulp
+ name = "Vulpkanin Belly Crest"
+ icon_state = "markings_belly_crest_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/points_fade_vulp
+ name = "Vulpkanin Points"
+ icon_state = "markings_points_fade_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/points_fade_belly_vulp
+ name = "Vulpkanin Points and Belly"
+ icon_state = "markings_points_fade_belly_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/points_fade_belly_alt_vulp
+ name = "Vulpkanin Points and Belly Alt."
+ icon_state = "markings_points_fade_belly_alt_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/points_sharp_vulp
+ name = "Vulpkanin Points 2"
+ icon_state = "markings_points_sharp_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/points_crest_vulp
+ name = "Vulpkanin Points and Crest"
+ icon_state = "markings_points_crest_vulp"
+
+/datum/sprite_accessory/body_markings/drask
+ species_allowed = list("Drask")
+
+/datum/sprite_accessory/body_markings/drask/arm_spines_drask
+ name = "Drask Arm Spines"
+ icon_state = "markings_armspines_drask"
+
+/datum/sprite_accessory/body_markings/head
+ marking_location = "head"
+ species_allowed = list()
+
+/datum/sprite_accessory/body_markings/head/tajara
+ species_allowed = list("Tajaran")
+
+/datum/sprite_accessory/body_markings/head/tajara/tiger_head_taj
+ name = "Tajaran Tiger Head"
+ icon_state = "markings_head_tiger_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/tiger_face_taj
+ name = "Tajaran Tiger Head and Face"
+ icon_state = "markings_face_tiger_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/outears_taj
+ name = "Tajaran Outer Ears"
+ icon_state = "markings_face_outears_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/inears_taj
+ name = "Tajaran Inner Ears"
+ icon_state = "markings_face_inears_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/nose_taj
+ name = "Tajaran Nose"
+ icon_state = "markings_face_nose_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/muzzle_taj
+ name = "Tajaran Muzzle"
+ icon_state = "markings_face_muzzle_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/muzzle_and_inears_taj
+ name = "Tajaran Muzzle and Inner Ears"
+ icon_state = "markings_face_muzzle_and_inears_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/muzzle_alt_taj //Companion marking for Tajaran Belly 2.
+ name = "Tajaran Muzzle 2"
+ icon_state = "markings_face_full_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/points_taj //Companion marking for Tajaran Points.
+ name = "Tajaran Points Head"
+ icon_state = "markings_face_points_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/patchy_taj //Companion marking for Tajaran Patches.
+ name = "Tajaran Patches Head"
+ icon_state = "markings_face_patch_taj"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin
+ species_allowed = list("Vulpkanin")
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/tiger_head_vulp
+ name = "Vulpkanin Tiger Head"
+ icon_state = "markings_head_tiger_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/tiger_face_vulp
+ name = "Vulpkanin Tiger Head and Face"
+ icon_state = "markings_face_tiger_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/nose_default_vulp
+ name = "Vulpkanin Nose"
+ icon_state = "markings_face_nose_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/muzzle_vulp //Companion marking for Vulpkanin Belly Alt..
+ name = "Vulpkanin Muzzle"
+ icon_state = "markings_face_full_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/muzzle_ears_vulp //Companion marking for Vulpkanin Belly Alt..
+ name = "Vulpkanin Muzzle and Ears"
+ icon_state = "markings_face_full_ears_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/points_fade_vulp //Companion marking for Vulpkanin Points Fade.
+ name = "Vulpkanin Points Head"
+ icon_state = "markings_face_points_fade_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/points_sharp_vulp //Companion marking for Vulpkanin Points Sharp.
+ name = "Vulpkanin Points Head 2"
+ icon_state = "markings_face_points_sharp_vulp"
+
+/datum/sprite_accessory/body_markings/head/unathi
+ species_allowed = list("Unathi")
+
+/datum/sprite_accessory/body_markings/head/unathi/tiger_head_una
+ name = "Unathi Tiger Head"
+ icon_state = "markings_head_tiger_una"
+ heads_allowed = list("All")
+
+/datum/sprite_accessory/body_markings/head/unathi/tiger_face_una
+ name = "Unathi Tiger Head and Face"
+ icon_state = "markings_face_tiger_una"
+
+/datum/sprite_accessory/body_markings/head/unathi/snout_una_round
+ name = "Unathi Round Snout"
+ icon_state = "markings_face_snout_una_round"
+
+/datum/sprite_accessory/body_markings/head/unathi/snout_lower_una_round
+ name = "Unathi Lower Round Snout"
+ icon_state = "markings_face_snout_lower_una"
+
+/datum/sprite_accessory/body_markings/head/unathi/banded_una //Companion marking for Unathi Banded.
+ name = "Unathi Banded Head"
+ icon_state = "markings_face_banded_una"
+ heads_allowed = list("All")
+
+/datum/sprite_accessory/body_markings/head/unathi/snout_narrow_una //Companion marking for Unathi Narrow Belly.
+ name = "Unathi Snout 2"
+ icon_state = "markings_face_narrow_una"
+
+/datum/sprite_accessory/body_markings/head/unathi/points_una //Companion marking for Unathi Points.
+ name = "Unathi Points Head"
+ icon_state = "markings_face_points_una"
+
+/datum/sprite_accessory/body_markings/head/unathi/sharp
+ heads_allowed = list("Unathi Sharp Snout")
+
+/datum/sprite_accessory/body_markings/head/unathi/sharp/tiger_face_una_sharp
+ name = "Unathi Sharp Tiger Head and Face"
+ icon_state = "markings_face_tiger_una_sharp"
+
+/datum/sprite_accessory/body_markings/head/unathi/sharp/snout_una_sharp
+ name = "Unathi Sharp Snout"
+ icon_state = "markings_face_snout_una_sharp"
+
+/datum/sprite_accessory/body_markings/head/unathi/sharp/snout_narrow_una_sharp //Companion marking for Unathi Narrow Belly.
+ name = "Unathi Sharp Snout 2"
+ icon_state = "markings_face_narrow_una_sharp"
+
+/datum/sprite_accessory/body_markings/head/unathi/sharp/points_una_sharp //Companion marking for Unathi Points.
+ name = "Unathi Sharp Points Head"
+ icon_state = "markings_face_points_una"
+
+/datum/sprite_accessory/body_markings/head/optics
name = "Humanoid Optics"
species_allowed = list("Machine")
icon_state = "optics"
models_allowed = list("Bishop Cybernetics", "Hesphiastos Industries", "Ward-Takahashi", "Xion Manufacturing Group", "Zeng-Hu Pharmaceuticals") //Should be the same as the manufacturing company of the limb in robolimbs.dm
- marking_location = "head"
-/datum/sprite_accessory/body_markings/optics/bishop_alt
+/datum/sprite_accessory/body_markings/head/optics/bishop_alt
name = "Bishop Alt. Optics"
- species_allowed = list("Machine")
icon_state = "bishop_alt_optics"
models_allowed = list("Bishop Cybernetics alt.")
-/datum/sprite_accessory/body_markings/optics/morpheus_alt
+/datum/sprite_accessory/body_markings/head/optics/morpheus_alt
name = "Morpheus Alt. Optics"
- species_allowed = list("Machine")
icon_state = "morpheus_alt_optics"
models_allowed = list("Morpheus Cyberkinetics alt.")
-/datum/sprite_accessory/body_markings/optics/wardtakahashi_alt
+/datum/sprite_accessory/body_markings/head/optics/wardtakahashi_alt
name = "Ward-Takahashi Alt. Optics"
- species_allowed = list("Machine")
icon_state = "wardtakahashi_alt_optics"
models_allowed = list("Ward-Takahashi alt.")
-/datum/sprite_accessory/body_markings/optics/xion_alt
+/datum/sprite_accessory/body_markings/head/optics/xion_alt
name = "Xion Alt. Optics"
- species_allowed = list("Machine")
icon_state = "xion_alt_optics"
models_allowed = list("Xion Manufacturing Group alt.")
/datum/sprite_accessory/body_markings/tattoo // Tattoos applied post-round startup with tattoo guns in item_defines.dm
- name = "base tattoo"
- species_allowed = list()
+ species_allowed = list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell")
icon_state = "accessory_none"
/datum/sprite_accessory/body_markings/tattoo/elliot
name = "Elliot Circuit Tattoo"
- icon_state = "campbell_tattoo"
\ No newline at end of file
+ icon_state = "campbell_tattoo"
+ species_allowed = null
+
+/datum/sprite_accessory/body_markings/tattoo/tiger_body
+ name = "Tiger-stripe Tattoo"
+ species_allowed = list("Human", "Unathi", "Vulpkanin", "Tajaran", "Skrell")
+ icon_state = "markings_tiger"
+
+/datum/sprite_accessory/body_markings/tattoo/heart
+ name = "Heart Tattoo"
+ icon_state = "markings_tattoo_heart"
+
+/datum/sprite_accessory/body_markings/tattoo/hive
+ name = "Hive Tattoo"
+ icon_state = "markings_tattoo_hive"
+
+/datum/sprite_accessory/body_markings/tattoo/nightling
+ name = "Nightling Tattoo"
+ icon_state = "markings_tattoo_nightling"
+
+/datum/sprite_accessory/body_markings/tattoo/vox
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/body_markings/tattoo/vox/heart_vox
+ name = "Vox Heart Tattoo"
+ icon_state = "markings_tattoo_heart_vox"
+
+/datum/sprite_accessory/body_markings/tattoo/vox/hive_vox
+ name = "Vox Hive Tattoo"
+ icon_state = "markings_tattoo_hive_vox"
+
+/datum/sprite_accessory/body_markings/tattoo/vox/nightling_vox
+ name = "Vox Nightling Tattoo"
+ icon_state = "markings_tattoo_nightling_vox"
+
+/datum/sprite_accessory/body_markings/tail
+ species_allowed = list()
+ icon_state = "accessory_none"
+ marking_location = "tail"
+ tails_allowed = null
+
+/datum/sprite_accessory/body_markings/tail/vox
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/body_markings/tail/vox/vox_band
+ name = "Vox Tail Band"
+ icon_state = "markings_voxtail_band"
+
+/datum/sprite_accessory/body_markings/tail/vox/vox_tip
+ name = "Vox Tail Tip"
+ icon_state = "markings_voxtail_tip"
+
+/datum/sprite_accessory/body_markings/tail/vox/vox_stripe
+ name = "Vox Tail Stripe"
+ icon_state = "markings_voxtail_stripe"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin
+ species_allowed = list("Vulpkanin")
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_default_tip
+ name = "Vulpkanin Default Tail Tip"
+ icon_state = "markings_vulptail_tip"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_default_fade
+ name = "Vulpkanin Default Tail Fade"
+ icon_state = "markings_vulptail_fade"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_bushy_fluff
+ name = "Vulpkanin Bushy Tail Fluff"
+ tails_allowed = list("Vulpkanin Alt 1 (Bushy)")
+ icon_state = "markings_vulptail2_fluff"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_short_tip
+ name = "Vulpkanin Short Tail Tip"
+ tails_allowed = list("Vulpkanin Alt 4 (Short)")
+ icon_state = "markings_vulptail5_tip"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_hybrid_tip
+ name = "Vulpkanin Bushy Straight Tail Tip"
+ tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)")
+ icon_state = "markings_vulptail6_tip"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_hybrid_fade
+ name = "Vulpkanin Bushy Straight Tail Fade"
+ tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)")
+ icon_state = "markings_vulptail6_fade"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_hybrid_silverf
+ name = "Vulpkanin Bushy Straight Tail Black Fade White Tip"
+ tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)")
+ icon_state = "markings_vulptail6_silverf"
+
+/* ALT HEADS */
+
+/datum/sprite_accessory/alt_heads
+ icon = null
+ icon_state = null
+ species_allowed = null
+ var/suffix = null
+
+/datum/sprite_accessory/alt_heads/none
+ name = "None"
+
+/datum/sprite_accessory/alt_heads/una_sharp_snout
+ name = "Unathi Sharp Snout"
+ species_allowed = list("Unathi")
+ icon_state = "head_sharp"
+ suffix = "sharp"
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index f280bec0ce1..d010bdfa135 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -142,7 +142,7 @@
if(length(message) >= 2)
var/language_prefix = trim_right(lowertext(copytext(message, 1 ,4)))
var/datum/language/L = language_keys[language_prefix]
- if(can_speak(L))
+ if(can_speak_language(L))
return L
return null
diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm
new file mode 100644
index 00000000000..7358486deee
--- /dev/null
+++ b/code/modules/mob/status_procs.dm
@@ -0,0 +1,202 @@
+// A bunch of empty procs for all the status procs in living/status_procs.dm, because
+// I can't be bothered to deal with all the merge conflicts it would cause to
+// typecast every mob in the codebase correctly
+
+/mob/proc/Confused()
+ return
+
+/mob/proc/SetConfused()
+ return
+
+/mob/proc/AdjustConfused()
+ return
+
+
+/mob/proc/Dizzy()
+ return
+
+/mob/proc/SetDizzy()
+ return
+
+/mob/proc/AdjustDizzy()
+ return
+
+
+/mob/proc/Drowsy()
+ return
+
+/mob/proc/SetDrowsy()
+ return
+
+/mob/proc/AdjustDrowsy()
+ return
+
+
+/mob/proc/Drunk()
+ return
+
+/mob/proc/SetDrunk()
+ return
+
+/mob/proc/AdjustDrunk()
+ return
+
+
+/mob/proc/Druggy()
+ return
+
+/mob/proc/SetDruggy()
+ return
+
+/mob/proc/AdjustDruggy()
+ return
+
+
+/mob/proc/EarDamage()
+ return
+
+/mob/proc/SetEarDamage()
+ return
+
+/mob/proc/AdjustEarDamage()
+ return
+
+
+/mob/proc/EarDeaf()
+ return
+
+/mob/proc/SetEarDeaf()
+ return
+
+/mob/proc/AdjustEarDeaf()
+ return
+
+
+/mob/proc/EyeBlind()
+ return
+
+/mob/proc/SetEyeBlind()
+ return
+
+/mob/proc/AdjustEyeBlind()
+ return
+
+
+/mob/proc/EyeBlurry()
+ return
+
+/mob/proc/SetEyeBlurry()
+ return
+
+/mob/proc/AdjustEyeBlurry()
+ return
+
+
+/mob/proc/Hallucinate()
+ return
+
+/mob/proc/SetHallucinate()
+ return
+
+/mob/proc/AdjustHallucinate()
+ return
+
+
+/mob/proc/Jitter()
+ return
+
+/mob/proc/SetJitter()
+ return
+
+/mob/proc/AdjustJitter()
+ return
+
+
+/mob/proc/LoseBreath()
+ return
+
+/mob/proc/SetLoseBreath()
+ return
+
+/mob/proc/AdjustLoseBreath()
+ return
+
+
+/mob/proc/Paralyse()
+ return
+
+/mob/proc/SetParalysis()
+ return
+
+/mob/proc/AdjustParalysis()
+ return
+
+
+/mob/proc/Silence()
+ return
+
+/mob/proc/SetSilence()
+ return
+
+/mob/proc/AdjustSilence()
+ return
+
+
+/mob/proc/Sleeping()
+ return
+
+/mob/proc/SetSleeping()
+ return
+
+/mob/proc/AdjustSleeping()
+ return
+
+
+/mob/proc/Slowed()
+ return
+
+/mob/proc/SetSlowed()
+ return
+
+/mob/proc/AdjustSlowed()
+ return
+
+
+/mob/proc/Slur()
+ return
+
+/mob/proc/SetSlur()
+ return
+
+/mob/proc/AdjustSlur()
+ return
+
+
+/mob/proc/Stun()
+ return
+
+/mob/proc/SetStunned()
+ return
+
+/mob/proc/AdjustStunned()
+ return
+
+
+/mob/proc/Stuttering()
+ return
+
+/mob/proc/SetStuttering()
+ return
+
+/mob/proc/AdjustStuttering()
+ return
+
+
+/mob/proc/Weaken()
+ return
+
+/mob/proc/SetWeakened()
+ return
+
+/mob/proc/AdjustWeakened()
+ return
diff --git a/code/modules/mob/update_status.dm b/code/modules/mob/update_status.dm
new file mode 100644
index 00000000000..3893085edb3
--- /dev/null
+++ b/code/modules/mob/update_status.dm
@@ -0,0 +1,65 @@
+// These are procs that cause immediate updates to features of the mob - prefixed with `update_`
+// Procs that have a stacking effect depending on how many times they are called
+// do not belong in this file - those go in `life.dm` instead, with the prefix `handle_`
+
+// OVERLAY/SIGHT PROCS
+
+// These return 0 if they are not applying an overlay, and 1 if they are
+
+// Call this to immediately apply blindness effects, instead of
+// waiting for the next `Life` tick
+/mob/proc/update_blind_effects()
+ // No handling for this on the mob level
+ return 0
+
+/mob/proc/update_blurry_effects()
+ // No handling for this on the mob level
+ return 0
+
+/mob/proc/update_druggy_effects()
+ // No handling for this on the mob level
+ return 0
+
+/mob/proc/update_nearsighted_effects()
+ // No handling for this on the mob level
+ return 0
+
+/mob/proc/update_sleeping_effects()
+ // No handling for this on the mob level
+ return 0
+
+/mob/proc/update_tint_effects()
+ // No handling for this on the mob level
+ return 0
+
+// Procs that give information about the status of the mob
+
+/mob/proc/can_hear()
+ return 1
+
+/mob/proc/can_see()
+ return 1
+
+/mob/proc/can_speak()
+ return 1
+
+/mob/proc/incapacitated(ignore_restraints, ignore_grab)
+ return 0
+
+/mob/proc/restrained(ignore_grab)
+ // All are created free
+ return 0
+
+// Procs that update other things about the mob
+
+// Does various animations - Jitter, Flying, Spinning
+/mob/proc/update_animations()
+ if(flying)
+ animate(src, pixel_y = pixel_y + 5 , time = 10, loop = 1, easing = SINE_EASING)
+ animate(pixel_y = pixel_y - 5, time = 10, loop = 1, easing = SINE_EASING)
+
+/mob/proc/update_stat()
+ return
+
+/mob/proc/update_canmove()
+ return 1
diff --git a/code/modules/nano/interaction/base.dm b/code/modules/nano/interaction/base.dm
index 3f8897eb5c8..e4e5dd1a33b 100644
--- a/code/modules/nano/interaction/base.dm
+++ b/code/modules/nano/interaction/base.dm
@@ -17,7 +17,7 @@
else if(incapacitated())
return STATUS_UPDATE // update only (orange visibility)
return STATUS_INTERACTIVE
-
+
/mob/dead/observer/shared_nano_interaction()
if(check_rights(R_ADMIN, 0, src))
return STATUS_INTERACTIVE // Admins are more equal
diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm
index 8606dafbd31..21c14077886 100644
--- a/code/modules/nano/modules/human_appearance.dm
+++ b/code/modules/nano/modules/human_appearance.dm
@@ -7,8 +7,11 @@
var/list/valid_hairstyles = list()
var/list/valid_facial_hairstyles = list()
var/list/valid_head_accessories = list()
- var/list/valid_marking_styles = list()
+ var/list/valid_head_marking_styles = list()
+ var/list/valid_body_marking_styles = list()
+ var/list/valid_tail_marking_styles = list()
var/list/valid_body_accessories = list()
+ var/list/valid_alt_head_styles = list()
var/check_whitelist
var/list/whitelist
@@ -48,7 +51,7 @@
else if(owner.species.bodyflags & HAS_ICON_SKIN_TONE)
var/const/MAX_LINE_ENTRIES = 4
var/prompt = "Choose your character's skin tone: 1-[owner.species.icon_skin_tones.len]\n("
- for(var/i = 1; i <= owner.species.icon_skin_tones.len; i++)
+ for(var/i = 1 to owner.species.icon_skin_tones.len)
if(i > MAX_LINE_ENTRIES && !((i - 1) % MAX_LINE_ENTRIES))
prompt += "\n"
prompt += "[i] = [owner.species.icon_skin_tones[i]]"
@@ -66,9 +69,9 @@
if(can_change_skin_color())
var/new_skin = input(usr, "Choose your character's skin colour: ", "Skin Color", rgb(owner.r_skin, owner.g_skin, owner.b_skin)) as color|null
if(new_skin && can_still_topic(state))
- var/r_skin = hex2num(copytext(new_skin, 2, 4))
- var/g_skin = hex2num(copytext(new_skin, 4, 6))
- var/b_skin = hex2num(copytext(new_skin, 6, 8))
+ var/r_skin = color2R(new_skin)
+ var/g_skin = color2G(new_skin)
+ var/b_skin = color2B(new_skin)
if(owner.change_skin_color(r_skin, g_skin, b_skin))
update_dna()
return 1
@@ -81,12 +84,22 @@
if(can_change(APPEARANCE_HAIR_COLOR))
var/new_hair = input("Please select hair color.", "Hair Color", rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair)) as color|null
if(new_hair && can_still_topic(state))
- var/r_hair = hex2num(copytext(new_hair, 2, 4))
- var/g_hair = hex2num(copytext(new_hair, 4, 6))
- var/b_hair = hex2num(copytext(new_hair, 6, 8))
+ var/r_hair = color2R(new_hair)
+ var/g_hair = color2G(new_hair)
+ var/b_hair = color2B(new_hair)
if(owner.change_hair_color(r_hair, g_hair, b_hair))
update_dna()
return 1
+ if(href_list["secondary_hair_color"])
+ if(can_change(APPEARANCE_SECONDARY_HAIR_COLOR))
+ var/new_hair = input("Please select secondary hair color.", "Secondary Hair Color", rgb(head_organ.r_hair_sec, head_organ.g_hair_sec, head_organ.b_hair_sec)) as color|null
+ if(new_hair && can_still_topic(state))
+ var/r_hair_sec = color2R(new_hair)
+ var/g_hair_sec = color2G(new_hair)
+ var/b_hair_sec = color2B(new_hair)
+ if(owner.change_hair_color(r_hair_sec, g_hair_sec, b_hair_sec, 1))
+ update_dna()
+ return 1
if(href_list["facial_hair"])
if(can_change(APPEARANCE_FACIAL_HAIR) && (href_list["facial_hair"] in valid_facial_hairstyles))
if(owner.change_facial_hair(href_list["facial_hair"]))
@@ -96,12 +109,22 @@
if(can_change(APPEARANCE_FACIAL_HAIR_COLOR))
var/new_facial = input("Please select facial hair color.", "Facial Hair Color", rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial)) as color|null
if(new_facial && can_still_topic(state))
- var/r_facial = hex2num(copytext(new_facial, 2, 4))
- var/g_facial = hex2num(copytext(new_facial, 4, 6))
- var/b_facial = hex2num(copytext(new_facial, 6, 8))
+ var/r_facial = color2R(new_facial)
+ var/g_facial = color2G(new_facial)
+ var/b_facial = color2B(new_facial)
if(owner.change_facial_hair_color(r_facial, g_facial, b_facial))
update_dna()
return 1
+ if(href_list["secondary_facial_hair_color"])
+ if(can_change(APPEARANCE_SECONDARY_FACIAL_HAIR_COLOR))
+ var/new_facial = input("Please select secondary facial hair color.", "Secondary Facial Hair Color", rgb(head_organ.r_facial_sec, head_organ.g_facial_sec, head_organ.b_facial_sec)) as color|null
+ if(new_facial && can_still_topic(state))
+ var/r_facial_sec = color2R(new_facial)
+ var/g_facial_sec = color2G(new_facial)
+ var/b_facial_sec = color2B(new_facial)
+ if(owner.change_facial_hair_color(r_facial_sec, g_facial_sec, b_facial_sec, 1))
+ update_dna()
+ return 1
if(href_list["eye_color"])
if(can_change(APPEARANCE_EYE_COLOR))
var/obj/item/organ/internal/eyes/eyes_organ = owner.get_int_organ(/obj/item/organ/internal/eyes)
@@ -114,9 +137,9 @@
eyes_blue = eyes_organ.eye_colour[3]
var/new_eyes = input("Please select eye color.", "Eye Color", rgb(eyes_red, eyes_green, eyes_blue)) as color|null
if(new_eyes && can_still_topic(state))
- var/r_eyes = hex2num(copytext(new_eyes, 2, 4))
- var/g_eyes = hex2num(copytext(new_eyes, 4, 6))
- var/b_eyes = hex2num(copytext(new_eyes, 6, 8))
+ var/r_eyes = color2R(new_eyes)
+ var/g_eyes = color2G(new_eyes)
+ var/b_eyes = color2B(new_eyes)
if(owner.change_eye_color(r_eyes, g_eyes, b_eyes))
update_dna()
return 1
@@ -129,31 +152,60 @@
if(can_change_head_accessory())
var/new_head_accessory = input("Please select head accessory color.", "Head Accessory Color", rgb(head_organ.r_headacc, head_organ.g_headacc, head_organ.b_headacc)) as color|null
if(new_head_accessory && can_still_topic(state))
- var/r_headacc = hex2num(copytext(new_head_accessory, 2, 4))
- var/g_headacc = hex2num(copytext(new_head_accessory, 4, 6))
- var/b_headacc = hex2num(copytext(new_head_accessory, 6, 8))
+ var/r_headacc = color2R(new_head_accessory)
+ var/g_headacc = color2G(new_head_accessory)
+ var/b_headacc = color2B(new_head_accessory)
if(owner.change_head_accessory_color(r_headacc, g_headacc, b_headacc))
update_dna()
return 1
- if(href_list["marking"])
- if(can_change_markings() && (href_list["marking"] in valid_marking_styles))
- if(owner.change_markings(href_list["marking"]))
+ if(href_list["head_marking"])
+ if(can_change_markings("head") && (href_list["head_marking"] in valid_head_marking_styles))
+ if(owner.change_markings(href_list["head_marking"], "head"))
update_dna()
return 1
- if(href_list["marking_color"])
- if(can_change_markings())
- var/new_markings = input("Please select marking color.", "Marking Color", rgb(owner.r_markings, owner.g_markings, owner.b_markings)) as color|null
+ if(href_list["head_marking_color"])
+ if(can_change_markings("head"))
+ var/new_markings = input("Please select head marking color.", "Marking Color", owner.m_colours["head"]) as color|null
if(new_markings && can_still_topic(state))
- var/r_markings = hex2num(copytext(new_markings, 2, 4))
- var/g_markings = hex2num(copytext(new_markings, 4, 6))
- var/b_markings = hex2num(copytext(new_markings, 6, 8))
- if(owner.change_marking_color(r_markings, g_markings, b_markings))
+ if(owner.change_marking_color(new_markings, "head"))
+ update_dna()
+ return 1
+ if(href_list["body_marking"])
+ if(can_change_markings("body") && (href_list["body_marking"] in valid_body_marking_styles))
+ if(owner.change_markings(href_list["body_marking"], "body"))
+ update_dna()
+ return 1
+ if(href_list["body_marking_color"])
+ if(can_change_markings("body"))
+ var/new_markings = input("Please select body marking color.", "Marking Color", owner.m_colours["body"]) as color|null
+ if(new_markings && can_still_topic(state))
+ if(owner.change_marking_color(new_markings, "body"))
+ update_dna()
+ return 1
+ if(href_list["tail_marking"])
+ if(can_change_markings("tail") && (href_list["tail_marking"] in valid_tail_marking_styles))
+ if(owner.change_markings(href_list["tail_marking"], "tail"))
+ update_dna()
+ return 1
+ if(href_list["tail_marking_color"])
+ if(can_change_markings("tail"))
+ var/new_markings = input("Please select tail marking color.", "Marking Color", owner.m_colours["tail"]) as color|null
+ if(new_markings && can_still_topic(state))
+ if(owner.change_marking_color(new_markings, "tail"))
update_dna()
return 1
if(href_list["body_accessory"])
if(can_change_body_accessory() && (href_list["body_accessory"] in valid_body_accessories))
if(owner.change_body_accessory(href_list["body_accessory"]))
update_dna()
+ cut_and_generate_data()
+ return 1
+ if(href_list["alt_head"])
+ if(can_change_alt_head() && (href_list["alt_head"] in valid_alt_head_styles))
+ if(owner.change_alt_head(href_list["alt_head"]))
+ update_dna()
+ head_organ = owner.get_organ("head") //Update the head with the new information.
+ cut_and_generate_data()
return 1
return 0
@@ -199,13 +251,32 @@
data["facial_hair_styles"] = facial_hair_styles
data["facial_hair_style"] = (head_organ ? head_organ.f_style : "Shaved")
- data["change_markings"] = can_change_markings()
- if(data["change_markings"])
- var/marking_styles[0]
- for(var/marking_style in valid_marking_styles)
- marking_styles[++marking_styles.len] = list("markingstyle" = marking_style)
- data["marking_styles"] = marking_styles
- data["marking_style"] = owner.m_style
+ data["change_head_markings"] = can_change_markings("head")
+ if(data["change_head_markings"])
+ var/m_style = owner.m_styles["head"]
+ var/head_marking_styles[0]
+ for(var/head_marking_style in valid_head_marking_styles)
+ head_marking_styles[++head_marking_styles.len] = list("headmarkingstyle" = head_marking_style)
+ data["head_marking_styles"] = head_marking_styles
+ data["head_marking_style"] = m_style
+
+ data["change_body_markings"] = can_change_markings("body")
+ if(data["change_body_markings"])
+ var/m_style = owner.m_styles["body"]
+ var/body_marking_styles[0]
+ for(var/body_marking_style in valid_body_marking_styles)
+ body_marking_styles[++body_marking_styles.len] = list("bodymarkingstyle" = body_marking_style)
+ data["body_marking_styles"] = body_marking_styles
+ data["body_marking_style"] = m_style
+
+ data["change_tail_markings"] = can_change_markings("tail")
+ if(data["change_tail_markings"])
+ var/m_style = owner.m_styles["tail"]
+ var/tail_marking_styles[0]
+ for(var/tail_marking_style in valid_tail_marking_styles)
+ tail_marking_styles[++tail_marking_styles.len] = list("tailmarkingstyle" = tail_marking_style)
+ data["tail_marking_styles"] = tail_marking_styles
+ data["tail_marking_style"] = m_style
data["change_body_accessory"] = can_change_body_accessory()
if(data["change_body_accessory"])
@@ -213,15 +284,24 @@
for(var/body_accessory_style in valid_body_accessories)
body_accessory_styles[++body_accessory_styles.len] = list("bodyaccessorystyle" = body_accessory_style)
data["body_accessory_styles"] = body_accessory_styles
- var/datum/body_accessory/BA
- if(owner.body_accessory)
- BA = owner.body_accessory.name
- data["body_accessory_style"] = BA
+ data["body_accessory_style"] = (owner.body_accessory ? owner.body_accessory.name : "None")
+
+ data["change_alt_head"] = can_change_alt_head()
+ if(data["change_alt_head"])
+ var/alt_head_styles[0]
+ for(var/alt_head_style in valid_alt_head_styles)
+ alt_head_styles[++alt_head_styles.len] = list("altheadstyle" = alt_head_style)
+ data["alt_head_styles"] = alt_head_styles
+ data["alt_head_style"] = head_organ.alt_head
data["change_head_accessory_color"] = can_change_head_accessory()
data["change_hair_color"] = can_change(APPEARANCE_HAIR_COLOR)
+ data["change_secondary_hair_color"] = can_change(APPEARANCE_SECONDARY_HAIR_COLOR)
data["change_facial_hair_color"] = can_change(APPEARANCE_FACIAL_HAIR_COLOR)
- data["change_marking_color"] = can_change_markings()
+ data["change_secondary_facial_hair_color"] = can_change(APPEARANCE_SECONDARY_FACIAL_HAIR_COLOR)
+ data["change_head_marking_color"] = can_change_markings("head")
+ data["change_body_marking_color"] = can_change_markings("body")
+ data["change_tail_marking_color"] = can_change_markings("tail")
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "appearance_changer.tmpl", "[src]", 800, 450, state = state)
@@ -248,19 +328,41 @@
return 0
return owner && (flags & APPEARANCE_HEAD_ACCESSORY) && (head_organ.species.bodyflags & HAS_HEAD_ACCESSORY)
-/datum/nano_module/appearance_changer/proc/can_change_markings()
- return owner && (flags & APPEARANCE_MARKINGS) && (owner.species.bodyflags & HAS_MARKINGS)
+/datum/nano_module/appearance_changer/proc/can_change_markings(var/location = "body")
+ var/marking_flag = HAS_BODY_MARKINGS
+ var/body_flags = owner.species.bodyflags
+ if(location == "head")
+ if(!head_organ)
+ log_debug("Missing head!")
+ return 0
+ body_flags = head_organ.species.bodyflags
+ marking_flag = HAS_HEAD_MARKINGS
+ if(location == "body")
+ marking_flag = HAS_BODY_MARKINGS
+ if(location == "tail")
+ marking_flag = HAS_TAIL_MARKINGS
+
+ return owner && (flags & APPEARANCE_MARKINGS) && (body_flags & marking_flag)
/datum/nano_module/appearance_changer/proc/can_change_body_accessory()
return owner && (flags & APPEARANCE_BODY_ACCESSORY) && (owner.species.bodyflags & HAS_TAIL)
+/datum/nano_module/appearance_changer/proc/can_change_alt_head()
+ if(!head_organ)
+ log_debug("Missing head!")
+ return 0
+ return owner && (flags & APPEARANCE_ALT_HEAD) && (head_organ.species.bodyflags & HAS_ALT_HEADS)
+
/datum/nano_module/appearance_changer/proc/cut_and_generate_data()
// Making the assumption that the available species remain constant
valid_hairstyles.Cut()
valid_facial_hairstyles.Cut()
valid_head_accessories.Cut()
- valid_marking_styles.Cut()
+ valid_head_marking_styles.Cut()
+ valid_body_marking_styles.Cut()
+ valid_tail_marking_styles.Cut()
valid_body_accessories.Cut()
+ valid_alt_head_styles.Cut()
generate_data()
/datum/nano_module/appearance_changer/proc/generate_data()
@@ -273,7 +375,13 @@
valid_facial_hairstyles = owner.generate_valid_facial_hairstyles()
if(!valid_head_accessories.len)
valid_head_accessories = owner.generate_valid_head_accessories()
- if(!valid_marking_styles.len)
- valid_marking_styles = owner.generate_valid_markings()
+ if(!valid_head_marking_styles.len)
+ valid_head_marking_styles = owner.generate_valid_markings("head")
+ if(!valid_body_marking_styles.len)
+ valid_body_marking_styles = owner.generate_valid_markings("body")
+ if(!valid_tail_marking_styles.len)
+ valid_tail_marking_styles = owner.generate_valid_markings("tail")
if(!valid_body_accessories.len)
valid_body_accessories = owner.generate_valid_body_accessories()
+ if(!valid_alt_head_styles.len)
+ valid_alt_head_styles = owner.generate_valid_alt_heads()
diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm
index f86b17eaab7..0ff6289ea66 100644
--- a/code/modules/power/generator.dm
+++ b/code/modules/power/generator.dm
@@ -1,211 +1,241 @@
-
/obj/machinery/power/generator
name = "thermoelectric generator"
desc = "It's a high efficiency thermoelectric generator."
icon_state = "teg"
- density = 1
anchored = 0
+ density = 1
+ use_power = 0
- use_power = 1
- idle_power_usage = 100 //Watts, I hope. Just enough to do the computer and display things.
-
- var/obj/machinery/atmospherics/binary/circulator/circ1
- var/obj/machinery/atmospherics/binary/circulator/circ2
+ var/obj/machinery/atmospherics/binary/circulator/cold_circ
+ var/obj/machinery/atmospherics/binary/circulator/hot_circ
+ var/cold_dir = WEST
+ var/hot_dir = EAST
+
var/lastgen = 0
var/lastgenlev = -1
-
- var/image/overlay_image
-
- var/power_multiplier = 1 // This is so admins can tweak how good it is to find a good balance for effort -> power
- var/powercap = 500000 //Not a hard cap, but outputs above this have a 10% chance to cause the TeG to lose half it's power.
-
+ var/lastcirc = "00"
+
/obj/machinery/power/generator/New()
..()
+ update_desc()
+
+/obj/machinery/power/generator/proc/update_desc()
+ desc = initial(desc) + " Its cold circulator is located on the [dir2text(cold_dir)] side, and its heat circulator is located on the [dir2text(hot_dir)] side."
+
+/obj/machinery/power/generator/Destroy()
+ disconnect()
+ return ..()
+
+/obj/machinery/power/generator/proc/disconnect()
+ if(cold_circ)
+ cold_circ.generator = null
+ if(hot_circ)
+ hot_circ.generator = null
+ if(powernet)
+ disconnect_from_network()
- spawn(1)
- reconnect()
+/obj/machinery/power/generator/initialize()
+ ..()
+ connect()
+
+/obj/machinery/power/generator/proc/connect()
+ connect_to_network()
+
+ var/obj/machinery/atmospherics/binary/circulator/circpath = /obj/machinery/atmospherics/binary/circulator
+ cold_circ = locate(circpath) in get_step(src, cold_dir)
+ hot_circ = locate(circpath) in get_step(src, hot_dir)
-//generators connect in dir and reverse_dir(dir) directions
-//mnemonic to determine circulator/generator directions: the cirulators orbit clockwise around the generator
-//so a circulator to the NORTH of the generator connects first to the EAST, then to the WEST
-//and a circulator to the WEST of the generator connects first to the NORTH, then to the SOUTH
-//note that the circulator's outlet dir is it's always facing dir, and it's inlet is always the reverse
-/obj/machinery/power/generator/proc/reconnect()
- circ1 = null
- circ2 = null
- if(src.loc && anchored)
- if(src.dir & (EAST|WEST))
- circ1 = locate(/obj/machinery/atmospherics/binary/circulator) in get_step(src,EAST)
- circ2 = locate(/obj/machinery/atmospherics/binary/circulator) in get_step(src,WEST)
+ if(cold_circ && cold_circ.side == cold_dir)
+ cold_circ.generator = src
+ cold_circ.update_icon()
+ else
+ cold_circ = null
- if(circ1 && circ2)
- if(circ1.dir != SOUTH || circ2.dir != NORTH)
- circ1 = null
- circ2 = null
+ if(hot_circ && hot_circ.side == hot_dir)
+ hot_circ.generator = src
+ hot_circ.update_icon()
+ else
+ hot_circ = null
- else if(src.dir & (NORTH|SOUTH))
- circ1 = locate(/obj/machinery/atmospherics/binary/circulator) in get_step(src,NORTH)
- circ2 = locate(/obj/machinery/atmospherics/binary/circulator) in get_step(src,SOUTH)
-
- if(circ1 && circ2 && (circ1.dir != EAST || circ2.dir != WEST))
- circ1 = null
- circ2 = null
-
-/obj/machinery/power/generator/proc/updateicon()
- if(isnull(src.overlay_image))
- src.overlay_image = image('icons/obj/power.dmi')
-
- overlays.Cut()
- if(!(stat & (NOPOWER|BROKEN)))
+ power_change()
+ update_icon()
+ updateDialog()
+
+/obj/machinery/power/generator/power_change()
+ if(!anchored)
+ stat |= NOPOWER
+ else
+ ..()
+
+/obj/machinery/power/generator/update_icon()
+ if(stat & (NOPOWER|BROKEN))
+ overlays.Cut()
+ else
+ overlays.Cut()
if(lastgenlev != 0)
- src.overlay_image.icon_state = "teg-op[lastgenlev]"
- overlays += src.overlay_image
+ overlays += image('icons/obj/power.dmi', "teg-op[lastgenlev]")
-/obj/machinery/power/generator/process()
- if(!circ1 || !circ2 || !anchored || stat & (BROKEN|NOPOWER))
+ overlays += image('icons/obj/power.dmi', "teg-oc[lastcirc]")
+
+/obj/machinery/power/generator/process()
+ if(stat & (NOPOWER|BROKEN))
return
+ if(!cold_circ || !hot_circ)
+ return
+
+ lastgen = 0
+
+ if(powernet)
+
+ //log_debug("cold_circ and hot_circ pass")
+
+ var/datum/gas_mixture/cold_air = cold_circ.return_transfer_air()
+ var/datum/gas_mixture/hot_air = hot_circ.return_transfer_air()
+
+ //log_debug("hot_air = [hot_air]; cold_air = [cold_air];")
+
+ if(cold_air && hot_air)
+
+ //log_debug("hot_air = [hot_air] temperature = [hot_air.temperature]; cold_air = [cold_air] temperature = [hot_air.temperature];")
+
+ //log_debug("coldair and hotair pass")
+ var/cold_air_heat_capacity = cold_air.heat_capacity()
+ var/hot_air_heat_capacity = hot_air.heat_capacity()
+
+ var/delta_temperature = hot_air.temperature - cold_air.temperature
+
+ //log_debug("delta_temperature = [delta_temperature]; cold_air_heat_capacity = [cold_air_heat_capacity]; hot_air_heat_capacity = [hot_air_heat_capacity]")
+
+ if(delta_temperature > 0 && cold_air_heat_capacity > 0 && hot_air_heat_capacity > 0)
+ var/efficiency = 0.65
+
+ var/energy_transfer = delta_temperature * hot_air_heat_capacity * cold_air_heat_capacity / (hot_air_heat_capacity + cold_air_heat_capacity)
+
+ var/heat = energy_transfer * (1 - efficiency)
+ lastgen = energy_transfer * efficiency
+
+ //log_debug("lastgen = [lastgen]; heat = [heat]; delta_temperature = [delta_temperature]; hot_air_heat_capacity = [hot_air_heat_capacity]; cold_air_heat_capacity = [cold_air_heat_capacity];")
+
+ hot_air.temperature = hot_air.temperature - energy_transfer / hot_air_heat_capacity
+ cold_air.temperature = cold_air.temperature + heat / cold_air_heat_capacity
+
+ //log_debug("POWER: [lastgen] W generated at [efficiency * 100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]")
+
+ add_avail(lastgen)
+ // update icon overlays only if displayed level has changed
+
+ if(hot_air)
+ var/datum/gas_mixture/hot_circ_air1 = hot_circ.air1
+ hot_circ_air1.merge(hot_air)
+
+ if(cold_air)
+ var/datum/gas_mixture/cold_circ_air1 = cold_circ.air1
+ cold_circ_air1.merge(cold_air)
+
+ var/genlev = max(0, min( round(11 * lastgen / 100000), 11))
+ var/circ = "[cold_circ && cold_circ.last_pressure_delta > 0 ? "1" : "0"][hot_circ && hot_circ.last_pressure_delta > 0 ? "1" : "0"]"
+ if((genlev != lastgenlev) || (circ != lastcirc))
+ lastgenlev = genlev
+ lastcirc = circ
+ update_icon()
+
updateDialog()
- var/datum/gas_mixture/air1 = circ1.return_transfer_air()
- var/datum/gas_mixture/air2 = circ2.return_transfer_air()
- lastgen = 0
-
- if(air1 && air2)
- var/air1_heat_capacity = air1.heat_capacity()
- var/air2_heat_capacity = air2.heat_capacity()
- var/delta_temperature = abs(air2.temperature - air1.temperature)
-
- if(delta_temperature > 0 && air1_heat_capacity > 0 && air2_heat_capacity > 0)
- var/efficiency = 0.65
- var/energy_transfer = delta_temperature*air2_heat_capacity*air1_heat_capacity/(air2_heat_capacity+air1_heat_capacity)
- var/heat = energy_transfer*(1-efficiency)
- lastgen = energy_transfer*efficiency*0.05*power_multiplier
-
- if(air2.temperature > air1.temperature)
- air2.temperature = air2.temperature - energy_transfer/air2_heat_capacity
- air1.temperature = air1.temperature + heat/air1_heat_capacity
- else
- air2.temperature = air2.temperature + heat/air2_heat_capacity
- air1.temperature = air1.temperature - energy_transfer/air1_heat_capacity
-
- //Transfer the air
- if(air1)
- circ1.air2.merge(air1)
- if(air2)
- circ2.air2.merge(air2)
-
- //Update the gas networks
- if(circ1.parent2)
- circ1.parent2.update = 1
- if(circ2.parent2)
- circ2.parent2.update = 1
-
- // update icon overlays and power usage only if displayed level has changed
- if(lastgen > powercap && prob(10))
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- lastgen *= 0.5
- var/genlev = max(0, min( round(11*lastgen / powercap), 11))
- if(lastgen > 100 && genlev == 0)
- genlev = 1
- if(genlev != lastgenlev)
- lastgenlev = genlev
- updateicon()
- add_avail(lastgen)
-
/obj/machinery/power/generator/attack_ai(mob/user)
- if(stat & (BROKEN|NOPOWER)) return
+ return attack_hand(user)
+
+/obj/machinery/power/generator/attack_ghost(mob/user)
+ if(stat & (NOPOWER|BROKEN))
+ return
+ interact(user)
+
+/obj/machinery/power/generator/attack_hand(mob/user)
+ if(..())
+ user << browse(null, "window=teg")
+ return
interact(user)
/obj/machinery/power/generator/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/wrench))
anchored = !anchored
- to_chat(user, "\blue You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor.")
- use_power = anchored
- reconnect()
+ if(!anchored)
+ disconnect()
+ power_change()
+ else
+ connect()
+ playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ to_chat(user, "You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor.")
+ else if(istype(W, /obj/item/device/multitool))
+ if(cold_dir == WEST)
+ cold_dir = EAST
+ hot_dir = WEST
+ else
+ cold_dir = WEST
+ hot_dir = EAST
+ connect()
+ to_chat(user, "You reverse the generator's circulator settings. The cold circulator is now on the [dir2text(cold_dir)] side, and the heat circulator is now on the [dir2text(hot_dir)] side.")
+ update_desc()
else
- ..()
+ ..()
+
+/obj/machinery/power/generator/proc/get_menu(include_link = 1)
+ var/t = ""
+ if(!powernet)
+ t += "Unable to connect to the power network!"
+ t += "
Retry"
+ else if(cold_circ && hot_circ)
+ var/datum/gas_mixture/cold_circ_air1 = cold_circ.air1
+ var/datum/gas_mixture/cold_circ_air2 = cold_circ.air2
+ var/datum/gas_mixture/hot_circ_air1 = hot_circ.air1
+ var/datum/gas_mixture/hot_circ_air2 = hot_circ.air2
-/obj/machinery/power/generator/attack_hand(mob/user)
- add_fingerprint(user)
- if(stat & (BROKEN|NOPOWER) || !anchored) return
- interact(user)
+ t += ""
+ t += "Output: [round(lastgen)] W"
+
+ t += "
"
+
+ t += "Cold loop
"
+ t += "Temperature Inlet: [round(cold_circ_air2.temperature, 0.1)] K / Outlet: [round(cold_circ_air1.temperature, 0.1)] K
"
+ t += "Pressure Inlet: [round(cold_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(cold_circ_air1.return_pressure(), 0.1)] kPa
"
+
+ t += "Hot loop
"
+ t += "Temperature Inlet: [round(hot_circ_air2.temperature, 0.1)] K / Outlet: [round(hot_circ_air1.temperature, 0.1)] K
"
+ t += "Pressure Inlet: [round(hot_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(hot_circ_air1.return_pressure(), 0.1)] kPa
"
+
+ t += "
"
+ else
+ t += "Unable to locate all parts!"
+ t += "
Retry"
+ if(include_link)
+ t += "
Close"
+
+ return t
/obj/machinery/power/generator/interact(mob/user)
- if( (get_dist(src, user) > 1 ) && (!istype(user, /mob/living/silicon/ai)))
- user.unset_machine()
- user << browse(null, "window=teg")
- return
-
user.set_machine(src)
- var/t = "Thermo-Electric Generator
"
-
- if(circ1 && circ2)
- t += "Output : [round(lastgen)] W
"
-
- t += "Primary Circulator (top or right)
"
- t += "Inlet Pressure: [round(circ1.air1.return_pressure(), 0.1)] kPa
"
- t += "Inlet Temperature: [round(circ1.air1.temperature, 0.1)] K
"
- t += "Outlet Pressure: [round(circ1.air2.return_pressure(), 0.1)] kPa
"
- t += "Outlet Temperature: [round(circ1.air2.temperature, 0.1)] K
"
-
- t += "Secondary Circulator (bottom or left)
"
- t += "Inlet Pressure: [round(circ2.air1.return_pressure(), 0.1)] kPa
"
- t += "Inlet Temperature: [round(circ2.air1.temperature, 0.1)] K
"
- t += "Outlet Pressure: [round(circ2.air2.return_pressure(), 0.1)] kPa
"
- t += "Outlet Temperature: [round(circ2.air2.temperature, 0.1)] K
"
-
- else
- t += "Unable to connect to circulators.
"
- t += "Ensure both are in position and wrenched into place."
-
- t += "
"
- t += "
"
- t += "Refresh Close"
-
- user << browse(t, "window=teg;size=460x300")
- onclose(user, "teg")
+ var/datum/browser/popup = new(user, "teg", "Thermo-Electric Generator", 460, 300)
+ popup.set_content(get_menu())
+ popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
+ popup.open()
return 1
-
/obj/machinery/power/generator/Topic(href, href_list)
- ..()
+ if(..())
+ return 0
if( href_list["close"] )
usr << browse(null, "window=teg")
usr.unset_machine()
return 0
-
- updateDialog()
+ if( href_list["check"] )
+ if(!powernet || !cold_circ || !hot_circ)
+ connect()
return 1
-
/obj/machinery/power/generator/power_change()
..()
- updateicon()
-
-
-/obj/machinery/power/generator/verb/rotate_clock()
- set category = "Object"
- set name = "Rotate Generator (Clockwise)"
- set src in view(1)
-
- if(usr.stat || usr.restrained() || anchored)
- return
-
- src.dir = turn(src.dir, 90)
-
-/obj/machinery/power/generator/verb/rotate_anticlock()
- set category = "Object"
- set name = "Rotate Generator (Counterclockwise)"
- set src in view(1)
-
- if(usr.stat || usr.restrained() || anchored)
- return
-
- src.dir = turn(src.dir, -90)
\ No newline at end of file
+ update_icon()
\ No newline at end of file
diff --git a/code/modules/power/generator_type2.dm b/code/modules/power/generator_type2.dm
deleted file mode 100644
index d1ff1f1079c..00000000000
--- a/code/modules/power/generator_type2.dm
+++ /dev/null
@@ -1,143 +0,0 @@
-/obj/machinery/power/generator_type2
- name = "thermoelectric generator"
- desc = "It's a high efficiency thermoelectric generator."
- icon_state = "teg"
- anchored = 1
- density = 1
- use_power = 0
-
- var/obj/machinery/atmospherics/unary/generator_input/input1
- var/obj/machinery/atmospherics/unary/generator_input/input2
-
- var/lastgen = 0
- var/lastgenlev = -1
-
- var/image/overlay_image
-
-/obj/machinery/power/generator_type2/New()
- ..()
- spawn(5)
- input1 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,turn(dir, 90))
- input2 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,turn(dir, -90))
- if(!input1 || !input2)
- stat |= BROKEN
- updateicon()
-
-
-/obj/machinery/power/generator_type2/proc/updateicon()
-
- if(isnull(src.overlay_image))
- src.overlay_image = image('icons/obj/power.dmi')
-
- overlays.Cut()
- if(!(stat & (NOPOWER|BROKEN)))
-
- if(lastgenlev != 0)
- src.overlay_image.icon_state = "teg-op[lastgenlev]"
- overlays += src.overlay_image
-
-#define GENRATE 800 // generator output coefficient from Q
-
-
-/obj/machinery/power/generator_type2/process()
- if(!input1 || !input2)
- return
-
- var/datum/gas_mixture/air1 = input1.return_exchange_air()
- var/datum/gas_mixture/air2 = input2.return_exchange_air()
-
-
- lastgen = 0
-
- if(air1 && air2)
- var/datum/gas_mixture/hot_air = air1
- var/datum/gas_mixture/cold_air = air2
- if(hot_air.temperature < cold_air.temperature)
- hot_air = air2
- cold_air = air1
-
- var/hot_air_heat_capacity = hot_air.heat_capacity()
- var/cold_air_heat_capacity = cold_air.heat_capacity()
-
- var/delta_temperature = hot_air.temperature - cold_air.temperature
-
- if(delta_temperature > 1 && cold_air_heat_capacity > 0.01 && hot_air_heat_capacity > 0.01)
- var/efficiency = (1 - cold_air.temperature/hot_air.temperature)*0.65 //65% of Carnot efficiency
-
- var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity)
-
- var/heat = energy_transfer*(1-efficiency)
- lastgen = energy_transfer*efficiency
-
- hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity
- cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity
-
-// to_chat(world, "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]")
-
- input1.parent.update = 1
- input2.parent.update = 1
-
- add_avail(lastgen)
- // update icon overlays only if displayed level has changed
-
- var/genlev = max(0, min( round(11*lastgen / 100000), 11))
- if(genlev != lastgenlev)
- lastgenlev = genlev
- updateicon()
-
- src.updateDialog()
-
-
-/obj/machinery/power/generator_type2/attack_ai(mob/user)
- if(stat & (BROKEN|NOPOWER)) return
- interact(user)
-
-
-/obj/machinery/power/generator_type2/attack_hand(mob/user)
- add_fingerprint(user)
- if(stat & (BROKEN|NOPOWER)) return
- interact(user)
-
-
-/obj/machinery/power/generator_type2/interact(mob/user)
- if( (get_dist(src, user) > 1 ) && (!istype(user, /mob/living/silicon/ai)))
- user.unset_machine()
- user << browse(null, "window=teg")
- return
-
- user.set_machine(src)
-
- var/t = "Thermo-Electric Generator
"
-
- t += "Output : [round(lastgen)] W
"
-
- t += "Cold loop
"
- t += "Temperature: [round(input1.air_contents.temperature, 0.1)] K
"
- t += "Pressure: [round(input1.air_contents.return_pressure(), 0.1)] kPa
"
-
- t += "Hot loop
"
- t += "Temperature: [round(input2.air_contents.temperature, 0.1)] K
"
- t += "Pressure: [round(input2.air_contents.return_pressure(), 0.1)] kPa
"
-
- t += "
Close"
-
- t += "
"
- user << browse(t, "window=teg;size=460x300")
- onclose(user, "teg")
- return 1
-
-
-/obj/machinery/power/generator_type2/Topic(href, href_list)
- ..()
-
- if( href_list["close"] )
- usr << browse(null, "window=teg")
- usr.unset_machine()
- return 0
-
- return 1
-
-
-/obj/machinery/power/generator_type2/power_change()
- ..()
- updateicon()
\ No newline at end of file
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 0f6d41fc145..420733f7c76 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -122,7 +122,7 @@
if(ishuman(mob))
//Hilariously enough, running into a closet should make you get hit the hardest.
var/mob/living/carbon/human/H = mob
- H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) )
+ H.AdjustHallucinate(max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)))))
var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) )
mob.apply_effect(rads, IRRADIATE)
@@ -189,7 +189,7 @@
var/obj/item/organ/internal/eyes/eyes = l.get_int_organ(/obj/item/organ/internal/eyes)
if(!istype(eyes))
continue
- l.hallucination = max(0, min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / max(1,get_dist(l, src)) ) ) )
+ l.Hallucinate(min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / max(1,get_dist(l, src)))))
for(var/mob/living/l in range(src, round((power / 100) ** 0.25)))
var/rads = (power / 10) * sqrt( 1 / max(get_dist(l, src),1) )
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index 99a1660ba35..8d920a7e736 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -49,7 +49,7 @@
/obj/item/weapon/gun/energy/gun/hos
name = "\improper X-01 MultiPhase Energy Gun"
- desc = "This is a expensive, modern recreation of a antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time."
+ desc = "This is an expensive, modern recreation of an antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time."
icon_state = "hoslaser"
force = 10
ammo_type = list(/obj/item/ammo_casing/energy/electrode/hos, /obj/item/ammo_casing/energy/laser/hos, /obj/item/ammo_casing/energy/disabler)
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 0ae9b10752e..275e2ec94e5 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -23,18 +23,18 @@
/obj/item/projectile/bullet/weakbullet/booze/on_hit(atom/target, blocked = 0)
if(..(target, blocked))
var/mob/living/M = target
- M.dizziness += 20
- M.slurring += 20
- M.confused += 20
- M.eye_blurry += 20
- M.drowsyness += 20
+ M.AdjustDizzy(20)
+ M.AdjustSlur(20)
+ M.AdjustConfused(20)
+ M.AdjustEyeBlurry(20)
+ M.AdjustDrowsy(20)
for(var/datum/reagent/ethanol/A in M.reagents.reagent_list)
M.AdjustParalysis(2)
- M.dizziness += 10
- M.slurring += 10
- M.confused += 10
- M.eye_blurry += 10
- M.drowsyness += 10
+ M.AdjustDizzy(10)
+ M.AdjustSlur(10)
+ M.AdjustConfused(10)
+ M.AdjustEyeBlurry(10)
+ M.AdjustDrowsy(10)
A.volume += 5 //Because we can
/obj/item/projectile/bullet/weakbullet2 //detective revolver instastuns, but multiple shots are better for keeping punks down
@@ -216,7 +216,7 @@
..(target, blocked)
if(iscarbon(target))
var/mob/living/carbon/M = target
- M.silent = max(M.silent, 10)
+ M.Silence(10)
else if(istype(target, /obj/mecha/combat/honker))
var/obj/mecha/chassis = target
chassis.occupant_message("A mimetech anti-honk bullet has hit \the [chassis]!")
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 0e1b7478cc8..bcc4335f66a 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -186,7 +186,7 @@
if(ishuman(target))
var/mob/living/carbon/human/M = target
M.adjustBrainLoss(20)
- M.hallucination += 20
+ M.AdjustHallucinate(20)
/obj/item/projectile/clown
name = "snap-pop"
diff --git a/code/modules/reagents/newchem/Blob-Reagents.dm b/code/modules/reagents/newchem/Blob-Reagents.dm
index fa5e9747e34..a7cfa32f403 100644
--- a/code/modules/reagents/newchem/Blob-Reagents.dm
+++ b/code/modules/reagents/newchem/Blob-Reagents.dm
@@ -61,7 +61,7 @@
volume = ..()
M.apply_damage(0.4*volume, BRUTE)
M.apply_damage(1*volume, OXY)
- M.losebreath += round(0.3*volume)
+ M.AdjustLoseBreath(round(0.3*volume))
/datum/reagent/blob/kinetic //does semi-random brute damage
diff --git a/code/modules/reagents/newchem/disease.dm b/code/modules/reagents/newchem/disease.dm
index def94ba9a2c..cdc2d0b8d43 100644
--- a/code/modules/reagents/newchem/disease.dm
+++ b/code/modules/reagents/newchem/disease.dm
@@ -131,12 +131,12 @@
color = "#EC536D" // rgb: 236, 83, 109
/datum/reagent/synaphydramine/on_mob_life(mob/living/M)
- M.drowsyness = max(M.drowsyness-5, 0)
+ M.AdjustDrowsy(-5)
if(holder.has_reagent("lsd"))
holder.remove_reagent("lsd", 5)
if(holder.has_reagent("histamine"))
holder.remove_reagent("histamine", 5)
- M.hallucination = max(0, M.hallucination - 10)
+ M.AdjustHallucinate(-10)
if(prob(30))
M.adjustToxLoss(1)
..()
@@ -317,4 +317,4 @@
if(B && B.data)
var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"]
if(D)
- D.Devolve()
\ No newline at end of file
+ D.Devolve()
diff --git a/code/modules/reagents/newchem/drinks.dm b/code/modules/reagents/newchem/drinks.dm
index b1f789b7f22..da07f7a995f 100644
--- a/code/modules/reagents/newchem/drinks.dm
+++ b/code/modules/reagents/newchem/drinks.dm
@@ -15,7 +15,7 @@
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
/datum/reagent/ginsonic/on_mob_life(mob/living/M)
- M.drowsyness = max(0, M.drowsyness-5)
+ M.AdjustDrowsy(-5)
if(prob(25))
M.AdjustParalysis(-1)
M.AdjustStunned(-1)
diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/newchem/drugs.dm
index 99a637e4fca..bc5b10be569 100644
--- a/code/modules/reagents/newchem/drugs.dm
+++ b/code/modules/reagents/newchem/drugs.dm
@@ -30,7 +30,7 @@
if(severity == 1)
if(effect <= 2)
M.visible_message("[M] looks nervous!")
- M.confused += 15
+ M.AdjustConfused(15)
M.adjustToxLoss(2)
M.Jitter(10)
M.emote("twitch_s")
@@ -55,7 +55,7 @@
M.Jitter(10)
M.adjustToxLoss(5)
M.Weaken(1)
- M.confused += 33
+ M.AdjustConfused(33)
else if(effect <= 7)
M.emote("collapse")
to_chat(M, "Your heart is pounding!")
@@ -90,7 +90,7 @@
if(prob(4))
to_chat(M, "You feel kinda awful!")
M.adjustToxLoss(1)
- M.jitteriness += 30
+ M.AdjustJitter(30)
M.emote(pick("groan", "moan"))
..()
@@ -99,7 +99,7 @@
if(severity == 1)
if(effect <= 2)
M.visible_message("[M] looks confused!")
- M.confused += 20
+ M.AdjustConfused(20)
M.Jitter(20)
M.emote("scream")
else if(effect <= 4)
@@ -123,7 +123,7 @@
M.adjustToxLoss(2)
M.adjustBrainLoss(8)
M.Weaken(3)
- M.confused += 25
+ M.AdjustConfused(25)
M.emote("scream")
M.reagents.add_reagent("jagged_crystals", 5)
else if(effect <= 7)
@@ -160,7 +160,7 @@
/datum/reagent/krokodil/on_mob_life(mob/living/M)
- M.jitteriness -= 40
+ M.AdjustJitter(-40)
if(prob(25))
M.adjustBrainLoss(1)
if(prob(15))
@@ -241,8 +241,8 @@
if(prob(5))
M.emote(pick("twitch_s","blink_r","shiver"))
if(current_cycle >= 25)
- M.jitteriness += 5
- M.drowsyness = max(0, M.drowsyness-10)
+ M.AdjustJitter(5)
+ M.AdjustDrowsy(-10)
M.AdjustParalysis(-2.5)
M.AdjustStunned(-2.5)
M.AdjustWeakened(-2.5)
@@ -262,7 +262,7 @@
if(severity == 1)
if(effect <= 2)
M.visible_message("[M] can't seem to control their legs!")
- M.confused += 20
+ M.AdjustConfused(20)
M.Weaken(4)
else if(effect <= 4)
M.visible_message("[M]'s hands flip out and flail everywhere!")
@@ -296,7 +296,7 @@
for(var/mob/living/carbon/C in range(T, 1))
if(C.can_breathe_gas())
C.emote("gasp")
- C.losebreath++
+ C.AdjustLoseBreath(1)
C.reagents.add_reagent("toxin", 10)
C.reagents.add_reagent("neurotoxin2", 20)
@@ -342,15 +342,15 @@
M.SetWeakened(0)
if(check < 30)
M.emote(pick("twitch", "twitch_s", "scream", "drool", "grumble", "mumble"))
- M.druggy = max(M.druggy, 15)
+ M.Druggy(15)
if(check < 20)
- M.confused += 10
+ M.AdjustConfused(10)
if(check < 8)
M.reagents.add_reagent(pick("methamphetamine", "crank", "neurotoxin"), rand(1,5))
M.visible_message("[M] scratches at something under their skin!")
M.adjustBruteLoss(5)
else if(check < 16)
- M.hallucination += 30
+ M.AdjustHallucinate(30)
else if(check < 24)
to_chat(M, "They're coming for you!")
else if(check < 28)
@@ -373,7 +373,7 @@
if(severity == 1)
if(effect <= 2)
M.visible_message("[M] flails around like a lunatic!")
- M.confused += 25
+ M.AdjustConfused(25)
M.Jitter(10)
M.emote("scream")
M.reagents.add_reagent("jagged_crystals", 5)
@@ -383,7 +383,7 @@
M.adjustToxLoss(2)
M.adjustBrainLoss(1)
M.Stun(3)
- M.eye_blurry = max(M.eye_blurry, 7)
+ M.EyeBlurry(7)
M.reagents.add_reagent("jagged_crystals", 5)
else if(effect <= 7)
M.emote("faint")
@@ -394,7 +394,7 @@
M.adjustToxLoss(2)
M.adjustBrainLoss(1)
M.Stun(3)
- M.eye_blurry = max(M.eye_blurry, 7)
+ M.EyeBlurry(7)
M.reagents.add_reagent("jagged_crystals", 5)
else if(effect <= 4)
M.visible_message("[M] convulses violently and falls to the floor!")
@@ -479,7 +479,7 @@
to_chat(M, "You cannot breathe!")
M.adjustOxyLoss(15)
M.Stun(1)
- M.losebreath++
+ M.AdjustLoseBreath(1)
..()
/datum/reagent/thc
@@ -497,10 +497,10 @@
if(prob(5))
to_chat(M, "[pick("You feel hungry.","Your stomach rumbles.","You feel cold.","You feel warm.")]")
if(prob(4))
- M.confused = max(M.confused, 10)
+ M.Confused(10)
if(volume >= 50 && prob(25))
if(prob(10))
- M.drowsyness = max(M.drowsyness, 10)
+ M.Drowsy(10)
..()
/datum/reagent/fliptonium
@@ -545,7 +545,7 @@
if(current_cycle == 50)
M.SpinAnimation(speed = 4, loops = -1)
- M.drowsyness = max(0, M.drowsyness-6)
+ M.AdjustDrowsy(-6)
M.AdjustParalysis(-1.5)
M.AdjustStunned(-1.5)
M.AdjustWeakened(-1.5)
@@ -561,7 +561,7 @@
if(severity == 1)
if(effect <= 2)
M.visible_message("[M] can't seem to control their legs!")
- M.confused += 33
+ M.AdjustConfused(33)
M.Weaken(2)
else if(effect <= 4)
M.visible_message("[M]'s hands flip out and flail everywhere!")
@@ -655,7 +655,7 @@
/datum/reagent/surge/on_mob_life(mob/living/M)
- M.druggy = max(M.druggy, 15)
+ M.Druggy(15)
var/high_message = pick("You feel calm.", "You feel collected.", "You feel like you need to relax.")
if(prob(1))
if(prob(1))
diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm
index 777c10ebfd7..a84ac83f385 100644
--- a/code/modules/reagents/newchem/medicine.dm
+++ b/code/modules/reagents/newchem/medicine.dm
@@ -167,7 +167,7 @@
M.adjustBruteLoss(-2*REM)
M.adjustFireLoss(-2*REM)
if(prob(50))
- M.losebreath -= 1
+ M.AdjustLoseBreath(-1)
..()
/datum/reagent/omnizine/overdose_process(mob/living/M, severity)
@@ -181,7 +181,7 @@
M.Weaken(4)
else if(effect <= 3)
M.visible_message("[M] completely spaces out for a moment.")
- M.confused += 15
+ M.AdjustConfused(15)
else if(effect <= 5)
M.visible_message("[M] stumbles and staggers.")
M.Dizzy(5)
@@ -317,7 +317,7 @@
/datum/reagent/salbutamol/on_mob_life(mob/living/M)
M.adjustOxyLoss(-6*REM)
- M.losebreath = max(0, M.losebreath-4)
+ M.AdjustLoseBreath(-4)
..()
/datum/chemical_reaction/salbutamol
@@ -341,8 +341,8 @@
/datum/reagent/perfluorodecalin/on_mob_life(mob/living/carbon/human/M)
M.adjustOxyLoss(-25*REM)
if(volume >= 4)
- M.losebreath = max(M.losebreath, 6)
- M.silent = max(M.silent, 6)
+ M.LoseBreath(6)
+ M.Silence(6)
if(prob(33))
M.adjustBruteLoss(-1*REM)
M.adjustFireLoss(-1*REM)
@@ -369,13 +369,12 @@
addiction_chance = 25
/datum/reagent/ephedrine/on_mob_life(mob/living/M)
- M.drowsyness = max(0, M.drowsyness-5)
+ M.AdjustDrowsy(-5)
M.AdjustParalysis(-1)
M.AdjustStunned(-1)
M.AdjustWeakened(-1)
M.adjustStaminaLoss(-1*REM)
- if(M.losebreath > 5)
- M.losebreath = max(5, M.losebreath-1)
+ M.AdjustLoseBreath(-1, bound_lower = 5)
if(M.oxyloss > 75)
M.adjustOxyLoss(-1)
if(M.health < 0 || M.health > 0 && prob(33))
@@ -422,14 +421,14 @@
addiction_chance = 10
/datum/reagent/diphenhydramine/on_mob_life(mob/living/M)
- M.jitteriness = max(0, M.jitteriness-20)
+ M.AdjustJitter(-20)
M.reagents.remove_reagent("histamine",3)
M.reagents.remove_reagent("itching_powder",3)
if(prob(7))
M.emote("yawn")
if(prob(3))
M.Stun(2)
- M.drowsyness += 1
+ M.AdjustDrowsy(1)
M.visible_message("[M] looks a bit dazed.")
..()
@@ -453,16 +452,16 @@
shock_reduction = 50
/datum/reagent/morphine/on_mob_life(mob/living/M)
- M.jitteriness = max(0, M.jitteriness-25)
+ M.AdjustJitter(-25)
switch(current_cycle)
if(1 to 15)
if(prob(7))
M.emote("yawn")
if(16 to 35)
- M.drowsyness = max(M.drowsyness, 20)
+ M.Drowsy(20)
if(36 to INFINITY)
M.Paralyse(15)
- M.drowsyness = max(M.drowsyness, 20)
+ M.Drowsy(20)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.traumatic_shock < 100)
@@ -476,16 +475,16 @@
var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes)
if(istype(E))
E.damage = max(E.damage-1, 0)
- M.eye_blurry = max(M.eye_blurry-1 , 0)
- M.adjustEarDamage(-1,0)
+ M.AdjustEyeBlurry(-1)
+ M.AdjustEarDamage(-1)
if(prob(50))
- M.disabilities &= ~NEARSIGHTED
+ M.CureNearsighted()
if(prob(30))
- M.disabilities &= ~BLIND
- M.eye_blind = 0
+ M.CureBlind()
+ M.SetEyeBlind(0)
if(M.ear_damage <= 25)
if(prob(30))
- M.setEarDamage(-1,0)
+ M.SetEarDeaf(0)
..()
/datum/chemical_reaction/oculine
@@ -515,12 +514,11 @@
overdose_threshold = 25
/datum/reagent/atropine/on_mob_life(mob/living/M)
- M.dizziness += 1
- M.confused = max(M.confused, 5)
+ M.AdjustDizzy(1)
+ M.Confused(5)
if(prob(4))
M.emote("collapse")
- if(M.losebreath > 5)
- M.losebreath = max(5, M.losebreath-5)
+ M.AdjustLoseBreath(-5, bound_lower = 5)
if(M.oxyloss > 65)
M.adjustOxyLoss(-10*REM)
if(M.health < -25)
@@ -550,7 +548,7 @@
overdose_threshold = 20
/datum/reagent/epinephrine/on_mob_life(mob/living/M)
- M.drowsyness = max(0, M.drowsyness-5)
+ M.AdjustDrowsy(-5)
if(prob(20))
M.AdjustParalysis(-1)
if(prob(20))
@@ -562,8 +560,7 @@
if(prob(5))
M.adjustBrainLoss(-1)
holder.remove_reagent("histamine", 15)
- if(M.losebreath > 3)
- M.losebreath--
+ M.AdjustLoseBreath(-1, bound_lower = 3)
if(M.oxyloss > 35)
M.adjustOxyLoss(-10*REM)
if(M.health < -10 && M.health > -65)
@@ -694,7 +691,7 @@
color = "#D1D1F1"
/datum/reagent/mutadone/on_mob_life(mob/living/carbon/human/M)
- M.jitteriness = 0
+ M.SetJitter(0)
var/needs_update = M.mutations.len > 0 || M.disabilities > 0
if(needs_update)
@@ -733,7 +730,7 @@
color = "#009CA8"
/datum/reagent/antihol/on_mob_life(mob/living/M)
- M.slurring = 0
+ M.SetSlur(0)
M.AdjustDrunk(-4)
M.reagents.remove_all_type(/datum/reagent/ethanol, 8, 0, 1)
if(M.toxloss <= 25)
@@ -763,10 +760,10 @@
M.adjustBruteLoss(-10*REM)
M.adjustFireLoss(-10*REM)
M.setStaminaLoss(0)
- M.slowed = 0
- M.dizziness = max(0,M.dizziness-10)
- M.drowsyness = max(0,M.drowsyness-10)
- M.confused = 0
+ M.SetSlowed(0)
+ M.AdjustDizzy(-10)
+ M.AdjustDrowsy(-10)
+ M.SetConfused(0)
M.SetSleeping(0)
var/status = CANSTUN | CANWEAKEN | CANPARALYSE
M.status_flags &= ~status
@@ -811,7 +808,7 @@
if(prob(33))
M.adjustStaminaLoss(2.5*REM)
M.adjustToxLoss(1*REM)
- M.losebreath++
+ M.AdjustLoseBreath(1)
/datum/reagent/insulin
name = "Insulin"
@@ -882,11 +879,11 @@
M.reagents.remove_reagent("bath_salts", 5)
M.reagents.remove_reagent("lsd", 5)
M.reagents.remove_reagent("thc", 5)
- M.druggy -= 5
- M.hallucination -= 5
- M.jitteriness -= 5
+ M.AdjustDruggy(-5)
+ M.AdjustHallucinate(-5)
+ M.AdjustJitter(-5)
if(prob(50))
- M.drowsyness = max(M.drowsyness, 3)
+ M.Drowsy(3)
if(prob(10))
M.emote("drool")
if(prob(20))
@@ -910,16 +907,16 @@
color = "#96DEDE"
/datum/reagent/ether/on_mob_life(mob/living/M)
- M.jitteriness = max(M.jitteriness-25,0)
+ M.AdjustJitter(-25)
switch(current_cycle)
if(1 to 15)
if(prob(7))
M.emote("yawn")
if(16 to 35)
- M.drowsyness = max(M.drowsyness, 20)
+ M.Drowsy(20)
if(36 to INFINITY)
M.Paralyse(15)
- M.drowsyness = max(M.drowsyness, 20)
+ M.Drowsy(20)
..()
/datum/chemical_reaction/ether
@@ -960,7 +957,7 @@
M.AdjustParalysis(-1)
M.AdjustStunned(-1)
M.AdjustWeakened(-1)
- M.confused = max(0, M.confused-5)
+ M.AdjustConfused(-5)
for(var/datum/reagent/R in M.reagents.reagent_list)
if(R != src)
if(R.id == "ultralube" || R.id == "lube")
@@ -1037,7 +1034,7 @@
M.Weaken(4)
else if(effect <= 3)
M.visible_message("[M] completely spaces out for a moment.")
- M.confused += 15
+ M.AdjustConfused(15)
else if(effect <= 5)
M.visible_message("[M] stumbles and staggers.")
M.Dizzy(5)
diff --git a/code/modules/reagents/newchem/pyro.dm b/code/modules/reagents/newchem/pyro.dm
index 6dece72544c..05ecb1b1206 100644
--- a/code/modules/reagents/newchem/pyro.dm
+++ b/code/modules/reagents/newchem/pyro.dm
@@ -356,12 +356,13 @@
if(!ear_safety)
M.Stun(max(10/distance, 3))
M.Weaken(max(10/distance, 3))
- M.setEarDamage(M.ear_damage + rand(0, 5), max(M.ear_deaf,15))
+ M.AdjustEarDamage(rand(0, 5))
+ M.EarDeaf(15)
if(M.ear_damage >= 15)
to_chat(M, "Your ears start to ring badly!")
- if(prob(M.ear_damage - 10 + 5))
+ if(prob(M.ear_damage - 5))
to_chat(M, "You can't hear anything!")
- M.disabilities |= DEAF
+ M.BecomeDeaf()
else
if(M.ear_damage >= 5)
to_chat(M, "Your ears start to ring!")
@@ -384,10 +385,11 @@
if(!ear_safety)
M.Stun(max(10/distance, 3))
M.Weaken(max(10/distance, 3))
- M.setEarDamage(M.ear_damage + rand(0, 5), max(M.ear_deaf,15))
+ M.AdjustEarDamage(rand(0, 5))
+ M.EarDeaf(15)
if(M.ear_damage >= 15)
to_chat(M, "Your ears start to ring badly!")
- if(prob(M.ear_damage - 10 + 5))
+ if(prob(M.ear_damage - 5))
to_chat(M, "You can't hear anything!")
M.disabilities |= DEAF
else
@@ -619,4 +621,4 @@
if(method == TOUCH)
M.adjust_fire_stacks(volume / 5)
return
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/reagents/newchem/toxins.dm b/code/modules/reagents/newchem/toxins.dm
index 56d64d9a62e..d8e8205b1f7 100644
--- a/code/modules/reagents/newchem/toxins.dm
+++ b/code/modules/reagents/newchem/toxins.dm
@@ -41,7 +41,7 @@
if(prob(10))
to_chat(M, "Your eyes itch.")
M.emote(pick("blink", "sneeze"))
- M.eye_blurry += 3
+ M.AdjustEyeBlurry(3)
if(prob(10))
M.visible_message("[M] scratches at an itch.")
M.adjustBruteLoss(1)
@@ -141,7 +141,7 @@
if(prob(4))
M.visible_message("[M] starts convulsing violently!", "You feel as if your body is tearing itself apart!")
M.Weaken(15)
- M.jitteriness += 1000
+ M.AdjustJitter(1000)
spawn(rand(20, 100))
M.gib()
@@ -159,19 +159,19 @@
current_cycle++
return
if(5 to 8)
- M.dizziness += 1
- M.confused = max(M.confused, 10)
+ M.AdjustDizzy(1)
+ M.Confused(10)
if(9 to 12)
- M.drowsyness = max(M.drowsyness, 10)
- M.dizziness += 1
- M.confused = max(M.confused, 20)
+ M.Drowsy(10)
+ M.AdjustDizzy(1)
+ M.Confused(20)
if(13)
M.emote("faint")
if(14 to INFINITY)
M.Paralyse(10)
- M.drowsyness = max(M.drowsyness, 20)
+ M.Drowsy(20)
- M.jitteriness = max(0, M.jitteriness-30)
+ M.AdjustJitter(-30)
if(M.getBrainLoss() <= 80)
M.adjustBrainLoss(1)
else
@@ -207,7 +207,7 @@
M.emote("drool")
if(prob(10))
to_chat(M, "You cannot breathe!")
- M.losebreath += 1
+ M.AdjustLoseBreath(1)
M.emote("gasp")
if(prob(8))
to_chat(M, "You feel horrendously weak!")
@@ -261,7 +261,7 @@
to_chat(M, "AHHHHHH!")
M.adjustBruteLoss(5)
M.Weaken(5)
- M.jitteriness += 6
+ M.AdjustJitter(6)
M.visible_message("[M] falls to the floor, scratching themselves violently!")
M.emote("scream")
..()
@@ -364,11 +364,11 @@
if(prob(10))
to_chat(M, "You cannot breathe!")
M.adjustOxyLoss(10)
- M.losebreath++
+ M.AdjustLoseBreath(1)
if(prob(10))
to_chat(M, "Your chest is burning with pain!")
M.adjustOxyLoss(10)
- M.losebreath++
+ M.AdjustLoseBreath(1)
M.Stun(3)
M.Weaken(2)
if(ishuman(M))
@@ -425,12 +425,12 @@
M.Weaken(20)
if(prob(10))
M.emote(pick("drool", "tremble", "gasp"))
- M.losebreath++
+ M.AdjustLoseBreath(1)
if(prob(9))
to_chat(M, "You can't [pick("move", "feel your legs", "feel your face", "feel anything")]!")
if(prob(7))
to_chat(M, "You can't breathe!")
- M.losebreath += 3
+ M.AdjustLoseBreath(3)
..()
/datum/reagent/sodium_thiopental
@@ -445,15 +445,15 @@
switch(current_cycle)
if(1)
M.emote("drool")
- M.confused = max(M.confused, 5)
+ M.Confused(5)
if(2 to 4)
- M.drowsyness = max(M.drowsyness, 20)
+ M.Drowsy(20)
if(5)
M.emote("faint")
M.Weaken(5)
if(6 to INFINITY)
M.Paralyse(20)
- M.jitteriness = max(0, M.jitteriness-50)
+ M.AdjustJitter(-50)
if(prob(10))
M.emote("drool")
M.adjustBrainLoss(1)
@@ -474,7 +474,7 @@
if(prob(25))
M.emote("yawn")
if(6 to 9)
- M.eye_blurry += 5
+ M.AdjustEyeBlurry(5)
if(prob(35))
M.emote("yawn")
if(10)
@@ -502,20 +502,20 @@
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
/datum/reagent/sulfonal/on_mob_life(mob/living/M)
- M.jitteriness = max(0, M.jitteriness-30)
+ M.AdjustJitter(-30)
switch(current_cycle)
if(1 to 10)
if(prob(7))
M.emote("yawn")
if(11 to 20)
- M.drowsyness = max(M.drowsyness, 20)
+ M.Drowsy(20)
if(21)
M.emote("faint")
if(22 to INFINITY)
if(prob(20))
M.emote("faint")
M.Paralyse(5)
- M.drowsyness = max(M.drowsyness, 20)
+ M.Drowsy(20)
M.adjustToxLoss(1)
..()
@@ -570,7 +570,7 @@
/datum/reagent/coniine/on_mob_life(mob/living/M)
M.adjustToxLoss(2)
- M.losebreath += 5
+ M.AdjustLoseBreath(5)
..()
/datum/reagent/curare
@@ -590,7 +590,7 @@
if(prob(20))
M.emote(pick("drool", "pale", "gasp"))
if(6 to 10)
- M.eye_blurry += 5
+ M.AdjustEyeBlurry(5)
if(prob(8))
to_chat(M, "You feel [pick("weak", "horribly weak", "numb", "like you can barely move", "tingly")].")
M.Stun(1)
@@ -598,12 +598,12 @@
M.emote(pick("drool","pale", "gasp"))
if(11 to INFINITY)
M.Stun(30)
- M.drowsyness = max(M.drowsyness, 20)
+ M.Drowsy(20)
if(prob(20))
M.emote(pick("drool", "faint", "pale", "gasp", "collapse"))
else if(prob(8))
to_chat(M, "You can't [pick("breathe", "move", "feel your legs", "feel your face", "feel anything")]!")
- M.losebreath++
+ M.AdjustLoseBreath(1)
..()
/datum/reagent/sarin
@@ -636,22 +636,22 @@
/datum/reagent/sarin/on_mob_life(mob/living/M)
switch(current_cycle)
if(1 to 15)
- M.jitteriness += 20
+ M.AdjustJitter(20)
if(prob(20))
M.emote(pick("twitch","twitch_s","quiver"))
if(16 to 30)
if(prob(25))
M.emote(pick("twitch","twitch","drool","quiver","tremble"))
- M.eye_blurry += 5
- M.stuttering = max(M.stuttering, 5)
+ M.AdjustEyeBlurry(5)
+ M.Stuttering(5)
if(prob(10))
- M.confused = max(M.confused, 15)
+ M.Confused(15)
if(prob(15))
M.Stun(1)
M.emote("scream")
if(30 to 60)
- M.eye_blurry += 5
- M.stuttering = max(M.stuttering, 5)
+ M.AdjustEyeBlurry(5)
+ M.Stuttering(5)
if(prob(10))
M.Stun(1)
M.emote(pick("twitch","twitch","drool","shake","tremble"))
@@ -660,15 +660,15 @@
if(prob(5))
M.Weaken(3)
M.visible_message("[M] has a seizure!")
- M.jitteriness = 1000
+ M.SetJitter(1000)
if(prob(5))
to_chat(M, "You can't breathe!")
M.emote(pick("gasp", "choke", "cough"))
- M.losebreath++
+ M.AdjustLoseBreath(1)
if(61 to INFINITY)
if(prob(15))
M.emote(pick("gasp", "choke", "cough","twitch", "shake", "tremble","quiver","drool", "twitch","collapse"))
- M.losebreath = max(5, M.losebreath + 5)
+ M.LoseBreath(5)
M.adjustToxLoss(1)
M.adjustBrainLoss(1)
M.Weaken(4)
@@ -754,16 +754,16 @@
/datum/reagent/capulettium/on_mob_life(mob/living/M)
switch(current_cycle)
if(1 to 5)
- M.eye_blurry += 10
+ M.AdjustEyeBlurry(10)
if(6 to 10)
- M.drowsyness = max(M.drowsyness, 10)
+ M.Drowsy(10)
if(11)
M.Paralyse(10)
M.visible_message("[M] seizes up and falls limp, their eyes dead and lifeless...") //so you can't trigger deathgasp emote on people. Edge case, but necessary.
if(12 to 60)
M.Paralyse(10)
if(61 to INFINITY)
- M.eye_blurry += 10
+ M.AdjustEyeBlurry(10)
..()
/datum/reagent/capulettium_plus
@@ -783,7 +783,7 @@
mix_message = "The solution begins to slosh about violently by itself."
/datum/reagent/capulettium_plus/on_mob_life(mob/living/M)
- M.silent = max(M.silent, 2)
+ M.Silence(2)
..()
/datum/reagent/toxic_slurry
@@ -884,4 +884,4 @@
var/location = get_turf(holder.my_atom)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(6, 1, location)
- s.start()
\ No newline at end of file
+ s.start()
diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm
index da92ffee0f2..e337aa10e1f 100644
--- a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm
+++ b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm
@@ -13,7 +13,7 @@
/datum/reagent/ethanol/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
M.AdjustDrunk(alcohol_perc)
- M.dizziness += dizzy_adj
+ M.AdjustDizzy(dizzy_adj)
..()
@@ -84,7 +84,7 @@
//copy paste from LSD... shoot me
/datum/reagent/ethanol/absinthe/on_mob_life(mob/living/M)
- M.hallucination += 5
+ M.AdjustHallucinate(5)
..()
/datum/reagent/ethanol/absinthe/overdose_process(mob/living/M, severity)
@@ -97,10 +97,7 @@
color = "#664300" // rgb: 102, 67, 0
overdose_threshold = 30
alcohol_perc = 0.4
-
-/datum/reagent/ethanol/rum/on_mob_life(mob/living/M)
- M.dizziness +=5
- ..()
+ dizzy_adj = 5
/datum/reagent/ethanol/rum/overdose_process(mob/living/M, severity)
M.adjustToxLoss(1)
@@ -182,7 +179,7 @@
/datum/reagent/ethanol/thirteenloko/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
- M.drowsyness = max(0, M.drowsyness-7)
+ M.AdjustDrowsy(-7)
M.AdjustSleeping(-2)
if(M.bodytemperature > 310)
M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT))
@@ -625,7 +622,7 @@
/datum/reagent/ethanol/neurotoxin/on_mob_life(mob/living/M)
M.weakened = max(M.weakened, 3)
if(current_cycle >=55)
- M.druggy = max(M.druggy, 55)
+ M.Druggy(55)
if(current_cycle >=200)
M.adjustToxLoss(2)
..()
@@ -637,10 +634,7 @@
reagent_state = LIQUID
color = "#2E6671" // rgb: 46, 102, 113
alcohol_perc = 0.7
-
-/datum/reagent/ethanol/changelingsting/on_mob_life(mob/living/M)
- M.dizziness +=5
- ..()
+ dizzy_adj = 5
/datum/reagent/ethanol/irishcarbomb
name = "Irish Car Bomb"
@@ -649,10 +643,7 @@
reagent_state = LIQUID
color = "#2E6671" // rgb: 46, 102, 113
alcohol_perc = 0.3
-
-/datum/reagent/ethanol/irishcarbomb/on_mob_life(mob/living/M)
- M.dizziness +=5
- ..()
+ dizzy_adj = 5
/datum/reagent/ethanol/syndicatebomb
name = "Syndicate Bomb"
@@ -677,9 +668,9 @@
nutriment_factor = 1 * FOOD_METABOLISM
color = "#2E6671" // rgb: 46, 102, 113
alcohol_perc = 0.5
+ dizzy_adj = 10
/datum/reagent/ethanol/driestmartini/on_mob_life(mob/living/M)
- M.dizziness +=10
if(current_cycle >= 55 && current_cycle < 115)
M.stuttering += 10
..()
@@ -692,8 +683,8 @@
alcohol_perc = 0.2
/datum/reagent/ethanol/kahlua/on_mob_life(mob/living/M)
- M.dizziness = max(0, M.dizziness-5)
- M.drowsyness = max(0, M.drowsyness-3)
+ M.AdjustDizzy(-5)
+ M.AdjustDrowsy(-3)
M.AdjustSleeping(-2)
M.Jitter(5)
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm
index 26bad6c1665..869e9295bf5 100644
--- a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm
+++ b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm
@@ -38,8 +38,8 @@
color = "#973800" // rgb: 151, 56, 0
/datum/reagent/drink/carrotjuicde/on_mob_life(mob/living/M)
- M.eye_blurry = max(M.eye_blurry-1 , 0)
- M.eye_blind = max(M.eye_blind-1 , 0)
+ M.AdjustEyeBlurry(-1)
+ M.AdjustEyeBlind(-1)
switch(current_cycle)
if(1 to 20)
//nothing
@@ -282,4 +282,4 @@
if(ishuman(M) && M.job in list("Mime"))
M.adjustBruteLoss(-1)
M.adjustFireLoss(-1)
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink_base.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_drink_base.dm
index 1868489adb7..6e30efb9423 100644
--- a/code/modules/reagents/oldchem/reagents/drink/reagents_drink_base.dm
+++ b/code/modules/reagents/oldchem/reagents/drink/reagents_drink_base.dm
@@ -14,9 +14,9 @@
/datum/reagent/drink/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
if(adj_dizzy)
- M.dizziness = max(0, M.dizziness + adj_dizzy)
+ M.AdjustDizzy(adj_dizzy)
if(adj_drowsy)
- M.drowsyness = max(0, M.drowsyness + adj_drowsy)
+ M.AdjustDrowsy(adj_drowsy)
if(adj_sleepy)
M.AdjustSleeping(adj_sleepy)
if(adj_temp_hot)
@@ -25,4 +25,4 @@
if(adj_temp_cool)
if(M.bodytemperature > 310)//310 is the normal bodytemp. 310.055
M.bodytemperature = max(310, M.bodytemperature - (adj_temp_cool * TEMPERATURE_DAMAGE_COEFFICIENT))
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink_cold.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_drink_cold.dm
index fe54ed97246..26164571769 100644
--- a/code/modules/reagents/oldchem/reagents/drink/reagents_drink_cold.dm
+++ b/code/modules/reagents/oldchem/reagents/drink/reagents_drink_cold.dm
@@ -48,9 +48,9 @@
/datum/reagent/drink/cold/nuka_cola/on_mob_life(mob/living/M)
M.Jitter(20)
- M.druggy = max(M.druggy, 30)
- M.dizziness +=5
- M.drowsyness = 0
+ M.Druggy(30)
+ M.AdjustDizzy(5)
+ M.SetDrowsy(0)
M.status_flags |= GOTTAGOFAST
..()
@@ -121,4 +121,4 @@
/datum/reagent/drink/cold/rewriter/on_mob_life(mob/living/M)
M.Jitter(5)
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/reagents/oldchem/reagents/reagents_admin.dm b/code/modules/reagents/oldchem/reagents/reagents_admin.dm
index ccc617d2aaa..09636bd111f 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_admin.dm
+++ b/code/modules/reagents/oldchem/reagents/reagents_admin.dm
@@ -14,7 +14,6 @@
M.adjustBruteLoss(-5)
M.adjustFireLoss(-5)
M.adjustToxLoss(-5)
- M.hallucination = 0
M.setBrainLoss(0)
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -24,20 +23,28 @@
for(var/obj/item/organ/external/E in H.organs)
if(E.mend_fracture())
E.perma_injury = 0
- M.disabilities = 0
- M.eye_blurry = 0
- M.eye_blind = 0
+ M.SetEyeBlind(0)
+ M.CureNearsighted()
+ M.CureBlind()
+ M.CureMute()
+ M.CureDeaf()
+ M.CureEpilepsy()
+ M.CureTourettes()
+ M.CureCoughing()
+ M.CureNervous()
+ M.SetEyeBlurry(0)
M.SetWeakened(0)
M.SetStunned(0)
M.SetParalysis(0)
- M.silent = 0
- M.dizziness = 0
- M.drowsyness = 0
- M.stuttering = 0
- M.slurring = 0
- M.confused = 0
+ M.SetSilence(0)
+ M.SetHallucinate(0)
+ M.SetDizzy(0)
+ M.SetDrowsy(0)
+ M.SetStuttering(0)
+ M.SetSlur(0)
+ M.SetConfused(0)
M.SetSleeping(0)
- M.jitteriness = 0
+ M.SetJitter(0)
for(var/datum/disease/D in M.viruses)
if(D.severity == NONTHREAT)
continue
@@ -73,4 +80,4 @@
outgoing += tocheck
else
outgoing += tocheck
- return outgoing
\ No newline at end of file
+ return outgoing
diff --git a/code/modules/reagents/oldchem/reagents/reagents_drugs.dm b/code/modules/reagents/oldchem/reagents/reagents_drugs.dm
index 7cbc79b41b0..1fd0188287a 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_drugs.dm
+++ b/code/modules/reagents/oldchem/reagents/reagents_drugs.dm
@@ -37,7 +37,7 @@
metabolization_rate = 0.2 * REAGENTS_METABOLISM
/datum/reagent/hippies_delight/on_mob_life(mob/living/M)
- M.druggy = max(M.druggy, 50)
+ M.Druggy(50)
switch(current_cycle)
if(1 to 5)
if(!M.stuttering) M.stuttering = 1
@@ -47,13 +47,13 @@
if(!M.stuttering) M.stuttering = 1
M.Jitter(20)
M.Dizzy(20)
- M.druggy = max(M.druggy, 45)
+ M.Druggy(45)
if(prob(20)) M.emote(pick("twitch","giggle"))
if(10 to INFINITY)
if(!M.stuttering) M.stuttering = 1
M.Jitter(40)
M.Dizzy(40)
- M.druggy = max(M.druggy, 60)
+ M.Druggy(60)
if(prob(30)) M.emote(pick("twitch","giggle"))
..()
@@ -65,8 +65,8 @@
color = "#0000D8"
/datum/reagent/lsd/on_mob_life(mob/living/M)
- M.druggy = max(M.druggy, 15)
- M.hallucination += 10
+ M.Druggy(15)
+ M.AdjustHallucinate(10)
..()
/datum/reagent/space_drugs
@@ -80,7 +80,7 @@
heart_rate_decrease = 1
/datum/reagent/space_drugs/on_mob_life(mob/living/M)
- M.druggy = max(M.druggy, 15)
+ M.Druggy(15)
if(isturf(M.loc) && !istype(M.loc, /turf/space))
if(M.canmove && !M.restrained())
step(M, pick(cardinal))
@@ -94,22 +94,22 @@
color = "#E700E7" // rgb: 231, 0, 231
/datum/reagent/psilocybin/on_mob_life(mob/living/M)
- M.druggy = max(M.druggy, 30)
+ M.Druggy(30)
switch(current_cycle)
if(1 to 5)
- if(!M.stuttering) M.stuttering = 1
+ M.Stuttering(1)
M.Dizzy(5)
if(prob(10)) M.emote(pick("twitch","giggle"))
if(5 to 10)
- if(!M.stuttering) M.stuttering = 1
+ M.Stuttering(1)
M.Jitter(10)
M.Dizzy(10)
- M.druggy = max(M.druggy, 35)
+ M.Druggy(35)
if(prob(20)) M.emote(pick("twitch","giggle"))
if(10 to INFINITY)
- if(!M.stuttering) M.stuttering = 1
+ M.Stuttering(1)
M.Jitter(20)
M.Dizzy(20)
- M.druggy = max(M.druggy, 40)
+ M.Druggy(40)
if(prob(30)) M.emote(pick("twitch","giggle"))
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/reagents/oldchem/reagents/reagents_flammable.dm b/code/modules/reagents/oldchem/reagents/reagents_flammable.dm
index 52d33e21e07..61228dfb2d0 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_flammable.dm
+++ b/code/modules/reagents/oldchem/reagents/reagents_flammable.dm
@@ -22,7 +22,7 @@
M.adjustBrainLoss(3)
if(iscultist(M))
M.status_flags |= GOTTAGOFAST
- M.drowsyness = max(M.drowsyness-5, 0)
+ M.AdjustDrowsy(-5)
M.AdjustParalysis(-2)
M.AdjustStunned(-2)
M.AdjustWeakened(-2)
@@ -78,4 +78,4 @@
id = "glycerol"
description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity."
reagent_state = LIQUID
- color = "#808080" // rgb: 128, 128, 128
\ No newline at end of file
+ color = "#808080" // rgb: 128, 128, 128
diff --git a/code/modules/reagents/oldchem/reagents/reagents_food.dm b/code/modules/reagents/oldchem/reagents/reagents_food.dm
index 1dbe1f05a20..de52805fef2 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_food.dm
+++ b/code/modules/reagents/oldchem/reagents/reagents_food.dm
@@ -370,9 +370,9 @@
overdose_threshold = 200 // Hyperglycaemic shock
/datum/reagent/sugar/on_mob_life(mob/living/M)
- M.drowsyness = max(0, M.drowsyness-5)
+ M.AdjustDrowsy(-5)
if(current_cycle >= 90)
- M.jitteriness += 2
+ M.AdjustJitter(2)
if(prob(50))
M.AdjustParalysis(-1)
M.AdjustStunned(-1)
@@ -391,4 +391,3 @@
M.Weaken(4 * severity)
if(prob(8))
M.adjustToxLoss(severity)
-
diff --git a/code/modules/reagents/oldchem/reagents/reagents_med.dm b/code/modules/reagents/oldchem/reagents/reagents_med.dm
index cc5592dd42e..b0a09afc999 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_med.dm
+++ b/code/modules/reagents/oldchem/reagents/reagents_med.dm
@@ -41,7 +41,7 @@
overdose_threshold = 40
/datum/reagent/synaptizine/on_mob_life(mob/living/M)
- M.drowsyness = max(0, M.drowsyness-5)
+ M.AdjustDrowsy(-5)
M.AdjustParalysis(-1)
M.AdjustStunned(-1)
M.AdjustWeakened(-1)
@@ -139,4 +139,4 @@
description = "An all-purpose antibiotic agent extracted from space fungus."
reagent_state = LIQUID
color = "#0AB478"
- metabolization_rate = 0.2
\ No newline at end of file
+ metabolization_rate = 0.2
diff --git a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm
index bbdf92b8693..0aae5e3f40e 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm
+++ b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm
@@ -326,7 +326,7 @@
/datum/reagent/spores/on_mob_life(mob/living/M)
M.adjustToxLoss(1)
M.damageoverlaytemp = 60
- M.eye_blurry = max(M.eye_blurry, 3)
+ M.EyeBlurry(3)
..()
/datum/reagent/beer2 //disguised as normal beer for use by emagged brobots
@@ -385,25 +385,25 @@
to_chat(victim, "Your [safe_thing] protect you from most of the pepperspray!")
if(prob(5))
victim.emote("scream")
- victim.eye_blurry = max(M.eye_blurry, 3)
- victim.eye_blind = max(M.eye_blind, 1)
- victim.confused = max(M.confused, 3)
+ victim.EyeBlurry(3)
+ victim.EyeBlind(1)
+ victim.Confused(3)
victim.damageoverlaytemp = 60
victim.Weaken(3)
victim.drop_item()
return
else if( eyes_covered ) // Eye cover is better than mouth cover
to_chat(victim, "Your [safe_thing] protects your eyes from the pepperspray!")
- victim.eye_blurry = max(M.eye_blurry, 3)
+ victim.EyeBlurry(3)
victim.damageoverlaytemp = 30
return
else // Oh dear :D
if(prob(5))
victim.emote("scream")
to_chat(victim, "You're sprayed directly in the eyes with pepperspray!")
- victim.eye_blurry = max(M.eye_blurry, 5)
- victim.eye_blind = max(M.eye_blind, 2)
- victim.confused = max(M.confused, 6)
+ victim.EyeBlurry(5)
+ victim.EyeBlind(2)
+ victim.Confused(6)
victim.damageoverlaytemp = 75
victim.Weaken(5)
victim.drop_item()
@@ -411,4 +411,4 @@
/datum/reagent/condensedcapsaicin/on_mob_life(mob/living/M)
if(prob(5))
M.visible_message("[M] [pick("dry heaves!","coughs!","splutters!")]")
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/reagents/oldchem/reagents/reagents_water.dm b/code/modules/reagents/oldchem/reagents/reagents_water.dm
index bbfcbeb8142..a2dd3eb7fc4 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_water.dm
+++ b/code/modules/reagents/oldchem/reagents/reagents_water.dm
@@ -264,27 +264,27 @@
process_flags = ORGANIC | SYNTHETIC
/datum/reagent/holywater/on_mob_life(mob/living/M)
- M.jitteriness = max(M.jitteriness-5,0)
+ M.AdjustJitter(-5)
if(current_cycle >= 30) // 12 units, 60 seconds @ metabolism 0.4 units & tick rate 2.0 sec
- M.stuttering = min(M.stuttering+4, 20)
+ M.AdjustStuttering(4, bound_lower = 0, bound_upper = 20)
M.Dizzy(5)
if(iscultist(M) && prob(5))
M.say(pick("Av'te Nar'sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","Egkau'haom'nai en Chaous","Ho Diak'nos tou Ap'iron","R'ge Na'sie","Diabo us Vo'iscum","Si gn'um Co'nu"))
if(current_cycle >= 75 && prob(33)) // 30 units, 150 seconds
- M.confused += 3
+ M.AdjustConfused(3)
if(isvampirethrall(M))
ticker.mode.remove_vampire_mind(M.mind)
holder.remove_reagent(id, volume)
- M.jitteriness = 0
- M.stuttering = 0
- M.confused = 0
+ M.SetJitter(0)
+ M.SetStuttering(0)
+ M.SetConfused(0)
return
if(iscultist(M))
ticker.mode.remove_cultist(M.mind)
holder.remove_reagent(id, volume) // maybe this is a little too perfect and a max() cap on the statuses would be better??
- M.jitteriness = 0
- M.stuttering = 0
- M.confused = 0
+ M.SetJitter(0)
+ M.SetStuttering(0)
+ M.SetConfused(0)
return
if(ishuman(M) && M.mind && M.mind.vampire && !M.mind.vampire.get_ability(/datum/vampire_passive/full) && prob(80))
switch(current_cycle)
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index 1da5f07b2e5..a6fd792e795 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -80,12 +80,6 @@
icon_state = "pill8"
list_reagents = list("haloperidol" = 15)
-/obj/item/weapon/reagent_containers/food/pill/paroxetine
- name = "Paroxetine pill"
- desc = "Heavy anti-depressant."
- icon_state = "pill8"
- list_reagents = list("paroxetine" = 15)
-
/obj/item/weapon/reagent_containers/food/pill/happy
name = "Happy pill"
desc = "Happy happy joy joy!"
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 85657dd2b5b..232d2a9b3c5 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -255,20 +255,20 @@
/obj/machinery/disposal/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
var/data[0]
- var/pressure = 100 * air_contents.return_pressure() / (SEND_PRESSURE)
+ var/pressure = Clamp(100* air_contents.return_pressure() / (SEND_PRESSURE), 0, 100)
var/pressure_round = round(pressure,1)
data["isAI"] = isAI(user)
data["flushing"] = flush
data["mode"] = mode
if(mode <= 0)
- data["pumpstatus"] = ""
+ data["pumpstatus"] = "N/A"
else if(mode == 1)
- data["pumpstatus"] = "(pressurizing)"
+ data["pumpstatus"] = "Pressurizing"
else if(mode == 2)
- data["pumpstatus"] = "(ready)"
+ data["pumpstatus"] = "Ready"
else
- data["pumpstatus"] = "(idle)"
+ data["pumpstatus"] = "Idle"
data["pressure"] = pressure_round
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm
index 373b5d9454f..0e83e5812c3 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm
@@ -37,7 +37,7 @@
to_chat(H, "[pick(messages)]")
if(prob(50))
- H.dizziness += rand(3,5)
+ H.AdjustDizzy(rand(3,5))
/datum/artifact_effect/badfeeling/DoEffectAura()
if(holder)
@@ -50,7 +50,7 @@
to_chat(H, "[pick(drastic_messages)]")
if(prob(10))
- H.dizziness += rand(3,5)
+ H.AdjustDizzy(rand(3,5))
return 1
/datum/artifact_effect/badfeeling/DoEffectPulse()
@@ -64,7 +64,7 @@
to_chat(H, "[pick(messages)]")
if(prob(50))
- H.dizziness += rand(3,5)
+ H.AdjustDizzy(rand(3,5))
else if(prob(25))
- H.dizziness += rand(5,15)
+ H.AdjustDizzy(rand(5,15))
return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm
index 08639dec98f..dd42c44204c 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm
@@ -35,7 +35,7 @@
to_chat(H, "[pick(messages)]")
if(prob(50))
- H.dizziness += rand(3,5)
+ H.AdjustDizzy(rand(3,5))
/datum/artifact_effect/goodfeeling/DoEffectAura()
if(holder)
@@ -48,7 +48,7 @@
to_chat(H, "[pick(drastic_messages)]")
if(prob(5))
- H.dizziness += rand(3,5)
+ H.AdjustDizzy(rand(3,5))
return 1
/datum/artifact_effect/goodfeeling/DoEffectPulse()
@@ -62,7 +62,7 @@
to_chat(H, "[pick(messages)]")
if(prob(50))
- H.dizziness += rand(3,5)
+ H.AdjustDizzy(rand(3,5))
else if(prob(25))
- H.dizziness += rand(5,15)
+ H.AdjustDizzy(rand(5,15))
return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm
index bbb16d76a3d..1f098ddfa6b 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm
@@ -13,8 +13,8 @@
if(ishuman(toucher) && prob(weakness * 100))
var/mob/living/carbon/human/H = toucher
to_chat(H, pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired."))
- H.drowsyness = min(H.drowsyness + rand(5,25) * weakness, 50 * weakness)
- H.eye_blurry = min(H.eye_blurry + rand(1,3) * weakness, 50 * weakness)
+ H.AdjustDrowsy(rand(5,25) * weakness, bound_lower = 0, bound_upper = 50 * weakness)
+ H.AdjustEyeBlurry(rand(1,3) * weakness, bound_lower = 0, bound_upper = 50 * weakness)
return 1
else if(isrobot(toucher))
to_chat(toucher, "\red SYSTEM ALERT: CPU cycles slowing down.")
@@ -28,8 +28,8 @@
if(prob(weakness * 100))
if(prob(10))
to_chat(H, pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired."))
- H.drowsyness = min(H.drowsyness + 1 * weakness, 25 * weakness)
- H.eye_blurry = min(H.eye_blurry + 1 * weakness, 25 * weakness)
+ H.AdjustDrowsy(1 * weakness, bound_lower = 0, bound_upper = 25 * weakness)
+ H.AdjustEyeBlurry(1 * weakness, bound_lower = 0, bound_upper = 25 * weakness)
for(var/mob/living/silicon/robot/R in range(src.effectrange,holder))
to_chat(R, "\red SYSTEM ALERT: CPU cycles slowing down.")
return 1
@@ -41,8 +41,8 @@
var/weakness = GetAnomalySusceptibility(H)
if(prob(weakness * 100))
to_chat(H, pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired."))
- H.drowsyness = min(H.drowsyness + rand(5,15) * weakness, 50 * weakness)
- H.eye_blurry = min(H.eye_blurry + rand(5,15) * weakness, 50 * weakness)
+ H.AdjustDrowsy(rand(5,15) * weakness, bound_lower = 0, bound_upper = 50 * weakness)
+ H.AdjustEyeBlurry(rand(5,15) * weakness, bound_lower = 0, bound_upper = 50 * weakness)
for(var/mob/living/silicon/robot/R in range(src.effectrange,holder))
to_chat(R, "\red SYSTEM ALERT: CPU cycles slowing down.")
return 1
diff --git a/code/modules/research/xenoarchaeology/finds/finds_special.dm b/code/modules/research/xenoarchaeology/finds/finds_special.dm
index ce6fb4c2663..8ddcf27593b 100644
--- a/code/modules/research/xenoarchaeology/finds/finds_special.dm
+++ b/code/modules/research/xenoarchaeology/finds/finds_special.dm
@@ -194,7 +194,7 @@
'sound/hallucinations/turn_around1.ogg',\
'sound/hallucinations/turn_around2.ogg',\
), 50, 1, -3)
- M.sleeping = max(M.sleeping,rand(5,10))
+ M.Sleeping(rand(5,10))
src.loc = null
else
processing_objects.Remove(src)
diff --git a/code/modules/security_levels/keycard authentication.dm b/code/modules/security_levels/keycard authentication.dm
index 188bf7597c2..8ff0ed6eb64 100644
--- a/code/modules/security_levels/keycard authentication.dm
+++ b/code/modules/security_levels/keycard authentication.dm
@@ -3,6 +3,7 @@
desc = "This device is used to trigger station functions, which require more than one ID card to authenticate."
icon = 'icons/obj/monitors.dmi'
icon_state = "auth_off"
+
var/active = 0 //This gets set to 1 on all devices except the one where the initial request was made.
var/event = ""
var/screen = 1
@@ -14,25 +15,25 @@
var/mob/event_triggered_by
var/mob/event_confirmed_by
var/ert_reason = "Reason for ERT"
- //1 = select event
- //2 = authenticate
- anchored = 1.0
+
+ anchored = 1
use_power = 1
idle_power_usage = 2
active_power_usage = 6
power_channel = ENVIRON
+
+ req_access = list(access_keycard_auth)
/obj/machinery/keycard_auth/attack_ai(mob/user as mob)
- to_chat(user, "The station AI is not to interact with these devices.")
+ to_chat(user, "The station AI is not to interact with these devices.")
return
/obj/machinery/keycard_auth/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(stat & (NOPOWER|BROKEN))
to_chat(user, "This device is not powered.")
return
- if(istype(W,/obj/item/weapon/card/id))
- var/obj/item/weapon/card/id/ID = W
- if(access_keycard_auth in ID.access)
+ if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))
+ if(check_access(W))
if(active == 1)
//This is not the device that made the initial request. It is the device confirming the request.
if(event_source)
@@ -44,6 +45,8 @@
return
event_triggered_by = usr
broadcast_request() //This is the device making the initial event request. It needs to broadcast to other devices
+ else
+ to_chat(user, "Access denied.")
/obj/machinery/keycard_auth/power_change()
if(powered(ENVIRON))
@@ -51,16 +54,16 @@
icon_state = "auth_off"
else
stat |= NOPOWER
+
+/obj/machinery/keycard_auth/attack_ghost(mob/user)
+ ui_interact(user)
/obj/machinery/keycard_auth/attack_hand(mob/user as mob)
- if(!user.IsAdvancedToolUser())
- return 0
+ if(..())
+ return 1
ui_interact(user)
/obj/machinery/keycard_auth/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- if(user.stat || stat & (NOPOWER|BROKEN))
- to_chat(user, "This device is not powered.")
- return
if(busy)
to_chat(user, "This device is busy.")
return
@@ -74,19 +77,18 @@
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
- ui = new(user, src, ui_key, "keycard_auth.tmpl", "Keycard Authentication Device UI", 520, 320)
+ ui = new(user, src, ui_key, "keycard_auth.tmpl", "Keycard Authentication Device UI", 540, 320)
ui.set_initial_data(data)
ui.open()
/obj/machinery/keycard_auth/Topic(href, href_list)
if(..())
- return
+ return 1
+
if(busy)
to_chat(usr, "This device is busy.")
return
- if(usr.stat || stat & (BROKEN|NOPOWER))
- to_chat(usr, "This device is without power.")
- return
+
if(href_list["triggerevent"])
event = href_list["triggerevent"]
screen = 2
diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm
index 406c1f83083..6c2f7354b43 100644
--- a/code/modules/surgery/face.dm
+++ b/code/modules/surgery/face.dm
@@ -55,7 +55,7 @@
user.visible_message(" [user]'s hand slips, slicing [target]'s throat wth \the [tool]!" , \
" Your hand slips, slicing [target]'s throat wth \the [tool]!" )
affected.createwound(CUT, 60)
- target.losebreath += 4
+ target.AdjustLoseBreath(4)
return 0
@@ -83,7 +83,7 @@
/datum/surgery_step/face/mend_vocal/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
user.visible_message(" [user]'s hand slips, clamping [target]'s trachea shut for a moment with \the [tool]!", \
" Your hand slips, clamping [user]'s trachea shut for a moment with \the [tool]!")
- target.losebreath += 4
+ target.AdjustLoseBreath(4)
return 0
/datum/surgery_step/face/fix_face
diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm
index a0dcd29525f..794bf2a3e9f 100644
--- a/code/modules/surgery/limb_reattach.dm
+++ b/code/modules/surgery/limb_reattach.dm
@@ -162,9 +162,9 @@
var/obj/item/organ/external/head/H = target.get_organ("head")
var/datum/robolimb/robohead = all_robolimbs[H.model]
if(robohead.is_monitor) //Ensures that if an IPC gets a head that's got a human hair wig attached to their body, the hair won't wipe.
- H.h_style = ""
- H.f_style = ""
- target.m_style = ""
+ H.h_style = "Bald"
+ H.f_style = "Shaved"
+ target.m_styles["head"] = "None"
E.status &= ~ORGAN_DESTROYED
if(E.children)
for(var/obj/item/organ/external/C in E.children)
diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm
index 9034393bfe2..f71e9bff0be 100644
--- a/code/modules/surgery/organs/blood.dm
+++ b/code/modules/surgery/organs/blood.dm
@@ -101,7 +101,7 @@
else
adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1))
if(prob(5))
- eye_blurry = max(eye_blurry, 6)
+ EyeBlurry(6)
var/word = pick("dizzy","woozy","faint")
to_chat(src, "You feel very [word].")
if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD)
diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm
index d10fea6b7aa..ce4b55efb11 100644
--- a/code/modules/surgery/organs/organ_external.dm
+++ b/code/modules/surgery/organs/organ_external.dm
@@ -860,11 +860,13 @@ Note that amputating the affected organ does in fact remove the infection from t
/obj/item/organ/external/proc/mutate()
src.status |= ORGAN_MUTATED
- if(owner) owner.update_body()
+ if(owner)
+ owner.update_body(1, 1) //Forces all bodyparts to update in order to correctly render the deformed sprite.
/obj/item/organ/external/proc/unmutate()
src.status &= ~ORGAN_MUTATED
- if(owner) owner.update_body()
+ if(owner)
+ owner.update_body(1, 1) //Forces all bodyparts to update in order to correctly return them to normal.
/obj/item/organ/external/proc/get_damage() //returns total damage
return max(brute_dam + burn_dam - perma_injury, perma_injury) //could use health?
diff --git a/code/modules/surgery/organs/organ_icon.dm b/code/modules/surgery/organs/organ_icon.dm
index 31ef55f4919..272adcad52c 100644
--- a/code/modules/surgery/organs/organ_icon.dm
+++ b/code/modules/surgery/organs/organ_icon.dm
@@ -107,13 +107,14 @@ var/global/list/limb_icon_cache = list()
overlays |= lip_icon
mob_icon.Blend(lip_icon, ICON_OVERLAY)
- if(owner.m_style)
- var/datum/sprite_accessory/marking_style = marking_styles_list[owner.m_style]
- if(marking_style && marking_style.species_allowed && (species.name in marking_style.species_allowed) && marking_style.marking_location == "head")
- var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s")
- if(marking_style.do_colouration)
- markings_s.Blend(rgb(owner.r_markings, owner.g_markings, owner.b_markings), ICON_ADD)
- overlays |= markings_s
+ var/head_marking = owner.m_styles["head"]
+ if(head_marking && head_marking != "None")
+ var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
+ if(head_marking_style && head_marking_style.species_allowed && (species.name in head_marking_style.species_allowed) && head_marking_style.marking_location == "head")
+ var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s")
+ if(head_marking_style.do_colouration)
+ h_marking_s.Blend(owner.m_colours["head"], ICON_ADD)
+ overlays |= h_marking_s
if(ha_style)
var/datum/sprite_accessory/head_accessory_style = head_accessory_styles_list[ha_style]
@@ -158,6 +159,10 @@ var/global/list/limb_icon_cache = list()
gender = "f"
else
gender = "m"
+ if(limb_name == "head")
+ var/obj/item/organ/external/head/head_organ = src
+ head_organ.handle_alt_icon()
+
new_icon_state = "[icon_name][gender ? "_[gender]" : ""]"
if(skeletal)
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index bb408f51726..18f0e51b2e2 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -307,7 +307,7 @@
owner.drip(10)
if(prob(4))
spawn owner.custom_emote(1, "gasps for air!")
- owner.losebreath += 5
+ owner.AdjustLoseBreath(5)
/obj/item/organ/internal/kidneys
name = "kidneys"
@@ -357,10 +357,10 @@
/obj/item/organ/internal/eyes/surgeryize()
if(!owner)
return
- owner.disabilities &= ~NEARSIGHTED
- owner.disabilities &= ~BLIND
- owner.eye_blurry = 0
- owner.eye_blind = 0
+ owner.CureNearsighted()
+ owner.CureBlind()
+ owner.SetEyeBlurry(0)
+ owner.SetEyeBlind(0)
/obj/item/organ/internal/liver
@@ -493,6 +493,7 @@
slot = "brain_tumor"
health = 3
var/organhonked = 0
+ var/suffering_delay = 900
/obj/item/organ/internal/honktumor/New()
..()
@@ -535,11 +536,11 @@
return
if(organhonked < world.time)
- organhonked = world.time+900
+ organhonked = world.time + suffering_delay
to_chat(owner, "HONK")
- owner.sleeping = 0
- owner.stuttering = 20
- owner.adjustEarDamage(0, 30)
+ owner.SetSleeping(0)
+ owner.Stuttering(20)
+ owner.AdjustEarDeaf(30)
owner.Weaken(3)
owner << 'sound/items/AirHorn.ogg'
if(prob(30))
diff --git a/code/modules/surgery/organs/pain.dm b/code/modules/surgery/organs/pain.dm
index 23d2af69bf3..f0b4b912eaf 100644
--- a/code/modules/surgery/organs/pain.dm
+++ b/code/modules/surgery/organs/pain.dm
@@ -15,8 +15,8 @@ mob/living/carbon/proc/pain(var/partname, var/amount, var/force, var/burning = 0
if(world.time < next_pain_time && !force)
return
if(amount > 10 && istype(src,/mob/living/carbon/human))
- if(src:paralysis)
- src:paralysis = max(0, src:paralysis-round(amount/10))
+ if(paralysis)
+ AdjustParalysis(-round(amount/10))
if(amount > 50 && prob(amount / 5))
src:drop_item()
var/msg
@@ -132,4 +132,4 @@ mob/living/carbon/human/proc/handle_pain()
toxDamageMessage = "Your body aches all over, it's driving you mad."
if(toxDamageMessage && prob(toxMessageProb))
- src.custom_pain(toxDamageMessage, getToxLoss() >= 15)
\ No newline at end of file
+ src.custom_pain(toxDamageMessage, getToxLoss() >= 15)
diff --git a/code/modules/surgery/organs/subtypes/diona.dm b/code/modules/surgery/organs/subtypes/diona.dm
index 0f75fe9f80f..a4b0d8fb92b 100644
--- a/code/modules/surgery/organs/subtypes/diona.dm
+++ b/code/modules/surgery/organs/subtypes/diona.dm
@@ -169,10 +169,10 @@
/obj/item/organ/internal/diona_receptor/surgeryize()
if(!owner)
return
- owner.disabilities &= ~NEARSIGHTED
- owner.disabilities &= ~BLIND
- owner.eye_blurry = 0
- owner.eye_blind = 0
+ owner.CureNearsighted()
+ owner.CureBlind()
+ owner.SetEyeBlurry(0)
+ owner.SetEyeBlind(0)
//TODO:Make absorb rads on insert
diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm
index 61b2f143f69..0f402a42e5d 100644
--- a/code/modules/surgery/organs/subtypes/machine.dm
+++ b/code/modules/surgery/organs/subtypes/machine.dm
@@ -142,10 +142,10 @@
/obj/item/organ/internal/optical_sensor/surgeryize()
if(!owner)
return
- owner.disabilities &= ~NEARSIGHTED
- owner.disabilities &= ~BLIND
- owner.eye_blurry = 0
- owner.eye_blind = 0
+ owner.CureNearsighted()
+ owner.CureBlind()
+ owner.SetEyeBlurry(0)
+ owner.SetEyeBlind(0)
// Used for an MMI or posibrain being installed into a human.
diff --git a/code/modules/surgery/organs/subtypes/standard.dm b/code/modules/surgery/organs/subtypes/standard.dm
index 02351f523a8..faa6c403355 100644
--- a/code/modules/surgery/organs/subtypes/standard.dm
+++ b/code/modules/surgery/organs/subtypes/standard.dm
@@ -159,11 +159,15 @@
gendered_icon = 1
encased = "skull"
var/can_intake_reagents = 1
+ var/alt_head = "None"
//Hair colour and style
var/r_hair = 0
var/g_hair = 0
var/b_hair = 0
+ var/r_hair_sec = 0
+ var/g_hair_sec = 0
+ var/b_hair_sec = 0
var/h_style = "Bald"
//Head accessory colour and style
@@ -176,6 +180,9 @@
var/r_facial = 0
var/g_facial = 0
var/b_facial = 0
+ var/r_facial_sec = 0
+ var/g_facial_sec = 0
+ var/b_facial_sec = 0
var/f_style = "Shaved"
/obj/item/organ/external/head/remove()
@@ -197,6 +204,8 @@
if(owner)//runtimer no runtiming
owner.update_hair()
owner.update_fhair()
+ owner.update_head_accessory()
+ owner.update_markings()
. = ..()
/obj/item/organ/external/head/replaced()
@@ -213,6 +222,17 @@
if(burn_dam > 40)
disfigure("burn")
+/obj/item/organ/external/head/proc/handle_alt_icon()
+ if(alt_head && alt_heads_list[alt_head])
+ var/datum/sprite_accessory/alt_heads/alternate_head = alt_heads_list[alt_head]
+ if(alternate_head.icon_state)
+ icon_name = alternate_head.icon_state
+ else //If alternate_head.icon_state doesn't exist, that means alternate_head is "None", so default icon_name back to "head".
+ icon_name = initial(icon_name)
+ else //If alt_head is null, set it to "None" and default icon_name for sanity.
+ alt_head = initial(alt_head)
+ icon_name = initial(icon_name)
+
/obj/item/organ/external/head/set_dna(datum/dna/new_dna)
..()
new_dna.write_head_attributes(src)
diff --git a/html/changelog.html b/html/changelog.html
index 6ab1e019045..2d41f163168 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,47 @@
-->
+
23 October 2016
+
KasparoVy updated:
+
+ - Refactors markings. Now split into head, body and tail markings.
+ - Refactors morph again. Changes made while morphing are now reflected instantly on your sprite.
+ - Darkens Vulpkanin and Tajara for improved colour fidelity. Species base colour changed to compensate. Add 27 to R, G and B values if Vulp, 15 if Taj to keep the same colour on your character.
+ - Darkens Vulpkanin facial fur patterns for improved colour fidelity. Add 23 to the R, G and B values of your facial hair/head accessory to keep the same colour on your character.
+ - Darkens Unathi frills and horns. Add 27 to the R, G and B values of your frills and 21 for horns to keep the same colour on your character.
+ - Vulpkanin tails are now split-rendered. Tails overlap hair when facing north, but are overlapped by hair when facing all other directions. No other differences, only affects the fluffy husky tail.
+ - The heads of tiger markings have been isolated and can now be coloured independently.
+ - Hair can now cover facial hair, and glasses are no longer covered by facial hair and head accessories. Means that two-piece Vulpkanin facial fur patterns won't almost entirely cover whatever glasses they're wearing.
+ - Tajaran head and facial hair have been darkened. Add 28 to the R, G and B values of your Tajara head/facial hair to keep the same colour on your character.
+ - Vulpkanin head hair and one facial hair style has been darkened. Refer to PR notes for darkening factors.
+ - The HAS_MARKINGS flag now represents all marking locations. The HAS_location_MARKINGS flags are for specific locations (head, body, tail).
+ - Improves the quality of some Vulpkanin/Tajara/Unathi mask sprites.
+ - Naked Humans and Skrell will no longer have exposed flesh poking out their wrists when facing east or west. Male Humans now no longer lack a butt pixel when facing east or west.
+ - Mutated limbs now render correctly as soon as they're mutated.
+ - Mobs will now correctly appear as fat/skinny.
+ - Species with TAIL_OVERLAPPED will no longer wag tail at max speed when facing north.
+ - Species with TAIL_OVERLAPPED and body accessories won't crash the game when they wag.
+ - Tiger Head and Face markings adjusted so they don't look ugly on certain species' ears.
+ - Fixes issue where Unathi dorsal stripe didn't render.
+ - Tajaran ears are no longer in their hair sprites, but on their actual heads.
+ - The adminbus body accessory now overrides the TAIL_OVERLAPPED flag and will now be rendered correctly on a body regardless of species bodyflags.
+ - Changing a person's species via CMA will no longer result in a mob with all the same cosmetic attributes as the old species.
+ - Dressers now have species fitting checks for undergarments. Drask are now able to wear undershirts and underwear like they were originally meant to.
+ - Adds some head markings for Tajara and Vulpkanin.
+ - Adds body marking(s) for Tajara, Vulpkanin, Unathi and Drask.
+ - Adds tail markings for Vox and Vulpkanin.
+ - Adds 5 Tajaran hairstyles.
+ - Adds a tweaked version of an existing Vox hairstyle. Shouldn't clip with certain jackets as much.
+ - Adds a hairstyle for Humans, Unathi and Vulpkanin.
+ - Adds a facial hairstyle for Vulpkanin.
+ - Adds secondary hair (head and facial) themes. Skrell can now colour their tentacle cloths independently, the beads in the Tajaran/Hippie braid hairstyles can be coloured and the same with the webbing in Unathi frills. Can be changed at nanomirrors, via morph and CMA.
+ - Adds alternate heads. Unathi can now choose a head with a sharp snout. Can be changed via morph and CMA.
+ - Helper procs to convert a hex colour into either R, G, or B.
+ - Markings, body accessories, head accessories, alt heads and their colours (if they have colours) can now be randomized at the character preferences screen.
+ - Adds a system that attempts to fit mobs with alternate heads with appropriate mask sprites. The sprites just need to be suffixed with the alt_head suffix in sprite_accessories.dm.
+ - Adds mask sprites tweaked to fit the new Unathi alternate head to go along with the new alt. head mask fitting system.
+
+
15 October 2016
Crazylemon64 updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 9dfe354606f..7f682f24250 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -2978,3 +2978,73 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
messages.
- bugfix: Fixed camera monitors immobilizing you if you reconnect while using one.
- bugfix: Fixed selecting datum types through SDQL2 never returning any datums.
+2016-10-23:
+ KasparoVy:
+ - tweak: Refactors markings. Now split into head, body and tail markings.
+ - tweak: Refactors morph again. Changes made while morphing are now reflected instantly
+ on your sprite.
+ - tweak: Darkens Vulpkanin and Tajara for improved colour fidelity. Species base
+ colour changed to compensate. Add 27 to R, G and B values if Vulp, 15 if Taj
+ to keep the same colour on your character.
+ - tweak: Darkens Vulpkanin facial fur patterns for improved colour fidelity. Add
+ 23 to the R, G and B values of your facial hair/head accessory to keep the same
+ colour on your character.
+ - tweak: Darkens Unathi frills and horns. Add 27 to the R, G and B values of your
+ frills and 21 for horns to keep the same colour on your character.
+ - tweak: Vulpkanin tails are now split-rendered. Tails overlap hair when facing
+ north, but are overlapped by hair when facing all other directions. No other
+ differences, only affects the fluffy husky tail.
+ - tweak: The heads of tiger markings have been isolated and can now be coloured
+ independently.
+ - tweak: Hair can now cover facial hair, and glasses are no longer covered by facial
+ hair and head accessories. Means that two-piece Vulpkanin facial fur patterns
+ won't almost entirely cover whatever glasses they're wearing.
+ - tweak: Tajaran head and facial hair have been darkened. Add 28 to the R, G and
+ B values of your Tajara head/facial hair to keep the same colour on your character.
+ - tweak: Vulpkanin head hair and one facial hair style has been darkened. Refer
+ to PR notes for darkening factors.
+ - tweak: The HAS_MARKINGS flag now represents all marking locations. The HAS_location_MARKINGS
+ flags are for specific locations (head, body, tail).
+ - tweak: Improves the quality of some Vulpkanin/Tajara/Unathi mask sprites.
+ - bugfix: Naked Humans and Skrell will no longer have exposed flesh poking out their
+ wrists when facing east or west. Male Humans now no longer lack a butt pixel
+ when facing east or west.
+ - bugfix: Mutated limbs now render correctly as soon as they're mutated.
+ - bugfix: Mobs will now correctly appear as fat/skinny.
+ - bugfix: Species with TAIL_OVERLAPPED will no longer wag tail at max speed when
+ facing north.
+ - bugfix: Species with TAIL_OVERLAPPED and body accessories won't crash the game
+ when they wag.
+ - bugfix: Tiger Head and Face markings adjusted so they don't look ugly on certain
+ species' ears.
+ - bugfix: Fixes issue where Unathi dorsal stripe didn't render.
+ - bugfix: Tajaran ears are no longer in their hair sprites, but on their actual
+ heads.
+ - bugfix: The adminbus body accessory now overrides the TAIL_OVERLAPPED flag and
+ will now be rendered correctly on a body regardless of species bodyflags.
+ - bugfix: Changing a person's species via CMA will no longer result in a mob with
+ all the same cosmetic attributes as the old species.
+ - bugfix: Dressers now have species fitting checks for undergarments. Drask are
+ now able to wear undershirts and underwear like they were originally meant to.
+ - rscadd: Adds some head markings for Tajara and Vulpkanin.
+ - rscadd: Adds body marking(s) for Tajara, Vulpkanin, Unathi and Drask.
+ - rscadd: Adds tail markings for Vox and Vulpkanin.
+ - rscadd: Adds 5 Tajaran hairstyles.
+ - rscadd: Adds a tweaked version of an existing Vox hairstyle. Shouldn't clip with
+ certain jackets as much.
+ - rscadd: Adds a hairstyle for Humans, Unathi and Vulpkanin.
+ - rscadd: Adds a facial hairstyle for Vulpkanin.
+ - rscadd: Adds secondary hair (head and facial) themes. Skrell can now colour their
+ tentacle cloths independently, the beads in the Tajaran/Hippie braid hairstyles
+ can be coloured and the same with the webbing in Unathi frills. Can be changed
+ at nanomirrors, via morph and CMA.
+ - rscadd: Adds alternate heads. Unathi can now choose a head with a sharp snout.
+ Can be changed via morph and CMA.
+ - rscadd: Helper procs to convert a hex colour into either R, G, or B.
+ - rscadd: Markings, body accessories, head accessories, alt heads and their colours
+ (if they have colours) can now be randomized at the character preferences screen.
+ - rscadd: Adds a system that attempts to fit mobs with alternate heads with appropriate
+ mask sprites. The sprites just need to be suffixed with the alt_head suffix
+ in sprite_accessories.dm.
+ - imageadd: Adds mask sprites tweaked to fit the new Unathi alternate head to go
+ along with the new alt. head mask fitting system.
diff --git a/html/changelogs/AutoChangeLog-pr-5601.yml b/html/changelogs/AutoChangeLog-pr-5601.yml
new file mode 100644
index 00000000000..cd74a767312
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5601.yml
@@ -0,0 +1,4 @@
+author: Crazylemon
+delete-after: True
+changes:
+ - tweak: "Status effects should work a little more consistently now"
diff --git a/html/changelogs/AutoChangeLog-pr-5811.yml b/html/changelogs/AutoChangeLog-pr-5811.yml
new file mode 100644
index 00000000000..33d9eb32a8b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5811.yml
@@ -0,0 +1,7 @@
+author: KasparoVy
+delete-after: True
+changes:
+ - bugfix: "Fixes a bug where changing your alt head required two icon updates to show."
+ - bugfix: "Fixes a bug where you couldn't choose head marking styles that would ordinarily be available regardless of your alt head."
+ - bugfix: "Fixes a bug where Tajara couldn't choose undergarments."
+ - bugfix: "Resolves an issue with the Vulpkanin Jagged hairstyle missing a pixel."
diff --git a/html/changelogs/AutoChangeLog-pr-5826.yml b/html/changelogs/AutoChangeLog-pr-5826.yml
new file mode 100644
index 00000000000..62bc989c620
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5826.yml
@@ -0,0 +1,4 @@
+author: Twinmold93
+delete-after: True
+changes:
+ - bugfix: "Fixes a runtime issue caused by using the detective's scanner on the space hotel cleaver."
diff --git a/icons/effects/species.dmi b/icons/effects/species.dmi
index ee3da07c3c5..87c047f397a 100644
Binary files a/icons/effects/species.dmi and b/icons/effects/species.dmi differ
diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi
index c45bd957a1a..6e94d89854d 100644
Binary files a/icons/mob/body_accessory.dmi and b/icons/mob/body_accessory.dmi differ
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
index ad4f2d137a6..02bbf79ad76 100644
Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index 79df46605a2..bf6507c412c 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/human_races/r_def_human.dmi b/icons/mob/human_races/r_def_human.dmi
index 9d6af67be61..92ee97b4aba 100644
Binary files a/icons/mob/human_races/r_def_human.dmi and b/icons/mob/human_races/r_def_human.dmi differ
diff --git a/icons/mob/human_races/r_def_lizard.dmi b/icons/mob/human_races/r_def_lizard.dmi
index 3926ca17092..e1c40712b23 100644
Binary files a/icons/mob/human_races/r_def_lizard.dmi and b/icons/mob/human_races/r_def_lizard.dmi differ
diff --git a/icons/mob/human_races/r_def_tajaran.dmi b/icons/mob/human_races/r_def_tajaran.dmi
index 1e7da69c495..e62f4228fc6 100644
Binary files a/icons/mob/human_races/r_def_tajaran.dmi and b/icons/mob/human_races/r_def_tajaran.dmi differ
diff --git a/icons/mob/human_races/r_grey.dmi b/icons/mob/human_races/r_grey.dmi
index d270ab83934..4f603380545 100644
Binary files a/icons/mob/human_races/r_grey.dmi and b/icons/mob/human_races/r_grey.dmi differ
diff --git a/icons/mob/human_races/r_human.dmi b/icons/mob/human_races/r_human.dmi
index 0aa7295b8d3..0cbbde7fb3a 100644
Binary files a/icons/mob/human_races/r_human.dmi and b/icons/mob/human_races/r_human.dmi differ
diff --git a/icons/mob/human_races/r_lizard.dmi b/icons/mob/human_races/r_lizard.dmi
index 457e50b204e..d60ae4979df 100644
Binary files a/icons/mob/human_races/r_lizard.dmi and b/icons/mob/human_races/r_lizard.dmi differ
diff --git a/icons/mob/human_races/r_skrell.dmi b/icons/mob/human_races/r_skrell.dmi
index f1c4966dc51..586714c7da8 100644
Binary files a/icons/mob/human_races/r_skrell.dmi and b/icons/mob/human_races/r_skrell.dmi differ
diff --git a/icons/mob/human_races/r_tajaran.dmi b/icons/mob/human_races/r_tajaran.dmi
index c287ef822f3..3f45032951d 100644
Binary files a/icons/mob/human_races/r_tajaran.dmi and b/icons/mob/human_races/r_tajaran.dmi differ
diff --git a/icons/mob/human_races/r_vulpkanin.dmi b/icons/mob/human_races/r_vulpkanin.dmi
index 0f1b6956c10..3bcdb3539b7 100644
Binary files a/icons/mob/human_races/r_vulpkanin.dmi and b/icons/mob/human_races/r_vulpkanin.dmi differ
diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi
index 3fe35fe7651..9aed5172330 100644
Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ
diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi
index 590945e9e15..c0c5dbd8678 100644
Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ
diff --git a/icons/mob/species/tajaran/mask.dmi b/icons/mob/species/tajaran/mask.dmi
index ea17113a2fc..9217fb7730c 100644
Binary files a/icons/mob/species/tajaran/mask.dmi and b/icons/mob/species/tajaran/mask.dmi differ
diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi
index 4ad3b228849..46b11152ba7 100644
Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ
diff --git a/icons/mob/species/unathi/mask.dmi b/icons/mob/species/unathi/mask.dmi
index a211a035012..e0571e592db 100644
Binary files a/icons/mob/species/unathi/mask.dmi and b/icons/mob/species/unathi/mask.dmi differ
diff --git a/icons/mob/species/vox/mask.dmi b/icons/mob/species/vox/mask.dmi
index b39ee5577a6..93dacb8f058 100644
Binary files a/icons/mob/species/vox/mask.dmi and b/icons/mob/species/vox/mask.dmi differ
diff --git a/icons/mob/species/vulpkanin/mask.dmi b/icons/mob/species/vulpkanin/mask.dmi
index f0353c1766d..14a70e1bb4c 100644
Binary files a/icons/mob/species/vulpkanin/mask.dmi and b/icons/mob/species/vulpkanin/mask.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index 95a1a902aa0..568fcce4443 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/atmospherics/circulator.dmi b/icons/obj/atmospherics/circulator.dmi
new file mode 100644
index 00000000000..45f7a626ef6
Binary files /dev/null and b/icons/obj/atmospherics/circulator.dmi differ
diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi
index a555009ae6a..5a198ee1e64 100644
Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ
diff --git a/icons/obj/pipe-item.dmi b/icons/obj/pipe-item.dmi
index 34fedaa560f..73d62edfaa8 100644
Binary files a/icons/obj/pipe-item.dmi and b/icons/obj/pipe-item.dmi differ
diff --git a/icons/obj/pipes.dmi b/icons/obj/pipes.dmi
index 45f79d9e66b..99e6e84d185 100644
Binary files a/icons/obj/pipes.dmi and b/icons/obj/pipes.dmi differ
diff --git a/nano/templates/appearance_changer.tmpl b/nano/templates/appearance_changer.tmpl
index 886076f21d2..47a3ce113e2 100644
--- a/nano/templates/appearance_changer.tmpl
+++ b/nano/templates/appearance_changer.tmpl
@@ -23,7 +23,7 @@
{{/if}}
-{{if data.change_eye_color || data.change_skin_tone || data.change_skin_color || data.change_head_accessory_color || data.change_hair_color || data.change_facial_hair_color || data.change_marking_color}}
+{{if data.change_eye_color || data.change_skin_tone || data.change_skin_color || data.change_head_accessory_color || data.change_hair_color || data.change_facial_hair_color || data.change_head_marking_color || data.change_body_marking_color || data.change_tail_marking_color}}
Colors:
@@ -44,11 +44,23 @@
{{if data.change_hair_color}}
{{:helper.link('Change hair color', null, { 'hair_color' : 1})}}
{{/if}}
+ {{if data.change_secondary_hair_color}}
+ {{:helper.link('Change secondary hair color', null, { 'secondary_hair_color' : 1})}}
+ {{/if}}
{{if data.change_facial_hair_color}}
{{:helper.link('Change facial hair color', null, { 'facial_hair_color' : 1})}}
{{/if}}
- {{if data.change_marking_color}}
- {{:helper.link('Change marking color', null, { 'marking_color' : 1})}}
+ {{if data.change_secondary_facial_hair_color}}
+ {{:helper.link('Change secondary facial hair color', null, { 'secondary_facial_hair_color' : 1})}}
+ {{/if}}
+ {{if data.change_head_marking_color}}
+ {{:helper.link('Change head marking color', null, { 'head_marking_color' : 1})}}
+ {{/if}}
+ {{if data.change_body_marking_color}}
+ {{:helper.link('Change body marking color', null, { 'body_marking_color' : 1})}}
+ {{/if}}
+ {{if data.change_tail_marking_color}}
+ {{:helper.link('Change tail marking color', null, { 'tail_marking_color' : 1})}}
{{/if}}
@@ -93,14 +105,40 @@
{{/if}}
-{{if data.change_markings}}
+{{if data.change_head_markings}}
- Marking styles:
+ Head Marking styles:
- {{for data.marking_styles}}
- {{:helper.link(value.markingstyle, null, { 'marking' : value.markingstyle}, null, data.marking_style == value.markingstyle ? 'selected' : null)}}
+ {{for data.head_marking_styles}}
+ {{:helper.link(value.headmarkingstyle, null, { 'head_marking' : value.headmarkingstyle}, null, data.head_marking_style == value.headmarkingstyle ? 'selected' : null)}}
+ {{/for}}
+
+
+{{/if}}
+
+{{if data.change_body_markings}}
+
+
+ Body Marking styles:
+
+
+ {{for data.body_marking_styles}}
+ {{:helper.link(value.bodymarkingstyle, null, { 'body_marking' : value.bodymarkingstyle}, null, data.body_marking_style == value.bodymarkingstyle ? 'selected' : null)}}
+ {{/for}}
+
+
+{{/if}}
+
+{{if data.change_tail_markings}}
+
+
+ Tail Marking styles:
+
+
+ {{for data.tail_marking_styles}}
+ {{:helper.link(value.tailmarkingstyle, null, { 'tail_marking' : value.tailmarkingstyle}, null, data.tail_marking_style == value.tailmarkingstyle ? 'selected' : null)}}
{{/for}}
@@ -118,3 +156,16 @@
{{/if}}
+
+{{if data.change_alt_head}}
+
+
+ Alternate Heads:
+
+
+ {{for data.alt_head_styles}}
+ {{:helper.link(value.altheadstyle, null, { 'alt_head' : value.altheadstyle}, null, data.alt_head_style == value.altheadstyle ? 'selected' : null)}}
+ {{/for}}
+
+
+{{/if}}
diff --git a/nano/templates/chem_dispenser.tmpl b/nano/templates/chem_dispenser.tmpl
index cec3028652e..f8988e35e43 100644
--- a/nano/templates/chem_dispenser.tmpl
+++ b/nano/templates/chem_dispenser.tmpl
@@ -78,24 +78,12 @@ Used In File(s): \code\modules\reagents\Chemistry-Machinery.dm
{{empty}}
-
- {{if data.glass}}
- Glass
- {{else}}
- Beaker
- {{/if}}
- is empty
+ {{if data.glass}}Glass{{else}}Beaker{{/if}} is empty
{{/for}}
{{else}}
- No
- {{if data.glass}}
- Glass
- {{else}}
- Beaker
- {{/if}}
- loaded
+ No {{if data.glass}}Glass{{else}}Beaker{{/if}} loaded
{{/if}}
diff --git a/nano/templates/disposal_bin.tmpl b/nano/templates/disposal_bin.tmpl
index c68389a95cb..d211b3fbb17 100644
--- a/nano/templates/disposal_bin.tmpl
+++ b/nano/templates/disposal_bin.tmpl
@@ -31,6 +31,13 @@ Used In File(s): \code\modules\recycling\disposal.dm
{{:helper.link('On', 'gear', {'pump' : 1}, data.mode > 0 ? 'selected' : '')}}
{{:helper.link('Off', 'gear', {'pump' : 0}, data.mode <= 0 ? 'selected' : '')}}
+
+
+
+
+ Pump Status:
+
+
{{:data.pumpstatus}}
diff --git a/nano/templates/keycard_auth.tmpl b/nano/templates/keycard_auth.tmpl
index 7f8f24b80eb..af58b061a9f 100644
--- a/nano/templates/keycard_auth.tmpl
+++ b/nano/templates/keycard_auth.tmpl
@@ -29,7 +29,7 @@ Used In File(s): \code\modules\security_levels\keycard_authentication.dm
{{/if}}
-
+ Please swipe your card to authorize the following event:
{{:data.event}}
{{:helper.link('Back', 'close', { 'reset' : 1 })}}
{{/if}}
diff --git a/paradise.dme b/paradise.dme
index 17f48fd9dba..ad5db876321 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1434,9 +1434,11 @@
#include "code\modules\mob\mob_movement.dm"
#include "code\modules\mob\mob_transformation_simple.dm"
#include "code\modules\mob\say.dm"
+#include "code\modules\mob\status_procs.dm"
#include "code\modules\mob\transform_procs.dm"
#include "code\modules\mob\typing_indicator.dm"
#include "code\modules\mob\update_icons.dm"
+#include "code\modules\mob\update_status.dm"
#include "code\modules\mob\camera\camera.dm"
#include "code\modules\mob\dead\death.dm"
#include "code\modules\mob\dead\observer\login.dm"
@@ -1455,6 +1457,9 @@
#include "code\modules\mob\living\login.dm"
#include "code\modules\mob\living\logout.dm"
#include "code\modules\mob\living\say.dm"
+#include "code\modules\mob\living\stat_states.dm"
+#include "code\modules\mob\living\status_procs.dm"
+#include "code\modules\mob\living\update_status.dm"
#include "code\modules\mob\living\carbon\_defines.dm"
#include "code\modules\mob\living\carbon\carbon.dm"
#include "code\modules\mob\living\carbon\carbon_defenses.dm"
@@ -1465,6 +1470,7 @@
#include "code\modules\mob\living\carbon\shock.dm"
#include "code\modules\mob\living\carbon\superheroes.dm"
#include "code\modules\mob\living\carbon\update_icons.dm"
+#include "code\modules\mob\living\carbon\update_status.dm"
#include "code\modules\mob\living\carbon\alien\alien.dm"
#include "code\modules\mob\living\carbon\alien\alien_defenses.dm"
#include "code\modules\mob\living\carbon\alien\death.dm"
@@ -1501,6 +1507,7 @@
#include "code\modules\mob\living\carbon\brain\MMI.dm"
#include "code\modules\mob\living\carbon\brain\posibrain.dm"
#include "code\modules\mob\living\carbon\brain\say.dm"
+#include "code\modules\mob\living\carbon\brain\update_status.dm"
#include "code\modules\mob\living\carbon\human\appearance.dm"
#include "code\modules\mob\living\carbon\human\body_accessories.dm"
#include "code\modules\mob\living\carbon\human\death.dm"
@@ -1558,6 +1565,7 @@
#include "code\modules\mob\living\silicon\ai\login.dm"
#include "code\modules\mob\living\silicon\ai\logout.dm"
#include "code\modules\mob\living\silicon\ai\say.dm"
+#include "code\modules\mob\living\silicon\ai\update_status.dm"
#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm"
#include "code\modules\mob\living\silicon\ai\freelook\chunk.dm"
#include "code\modules\mob\living\silicon\ai\freelook\eye.dm"
@@ -1574,6 +1582,7 @@
#include "code\modules\mob\living\silicon\pai\say.dm"
#include "code\modules\mob\living\silicon\pai\software.dm"
#include "code\modules\mob\living\silicon\pai\software_modules.dm"
+#include "code\modules\mob\living\silicon\pai\update_status.dm"
#include "code\modules\mob\living\silicon\robot\component.dm"
#include "code\modules\mob\living\silicon\robot\death.dm"
#include "code\modules\mob\living\silicon\robot\emote.dm"
@@ -1588,6 +1597,7 @@
#include "code\modules\mob\living\silicon\robot\robot_items.dm"
#include "code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
+#include "code\modules\mob\living\silicon\robot\update_status.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_console.dm"
@@ -1595,6 +1605,7 @@
#include "code\modules\mob\living\silicon\robot\drone\drone_items.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_say.dm"
+#include "code\modules\mob\living\silicon\robot\drone\update_status.dm"
#include "code\modules\mob\living\simple_animal\constructs.dm"
#include "code\modules\mob\living\simple_animal\corpse.dm"
#include "code\modules\mob\living\simple_animal\parrot.dm"
@@ -1737,7 +1748,6 @@
#include "code\modules\power\cell.dm"
#include "code\modules\power\engine.dm"
#include "code\modules\power\generator.dm"
-#include "code\modules\power\generator_type2.dm"
#include "code\modules\power\gravitygenerator.dm"
#include "code\modules\power\lighting.dm"
#include "code\modules\power\port_gen.dm"