mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-18 02:24:11 +01:00
Merge pull request #10166 from tigercat2000/updateicons
/tg/ human update_icons & ear organs
This commit is contained in:
@@ -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, "<b><font color= red>You have been frozen by [key_name(admin)]</b></font>")
|
||||
message_admins("<span class='notice'>[key_name_admin(admin)]</span> 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, "<b><font color= red>You have been unfrozen by [key_name(admin)]</b></font>")
|
||||
message_admins("<span class='notice'>[key_name_admin(admin)] unfroze [key_name_admin(src)]</span>")
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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,29 +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
|
||||
icon = H.stand_icon
|
||||
overlays = H.overlays_standing
|
||||
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
|
||||
@@ -99,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
|
||||
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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?"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -1524,8 +1523,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.*/
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/slime/can_hear()
|
||||
. = TRUE //honestly fuck slimes and organ bullshit
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -404,8 +404,7 @@
|
||||
CureNervous()
|
||||
SetEyeBlind(0)
|
||||
SetEyeBlurry(0)
|
||||
SetEarDamage(0)
|
||||
SetEarDeaf(0)
|
||||
RestoreEars()
|
||||
heal_overall_damage(1000, 1000)
|
||||
ExtinguishMob()
|
||||
fire_stacks = 0
|
||||
|
||||
@@ -330,9 +330,5 @@
|
||||
return 1
|
||||
|
||||
/////////////////////////////////// EAR DAMAGE ////////////////////////////////////
|
||||
|
||||
/mob/living/silicon/SetEarDamage()
|
||||
return
|
||||
|
||||
/mob/living/silicon/SetEarDeaf()
|
||||
return
|
||||
/mob/living/silicon/can_hear()
|
||||
. = TRUE
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -1813,7 +1813,7 @@
|
||||
/datum/sprite_accessory/skin/human
|
||||
name = "Default human skin"
|
||||
icon_state = "default"
|
||||
species_allowed = list("Human")
|
||||
species_allowed = list("Human",)
|
||||
|
||||
/datum/sprite_accessory/skin/human/human_tatt01
|
||||
name = "Tatt01 human skin"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -287,16 +287,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, "<span class='warning'>Your ears start to ring badly!</span>")
|
||||
if(prob(M.ear_damage - 5))
|
||||
to_chat(M, "<span class='warning'>You can't hear anything!</span>")
|
||||
M.disabilities |= DEAF
|
||||
else
|
||||
if(M.ear_damage >= 5)
|
||||
to_chat(M, "<span class='warning'>Your ears start to ring!</span>")
|
||||
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, "<span class='warning'>Your ears start to ring badly!</span>")
|
||||
if(prob(ears.ear_damage - 5))
|
||||
to_chat(M, "<span class='warning'>You can't hear anything!</span>")
|
||||
M.BecomeDeaf()
|
||||
else
|
||||
if(ears.ear_damage >= 5)
|
||||
to_chat(M, "<span class='warning'>Your ears start to ring!</span>")
|
||||
holder.remove_reagent("sonic_powder", created_volume)
|
||||
|
||||
/datum/chemical_reaction/sonic_powder_deafen
|
||||
@@ -322,16 +325,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, "<span class='warning'>Your ears start to ring badly!</span>")
|
||||
if(prob(M.ear_damage - 5))
|
||||
to_chat(M, "<span class='warning'>You can't hear anything!</span>")
|
||||
M.BecomeDeaf()
|
||||
else
|
||||
if(M.ear_damage >= 5)
|
||||
to_chat(M, "<span class='warning'>Your ears start to ring!</span>")
|
||||
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, "<span class='warning'>Your ears start to ring badly!</span>")
|
||||
if(prob(ears.ear_damage - 5))
|
||||
to_chat(M, "<span class='warning'>You can't hear anything!</span>")
|
||||
M.BecomeDeaf()
|
||||
else
|
||||
if(ears.ear_damage >= 5)
|
||||
to_chat(M, "<span class='warning'>Your ears start to ring!</span>")
|
||||
|
||||
|
||||
/datum/chemical_reaction/phlogiston
|
||||
name = "phlogiston"
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
/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)
|
||||
@@ -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, "<font color='red' size='7'>HONK</font>")
|
||||
owner.SetSleeping(0)
|
||||
owner.Stuttering(20)
|
||||
owner.AdjustEarDeaf(30)
|
||||
owner.MinimumDeafTicks(30)
|
||||
owner.Weaken(3)
|
||||
owner << 'sound/items/AirHorn.ogg'
|
||||
if(prob(30))
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user