From ab032b6737a62a6dcf6cd259c1bd47b5fc7fc061 Mon Sep 17 00:00:00 2001 From: tigercat2000 Date: Thu, 25 Oct 2018 01:07:27 -0700 Subject: [PATCH 01/13] SSoverlays for human icons, mostly works Closer to working 100% But legitimately /tg/ icons Move lighting to it's own plane, fix observers Fix humans layering over other objects incorrectly Nyaaaaa~ --- code/__DEFINES/misc.dm | 70 +- code/__DEFINES/mobs.dm | 1 + code/game/dna/genes/disabilities.dm | 2 +- .../gamemodes/changeling/powers/revive.dm | 3 +- .../gamemodes/changeling/powers/shriek.dm | 2 +- code/game/gamemodes/vampire/vampire_powers.dm | 2 +- code/game/gamemodes/wizard/artefact.dm | 2 +- code/game/mecha/equipment/weapons/weapons.dm | 2 +- .../game/objects/items/weapons/clown_items.dm | 2 +- .../items/weapons/grenades/flashbang.dm | 23 +- code/modules/admin/verbs/freeze.dm | 10 +- code/modules/client/preference/preferences.dm | 18 +- code/modules/clothing/ears/ears.dm | 1 + code/modules/lighting/lighting_overlay.dm | 1 + code/modules/mob/dead/observer/observer.dm | 3 +- code/modules/mob/living/carbon/alien/alien.dm | 1 + .../living/carbon/alien/humanoid/humanoid.dm | 7 +- .../mob/living/carbon/alien/humanoid/life.dm | 8 - .../mob/living/carbon/alien/larva/larva.dm | 6 +- .../mob/living/carbon/alien/larva/life.dm | 8 - code/modules/mob/living/carbon/brain/brain.dm | 7 +- .../mob/living/carbon/brain/brain_item.dm | 6 - code/modules/mob/living/carbon/human/human.dm | 12 +- code/modules/mob/living/carbon/human/life.dm | 14 - .../living/carbon/human/species/_species.dm | 13 +- .../mob/living/carbon/human/species/human.dm | 9 +- .../mob/living/carbon/human/update_icons.dm | 668 ++++++++---------- code/modules/mob/living/carbon/slime/life.dm | 7 - code/modules/mob/living/carbon/slime/slime.dm | 5 +- .../mob/living/carbon/update_status.dm | 6 + code/modules/mob/living/life.dm | 9 - code/modules/mob/living/living.dm | 3 +- code/modules/mob/living/silicon/silicon.dm | 8 +- .../mob/living/simple_animal/simple_animal.dm | 8 +- code/modules/mob/living/status_procs.dm | 30 - code/modules/mob/living/update_status.dm | 6 +- .../mob/new_player/sprite_accessories.dm | 44 +- code/modules/mob/status_procs.dm | 14 +- code/modules/mob/update_status.dm | 2 +- .../reagents/chemistry/reagents/medicine.dm | 16 +- .../chemistry/recipes/pyrotechnics.dm | 47 +- code/modules/surgery/organs/ears.dm | 76 ++ code/modules/surgery/organs/organ_internal.dm | 7 +- code/modules/surgery/organs/vocal_cords.dm | 2 +- icons/obj/surgery.dmi | Bin 36413 -> 37002 bytes paradise.dme | 1 + 46 files changed, 581 insertions(+), 611 deletions(-) create mode 100644 code/modules/surgery/organs/ears.dm diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 1f0768ba9b0..d87150ad2de 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -204,40 +204,44 @@ #define MFOAM_IRON 2 //Human Overlays Indexes///////// -#define MUTANTRACE_LAYER 1 -#define TAIL_UNDERLIMBS_LAYER 2 //Tail split-rendering. -#define LIMBS_LAYER 3 -#define MARKINGS_LAYER 4 -#define UNDERWEAR_LAYER 5 -#define MUTATIONS_LAYER 6 -#define H_DAMAGE_LAYER 7 -#define UNIFORM_LAYER 8 -#define ID_LAYER 9 -#define SHOES_LAYER 10 -#define GLOVES_LAYER 11 -#define EARS_LAYER 12 -#define SUIT_LAYER 13 -#define BELT_LAYER 14 //Possible make this an overlay of somethign required to wear a belt? -#define SUIT_STORE_LAYER 15 -#define BACK_LAYER 16 -#define HEAD_ACCESSORY_LAYER 17 +#define BODY_LAYER 37 +#define MUTANTRACE_LAYER 36 +#define TAIL_UNDERLIMBS_LAYER 35 //Tail split-rendering. +#define LIMBS_LAYER 34 +#define INTORGAN_LAYER 33 +#define MARKINGS_LAYER 32 +#define UNDERWEAR_LAYER 31 +#define MUTATIONS_LAYER 30 +#define H_DAMAGE_LAYER 29 +#define UNIFORM_LAYER 28 +#define ID_LAYER 27 +#define SHOES_LAYER 26 +#define GLOVES_LAYER 25 +#define EARS_LAYER 24 +#define SUIT_LAYER 23 +#define BELT_LAYER 22 //Possible make this an overlay of somethign required to wear a belt? +#define SUIT_STORE_LAYER 21 +#define BACK_LAYER 20 +#define HEAD_ACCESSORY_LAYER 19 #define FHAIR_LAYER 18 -#define GLASSES_LAYER 19 -#define HAIR_LAYER 20 //TODO: make part of head layer? -#define HEAD_ACC_OVER_LAYER 21 //Select-layer rendering. -#define FHAIR_OVER_LAYER 22 //Select-layer rendering. -#define GLASSES_OVER_LAYER 23 //Select-layer rendering. -#define TAIL_LAYER 24 //bs12 specific. this hack is probably gonna come back to haunt me -#define FACEMASK_LAYER 25 -#define HEAD_LAYER 26 -#define COLLAR_LAYER 27 -#define HANDCUFF_LAYER 28 -#define LEGCUFF_LAYER 29 -#define L_HAND_LAYER 30 -#define R_HAND_LAYER 31 -#define TARGETED_LAYER 32 //BS12: Layer for the target overlay from weapon targeting system -#define FIRE_LAYER 33 //If you're on fire -#define TOTAL_LAYERS 33 +#define GLASSES_LAYER 17 +#define HAIR_LAYER 16 //TODO: make part of head layer? +#define HEAD_ACC_OVER_LAYER 15 //Select-layer rendering. +#define FHAIR_OVER_LAYER 14 //Select-layer rendering. +#define GLASSES_OVER_LAYER 13 //Select-layer rendering. +#define TAIL_LAYER 12 //bs12 specific. this hack is probably gonna come back to haunt me +#define FACEMASK_LAYER 11 +#define HEAD_LAYER 10 +#define COLLAR_LAYER 9 +#define HANDCUFF_LAYER 8 +#define LEGCUFF_LAYER 7 +#define L_HAND_LAYER 6 +#define R_HAND_LAYER 5 +#define TARGETED_LAYER 4 //BS12: Layer for the target overlay from weapon targeting system +#define FIRE_LAYER 3 //If you're on fire +#define MISC_LAYER 2 +#define FROZEN_LAYER 1 +#define TOTAL_LAYERS 37 ///Access Region Codes/// #define REGION_ALL 0 diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 580cb85d696..139b029f55e 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -143,6 +143,7 @@ #define STATUS_UPDATE_NONE 0 #define STATUS_UPDATE_ALL (~0) +#define UNHEALING_EAR_DAMAGE 100 //Human sub-species #define isshadowling(A) (is_species(A, /datum/species/shadow/ling)) diff --git a/code/game/dna/genes/disabilities.dm b/code/game/dna/genes/disabilities.dm index b346a3fecd9..2f6bf234de2 100644 --- a/code/game/dna/genes/disabilities.dm +++ b/code/game/dna/genes/disabilities.dm @@ -147,7 +147,7 @@ /datum/dna/gene/disability/deaf/activate(var/mob/M, var/connected, var/flags) ..() - M.EarDeaf(1) + M.MinimumDeafTicks(1) /datum/dna/gene/disability/nearsighted name="Nearsightedness" diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 9993388afec..147fdd2d327 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -16,8 +16,7 @@ user.radiation = 0 user.SetEyeBlind(0, FALSE) user.SetEyeBlurry(0, FALSE) - user.SetEarDamage(0) - user.SetEarDeaf(0) + user.RestoreEars() user.heal_overall_damage(user.getBruteLoss(), user.getFireLoss(), updating_health = FALSE) user.CureBlind(FALSE) user.CureDeaf() diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm index 5185b61e508..1c60013fbb8 100644 --- a/code/game/gamemodes/changeling/powers/shriek.dm +++ b/code/game/gamemodes/changeling/powers/shriek.dm @@ -11,7 +11,7 @@ for(var/mob/living/M in get_mobs_in_view(4, user)) if(iscarbon(M)) if(!M.mind || !M.mind.changeling) - M.AdjustEarDeaf(30) + M.MinimumDeafTicks(30) M.AdjustConfused(20) M.Jitter(50) else diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index 6d82f6c48e1..c45da8ac279 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -265,7 +265,7 @@ continue to_chat(C, "You hear a ear piercing shriek and your senses dull!") C.Weaken(4) - C.AdjustEarDeaf(20) + C.MinimumDeafTicks(20) C.Stuttering(20) C.Stun(4) C.Jitter(150) diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 4c0aaac77da..18aba4ca69f 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -785,7 +785,7 @@ var/global/list/multiverse = list() else if(istype(I,/obj/item/bikehorn)) to_chat(target, "HONK") target << 'sound/items/AirHorn.ogg' - target.AdjustEarDeaf(3) + target.MinimumDeafTicks(3) GiveHint(target) cooldown = world.time +cooldown_time return diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 6d83b8fa927..011b2c6fab8 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -212,7 +212,7 @@ to_chat(M, "HONK") M.SetSleeping(0) M.Stuttering(20) - M.AdjustEarDeaf(30) + M.MinimumDeafTicks(30) M.Weaken(3) if(prob(30)) M.Stun(10) diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index 895c2809cca..165a61baa75 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -68,6 +68,6 @@ for(M in ohearers(7, T)) if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M - if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs) || H.ear_deaf) + if(!H.can_hear()) continue M.emote("flip") diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 3e9336fc5a7..884265ec55b 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -59,13 +59,16 @@ if(!ear_safety) M.Stun(max(10/distance, 3)) M.Weaken(max(10/distance, 3)) - M.EarDeaf(15) - M.AdjustEarDamage(rand(0, 5)) - if(M.ear_damage >= 15) - to_chat(M, "Your ears start to ring badly!") - if(prob(M.ear_damage - 5)) - to_chat(M, "You can't hear anything!") - M.BecomeDeaf() - else - if(M.ear_damage >= 5) - to_chat(M, "Your ears start to ring!") + M.AdjustEarDamage(rand(0, 5), 15) + if(iscarbon(M)) + var/mob/living/carbon/C = M + var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears) + if(istype(ears)) + if(ears.ear_damage >= 15) + to_chat(M, "Your ears start to ring badly!") + if(prob(ears.ear_damage - 5)) + to_chat(M, "You can't hear anything!") + M.BecomeDeaf() + else + if(ears.ear_damage >= 5) + to_chat(M, "Your ears start to ring!") diff --git a/code/modules/admin/verbs/freeze.dm b/code/modules/admin/verbs/freeze.dm index 8dc852e9221..de91530eabe 100644 --- a/code/modules/admin/verbs/freeze.dm +++ b/code/modules/admin/verbs/freeze.dm @@ -26,14 +26,15 @@ var/global/list/frozen_mob_list = list() /mob/living/var/frozen = null //used for preventing attacks on admin-frozen mobs /mob/living/var/admin_prev_sleeping = 0 //used for keeping track of previous sleeping value with admin freeze -/mob/living/proc/admin_Freeze(var/client/admin) +/mob/living/proc/admin_Freeze(var/client/admin, skip_overlays = FALSE) if(istype(admin)) to_chat(src, "You have been frozen by [key_name(admin)]") message_admins("[key_name_admin(admin)] froze [key_name_admin(src)]") log_admin("[key_name(admin)] froze [key_name(src)]") var/obj/effect/overlay/adminoverlay/AO = new - src.overlays += AO + if(skip_overlays) + src.overlays += AO anchored = 1 frozen = AO @@ -42,14 +43,15 @@ var/global/list/frozen_mob_list = list() if(!(src in frozen_mob_list)) frozen_mob_list += src -/mob/living/proc/admin_unFreeze(var/client/admin) +/mob/living/proc/admin_unFreeze(var/client/admin, skip_overlays = FALSE) if(istype(admin)) to_chat(src, "You have been unfrozen by [key_name(admin)]") message_admins("[key_name_admin(admin)] unfroze [key_name_admin(src)]") log_admin("[key_name(admin)] unfroze [key_name(src)]") anchored = 0 - overlays -= frozen + if(skip_overlays) + overlays -= frozen frozen = null SetSleeping(admin_prev_sleeping) admin_prev_sleeping = null diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index e0ab0087b97..9d13b58d3e3 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -1195,18 +1195,18 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("age") age = rand(AGE_MIN, AGE_MAX) if("hair") - if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) + if(species in list("Human", "Felinid", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) h_colour = rand_hex_color() if("secondary_hair") - if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) + if(species in list("Human", "Felinid", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) h_sec_colour = rand_hex_color() if("h_style") h_style = random_hair_style(gender, species, robohead) if("facial") - if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) + if(species in list("Human", "Felinid", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) f_colour = rand_hex_color() if("secondary_facial") - if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) + if(species in list("Human", "Felinid", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) f_sec_colour = rand_hex_color() if("f_style") f_style = random_facial_hair_style(gender, species, robohead) @@ -1276,7 +1276,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(new_age) age = max(min(round(text2num(new_age)), AGE_MAX),AGE_MIN) if("species") - var/list/new_species = list("Human", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin") + var/list/new_species = list("Human", "Felinid", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin") var/prev_species = species // var/whitelisted = 0 @@ -1407,14 +1407,14 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts b_type = new_b_type if("hair") - if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) //Species that have hair. (No HAS_HAIR flag) + if(species in list("Human", "Felinid", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) //Species that have hair. (No HAS_HAIR flag) var/input = "Choose your character's hair colour:" var/new_hair = input(user, input, "Character Preference", h_colour) as color|null if(new_hair) h_colour = new_hair if("secondary_hair") - if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) + if(species in list("Human", "Felinid", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) var/datum/sprite_accessory/hair_style = GLOB.hair_styles_public_list[h_style] if(hair_style.secondary_theme && !hair_style.no_sec_colour) var/new_hair = input(user, "Choose your character's secondary hair colour:", "Character Preference", h_sec_colour) as color|null @@ -1609,13 +1609,13 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts body_accessory = (new_body_accessory == "None") ? null : new_body_accessory if("facial") - if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) //Species that have facial hair. (No HAS_HAIR_FACIAL flag) + if(species in list("Human", "Felinid", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) //Species that have facial hair. (No HAS_HAIR_FACIAL flag) var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", f_colour) as color|null if(new_facial) f_colour = new_facial if("secondary_facial") - if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) + if(species in list("Human", "Felinid", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) var/datum/sprite_accessory/facial_hair_style = GLOB.facial_hair_styles_list[f_style] if(facial_hair_style.secondary_theme && !facial_hair_style.no_sec_colour) var/new_facial = input(user, "Choose your character's secondary facial-hair colour:", "Character Preference", f_sec_colour) as color|null diff --git a/code/modules/clothing/ears/ears.dm b/code/modules/clothing/ears/ears.dm index 672df573858..2e3a1d40bda 100644 --- a/code/modules/clothing/ears/ears.dm +++ b/code/modules/clothing/ears/ears.dm @@ -4,6 +4,7 @@ icon_state = "earmuffs" item_state = "earmuffs" flags = EARBANGPROTECT + flags_2 = HEALS_EARS_2 strip_delay = 15 put_on_delay = 25 burn_state = FLAMMABLE diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm index dd28f990322..a8f87338ae8 100644 --- a/code/modules/lighting/lighting_overlay.dm +++ b/code/modules/lighting/lighting_overlay.dm @@ -6,6 +6,7 @@ anchored = 1 icon = LIGHTING_ICON layer = LIGHTING_LAYER + plane = LIGHTING_PLANE invisibility = INVISIBILITY_LIGHTING color = LIGHTING_BASE_MATRIX icon_state = "light1" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 26f77a31adc..065e5c4611e 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -48,8 +48,7 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi if(ishuman(body)) var/mob/living/carbon/human/H = body - icon = H.stand_icon - overlays = H.overlays_standing + appearance = H.appearance else icon = body.icon icon_state = body.icon_state diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index dea7c447191..6982d7f41c0 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -27,6 +27,7 @@ verbs += /mob/living/verb/lay_down alien_organs += new /obj/item/organ/internal/brain/xeno alien_organs += new /obj/item/organ/internal/xenos/hivenode + alien_organs += new /obj/item/organ/internal/ears for(var/obj/item/organ/internal/I in alien_organs) I.insert(src) ..() diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index da47f8c80b5..00aacd91b09 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -63,15 +63,12 @@ f_loss += 60 - AdjustEarDamage(30) - AdjustEarDeaf(120) - + AdjustEarDamage(30, 120) if(3.0) b_loss += 30 if(prob(50) && !shielded) Paralyse(1) - AdjustEarDamage(15) - AdjustEarDeaf(60) + AdjustEarDamage(15, 60) take_overall_damage(b_loss, f_loss) diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index 7771f1f5f90..6012a8fb7f3 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -78,14 +78,6 @@ else if(eye_blurry) //blurry eyes heal slowly AdjustEyeBlurry(-1) - //Ears - if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own - EarDeaf(1) - else if(ear_deaf) //deafness, heals slowly over time - AdjustEarDeaf(-1) - else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs - AdjustEarDamage(-0.05) - if(stuttering) AdjustStuttering(-1) diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index d0deac3e132..0b8aa891dde 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -56,15 +56,13 @@ f_loss += 60 - AdjustEarDamage(30) - AdjustEarDeaf(120) + AdjustEarDamage(30, 120) if(3.0) b_loss += 30 if(prob(50)) Paralyse(1) - AdjustEarDamage(15) - AdjustEarDeaf(60) + AdjustEarDamage(15, 60) adjustBruteLoss(b_loss) adjustFireLoss(f_loss) diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 654e9e27af3..a4b783e08fb 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -46,14 +46,6 @@ else if(eye_blurry) //blurry eyes heal slowly AdjustEyeBlurry(-1) - //Ears - if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own - EarDeaf(1) - else if(ear_deaf) //deafness, heals slowly over time - AdjustEarDeaf(-1) - else if(ear_damage < 25) //ear damage heals slowly under this threshold. - AdjustEarDamage(-0.05) - if(stuttering) AdjustStuttering(-1) diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index c64318d804b..0f7d4230587 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -108,8 +108,5 @@ I'm using this for Stat to give it a more nifty interface to work with /mob/living/carbon/brain/can_safely_leave_loc() return 0 //You're not supposed to be ethereal jaunting, brains -/mob/living/carbon/brain/SetEarDamage() // no ears to damage or heal - return - -/mob/living/carbon/brain/SetEarDeaf() - return +/mob/living/carbon/brain/can_hear() + . = TRUE diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 0a8f6fb3b83..03675f282e5 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -19,12 +19,6 @@ var/mmi_icon = 'icons/obj/assemblies.dmi' var/mmi_icon_state = "mmi_full" -/obj/item/organ/internal/brain/surgeryize() - if(!owner) - return - owner.SetEarDeaf(0) - owner.SetEarDamage(0) //Yeah, didn't you...hear? The ears are totally inside the brain. - /obj/item/organ/internal/brain/xeno name = "xenomorph brain" desc = "We barely understand the brains of terrestial animals. Who knows what we may find in the brain of such an advanced species?" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 731380b68d4..7ffceaceef6 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -7,6 +7,7 @@ var/obj/item/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call. /mob/living/carbon/human/New(loc) + icon = null // This is now handled by overlays -- we just keep an icon for the sake of the map editor. if(length(args) > 1) log_runtime(EXCEPTION("human/New called with more than 1 argument (REPORT THIS ENTIRE RUNTIME TO A CODER)")) . = ..() @@ -264,8 +265,7 @@ else valid_limbs -= processing_dismember if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs)) - AdjustEarDamage(30) - AdjustEarDeaf(120) + AdjustEarDamage(30, 120) if(prob(70) && !shielded) Paralyse(10) @@ -289,8 +289,7 @@ else valid_limbs -= processing_dismember if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs)) - AdjustEarDamage(15) - AdjustEarDeaf(60) + AdjustEarDamage(15, 60) if(prob(50) && !shielded) Paralyse(10) @@ -1527,8 +1526,9 @@ var/obj/item/organ/external/head/head_organ = get_organ("head") var/datum/sprite_accessory/hair/hair_style = GLOB.hair_styles_full_list[head_organ.h_style] var/icon/hair = new /icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") - - return image(get_icon_difference(get_eyecon(), hair), layer = LIGHTING_LAYER + 1) //Cut the hair's pixels from the eyes icon so eyes covered by bangs stay hidden even while on a higher layer. + var/mutable_appearance/MA = mutable_appearance(get_icon_difference(get_eyecon(), hair), layer = LIGHTING_LAYER + 1) + MA.plane = LIGHTING_PLANE + return MA //Cut the hair's pixels from the eyes icon so eyes covered by bangs stay hidden even while on a higher layer. /*Used to check if eyes should shine in the dark. Returns the image of the eyes on the layer where they will appear to shine. Eyes need to have significantly high darksight to shine unless the mob has the XRAY vision mutation. Eyes will not shine if they are covered in any way.*/ diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index f13d948842c..ce1d9a7f56e 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -786,20 +786,6 @@ AdjustEyeBlurry(-1) - //Ears - if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own - EarDeaf(1) - - else if(ear_deaf) //deafness, heals slowly over time - AdjustEarDeaf(-1) - - else if(istype(l_ear, /obj/item/clothing/ears/earmuffs) || istype(r_ear, /obj/item/clothing/ears/earmuffs)) //resting your ears with earmuffs heals ear damage faster - AdjustEarDamage(-0.15) - EarDeaf(1) - - else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs - AdjustEarDamage(-0.05) - 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) diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm index 90088f49926..3912e73a373 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -153,6 +153,9 @@ "l_foot" = list("path" = /obj/item/organ/external/foot), "r_foot" = list("path" = /obj/item/organ/external/foot/right)) + // Mutant pieces + var/obj/item/organ/internal/ears/mutantears = /obj/item/organ/internal/ears + /datum/species/New() //If the species has eyes, they are the default vision organ if(!vision_organ && has_organ["eyes"]) @@ -165,7 +168,6 @@ return species_language.get_random_name(gender) /datum/species/proc/create_organs(mob/living/carbon/human/H) //Handles creation of mob organs. - QDEL_LIST(H.internal_organs) QDEL_LIST(H.bodyparts) @@ -184,12 +186,21 @@ // organ new code calls `insert` on its own new organ(H) + create_mutant_organs(H) + for(var/name in H.bodyparts_by_name) H.bodyparts |= H.bodyparts_by_name[name] for(var/obj/item/organ/external/O in H.bodyparts) O.owner = H +/datum/species/proc/create_mutant_organs(mob/living/carbon/human/H) + var/obj/item/organ/internal/ears/ears = H.get_int_organ(/obj/item/organ/internal/ears) + if(ears) + qdel(ears) + + ears = new mutantears(H) + /datum/species/proc/breathe(mob/living/carbon/human/H) if((NO_BREATHE in species_traits) || (BREATHLESS in H.mutations)) return TRUE diff --git a/code/modules/mob/living/carbon/human/species/human.dm b/code/modules/mob/living/carbon/human/species/human.dm index 2a161ab9318..7009af295ac 100644 --- a/code/modules/mob/living/carbon/human/species/human.dm +++ b/code/modules/mob/living/carbon/human/species/human.dm @@ -17,4 +17,11 @@ worlds tumultous at best." reagent_tag = PROCESS_ORG - //Has standard darksight of 2. \ No newline at end of file + //Has standard darksight of 2. + +/datum/species/human/cat + name = "Felinid" + name_plural = "Felinids" + blurb = "CATGIRLS OMG" + + mutantears = /obj/item/organ/internal/ears/cat \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 8dff1863061..4357584a18e 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -105,68 +105,20 @@ Please contact me on #coderbus IRC. ~Carn x /mob/living/carbon/human var/list/overlays_standing[TOTAL_LAYERS] - var/list/misc_effect_overlays = list() //Overlays that are applied at a custom layer (defined in each image's .layer property) outside of standard overlay application. Updated in update_misc_effects() var/previous_damage_appearance // store what the body last looked like, so we only have to update it if something changed var/icon/skeleton var/list/cached_standing_overlays = list() // List of everything currently in a human's actual overlays -//UPDATES OVERLAYS FROM OVERLAYS_LYING/OVERLAYS_STANDING -//this proc is messy as I was forced to include some old laggy cloaking code to it so that I don't break cloakers -//I'll work on removing that stuff by rewriting some of the cloaking stuff at a later date. -/mob/living/carbon/human/update_icons() - var/stealth = 0 - var/obj/item/clothing/suit/armor/abductor/vest/V // Begin the most snowflakey bullshit code I've ever written. I'm so sorry, but there was no other way. +/mob/living/carbon/human/proc/apply_overlay(cache_index) + if((. = overlays_standing[cache_index])) + add_overlay(.) - for(V in list(wear_suit)) - if(V.stealth_active) - stealth = 1 - break +/mob/living/carbon/human/proc/remove_overlay(cache_index) + var/I = overlays_standing[cache_index] + if(I) + cut_overlay(I) + overlays_standing[cache_index] = null - if(stealth) - icon = V.disguise.icon //if the suit is active, reference the suit's current loaded icon and overlays; this does not include hand overlays - overlays.Cut() - cached_standing_overlays.Cut() // Make sure the cache gets rebuilt once the disguise is gone - - for(var/thing in V.disguise.overlays) - if(thing) - overlays += thing - - var/image/I = overlays_standing[L_HAND_LAYER] //manually add both left and right hand, so its independently updated - if(istype(I)) - overlays += I - I = overlays_standing[R_HAND_LAYER] - if(istype(I)) - overlays += I - else - icon = stand_icon - var/list/new_overlays = list() - var/list/old_overlays = cached_standing_overlays - - // Totally regenerate if something touched our overlays - if(overlays.len != old_overlays.len) - overlays.Cut() - old_overlays.Cut() - - for(var/i in 1 to TOTAL_LAYERS) - var/image/I = overlays_standing[i] - if(I) - if(istype(I)) - // Since we avoid full overlay rebuilds, we have to reorganize the layers manually - I.layer = (-2 - (TOTAL_LAYERS - i)) // Highest layer gets -2, each prior layer is 1 lower - new_overlays += I - - update_misc_effects() - if(misc_effect_overlays) - new_overlays += misc_effect_overlays - - if(frozen) // Admin freeze overlay - new_overlays += frozen - - overlays += (new_overlays - old_overlays) - overlays -= (old_overlays - new_overlays) - cached_standing_overlays = new_overlays - - update_transform() var/global/list/damage_icon_parts = list() @@ -185,38 +137,42 @@ var/global/list/damage_icon_parts = list() previous_damage_appearance = damage_appearance - var/icon/standing = new /icon(dna.species.damage_overlays, "00") - - var/image/standing_image = new /image("icon" = standing) + remove_overlay(H_DAMAGE_LAYER) + var/mutable_appearance/damage_overlay = mutable_appearance(dna.species.damage_overlays, "00", layer = -H_DAMAGE_LAYER) + overlays_standing[H_DAMAGE_LAYER] = damage_overlay // blend the individual damage states with our icons - for(var/obj/item/organ/external/O in bodyparts) - O.update_icon() - if(O.damage_state == "00") continue + for(var/D in bodyparts) + var/obj/item/organ/external/E = D + E.update_icon() + if(E.damage_state == "00") + continue + var/icon/DI - var/cache_index = "[O.damage_state]/[O.icon_name]/[dna.species.blood_color]/[dna.species.name]" + var/cache_index = "[E.damage_state]/[E.icon_name]/[dna.species.blood_color]/[dna.species.name]" if(damage_icon_parts[cache_index] == null) - DI = new /icon(dna.species.damage_overlays, O.damage_state) // the damage icon for whole human - DI.Blend(new /icon(dna.species.damage_mask, O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels + DI = new /icon(dna.species.damage_overlays, E.damage_state) // the damage icon for whole human + DI.Blend(new /icon(dna.species.damage_mask, E.icon_name), ICON_MULTIPLY) // mask with this organ's pixels DI.Blend(dna.species.blood_color, ICON_MULTIPLY) damage_icon_parts[cache_index] = DI else DI = damage_icon_parts[cache_index] - standing_image.overlays += DI + damage_overlay.overlays += DI - overlays_standing[H_DAMAGE_LAYER] = standing_image + apply_overlay(H_DAMAGE_LAYER) - if(update_icons) update_icons() //BASE MOB SPRITE /mob/living/carbon/human/proc/update_body(var/update_icons=1, var/rebuild_base=0) + remove_overlay(BODY_LAYER) + remove_overlay(LIMBS_LAYER) // So we don't get the old species' sprite splatted on top of the new one's + remove_overlay(UNDERWEAR_LAYER) - var/husk_color_mod = rgb(96,88,80) - var/hulk_color_mod = rgb(48,224,40) + var/husk_color_mod = rgb(96, 88, 80) + var/hulk_color_mod = rgb(48, 224, 40) var/husk = (HUSK in mutations) - var/fat = (FAT in mutations) var/hulk = (HULK in mutations) var/skeleton = (SKELETON in mutations) @@ -228,42 +184,18 @@ var/global/list/damage_icon_parts = list() //Create a new, blank icon for our mob to use. if(stand_icon) qdel(stand_icon) - stand_icon = new(dna.species.icon_template ? dna.species.icon_template : 'icons/mob/human.dmi',"blank") - var/icon_key = "" - var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes) - if(eyes) - icon_key += "[eyes.eye_colour]" - else - icon_key += "#000000" + update_misc_effects() + stand_icon = new (dna.species.icon_template ? dna.species.icon_template : 'icons/mob/human.dmi', "blank") + var/list/standing = list() + var/icon_key = generate_icon_render_key() - for(var/organ_tag in dna.species.has_limbs) - var/obj/item/organ/external/part = bodyparts_by_name[organ_tag] - if(isnull(part)) - icon_key += "0" - else if(part.is_robotic()) - icon_key += "2[part.model ? "-[part.model]": ""]" - else if(part.status & ORGAN_DEAD) - icon_key += "3" - else - icon_key += "1" - - if(part) - var/datum/species/S = GLOB.all_species[part.dna.species.name] //This has to reference the species datums from round start, since they're global and unchanging - icon_key += "[S.race_key]" - icon_key += "[part.dna.GetUIState(DNA_UI_GENDER)]" - icon_key += "[part.dna.GetUIValue(DNA_UI_SKIN_TONE)]" - if(part.s_col) - icon_key += "[part.s_col]" - if(part.s_tone) - icon_key += "[part.s_tone]" - - icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]" - - var/icon/base_icon + var/mutable_appearance/base if(human_icon_cache[icon_key] && !rebuild_base) - base_icon = human_icon_cache[icon_key] + base = human_icon_cache[icon_key] + standing += base else + var/icon/base_icon //BEGIN CACHED ICON GENERATION. var/obj/item/organ/external/chest = get_organ("chest") base_icon = chest.get_icon(skeleton) @@ -272,7 +204,7 @@ var/global/list/damage_icon_parts = list() var/icon/temp = part.get_icon(skeleton) //That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST //And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part) - if(part.icon_position&(LEFT|RIGHT)) + if(part.icon_position & (LEFT | RIGHT)) var/icon/temp2 = new('icons/mob/human.dmi',"blank") temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH) temp2.Insert(new/icon(temp,dir=SOUTH),dir=SOUTH) @@ -304,19 +236,16 @@ var/global/list/damage_icon_parts = list() husk_over.Blend(mask, ICON_ADD) base_icon.Blend(husk_over, ICON_OVERLAY) - human_icon_cache[icon_key] = base_icon + var/mutable_appearance/new_base = mutable_appearance(base_icon, layer = -LIMBS_LAYER) + human_icon_cache[icon_key] = new_base + standing += new_base + //END CACHED ICON GENERATION. - //END CACHED ICON GENERATION. - stand_icon.Blend(base_icon,ICON_OVERLAY) - if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && dna.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 + overlays_standing[LIMBS_LAYER] = standing + apply_overlay(LIMBS_LAYER) //Underwear - overlays_standing[UNDERWEAR_LAYER] = null - var/icon/underwear_standing = new/icon('icons/mob/underwear.dmi',"nude") - + var/icon/underwear_standing = new /icon('icons/mob/underwear.dmi', "nude") if(underwear && dna.species.clothing_flags & HAS_UNDERWEAR) var/datum/sprite_accessory/underwear/U = GLOB.underwear_list[underwear] if(U) @@ -327,27 +256,25 @@ var/global/list/damage_icon_parts = list() if(U2) underwear_standing.Blend(new /icon(U2.icon, "us_[U2.icon_state]_s"), ICON_OVERLAY) - if(socks && dna.species.clothing_flags & HAS_SOCKS) var/datum/sprite_accessory/socks/U3 = GLOB.socks_list[socks] if(U3) underwear_standing.Blend(new /icon(U3.icon, "sk_[U3.icon_state]_s"), ICON_OVERLAY) if(underwear_standing) - overlays_standing[UNDERWEAR_LAYER] = image(underwear_standing) - - - if(update_icons) - update_icons() + overlays_standing[UNDERWEAR_LAYER] = mutable_appearance(underwear_standing, layer = -UNDERWEAR_LAYER) + apply_overlay(UNDERWEAR_LAYER) if(lip_style && (LIPS in dna.species.species_traits)) - var/icon/lips = icon("icon"='icons/mob/human_face.dmi', "icon_state"="lips_[lip_style]_s") + var/icon/lips = icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "lips_[lip_style]_s") lips.Blend(lip_color, ICON_ADD) + standing += mutable_appearance(lips, layer = -BODY_LAYER) - stand_icon.Blend(lips, ICON_OVERLAY) - + overlays_standing[BODY_LAYER] = standing + apply_overlay(BODY_LAYER) //tail update_tail_layer(0) + update_int_organs() //head accessory update_head_accessory(0) //markings @@ -360,10 +287,10 @@ var/global/list/damage_icon_parts = list() //MARKINGS OVERLAY /mob/living/carbon/human/proc/update_markings(var/update_icons=1) //Reset our markings. - overlays_standing[MARKINGS_LAYER] = null + remove_overlay(MARKINGS_LAYER) //Base icon. - var/icon/markings_standing = new/icon('icons/mob/body_accessory.dmi',"accessory_none_s") + var/icon/markings_standing = icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "accessory_none_s") //Body markings. var/obj/item/organ/external/chest/chest_organ = get_organ("chest") @@ -371,7 +298,7 @@ var/global/list/damage_icon_parts = list() var/body_marking = m_styles["body"] var/datum/sprite_accessory/body_marking_style = GLOB.marking_styles_list[body_marking] if(body_marking_style && body_marking_style.species_allowed && (dna.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") + var/icon/b_marking_s = 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) @@ -381,33 +308,30 @@ var/global/list/damage_icon_parts = list() var/head_marking = m_styles["head"] var/datum/sprite_accessory/head_marking_style = GLOB.marking_styles_list[head_marking] if(head_marking_style && head_marking_style.species_allowed && (head_organ.dna.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") + var/icon/h_marking_s = 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) - - if(update_icons) update_icons() + overlays_standing[MARKINGS_LAYER] = mutable_appearance(markings_standing, layer = -MARKINGS_LAYER) + apply_overlay(MARKINGS_LAYER) //HEAD ACCESSORY OVERLAY /mob/living/carbon/human/proc/update_head_accessory(var/update_icons=1) //Reset our head accessory - overlays_standing[HEAD_ACCESSORY_LAYER] = null - overlays_standing[HEAD_ACC_OVER_LAYER] = null + remove_overlay(HEAD_ACCESSORY_LAYER) + remove_overlay(HEAD_ACC_OVER_LAYER) var/obj/item/organ/external/head/head_organ = get_organ("head") if(!head_organ) - if(update_icons) update_icons() return //masks and helmets can obscure our head accessory if((head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR))) - if(update_icons) update_icons() return //base icons - var/icon/head_accessory_standing = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s") + var/icon/head_accessory_standing = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s") if(head_organ.ha_style && (head_organ.dna.species.bodyflags & HAS_HEAD_ACCESSORY)) var/datum/sprite_accessory/head_accessory/head_accessory_style = GLOB.head_accessory_styles_list[head_organ.ha_style] if(head_accessory_style && head_accessory_style.species_allowed) @@ -419,38 +343,33 @@ var/global/list/damage_icon_parts = list() //Having it this way preserves animations. Useful for animated antennae. if(head_accessory_style.over_hair) //Select which layer to use based on the properties of the head accessory style. - overlays_standing[HEAD_ACC_OVER_LAYER] = image(head_accessory_standing) + overlays_standing[HEAD_ACC_OVER_LAYER] = mutable_appearance(head_accessory_standing, layer = -HEAD_ACC_OVER_LAYER) + apply_overlay(HEAD_ACC_OVER_LAYER) else - overlays_standing[HEAD_ACCESSORY_LAYER] = image(head_accessory_standing) + overlays_standing[HEAD_ACCESSORY_LAYER] = mutable_appearance(head_accessory_standing, layer = -HEAD_ACCESSORY_LAYER) + apply_overlay(HEAD_ACCESSORY_LAYER) else //warning("Invalid ha_style for [species.name]: [ha_style]") - if(update_icons) update_icons() //HAIR OVERLAY /mob/living/carbon/human/proc/update_hair(var/update_icons=1) //Reset our hair - overlays_standing[HAIR_LAYER] = null + remove_overlay(HAIR_LAYER) var/obj/item/organ/external/head/head_organ = get_organ("head") if(!head_organ) - 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(update_icons) update_icons() return //base icons var/icon/hair_standing = new /icon('icons/mob/human_face.dmi',"bald_s") - //var/icon/debrained_s = new /icon("icon"='icons/mob/human_face.dmi', "icon_state" = "debrained_s") - if(head_organ.h_style && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic()))) var/datum/sprite_accessory/hair/hair_style = GLOB.hair_styles_full_list[head_organ.h_style] - //if(!src.get_int_organ(/obj/item/organ/internal/brain) && !ismachine(src))//make it obvious we have NO BRAIN - // hair_standing.Blend(debrained_s, ICON_OVERLAY) if(hair_style && hair_style.species_allowed) if((head_organ.dna.species.name in hair_style.species_allowed) || (head_organ.dna.species.bodyflags & ALL_RPARTS)) //If the head's species is in the list of allowed species for the hairstyle, or the head's species is one flagged to have bodies comprised wholly of cybernetics... var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") @@ -471,30 +390,26 @@ var/global/list/damage_icon_parts = list() //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) - - if(update_icons) update_icons() + overlays_standing[HAIR_LAYER] = mutable_appearance(hair_standing, layer = -HAIR_LAYER) + apply_overlay(HAIR_LAYER) //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_OVER_LAYER] = null + remove_overlay(FHAIR_LAYER) + remove_overlay(FHAIR_OVER_LAYER) var/obj/item/organ/external/head/head_organ = get_organ("head") if(!head_organ) - 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(update_icons) update_icons() return //base icons var/icon/face_standing = new /icon('icons/mob/human_face.dmi',"bald_s") - if(head_organ.f_style) var/datum/sprite_accessory/facial_hair/facial_hair_style = GLOB.facial_hair_styles_list[head_organ.f_style] if(facial_hair_style && facial_hair_style.species_allowed) @@ -514,46 +429,49 @@ var/global/list/damage_icon_parts = list() face_standing.Blend(facial_s, ICON_OVERLAY) if(facial_hair_style.over_hair) //Select which layer to use based on the properties of the facial hair style. - overlays_standing[FHAIR_OVER_LAYER] = image(face_standing) + overlays_standing[FHAIR_OVER_LAYER] = mutable_appearance(face_standing, layer = -FHAIR_OVER_LAYER) + apply_overlay(FHAIR_OVER_LAYER) else - overlays_standing[FHAIR_LAYER] = image(face_standing) + overlays_standing[FHAIR_LAYER] = mutable_appearance(face_standing, layer = -FHAIR_LAYER) + apply_overlay(FHAIR_LAYER) else //warning("Invalid f_style for [species.name]: [f_style]") - if(update_icons) update_icons() + /mob/living/carbon/human/update_mutations(var/update_icons=1) + remove_overlay(MUTATIONS_LAYER) var/fat if(FAT in mutations) fat = "fat" - var/image/standing = image("icon" = 'icons/effects/genetics.dmi') + var/mutable_appearance/standing = mutable_appearance('icons/effects/genetics.dmi', layer = -MUTATIONS_LAYER) var/add_image = 0 var/g = "m" - if(gender == FEMALE) g = "f" + if(gender == FEMALE) + g = "f" // DNA2 - Drawing underlays. for(var/datum/dna/gene/gene in dna_genes) if(!gene.block) continue if(gene.is_active(src)) - var/underlay=gene.OnDrawUnderlays(src,g,fat) + var/underlay = gene.OnDrawUnderlays(src, g, fat) if(underlay) standing.underlays += underlay add_image = 1 for(var/mut in mutations) switch(mut) if(LASER) - standing.overlays += "lasereyes_s" + standing.overlays += "lasereyes_s" add_image = 1 if((COLDRES in mutations) && (HEATRES in mutations)) - standing.underlays -= "cold[fat]_s" - standing.underlays -= "fire[fat]_s" - standing.underlays += "coldfire[fat]_s" + standing.underlays -= "cold[fat]_s" + standing.underlays -= "fire[fat]_s" + standing.underlays += "coldfire[fat]_s" + if(add_image) - overlays_standing[MUTATIONS_LAYER] = standing - else - overlays_standing[MUTATIONS_LAYER] = null - if(update_icons) update_icons() + overlays_standing[MUTATIONS_LAYER] = standing + apply_overlay(MUTATIONS_LAYER) /mob/living/carbon/human/proc/update_mutantrace(var/update_icons=1) @@ -566,17 +484,14 @@ var/global/list/damage_icon_parts = list() update_hair(0) update_fhair(0) - if(update_icons) update_icons() /mob/living/carbon/human/update_fire() + remove_overlay(FIRE_LAYER) if(on_fire) if(!overlays_standing[FIRE_LAYER]) - overlays_standing[FIRE_LAYER] = image("icon"=fire_dmi, "icon_state"=fire_sprite) - update_icons() - else - overlays_standing[FIRE_LAYER] = null - update_icons() + overlays_standing[FIRE_LAYER] = mutable_appearance(fire_dmi, fire_sprite, layer = -FIRE_LAYER) + apply_overlay(FIRE_LAYER) /* --------------------------------------- */ //For legacy support. @@ -617,7 +532,7 @@ var/global/list/damage_icon_parts = list() //vvvvvv UPDATE_INV PROCS vvvvvv /mob/living/carbon/human/update_inv_w_uniform(var/update_icons=1) - + remove_overlay(UNIFORM_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_w_uniform] if(inv) @@ -630,9 +545,10 @@ var/global/list/damage_icon_parts = list() client.screen += w_uniform //Either way, add the item to the HUD var/t_color = w_uniform.item_color - if(!t_color) t_color = icon_state - var/image/standing = image("icon_state" = "[t_color]_s") + if(!t_color) + t_color = icon_state + var/mutable_appearance/standing = mutable_appearance('icons/mob/uniform.dmi', "[t_color]_s", layer = -UNIFORM_LAYER) if(FAT in mutations) if(w_uniform.flags_size & ONESIZEFITSALL) standing.icon = 'icons/mob/uniform_fat.dmi' @@ -640,8 +556,6 @@ var/global/list/damage_icon_parts = list() to_chat(src, "You burst out of \the [w_uniform]!") unEquip(w_uniform) return - else - standing.icon = 'icons/mob/uniform.dmi' if(w_uniform.icon_override) standing.icon = w_uniform.icon_override @@ -650,13 +564,14 @@ var/global/list/damage_icon_parts = list() if(w_uniform.blood_DNA) var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "uniformblood") - bloodsies.color = w_uniform.blood_color - standing.overlays += bloodsies + bloodsies.color = w_uniform.blood_color + standing.overlays += bloodsies - if(w_uniform:accessories.len) //WE CHECKED THE TYPE ABOVE. THIS REALLY SHOULD BE FINE. + if(w_uniform:accessories.len) //WE CHECKED THE TYPE ABOVE. THIS REALLY SHOULD BE FINE. // oh my god kys whoever made this if statement jfc :gun: for(var/obj/item/clothing/accessory/A in w_uniform:accessories) var/tie_color = A.item_color - if(!tie_color) tie_color = A.icon_state + if(!tie_color) + tie_color = A.icon_state if(A.icon_override) standing.overlays += image("icon" = A.icon_override, "icon_state" = "[A.icon_state]") else if(A.sprite_sheets && A.sprite_sheets[dna.species.name]) @@ -664,25 +579,24 @@ var/global/list/damage_icon_parts = list() else standing.overlays += image("icon" = 'icons/mob/ties.dmi', "icon_state" = "[tie_color]") - overlays_standing[UNIFORM_LAYER] = standing + overlays_standing[UNIFORM_LAYER] = standing else - overlays_standing[UNIFORM_LAYER] = null // Automatically drop anything in store / id / belt if you're not wearing a uniform. //CHECK IF NECESARRY - for( var/obj/item/thing in list(r_store, l_store, wear_id, wear_pda, belt) ) // - if(thing) // - unEquip(thing) // - if(client) // - client.screen -= thing // - // + for(var/obj/item/thing in list(r_store, l_store, wear_id, wear_pda, belt)) // whoever made this + if(thing) // you're a piece of fucking garbage + unEquip(thing) // why the fuck would you goddamn do this motherfucking shit + if(client) // INVENTORY CODE IN FUCKING ICON CODE + client.screen -= thing // WHAT THE FUCKING FUCK BAY GODDAMNIT + // **I FUCKING HATE YOU AAAAAAAAAA** if(thing) // thing.loc = loc // thing.dropped(src) // thing.layer = initial(thing.layer) thing.plane = initial(thing.plane) - if(update_icons) update_icons() + apply_overlay(UNIFORM_LAYER) /mob/living/carbon/human/update_inv_wear_id(var/update_icons=1) - + remove_overlay(ID_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_wear_id] if(inv) @@ -694,16 +608,11 @@ var/global/list/damage_icon_parts = list() client.screen += wear_id if(w_uniform && w_uniform:displays_id) - overlays_standing[ID_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "id") - else - overlays_standing[ID_LAYER] = null - else - overlays_standing[ID_LAYER] = null - - if(update_icons) update_icons() + overlays_standing[ID_LAYER] = mutable_appearance('icons/mob/mob.dmi', "id", layer = -ID_LAYER) + apply_overlay(ID_LAYER) /mob/living/carbon/human/update_inv_gloves(var/update_icons=1) - + remove_overlay(GLOVES_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_gloves] if(inv) @@ -718,32 +627,30 @@ var/global/list/damage_icon_parts = list() var/t_state = gloves.item_state if(!t_state) t_state = gloves.icon_state - var/image/standing + var/mutable_appearance/standing if(gloves.icon_override) - standing = image("icon" = gloves.icon_override, "icon_state" = "[t_state]") + standing = mutable_appearance(gloves.icon_override, "[t_state]", layer = -GLOVES_LAYER) else if(gloves.sprite_sheets && gloves.sprite_sheets[dna.species.name]) - standing = image("icon" = gloves.sprite_sheets[dna.species.name], "icon_state" = "[t_state]") + standing = mutable_appearance(gloves.sprite_sheets[dna.species.name], "[t_state]", layer = -GLOVES_LAYER) else - standing = image("icon" = 'icons/mob/hands.dmi', "icon_state" = "[t_state]") + standing = mutable_appearance('icons/mob/hands.dmi', "[t_state]", layer = -GLOVES_LAYER) if(gloves.blood_DNA) var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "bloodyhands") bloodsies.color = gloves.blood_color - standing.overlays += bloodsies + standing.overlays += bloodsies overlays_standing[GLOVES_LAYER] = standing else if(blood_DNA) - var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "bloodyhands") + var/mutable_appearance/bloodsies = mutable_appearance(dna.species.blood_mask, "bloodyhands", layer = -GLOVES_LAYER) bloodsies.color = hand_blood_color overlays_standing[GLOVES_LAYER] = bloodsies - else - overlays_standing[GLOVES_LAYER] = null - if(update_icons) update_icons() + apply_overlay(GLOVES_LAYER) /mob/living/carbon/human/update_inv_glasses(var/update_icons=1) - overlays_standing[GLASSES_LAYER] = null - overlays_standing[GLASSES_OVER_LAYER] = null + remove_overlay(GLASSES_LAYER) + remove_overlay(GLASSES_OVER_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_glasses] @@ -751,7 +658,7 @@ var/global/list/damage_icon_parts = list() inv.update_icon() if(glasses) - var/image/new_glasses + var/mutable_appearance/new_glasses var/obj/item/organ/external/head/head_organ = get_organ("head") if(client && hud_used && hud_used.hud_shown) if(hud_used.inventory_shown) //if the inventory is open ... @@ -759,22 +666,23 @@ var/global/list/damage_icon_parts = list() client.screen += glasses //Either way, add the item to the HUD if(glasses.icon_override) - new_glasses = image("icon" = glasses.icon_override, "icon_state" = "[glasses.icon_state]") + new_glasses = mutable_appearance(glasses.icon_override, "[glasses.icon_state]", layer = -GLASSES_LAYER) else if(glasses.sprite_sheets && glasses.sprite_sheets[head_organ.dna.species.name]) - new_glasses = image("icon" = glasses.sprite_sheets[head_organ.dna.species.name], "icon_state" = "[glasses.icon_state]") + new_glasses = mutable_appearance(glasses.sprite_sheets[head_organ.dna.species.name], "[glasses.icon_state]", layer = -GLASSES_LAYER) else - new_glasses = image("icon" = 'icons/mob/eyes.dmi', "icon_state" = "[glasses.icon_state]") + new_glasses = mutable_appearance('icons/mob/eyes.dmi', "[glasses.icon_state]", layer = -GLASSES_LAYER) var/datum/sprite_accessory/hair/hair_style = GLOB.hair_styles_full_list[head_organ.h_style] if(hair_style && hair_style.glasses_over) //Select which layer to use based on the properties of the hair style. Hair styles with hair that don't overhang the arms of the glasses should have glasses_over set to a positive value. + new_glasses.layer = -GLASSES_OVER_LAYER overlays_standing[GLASSES_OVER_LAYER] = new_glasses + apply_overlay(GLASSES_OVER_LAYER) else overlays_standing[GLASSES_LAYER] = new_glasses - - if(update_icons) update_icons() + apply_overlay(GLASSES_LAYER) /mob/living/carbon/human/update_inv_ears(var/update_icons=1) - + remove_overlay(EARS_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_l_ear] if(inv) @@ -795,12 +703,12 @@ var/global/list/damage_icon_parts = list() var/t_type = l_ear.icon_state if(l_ear.icon_override) t_type = "[t_type]_l" - overlays_standing[EARS_LAYER] = image("icon" = l_ear.icon_override, "icon_state" = "[t_type]") + overlays_standing[EARS_LAYER] = mutable_appearance(l_ear.icon_override, "[t_type]", layer = -EARS_LAYER) else if(l_ear.sprite_sheets && l_ear.sprite_sheets[dna.species.name]) t_type = "[t_type]_l" - overlays_standing[EARS_LAYER] = image("icon" = l_ear.sprite_sheets[dna.species.name], "icon_state" = "[t_type]") + overlays_standing[EARS_LAYER] = mutable_appearance(l_ear.sprite_sheets[dna.species.name], "[t_type]", layer = -EARS_LAYER) else - overlays_standing[EARS_LAYER] = image("icon" = 'icons/mob/ears.dmi', "icon_state" = "[t_type]") + overlays_standing[EARS_LAYER] = mutable_appearance('icons/mob/ears.dmi', "[t_type]", layer = -EARS_LAYER) if(r_ear) if(client && hud_used && hud_used.hud_shown) @@ -811,19 +719,16 @@ var/global/list/damage_icon_parts = list() var/t_type = r_ear.icon_state if(r_ear.icon_override) t_type = "[t_type]_r" - overlays_standing[EARS_LAYER] = image("icon" = r_ear.icon_override, "icon_state" = "[t_type]") + overlays_standing[EARS_LAYER] = mutable_appearance(r_ear.icon_override, "[t_type]", layer = -EARS_LAYER) else if(r_ear.sprite_sheets && r_ear.sprite_sheets[dna.species.name]) t_type = "[t_type]_r" - overlays_standing[EARS_LAYER] = image("icon" = r_ear.sprite_sheets[dna.species.name], "icon_state" = "[t_type]") + overlays_standing[EARS_LAYER] = mutable_appearance(r_ear.sprite_sheets[dna.species.name], "[t_type]", layer = -EARS_LAYER) else - overlays_standing[EARS_LAYER] = image("icon" = 'icons/mob/ears.dmi', "icon_state" = "[t_type]") - - else - overlays_standing[EARS_LAYER] = null - if(update_icons) update_icons() + overlays_standing[EARS_LAYER] = mutable_appearance('icons/mob/ears.dmi', "[t_type]", layer = -EARS_LAYER) + apply_overlay(EARS_LAYER) /mob/living/carbon/human/update_inv_shoes(var/update_icons=1) - + remove_overlay(SHOES_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_shoes] if(inv) @@ -835,13 +740,13 @@ var/global/list/damage_icon_parts = list() shoes.screen_loc = ui_shoes //...draw the item in the inventory screen client.screen += shoes //Either way, add the item to the HUD - var/image/standing + var/mutable_appearance/standing if(shoes.icon_override) - standing = image("icon" = shoes.icon_override, "icon_state" = "[shoes.icon_state]") + standing = mutable_appearance(shoes.icon_override, "[shoes.icon_state]", layer = -SHOES_LAYER) else if(shoes.sprite_sheets && shoes.sprite_sheets[dna.species.name]) - standing = image("icon" = shoes.sprite_sheets[dna.species.name], "icon_state" = "[shoes.icon_state]") + standing = mutable_appearance(shoes.sprite_sheets[dna.species.name], "[shoes.icon_state]", layer = -SHOES_LAYER) else - standing = image("icon" = 'icons/mob/feet.dmi', "icon_state" = "[shoes.icon_state]") + standing = mutable_appearance('icons/mob/feet.dmi', "[shoes.icon_state]", layer = -SHOES_LAYER) if(shoes.blood_DNA) @@ -851,15 +756,13 @@ var/global/list/damage_icon_parts = list() overlays_standing[SHOES_LAYER] = standing else if(feet_blood_DNA) - var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "shoeblood") + var/mutable_appearance/bloodsies = mutable_appearance(dna.species.blood_mask, "shoeblood", layer = -SHOES_LAYER) bloodsies.color = feet_blood_color overlays_standing[SHOES_LAYER] = bloodsies - else - overlays_standing[SHOES_LAYER] = null - if(update_icons) update_icons() + apply_overlay(SHOES_LAYER) /mob/living/carbon/human/update_inv_s_store(var/update_icons=1) - + remove_overlay(SUIT_STORE_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_s_store] if(inv) @@ -874,42 +777,37 @@ var/global/list/damage_icon_parts = list() if(!t_state) t_state = s_store.icon_state var/dmi='icons/mob/belt_mirror.dmi' - overlays_standing[SUIT_STORE_LAYER] = image("icon" = dmi, "icon_state" = "[t_state]") + overlays_standing[SUIT_STORE_LAYER] = mutable_appearance(dmi, "[t_state]", layer = -SUIT_STORE_LAYER) s_store.screen_loc = ui_sstore1 //TODO - else - overlays_standing[SUIT_STORE_LAYER] = null - if(update_icons) update_icons() + apply_overlay(SUIT_STORE_LAYER) /mob/living/carbon/human/update_inv_head(var/update_icons=1) ..() + remove_overlay(HEAD_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_head] if(inv) inv.update_icon() if(head) - var/image/standing + var/mutable_appearance/standing if(head.icon_override) - standing = image("icon" = head.icon_override, "icon_state" = "[head.icon_state]") + standing = mutable_appearance(head.icon_override, "[head.icon_state]", layer = -HEAD_LAYER) else if(head.sprite_sheets && head.sprite_sheets[dna.species.name]) - standing = image("icon" = head.sprite_sheets[dna.species.name], "icon_state" = "[head.icon_state]") + standing = mutable_appearance(head.sprite_sheets[dna.species.name], "[head.icon_state]", layer = -HEAD_LAYER) else - standing = image("icon" = 'icons/mob/head.dmi', "icon_state" = "[head.icon_state]") + standing = mutable_appearance('icons/mob/head.dmi', "[head.icon_state]", layer = -HEAD_LAYER) if(head.blood_DNA) var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "helmetblood") bloodsies.color = head.blood_color - standing.overlays += bloodsies - overlays_standing[HEAD_LAYER] = standing - - - else - overlays_standing[HEAD_LAYER] = null - if(update_icons) update_icons() + standing.overlays += bloodsies + overlays_standing[HEAD_LAYER] = standing + apply_overlay(HEAD_LAYER) /mob/living/carbon/human/update_inv_belt(var/update_icons=1) - + remove_overlay(BELT_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_belt] if(inv) @@ -921,21 +819,21 @@ var/global/list/damage_icon_parts = list() if(belt) var/t_state = belt.item_state - if(!t_state) t_state = belt.icon_state + if(!t_state) + t_state = belt.icon_state if(belt.icon_override) t_state = "[t_state]_be" - overlays_standing[BELT_LAYER] = image("icon" = belt.icon_override, "icon_state" = "[t_state]") + overlays_standing[BELT_LAYER] = mutable_appearance(belt.icon_override, "[t_state]", layer = -BELT_LAYER) else if(belt.sprite_sheets && belt.sprite_sheets[dna.species.name]) - overlays_standing[BELT_LAYER] = image("icon" = belt.sprite_sheets[dna.species.name], "icon_state" = "[t_state]") + overlays_standing[BELT_LAYER] = mutable_appearance(belt.sprite_sheets[dna.species.name], "[t_state]", layer = -BELT_LAYER) else - overlays_standing[BELT_LAYER] = image("icon" = 'icons/mob/belt.dmi', "icon_state" = "[t_state]") - else - overlays_standing[BELT_LAYER] = null - if(update_icons) update_icons() + overlays_standing[BELT_LAYER] = mutable_appearance('icons/mob/belt.dmi', "[t_state]", layer = -BELT_LAYER) + apply_overlay(BELT_LAYER) /mob/living/carbon/human/update_inv_wear_suit(var/update_icons=1) + remove_overlay(SUIT_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_wear_suit] if(inv) @@ -947,47 +845,37 @@ var/global/list/damage_icon_parts = list() wear_suit.screen_loc = ui_oclothing //TODO //...draw the item in the inventory screen client.screen += wear_suit //Either way, add the item to the HUD - var/image/standing + var/mutable_appearance/standing if(wear_suit.icon_override) - standing = image("icon" = wear_suit.icon_override, "icon_state" = "[wear_suit.icon_state]") + standing = mutable_appearance(wear_suit.icon_override, "[wear_suit.icon_state]", layer = -SUIT_LAYER) else if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[dna.species.name]) - standing = image("icon" = wear_suit.sprite_sheets[dna.species.name], "icon_state" = "[wear_suit.icon_state]") + standing = mutable_appearance(wear_suit.sprite_sheets[dna.species.name], "[wear_suit.icon_state]", layer = -SUIT_LAYER) else if(FAT in mutations) if(wear_suit.flags_size & ONESIZEFITSALL) - standing = image("icon" = 'icons/mob/suit_fat.dmi', "icon_state" = "[wear_suit.icon_state]") + standing = mutable_appearance('icons/mob/suit_fat.dmi', "[wear_suit.icon_state]", layer = -SUIT_LAYER) else to_chat(src, "You burst out of \the [wear_suit]!") unEquip(wear_suit) return else - standing = image("icon" = 'icons/mob/suit.dmi', "icon_state" = "[wear_suit.icon_state]") - + standing = mutable_appearance('icons/mob/suit.dmi', "[wear_suit.icon_state]", layer = -SUIT_LAYER) if(wear_suit.breakouttime) drop_l_hand() drop_r_hand() - if(wear_suit.blood_DNA) var/obj/item/clothing/suit/S = wear_suit var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "[S.blood_overlay_type]blood") bloodsies.color = wear_suit.blood_color - standing.overlays += bloodsies + standing.overlays += bloodsies + overlays_standing[SUIT_LAYER] = standing - overlays_standing[SUIT_LAYER] = standing - - update_tail_layer(0) - - else - overlays_standing[SUIT_LAYER] = null - - update_tail_layer(0) - + apply_overlay(SUIT_LAYER) + update_tail_layer(0) update_collar(0) - if(update_icons) update_icons() - /mob/living/carbon/human/update_inv_pockets() if(client && hud_used) var/obj/screen/inventory/inv @@ -1021,6 +909,7 @@ var/global/list/damage_icon_parts = list() /mob/living/carbon/human/update_inv_wear_mask(var/update_icons = 1) ..() + remove_overlay(FACEMASK_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_wear_mask] if(inv) @@ -1031,107 +920,94 @@ var/global/list/damage_icon_parts = list() if(head_organ.alt_head && head_organ.alt_head != "None") alternate_head = GLOB.alt_heads_list[head_organ.alt_head] - var/image/standing + var/mutable_appearance/standing var/icon/mask_icon = new(wear_mask.icon) if(wear_mask.icon_override) 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]" : ""]") + standing = mutable_appearance(wear_mask.icon_override, "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER) else if(wear_mask.sprite_sheets && wear_mask.sprite_sheets[dna.species.name]) mask_icon = new(wear_mask.sprite_sheets[dna.species.name]) - standing = image("icon" = wear_mask.sprite_sheets[dna.species.name], "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]") + standing = mutable_appearance(wear_mask.sprite_sheets[dna.species.name], "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER) else - 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]" : ""]") + standing = mutable_appearance('icons/mob/mask.dmi', "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]", layer = -FACEMASK_LAYER) if(!istype(wear_mask, /obj/item/clothing/mask/cigarette) && wear_mask.blood_DNA) var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "maskblood") bloodsies.color = wear_mask.blood_color standing.overlays += bloodsies - overlays_standing[FACEMASK_LAYER] = standing - else - overlays_standing[FACEMASK_LAYER] = null - if(update_icons) update_icons() + overlays_standing[FACEMASK_LAYER] = standing + apply_overlay(FACEMASK_LAYER) /mob/living/carbon/human/update_inv_back(var/update_icons=1) ..() + remove_overlay(BACK_LAYER) if(back) //determine the icon to use - var/icon/standing + var/mutable_appearance/standing if(back.icon_override) - standing = image("icon" = back.icon_override, "icon_state" = "[back.icon_state]") + standing = mutable_appearance(back.icon_override, "[back.icon_state]", layer = -BACK_LAYER) else if(istype(back, /obj/item/rig)) //If this is a rig and a mob_icon is set, it will take species into account in the rig update_icon() proc. var/obj/item/rig/rig = back standing = rig.mob_icon else if(back.sprite_sheets && back.sprite_sheets[dna.species.name]) - standing = image("icon" = back.sprite_sheets[dna.species.name], "icon_state" = "[back.icon_state]") + standing = mutable_appearance(back.sprite_sheets[dna.species.name], "[back.icon_state]", layer = -BACK_LAYER) else - standing = image("icon" = 'icons/mob/back.dmi', "icon_state" = "[back.icon_state]") + standing = mutable_appearance('icons/mob/back.dmi', "[back.icon_state]", layer = -BACK_LAYER) //create the image overlays_standing[BACK_LAYER] = standing - else - overlays_standing[BACK_LAYER] = null - - if(update_icons) update_icons() + apply_overlay(BACK_LAYER) /mob/living/carbon/human/update_inv_handcuffed(var/update_icons=1) - overlays_standing[HANDCUFF_LAYER] = null + remove_overlay(HANDCUFF_LAYER) if(handcuffed) if(istype(handcuffed, /obj/item/restraints/handcuffs/pinkcuffs)) - overlays_standing[HANDCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "pinkcuff1") + overlays_standing[HANDCUFF_LAYER] = mutable_appearance('icons/mob/mob.dmi', "pinkcuff1", layer = -HANDCUFF_LAYER) else - overlays_standing[HANDCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "handcuff1") - - if(update_icons) - update_icons() + overlays_standing[HANDCUFF_LAYER] = mutable_appearance('icons/mob/mob.dmi', "handcuff1", layer = -HANDCUFF_LAYER) + apply_overlay(HANDCUFF_LAYER) /mob/living/carbon/human/update_inv_legcuffed(var/update_icons=1) + remove_overlay(LEGCUFF_LAYER) clear_alert("legcuffed") if(legcuffed) - overlays_standing[LEGCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "legcuff1") + overlays_standing[LEGCUFF_LAYER] = mutable_appearance('icons/mob/mob.dmi', "legcuff1", layer = -LEGCUFF_LAYER) throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed) if(m_intent != MOVE_INTENT_WALK) m_intent = MOVE_INTENT_WALK if(hud_used && hud_used.move_intent) hud_used.move_intent.icon_state = "walking" - - else - overlays_standing[LEGCUFF_LAYER] = null - if(update_icons) - update_icons() + apply_overlay(LEGCUFF_LAYER) /mob/living/carbon/human/update_inv_r_hand(var/update_icons=1) ..() + remove_overlay(R_HAND_LAYER) if(r_hand) var/t_state = r_hand.item_state if(!t_state) t_state = r_hand.icon_state - var/image/I = image("icon" = r_hand.righthand_file, "icon_state" = "[t_state]") + var/mutable_appearance/I = mutable_appearance(r_hand.righthand_file, "[t_state]", layer = -R_HAND_LAYER) I = center_image(I, r_hand.inhand_x_dimension, r_hand.inhand_y_dimension) overlays_standing[R_HAND_LAYER] = I - else - overlays_standing[R_HAND_LAYER] = null - if(update_icons) - update_icons() + apply_overlay(R_HAND_LAYER) /mob/living/carbon/human/update_inv_l_hand(var/update_icons=1) ..() + remove_overlay(L_HAND_LAYER) if(l_hand) var/t_state = l_hand.item_state if(!t_state) t_state = l_hand.icon_state - var/image/I = image("icon" = l_hand.lefthand_file, "icon_state" = "[t_state]") + var/mutable_appearance/I = mutable_appearance(l_hand.lefthand_file, "[t_state]", layer = -L_HAND_LAYER) I = center_image(I, l_hand.inhand_x_dimension, l_hand.inhand_y_dimension) overlays_standing[L_HAND_LAYER] = I - else - overlays_standing[L_HAND_LAYER] = null - if(update_icons) - update_icons() + apply_overlay(L_HAND_LAYER) //human HUD updates for items in our inventory @@ -1157,10 +1033,11 @@ 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. */ + remove_overlay(TAIL_UNDERLIMBS_LAYER) // SEW direction icons, overlayed by LIMBS_LAYER. + remove_overlay(TAIL_LAYER) /* 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 @@ -1184,16 +1061,25 @@ var/global/list/damage_icon_parts = list() under.Insert(new/icon(accessory_s, dir=EAST), dir=EAST) under.Insert(new/icon(accessory_s, dir=WEST), dir=WEST) - overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) + var/mutable_appearance/underlimbs = mutable_appearance(under, layer = -TAIL_UNDERLIMBS_LAYER) + underlimbs.pixel_x = body_accessory.pixel_x_offset + underlimbs.pixel_y = body_accessory.pixel_y_offset + overlays_standing[TAIL_UNDERLIMBS_LAYER] = underlimbs // 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/mob/body_accessory.dmi', "icon_state" = "accessory_none_s") over.Insert(new/icon(accessory_s, dir=NORTH), dir=NORTH) - overlays_standing[TAIL_LAYER] = image(over, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) + var/mutable_appearance/tail = mutable_appearance(over, layer = -TAIL_LAYER) + tail.pixel_x = body_accessory.pixel_x_offset + tail.pixel_y = body_accessory.pixel_y_offset + overlays_standing[TAIL_LAYER] = tail 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) + var/mutable_appearance/tail = mutable_appearance(accessory_s, layer = -TAIL_LAYER) + tail.pixel_x = body_accessory.pixel_x_offset + tail.pixel_y = body_accessory.pixel_y_offset + overlays_standing[TAIL_LAYER] = tail else if(tail && dna.species.bodyflags & HAS_TAIL) //no tailless tajaran if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space)) @@ -1209,25 +1095,24 @@ var/global/list/damage_icon_parts = list() 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(under) + overlays_standing[TAIL_UNDERLIMBS_LAYER] = mutable_appearance(under, layer = -TAIL_UNDERLIMBS_LAYER) // 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(over) + overlays_standing[TAIL_LAYER] = mutable_appearance(over, layer = -TAIL_LAYER) 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) - - if(update_icons) - update_icons() - + overlays_standing[TAIL_LAYER] = mutable_appearance(tail_s, layer = -TAIL_LAYER) + apply_overlay(TAIL_LAYER) + apply_overlay(TAIL_UNDERLIMBS_LAYER) /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. */ + remove_overlay(TAIL_UNDERLIMBS_LAYER) // SEW direction icons, overlayed by LIMBS_LAYER. + remove_overlay(TAIL_LAYER) /* 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 @@ -1252,7 +1137,10 @@ var/global/list/damage_icon_parts = list() under.Insert(new/icon(accessory_s, dir=EAST), dir=EAST) under.Insert(new/icon(accessory_s, dir=WEST), dir=WEST) - overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) + var/mutable_appearance/underlimbs = mutable_appearance(under, layer = -TAIL_UNDERLIMBS_LAYER) + underlimbs.pixel_x = body_accessory.pixel_x_offset + underlimbs.pixel_y = body_accessory.pixel_y_offset + overlays_standing[TAIL_UNDERLIMBS_LAYER] = underlimbs // 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") @@ -1260,9 +1148,15 @@ var/global/list/damage_icon_parts = list() over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.species.name]_tail_delay") over.Insert(new/icon(accessory_s, dir=NORTH), dir=NORTH) - overlays_standing[TAIL_LAYER] = image(over, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) + var/mutable_appearance/tail = mutable_appearance(over, layer = -TAIL_LAYER) + tail.pixel_x = body_accessory.pixel_x_offset + tail.pixel_y = body_accessory.pixel_y_offset + overlays_standing[TAIL_LAYER] = tail 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) + var/mutable_appearance/tail = mutable_appearance(accessory_s, layer = -TAIL_LAYER) + tail.pixel_x = body_accessory.pixel_x_offset + tail.pixel_y = body_accessory.pixel_y_offset + overlays_standing[TAIL_LAYER] = tail else if(tail && dna.species.bodyflags & HAS_TAIL) var/icon/tailw_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[tail]w_s") @@ -1277,25 +1171,36 @@ var/global/list/damage_icon_parts = list() 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(under) + overlays_standing[TAIL_UNDERLIMBS_LAYER] = mutable_appearance(under, layer = -TAIL_UNDERLIMBS_LAYER) // 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" = "[dna.species.name]_tail_delay") over.Insert(new/icon(tailw_s, dir=NORTH), dir=NORTH) - overlays_standing[TAIL_LAYER] = image(over) + overlays_standing[TAIL_LAYER] = mutable_appearance(over, layer = -TAIL_LAYER) 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) - - if(update_icons) - update_icons() + overlays_standing[TAIL_LAYER] = mutable_appearance(tailw_s, layer = -TAIL_LAYER) + apply_overlay(TAIL_LAYER) + apply_overlay(TAIL_UNDERLIMBS_LAYER) /mob/living/carbon/human/proc/stop_tail_wagging(var/update_icons=1) - overlays_standing[TAIL_UNDERLIMBS_LAYER] = null - overlays_standing[TAIL_LAYER] = null - + remove_overlay(TAIL_UNDERLIMBS_LAYER) + remove_overlay(TAIL_LAYER) update_tail_layer(update_icons) //just trigger a full update for normal stationary sprites +/mob/living/carbon/human/proc/update_int_organs() + remove_overlay(INTORGAN_LAYER) + + var/list/standing = list() + for(var/organ in internal_organs) + var/obj/item/organ/internal/I = organ + var/render = I.render() + if(render) + standing += render + + overlays_standing[INTORGAN_LAYER] = standing + apply_overlay(INTORGAN_LAYER) + /mob/living/carbon/human/handle_transform_change() ..() update_tail_layer() @@ -1304,8 +1209,9 @@ var/global/list/damage_icon_parts = list() // Suit needs an identically named sprite in icons/mob/collar.dmi // For suits with species_fit and sprite_sheets, an identically named sprite needs to exist in a file like this icons/mob/species/[species_name_here]/collar.dmi. /mob/living/carbon/human/proc/update_collar(var/update_icons=1) + remove_overlay(COLLAR_LAYER) var/icon/C = new('icons/mob/collar.dmi') - var/image/standing = null + var/mutable_appearance/standing = null if(wear_suit) if(wear_suit.icon_override) @@ -1314,28 +1220,39 @@ var/global/list/damage_icon_parts = list() if(fexists(icon_path)) //Just ensuring the nonexistance of a file with the above path won't cause a runtime. 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]") + standing = mutable_appearance(icon_file, "[wear_suit.icon_state]", layer = -COLLAR_LAYER) else if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[dna.species.name]) var/icon_path = "[wear_suit.sprite_sheets[dna.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). if(fexists(icon_path)) //Just ensuring the nonexistance of a file with the above path won't cause a runtime. 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]") + standing = mutable_appearance(icon_file, "[wear_suit.icon_state]", layer = -COLLAR_LAYER) else if(wear_suit.icon_state in C.IconStates()) - standing = image("icon" = C, "icon_state" = "[wear_suit.icon_state]") + standing = mutable_appearance(C, "[wear_suit.icon_state]", layer = -COLLAR_LAYER) - overlays_standing[COLLAR_LAYER] = standing - - if(update_icons) update_icons() + overlays_standing[COLLAR_LAYER] = standing + apply_overlay(COLLAR_LAYER) /mob/living/carbon/human/proc/update_misc_effects() - misc_effect_overlays.Cut() + remove_overlay(MISC_LAYER) //Begin appending miscellaneous effects. if(eyes_shine()) - misc_effect_overlays += get_eye_shine() //Image layer is specified in get_eye_shine() proc as LIGHTING_LAYER + 1. + overlays_standing[MISC_LAYER] = get_eye_shine() //Image layer is specified in get_eye_shine() proc as LIGHTING_LAYER + 1. + + apply_overlay(MISC_LAYER) + +/mob/living/carbon/human/admin_Freeze(client/admin, skip_overlays = TRUE) + . = ..() + overlays_standing[FROZEN_LAYER] = mutable_appearance(frozen, layer = -FROZEN_LAYER) + apply_overlay(FROZEN_LAYER) + +/mob/living/carbon/human/admin_unFreeze(client/admin, skip_overlays = TRUE) + . = ..() + remove_overlay(FROZEN_LAYER) + /mob/living/carbon/human/proc/force_update_limbs() for(var/obj/item/organ/external/O in bodyparts) @@ -1350,3 +1267,40 @@ var/global/list/damage_icon_parts = list() continue out += overlays_standing[i] return out + +/mob/living/carbon/human/proc/generate_icon_render_key() + var/husk = (HUSK in mutations) + var/fat = (FAT in mutations) + var/hulk = (HULK in mutations) + var/skeleton = (SKELETON in mutations) + + . = "" + + var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes) + if(eyes) + . += "[eyes.eye_colour]" + else + . += "#000000" + + for(var/organ_tag in dna.species.has_limbs) + var/obj/item/organ/external/part = bodyparts_by_name[organ_tag] + if(isnull(part)) + . += "0" + else if(part.is_robotic()) + . += "2[part.model ? "-[part.model]" : ""]" + else if(part.status & ORGAN_DEAD) + . += "3" + else + . += "1" + + if(part) + var/datum/species/S = GLOB.all_species[part.dna.species.name] + . += "[S.race_key]" + . += "[part.dna.GetUIState(DNA_UI_GENDER)]" + . += "[part.dna.GetUIValue(DNA_UI_SKIN_TONE)]" + if(part.s_col) + . += "[part.s_col]" + if(part.s_tone) + . += "[part.s_tone]" + + . = "[.][!!husk][!!fat][!!hulk][!!skeleton]" \ No newline at end of file diff --git a/code/modules/mob/living/carbon/slime/life.dm b/code/modules/mob/living/carbon/slime/life.dm index 2f2c05c9452..649ec7b3f00 100644 --- a/code/modules/mob/living/carbon/slime/life.dm +++ b/code/modules/mob/living/carbon/slime/life.dm @@ -218,15 +218,8 @@ if(src.eye_blind) src.SetEyeBlind(0) - if(src.ear_deaf > 0) SetEarDeaf(0) - if(src.ear_damage < 25) - SetEarDamage(0) - src.density = !( src.lying ) - if(src.disabilities & DEAF) - EarDeaf(1) - if(src.eye_blurry > 0) SetEyeBlurry(0) diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm index be25de1ac14..914c810da27 100644 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -489,4 +489,7 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 if(istype(toEat, /obj/item/reagent_containers/food/drinks)) return 1 to_chat(user, "This creature does not seem to have a mouth!") - return 0 \ No newline at end of file + return 0 + +/mob/living/carbon/slime/can_hear() + . = TRUE //honestly fuck slimes and organ bullshit \ No newline at end of file diff --git a/code/modules/mob/living/carbon/update_status.dm b/code/modules/mob/living/carbon/update_status.dm index 63d34788a98..22030c78f4b 100644 --- a/code/modules/mob/living/carbon/update_status.dm +++ b/code/modules/mob/living/carbon/update_status.dm @@ -27,3 +27,9 @@ setStaminaLoss(health - 2) handle_hud_icons_health() return + +/mob/living/carbon/can_hear() + . = FALSE + var/obj/item/organ/internal/ears/ears = get_int_organ(/obj/item/organ/internal/ears) + if(istype(ears) && !ears.deaf) + . = TRUE \ No newline at end of file diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 032f46d42dd..d365f30d7d0 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -170,15 +170,6 @@ else if(eye_blurry) //blurry eyes heal slowly AdjustEyeBlurry(-1) - //Ears - if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own - EarDeaf(1) - else - // deafness heals slowly over time, unless ear_damage is over 100 - if(ear_damage < 100) - AdjustEarDamage(-0.05) - AdjustEarDeaf(-1) - //this handles hud updates. Calls update_vision() and handle_hud_icons() /mob/living/proc/handle_regular_hud_updates() if(!client) return 0 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 2a384dec214..bf49d5b2598 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -404,8 +404,7 @@ CureNervous() SetEyeBlind(0) SetEyeBlurry(0) - SetEarDamage(0) - SetEarDeaf(0) + RestoreEars() heal_overall_damage(1000, 1000) ExtinguishMob() fire_stacks = 0 diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index b667dbd15bd..e5bc8582de8 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -330,9 +330,5 @@ return 1 /////////////////////////////////// EAR DAMAGE //////////////////////////////////// - -/mob/living/silicon/SetEarDamage() - return - -/mob/living/silicon/SetEarDeaf() - return +/mob/living/silicon/can_hear() + . = TRUE \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 046d55c4566..df3f185dad4 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -578,9 +578,5 @@ if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. return -/mob/living/simple_animal/SetEarDamage() - return - -/mob/living/simple_animal/SetEarDeaf() - return - +/mob/living/simple_animal/can_hear() + . = TRUE \ No newline at end of file diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index e9253f78d59..4e5c778b7fb 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -43,10 +43,6 @@ 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 * @@ -115,8 +111,6 @@ 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 @@ -233,30 +227,6 @@ var/new_value = directional_bounded_sum(druggy, amount, bound_lower, bound_upper) return SetDruggy(new_value, updating) -// 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, updating = TRUE) diff --git a/code/modules/mob/living/update_status.dm b/code/modules/mob/living/update_status.dm index 40d4cdc9cb2..94769baf94b 100644 --- a/code/modules/mob/living/update_status.dm +++ b/code/modules/mob/living/update_status.dm @@ -41,7 +41,7 @@ // Whether the mob can hear things /mob/living/can_hear() - return !(ear_deaf || (disabilities & DEAF)) + . = !(disabilities & DEAF) // Whether the mob is able to see // `information_only` is for stuff that's purely informational - like understanding nonverbal languages, or blindness overlays @@ -137,10 +137,6 @@ SetEyeBlind(eye_blind) if("eye_blurry") SetEyeBlurry(eye_blurry) - if("ear_deaf") - SetEarDeaf(ear_deaf) - if("ear_damage") - SetEarDamage(ear_damage) if("druggy") SetDruggy(druggy) if("maxHealth") diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index bdf93fbd4eb..8beb5352b6a 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -48,7 +48,7 @@ var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations // Restrict some styles to specific species - var/list/species_allowed = list("Human", "Slime People") + var/list/species_allowed = list("Human", "Felinid", "Slime People") 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. @@ -75,7 +75,7 @@ /datum/sprite_accessory/hair/bald name = "Bald" icon_state = "bald" - species_allowed = list("Human", "Unathi", "Vox", "Diona", "Kidan", "Grey", "Plasmaman", "Skeleton", "Vulpkanin", "Tajaran") + species_allowed = list("Human", "Felinid", "Unathi", "Vox", "Diona", "Kidan", "Grey", "Plasmaman", "Skeleton", "Vulpkanin", "Tajaran") glasses_over = 1 /datum/sprite_accessory/hair/short @@ -169,7 +169,7 @@ name = "Pompadour" icon_state = "hair_pompadour" gender = MALE - species_allowed = list("Human", "Slime People", "Unathi") + species_allowed = list("Human", "Felinid", "Slime People", "Unathi") glasses_over = 1 /datum/sprite_accessory/hair/quiff @@ -194,19 +194,19 @@ name = "Beehive" icon_state = "hair_beehive" gender = FEMALE - species_allowed = list("Human", "Slime People", "Unathi") + species_allowed = list("Human", "Felinid", "Slime People", "Unathi") /datum/sprite_accessory/hair/bobcurl name = "Bobcurl" icon_state = "hair_bobcurl" gender = FEMALE - species_allowed = list("Human", "Slime People", "Unathi") + species_allowed = list("Human", "Felinid", "Slime People", "Unathi") /datum/sprite_accessory/hair/bob name = "Bob" icon_state = "hair_bobcut" gender = FEMALE - species_allowed = list("Human", "Slime People", "Unathi") + species_allowed = list("Human", "Felinid", "Slime People", "Unathi") /datum/sprite_accessory/hair/bowl name = "Bowl" @@ -234,7 +234,7 @@ name = "Buzzcut" icon_state = "hair_buzzcut" gender = MALE - species_allowed = list("Human", "Slime People", "Unathi") + species_allowed = list("Human", "Felinid", "Slime People", "Unathi") glasses_over = 1 /datum/sprite_accessory/hair/crew @@ -303,7 +303,7 @@ /datum/sprite_accessory/hair/mohawk name = "Mohawk" icon_state = "hair_d" - species_allowed = list("Human", "Slime People", "Unathi") + species_allowed = list("Human", "Felinid", "Slime People", "Unathi") glasses_over = 1 /datum/sprite_accessory/hair/jensen @@ -338,7 +338,7 @@ /datum/sprite_accessory/hair/spiky name = "Spiky" icon_state = "hair_spikey" - species_allowed = list("Human", "Slime People", "Unathi") + species_allowed = list("Human", "Felinid", "Slime People", "Unathi") glasses_over = 1 /datum/sprite_accessory/hair/kusanagi @@ -1535,7 +1535,7 @@ name = "Shaved" icon_state = "bald" gender = NEUTER - species_allowed = list("Human", "Unathi", "Tajaran", "Skrell", "Vox", "Diona", "Kidan", "Greys", "Vulpkanin", "Slime People") + species_allowed = list("Human", "Felinid", "Unathi", "Tajaran", "Skrell", "Vox", "Diona", "Kidan", "Greys", "Vulpkanin", "Slime People") /datum/sprite_accessory/facial_hair/watson name = "Watson Mustache" @@ -1576,7 +1576,7 @@ /datum/sprite_accessory/facial_hair/elvis name = "Elvis Sideburns" icon_state = "facial_elvis" - species_allowed = list("Human", "Slime People", "Unathi") + species_allowed = list("Human", "Felinid", "Slime People", "Unathi") /datum/sprite_accessory/facial_hair/abe name = "Abraham Lincoln Beard" @@ -1813,7 +1813,7 @@ /datum/sprite_accessory/skin/human name = "Default human skin" icon_state = "default" - species_allowed = list("Human") + species_allowed = list("Human", "Felinid") /datum/sprite_accessory/skin/human/human_tatt01 name = "Tatt01 human skin" @@ -1848,13 +1848,13 @@ /////////////////////////// /datum/sprite_accessory/underwear icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask") + species_allowed = list("Human", "Felinid", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask") gender = NEUTER /datum/sprite_accessory/underwear/nude name = "Nude" icon_state = null - species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox") + species_allowed = list("Human", "Felinid", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox") /datum/sprite_accessory/underwear/male gender = MALE @@ -1974,13 +1974,13 @@ //////////////////////////// /datum/sprite_accessory/undershirt icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask") + species_allowed = list("Human", "Felinid", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask") gender = NEUTER /datum/sprite_accessory/undershirt/nude name = "Nude" icon_state = null - species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox") + species_allowed = list("Human", "Felinid", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox") //plain color shirts /datum/sprite_accessory/undershirt/shirt_white @@ -2210,13 +2210,13 @@ /////////////////////// /datum/sprite_accessory/socks icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask") + species_allowed = list("Human", "Felinid", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask") gender = NEUTER /datum/sprite_accessory/socks/nude name = "Nude" icon_state = null - species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox") + species_allowed = list("Human", "Felinid", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox") /datum/sprite_accessory/socks/white_norm name = "Normal White" @@ -2342,7 +2342,7 @@ /datum/sprite_accessory/head_accessory/none name = "None" - species_allowed = list("Human", "Unathi", "Diona", "Grey", "Kidan", "Machine", "Tajaran", "Vulpkanin", "Skrell", "Slime People", "Skeleton", "Vox") + species_allowed = list("Human", "Felinid", "Unathi", "Diona", "Grey", "Kidan", "Machine", "Tajaran", "Vulpkanin", "Skrell", "Slime People", "Skeleton", "Vox") icon_state = "accessory_none" /datum/sprite_accessory/head_accessory/unathi @@ -2595,7 +2595,7 @@ /datum/sprite_accessory/body_markings/none name = "None" - species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Skrell", "Slime People", "Skeleton", "Vox", "Kidan") + species_allowed = list("Human", "Felinid", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Skrell", "Slime People", "Skeleton", "Vox", "Kidan") icon_state = "accessory_none" /datum/sprite_accessory/body_markings/tiger @@ -2863,7 +2863,7 @@ 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 - species_allowed = list("Human", "Unathi", "Vulpkanin", "Tajaran", "Skrell") + species_allowed = list("Human", "Felinid", "Unathi", "Vulpkanin", "Tajaran", "Skrell") icon_state = "accessory_none" /datum/sprite_accessory/body_markings/tattoo/elliot @@ -2873,7 +2873,7 @@ /datum/sprite_accessory/body_markings/tattoo/tiger_body name = "Tiger-stripe Tattoo" - species_allowed = list("Human", "Unathi", "Vulpkanin", "Tajaran", "Skrell") + species_allowed = list("Human", "Felinid", "Unathi", "Vulpkanin", "Tajaran", "Skrell") icon_state = "markings_tiger" /datum/sprite_accessory/body_markings/tattoo/heart diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm index 4cbbe9c51c9..f6e6e07673f 100644 --- a/code/modules/mob/status_procs.dm +++ b/code/modules/mob/status_procs.dm @@ -52,23 +52,13 @@ return -/mob/proc/EarDamage() - return - -/mob/proc/SetEarDamage() +/mob/proc/RestoreEars() return /mob/proc/AdjustEarDamage() return - -/mob/proc/EarDeaf() - return - -/mob/proc/SetEarDeaf() - return - -/mob/proc/AdjustEarDeaf() +/mob/proc/MinimumDeafTicks() return diff --git a/code/modules/mob/update_status.dm b/code/modules/mob/update_status.dm index 52a6fb7769d..446c2aaed8f 100644 --- a/code/modules/mob/update_status.dm +++ b/code/modules/mob/update_status.dm @@ -35,7 +35,7 @@ // Procs that give information about the status of the mob /mob/proc/can_hear() - return 1 + . = 1 /mob/proc/has_vision(information_only = FALSE) return 1 diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm index 7007643e652..7a211780446 100644 --- a/code/modules/reagents/chemistry/reagents/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -543,21 +543,23 @@ /datum/reagent/medicine/oculine/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE if(prob(80)) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) + if(iscarbon(M)) + var/mob/living/carbon/C = M + var/obj/item/organ/internal/eyes/E = C.get_int_organ(/obj/item/organ/internal/eyes) if(istype(E)) E.heal_internal_damage(1) + var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears) + if(istype(ears)) + ears.AdjustEarDamage(-1) + if(ears.ear_damage < 25 && prob(30)) + ears.deaf = 0 update_flags |= M.AdjustEyeBlurry(-1, FALSE) - update_flags |= M.AdjustEarDamage(-1, FALSE) + update_flags |= M.AdjustEarDamage(-1) if(prob(50)) update_flags |= M.CureNearsighted(FALSE) if(prob(30)) update_flags |= M.CureBlind(FALSE) update_flags |= M.SetEyeBlind(0, FALSE) - if(M.ear_damage <= 25) - if(prob(30)) - M.SetEarDeaf(0) return ..() | update_flags /datum/reagent/medicine/atropine diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 7dcdd1e81b6..8739acc9664 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -283,16 +283,19 @@ datum/chemical_reaction/flash_powder if(!ear_safety) M.Stun(max(10/distance, 3)) M.Weaken(max(10/distance, 3)) - 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 - 5)) - to_chat(M, "You can't hear anything!") - M.disabilities |= DEAF - else - if(M.ear_damage >= 5) - to_chat(M, "Your ears start to ring!") + M.AdjustEarDamage(rand(0, 5), 15) + if(iscarbon(M)) + var/mob/living/carbon/C = M + var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears) + if(istype(ears)) + if(ears.ear_damage >= 15) + to_chat(M, "Your ears start to ring badly!") + if(prob(ears.ear_damage - 5)) + to_chat(M, "You can't hear anything!") + M.BecomeDeaf() + else + if(ears.ear_damage >= 5) + to_chat(M, "Your ears start to ring!") holder.remove_reagent("sonic_powder", created_volume) /datum/chemical_reaction/sonic_powder_deafen @@ -318,16 +321,20 @@ datum/chemical_reaction/flash_powder if(!ear_safety) M.Stun(max(10/distance, 3)) M.Weaken(max(10/distance, 3)) - 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 - 5)) - to_chat(M, "You can't hear anything!") - M.BecomeDeaf() - else - if(M.ear_damage >= 5) - to_chat(M, "Your ears start to ring!") + M.AdjustEarDamage(rand(0, 5), 15) + if(iscarbon(M)) + var/mob/living/carbon/C = M + var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears) + if(istype(ears)) + if(ears.ear_damage >= 15) + to_chat(M, "Your ears start to ring badly!") + if(prob(ears.ear_damage - 5)) + to_chat(M, "You can't hear anything!") + M.BecomeDeaf() + else + if(ears.ear_damage >= 5) + to_chat(M, "Your ears start to ring!") + /datum/chemical_reaction/phlogiston name = "phlogiston" diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm new file mode 100644 index 00000000000..20179905f23 --- /dev/null +++ b/code/modules/surgery/organs/ears.dm @@ -0,0 +1,76 @@ +/obj/item/organ/internal/ears + name = "ears" + icon_state = "ears" + gender = PLURAL + organ_tag = "ears" + parent_organ = "head" + slot = "ears" + + // `deaf` measures "ticks" of deafness. While > 0, the person is deaf. + var/deaf = 0 + + // `ear_damage` measures long term damage to the ears, if too high, + // the person will not have either `deaf` or `ear_damage` decrease + // without external aid (earmuffs, drugs) + var/ear_damage = 0 + +/obj/item/organ/internal/ears/on_life() + if(!iscarbon(owner)) + return + var/mob/living/carbon/C = owner + // genetic deafness prevents the body from using the ears, even if healthy + if(C.disabilities & DEAF) + deaf = max(deaf, 1) + else + if(ishuman(C)) + var/mob/living/carbon/human/H = C + if((H.l_ear && H.l_ear.flags_2 & HEALS_EARS_2) || (H.r_ear && H.r_ear.flags_2 & HEALS_EARS_2)) + deaf = max(deaf - 1, 1) + ear_damage = max(ear_damage - 0.10, 0) + // if higher than UNHEALING_EAR_DAMAGE, no natural healing occurs. + if(ear_damage < UNHEALING_EAR_DAMAGE) + ear_damage = max(ear_damage - 0.05, 0) + deaf = max(deaf - 1, 0) + +/obj/item/organ/internal/ears/proc/RestoreEars() + deaf = 0 + ear_damage = 0 + + var/mob/living/carbon/C = owner + if(istype(C) && C.disabilities & DEAF) + deaf = 1 + +/obj/item/organ/internal/ears/proc/AdjustEarDamage(ddmg, ddeaf) + ear_damage = max(ear_damage + ddmg, 0) + deaf = max(deaf + ddeaf, 0) + +/obj/item/organ/internal/ears/proc/MinimumDeafTicks(value) + deaf = max(deaf, value) + +// Mob procs +/mob/living/carbon/RestoreEars() + var/obj/item/organ/internal/ears/ears = get_int_organ(/obj/item/organ/internal/ears) + if(ears) + ears.RestoreEars() + +/mob/living/carbon/AdjustEarDamage(ddmg, ddeaf) + var/obj/item/organ/internal/ears/ears = get_int_organ(/obj/item/organ/internal/ears) + if(ears) + ears.AdjustEarDamage(ddmg, ddeaf) + +/mob/living/carbon/MinimumDeafTicks(value) + var/obj/item/organ/internal/ears/ears = get_int_organ(/obj/item/organ/internal/ears) + if(ears) + ears.MinimumDeafTicks(value) + + +// Kitty ears!! +/obj/item/organ/internal/ears/cat + name = "cat ears" + icon = 'icons/obj/clothing/hats.dmi' + icon_state = "kitty" + color = "#aa4444" + transform = matrix(0.7, 0, 0, 0, 0.7, 0) + +/obj/item/organ/internal/ears/cat/render() + . = mutable_appearance('icons/mob/head.dmi', "kitty", layer = -HEAD_ACC_OVER_LAYER) \ No newline at end of file diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 4858435cc5f..2dbf85a3b45 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -64,6 +64,7 @@ log_runtime(EXCEPTION("[src] attempted to remove from a [parent_organ], but [parent_organ] didn't exist! [atom_loc_line(M)]"), src) else parent.internal_organs -= src + H.update_int_organs() for(var/X in actions) var/datum/action/A = X @@ -105,6 +106,10 @@ insert(H) return 1 +// Rendering! +/obj/item/organ/internal/proc/render() + return + /obj/item/reagent_containers/food/snacks/organ name = "appendix" icon_state = "appendix" @@ -247,7 +252,7 @@ to_chat(owner, "HONK") owner.SetSleeping(0) owner.Stuttering(20) - owner.AdjustEarDeaf(30) + owner.MinimumDeafTicks(30) owner.Weaken(3) owner << 'sound/items/AirHorn.ogg' if(prob(30)) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index c13c4da83f6..eedcb52be00 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -122,7 +122,7 @@ var/static/regex/multispin_words = regex("like a record baby") var/mob/living/list/listeners = list() for(var/mob/living/L in get_mobs_in_view(8, owner, TRUE)) - if(!L.ear_deaf && !L.null_rod_check() && L != owner && L.stat != DEAD) + if(L.can_hear() && !L.null_rod_check() && L != owner && L.stat != DEAD) if(ishuman(L)) var/mob/living/carbon/human/H = L if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs)) diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 6a2114514665b92cd19c24006c1bdcafeeda5df9..4ff367c4cc399dbc73ab2ede199eb0400289aa19 100644 GIT binary patch delta 17424 zcmbTdWmr{D^e?_?kPhia2}$Wr0g)CJDFNy3j(upQ5v02X3F+>V?nY8Nr4RMreD8Cg z|C`^vFYb$T=FHw_&&*!4X3b}<`K;zt#Lz6n=w}EDzn%*qk@s$Ykt`<3<6P^#33K=G zTDnKf-1`)M!B>k|>4?;z09K#WR&Y|$Kf@#FAV4PIH^g#4Na7uaJ?W=qe({2VD}XID zQVOw9W>j7BE9Mgp9>Fi@yG&oupJb1c>9!Z5`ys2*2C^Be3e(-(-ES|xaVZelDJk+4 zYTeo?Xech)YkoiFvMhX=u9Nm$?tPQK>;CL70ER1m1-LD_Xf|4?tApY=9Ay5iB;E+A z1BBIlJ&giJdWP2G@j(LhZP8WwleWheBNUjI>=s`h22fWh$GQYMeRp*;&gy``L zMm7ML;9pVS6%)375X2o$vzmZA>@c2r?dQ8LXzJ+q`)gIQebPAcZU{q=gvkW}5pulj zX4!EqigK`-PhKVV2h}s5Z!Qkx+z`@DyP)VC_}lIH zvu&q7z55VH2eruz$g^!T_^{I!h>x0zdOKKJ7G0&MjK#5N*#Fy5sO+^nUTI&uQB2_Q zlXvtIzas!+maV%Evk2`w1#I9BOujNp-|~X*9@Ip3OYrSJAC95L0<;XD3JS%y7Q=4h zS6}|zoe;sf{qD8;Q!vfpfj6wRb!w#K>D~|9CHjc?CF(P?pASA1wz%+0LA%LaG&RKa zLw_gELnLaX$?+rfi7ujgB~@&num{xDH}>lTzkj!b=QH|8_&sK!^Qt;83y#>4redpA zIZ_{-IB?--iiW0p>*IzOrI9~-`ig%y@Z7l-#K`EPJETxy@iWvr- zdu2}+0iE;izbs)A>vpl+&JVnn7Y_O2z%#H=uYb!-X@>0JD4EY{cCp@R4ALF09=3aG z*F$iT<=z(&390)Usg(EZJ;-yZPkK5XJNsZlZJXwe`9b1_v-2J-e0rI2ROZ}BIP%Bw zm5NWxpM8#CqtT;ZDQx-74?H$n1v5wjIgkj(a^#6#yui-CvvTJzEmCT8TYf;ji`6Rp zL>j5rD2{&vT)*6A<`%hJYk6j&pH+D#A_LA-&QVa}{ z!Spg7ua_IoG4>o%{Em@VabC&F{-Ob`AKD_-bL8mg=%g;*M4vV5WRzn=E!xwQaOfIb z9(m+1-MTS}1$Bnt8qM<#sGc+Vj5EarB}-xy7{LWT0NWi*ab^oFE9p{}3I6tmeE>#5 zh0l#^jX^u&$!V0t{g=lFZ!W-tK`SNulq8AcC24r*-ZD?&LGw2_H@7!j7!~Lh*Ujy( z-mrih!vZz5$_)@u%WlKQME~5b^CgA}Gsd)7!Y{Gje$bb5MT=uNearEo(D+q){!tBT z-TM?mBinl{J?|E2cqjWdjmB%xALWiSZj@vk1>+Pg5>z=gn<>8R0p~InsRFOO3VmSI36di*@+T zUYEp8W4F0U}L7fsaK>X31B{>?7)Pad9h#YBp`xH;*k z;d*zw)Y*f8jrMn%&vKyx0)O0d^n}yMl37l-Mr!N! zA=9X-w>;e+1u1_k1Kd`NZax9i1Vdh4juPvo(pSqc4+F4y4)!2M7&Qe|H37k_oizgZuk9Gk^E6 zDfqFL8r^CYwz|F&{>*vOO&Q-G8y!t+JK>y^SEz<_7lcVt!-}>O+oDWQ;2zX!)IrI3 z_mfEX=+=i-Yco$5P-BC~?w;Pcy<4!s!sCkc%{3Nv;lhrVz^p>L8!CZUnEJV9KG+nu zOjJtNU!P#!L00&K&(YNhxK7G%oj4`j^lxX-K#1ylj()4}nwQhl`Mt8%VI@|&aV8(W za~s(bI`q^Qoe$`5$TL`m=fPTTNsY(X%N)7_{`Mf$>{5{F7q`%_LmNOuc-eb>;?v6M ztK7ZnWZKGV{ZVaptCuB{n|I5TBnQaAMViq)Af_d z;fqu4n1!pynl=wSlx!JVcUoTy2BU7QrrZ_~j>q#00t1nMU4JpMI#Yn>9;v_sJ+Ba` zD3)+LpTt}dM+=b<7dSoNYciS{gAJo5ECsJG^>GwdPxN zv_aLu{=Rjk+iI>V+;W$&pFs}B5d5@8C-Iutez{G8-uUnVR?8hDDDdl!mxnOv+tIT( z%S?>Pwr@8QjKt_>?RURh&sSxZeVoWg@#$u0G6H)ella;rSKLMxZzHKhf-NTUwMuq= zHd-q@pD@g)h9;bKhp>MQjWn6ggJ|~5hK^v1e2~+LBl_zD-3fa@w@GpmJfh|{ZZ3yv zGN~q!CX4zlA@WahRD?D>F=|2k%n2p6i47zRL@D`MZS^F6s~GW}Mt|`vj?c(_%An)5{nw` zD)X4R>)uGJ&a<5fg^aWJ6RL`el?n;=9C8X=i+yhsTH8wbb}|@ZPgQam(VfNH(kN&Q zmNX2-Z;xeCMLovX980bGk5_}u2!HC-mV!JOVGAoaa*$fY`xfXk8h0PuWBaS6L;B8b zp^<;KL!7UiI&LzJ18(nYeMNH-hP_0`Yir}OT@?IGCa_+?p)Gc z+CwSDW_)~n7E_xYdOR&({oOm`v$?l~Z{-F5Vaffsa4`PTB0Zy&j`R&LEM$K7{=G|` z&xEO#Q_tY?f;Jg66~#Y5RpyX|TN>I`v9rS^3Ng>KZRh6I&Jd%k<5g4E#I?204nk0$ zB9IP9`M_Qk%+42VnbSZRAdmoh8DuHEPZ)fD|Ev68$l&|`zWjf$iam*-6^+~2AOhoK zVh+`D8D1+W;M2T}Pd^mCsWI$CMFlX4+3b_J@zZ3GRxvsP`o=6}1HR1ch~{%|_K;9f zu@AE{GXt3|__nj)=fUNdgXsUg3{4N$es~ zPxRW6J3BjH+RXFrFVse5OA7d7jSkg;o2jl3pY9GfBSQ79H5mU40kmw~;5!E&r`|TA z`u?+(09@sobu*PPA)PQT% z<8<@4qf)L9Y%^QBC2~B!Pq{oh8xfO)BTml?awCd;Z%=wn9QWLX<4|@P7bTo<8o^D< zcrHPVr$cIu{?&o*{~{_(aGDZ zifXHw7mnD86%gQ(vOQItwl z7!(Rm(fjm=tg8n{5-J>o^m~TXepfulQbD8ziC*xvG&S+aar(H_3+n6Z;rO@+6)9S# z7IE^mLVFhlyP`FpRI>`xwu^8(8DnBh3`cIkUSNF^Oe|(`dn_mD%sH)1nOA7;7x&4R z;kRc@dW`aC3E;PH9d#${pPD|daPDwd$B6t(xtc@?8<_s7)%lH2hfF|0Xs*I!pqPa7 zleamfXhnP|B-X8Y>}Bn3$S65}JFAg&G^9`uchRHaYq3 z`Q>>mpVhRIin8(&$_nR`-B9~Z%!d1sV~IN|NJ#q)nCb!yzJ>+Z*KN_X?*m_ zRr<4gWHODx7euP1V5ZOWxaPy#S9lnzegbZer$|`%mymLP^z?*V0u`4SrCOE2dHMN= zp`oG4i^ZCp5VBY1c<};mJP^-bf4Stg+zC2bDkgEC*b-Bbg#Am$_>%Sy{huo$^YwVC z%~$-DoG9^r$T?Hj*SB-+=4`zskdl%**j%>n#QuPx5aCY|>ikLOpTWhXOYHjzv_~=I z=eIn+!ay74m|vIc+dA2l5aQvjr&EaG+2x(8H1>vhZ=zN41votCXh<^RMyZ%dIb(#*WbxF}Pq`vVPNyO?^qEohf1nnVMyvAR{H^=_w4^nJ?2G zWh^HCkE_`IUTVE zc%vN)NN=!pEP%U(ke|^k9*Fv=SX#c&&}e1IWzq{3GKyXR^8Stmx_n=9_Go3CL5$-Q zXW3LbhIETtjO-=V6FTMKU-?>-ge&+fx7Vi$!$~~yi)9e#D+gErjj#5j;ZhSt zL^(kL5prcTEUs7292^_~SZL@IZ^B6w|1!Ge&BkEiSG62S^MglVcU~It#Y%gCJKpfr zmbXx@d_h{FBe?5^+S(a2j2VXYKKJ*;{J*}4yba>#y$rsPt{zmKz4_|JlD`g2OiZ9y z@DviM@=9b5Exvj4Cf;_TCSu8HM69DHf?A_XV5Uc3poZaNeetEWbpq&UQ&yDMOr!#`lU2 zYD(pCHeSBO&j9a*2nYz&)YM?f6{g0hwEz$~HMKtbVtrrF)^}avj`LH!&4&=U-5<-* zE&N2Dv-;~Fd3NmiOi2O}yTt=fzjh6N4@t>PO+K>y!~AH1HCT5UbTL)=gft-Qq8025 z1_Pw{^@kkUzeC>#r()jr{!i^Q-NgC^apuuT4#&+vlE?LXOB! zpFT~*BN)91GN3to!CLt-a{!)*%09cka7IA5JIni5Z&5 z^+jV72y0*Dn6g5KF-WCSR6|1p<%eOv0u)&qou@4NxEA(&Fe#1QC4kFu<8_Vk zZ-QUTdp}GD%I%Imp+_i7I`NFoe(3?g+g11;J`GLO;Zh?5Gc&rfvU1MYe7L*rdXB)A2*&Hek)=LH)#s9`@<>RN-2yAn189I!x+qzvTqH8E=rW@> zTWv++dNBXI)Ej=b<4R#K_xGXq5dXvT_P)G_Ey4t3t8WGy<4ousp1GR>FPzDEW}dyl zn>OIZ@@ML_PY3TkWM8-|CS{7kV|6l&Ed52{3{ZGP6gS83I3E-I9&THQ@kV|87P^Lh z^( z_K>45CjfL^M)e%vvgIuY5!N}R;@;mKab{sq;H+>dzVZAT$!f?$gdpt4LU?4VU{t+Q zwp};t8vNRw=J9b;m5eV}_hVmWEzn-@}?oObEx{>MK&2zr=c zWjFKa)BcUG%szkWPa>#SFadOI3>3he{)RM(UOLyzqrOlHeB7)2<6H+>#{Wvn=;sKv2JT8VmA-YUyh`90+|iDsD?3F z?rx`YQP+MtNUf{eq1NvbCi}7t=NGj!bOH*+17z33c6mt6eI%UVudMHndBR(Z!suRD z^L4%PLHg|J>{3XXP^FCufcj{tpA`$+1Ksv#4V_yGRMPr^m6l}kMKyg~U^{C<=&yi- zLa~XMv#?>09%$$i(L%M0b}eAEhn9hUD>6K~wfKms3LccD2LS|ZWzWg&oRb^7dUOnB zRKUDSJN}9>8sDz*uq%kOJUYe=39tk`^iyfL|JfpUF|MV3#|2l)Soz6(w*CaERxJ#B z?PbW?-@5A#&vB|8L9${jbB}j1mbTo}8IV896sMKAo}4|lW#r?`EMI`PhJfo zov(??D~+zAN6YJ5@?F*cV?SnXMrJWF8)Sdp1)-_=HXKrG(<_}9! zVE!QzIQGs_J9T$hmst5r8518v%30-w+fNDSrXl!r`TD~+8K9K%5<$L2EHZbjb7h?( zFn&|mfsD45j5^T;XSM7?Mrm)WOR2ZUtQJz;?9!mQQOyLA4+J9T-LECvxsUt7wq#WY zYe;>`P3t~%gk~776rL=>WFArrcJh15-Tx2Y?$e;r3jGR8t zJ^ieGelT@$>XY$alN#CRe4BU-iCtOpB+vBS6fXlW8?l4T#Y%GSVV(CJu2yekXKxt| zW9t|VSwo(*V`RJ`M|4aUVHG+1#E#9x=4Ot_#B?rv=4r|+LPQvyzOyS5&+@*mtu(BC za(@~ujitE1+@GoKim%Nu8B+(vPPP{AztG^^eR;Wl|0O?PyNY*)?&vf1Vbc~4AgN*W z)b&<$*&o~xaweQ6_Ehg#sB%b%vPDMtB$y)CN z0oPAW!;~Fh?Z^l+@3!|tlTtDm2kR6{iWZN*k>}{XPVqr7*vXfE_gw~jNw~3)@#p}c z23!k?{G*t!B+H@;&L1rA6Ngp-xtZ_0nXx~m1(CV1Dm-lr3F|;^S`H?oog&5qIZWR) z%S@LLCMT!Y-BrZt8)_s*P!e9KYkvwzp7(UNOH26W{DTYfSx`&j)5<%M^Gvo|-8i9D zB@f9S$gKK_MOFgtDQunNM!W*is#ZReEVhzdbE!W*7efhd zKR&^3J2F#U`RvOTpZjF{dnL*5+9MOP6JbA+{tu_?uZMaU&4#~XY!W6*FQ*uv*HDe? zi?=o1kDlP{=&X&@-r?8Ro2}5ije4qq>DTK9U-UnB zM?CxYTB<_L)QK^rBsG?NSS3rjNng1HGm&PEVdMD%KdxQa2j%=?S?Lw$fBiy=PH^jC z{ukSbHJ*h7qeF!J&m60dnw6+*wfH;516de*p|c-5WseUlgRdP0{N4;5wSdIgikbl@ zh?0Mf9ADIeoV~*%e@K)HB5e~=Xhx^wesKQgGqy`6C5b|`a#Ri7b8^DO#*lSU;E8f;n&k0w{zh%HE>4%V_Bj7Bp;l7$86gYPb@)1%-_~qfFK)Gf3?$#eru*d^6J&Am84Wk((H|9$lP$#P57Q7!77}3M@yFN zb4E7HDKV0x+Jxuh_2BXJQkeLe)$q;2;$nFzDGvCV1kPuJDc!}~-_eI){OeB#hs8aRVYfX@K{OBSs+ZQaN;~)ZLT43E>V^1_3c0bon19PU zcVHh3Vwv-Zu<%v$6~?^s^Y+MVLC^{UTU;fuP4`=TIzD0!D8;_rFo1TpkCXN__ZzL& zMBF&TMt<$$g~gaXPgmaqh@+E&=nr$w=zyBGb|^|r%%eV^DPoUh3?mFd7FPXk2nw8a zc}y)^}UbV0AcI(~A3^K-Z+`4i;n7BrT7~ zt7cZr3Tf3-t%lR#!6H!2wGnPK!4UsxQ*n!lINhgo0{XxKR-!=A?;o5I!a3`oyEj!H zECa5|u*f8TC#cvZuNNj+3`B9-{dsS-9Y)z83dfv5rY#yV2&|5rTew{{1B&dua{uNl zQe%^U`;?4uMK0?{DL*(u0V+^m2G1FtkI6@o`ndA0!z<6DFbNNR0)up2&=BFeGnUe* zP!Y13%sqJz$8S*aES+F3`azGo?-(=|moh?f)cn~MoSZ%i2Sx9*kH;~ie&zQtQi_>w zx0aSPhZpUVhg0&SKkt?WV3;Tg`*Tf2v*&hr`2o>+-@m1z8YhDQqU63=tfg=z*0`zu zL?I#9;i(m+dvju(;XGR51s=Xxc0Pu-aBXC|latZiRe1E-{%~)PkN5=sSfiH%{E+C@2ud`SKU+SR=(TrXQo@!AL!{ z-?+#4maSN)%O}!G+>0V!1p07O{R1S!0nCb4Ib|DcR9&A~bAK8d^Nenf8ze;(#gXf0 zr%p7Ci#K1U0tV6yUzFzCVU9>#;_ZG&> zTI*sF`Y-J8N=G&S4jvrb?)zjx7;&5g$QkiYEALYq3%o9dhAz0Q_4h4-1!^HvQU;N& zcNSe1xK_-3`K(BXN9y-2dPgE80m4wuclCMK2;6*rFCujBq%Y#T-##SHV?2w@+~m>! zE(ymP;rcC8T&(EW&8W&P;eX7Q`q=TumqmuY>7$btkz3*{M7_5jFJ!#S3R{U##3!W;~CWTR%T34f4Nms10E- zE4j@4W52V*K0I)QzjcA;;|t@b@Xw>s_*WN7l~?4v#>m)4wCK3q2M>5N-?#TOSaer2 zSkVWLv#^9(Ya?pmq?4EOcBt*Gfj%4l}X@8 zTu`mPSYC<}62l0lMXzOmE&;($5?e2cArEs%%~N!eJWI9H-IbV<+^>-O%}esxVYRVXDaeqpT$SPsuXArfN$BLYr!%xXagn?%esN zOnkCtRvwnQHcrUy$GXS^W0vn436EXxH1*$@Y1r0d=ymX-<2;epU2Y+bjr$^t%lR%> zDfegzPUUdEu`mm@^VE0#{6|{^7_COE=o2`dd3LFbkb=!6!hn_pI98Fr4{u93PblCp zyz{)2){;f(?`Ku}pzdecOpOQI*ei``CV1v^G<}3+Cg+p(zUWYQ$2BGS2Xwd_b5R{+n3kZ%-OgPU&JM7&in5)*KZg6bJPvwW5NsgdmV(i>GKB0 zldexj##>&yb#NfDxmQ!aMy|;(oFFQUzu!BG<0{QS|9ftARt;@GGByV$$Rv6lqdcv2 zb=w3`&j>(rJhANA9p)1d--8Y}mIsIKpER}haGK`3){zl;hk*n%E}?Zi+v|S-G={>$ zmiZffXs|9WE&!~dLAZOkbv!YdHj10=eP2H6YN`6y=ad$IoNMw$lGB8&x!X!u$X(aL z8#?%^M|IZF8}26-`x4s~<*6b=$qYkTJ>t9rW7 zPn+HSefPpUV^U2C{l^&8Y=p(zaG}Z^^HHJM@du`vm)w`fHg4j$|J@5`6+N9;V%3-5 z?psN9(M^3CB;2Sw9EcSS**#_TT^d?S8&enAQ>5*q=*I{cqELktDB^hqb50xX{~NlA z_TSlI-Sf@#UY40?bX6)_DdkLLDM2dDZH6=BMHA6n*6-bvXCZaawWk)-1-y#yICz}T z-%M)>!a*NPN(M~{P9o@3a+Nn#Y$J=I$wV+P@2-mR$ys~~lGh_CsiUNvmw1SR)ys|A zf91(zZ>u0b^T}(j4qqsw{=ZKyu>&A7)Bi|cItD~fSg4Tc1S&{r^}=_hd-b(+SKUty zfl@VMe|r*U#AiQ)UuYtgdQ#@%a=1=$69lrZ;-kJM@uF~y?9A$)f{BQd&ZhNz#t+mM z>;^pYn0=(d0D`B1dHu6ftW0h_$*uAy{FA&C!nnwW60Q;s8>*r#RbzyD+~=2c+FVbipDP`anCP~<7aVnn!POM0dCS0?Chv}_v&n9p z<8!MX%J|I2Jz}^7sc#z1{7~ANfAZFd+JZ1o_h}Ur|F=K(IofvP=slWP-d`&cM7(}d*IM2cv*~cPp3x=ErB)Xo&-nP~=ZM+7!IwqEJ#zcp zk~)Xn-|I-5tFtxtP`efwj)pJvBTqjM*)2}Q#>W32H;fZ^!rPI6Q!P!@I6pdcNj$8h zM()mv$yV@AIp%I_j2e`+fGxhsRIR&7${ec2+2nYYmxHarZpYUeNk9`vieot7CVI!% zt%aY+w>2KWHx#RlD9uN=O+bta6hb%?GRnv(D0I)Bk;cTtpkquG>PlY=3fdt|RPi!6 z_5r$M0;r(=6=1oyd-A8prcf{=>Kma@-5jSRc;RT@iG&r*6qG`%f0XesC3G%OP~y&s zyd)jmIb(*Htlfj2ocT-IT#~D}$vb^&(oWXs)RtG^p$N0Spl9Buh(cuHE0gZva90(} ztaEy5a@vl^TC3}T#f$Njut;Y%ir1zBRdqj1FSmh<422uK$^(-SgPoG_&+h6<qLebjJj-5gK;%ihb8+cxr`X|p~};d0M&Hf=q_ zjy+28i+}B{2!&>7!7J)F>)X+&s-bWtaBS}!{mB#VWD+8xKuC({hW)Q#i&s7T4+yOS zaoM0GvacO;cZl1Nkz>-zpa4I*$R@i%1iLZ-vz$iM=i=p-spdK?d0@8mt^XeU;|E#4 zp)UXv^{G56|FkNdu(Gl_(QW>_ED&!WcY2mhQXiLi4VSJ+F;neRu?35TrCcEBlH!t# z;JMbF&!3i8(Wp%y&2%Y|M9)W7pRFrDTwm}hiabIt{3=)7z(e-=$LjY2cQ_}jdZ!=D z27F#k?9mt$THK($T4~4^uSi~*gocN<#cr@Hz}H5Dg^gv7SiUdOpQ5k6m&Gwo0l#CD z4H}jv5xA_VxmdpwXYlGpyEp<7;`RMD|B;tB$k7&IHiWpzSPYo(rn6nWB{^?1v8uJI zMDYB#lvg}9_bdLCa@Hxb@6i*JXiTpcnoe8Y z=|+=dLi|2wY0V2K$dl%d7s0DIo5z=@GGloJ(55F{CXg8UsZ8EiiY_!XY)nnF?4y=% z>F@4txTE)iJ2i0Z1bzC|ZqidQ0?s53>@ zB&X)Yis=1R^}FfJ(mH~n7RgFn+A6@K9oxJ~P1~;@?o(que&_%zJyv?H$z!D1cGe_F zp5@HjH$Q)R6!E=U*WK~e5*cfTj|y{Hk+h-1ODLYYGI_KG+HdX)>Aql*I`}*A@p|8> zf{MiAEP;qP1mAb8Zt|neB$4M!LCxt`q{IG04^LOt!^ner9~=T$$C31#eFDsVLtlZw z3ahT9i5`dl?bzaEAaM`vHpOW3ljG)GwA~bO!u-fO;{isLG!-+4EC!O4MUtZN9}jQV z!+n0aP*9oBfS%*OT+Gi1@j%ZV8C$&`VyBwnfSUldv1JfjuLeH8@Y5w}wY7=x zP0Z(#@0V0`Z3iXQwo;~t#PIL7t9AH2%l=DpON{Lt*iWM%ya69Ef*Uq!D^ z@A|@eVE5BIs~3WK99_e_qSf5xf3J!hu-MM2iu5?@)#q=O?aqY#2gfP}m)}Jhpp%l4 z`sZ(&?%Ng0WQTh`+?J`-$&No1No7&i59UnSHFLieLbNicKmS;c zYE3A9dwiC!!eYEx8kHQdCMLv?%(Z!Njr)t$=Pu@UUa_NfbJ$3=CC_)_XXDzL-!scI zF_x?x{y!BNhyHoun$K^VuD#$k?j*`T*;l}$)%D`f3X3!$*rPG6mJazGQp{iT@;~MI zKE%Vdc9M_1Z&48NON?mO%d#JM?2$vF(ph!wje`TpKkf!-te=>Vk2s6D^NV@kMK4T# zF$5YQUlOn4JhOl9r7DTw>YGu!7`1P(K;maAFG-i*pMJ_+PDc{t^ZoFGCFlhugtEZz zC%7d!@DT;U=a@v9h2aqNvgb@SeLU?%URCLn2>td5#&q%iXD<2w&oswf8E^79vjd># z_@!~bIT_WRoVy34qpIQ|8?qY1Z2R*(PD#l!UY51i2kD7|s1KeT5s{cucwm~eawbQl zs};_K?NAouu*wRg-BIGwAf6)LtF35+2Ehih6MtK|rj<~}L~)TNlm4!uDB7kVl9^Jo zaTY@nSF#m|E(fB)*mY_~{WJkv-*NNftZxLjKEsq3mqJeOgwS>>C+5zs8g)C6^})&m zx5Ba?Jp*N4G-JD&bKK8m1tzi^q;-CFpZ{afl!LsbrmfZG}8 zFCMRp3tcTNSag~_`QkbBLce@L?;b(g@v8OB5cjd?-%1sHZrxi7h8Pw+W2(F^IYKiw z7QE{kNf%2%XtSwRg&nTo*4^BbtyLVCb6s6mUthpo_C%J_nMj{Sox!_$){3vlu8u*@ z)vrBr-Pl|{uENDdWr%d>tosmPXUKPTjrlfF3j4E3j9x& zzP5IM%k?HjI7r5W3cRX}z`QUt&cT3X0^_El!BVQ&(b^}TRp=gylmMXr#l z)=T*s|BSBYl>07uo<%fc%tVC&z}3xl)~_EJuwUwLl*d2t=r$N*Ai-`sqywFI%p98M zi=4jf%vCPk?rRj3J8h{HP!_a~By~QHzdf5?>0up|;5sheLXdn(sFaa5yw=#w;QY35 zMD^%?l3VPa!#nX5p|s_}G9y`xk6p+_C^Xr?u_8Evs`BIQ&s>D$54-?TiS_Gckuya_ z#ktWenTSmj6B9amdg<4ZN4?yR!(S&Nr(NWP0Lg-Zzz-?rRo3%P&u3di37${n(>dO_ z0>cs@vExo-9D?KNf_efPP)Ndx5XE-vaqtl3`kxy_*z8*$f(Bd{(YC?sV4&(6fjdpXo6VW9xC5v-Bq$TTZf z+6ORbTlHh7+4P28*`D;V475XPY`>X2Ar7cj7Uch(uCDEWo4#R;JeD>?fdM^V9hl;KQD=X$iI;$Ut*q=kkle+_m!dX;Q)MX(rc>2-)E<6zV znVDIbhS_%GprE9!@6D4-Kr_6p&A0jFH~IhoYw(dvpz3fg zVH%3Rblv15m|<3t#n8he4&Gg19{YAFEc=F2Y3j__30aIkyV!zQ*jeFNKpTx*c$+-y z2MTAmy?NyauFuFgCdRZ}f~3Il-Q}`TM&u zojlnD1P}cusz0~q3&tzJnIA<8JVY{o`pCPY|c-weE!*~2F7V@ zh3}my7C8|%Kq}$e^lh9Y2NwuHl`V$QA12B0J7xXSyP3RROwoTr;6;_-1Ei)0$+{z- zZ1HiZgu6g@q1-)@&%WuALt2?TWMmzCB}XIAm_)>o%JZjgRZ>O2(#eE;?i!|vvP+V;( zv9{hZ)KW@5PUzR(F1IOgnkVp|@F0Tmqwv74>+#ErN3POhljtpr5E*bh+5epwTnwY} z3V;9M1G)0S*kZH0z{I`s9-%PH7n%Gc%GTm3yd_P z-JH9WX|v0BafdF=Ll zPrwLD$CJ|#61+clWYfAOij-(-O7oSI_8*(nrVIsYRa4OcEa0t%235m=`^`aZ;9TWa zMX@{%;m{F8xI+T4$b^ZQDk_fe!A2c?Vs0XRuvz~0kH~TwG90%;5CvwVBLM)n@GgtN zdSQ&R*UlsF_mCy1+LT9C3kZQsy9{wbpG_=O98%g+o%eb+?=}ajtI=^V+U?|{$cHkn z$0=rSqdWi@ltz*RrTPK;Ru^#1e07dok8Za9}iiS27>IMyHu%D>#C<74|* zE=M@PYoA+(M(4aS8Xz^vd7jBa_3Z$pdapxOq_=a`G7v)0YJlKDH8XiX(SJHb_ze8u zhl^c=R6!&k%Vrjti9V*}Xlw9du)XYv7#EYndc!8umrdY$DY%ONc z1WgA?iAhM%cHrJ3;4t$@g$XW{47Jn>w({`XJnj7CgM+D)B01Iol3`%LzS7P6>!Bv5 z$I$(R$fVDell*TPkt5_z({lu(ClR3)+cg-BG8kz(IS{O^>*~vvoWkBtPD^+6?DMI4l(P+Hei<=|U zR;%ROiffwF`Jn-UITHEbLskn>1s_U@a@P?a#LaLTy|20b0|L~wEWY^XG`RKtW6J1i z6|k++3QJieBTat)sGO86g8tu+N{BuzHu^t5P_Pu@`8|q88mjgT`t4wSG+)U~FK2zP z3yBak(8WqeNc7zjKYK6>t^E5_I>J;ybDRcR$wfWADL0cZ0tjws@bT%O6wst0#G#>~ zAZKWgoE$=&vLt*zBwj7MTxy61JSNCaLj+rhvq>u^Mg_5zodut4uq8@lC@{1^TulN< z*;Z(N;?MjLck4Rd4CT+^>HV6cAGQaEoGVr&0y)j6OsIei{R6hs{Q3Dg0E@6|Wgkou zOR@33u`%2nOxnj~kXzZWclxq7gDWd5+sDZk==^8o+xF-fdUR*3A+YlA?*IT>Suwcv zT9;c5dS6TmqzXHsE+QlJ5}5oa23aPla6l(T%1+O#xGmO5iJ|TLk(Mo(T#ZJJkj&Tt zm=3BVT&2|$@m1g{EQ_2YwDBUwX%y$MDQRr<2Y;7YrbD6>uw9(fC{XFfCg(+SKlKcV1u=TgaNq$OWo5W&J<*#DtTJk6=VD>%Voz$MYr!t!X9 zmWMc{FF{RASi3h;0O;SfeTpmQmEBT`1HJgc;0P4D%`-6pX!)Iz-@bqUx5^NY@(&g{ zH8lshfs72&Rg+Z7P)!u44x@7%tr7b;mRhDyzM0tom8_-b+uWgSsuCuW`8dja#V8WT zD(%gmri@S`hSf^}oal1wMr=H;L|X7j>2zJ!9Q#0^>At}nbhSGg#i%T>oEv48qyKx5 zAi^t^X>`gHlD8e3fB9}Z$lwLu_aw-iBKdXu8 zWZ0Jx#u<%;06KbyR-x^GPDB=}>m7sWN_~&)WWP)dSk&fO9tJ^YfJN@t>OAbV%M%>cx9Lgy-kQ0^*%T&<9cC zzC9&4}9j9BHr8v%}#SGl$RQ}DWE&8Q68!q3N$f%k^^^dUnnEs}6c zQn=gPr?KzQ&|C;**a=!gKl0ZfPc!pB-Z58=kH5`%%>=>Ca?_+rHEoH9@6Xrx2Z}ln z05i;yuz`ug2Mx?9bR){AkAzdA-Xe)Ec6N3XD2Mu~gc+1ke!e@k25#jkCUiL0^C+uX z+}&!%mrt}#g=V0ABBO8FQrDlq11-N!I(I^&{^GIW(OA8$1qI~sb`3NL|G>{vBE(yd zJ20i?2hx<~q@_dP`2$pjGiAL#SH(YHP%h$`-C1}K{FI2WTOG=bOr(M4Ad8xxY~{ML z00Dpo(LJ80hyaqx>wDMh?$@6WO5Z& z(eo|g{n!a6@JX5#=o7jhtPF2WeTxUpk~F{Y0TS;42(BOd)(ppsXiHX~^AL-50be#r zh=~0gcD3WS2aYGk=%1B&DX#?22;|G&Qrpo}T}%>E#rwe@bz-u8llT7a=JF8>qz%W0 zg$D+@`uJ>a3WaUBlzm10kj*Kh=fdvaAq|ZHwGHq5gmG+k`(u|}Fa6sI?5_c(lFNz2 zpc*ek@Lf%IwuC`&7k{}-zm=>&<>|`g55ydoD^UxA@H4MSgCdAN{r3@TJYEwz6O!$g zUAt+pl#w2sV#rq0)`h)R7BEgPY7GLl@9!#$wcCw->w;Y;Zb$~D)c7W&wg*U}8AkyvFWCj5 z;^o(upC_0zIQ2%}YB2wo@>M8PfV8TZuM9D3Wy!C*yQ;7s;)m_dCE}D)g3(!fNawRT zBW|m{x#XV4K3{eUZi&lYqkrWRCH=JpD<;|Y>c`bHnE6=*Xwfc^6r2Lw{O5DynCZ|JLzwG%D6Dx=l1h+ixTa@BO9d~R&q|sXqJ{Xcha2eS_?|uza}tR saY)L7(z#Rp3&^T)ECm?S8u9=9>%1QR{H$)bj{yigUHx3vIVCg!00$k0g#Z8m delta 16831 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 NNh!T4lrZ%Ee*m2uq<;Va diff --git a/paradise.dme b/paradise.dme index dfe436fd566..f49173cf856 100644 --- a/paradise.dme +++ b/paradise.dme @@ -2244,6 +2244,7 @@ #include "code\modules\surgery\organs\autoimplanter.dm" #include "code\modules\surgery\organs\blood.dm" #include "code\modules\surgery\organs\body_egg.dm" +#include "code\modules\surgery\organs\ears.dm" #include "code\modules\surgery\organs\eyes.dm" #include "code\modules\surgery\organs\heart.dm" #include "code\modules\surgery\organs\helpers.dm" From db6e93c72ca0ecf24c23bff5f16c0310fd86fdaa Mon Sep 17 00:00:00 2001 From: tigercat2000 Date: Thu, 8 Nov 2018 20:58:04 -0800 Subject: [PATCH 02/13] Remove catgirls --- code/modules/client/preference/preferences.dm | 18 ++++---- .../mob/living/carbon/human/species/human.dm | 9 +--- .../mob/new_player/sprite_accessories.dm | 44 +++++++++---------- code/modules/surgery/organs/ears.dm | 14 +----- 4 files changed, 33 insertions(+), 52 deletions(-) diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index 9d13b58d3e3..e0ab0087b97 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -1195,18 +1195,18 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("age") age = rand(AGE_MIN, AGE_MAX) if("hair") - if(species in list("Human", "Felinid", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) + if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) h_colour = rand_hex_color() if("secondary_hair") - if(species in list("Human", "Felinid", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) + if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) h_sec_colour = rand_hex_color() if("h_style") h_style = random_hair_style(gender, species, robohead) if("facial") - if(species in list("Human", "Felinid", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) + if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) f_colour = rand_hex_color() if("secondary_facial") - if(species in list("Human", "Felinid", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) + if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox")) f_sec_colour = rand_hex_color() if("f_style") f_style = random_facial_hair_style(gender, species, robohead) @@ -1276,7 +1276,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if(new_age) age = max(min(round(text2num(new_age)), AGE_MAX),AGE_MIN) if("species") - var/list/new_species = list("Human", "Felinid", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin") + var/list/new_species = list("Human", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin") var/prev_species = species // var/whitelisted = 0 @@ -1407,14 +1407,14 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts b_type = new_b_type if("hair") - if(species in list("Human", "Felinid", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) //Species that have hair. (No HAS_HAIR flag) + if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) //Species that have hair. (No HAS_HAIR flag) var/input = "Choose your character's hair colour:" var/new_hair = input(user, input, "Character Preference", h_colour) as color|null if(new_hair) h_colour = new_hair if("secondary_hair") - if(species in list("Human", "Felinid", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) + if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) var/datum/sprite_accessory/hair_style = GLOB.hair_styles_public_list[h_style] if(hair_style.secondary_theme && !hair_style.no_sec_colour) var/new_hair = input(user, "Choose your character's secondary hair colour:", "Character Preference", h_sec_colour) as color|null @@ -1609,13 +1609,13 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts body_accessory = (new_body_accessory == "None") ? null : new_body_accessory if("facial") - if(species in list("Human", "Felinid", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) //Species that have facial hair. (No HAS_HAIR_FACIAL flag) + if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) //Species that have facial hair. (No HAS_HAIR_FACIAL flag) var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", f_colour) as color|null if(new_facial) f_colour = new_facial if("secondary_facial") - if(species in list("Human", "Felinid", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) + if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) var/datum/sprite_accessory/facial_hair_style = GLOB.facial_hair_styles_list[f_style] if(facial_hair_style.secondary_theme && !facial_hair_style.no_sec_colour) var/new_facial = input(user, "Choose your character's secondary facial-hair colour:", "Character Preference", f_sec_colour) as color|null diff --git a/code/modules/mob/living/carbon/human/species/human.dm b/code/modules/mob/living/carbon/human/species/human.dm index 7009af295ac..2a161ab9318 100644 --- a/code/modules/mob/living/carbon/human/species/human.dm +++ b/code/modules/mob/living/carbon/human/species/human.dm @@ -17,11 +17,4 @@ worlds tumultous at best." reagent_tag = PROCESS_ORG - //Has standard darksight of 2. - -/datum/species/human/cat - name = "Felinid" - name_plural = "Felinids" - blurb = "CATGIRLS OMG" - - mutantears = /obj/item/organ/internal/ears/cat \ No newline at end of file + //Has standard darksight of 2. \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 8beb5352b6a..7767781a6da 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -48,7 +48,7 @@ var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations // Restrict some styles to specific species - var/list/species_allowed = list("Human", "Felinid", "Slime People") + var/list/species_allowed = list("Human", "Slime People") 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. @@ -75,7 +75,7 @@ /datum/sprite_accessory/hair/bald name = "Bald" icon_state = "bald" - species_allowed = list("Human", "Felinid", "Unathi", "Vox", "Diona", "Kidan", "Grey", "Plasmaman", "Skeleton", "Vulpkanin", "Tajaran") + species_allowed = list("Human", "Unathi", "Vox", "Diona", "Kidan", "Grey", "Plasmaman", "Skeleton", "Vulpkanin", "Tajaran") glasses_over = 1 /datum/sprite_accessory/hair/short @@ -169,7 +169,7 @@ name = "Pompadour" icon_state = "hair_pompadour" gender = MALE - species_allowed = list("Human", "Felinid", "Slime People", "Unathi") + species_allowed = list("Human", "Slime People", "Unathi") glasses_over = 1 /datum/sprite_accessory/hair/quiff @@ -194,19 +194,19 @@ name = "Beehive" icon_state = "hair_beehive" gender = FEMALE - species_allowed = list("Human", "Felinid", "Slime People", "Unathi") + species_allowed = list("Human", "Slime People", "Unathi") /datum/sprite_accessory/hair/bobcurl name = "Bobcurl" icon_state = "hair_bobcurl" gender = FEMALE - species_allowed = list("Human", "Felinid", "Slime People", "Unathi") + species_allowed = list("Human", "Slime People", "Unathi") /datum/sprite_accessory/hair/bob name = "Bob" icon_state = "hair_bobcut" gender = FEMALE - species_allowed = list("Human", "Felinid", "Slime People", "Unathi") + species_allowed = list("Human", "Slime People", "Unathi") /datum/sprite_accessory/hair/bowl name = "Bowl" @@ -234,7 +234,7 @@ name = "Buzzcut" icon_state = "hair_buzzcut" gender = MALE - species_allowed = list("Human", "Felinid", "Slime People", "Unathi") + species_allowed = list("Human", "Slime People", "Unathi") glasses_over = 1 /datum/sprite_accessory/hair/crew @@ -303,7 +303,7 @@ /datum/sprite_accessory/hair/mohawk name = "Mohawk" icon_state = "hair_d" - species_allowed = list("Human", "Felinid", "Slime People", "Unathi") + species_allowed = list("Human", "Slime People", "Unathi") glasses_over = 1 /datum/sprite_accessory/hair/jensen @@ -338,7 +338,7 @@ /datum/sprite_accessory/hair/spiky name = "Spiky" icon_state = "hair_spikey" - species_allowed = list("Human", "Felinid", "Slime People", "Unathi") + species_allowed = list("Human", "Slime People", "Unathi") glasses_over = 1 /datum/sprite_accessory/hair/kusanagi @@ -1535,7 +1535,7 @@ name = "Shaved" icon_state = "bald" gender = NEUTER - species_allowed = list("Human", "Felinid", "Unathi", "Tajaran", "Skrell", "Vox", "Diona", "Kidan", "Greys", "Vulpkanin", "Slime People") + species_allowed = list("Human", "Unathi", "Tajaran", "Skrell", "Vox", "Diona", "Kidan", "Greys", "Vulpkanin", "Slime People") /datum/sprite_accessory/facial_hair/watson name = "Watson Mustache" @@ -1576,7 +1576,7 @@ /datum/sprite_accessory/facial_hair/elvis name = "Elvis Sideburns" icon_state = "facial_elvis" - species_allowed = list("Human", "Felinid", "Slime People", "Unathi") + species_allowed = list("Human", "Slime People", "Unathi") /datum/sprite_accessory/facial_hair/abe name = "Abraham Lincoln Beard" @@ -1813,7 +1813,7 @@ /datum/sprite_accessory/skin/human name = "Default human skin" icon_state = "default" - species_allowed = list("Human", "Felinid") + species_allowed = list("Human",) /datum/sprite_accessory/skin/human/human_tatt01 name = "Tatt01 human skin" @@ -1848,13 +1848,13 @@ /////////////////////////// /datum/sprite_accessory/underwear icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human", "Felinid", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask") + species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask") gender = NEUTER /datum/sprite_accessory/underwear/nude name = "Nude" icon_state = null - species_allowed = list("Human", "Felinid", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox") + species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox") /datum/sprite_accessory/underwear/male gender = MALE @@ -1974,13 +1974,13 @@ //////////////////////////// /datum/sprite_accessory/undershirt icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human", "Felinid", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask") + species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask") gender = NEUTER /datum/sprite_accessory/undershirt/nude name = "Nude" icon_state = null - species_allowed = list("Human", "Felinid", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox") + species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox") //plain color shirts /datum/sprite_accessory/undershirt/shirt_white @@ -2210,13 +2210,13 @@ /////////////////////// /datum/sprite_accessory/socks icon = 'icons/mob/underwear.dmi' - species_allowed = list("Human", "Felinid", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask") + species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask") gender = NEUTER /datum/sprite_accessory/socks/nude name = "Nude" icon_state = null - species_allowed = list("Human", "Felinid", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox") + species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skrell", "Slime People", "Skeleton", "Drask", "Vox") /datum/sprite_accessory/socks/white_norm name = "Normal White" @@ -2342,7 +2342,7 @@ /datum/sprite_accessory/head_accessory/none name = "None" - species_allowed = list("Human", "Felinid", "Unathi", "Diona", "Grey", "Kidan", "Machine", "Tajaran", "Vulpkanin", "Skrell", "Slime People", "Skeleton", "Vox") + species_allowed = list("Human", "Unathi", "Diona", "Grey", "Kidan", "Machine", "Tajaran", "Vulpkanin", "Skrell", "Slime People", "Skeleton", "Vox") icon_state = "accessory_none" /datum/sprite_accessory/head_accessory/unathi @@ -2595,7 +2595,7 @@ /datum/sprite_accessory/body_markings/none name = "None" - species_allowed = list("Human", "Felinid", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Skrell", "Slime People", "Skeleton", "Vox", "Kidan") + species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Skrell", "Slime People", "Skeleton", "Vox", "Kidan") icon_state = "accessory_none" /datum/sprite_accessory/body_markings/tiger @@ -2863,7 +2863,7 @@ 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 - species_allowed = list("Human", "Felinid", "Unathi", "Vulpkanin", "Tajaran", "Skrell") + species_allowed = list("Human", "Unathi", "Vulpkanin", "Tajaran", "Skrell") icon_state = "accessory_none" /datum/sprite_accessory/body_markings/tattoo/elliot @@ -2873,7 +2873,7 @@ /datum/sprite_accessory/body_markings/tattoo/tiger_body name = "Tiger-stripe Tattoo" - species_allowed = list("Human", "Felinid", "Unathi", "Vulpkanin", "Tajaran", "Skrell") + species_allowed = list("Human", "Unathi", "Vulpkanin", "Tajaran", "Skrell") icon_state = "markings_tiger" /datum/sprite_accessory/body_markings/tattoo/heart diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index 20179905f23..d04e5a95279 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -61,16 +61,4 @@ /mob/living/carbon/MinimumDeafTicks(value) var/obj/item/organ/internal/ears/ears = get_int_organ(/obj/item/organ/internal/ears) if(ears) - ears.MinimumDeafTicks(value) - - -// Kitty ears!! -/obj/item/organ/internal/ears/cat - name = "cat ears" - icon = 'icons/obj/clothing/hats.dmi' - icon_state = "kitty" - color = "#aa4444" - transform = matrix(0.7, 0, 0, 0, 0.7, 0) - -/obj/item/organ/internal/ears/cat/render() - . = mutable_appearance('icons/mob/head.dmi', "kitty", layer = -HEAD_ACC_OVER_LAYER) \ No newline at end of file + ears.MinimumDeafTicks(value) \ No newline at end of file From 1ac542a936570743a3bb366c1b8c7e62c0915776 Mon Sep 17 00:00:00 2001 From: tigercat2000 Date: Thu, 8 Nov 2018 21:45:25 -0800 Subject: [PATCH 03/13] Fix ghosts --- code/modules/mob/dead/observer/observer.dm | 56 +++++++++++++++------- 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 652df947f3b..7e583216475 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -12,6 +12,7 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi stat = DEAD density = 0 canmove = 0 + alpha = 127 anchored = 1 // don't get pushed around invisibility = INVISIBILITY_OBSERVER var/can_reenter_corpse @@ -48,28 +49,19 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi T = get_turf(body) //Where is the body located? attack_log = body.attack_log //preserve our attack logs by copying them to our ghost - if(ishuman(body)) - var/mob/living/carbon/human/H = body - appearance = H.appearance - else - icon = body.icon - icon_state = body.icon_state - overlays = body.overlays - - alpha = 127 - gender = body.gender + var/mutable_appearance/MA = copy_appearance(body) if(body.mind && body.mind.name) - name = body.mind.name + MA.name = body.mind.name + else if(body.real_name) + MA.name = body.real_name else - if(body.real_name) - name = body.real_name + if(gender == MALE) + MA.name = capitalize(pick(GLOB.first_names_male)) + " " + capitalize(pick(GLOB.last_names)) else - if(gender == MALE) - name = capitalize(pick(GLOB.first_names_male)) + " " + capitalize(pick(GLOB.last_names)) - else - name = capitalize(pick(GLOB.first_names_female)) + " " + capitalize(pick(GLOB.last_names)) + MA.name = capitalize(pick(GLOB.first_names_female)) + " " + capitalize(pick(GLOB.last_names)) mind = body.mind //we don't transfer the mind but we keep a reference to it. + appearance = MA ghostimage = image(icon = icon, loc = src, icon_state = icon_state) ghostimage.overlays = overlays @@ -98,6 +90,36 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi updateallghostimages() return ..() +// This seems stupid, but it's the easiest way to avoid absolutely ridiculous shit from happening +// Copying an appearance directly from a mob includes it's verb list, it's invisibility, it's alpha, and it's density +// You might recognize these things as "fucking ridiculous to put in an appearance" +// You'd be right, but that's fucking BYOND for you. +/mob/dead/observer/proc/copy_appearance(mutable_appearance/COPY) + var/mutable_appearance/MA = new(src) + + MA.appearance_flags = COPY.appearance_flags + MA.blend_mode = COPY.blend_mode + MA.color = COPY.color + MA.dir = COPY.dir + MA.gender = COPY.gender + MA.icon = COPY.icon + MA.icon_state = COPY.icon_state + MA.layer = COPY.layer + MA.maptext = COPY.maptext + MA.maptext_width = COPY.maptext_width + MA.maptext_height = COPY.maptext_height + MA.maptext_x = COPY.maptext_x + MA.maptext_y = COPY.maptext_y + MA.mouse_opacity = COPY.mouse_opacity + MA.overlays = COPY.overlays + if(!isicon(MA.icon) && !LAZYLEN(MA.overlays)) // Gibbing/dusting/melting removes the icon before ghostize()ing the mob, so we need to account for that + MA.icon = initial(icon) + MA.icon_state = initial(icon_state) + MA.suffix = COPY.suffix + MA.underlays = COPY.underlays + + . = MA + /mob/dead/CanPass(atom/movable/mover, turf/target, height=0) return 1 From 832a53e10df598ea06c5ed9c358708a19ecda4ec Mon Sep 17 00:00:00 2001 From: dovydas12345 Date: Fri, 9 Nov 2018 19:54:41 +0200 Subject: [PATCH 04/13] Slicing grown snacks --- code/modules/hydroponics/grown.dm | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 2e0feaecea7..d4688fd81e8 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -60,6 +60,31 @@ /obj/item/reagent_containers/food/snacks/grown/attackby(obj/item/O, mob/user, params) ..() + if(slices_num && slices_num >0 && slice_path) + var/inaccurate = TRUE + if(O.sharp) + if(istype(O, /obj/item/kitchen/knife) || istype(O, /obj/item/scalpel)) + inaccurate = FALSE + + if(!isturf(loc) || !(locate(/obj/structure/table) in loc) && !(locate(/obj/machinery/optable) in loc) && !(locate(/obj/item/storage/bag/tray) in loc)) + to_chat(user, "You cannot slice [src] here! You need a table or at least a tray to do it.") + return TRUE + + var/slices_lost = 0 + if(!inaccurate) + user.visible_message("[user] slices [src]!", + "You slice [src]!") + else + user.visible_message("[user] crudely slices [src] with [O]!", "You crudely slice [src] with your [O]!") + slices_lost = rand(1,min(1,round(slices_num/2))) + + var/reagents_per_slice = reagents.total_volume/slices_num + for(var/i=1 to (slices_num-slices_lost)) + var/obj/slice = new slice_path (loc) + reagents.trans_to(slice,reagents_per_slice) + qdel(src) + return ..() + if (istype(O, /obj/item/plant_analyzer)) var/msg = "*---------*\n This is \a [src].\n" if(seed) From 172102a51ad3673b6a5602783c91a068c2576f20 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Fri, 9 Nov 2018 19:33:35 +0100 Subject: [PATCH 05/13] Added new box sprites Props to Shazbot for the sprites --- .../objects/items/weapons/storage/boxes.dm | 6 +++++- .../clothing/under/accessories/accessory.dm | 1 + code/modules/detective_work/evidence.dm | 1 + icons/obj/storage.dmi | Bin 70214 -> 71881 bytes 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index a78bc40dd3a..b28f06b614a 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -65,6 +65,7 @@ max_combined_w_class = 42 // 21*2 /obj/item/storage/box/survival + icon_state = "box_civ" New() ..() contents = list() @@ -74,6 +75,7 @@ return /obj/item/storage/box/engineer + icon_state = "box_eng" New() ..() contents = list() @@ -83,6 +85,7 @@ return /obj/item/storage/box/survival_mining + icon_state = "box_min" New() ..() contents = list() @@ -834,7 +837,8 @@ /obj/item/storage/box/centcomofficer name = "officer kit" - + icon_state = "box_ert" + /obj/item/storage/box/centcomofficer/New() ..() contents = list() diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 2abadbc55f9..26ec63770c5 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -287,6 +287,7 @@ /obj/item/storage/box/holobadge name = "holobadge box" + icon_state = "box_badge" desc = "A box claiming to contain holobadges." New() new /obj/item/clothing/accessory/holobadge(src) diff --git a/code/modules/detective_work/evidence.dm b/code/modules/detective_work/evidence.dm index 97d41fcf848..f2cc8be7277 100644 --- a/code/modules/detective_work/evidence.dm +++ b/code/modules/detective_work/evidence.dm @@ -87,6 +87,7 @@ /obj/item/storage/box/evidence name = "evidence bag box" desc = "A box claiming to contain evidence bags." + icon_state = "box_evidence" /obj/item/storage/box/evidence/New() new /obj/item/evidencebag(src) diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index bd7a6ab837c488903cbbc76f40dacc9631648993..ddfe7ccb50664ad302b647c6694f91cebe1e2465 100644 GIT binary patch delta 52327 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

&2=*3u57R%asSob*V-nZb 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%0AI%5R1|2T*oAX+ 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 delta 50563 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 GkN*qXu+Xaj From c552335bd9edce3d65469ace90b5d6c8013dfca9 Mon Sep 17 00:00:00 2001 From: dovydas12345 <37041561+dovydas12345@users.noreply.github.com> Date: Fri, 9 Nov 2018 20:55:57 +0200 Subject: [PATCH 06/13] Removes the unneeded check --- code/modules/hydroponics/grown.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index d4688fd81e8..88ac251b91d 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -60,7 +60,7 @@ /obj/item/reagent_containers/food/snacks/grown/attackby(obj/item/O, mob/user, params) ..() - if(slices_num && slices_num >0 && slice_path) + if(slices_num && slice_path) var/inaccurate = TRUE if(O.sharp) if(istype(O, /obj/item/kitchen/knife) || istype(O, /obj/item/scalpel)) From 6444a5fa3fc1ef6f55374b72b5875ca0918e010c Mon Sep 17 00:00:00 2001 From: dovydas12345 <37041561+dovydas12345@users.noreply.github.com> Date: Fri, 9 Nov 2018 23:00:17 +0200 Subject: [PATCH 07/13] The correct check --- code/modules/hydroponics/grown.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 88ac251b91d..50cbb1e7e75 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -60,7 +60,7 @@ /obj/item/reagent_containers/food/snacks/grown/attackby(obj/item/O, mob/user, params) ..() - if(slices_num && slice_path) + if(slices_num > 0 && slice_path) var/inaccurate = TRUE if(O.sharp) if(istype(O, /obj/item/kitchen/knife) || istype(O, /obj/item/scalpel)) From adf12c87fabe092351888977d24b58195d4d3757 Mon Sep 17 00:00:00 2001 From: dovydas12345 <37041561+dovydas12345@users.noreply.github.com> Date: Sat, 10 Nov 2018 12:17:27 +0200 Subject: [PATCH 08/13] Requested changes --- code/modules/hydroponics/grown.dm | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 50cbb1e7e75..7b84956a804 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -60,7 +60,7 @@ /obj/item/reagent_containers/food/snacks/grown/attackby(obj/item/O, mob/user, params) ..() - if(slices_num > 0 && slice_path) + if(slices_num && slice_path) var/inaccurate = TRUE if(O.sharp) if(istype(O, /obj/item/kitchen/knife) || istype(O, /obj/item/scalpel)) @@ -72,16 +72,15 @@ var/slices_lost = 0 if(!inaccurate) - user.visible_message("[user] slices [src]!", - "You slice [src]!") + user.visible_message("[user] slices [src] with [O]!", "You slice [src]!") else - user.visible_message("[user] crudely slices [src] with [O]!", "You crudely slice [src] with your [O]!") - slices_lost = rand(1,min(1,round(slices_num/2))) + user.visible_message("[user] crudely slices [src] with [O]!", "You crudely slice [src] with your [O]!") + slices_lost = rand(1, min(1, round(slices_num / 2))) var/reagents_per_slice = reagents.total_volume/slices_num - for(var/i=1 to (slices_num-slices_lost)) + for(var/i = 1 to (slices_num - slices_lost)) var/obj/slice = new slice_path (loc) - reagents.trans_to(slice,reagents_per_slice) + reagents.trans_to(slice, reagents_per_slice) qdel(src) return ..() From 202ba8b5edc0ff557afc9bcd3479f9514879f401 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Sat, 10 Nov 2018 12:08:06 +0100 Subject: [PATCH 09/13] Forgot ERT, moved the boxes to boxes.dm --- code/game/objects/items/bodybag.dm | 17 ------ .../objects/items/weapons/storage/boxes.dm | 54 +++++++++++++++++++ .../clothing/under/accessories/accessory.dm | 15 ------ code/modules/detective_work/evidence.dm | 13 ----- code/modules/response_team/ert.dm | 13 ----- 5 files changed, 54 insertions(+), 58 deletions(-) diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 286bd315b61..1e75bdc84fc 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -12,23 +12,6 @@ R.add_fingerprint(user) qdel(src) - -/obj/item/storage/box/bodybags - name = "body bags" - desc = "This box contains body bags." - icon_state = "bodybags" - -/obj/item/storage/box/bodybags/New() - ..() - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - - /obj/structure/closet/body_bag name = "body bag" desc = "A plastic bag designed for the storage and transportation of cadavers." diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index b28f06b614a..7a78a04ac71 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -566,6 +566,33 @@ new /obj/item/cartridge/security(src) new /obj/item/cartridge/security(src) +/obj/item/storage/box/holobadge + name = "holobadge box" + icon_state = "box_badge" + desc = "A box claiming to contain holobadges." + New() + new /obj/item/clothing/accessory/holobadge(src) + new /obj/item/clothing/accessory/holobadge(src) + new /obj/item/clothing/accessory/holobadge(src) + new /obj/item/clothing/accessory/holobadge(src) + new /obj/item/clothing/accessory/holobadge/cord(src) + new /obj/item/clothing/accessory/holobadge/cord(src) + ..() + return + +/obj/item/storage/box/evidence + name = "evidence bag box" + desc = "A box claiming to contain evidence bags." + icon_state = "box_evidence" + +/obj/item/storage/box/evidence/New() + new /obj/item/evidencebag(src) + new /obj/item/evidencebag(src) + new /obj/item/evidencebag(src) + new /obj/item/evidencebag(src) + new /obj/item/evidencebag(src) + new /obj/item/evidencebag(src) + ..() /obj/item/storage/box/handcuffs name = "spare handcuffs" @@ -645,6 +672,20 @@ new /obj/item/storage/pill_bottle( src ) new /obj/item/storage/pill_bottle( src ) +/obj/item/storage/box/bodybags + name = "body bags" + desc = "This box contains body bags." + icon_state = "bodybags" + +/obj/item/storage/box/bodybags/New() + ..() + new /obj/item/bodybag(src) + new /obj/item/bodybag(src) + new /obj/item/bodybag(src) + new /obj/item/bodybag(src) + new /obj/item/bodybag(src) + new /obj/item/bodybag(src) + new /obj/item/bodybag(src) /obj/item/storage/box/snappops name = "snap pop box" @@ -854,6 +895,19 @@ new /obj/item/reagent_containers/hypospray/combat/nanites(src) new /obj/item/pinpointer/advpinpointer(src) +/obj/item/storage/box/responseteam + name = "boxed survival kit" + icon_state = "box_ert" + +/obj/item/storage/box/responseteam/New() + ..() + new /obj/item/clothing/mask/breath(src) + new /obj/item/tank/emergency_oxygen/engi(src) + new /obj/item/flashlight/flare(src) + new /obj/item/kitchen/knife/combat(src) + new /obj/item/radio/centcom(src) + new /obj/item/reagent_containers/food/pill/patch/synthflesh(src) + new /obj/item/reagent_containers/hypospray/autoinjector(src) #undef NODESIGN #undef NANOTRASEN diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 26ec63770c5..6b08e2e4e49 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -285,21 +285,6 @@ if(isliving(user)) user.visible_message("[user] invades [M]'s personal space, thrusting [src] into [M.p_their()] face insistently.","You invade [M]'s personal space, thrusting [src] into [M.p_their()] face insistently. You are the law.") -/obj/item/storage/box/holobadge - name = "holobadge box" - icon_state = "box_badge" - desc = "A box claiming to contain holobadges." - New() - new /obj/item/clothing/accessory/holobadge(src) - new /obj/item/clothing/accessory/holobadge(src) - new /obj/item/clothing/accessory/holobadge(src) - new /obj/item/clothing/accessory/holobadge(src) - new /obj/item/clothing/accessory/holobadge/cord(src) - new /obj/item/clothing/accessory/holobadge/cord(src) - ..() - return - - /////////// //SCARVES// /////////// diff --git a/code/modules/detective_work/evidence.dm b/code/modules/detective_work/evidence.dm index f2cc8be7277..555dbe542de 100644 --- a/code/modules/detective_work/evidence.dm +++ b/code/modules/detective_work/evidence.dm @@ -84,16 +84,3 @@ to_chat(user, "[src] is empty.") icon_state = "evidenceobj" -/obj/item/storage/box/evidence - name = "evidence bag box" - desc = "A box claiming to contain evidence bags." - icon_state = "box_evidence" - -/obj/item/storage/box/evidence/New() - new /obj/item/evidencebag(src) - new /obj/item/evidencebag(src) - new /obj/item/evidencebag(src) - new /obj/item/evidencebag(src) - new /obj/item/evidencebag(src) - new /obj/item/evidencebag(src) - ..() diff --git a/code/modules/response_team/ert.dm b/code/modules/response_team/ert.dm index d678a541912..0c2688cc3f1 100644 --- a/code/modules/response_team/ert.dm +++ b/code/modules/response_team/ert.dm @@ -353,16 +353,3 @@ var/ert_request_answered = FALSE name = "centcomm bounced radio" frequency = ERT_FREQ icon_state = "radio" - -/obj/item/storage/box/responseteam/ - name = "boxed survival kit" - -/obj/item/storage/box/responseteam/New() - ..() - new /obj/item/clothing/mask/breath(src) - new /obj/item/tank/emergency_oxygen/engi(src) - new /obj/item/flashlight/flare(src) - new /obj/item/kitchen/knife/combat(src) - new /obj/item/radio/centcom(src) - new /obj/item/reagent_containers/food/pill/patch/synthflesh(src) - new /obj/item/reagent_containers/hypospray/autoinjector(src) From ac34793864c58ea715a4fffbded16ea525387e39 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 10 Nov 2018 15:42:09 -0500 Subject: [PATCH 10/13] Automatic changelog generation for PR #10176 [ci skip] --- html/changelogs/AutoChangeLog-pr-10176.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10176.yml diff --git a/html/changelogs/AutoChangeLog-pr-10176.yml b/html/changelogs/AutoChangeLog-pr-10176.yml new file mode 100644 index 00000000000..56a413ff10f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10176.yml @@ -0,0 +1,4 @@ +author: "Dovydas12345" +delete-after: True +changes: + - bugfix: "Fixes being unable to slice certain food grown by hydroponics (pineapple, watermelon etc.)" From 9e61bd98dbeb2e2bb4af733db29562355ec74e90 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 10 Nov 2018 15:43:31 -0500 Subject: [PATCH 11/13] Automatic changelog generation for PR #10177 [ci skip] --- html/changelogs/AutoChangeLog-pr-10177.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10177.yml diff --git a/html/changelogs/AutoChangeLog-pr-10177.yml b/html/changelogs/AutoChangeLog-pr-10177.yml new file mode 100644 index 00000000000..4499e095752 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10177.yml @@ -0,0 +1,5 @@ +author: "Shazbot" +delete-after: True +changes: + - imageadd: "Some fancy new box sprites, props to Shazbot for the sprites" + - imagedel: "Old cuff box is gone" From e51ca58451606b2ee31dd110a5f33460aa024f4c Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 10 Nov 2018 22:33:33 +0000 Subject: [PATCH 12/13] Automatic changelog compile, [ci skip] --- html/changelog.html | 9 +++++++++ html/changelogs/.all_changelog.yml | 6 ++++++ html/changelogs/AutoChangeLog-pr-10176.yml | 4 ---- html/changelogs/AutoChangeLog-pr-10177.yml | 5 ----- 4 files changed, 15 insertions(+), 9 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-10176.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-10177.yml diff --git a/html/changelog.html b/html/changelog.html index 60f40c23d99..e7a09401f11 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -62,6 +62,15 @@

  • Prevents an infinite metal exploit using the autolathe.
  • Minimum returnable metal of ammunition boxes has been lowered from 2000 to 500.
  • +

    Dovydas12345 updated:

    +
      +
    • Fixes being unable to slice certain food grown by hydroponics (pineapple, watermelon etc.)
    • +
    +

    Shazbot updated:

    +
      +
    • Some fancy new box sprites, props to Shazbot for the sprites
    • +
    • Old cuff box is gone
    • +

    TDSSS updated:

    • Quarantine is now its own lawset.
    • diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index ccd51adf433..ac256a5fd9e 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -7974,5 +7974,11 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: Prevents an infinite metal exploit using the autolathe. - tweak: Minimum returnable metal of ammunition boxes has been lowered from 2000 to 500. + Dovydas12345: + - bugfix: Fixes being unable to slice certain food grown by hydroponics (pineapple, + watermelon etc.) + Shazbot: + - imageadd: Some fancy new box sprites, props to Shazbot for the sprites + - imagedel: Old cuff box is gone TDSSS: - tweak: Quarantine is now its own lawset. diff --git a/html/changelogs/AutoChangeLog-pr-10176.yml b/html/changelogs/AutoChangeLog-pr-10176.yml deleted file mode 100644 index 56a413ff10f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-10176.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dovydas12345" -delete-after: True -changes: - - bugfix: "Fixes being unable to slice certain food grown by hydroponics (pineapple, watermelon etc.)" diff --git a/html/changelogs/AutoChangeLog-pr-10177.yml b/html/changelogs/AutoChangeLog-pr-10177.yml deleted file mode 100644 index 4499e095752..00000000000 --- a/html/changelogs/AutoChangeLog-pr-10177.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Shazbot" -delete-after: True -changes: - - imageadd: "Some fancy new box sprites, props to Shazbot for the sprites" - - imagedel: "Old cuff box is gone" From 2ee4d10516475a144195f17be617f1ae5e0cf1ef Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 10 Nov 2018 23:09:32 -0500 Subject: [PATCH 13/13] Automatic changelog generation for PR #10166 [ci skip] --- html/changelogs/AutoChangeLog-pr-10166.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-10166.yml diff --git a/html/changelogs/AutoChangeLog-pr-10166.yml b/html/changelogs/AutoChangeLog-pr-10166.yml new file mode 100644 index 00000000000..9faaaf01f60 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10166.yml @@ -0,0 +1,5 @@ +author: "tigercat2000" +delete-after: True +changes: + - rscadd: "Ears are now an organ, which can be damaged, removed, and inserted!" + - tweak: "Human icon code should perform massively better."