diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index abcaba4cf18..78f50848756 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -95,7 +95,7 @@
H.loc = src
loc.visible_message("The corpse of [H.name] suddenly rises!")
-/mob/living/simple_animal/hostile/blob/blobspore/Die()
+/mob/living/simple_animal/hostile/blob/blobspore/death()
// On death, create a small smoke of harmful gas (s-Acid)
var/datum/effect/effect/system/chem_smoke_spread/S = new
var/turf/location = get_turf(src)
@@ -172,6 +172,6 @@
/mob/living/simple_animal/hostile/blob/blobbernaut/blob_act()
return
-/mob/living/simple_animal/hostile/blob/blobbernaut/Die()
+/mob/living/simple_animal/hostile/blob/blobbernaut/death()
..()
flick("blobbernaut_death", src)
diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm
index 69753a3252c..59bfefa78c9 100644
--- a/code/game/objects/effects/aliens.dm
+++ b/code/game/objects/effects/aliens.dm
@@ -345,7 +345,7 @@
if(child)
child.loc = get_turf(src)
if(kill && istype(child))
- child.Die()
+ child.death()
else
for(var/mob/M in range(1,src))
if(CanHug(M))
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index e81ade4287a..619921272ff 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -101,11 +101,11 @@
inserted_id = I
interact(user)
return
-
+
if(default_deconstruction_screwdriver(user, "ore_redemption-open", "ore_redemption", W))
updateUsrDialog()
return
-
+
if(exchange_parts(user, W))
return
@@ -589,7 +589,7 @@
sterile = 1
tint = 3 //Makes it feel more authentic when it latches on
-/obj/item/clothing/mask/facehugger/toy/Die()
+/obj/item/clothing/mask/facehugger/toy/death()
return
@@ -656,7 +656,7 @@
return
..()
-/mob/living/simple_animal/hostile/mining_drone/Die()
+/mob/living/simple_animal/hostile/mining_drone/death()
..()
visible_message("[src] is destroyed!")
new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc)
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index 88000afe32f..16a8602e527 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -26,10 +26,6 @@
var/heal_rate = 5
var/plasma_rate = 5
- var/oxygen_alert = 0
- var/toxins_alert = 0
- var/fire_alert = 0
-
var/large = 0
var/heat_protection = 0.5
var/leaping = 0
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index dff7ffb59af..2cf4a2397f9 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -315,7 +315,6 @@ In all, this is a lot like the monkey code. /N
return 0
-/mob/living/carbon/alien/humanoid/var/co2overloadtime = null
/mob/living/carbon/alien/humanoid/var/temperature_resistance = T0C+75
/mob/living/carbon/alien/humanoid/show_inv(mob/user as mob)
diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm
index 5bda4880e27..7a309ac28dd 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva.dm
@@ -229,7 +229,6 @@
/mob/living/carbon/alien/larva/restrained()
return 0
-/mob/living/carbon/alien/larva/var/co2overloadtime = null
/mob/living/carbon/alien/larva/var/temperature_resistance = T0C+75
// new damage icon system
diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm
index ffd8c3bca5e..70603b1daf9 100644
--- a/code/modules/mob/living/carbon/alien/life.dm
+++ b/code/modules/mob/living/carbon/alien/life.dm
@@ -1,84 +1,4 @@
-/mob/living/carbon/alien/Life()
- if(..())
- //First, resolve location and get a breath
- if(mob_master.current_cycle%4==2)
- //Only try to take a breath every 4 seconds, unless suffocating
- spawn(0) breathe()
-
- else //Still give containing object the chance to interact
- if(istype(loc, /obj/))
- var/obj/location_as_object = loc
- location_as_object.handle_internal_lifeform(src, 0)
- return 1
-
-/mob/living/carbon/alien/handle_chemicals_in_body()
- if(reagents)
- reagents.metabolize(src)
-
- if (drowsyness)
- drowsyness--
- eye_blurry = max(2, eye_blurry)
- if (prob(5))
- sleeping += 1
- Paralyse(5)
-
- confused = max(0, confused - 1)
- // decrement dizziness counter, clamped to 0
- if(resting)
- dizziness = max(0, dizziness - 5)
- jitteriness = max(0, jitteriness - 5)
- else
- dizziness = max(0, dizziness - 1)
- jitteriness = max(0, jitteriness - 1)
-
- updatehealth()
-
- return //TODO: DEFERRED
-
-/mob/living/carbon/alien/proc/breathe()
- if(reagents)
- if(reagents.has_reagent("lexorin")) return
- if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return
-
- var/datum/gas_mixture/environment = loc.return_air()
- var/datum/gas_mixture/breath
- // HACK NEED CHANGING LATER
- if(health <= config.health_threshold_crit)
- losebreath++
-
- if(losebreath>0) //Suffocating so do not take a breath
- losebreath--
- if (prob(75)) //High chance of gasping for air
- spawn emote("gasp")
- if(istype(loc, /obj/))
- var/obj/location_as_object = loc
- location_as_object.handle_internal_lifeform(src, 0)
- else
- //First, check for air from internal atmosphere (using an air tank and mask generally)
- breath = get_breath_from_internal(BREATH_VOLUME)
-
- //No breath from internal atmosphere so get breath from location
- if(!breath)
- if(istype(loc, /obj/))
- var/obj/location_as_object = loc
- breath = location_as_object.handle_internal_lifeform(src, BREATH_VOLUME)
- else if(istype(loc, /turf/))
- var/breath_moles = environment.total_moles()*BREATH_PERCENTAGE
-
- breath = loc.remove_air(breath_moles)
-
-
- else //Still give containing object the chance to interact
- if(istype(loc, /obj/))
- var/obj/location_as_object = loc
- location_as_object.handle_internal_lifeform(src, 0)
-
- handle_breath(breath)
-
- if(breath)
- loc.assume_air(breath)
-
-/mob/living/carbon/alien/proc/handle_breath(datum/gas_mixture/breath)
+/mob/living/carbon/alien/check_breath(datum/gas_mixture/breath)
if(status_flags & GODMODE)
return
@@ -93,7 +13,6 @@
var/Toxins_pp = (breath.toxins/breath.total_moles())*breath_pressure
if(Toxins_pp) // Detect toxins in air
-
adjustToxLoss(breath.toxins*250)
toxins_alert = max(toxins_alert, 1)
@@ -106,13 +25,15 @@
breath.toxins -= toxins_used
breath.oxygen += toxins_used
- if(breath.temperature > (T0C+66) && !(RESIST_COLD in mutations)) // Hot air hurts :(
+ //BREATH TEMPERATURE
+ handle_breath_temperature(breath)
+
+ return 1
+
+/mob/living/carbon/alien/handle_breath_temperature(datum/gas_mixture/breath)
+ if(breath.temperature > (T0C + 66) && !(RESIST_COLD in mutations))
if(prob(20))
src << "You feel a searing heat in your lungs!"
fire_alert = max(fire_alert, 1)
else
- fire_alert = 0
-
- //Temporary fixes to the alerts.
-
- return 1
\ No newline at end of file
+ fire_alert = 0
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index 913db148a95..1dda523eeca 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -57,17 +57,17 @@ var/const/MAX_ACTIVE_TIME = 400
/obj/item/clothing/mask/facehugger/attackby(var/obj/item/O,var/mob/m, params)
if(O.force)
- Die()
+ death()
return
/obj/item/clothing/mask/facehugger/bullet_act(var/obj/item/projectile/P)
if(P.damage)
- Die()
+ death()
return
/obj/item/clothing/mask/facehugger/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 300)
- Die()
+ death()
return
/obj/item/clothing/mask/facehugger/equipped(mob/M)
@@ -125,7 +125,7 @@ var/const/MAX_ACTIVE_TIME = 400
var/mob/living/carbon/human/H = L
if(H.head && H.head.flags & HEADCOVERSMOUTH)
H.visible_message("[src] smashes against [H]'s [H.head]!")
- Die()
+ death()
return 0
if(iscarbon(M))
@@ -177,7 +177,7 @@ var/const/MAX_ACTIVE_TIME = 400
target.visible_message("[src] falls limp after violating [target]'s face!", \
"[src] falls limp after violating [target]'s face!")
- Die()
+ death()
icon_state = "[initial(icon_state)]_impregnated"
if(!(target.status_flags & XENO_HOST))
@@ -221,7 +221,7 @@ var/const/MAX_ACTIVE_TIME = 400
GoActive()
return
-/obj/item/clothing/mask/facehugger/proc/Die()
+/obj/item/clothing/mask/facehugger/proc/death()
if(stat == DEAD)
return
diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm
index 0cfa62d008f..71ca32e5f97 100644
--- a/code/modules/mob/living/carbon/brain/life.dm
+++ b/code/modules/mob/living/carbon/brain/life.dm
@@ -1,236 +1,99 @@
-/mob/living/carbon/brain/
- handle_mutations_and_radiation()
+/mob/living/carbon/brain/handle_mutations_and_radiation()
+ if(radiation)
+ if(radiation > 100)
+ radiation -= 3
+ adjustToxLoss(3)
+ updatehealth()
+ if(!container)
+ src << "You feel weak."
+ else
+ src << "STATUS: CRITICAL AMOUNTS OF RADIATION DETECTED."
- if (radiation)
- if (radiation > 100)
+ switch(radiation)
+ if(0 to 49)
+ radiation--
+ if(prob(25))
+ adjustToxLoss(1)
+ updatehealth()
+
+ if(50 to 74)
+ radiation -= 2
+ adjustToxLoss(1)
+ if(prob(5))
+ radiation -= 5
+ if(!container)
+ src << "You feel weak."
+ else
+ src << "STATUS: DANGEROUS AMOUNTS OF RADIATION DETECTED."
+ updatehealth()
+
+ if(75 to 100)
radiation -= 3
adjustToxLoss(3)
updatehealth()
- if(!container)//If it's not in an MMI
- src << "\red You feel weak."
- else//Fluff-wise, since the brain can't detect anything itself, the MMI handles thing like that
- src << "\red STATUS: CRITICAL AMOUNTS OF RADIATION DETECTED."
- switch(radiation)
- if(0 to 49)
- radiation--
- if(prob(25))
- adjustToxLoss(1)
- updatehealth()
-
- if(50 to 74)
- radiation -= 2
- adjustToxLoss(1)
- if(prob(5))
- radiation -= 5
- if(!container)
- src << "\red You feel weak."
- else
- src << "\red STATUS: DANGEROUS LEVELS OF RADIATION DETECTED."
- updatehealth()
-
- if(75 to 100)
- radiation -= 3
- adjustToxLoss(3)
- updatehealth()
-
- handle_environment(datum/gas_mixture/environment)
- if(!environment)
- return
- var/environment_heat_capacity = environment.heat_capacity()
- if(istype(get_turf(src), /turf/space))
- var/turf/heat_turf = get_turf(src)
- environment_heat_capacity = heat_turf.heat_capacity
-
- if((environment.temperature > (T0C + 50)) || (environment.temperature < (T0C + 10)))
- var/transfer_coefficient = 1
-
- handle_temperature_damage(HEAD, environment.temperature, environment_heat_capacity*transfer_coefficient)
-
- if(stat==2)
- bodytemperature += 0.1*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000)
-
- //Account for massive pressure differences
-
- return //TODO: DEFERRED
-
- proc/handle_temperature_damage(body_part, exposed_temperature, exposed_intensity)
- if(status_flags & GODMODE) return
-
- if(exposed_temperature > bodytemperature)
- var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0)
- //adjustFireLoss(2.5*discomfort)
- //adjustFireLoss(5.0*discomfort)
- adjustFireLoss(20.0*discomfort)
-
- else
- var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0)
- //adjustFireLoss(2.5*discomfort)
- adjustFireLoss(5.0*discomfort)
-
-
-
- handle_chemicals_in_body()
-
- if(reagents) reagents.metabolize(src)
-
- confused = max(0, confused - 1)
- // decrement dizziness counter, clamped to 0
- if(resting)
- dizziness = max(0, dizziness - 5)
- else
- dizziness = max(0, dizziness - 1)
-
- updatehealth()
-
- return //TODO: DEFERRED
-
-
- handle_regular_status_updates() //TODO: comment out the unused bits >_>
- updatehealth()
-
- if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP
- blinded = 1
- silent = 0
- else //ALIVE. LIGHTS ARE ON
- if( !container && (health < config.health_threshold_dead || ((world.time - timeofhostdeath) > config.revival_brain_life)) )
- death()
- blinded = 1
- silent = 0
- return 1
-
- //Handling EMP effect in the Life(), it's made VERY simply, and has some additional effects handled elsewhere
- if(emp_damage) //This is pretty much a damage type only used by MMIs, dished out by the emp_act
- if(!(container && istype(container, /obj/item/device/mmi)))
- emp_damage = 0
- else
- emp_damage = round(emp_damage,1)//Let's have some nice numbers to work with
- switch(emp_damage)
- if(31 to INFINITY)
- emp_damage = 30//Let's not overdo it
- if(21 to 30)//High level of EMP damage, unable to see, hear, or speak
- eye_blind = 1
- blinded = 1
- ear_deaf = 1
- silent = 1
- if(!alert)//Sounds an alarm, but only once per 'level'
- emote("alarm")
- src << "\red Major electrical distruption detected: System rebooting."
- alert = 1
- if(prob(75))
- emp_damage -= 1
- if(20)
- alert = 0
- blinded = 0
- eye_blind = 0
- ear_deaf = 0
- silent = 0
- emp_damage -= 1
- if(11 to 19)//Moderate level of EMP damage, resulting in nearsightedness and ear damage
- eye_blurry = 1
- ear_damage = 1
- if(!alert)
- emote("alert")
- src << "\red Primary systems are now online."
- alert = 1
- if(prob(50))
- emp_damage -= 1
- if(10)
- alert = 0
- eye_blurry = 0
- ear_damage = 0
- emp_damage -= 1
- if(2 to 9)//Low level of EMP damage, has few effects(handled elsewhere)
- if(!alert)
- emote("notice")
- src << "\red System reboot nearly complete."
- alert = 1
- if(prob(25))
- emp_damage -= 1
- if(1)
- alert = 0
- src << "\red All systems restored."
- emp_damage -= 1
-
- //Other
- handle_statuses()
- return 1
-
-
- handle_regular_hud_updates()
-
- if (stat == 2 || (XRAY in src.mutations))
- sight |= SEE_TURFS
- sight |= SEE_MOBS
- sight |= SEE_OBJS
- see_in_dark = 8
- see_invisible = SEE_INVISIBLE_LEVEL_TWO
- else if (stat != 2)
- sight &= ~SEE_TURFS
- sight &= ~SEE_MOBS
- sight &= ~SEE_OBJS
- see_in_dark = 2
- see_invisible = SEE_INVISIBLE_LIVING
-
- if (healths)
- if (stat != 2)
- switch(health)
- if(100 to INFINITY)
- healths.icon_state = "health0"
- if(80 to 100)
- healths.icon_state = "health1"
- if(60 to 80)
- healths.icon_state = "health2"
- if(40 to 60)
- healths.icon_state = "health3"
- if(20 to 40)
- healths.icon_state = "health4"
- if(0 to 20)
- healths.icon_state = "health5"
- else
- healths.icon_state = "health6"
- else
- healths.icon_state = "health7"
-
- if(pullin) pullin.icon_state = "pull[pulling ? 1 : 0]"
- if (client)
- client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired)
-
- if ((blind && stat != 2))
- if ((blinded))
- blind.layer = 18
- else
- blind.layer = 0
-
- if (disabilities & NEARSIGHTED)
- client.screen += global_hud.vimpaired
-
- if (eye_blurry)
- client.screen += global_hud.blurry
-
- if (druggy)
- client.screen += global_hud.druggy
-
- if (stat != 2)
- if (machine)
- if (!( machine.check_eye(src) ))
- reset_view(null)
- else
- if(client && !client.adminobs)
- reset_view(null)
-
- return 1
-
-
-/*/mob/living/carbon/brain/emp_act(severity)
- if(!(container && istype(container, /obj/item/device/mmi)))
+/mob/living/carbon/brain/handle_environment(datum/gas_mixture/environment)
+ if(!environment)
return
+ var/environment_heat_capacity = environment.heat_capacity()
+ if(istype(get_turf(src), /turf/space))
+ var/turf/heat_turf = get_turf(src)
+ environment_heat_capacity = heat_turf.heat_capacity
+
+ if((environment.temperature > (T0C + 50)) || (environment.temperature < (T0C + 10)))
+ var/transfer_coefficient = 1
+
+ handle_temperature_damage(HEAD, environment.temperature, environment_heat_capacity*transfer_coefficient)
+
+ if(stat == DEAD)
+ bodytemperature += 0.1*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000)
+
+/mob/living/carbon/brain/proc/handle_temperature_damage(body_part, exposed_temperature, exposed_intensity)
+ if(status_flags & GODMODE)
+ return
+
+ if(exposed_temperature > bodytemperature)
+ var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0)
+ //adjustFireLoss(2.5*discomfort)
+ //adjustFireLoss(5.0*discomfort)
+ adjustFireLoss(20.0*discomfort)
+
else
- switch(severity)
- if(1)
- emp_damage += rand(20,30)
- if(2)
- emp_damage += rand(10,20)
- if(3)
- emp_damage += rand(0,10)
- ..()*/
\ No newline at end of file
+ var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0)
+ //adjustFireLoss(2.5*discomfort)
+ adjustFireLoss(5.0*discomfort)
+
+/mob/living/carbon/brain/handle_regular_status_updates()
+ updatehealth()
+
+ if(stat == DEAD)
+ blinded = 1
+ silent = 0
+ else
+ if(!container && (health < config.health_threshold_dead || ((world.time - timeofhostdeath) > config.revival_brain_life)))
+ death()
+ blinded =1
+ silent = 0
+ return 1
+
+ handle_statuses()
+
+ . = 1
+
+/mob/living/carbon/brain/handle_vision()
+ ..()
+
+ if (stat == 2 || (XRAY in src.mutations))
+ sight |= SEE_TURFS
+ sight |= SEE_MOBS
+ sight |= SEE_OBJS
+ see_in_dark = 8
+ see_invisible = SEE_INVISIBLE_LEVEL_TWO
+ else if (stat != 2)
+ sight &= ~SEE_TURFS
+ sight &= ~SEE_MOBS
+ sight &= ~SEE_OBJS
+ see_in_dark = 2
+ see_invisible = SEE_INVISIBLE_LIVING
+
+ handle_hud_icons_health()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 3be3cd9d865..e1f7057288e 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -534,36 +534,6 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
legcuffed = null
update_inv_legcuffed()
-/mob/living/carbon/proc/get_temperature(var/datum/gas_mixture/environment)
- var/loc_temp = T0C
- if(istype(loc, /obj/mecha))
- var/obj/mecha/M = loc
- loc_temp = M.return_temperature()
-
- else if(istype(loc, /obj/spacepod))
- var/obj/spacepod/S = loc
- loc_temp = S.return_temperature()
-
- else if(istype(loc, /obj/structure/transit_tube_pod))
- loc_temp = environment.temperature
-
- else if(istype(get_turf(src), /turf/space))
- var/turf/heat_turf = get_turf(src)
- loc_temp = heat_turf.temperature
-
- else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
- var/obj/machinery/atmospherics/unary/cryo_cell/C = loc
-
- if(C.air_contents.total_moles() < 10)
- loc_temp = environment.temperature
- else
- loc_temp = C.air_contents.temperature
-
- else
- loc_temp = environment.temperature
-
- return loc_temp
-
/mob/living/carbon/show_inv(mob/user)
user.set_machine(src)
var/dat = {"
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index b3b8db03ad7..97ac64daf82 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -25,4 +25,12 @@
var/pulse = PULSE_NORM //current pulse level
var/heart_attack = 0
- var/wetlevel = 0 //how wet the mob is
\ No newline at end of file
+ var/wetlevel = 0 //how wet the mob is
+
+ var/oxygen_alert = 0
+ var/toxins_alert = 0
+ var/co2_alert = 0
+ var/fire_alert = 0
+
+ var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
+ var/co2overloadtime = null
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 97ba63077e6..a967c5e2246 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -517,8 +517,6 @@
return 0
-
-/mob/living/carbon/human/var/co2overloadtime = null
/mob/living/carbon/human/var/temperature_resistance = T0C+75
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index c6513be0799..fe075d41aef 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -61,8 +61,6 @@
var/special_voice = "" // For changing our voice. Used by a symptom.
var/said_last_words=0
- var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
-
var/last_dam = -1 //Used for determining if we need to process all organs or just some or even none.
var/list/bad_external_organs = list()// organs we check until they are good.
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 64df304df4f..d148ac69d61 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -29,10 +29,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
#define TINT_BLIND 3 //Threshold of tint level to obscure vision fully
/mob/living/carbon/human
- var/oxygen_alert = 0
- var/toxins_alert = 0
- var/co2_alert = 0
- var/fire_alert = 0
+
var/pressure_alert = 0
var/prev_gender = null // Debug for plural genders
var/temperature_alert = 0
@@ -60,13 +57,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
voice = GetVoice()
if(..() && !in_stasis)
- if(mob_master.current_cycle % 4 == 2 || failed_last_breath) //First, resolve location and get a breath
- breathe() //Only try to take a breath every 4 ticks, unless suffocating
-
- else //Still give containing object the chance to interact
- if(istype(loc, /obj/))
- var/obj/location_as_object = loc
- location_as_object.handle_internal_lifeform(src, 0)
if(check_mutations)
domutcheck(src,null)
@@ -276,87 +266,75 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
var/obj/item/organ/external/O = pick(organs)
if(istype(O)) O.add_autopsy_data("Radiation Poisoning", damage)
-/mob/living/carbon/human/proc/breathe()
- if(reagents.has_reagent("lexorin")) return
- if(NO_BREATH in mutations) return // No breath mutation means no breathing.
- if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return
- if(species && (species.flags & NO_BREATHE)) return
+/mob/living/carbon/human/breathe()
+ if(reagents.has_reagent("lexorin"))
+ return
+ if(NO_BREATH in mutations)
+ return // No breath mutation means no breathing. //DID YOU REALLY NEED TO FUCKING STATE THIS?
+ if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
+ return
+ if(species && (species.flags & NO_BREATHE))
+ return
+
+ var/datum/gas_mixture/environment
+ if(loc)
+ environment = loc.return_air()
- var/datum/gas_mixture/environment = loc.return_air()
var/datum/gas_mixture/breath
- // HACK NEED CHANGING LATER
if(health <= config.health_threshold_crit)
losebreath++
- if(losebreath>0) //Suffocating so do not take a breath
+ if(losebreath > 0)
losebreath--
- if (prob(10)) //Gasp per 10 ticks? Sounds about right.
+ if(prob(10))
spawn emote("gasp")
if(istype(loc, /obj/))
- var/obj/location_as_object = loc
- location_as_object.handle_internal_lifeform(src, 0)
-
+ var/obj/loc_as_obj = loc
+ loc_as_obj.handle_internal_lifeform(src, 0)
else
- //First, check for air from internal atmosphere (using an air tank and mask generally)
- breath = get_breath_from_internal(BREATH_VOLUME) // Super hacky -- TLE
- //breath = get_breath_from_internal(0.5) // Manually setting to old BREATH_VOLUME amount -- TLE
+ breath = get_breath_from_internal(BREATH_VOLUME)
- //No breath from internal atmosphere so get breath from location
if(!breath)
- if(isobj(loc))
- var/obj/location_as_object = loc
- breath = location_as_object.handle_internal_lifeform(src, BREATH_MOLES)
- else if(isturf(loc))
+ if(isobj(loc)) //Breathe from loc as object
+ var/obj/loc_as_obj = loc
+ breath = loc_as_obj.handle_internal_lifeform(src, BREATH_MOLES)
+
+ else if(isturf(loc)) //Breathe from loc as turf
var/breath_moles = 0
- /*if(environment.return_pressure() > ONE_ATMOSPHERE)
- // Loads of air around (pressure effect will be handled elsewhere), so lets just take a enough to fill our lungs at normal atmos pressure (using n = Pv/RT)
- breath_moles = (ONE_ATMOSPHERE*BREATH_VOLUME/R_IDEAL_GAS_EQUATION*environment.temperature)
- else*/
- // Not enough air around, take a percentage of what's there to model this properly
- breath_moles = environment.total_moles()*BREATH_PERCENTAGE
+ if(environment)
+ breath_moles = environment.total_moles()*BREATH_PERCENTAGE
breath = loc.remove_air(breath_moles)
- if(!is_lung_ruptured())
- if(!breath || breath.total_moles() < BREATH_MOLES / 5 || breath.total_moles() > BREATH_MOLES * 5)
- if(prob(5))
- rupture_lung()
+ if(!is_lung_ruptured()) // THIS FUCKING EXCERPT, THIS LITTLE FUCKING EXCERPT, SNOWFLAKED
+ if(!breath || breath.total_moles() < BREATH_MOLES / 5 || breath.total_moles() > BREATH_MOLES * 5) // RIGHT IN THE CENTER OF THE FUCKING BREATHE PROC
+ if(prob(5)) // IT IS THE ONLY FUCKING REASONS HUMAN OVERRIDE breathe()
+ rupture_lung() // GOD FUCKING DAMNIT
- else //Still give containing object the chance to interact
+ else //Breathe from loc as obj again
if(istype(loc, /obj/))
- var/obj/location_as_object = loc
- location_as_object.handle_internal_lifeform(src, 0)
+ var/obj/loc_as_obj = loc
+ loc_as_obj.handle_internal_lifeform(src,0)
- handle_breath(breath)
-
- if(species.name=="Plasmaman") //this is stupid as fuck
- // Check if we're wearing our biosuit and mask.
- if (!istype(wear_suit,/obj/item/clothing/suit/space/eva/plasmaman) || !istype(head,/obj/item/clothing/head/helmet/space/eva/plasmaman))
- //testing("Plasmaman [src] leakin'. coverflags=[cover_flags]")
- // OH FUCK HE LEAKIN'.
- // This was OP.
- //environment.adjust(tx = environment.total_moles()*BREATH_PERCENTAGE) // About one breath's worth. (I know we aren't breathing it out, but this should be about the right amount)
- src << "Your body reacts with the atmosphere and bursts into flame!"
- adjust_fire_stacks(0.5)
- IgniteMob()
+ check_breath(breath)
if(breath)
loc.assume_air(breath)
-
- //spread some viruses while we are at it
- if (virus2.len > 0)
- if (prob(10) && get_infection_chance(src))
-// log_debug("[src] : Exhaling some viruses")
+ //spread virus2
+ if(virus2.len > 0)
+ if(prob(10) && get_infection_chance(src))
for(var/mob/living/carbon/M in view(1,src))
src.spread_disease_to(M)
+
+
// USED IN DEATHWHISPERS
/mob/living/carbon/human/proc/isInCrit()
// Health is in deep shit and we're not already dead
return health <= 0 && stat != 2
-/mob/living/carbon/human/proc/handle_breath(var/datum/gas_mixture/breath)
+/mob/living/carbon/human/check_breath(var/datum/gas_mixture/breath)
if(status_flags & GODMODE)
return 0
@@ -668,11 +646,10 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
return covered
/mob/living/carbon/human/handle_chemicals_in_body()
+ ..()
- if(reagents)
- reagents.metabolize(src)
-
- if(status_flags & GODMODE) return 0 //godmode
+ if(status_flags & GODMODE)
+ return 0 //godmode
if(species.flags & REQUIRE_LIGHT)
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
@@ -993,331 +970,46 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
return 1
+/mob/living/carbon/human/handle_vision()
+ client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask)
+ if(machine)
+ if(!machine.check_eye(src)) reset_view(null)
+ else
+ var/isRemoteObserve = 0
+ if((REMOTE_VIEW in mutations) && remoteview_target)
+ isRemoteObserve = 1
+
+ if(remoteview_target.stat != CONSCIOUS)
+ src << "Your psy-connection grows too faint to maintain!"
+ isRemoteObserve = 0
+
+ if(PSY_RESIST in remoteview_target.mutations)
+ src << "Your mind is shut out!"
+ isRemoteObserve = 0
+
+ // Not on the station or mining?
+ var/turf/temp_turf = get_turf(remoteview_target)
+ if(!temp_turf in config.contact_levels)
+ src << "Your psy-connection grows too faint to maintain!"
+ isRemoteObserve = 0
+
+ if(!isRemoteObserve && client && !client.adminobs)
+ remoteview_target = null
+ reset_view(null)
+
+ species.handle_vision(src)
+
+/mob/living/carbon/human/handle_hud_icons()
+ species.handle_hud_icons(src)
+
/mob/living/carbon/human/handle_regular_hud_updates()
if(hud_updateflag)
handle_hud_list()
- if(!client) return 0
+ if(..())
+ if(hud_updateflag)
+ handle_hud_list()
- if(hud_updateflag)
- handle_hud_list()
-
- update_action_buttons()
-
- for(var/image/hud in client.images)
- if(copytext(hud.icon_state,1,4) == "hud") //ugly, but icon comparison is worse, I believe
- client.images.Remove(hud)
-
- client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask,/* global_hud.nvg*/)
-
- if(damageoverlay.overlays)
- damageoverlay.overlays = list()
-
- if(stat == UNCONSCIOUS)
- //Critical damage passage overlay
- if(health <= 0)
- //var/image/I
- switch(health)
- if(-20 to -10)
- damageoverlay.overlays += unconscious_overlays["1"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "passage1")
- if(-30 to -20)
- damageoverlay.overlays += unconscious_overlays["2"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "passage2")
- if(-40 to -30)
- damageoverlay.overlays += unconscious_overlays["3"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "passage3")
- if(-50 to -40)
- damageoverlay.overlays += unconscious_overlays["4"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "passage4")
- if(-60 to -50)
- damageoverlay.overlays += unconscious_overlays["5"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "passage5")
- if(-70 to -60)
- damageoverlay.overlays += unconscious_overlays["6"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "passage6")
- if(-80 to -70)
- damageoverlay.overlays += unconscious_overlays["7"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "passage7")
- if(-90 to -80)
- damageoverlay.overlays += unconscious_overlays["8"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "passage8")
- if(-95 to -90)
- damageoverlay.overlays += unconscious_overlays["9"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "passage9")
- if(-INFINITY to -95)
- damageoverlay.overlays += unconscious_overlays["10"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "passage10")
- //damageoverlay.overlays += I
- else
- //Oxygen damage overlay
- if(oxyloss)
- //var/image/I
- switch(oxyloss)
- if(10 to 20)
- damageoverlay.overlays += oxyloss_overlays["1"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay1")
- if(20 to 25)
- damageoverlay.overlays += oxyloss_overlays["2"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay2")
- if(25 to 30)
- damageoverlay.overlays += oxyloss_overlays["3"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay3")
- if(30 to 35)
- damageoverlay.overlays += oxyloss_overlays["4"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay4")
- if(35 to 40)
- damageoverlay.overlays += oxyloss_overlays["5"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay5")
- if(40 to 45)
- damageoverlay.overlays += oxyloss_overlays["6"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay6")
- if(45 to INFINITY)
- damageoverlay.overlays += oxyloss_overlays["7"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay7")
- //damageoverlay.overlays += I
-
- //Fire and Brute damage overlay (BSSR)
- var/hurtdamage = src.getBruteLoss() + src.getFireLoss() + damageoverlaytemp
- damageoverlaytemp = 0 // We do this so we can detect if someone hits us or not.
- if(hurtdamage)
- //var/image/I
- switch(hurtdamage)
- if(10 to 25)
- damageoverlay.overlays += brutefireloss_overlays["1"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay1")
- if(25 to 40)
- damageoverlay.overlays += brutefireloss_overlays["2"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay2")
- if(40 to 55)
- damageoverlay.overlays += brutefireloss_overlays["3"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay3")
- if(55 to 70)
- damageoverlay.overlays += brutefireloss_overlays["4"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay4")
- if(70 to 85)
- damageoverlay.overlays += brutefireloss_overlays["5"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay5")
- if(85 to INFINITY)
- damageoverlay.overlays += brutefireloss_overlays["6"]//image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay6")
- //damageoverlay.overlays += I
-
- see_invisible = SEE_INVISIBLE_LIVING
- if( stat == DEAD )
- sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS)
- see_in_dark = 8
- if(!druggy) see_invisible = SEE_INVISIBLE_LEVEL_TWO
- if(healths) healths.icon_state = "health7" //DEAD healthmeter
- else
- sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS)
-
- if(mind && mind.vampire)
- if((VAMP_VISION in mind.vampire.powers) && !(VAMP_FULL in mind.vampire.powers))
- sight |= SEE_MOBS
- if((VAMP_FULL in mind.vampire.powers))
- sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
- see_in_dark = 8
- if(!druggy) see_invisible = SEE_INVISIBLE_LEVEL_TWO
- if(XRAY in mutations)
- sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
- see_in_dark = 8
- if(!druggy) see_invisible = SEE_INVISIBLE_LEVEL_TWO
-
- if(seer==1)
- var/obj/effect/rune/R = locate() in loc
- if(R && R.word1 == cultwords["see"] && R.word2 == cultwords["hell"] && R.word3 == cultwords["join"])
- see_invisible = SEE_INVISIBLE_OBSERVER
- else
- see_invisible = SEE_INVISIBLE_LIVING
- seer = 0
-
- if(glasses || head)
- if(glasses)
- var/obj/item/clothing/glasses/G = glasses
- if(istype(G))
- see_in_dark = (G.darkness_view ? see_in_dark + G.darkness_view : species.darksight) // Otherwise we keep our darkness view with togglable nightvision.
- if(G.vision_flags) // MESONS
- sight |= G.vision_flags
- if(!druggy)
- see_invisible = SEE_INVISIBLE_MINIMUM
- if(!G.see_darkness)
- see_invisible = SEE_INVISIBLE_MINIMUM
- /* HUD shit goes here, as long as it doesn't modify sight flags */
- // The purpose of this is to stop xray and w/e from preventing you from using huds -- Love, Doohl
-
- switch(G.HUDType)
- if(SECHUD)
- process_sec_hud(src,1)
- if(MEDHUD)
- process_med_hud(src,1)
- if(ANTAGHUD)
- process_antag_hud(src)
-
- if(head)
- var/obj/item/clothing/head/H = head
- if(istype(H))
- if(H.vision_flags) // MESONS
- sight |= H.vision_flags
- if(!druggy)
- see_invisible = SEE_INVISIBLE_MINIMUM
- if(!H.see_darkness)
- see_invisible = SEE_INVISIBLE_MINIMUM
- /* HUD shit goes here, as long as it doesn't modify sight flags */
- // The purpose of this is to stop xray and w/e from preventing you from using huds -- Love, Doohl
-
- switch(H.HUDType)
- if(SECHUD)
- process_sec_hud(src,1)
- if(MEDHUD)
- process_med_hud(src,1)
- if(ANTAGHUD)
- process_antag_hud(src)
-
- else if(!seer)
- see_in_dark = species.darksight
- see_invisible = SEE_INVISIBLE_LIVING
-
- if(vision_type)
- see_in_dark = max(see_in_dark, vision_type.see_in_dark, species.darksight)
- see_invisible = vision_type.see_invisible
- if(vision_type.light_sensitive)
- weakeyes = 1
- sight |= vision_type.sight_flags
-
- if(see_override) //Override all
- see_invisible = see_override
-
- if(healths)
- if (analgesic)
- healths.icon_state = "health_health_numb"
- else
- switch(hal_screwyhud)
- if(1) healths.icon_state = "health6"
- if(2) healths.icon_state = "health7"
- else
- //switch(health - halloss)
- switch(100 - ((species && species.flags & NO_PAIN) ? 0 : traumatic_shock) - staminaloss)
- if(100 to INFINITY) healths.icon_state = "health0"
- if(80 to 100) healths.icon_state = "health1"
- if(60 to 80) healths.icon_state = "health2"
- if(40 to 60) healths.icon_state = "health3"
- if(20 to 40) healths.icon_state = "health4"
- if(0 to 20) healths.icon_state = "health5"
- else healths.icon_state = "health6"
-
- if(healthdoll)
- healthdoll.overlays.Cut()
- if(stat == DEAD)
- healthdoll.icon_state = "healthdoll_DEAD"
- else
- healthdoll.icon_state = "healthdoll_OVERLAY"
- for(var/obj/item/organ/external/O in organs)
- var/damage = O.burn_dam + O.brute_dam
- var/comparison = (O.max_damage/5)
- var/icon_num = 0
- if(damage)
- icon_num = 1
- if(damage > (comparison))
- icon_num = 2
- if(damage > (comparison*2))
- icon_num = 3
- if(damage > (comparison*3))
- icon_num = 4
- if(damage > (comparison*4))
- icon_num = 5
- if(icon_num)
- healthdoll.overlays += image('icons/mob/screen_gen.dmi',"[O.limb_name][icon_num]")
-
- if(nutrition_icon)
- switch(nutrition)
- if(450 to INFINITY) nutrition_icon.icon_state = "nutrition0"
- if(350 to 450) nutrition_icon.icon_state = "nutrition1"
- if(250 to 350) nutrition_icon.icon_state = "nutrition2"
- if(150 to 250) nutrition_icon.icon_state = "nutrition3"
- else nutrition_icon.icon_state = "nutrition4"
-
- if(pressure)
- pressure.icon_state = "pressure[pressure_alert]"
-
- if(toxin)
- if(hal_screwyhud == 4 || toxins_alert) toxin.icon_state = "tox1"
- else toxin.icon_state = "tox0"
- if(oxygen)
- if(hal_screwyhud == 3 || oxygen_alert) oxygen.icon_state = "oxy1"
- else oxygen.icon_state = "oxy0"
- if(fire)
- if(fire_alert) fire.icon_state = "fire[fire_alert]" //fire_alert is either 0 if no alert, 1 for cold and 2 for heat.
- else fire.icon_state = "fire0"
-
- if(bodytemp)
- if (!species)
- switch(bodytemperature) //310.055 optimal body temp
- if(370 to INFINITY) bodytemp.icon_state = "temp4"
- if(350 to 370) bodytemp.icon_state = "temp3"
- if(335 to 350) bodytemp.icon_state = "temp2"
- if(320 to 335) bodytemp.icon_state = "temp1"
- if(300 to 320) bodytemp.icon_state = "temp0"
- if(295 to 300) bodytemp.icon_state = "temp-1"
- if(280 to 295) bodytemp.icon_state = "temp-2"
- if(260 to 280) bodytemp.icon_state = "temp-3"
- else bodytemp.icon_state = "temp-4"
- else
- var/temp_step
- if (bodytemperature >= species.body_temperature)
- temp_step = (species.heat_level_1 - species.body_temperature)/4
-
- if (bodytemperature >= species.heat_level_1)
- bodytemp.icon_state = "temp4"
- else if (bodytemperature >= species.body_temperature + temp_step*3)
- bodytemp.icon_state = "temp3"
- else if (bodytemperature >= species.body_temperature + temp_step*2)
- bodytemp.icon_state = "temp2"
- else if (bodytemperature >= species.body_temperature + temp_step*1)
- bodytemp.icon_state = "temp1"
- else
- bodytemp.icon_state = "temp0"
-
- else if (bodytemperature < species.body_temperature)
- temp_step = (species.body_temperature - species.cold_level_1)/4
-
- if (bodytemperature <= species.cold_level_1)
- bodytemp.icon_state = "temp-4"
- else if (bodytemperature <= species.body_temperature - temp_step*3)
- bodytemp.icon_state = "temp-3"
- else if (bodytemperature <= species.body_temperature - temp_step*2)
- bodytemp.icon_state = "temp-2"
- else if (bodytemperature <= species.body_temperature - temp_step*1)
- bodytemp.icon_state = "temp-1"
- else
- bodytemp.icon_state = "temp0"
-
-// This checks how much the mob's eyewear impairs their vision
- if(tinttotal >= TINT_IMPAIR)
- if(tinted_weldhelh)
- if(tinttotal >= TINT_BLIND)
- blinded = 1 // You get the sudden urge to learn to play keyboard
- client.screen += global_hud.darkMask
- else
- client.screen += global_hud.darkMask
-
- if(blind)
- if(blinded) blind.layer = 18
- else blind.layer = 0
-
- if(disabilities & NEARSIGHTED) //this looks meh but saves a lot of memory by not requiring to add var/prescription
- if(glasses) //to every /obj/item
- var/obj/item/clothing/glasses/G = glasses
- if(!G.prescription)
- client.screen += global_hud.vimpaired
- else
- client.screen += global_hud.vimpaired
-
- if(eye_blurry) client.screen += global_hud.blurry
- if(druggy) client.screen += global_hud.druggy
-
- if(machine)
- if(!machine.check_eye(src)) reset_view(null)
- else
- var/isRemoteObserve = 0
- if((REMOTE_VIEW in mutations) && remoteview_target)
- isRemoteObserve = 1
- // Is he unconscious or dead?
- if(remoteview_target.stat!=CONSCIOUS)
- src << "Your psy-connection grows too faint to maintain!"
- isRemoteObserve = 0
-
- // Does he have psy resist?
- if(PSY_RESIST in remoteview_target.mutations)
- src << "Your mind is shut out!"
- isRemoteObserve = 0
-
- // Not on the station or mining?
- var/turf/temp_turf = get_turf(remoteview_target)
- if((!(temp_turf.z in config.contact_levels)) || remoteview_target.stat!=CONSCIOUS)
- src << "Your psy-connection grows too faint to maintain!"
- isRemoteObserve = 0
- if(!isRemoteObserve && client && !client.adminobs)
- remoteview_target = null
- reset_view(null)
- return 1
/mob/living/carbon/human/handle_random_events()
// Puke if toxloss is too high
diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm
index 65b8060899d..090d640e63a 100644
--- a/code/modules/mob/living/carbon/human/species/plasmaman.dm
+++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm
@@ -216,4 +216,10 @@
if(heat_level_3 to INFINITY)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
+
+ if(!istype(H.wear_suit, /obj/item/clothing/suit/space/eva/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/eva/plasmaman))
+ H << "Your body reacts with the atmosphere and bursts into flame!"
+ H.adjust_fire_stacks(0.5)
+ H.IgniteMob()
+
return 1
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 1ed4360db60..56d63785db1 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -366,4 +366,196 @@
damage = 6 //they're huge! they should do a little more damage, i'd even go for 15-20 maybe...
/datum/species/proc/handle_can_equip(obj/item/I, slot, disable_warning = 0, mob/living/carbon/human/user)
- return 0
\ No newline at end of file
+ return 0
+
+/datum/species/proc/handle_vision(mob/living/carbon/human/H)
+ if( H.stat == DEAD )
+ H.sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS)
+ H.see_in_dark = 8
+ if(!H.druggy) H.see_invisible = SEE_INVISIBLE_LEVEL_TWO
+ else
+ H.sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS)
+
+ if(H.mind && H.mind.vampire)
+ if(VAMP_VISION in H.mind.vampire.powers && !(VAMP_FULL in H.mind.vampire.powers))
+ H.sight |= SEE_MOBS
+ else if(VAMP_FULL in H.mind.vampire.powers)
+ H.sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
+ H.see_in_dark = 8
+ if(!H.druggy) H.see_invisible = SEE_INVISIBLE_LEVEL_TWO
+
+ if(XRAY in H.mutations)
+ H.sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
+ H.see_in_dark = 8
+ if(!H.druggy) H.see_invisible = SEE_INVISIBLE_LEVEL_TWO
+
+ if(H.seer == 1)
+ var/obj/effect/rune/R = locate() in H.loc
+ if(R && R.word1 == cultwords["see"] && R.word2 == cultwords["hell"] && R.word3 == cultwords["join"])
+ H.see_invisible = SEE_INVISIBLE_OBSERVER
+ else
+ H.see_invisible = SEE_INVISIBLE_LIVING
+ H.seer = 0
+
+ else if(!H.seer)
+ H.see_in_dark = darksight
+ H.see_invisible = SEE_INVISIBLE_LIVING
+
+ // This checks how much the mob's eyewear impairs their vision
+ if(H.tinttotal >= TINT_IMPAIR)
+ if(tinted_weldhelh)
+ if(H.tinttotal >= TINT_BLIND)
+ H.eye_blind = max(H.eye_blind, 1)
+ if(H.client)
+ H.client.screen += global_hud.darkMask
+
+ if(H.glasses)
+ if(istype(H.glasses, /obj/item/clothing/glasses))
+ var/obj/item/clothing/glasses/G = H.glasses
+ H.sight |= G.vision_flags
+ H.see_in_dark = G.darkness_view
+
+ if(!G.see_darkness)
+ H.see_invisible = SEE_INVISIBLE_MINIMUM
+
+ switch(G.HUDType)
+ if(SECHUD)
+ process_sec_hud(H,1)
+ if(MEDHUD)
+ process_med_hud(H,1)
+ if(ANTAGHUD)
+ process_antag_hud(H)
+
+ if(H.head)
+ if(istype(H.head, /obj/item/clothing/head))
+ var/obj/item/clothing/head/hat = H.head
+ H.sight |= hat.vision_flags
+
+ if(!hat.see_darkness)
+ H.see_invisible = SEE_INVISIBLE_MINIMUM
+
+ switch(hat.HUDType)
+ if(SECHUD)
+ process_sec_hud(H,1)
+ if(MEDHUD)
+ process_med_hud(H,1)
+ if(ANTAGHUD)
+ process_antag_hud(H)
+
+ if(H.see_override) //Override all
+ H.see_invisible = H.see_override
+
+ if(H.blind)
+ if(H.blinded) H.blind.layer = 18
+ else H.blind.layer = 0
+
+ if(H.disabilities & NEARSIGHTED) //this looks meh but saves a lot of memory by not requiring to add var/prescription
+ if(H.glasses) //to every /obj/item
+ var/obj/item/clothing/glasses/G = H.glasses
+ if(!G.prescription)
+ H.client.screen += global_hud.vimpaired
+ else
+ H.client.screen += global_hud.vimpaired
+
+ if(H.eye_blurry) H.client.screen += global_hud.blurry
+ if(H.druggy) H.client.screen += global_hud.druggy
+
+/datum/species/proc/handle_hud_icons(mob/living/carbon/human/H)
+ if(H.healths)
+ if(H.analgesic)
+ H.healths.icon_state = "health_health_numb"
+ else
+ if(H.stat == DEAD)
+ H.healths.icon_state = "health7"
+ else
+ switch(H.hal_screwyhud)
+ if(1) H.healths.icon_state = "health6"
+ if(2) H.healths.icon_state = "health7"
+ if(5) H.healths.icon_state = "health0"
+ else
+ switch(H.health - ((flags & NO_PAIN) ? 0 : H.traumatic_shock) - H.staminaloss)
+ if(100 to INFINITY) H.healths.icon_state = "health0"
+ if(80 to 100) H.healths.icon_state = "health1"
+ if(60 to 80) H.healths.icon_state = "health2"
+ if(40 to 60) H.healths.icon_state = "health3"
+ if(20 to 40) H.healths.icon_state = "health4"
+ if(0 to 20) H.healths.icon_state = "health5"
+ else H.healths.icon_state = "health6"
+
+ if(H.healthdoll)
+ H.healthdoll.overlays.Cut()
+ if(H.stat == DEAD)
+ H.healthdoll.icon_state = "healthdoll_DEAD"
+ else
+ H.healthdoll.icon_state = "healthdoll_OVERLAY"
+ for(var/obj/item/organ/external/O in H.organs)
+ var/damage = O.burn_dam + O.brute_dam
+ var/comparison = (O.max_damage/5)
+ var/icon_num = 0
+ if(damage)
+ icon_num = 1
+ if(damage > (comparison))
+ icon_num = 2
+ if(damage > (comparison*2))
+ icon_num = 3
+ if(damage > (comparison*3))
+ icon_num = 4
+ if(damage > (comparison*4))
+ icon_num = 5
+ if(icon_num)
+ H.healthdoll.overlays += image('icons/mob/screen_gen.dmi',"[O.limb_name][icon_num]")
+
+ if(H.nutrition_icon)
+ switch(H.nutrition)
+ if(450 to INFINITY) H.nutrition_icon.icon_state = "nutrition0"
+ if(350 to 450) H.nutrition_icon.icon_state = "nutrition1"
+ if(250 to 350) H.nutrition_icon.icon_state = "nutrition2"
+ if(150 to 250) H.nutrition_icon.icon_state = "nutrition3"
+ else H.nutrition_icon.icon_state = "nutrition4"
+
+
+ // BAY SHIT
+ if(H.pressure)
+ H.pressure.icon_state = "pressure[H.pressure_alert]"
+
+ if(H.toxin)
+ if(H.hal_screwyhud == 4 || H.toxins_alert) H.toxin.icon_state = "tox1"
+ else H.toxin.icon_state = "tox0"
+ if(H.oxygen)
+ if(H.hal_screwyhud == 3 || H.oxygen_alert) H.oxygen.icon_state = "oxy1"
+ else H.oxygen.icon_state = "oxy0"
+ if(H.fire)
+ if(H.fire_alert) H.fire.icon_state = "fire[H.fire_alert]" //fire_alert is either 0 if no alert, 1 for cold and 2 for heat.
+ else H.fire.icon_state = "fire0"
+
+ if(H.bodytemp)
+ var/temp_step
+ if(H.bodytemperature >= body_temperature)
+ temp_step = (heat_level_1 - body_temperature)/4
+
+ if(H.bodytemperature >= heat_level_1)
+ H.bodytemp.icon_state = "temp4"
+ else if(H.bodytemperature >= body_temperature + temp_step*3)
+ H.bodytemp.icon_state = "temp3"
+ else if(H.bodytemperature >= body_temperature + temp_step*2)
+ H.bodytemp.icon_state = "temp2"
+ else if(H.bodytemperature >= body_temperature + temp_step*1)
+ H.bodytemp.icon_state = "temp1"
+ else
+ H.bodytemp.icon_state = "temp0"
+
+ else if(H.bodytemperature < body_temperature)
+ temp_step = (body_temperature - cold_level_1)/4
+
+ if(H.bodytemperature <= cold_level_1)
+ H.bodytemp.icon_state = "temp-4"
+ else if(H.bodytemperature <= body_temperature - temp_step*3)
+ H.bodytemp.icon_state = "temp-3"
+ else if(H.bodytemperature <= body_temperature - temp_step*2)
+ H.bodytemp.icon_state = "temp-2"
+ else if(H.bodytemperature <= body_temperature - temp_step*1)
+ H.bodytemp.icon_state = "temp-1"
+ else
+ H.bodytemp.icon_state = "temp0"
+
+ return 1
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index b65aa6623d2..16dec650e43 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -1,3 +1,186 @@
+/mob/living/carbon/Life()
+ set invisibility = 0
+ set background = BACKGROUND_ENABLED
+
+ if(notransform)
+ return
+ if(!loc)
+ return
+
+ if(..())
+ . = 1
+ handle_changeling()
+
+ handle_wetness()
+
+
+///////////////
+// BREATHING //
+///////////////
+
+//Start of a breath chain, calls breathe()
+/mob/living/carbon/handle_breathing()
+ if(mob_master.current_cycle%4==2 || failed_last_breath)
+ breathe() //Breathe per 4 ticks, unless suffocating
+ else
+ if(istype(loc, /obj/))
+ var/obj/location_as_object = loc
+ location_as_object.handle_internal_lifeform(src,0)
+
+//Second link in a breath chain, calls check_breath()
+/mob/living/carbon/proc/breathe()
+ if(reagents.has_reagent("lexorin"))
+ return
+ if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
+ return
+ if(NO_BREATH in mutations)
+ return // No breath mutation means no breathing.
+
+ var/datum/gas_mixture/environment
+ if(loc)
+ environment = loc.return_air()
+
+ var/datum/gas_mixture/breath
+
+ if(health <= config.health_threshold_crit)
+ losebreath++
+
+ if(losebreath > 0)
+ losebreath--
+ if(prob(10))
+ spawn emote("gasp")
+ if(istype(loc, /obj/))
+ var/obj/loc_as_obj = loc
+ loc_as_obj.handle_internal_lifeform(src, 0)
+ else
+ //Breathe from internal
+ breath = get_breath_from_internal(BREATH_VOLUME)
+
+ if(!breath)
+
+ if(isobj(loc)) //Breathe from loc as object
+ var/obj/loc_as_obj = loc
+ breath = loc_as_obj.handle_internal_lifeform(src, BREATH_MOLES)
+
+ else if(isturf(loc)) //Breathe from loc as turf
+ var/breath_moles = 0
+ if(environment)
+ breath_moles = environment.total_moles()*BREATH_PERCENTAGE
+
+ breath = loc.remove_air(breath_moles)
+
+ else //Breathe from loc as obj again
+ if(istype(loc, /obj/))
+ var/obj/loc_as_obj = loc
+ loc_as_obj.handle_internal_lifeform(src,0)
+
+ check_breath(breath)
+
+ if(breath)
+ loc.assume_air(breath)
+ //spread virus2
+ if(virus2.len > 0)
+ if(prob(10) && get_infection_chance(src))
+ for(var/mob/living/carbon/M in view(1,src))
+ src.spread_disease_to(M)
+
+
+//Third link in a breath chain, calls handle_breath_temperature()
+/mob/living/carbon/proc/check_breath(datum/gas_mixture/breath)
+ if(status_flags & GODMODE)
+ return 0
+
+ //CRIT
+ if(!breath || (breath.total_moles() == 0))
+ adjustOxyLoss(1)
+ failed_last_breath = 1
+
+ oxygen_alert = max(oxygen_alert, 1)
+ return 0
+
+ var/safe_oxy_min = 16
+ var/safe_co2_max = 10
+ var/safe_tox_max = 0.05
+ var/SA_para_min = 1
+ var/SA_sleep_min = 1
+ var/oxygen_used = 0
+ var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME
+
+ var/O2_partialpressure = (breath.oxygen/breath.total_moles())*breath_pressure
+ var/Toxins_partialpressure = (breath.toxins/breath.total_moles())*breath_pressure
+ var/CO2_partialpressure = (breath.carbon_dioxide/breath.total_moles())*breath_pressure
+
+
+ //OXYGEN
+ if(O2_partialpressure < safe_oxy_min) //Not enough oxygen
+ if(prob(20))
+ spawn(0)
+ emote("gasp")
+ if(O2_partialpressure > 0)
+ var/ratio = safe_oxy_min/O2_partialpressure
+ adjustOxyLoss(min(5*ratio, 3))
+ failed_last_breath = 1
+ oxygen_used = breath.oxygen*ratio/6
+ else
+ adjustOxyLoss(3)
+ failed_last_breath = 1
+ oxygen_alert = max(oxygen_alert, 1)
+
+ else //Enough oxygen
+ failed_last_breath = 0
+ adjustOxyLoss(-5)
+ oxygen_used = breath.oxygen/6
+ oxygen_alert = 0
+
+ breath.oxygen -= oxygen_used
+ breath.carbon_dioxide += oxygen_used
+
+ //CARBON DIOXIDE
+ if(CO2_partialpressure > safe_co2_max)
+ if(!co2overloadtime)
+ co2overloadtime = world.time
+ else if(world.time - co2overloadtime > 120)
+ Paralyse(3)
+ adjustOxyLoss(3)
+ if(world.time - co2overloadtime > 300)
+ adjustOxyLoss(8)
+ if(prob(20))
+ spawn(0) emote("cough")
+ co2_alert = max(co2_alert, 1)
+ else
+ co2_alert = 0
+ co2overloadtime = 0
+
+ //TOXINS/PLASMA
+ if(Toxins_partialpressure > safe_tox_max)
+ var/ratio = (breath.toxins/safe_tox_max) * 10
+ if(reagents)
+ reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
+ toxins_alert = max(toxins_alert, 1)
+ else
+ toxins_alert = 0
+
+ //TRACE GASES
+ if(breath.trace_gases.len)
+ for(var/datum/gas/sleeping_agent/SA in breath.trace_gases)
+ var/SA_partialpressure = (SA.moles/breath.total_moles())*breath_pressure
+ if(SA_partialpressure > SA_para_min)
+ Paralyse(3)
+ if(SA_partialpressure > SA_sleep_min)
+ sleeping = max(sleeping+2, 10)
+ else if(SA_partialpressure > 0.01)
+ if(prob(20))
+ spawn(0) emote(pick("giggle","laugh"))
+
+ //BREATH TEMPERATURE
+ handle_breath_temperature(breath)
+
+ return 1
+
+//Fourth and final link in a breath chain
+/mob/living/carbon/proc/handle_breath_temperature(datum/gas_mixture/breath)
+ return
+
/mob/living/carbon/proc/get_breath_from_internal(volume_needed)
if(internal)
if (!contents.Find(internal))
@@ -13,98 +196,46 @@
internals.icon_state = "internal0"
return
-/mob/living/carbon/Life()
- set invisibility = 0
- set background = BACKGROUND_ENABLED
-
- if(notransform)
- return
- if(!loc)
- return
- var/datum/gas_mixture/environment = loc.return_air()
-
- //Handle temperature/pressure differences between body and environment
- handle_environment(environment)
-
- //Apparently, the person who wrote this code designed it so that
- //blinded get reset each cycle and then get activated later in the
- //code. Very ugly. I dont care. Moving this stuff here so its easy
- //to find it.
- blinded = null
-
- handle_regular_status_updates() // Status updates, death etc.
-
- if(stat != DEAD)
-
- //Updates the number of stored chemicals for powers
- handle_changeling()
-
- //Mutations and radiation
- handle_mutations_and_radiation()
-
- //Chemicals in the body
- handle_chemicals_in_body()
-
- //Disabilities
- handle_disabilities()
-
- //Random events (vomiting etc)
- handle_random_events()
-
- . = 1
-
- handle_fire()
-
- //Decrease wetness over time
- handle_wetness()
-
- //stuff in the stomach
- handle_stomach()
-
- update_canmove()
-
- update_gravity(mob_has_gravity())
-
- for(var/obj/item/weapon/grab/G in src)
- G.process()
-
- handle_actions()
-
- if(client)
- handle_regular_hud_updates()
-
- return .
-
-
-
//remember to remove the "proc" of the child procs of these.
/mob/living/carbon/proc/handle_changeling()
return
-/mob/living/carbon/proc/handle_mutations_and_radiation()
- return
+/mob/living/carbon/handle_mutations_and_radiation()
+ if(radiation)
-/mob/living/carbon/proc/handle_chemicals_in_body()
- return
+ switch(radiation)
+ if(0 to 50)
+ radiation--
+ if(prob(25))
+ adjustToxLoss(1)
+ updatehealth()
-/mob/living/carbon/proc/handle_disabilities()
- return
+ if(50 to 75)
+ radiation -= 2
+ adjustToxLoss(1)
+ if(prob(5))
+ radiation -= 5
+ updatehealth()
-/mob/living/carbon/proc/handle_random_events()
- return
+ if(75 to 100)
+ radiation -= 3
+ adjustToxLoss(3)
+ updatehealth()
-/mob/living/carbon/proc/handle_environment(var/datum/gas_mixture/environment)
- return
+ radiation = Clamp(radiation, 0, 100)
+
+
+/mob/living/carbon/handle_chemicals_in_body()
+ if(reagents)
+ reagents.metabolize(src)
-/mob/living/carbon/proc/handle_regular_status_updates()
- return
/mob/living/carbon/proc/handle_wetness()
if(mob_master.current_cycle%20==2) //dry off a bit once every 20 ticks or so
wetlevel = max(wetlevel - 1,0)
-/mob/living/carbon/proc/handle_stomach()
+/mob/living/carbon/handle_stomach()
spawn(0)
for(var/mob/living/M in stomach_contents)
if(M.loc != src)
@@ -121,5 +252,245 @@
M.adjustBruteLoss(5)
nutrition += 10
-/mob/living/carbon/proc/handle_regular_hud_updates()
- return
\ No newline at end of file
+//This updates the health and status of the mob (conscious, unconscious, dead)
+/mob/living/carbon/handle_regular_status_updates()
+
+ if(..()) //alive
+
+ if(health <= config.health_threshold_dead)
+ death()
+ return
+
+ if(getOxyLoss() > 50 || health <= config.health_threshold_crit)
+ Paralyse(3)
+ stat = UNCONSCIOUS
+
+ if(sleeping)
+ stat = UNCONSCIOUS
+
+ return 1
+
+/mob/living/carbon/proc/CheckStamina()
+ if(staminaloss)
+ var/total_health = (health - staminaloss)
+ if(total_health <= config.health_threshold_crit && !stat)
+ src << "You're too exhausted to keep going..."
+ Weaken(5)
+ setStaminaLoss(health - 2)
+ return
+ setStaminaLoss(max((staminaloss - 2), 0))
+
+//this updates all special effects: stunned, sleeping, weakened, druggy, stuttering, etc..
+/mob/living/carbon/handle_status_effects()
+ ..()
+
+ CheckStamina()
+
+ if(sleeping)
+ handle_dreams()
+ adjustStaminaLoss(-10)
+ sleeping = max(sleeping-1, 0)
+ if( prob(10) && health && !hal_crit )
+ spawn(0)
+ emote("snore")
+
+
+ var/restingpwr = 1 + 4 * resting
+
+ //Dizziness
+ if(dizziness)
+ var/client/C = client
+ var/pixel_x_diff = 0
+ var/pixel_y_diff = 0
+ var/temp
+ var/saved_dizz = dizziness
+ if(C)
+ var/oldsrc = src
+ var/amplitude = dizziness*(sin(dizziness * 0.044 * world.time) + 1) / 70 // This shit is annoying at high strength
+ src = null
+ spawn(0)
+ if(C)
+ temp = amplitude * sin(0.008 * saved_dizz * world.time)
+ pixel_x_diff += temp
+ C.pixel_x += temp
+ temp = amplitude * cos(0.008 * saved_dizz * world.time)
+ pixel_y_diff += temp
+ C.pixel_y += temp
+ sleep(3)
+ if(C)
+ temp = amplitude * sin(0.008 * saved_dizz * world.time)
+ pixel_x_diff += temp
+ C.pixel_x += temp
+ temp = amplitude * cos(0.008 * saved_dizz * world.time)
+ pixel_y_diff += temp
+ C.pixel_y += temp
+ sleep(3)
+ if(C)
+ C.pixel_x -= pixel_x_diff
+ C.pixel_y -= pixel_y_diff
+ src = oldsrc
+ dizziness = max(dizziness - restingpwr, 0)
+
+ if(drowsyness)
+ drowsyness = max(drowsyness - restingpwr, 0)
+ eye_blurry = max(2, eye_blurry)
+ if(prob(5))
+ sleeping += 1
+ Paralyse(5)
+
+ if(confused)
+ confused = max(0, confused - 1)
+
+ //Jitteryness
+ if(jitteriness)
+ do_jitter_animation(jitteriness)
+ jitteriness = max(jitteriness - restingpwr, 0)
+
+ if(stuttering)
+ stuttering = max(stuttering-1, 0)
+
+ if(slurring)
+ slurring = max(slurring-1,0)
+
+ if(silent)
+ silent = max(silent-1, 0)
+
+ if(druggy)
+ druggy = max(druggy-1, 0)
+
+ if(hallucination)
+ spawn handle_hallucinations()
+
+ if(hallucination<=2)
+ hallucination = 0
+ else
+ hallucination -= 2
+
+//this handles hud updates. Calls update_vision() and handle_hud_icons()
+/mob/living/carbon/handle_regular_hud_updates()
+ if(!client) return 0
+
+ if(damageoverlay)
+ if(damageoverlay.overlays)
+ damageoverlay.overlays = list()
+
+ if(stat == UNCONSCIOUS)
+ //Critical damage passage overlay
+ if(health <= config.health_threshold_crit)
+ var/image/I = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "passage0")
+ I.blend_mode = BLEND_OVERLAY //damageoverlay is BLEND_MULTIPLY
+ switch(health)
+ if(-20 to -10)
+ I.icon_state = "passage1"
+ if(-30 to -20)
+ I.icon_state = "passage2"
+ if(-40 to -30)
+ I.icon_state = "passage3"
+ if(-50 to -40)
+ I.icon_state = "passage4"
+ if(-60 to -50)
+ I.icon_state = "passage5"
+ if(-70 to -60)
+ I.icon_state = "passage6"
+ if(-80 to -70)
+ I.icon_state = "passage7"
+ if(-90 to -80)
+ I.icon_state = "passage8"
+ if(-95 to -90)
+ I.icon_state = "passage9"
+ if(-INFINITY to -95)
+ I.icon_state = "passage10"
+ damageoverlay.overlays += I
+ else
+ //Oxygen damage overlay
+ if(oxyloss)
+ var/image/I = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "oxydamageoverlay0")
+ switch(oxyloss)
+ if(10 to 20)
+ I.icon_state = "oxydamageoverlay1"
+ if(20 to 25)
+ I.icon_state = "oxydamageoverlay2"
+ if(25 to 30)
+ I.icon_state = "oxydamageoverlay3"
+ if(30 to 35)
+ I.icon_state = "oxydamageoverlay4"
+ if(35 to 40)
+ I.icon_state = "oxydamageoverlay5"
+ if(40 to 45)
+ I.icon_state = "oxydamageoverlay6"
+ if(45 to INFINITY)
+ I.icon_state = "oxydamageoverlay7"
+ damageoverlay.overlays += I
+
+ //Fire and Brute damage overlay (BSSR)
+ var/hurtdamage = src.getBruteLoss() + src.getFireLoss() + damageoverlaytemp
+ damageoverlaytemp = 0 // We do this so we can detect if someone hits us or not.
+ if(hurtdamage)
+ var/image/I = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay0")
+ I.blend_mode = BLEND_ADD
+ switch(hurtdamage)
+ if(5 to 15)
+ I.icon_state = "brutedamageoverlay1"
+ if(15 to 30)
+ I.icon_state = "brutedamageoverlay2"
+ if(30 to 45)
+ I.icon_state = "brutedamageoverlay3"
+ if(45 to 70)
+ I.icon_state = "brutedamageoverlay4"
+ if(70 to 85)
+ I.icon_state = "brutedamageoverlay5"
+ if(85 to INFINITY)
+ I.icon_state = "brutedamageoverlay6"
+ var/image/black = image(I.icon, I.icon_state) //BLEND_ADD doesn't let us darken, so this is just to blacken the edge of the screen
+ black.color = "#170000"
+ damageoverlay.overlays += I
+ damageoverlay.overlays += black
+ ..()
+ return 1
+
+/mob/living/carbon/update_sight()
+ if(stat == DEAD)
+ sight |= SEE_TURFS
+ sight |= SEE_MOBS
+ sight |= SEE_OBJS
+ see_in_dark = 8
+ see_invisible = SEE_INVISIBLE_LEVEL_TWO
+ else
+ sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS)
+ if(XRAY in mutations)
+ sight |= SEE_TURFS
+ sight |= SEE_MOBS
+ sight |= SEE_OBJS
+ see_in_dark = 8
+ see_invisible = SEE_INVISIBLE_LEVEL_TWO
+
+ else
+ see_in_dark = 2
+ see_invisible = SEE_INVISIBLE_LIVING
+
+ if(see_override)
+ see_invisible = see_override
+
+/mob/living/carbon/handle_hud_icons()
+ return
+
+/mob/living/carbon/handle_hud_icons_health()
+ if(healths)
+ if (stat != DEAD)
+ switch(health)
+ if(100 to INFINITY)
+ healths.icon_state = "health0"
+ if(80 to 100)
+ healths.icon_state = "health1"
+ if(60 to 80)
+ healths.icon_state = "health2"
+ if(40 to 60)
+ healths.icon_state = "health3"
+ if(20 to 40)
+ healths.icon_state = "health4"
+ if(0 to 20)
+ healths.icon_state = "health5"
+ else
+ healths.icon_state = "health6"
+ else
+ healths.icon_state = "health7"
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm
index eb6c98be037..d6c1e083176 100644
--- a/code/modules/mob/living/carbon/metroid/metroid.dm
+++ b/code/modules/mob/living/carbon/metroid/metroid.dm
@@ -554,7 +554,6 @@
/mob/living/carbon/slime/restrained()
return 0
-mob/living/carbon/slime/var/co2overloadtime = null
mob/living/carbon/slime/var/temperature_resistance = T0C+75
/mob/living/carbon/slime/show_inv(mob/user)
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
new file mode 100644
index 00000000000..6359c497ee1
--- /dev/null
+++ b/code/modules/mob/living/life.dm
@@ -0,0 +1,265 @@
+/mob/living/Life()
+ set invisibility = 0
+ set background = BACKGROUND_ENABLED
+
+ if(notransform)
+ return
+ if(!loc)
+ return
+ var/datum/gas_mixture/environment = loc.return_air()
+
+ //Apparently, the person who wrote this code designed it so that
+ //blinded get reset each cycle and then get activated later in the
+ //code. Very ugly. I dont care. Moving this stuff here so its easy
+ //to find it.
+ blinded = null
+
+ if(stat != DEAD)
+ //Breathing, if applicable
+ handle_breathing()
+
+ //Mutations and radiation
+ handle_mutations_and_radiation()
+
+ //Chemicals in the body
+ handle_chemicals_in_body()
+
+ //Random events (vomiting etc)
+ handle_random_events()
+
+ . = 1
+
+ //Handle temperature/pressure differences between body and environment
+ if(environment)
+ handle_environment(environment)
+
+ handle_fire()
+
+ //stuff in the stomach
+ handle_stomach()
+
+ update_gravity(mob_has_gravity())
+
+ update_pulling()
+
+ for(var/obj/item/weapon/grab/G in src)
+ G.process()
+
+ if(handle_regular_status_updates()) // Status & health update, are we dead or alive etc.
+ handle_disabilities() // eye, ear, brain damages
+ handle_status_effects() //all special effects, stunned, weakened, jitteryness, hallucination, sleeping, etc
+
+ handle_actions()
+
+ update_canmove()
+
+ if(client)
+ handle_regular_hud_updates()
+
+/mob/living/proc/handle_breathing()
+ return
+
+/mob/living/proc/handle_mutations_and_radiation()
+ radiation = 0 //so radiation don't accumulate in simple animals
+ return
+
+/mob/living/proc/handle_chemicals_in_body()
+ return
+
+/mob/living/proc/handle_random_events()
+ return
+
+/mob/living/proc/handle_environment(datum/gas_mixture/environment)
+ return
+
+/mob/living/proc/handle_stomach()
+ return
+
+/mob/living/proc/update_pulling()
+ if(pulling)
+ if(incapacitated())
+ stop_pulling()
+
+//This updates the health and status of the mob (conscious, unconscious, dead)
+/mob/living/proc/handle_regular_status_updates()
+
+ updatehealth()
+
+ if(stat != DEAD)
+
+ if(paralysis)
+ stat = UNCONSCIOUS
+
+ else if (status_flags & FAKEDEATH)
+ stat = UNCONSCIOUS
+
+ else
+ stat = CONSCIOUS
+
+ return 1
+
+//this updates all special effects: stunned, sleeping, weakened, druggy, stuttering, etc..
+/mob/living/proc/handle_status_effects()
+ if(paralysis)
+ paralysis = max(paralysis-1,0)
+ if(stunned)
+ stunned = max(stunned-1,0)
+ if(!stunned)
+ update_icons()
+
+ if(weakened)
+ weakened = max(weakened-1,0)
+ if(!weakened)
+ update_icons()
+
+
+/mob/living/proc/handle_disabilities()
+ //Eyes
+ if(disabilities & BLIND || stat) //blindness from disability or unconsciousness doesn't get better on its own
+ eye_blind = max(eye_blind, 1)
+ else if(eye_blind) //blindness, heals slowly over time
+ eye_blind = max(eye_blind-1,0)
+ else if(eye_blurry) //blurry eyes heal slowly
+ eye_blurry = max(eye_blurry-1, 0)
+
+ //Ears
+ if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own
+ setEarDamage(-1, max(ear_deaf, 1))
+ else
+ // deafness heals slowly over time, unless ear_damage is over 100
+ if(ear_damage < 100)
+ adjustEarDamage(-0.05,-1)
+
+//this handles hud updates. Calls update_vision() and handle_hud_icons()
+/mob/living/proc/handle_regular_hud_updates()
+ if(!client) return 0
+
+ handle_vision()
+ handle_hud_icons()
+ update_action_buttons()
+
+ return 1
+
+/mob/living/proc/handle_vision()
+
+ client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask)
+
+ update_sight()
+
+ if(stat != DEAD)
+ if(blind)
+ if(eye_blind)
+ blind.layer = 18
+ else
+ blind.layer = 0
+
+ if (disabilities & NEARSIGHTED)
+ client.screen += global_hud.vimpaired
+
+ if (eye_blurry)
+ client.screen += global_hud.blurry
+
+ if (druggy)
+ client.screen += global_hud.druggy
+
+ if(machine)
+ if (!( machine.check_eye(src) ))
+ reset_view(null)
+ else
+ if(!client.adminobs)
+ reset_view(null)
+
+/mob/living/proc/update_sight()
+ return
+
+/mob/living/proc/handle_hud_icons()
+ handle_hud_icons_health()
+ return
+
+/mob/living/proc/handle_hud_icons_health()
+ return
+
+/mob/living/proc/handle_actions()
+ //Pretty bad, i'd use picked/dropped instead but the parent calls in these are nonexistent
+ for(var/datum/action/A in actions)
+ if(A.CheckRemoval(src))
+ A.Remove(src)
+ for(var/obj/item/I in src)
+ if(istype(I,/obj/item/clothing/under))
+ var/obj/item/clothing/under/U = I
+ for(var/obj/item/IU in U)
+ if(istype(IU, /obj/item/clothing/accessory))
+ var/obj/item/clothing/accessory/A = IU
+ if(A.action_button_name)
+ if(!A.action)
+ if(A.action_button_is_hands_free)
+ A.action = new/datum/action/item_action/hands_free
+ else
+ A.action = new/datum/action/item_action
+ A.action.name = A.action_button_name
+ A.action.target = A
+ A.action.check_flags &= ~AB_CHECK_INSIDE
+ A.action.Grant(src)
+ if(I.action_button_name)
+ if(!I.action)
+ if(I.action_button_is_hands_free)
+ I.action = new/datum/action/item_action/hands_free
+ else
+ I.action = new/datum/action/item_action
+ I.action.name = I.action_button_name
+ I.action.target = I
+ I.action.Grant(src)
+ return
+
+/mob/living/update_action_buttons()
+ if(!hud_used) return
+ if(!client) return
+
+ if(hud_used.hud_shown != 1) //Hud toggled to minimal
+ return
+
+ client.screen -= hud_used.hide_actions_toggle
+ for(var/datum/action/A in actions)
+ if(A.button)
+ client.screen -= A.button
+
+ if(hud_used.action_buttons_hidden)
+ if(!hud_used.hide_actions_toggle)
+ hud_used.hide_actions_toggle = new(hud_used)
+ hud_used.hide_actions_toggle.UpdateIcon()
+
+ if(!hud_used.hide_actions_toggle.moved)
+ hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(1)
+ //hud_used.SetButtonCoords(hud_used.hide_actions_toggle,1)
+
+ client.screen += hud_used.hide_actions_toggle
+ return
+
+ var/button_number = 0
+ for(var/datum/action/A in actions)
+ button_number++
+ if(A.button == null)
+ var/obj/screen/movable/action_button/N = new(hud_used)
+ N.owner = A
+ A.button = N
+
+ var/obj/screen/movable/action_button/B = A.button
+
+ B.UpdateIcon()
+
+ B.name = A.UpdateName()
+
+ client.screen += B
+
+ if(!B.moved)
+ B.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number)
+ //hud_used.SetButtonCoords(B,button_number)
+
+ if(button_number > 0)
+ if(!hud_used.hide_actions_toggle)
+ hud_used.hide_actions_toggle = new(hud_used)
+ hud_used.hide_actions_toggle.InitialiseIcon(src)
+ if(!hud_used.hide_actions_toggle.moved)
+ hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1)
+ //hud_used.SetButtonCoords(hud_used.hide_actions_toggle,button_number+1)
+ client.screen += hud_used.hide_actions_toggle
\ No newline at end of file
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 82807279717..dc23580c131 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -3,29 +3,6 @@
..()
return QDEL_HINT_HARDDEL_NOW
-/mob/living/Life()
- ..()
- if (notransform) return
- if(!loc) return // Fixing a null error that occurs when the mob isn't found in the world -- TLE
- if(mind)
- if(mind in ticker.mode.implanted)
- if(implanting) return
- //world << "[src.name]"
- var/datum/mind/head = ticker.mode.implanted[mind]
- //var/list/removal
- if(!(locate(/obj/item/weapon/implant/traitor) in src.contents))
- //world << "doesn't have an implant"
- ticker.mode.remove_traitor_mind(mind, head)
- /*
- if((head in ticker.mode.implanters))
- ticker.mode.implanter[head] -= src.mind
- ticker.mode.implanted -= src.mind
- if(src.mind in ticker.mode.traitors)
- ticker.mode.traitors -= src.mind
- special_role = null
- current << "\red The fog clouding your mind clears. You remember nothing from the moment you were implanted until now..(You don't remember who enslaved you)"
- */
-
//mob verbs are a lot faster than object verbs
//for more info on why this is not atom/pull, see examinate() in mob.dm
/mob/living/verb/pulled(atom/movable/AM as mob|obj in oview(1))
@@ -279,6 +256,18 @@
return def_zone
+//damage/heal the mob ears and adjust the deaf amount
+/mob/living/adjustEarDamage(damage, deaf)
+ ear_damage = max(0, ear_damage + damage)
+ ear_deaf = max(0, ear_deaf + deaf)
+
+//pass a negative argument to skip one of the variable
+/mob/living/setEarDamage(damage, deaf)
+ if(damage >= 0)
+ ear_damage = damage
+ if(deaf >= 0)
+ ear_deaf = deaf
+
// heal ONE external organ, organ gets randomly selected from damaged ones.
/mob/living/proc/heal_organ_damage(var/brute, var/burn)
adjustBruteLoss(-brute)
@@ -869,15 +858,6 @@
spintime -= speed
return
-/mob/living/proc/CheckStamina()
- if(staminaloss)
- var/total_health = (health - staminaloss)
- if(total_health <= config.health_threshold_softcrit && !stat)
- Exhaust()
- setStaminaLoss(health - 2)
- return
- setStaminaLoss(max((staminaloss - 2), 0))
-
/mob/living/proc/Exhaust()
src << "You're too exhausted to keep going..."
Weaken(5)
@@ -1006,6 +986,33 @@
animate(pixel_x = initial(pixel_x) , pixel_y = initial(pixel_y) , time = 2)
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement.
+
+/mob/living/proc/get_temperature(datum/gas_mixture/environment)
+ var/loc_temp = T0C
+ if(istype(loc, /obj/mecha))
+ var/obj/mecha/M = loc
+ loc_temp = M.return_temperature()
+
+ else if(istype(loc, /obj/structure/transit_tube_pod))
+ loc_temp = environment.temperature
+
+ else if(istype(get_turf(src), /turf/space))
+ var/turf/heat_turf = get_turf(src)
+ loc_temp = heat_turf.temperature
+
+ else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
+ var/obj/machinery/atmospherics/unary/cryo_cell/C = loc
+
+ if(C.air_contents.total_moles() < 10)
+ loc_temp = environment.temperature
+ else
+ loc_temp = C.air_contents.temperature
+
+ else
+ loc_temp = environment.temperature
+
+ return loc_temp
+
/mob/living/proc/get_standard_pixel_x_offset(lying = 0)
return initial(pixel_x)
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 08be473c4a7..809183a7a30 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -213,94 +213,7 @@
if(volume >= 20) fire_stacks -= 0.5
if(volume >= 50) fire_stacks -= 1
-/mob/living/regular_hud_updates()
- ..()
- update_action_buttons()
-/mob/living/proc/handle_actions()
- //Pretty bad, i'd use picked/dropped instead but the parent calls in these are nonexistent
- for(var/datum/action/A in actions)
- if(A.CheckRemoval(src))
- A.Remove(src)
- for(var/obj/item/I in src)
- if(istype(I,/obj/item/clothing/under))
- var/obj/item/clothing/under/U = I
- for(var/obj/item/IU in U)
- if(istype(IU, /obj/item/clothing/accessory))
- var/obj/item/clothing/accessory/A = IU
- if(A.action_button_name)
- if(!A.action)
- if(A.action_button_is_hands_free)
- A.action = new/datum/action/item_action/hands_free
- else
- A.action = new/datum/action/item_action
- A.action.name = A.action_button_name
- A.action.target = A
- A.action.check_flags &= ~AB_CHECK_INSIDE
- A.action.Grant(src)
- if(I.action_button_name)
- if(!I.action)
- if(I.action_button_is_hands_free)
- I.action = new/datum/action/item_action/hands_free
- else
- I.action = new/datum/action/item_action
- I.action.name = I.action_button_name
- I.action.target = I
- I.action.Grant(src)
- return
-
-/mob/living/update_action_buttons()
- if(!hud_used) return
- if(!client) return
-
- if(hud_used.hud_shown != 1) //Hud toggled to minimal
- return
-
- client.screen -= hud_used.hide_actions_toggle
- for(var/datum/action/A in actions)
- if(A.button)
- client.screen -= A.button
-
- if(hud_used.action_buttons_hidden)
- if(!hud_used.hide_actions_toggle)
- hud_used.hide_actions_toggle = new(hud_used)
- hud_used.hide_actions_toggle.UpdateIcon()
-
- if(!hud_used.hide_actions_toggle.moved)
- hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(1)
- //hud_used.SetButtonCoords(hud_used.hide_actions_toggle,1)
-
- client.screen += hud_used.hide_actions_toggle
- return
-
- var/button_number = 0
- for(var/datum/action/A in actions)
- button_number++
- if(A.button == null)
- var/obj/screen/movable/action_button/N = new(hud_used)
- N.owner = A
- A.button = N
-
- var/obj/screen/movable/action_button/B = A.button
-
- B.UpdateIcon()
-
- B.name = A.UpdateName()
-
- client.screen += B
-
- if(!B.moved)
- B.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number)
- //hud_used.SetButtonCoords(B,button_number)
-
- if(button_number > 0)
- if(!hud_used.hide_actions_toggle)
- hud_used.hide_actions_toggle = new(hud_used)
- hud_used.hide_actions_toggle.InitialiseIcon(src)
- if(!hud_used.hide_actions_toggle.moved)
- hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1)
- //hud_used.SetButtonCoords(hud_used.hide_actions_toggle,button_number+1)
- client.screen += hud_used.hide_actions_toggle
//This is called when the mob is thrown into a dense turf
/mob/living/proc/turf_collision(var/turf/T, var/speed)
diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm
index 33055ac3d8e..c272fff3b3f 100644
--- a/code/modules/mob/living/silicon/pai/life.dm
+++ b/code/modules/mob/living/silicon/pai/life.dm
@@ -1,44 +1,26 @@
/mob/living/silicon/pai/Life()
- if (src.stat == 2)
- return
- if(src.cable)
- if(get_dist(src, src.cable) > 1)
- var/turf/T = get_turf_or_move(src.loc)
- for (var/mob/M in viewers(T))
- M.show_message("\red The data cable rapidly retracts back into its spool.", 3, "\red You hear a click and the sound of wire spooling rapidly.", 2)
- qdel(src.cable)
- sleeping = 0
- ear_deaf = 0
+ . = ..()
+ if(.)
+ regular_hud_updates()
- if (src.paralysis || src.stunned || src.weakened) //Stunned etc.
- src.stat = 1
- if (src.stunned > 0)
- AdjustStunned(-1)
- if (src.weakened > 0)
- AdjustWeakened(-1)
- if (src.paralysis > 0)
- AdjustParalysis(-1)
- src.eye_blind = max(eye_blind, 1)
- else
- src.eye_blind = 0
+ if(src.secHUD == 1)
+ process_sec_hud(src, 1)
+ if(src.medHUD == 1)
+ process_med_hud(src, 1)
+ if(silence_time)
+ if(world.timeofday >= silence_time)
+ silence_time = null
+ src << "Communication circuit reinitialized. Speech and messaging functionality restored."
- else //Not stunned.
- src.stat = 0
+ if(cable)
+ if(get_dist(src, cable) > 1)
+ var/turf/T = get_turf_or_move(loc)
+ for (var/mob/M in viewers(T))
+ M.show_message("\red The data cable rapidly retracts back into its spool.", 3, "\red You hear a click and the sound of wire spooling rapidly.", 2)
+ qdel(src.cable)
- if(paralysis || stunned || weakened || buckled || resting || src.loc == card) canmove = 0
- else canmove = 1
+ handle_statuses()
- regular_hud_updates()
- if(src.secHUD == 1)
- process_sec_hud(src, 1)
- if(src.medHUD == 1)
- process_med_hud(src, 1)
- if(silence_time)
- if(world.timeofday >= silence_time)
- silence_time = null
- src << "Communication circuit reinitialized. Speech and messaging functionality restored."
- handle_statuses()
- handle_actions()
/mob/living/silicon/pai/updatehealth()
if(status_flags & GODMODE)
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index 4d0fc33ca06..33d47b2975b 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -1,34 +1,20 @@
/mob/living/silicon/robot/Life()
set invisibility = 0
- //set background = 1
+ set background = BACKGROUND_ENABLED
if (src.notransform)
return
- src.blinded = null
-
//Status updates, death etc.
clamp_values()
- handle_regular_status_updates()
- handle_actions()
-
- if(client)
- handle_regular_hud_updates()
- update_items()
- if (src.stat != DEAD) //still using power
+ if(..())
use_power()
process_locks()
process_queued_alarms()
- update_canmove()
-
- update_gravity(mob_has_gravity())
-
- handle_fire()
/mob/living/silicon/robot/proc/clamp_values()
-
SetStunned(min(stunned, 30))
SetParalysis(min(paralysis, 30))
SetWeakened(min(weakened, 20))
@@ -80,7 +66,7 @@
update_headlamp(1)
Paralyse(3)
-/mob/living/silicon/robot/proc/handle_regular_status_updates()
+/mob/living/silicon/robot/handle_regular_status_updates()
if(src.camera && !scrambledcodes)
if(src.stat == 2 || wires.IsCameraCut())
@@ -170,7 +156,7 @@
return 1
-/mob/living/silicon/robot/proc/handle_regular_hud_updates()
+/mob/living/silicon/robot/update_sight()
if (src.stat == 2 || src.sight_mode & BORGXRAY)
src.sight |= SEE_TURFS
@@ -199,124 +185,92 @@
if(see_override)
see_invisible = see_override
+/mob/living/silicon/robot/handle_hud_icons()
+ update_items()
+ update_cell()
+ ..()
+
+/mob/living/silicon/robot/handle_hud_icons_health()
+ if(healths)
+ if(stat != DEAD)
+ if(health >= maxHealth)
+ healths.icon_state = "health0"
+ else if(health > maxHealth*0.5)
+ healths.icon_state = "health2"
+ else if(health > 0)
+ healths.icon_state = "health3"
+ else if(health > -maxHealth*0.5)
+ healths.icon_state = "health4"
+ else if(health > -maxHealth)
+ healths.icon_state = "health5"
+ else
+ healths.icon_state = "health6"
+ else
+ healths.icon_state = "health7"
+
+ if(bodytemp)
+ switch(bodytemperature) //310.055 optimal body temp
+ if(335 to INFINITY)
+ bodytemp.icon_state = "temp2"
+ if(320 to 335)
+ bodytemp.icon_state = "temp1"
+ if(300 to 320)
+ bodytemp.icon_state = "temp0"
+ if(260 to 300)
+ bodytemp.icon_state = "temp-1"
+ else
+ bodytemp.icon_state = "temp-2"
+
+/mob/living/silicon/robot/proc/update_cell()
+ if(cells)
+ if(cell)
+ var/cellcharge = cell.charge/cell.maxcharge
+ switch(cellcharge)
+ if(0.75 to INFINITY)
+ cells.icon_state = "charge4"
+ if(0.5 to 0.75)
+ cells.icon_state = "charge3"
+ if(0.25 to 0.5)
+ cells.icon_state = "charge2"
+ if(0 to 0.25)
+ cells.icon_state = "charge1"
+ else
+ cells.icon_state = "charge0"
+ else
+ cells.icon_state = "charge-empty"
+
+
+/mob/living/silicon/robot/handle_regular_hud_updates()
+ if(!client)
+ return
+
regular_hud_updates()
- switch(src.sensor_mode)
- if (SEC_HUD)
+ switch(sensor_mode)
+ if(SEC_HUD)
process_sec_hud(src,1)
- if (MED_HUD)
+ if(MED_HUD)
process_med_hud(src,1)
- if (src.healths)
- if (src.stat != 2)
- if(istype(src,/mob/living/silicon/robot/drone))
- switch(health)
- if(35 to INFINITY)
- src.healths.icon_state = "health0"
- if(25 to 34)
- src.healths.icon_state = "health1"
- if(15 to 24)
- src.healths.icon_state = "health2"
- if(5 to 14)
- src.healths.icon_state = "health3"
- if(0 to 4)
- src.healths.icon_state = "health4"
- if(-35 to 0)
- src.healths.icon_state = "health5"
- else
- src.healths.icon_state = "health6"
- else
- switch(health)
- if(100 to INFINITY)
- src.healths.icon_state = "health0"
- if(50 to 100)
- src.healths.icon_state = "health2"
- if(0 to 50)
- src.healths.icon_state = "health3"
- if(-50 to 0)
- src.healths.icon_state = "health4"
- if(config.health_threshold_dead to -50)
- src.healths.icon_state = "health5"
- else
- src.healths.icon_state = "health6"
- else
- src.healths.icon_state = "health7"
-
- if (src.syndicate && src.client)
+ if(syndicate)
if(ticker.mode.name == "traitor")
for(var/datum/mind/tra in ticker.mode.traitors)
if(tra.current)
var/I = image('icons/mob/mob.dmi', loc = tra.current, icon_state = "traitor")
src.client.images += I
- if(src.connected_ai)
- src.connected_ai.connected_robots -= src
- src.connected_ai = null
- if(src.mind)
- if(!src.mind.special_role)
- src.mind.special_role = "traitor"
+ if(connected_ai)
+ connected_ai.connected_robots -= src
+ connected_ai = null
+ if(mind)
+ if(!mind.special_role)
+ mind.special_role = "traitor"
ticker.mode.traitors += src.mind
- if (src.cells)
- if (src.cell)
- var/cellcharge = src.cell.charge/src.cell.maxcharge
- switch(cellcharge)
- if(0.75 to INFINITY)
- src.cells.icon_state = "charge4"
- if(0.5 to 0.75)
- src.cells.icon_state = "charge3"
- if(0.25 to 0.5)
- src.cells.icon_state = "charge2"
- if(0 to 0.25)
- src.cells.icon_state = "charge1"
- else
- src.cells.icon_state = "charge0"
- else
- src.cells.icon_state = "charge-empty"
-
- if(bodytemp)
- switch(src.bodytemperature) //310.055 optimal body temp
- if(335 to INFINITY)
- src.bodytemp.icon_state = "temp2"
- if(320 to 335)
- src.bodytemp.icon_state = "temp1"
- if(300 to 320)
- src.bodytemp.icon_state = "temp0"
- if(260 to 300)
- src.bodytemp.icon_state = "temp-1"
- else
- src.bodytemp.icon_state = "temp-2"
-
-
-//Oxygen and fire does nothing yet!!
-// if (src.oxygen) src.oxygen.icon_state = "oxy[src.oxygen_alert ? 1 : 0]"
-// if (src.fire) src.fire.icon_state = "fire[src.fire_alert ? 1 : 0]"
-
- client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired)
-
- if ((src.blind && src.stat != 2))
- if(src.blinded)
- src.blind.layer = 18
- else
- src.blind.layer = 0
- if (src.disabilities & NEARSIGHTED)
- src.client.screen += global_hud.vimpaired
-
- if (src.eye_blurry)
- src.client.screen += global_hud.blurry
-
- if (src.druggy)
- src.client.screen += global_hud.druggy
-
- if (src.stat != 2)
- if (src.machine)
- if (!( src.machine.check_eye(src) ))
- src.reset_view(null)
- else
- if(client && !client.adminobs)
- reset_view(null)
-
+ ..()
return 1
+
+
/mob/living/silicon/robot/proc/update_items()
if (src.client)
src.client.screen -= src.contents
@@ -342,8 +296,11 @@
weaponlock_time = 120
/mob/living/silicon/robot/update_canmove()
- if(paralysis || stunned || weakened || buckled || lockcharge) canmove = 0
- else canmove = 1
+ if(paralysis || stunned || weakened || buckled || lockcharge)
+ canmove = 0
+ else
+ canmove = 1
+ update_transform()
return canmove
//Robots on fire
diff --git a/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm
index d4cac27a309..eba943b5b66 100644
--- a/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm
+++ b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm
@@ -94,7 +94,7 @@
if(statpanel("Status"))
stat("Resources:",resources)
-/mob/living/simple_animal/hostile/swarmer/Die()
+/mob/living/simple_animal/hostile/swarmer/death()
..()
new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc)
ghostize()
@@ -105,7 +105,7 @@
health = 1
return
else
- Die()
+ death()
/mob/living/simple_animal/hostile/swarmer/CanPass(atom/movable/O)
if(istype(O, /obj/item/projectile/beam/disabler))//Allows for swarmers to fight as a group without wasting their shots hitting each other
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 875d6cfcf95..21f88b5913b 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -36,7 +36,7 @@
AddSpell(new spell(src))
updateglow()
-/mob/living/simple_animal/construct/Die()
+/mob/living/simple_animal/construct/death()
..()
new /obj/item/weapon/reagent_containers/food/snacks/ectoplasm (src.loc)
for(var/mob/M in viewers(src, null))
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 44735915da3..91171c89bc7 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -33,10 +33,12 @@
var/turns_since_scan = 0
var/mob/living/simple_animal/mouse/movement_target
-/mob/living/simple_animal/pet/cat/Runtime/Life()
+/mob/living/simple_animal/pet/cat/Runtime/handle_automated_action()
+ ..()
+
//MICE!
- if((src.loc) && isturf(src.loc))
- if(!stat && !resting && !buckled)
+ if(loc && isturf(loc))
+ if(!incapacitated())
for(var/mob/living/simple_animal/mouse/M in view(1,src))
if(!M.stat && Adjacent(M))
custom_emote(1, "splats \the [M]!")
@@ -45,11 +47,12 @@
stop_automated_movement = 0
break
- ..()
-
+ //attempt to mate
make_babies()
- if(!stat && !resting && !buckled)
+/mob/living/simple_animal/pet/cat/Runtime/handle_automated_movement()
+ ..()
+ if(!incapacitated())
turns_since_scan++
if(turns_since_scan > 5)
walk_to(src,0)
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index c6bed1b1c26..210c4a11db3 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -32,20 +32,21 @@
..()
regenerate_icons()
-/mob/living/simple_animal/pet/corgi/Life()
- . = ..()
- if(.)
- if(fire)
- if(fire_alert) fire.icon_state = "fire[fire_alert]" //fire_alert is either 0 if no alert, 1 for heat and 2 for cold.
- else fire.icon_state = "fire0"
- if(oxygen)
- if(oxygen_alert) oxygen.icon_state = "oxy1"
- else oxygen.icon_state = "oxy0"
- if(toxin)
- if(toxins_alert) toxin.icon_state = "tox1"
- else toxin.icon_state = "tox0"
+/mob/living/simple_animal/pet/corgi/handle_hud_icons()
+ ..()
+ if(fire)
+ if(fire_alert) fire.icon_state = "fire[fire_alert]" //fire_alert is either 0 if no alert, 1 for heat and 2 for cold.
+ else fire.icon_state = "fire0"
+ if(oxygen)
+ if(oxygen_alert) oxygen.icon_state = "oxy1"
+ else oxygen.icon_state = "oxy0"
+ if(toxin)
+ if(toxins_alert) toxin.icon_state = "tox1"
+ else toxin.icon_state = "tox0"
- if (healths)
+/mob/living/simple_animal/pet/corgi/handle_hud_icons_health()
+ ..()
+ if(healths)
switch(health)
if(30 to INFINITY) healths.icon_state = "health0"
if(26 to 29) healths.icon_state = "health1"
@@ -55,9 +56,12 @@
if(6 to 10) healths.icon_state = "health5"
if(1 to 5) healths.icon_state = "health6"
if(0) healths.icon_state = "health7"
+
+/mob/living/simple_animal/pet/corgi/Life()
+ . = ..()
regenerate_icons()
-/mob/living/simple_animal/pet/corgi/Die()
+/mob/living/simple_animal/pet/corgi/death()
..()
regenerate_icons()
@@ -638,7 +642,7 @@
M.show_message("\red [src] makes an odd whining noise.")
sleep(10)
explosion(get_turf(src), 0, 1, 4, 7)
- Die()
+ death()
/mob/living/simple_animal/pet/corgi/Ian/borgi/proc/shootAt(var/atom/movable/target)
var/turf/T = get_turf(src)
@@ -669,7 +673,7 @@
s.set_up(3, 1, src)
s.start()
-/mob/living/simple_animal/pet/corgi/Ian/borgi/Die()
+/mob/living/simple_animal/pet/corgi/Ian/borgi/death()
..()
visible_message("[src] blows apart!")
new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc)
diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm
index 274326bd78f..60377828f43 100644
--- a/code/modules/mob/living/simple_animal/friendly/crab.dm
+++ b/code/modules/mob/living/simple_animal/friendly/crab.dm
@@ -23,10 +23,9 @@
var/obj/item/inventory_mask
can_hide = 1
-/mob/living/simple_animal/crab/Life()
- ..()
+/mob/living/simple_animal/crab/handle_automated_movement()
//CRAB movement
- if(!ckey && !stat)
+ if(!stat)
if(isturf(src.loc) && !resting && !buckled) //This is so it only moves if it's not inside a closet, gentics machine, etc.
turns_since_move++
if(turns_since_move >= turns_per_move)
@@ -34,6 +33,9 @@
if(Process_Spacemove(east_vs_west))
Move(get_step(src, east_vs_west), east_vs_west)
turns_since_move = 0
+
+/mob/living/simple_animal/crab/Life()
+ . = ..()
regenerate_icons()
//COFFEE! SQUEEEEEEEEE!
@@ -51,7 +53,7 @@
if(prob(50))
user << "\red \b This kills the crab."
health -= 20
- Die()
+ death()
else
GetMad()
get
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index 6fd450a4c34..070e61ef284 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -27,36 +27,36 @@
stop_automated_movement_when_pulled = 1
var/milk_content = 0
-/mob/living/simple_animal/hostile/retaliate/goat/New()
+/mob/living/simple_animal/hostile/retaliate/goat/handle_automated_movement()
..()
+ if(!pulledby)
+ for(var/direction in shuffle(list(1,2,4,8,5,6,9,10)))
+ var/step = get_step(src, direction)
+ if(step)
+ if(locate(/obj/effect/plant) in step)
+ Move(step, get_dir(src, step))
+
+/mob/living/simple_animal/hostile/retaliate/goat/handle_automated_action()
+ //chance to go crazy and start wacking stuff
+ if(!enemies.len && prob(1))
+ Retaliate()
+
+ if(enemies.len && prob(10))
+ enemies = list()
+ LoseTarget()
+ src.visible_message("\blue [src] calms down.")
+
+ if(locate(/obj/effect/plant) in loc)
+ var/obj/effect/plant/SV = locate(/obj/effect/plant) in loc
+ qdel(SV)
+ if(prob(10))
+ say("Nom")
/mob/living/simple_animal/hostile/retaliate/goat/Life()
. = ..()
- if(.)
- //chance to go crazy and start wacking stuff
- if(!enemies.len && prob(1))
- Retaliate()
+ if(stat == CONSCIOUS && prob(5))
+ milk_content = min(50, milk_content+rand(5, 10))
- if(enemies.len && prob(10))
- enemies = list()
- LoseTarget()
- src.visible_message("\blue [src] calms down.")
-
- if(stat == CONSCIOUS && prob(5))
- milk_content = min(50, milk_content+rand(5, 10))
-
- if(locate(/obj/effect/plant) in loc)
- var/obj/effect/plant/SV = locate(/obj/effect/plant) in loc
- qdel(SV)
- if(prob(10))
- say("Nom")
-
- if(!pulledby)
- for(var/direction in shuffle(list(1,2,4,8,5,6,9,10)))
- var/step = get_step(src, direction)
- if(step)
- if(locate(/obj/effect/plant) in step)
- Move(step, get_dir(src, step))
/mob/living/simple_animal/hostile/retaliate/goat/Retaliate()
..()
@@ -186,9 +186,7 @@
/mob/living/simple_animal/chick/Life()
. =..()
- if(!.)
- return
- if(!stat)
+ if(.)
amount_grown += rand(1,2)
if(amount_grown >= 100)
new /mob/living/simple_animal/chicken(src.loc)
@@ -234,7 +232,7 @@ var/global/chicken_count = 0
pixel_y = rand(0, 10)
chicken_count += 1
-/mob/living/simple_animal/chicken/Die()
+/mob/living/simple_animal/chicken/death()
..()
chicken_count -= 1
@@ -256,10 +254,8 @@ var/global/chicken_count = 0
..()
/mob/living/simple_animal/chicken/Life()
- . =..()
- if(!.)
- return
- if(!stat && prob(3) && eggsleft > 0)
+ . = ..()
+ if(. && prob(3) && eggsleft > 0)
visible_message("[src] [pick("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.")]")
eggsleft--
var/obj/item/weapon/reagent_containers/food/snacks/egg/E = new(get_turf(src))
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index 7dfa82c4989..2409827d608 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -31,12 +31,15 @@
universal_speak = 0
can_hide = 1
-/mob/living/simple_animal/mouse/Life()
+/mob/living/simple_animal/mouse/handle_automated_speech()
..()
- if(!stat && prob(speak_chance))
+ if(prob(speak_chance))
for(var/mob/M in view())
M << 'sound/effects/mousesqueek.ogg'
+/mob/living/simple_animal/mouse/Life()
+ . = ..()
+
if(!ckey && stat == CONSCIOUS && prob(0.5))
stat = UNCONSCIOUS
icon_state = "mouse_[mouse_color]_sleep"
@@ -105,7 +108,7 @@
M << 'sound/effects/mousesqueek.ogg'
..()
-/mob/living/simple_animal/mouse/Die()
+/mob/living/simple_animal/mouse/death()
layer = MOB_LAYER
if(client)
client.time_died_as_mouse = world.time
diff --git a/code/modules/mob/living/simple_animal/friendly/pet.dm b/code/modules/mob/living/simple_animal/friendly/pet.dm
index 3cecd09c4d6..8596355f16e 100644
--- a/code/modules/mob/living/simple_animal/friendly/pet.dm
+++ b/code/modules/mob/living/simple_animal/friendly/pet.dm
@@ -37,7 +37,7 @@
..()
regenerate_icons()
-/mob/living/simple_animal/pet/Die()
+/mob/living/simple_animal/pet/death()
..()
regenerate_icons()
diff --git a/code/modules/mob/living/simple_animal/friendly/slime.dm b/code/modules/mob/living/simple_animal/friendly/slime.dm
index d44cdde68ab..e03c8f36ff8 100644
--- a/code/modules/mob/living/simple_animal/friendly/slime.dm
+++ b/code/modules/mob/living/simple_animal/friendly/slime.dm
@@ -70,7 +70,7 @@
overlays += "aslime-:33"
-/mob/living/simple_animal/slime/adult/Die()
+/mob/living/simple_animal/slime/adult/death()
var/mob/living/simple_animal/slime/S1 = new /mob/living/simple_animal/slime (src.loc)
S1.icon_state = "[src.colour] baby slime"
S1.icon_living = "[src.colour] baby slime"
diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
index 13c8a6f822c..35f06c2b1c2 100644
--- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
+++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
@@ -166,7 +166,7 @@
M.show_message("\red [src] makes an odd warbling noise, fizzles, and explodes.")
explosion(get_turf(loc), -1, -1, 3, 5)
eject_brain()
- Die()
+ death()
/mob/living/simple_animal/spiderbot/proc/update_icon()
if(mmi)
@@ -204,7 +204,7 @@
..()
-/mob/living/simple_animal/spiderbot/Die()
+/mob/living/simple_animal/spiderbot/death()
living_mob_list -= src
dead_mob_list += src
diff --git a/code/modules/mob/living/simple_animal/head.dm b/code/modules/mob/living/simple_animal/head.dm
index fdf381f279a..109bb532904 100644
--- a/code/modules/mob/living/simple_animal/head.dm
+++ b/code/modules/mob/living/simple_animal/head.dm
@@ -41,7 +41,7 @@
density = 1
return
else if(health < 1)
- Die()
+ death()
else if(health > maxHealth)
health = maxHealth
for(var/mob/A in viewers(world.view,src))
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index 4659c1b4dd1..336bc7f9906 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -139,7 +139,7 @@
damage = 30
icon_state = "toxin"
-/mob/living/simple_animal/hostile/alien/Die()
+/mob/living/simple_animal/hostile/alien/death()
..()
if(dead == 0)
dead = 1
diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm
index 05b8740e671..9c6f24bd4ac 100644
--- a/code/modules/mob/living/simple_animal/hostile/bear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bear.dm
@@ -57,7 +57,7 @@
icon_state = "bearfloor"
/mob/living/simple_animal/hostile/bear/Life()
- . =..()
+ . = ..()
if(!.)
return
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index 5c8c80d5bde..650f19cb758 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -62,7 +62,7 @@
icon_living = "holocarp"
maxbodytemp = INFINITY
-/mob/living/simple_animal/hostile/carp/holocarp/Die()
+/mob/living/simple_animal/hostile/carp/holocarp/death()
..()
ghostize()
qdel(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
index 13e3958b491..0159237df07 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
@@ -81,9 +81,8 @@
poison_per_bite = 5
move_to_delay = 5
-/mob/living/simple_animal/hostile/poison/giant_spider/Life()
- ..()
- if(!stat && !ckey)
+/mob/living/simple_animal/hostile/poison/giant_spider/hunter/handle_automated_action()
+ if(!stat)
if(stance == HOSTILE_STANCE_IDLE)
//1% chance to skitter madly away
if(!busy && prob(1))
@@ -117,8 +116,7 @@
busy = 0
stop_automated_movement = 0
-/mob/living/simple_animal/hostile/poison/giant_spider/nurse/Life()
- ..()
+/mob/living/simple_animal/hostile/poison/giant_spider/nurse/handle_automated_action()
if(!stat && !ckey)
if(stance == HOSTILE_STANCE_IDLE)
var/list/can_see = view(src, 10)
diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
index 8a88958fa18..8e797c68796 100644
--- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
@@ -48,7 +48,7 @@
health = 80
ranged = 1
-/mob/living/simple_animal/hostile/hivebot/Die()
+/mob/living/simple_animal/hostile/hivebot/death()
..()
visible_message("[src] blows apart!")
new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc)
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 7694f714aca..c5561a2f928 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -242,7 +242,7 @@
//////////////END HOSTILE MOB TARGETTING AND AGGRESSION////////////
-/mob/living/simple_animal/hostile/Die()
+/mob/living/simple_animal/hostile/death()
LoseAggro()
mouse_opacity = 1
..()
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index 6246b286841..9d70385cf87 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -43,7 +43,7 @@
if(.)
custom_emote(1, "growls at [.]")
-/mob/living/simple_animal/hostile/mimic/Die()
+/mob/living/simple_animal/hostile/mimic/death()
..()
visible_message("\red [src] stops moving!")
ghostize()
@@ -53,7 +53,7 @@
if(is_electronic)
switch(severity)
if(1)
- Die()
+ death()
if(2)
adjustBruteLoss(50)
..(severity)
@@ -117,7 +117,7 @@
..()
icon_state = initial(icon_state)
-/mob/living/simple_animal/hostile/mimic/crate/Die()
+/mob/living/simple_animal/hostile/mimic/crate/death()
var/obj/structure/closet/crate/C = new(get_turf(src))
// Put loot in crate
@@ -154,9 +154,9 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
/mob/living/simple_animal/hostile/mimic/copy/Life()
..()
for(var/mob/living/M in contents) //a fix for animated statues from the flesh to stone spell
- Die()
+ death()
-/mob/living/simple_animal/hostile/mimic/copy/Die()
+/mob/living/simple_animal/hostile/mimic/copy/death()
for(var/atom/movable/M in src)
M.loc = get_turf(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index d83770ffc8b..da8dda44a3e 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -111,7 +111,7 @@
if(3.0)
adjustBruteLoss(110)
-/mob/living/simple_animal/hostile/asteroid/basilisk/Die()
+/mob/living/simple_animal/hostile/asteroid/basilisk/death()
if(stat != DEAD)
var/counter
for(counter=0, counter<2, counter++)
@@ -210,7 +210,7 @@
visible_message("The [P.name] was repelled by [src.name]'s girth!")
return
-/mob/living/simple_animal/hostile/asteroid/goldgrub/Die()
+/mob/living/simple_animal/hostile/asteroid/goldgrub/death()
alerted = 0
Reward()
..()
@@ -261,7 +261,7 @@
/mob/living/simple_animal/hostile/asteroid/hivelord/AttackingTarget()
OpenFire()
-/mob/living/simple_animal/hostile/asteroid/hivelord/Die()
+/mob/living/simple_animal/hostile/asteroid/hivelord/death()
if(stat != DEAD)
new /obj/item/asteroid/hivelord_core(src.loc)
..()
@@ -328,7 +328,7 @@
spawn(100)
qdel(src)
-/mob/living/simple_animal/hostile/asteroid/hivelordbrood/Die()
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/death()
qdel(src)
/mob/living/simple_animal/hostile/asteroid/goliath
@@ -378,7 +378,7 @@
anchored = 1
..()
-/mob/living/simple_animal/hostile/asteroid/goliath/Die()
+/mob/living/simple_animal/hostile/asteroid/goliath/death()
anchored = 0
if(stat != DEAD)
var/obj/item/asteroid/goliath_hide/G = new /obj/item/asteroid/goliath_hide(src.loc)
diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
index f42e531d93d..8559bd9d3d6 100644
--- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
@@ -88,7 +88,7 @@
icon_state = "mushroom_color"
UpdateMushroomCap()
-/mob/living/simple_animal/hostile/mushroom/Die()
+/mob/living/simple_animal/hostile/mushroom/death()
visible_message("[src] fainted.")
..()
UpdateMushroomCap()
diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm
index c519c2c62bc..4f3cd78c093 100644
--- a/code/modules/mob/living/simple_animal/hostile/pirate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm
@@ -49,7 +49,7 @@
weapon1 = /obj/item/weapon/gun/energy/laser
-/mob/living/simple_animal/hostile/pirate/Die()
+/mob/living/simple_animal/hostile/pirate/death()
..()
if(corpse)
new corpse (src.loc)
diff --git a/code/modules/mob/living/simple_animal/hostile/poison_bees.dm b/code/modules/mob/living/simple_animal/hostile/poison_bees.dm
index 165b56a6f13..dd5a7f35822 100644
--- a/code/modules/mob/living/simple_animal/hostile/poison_bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/poison_bees.dm
@@ -45,16 +45,16 @@
//update_bees()
-/mob/living/simple_animal/hostile/poison/bees/Die()
+/mob/living/simple_animal/hostile/poison/bees/death()
..()
ghostize()
qdel(src)
return
-/mob/living/simple_animal/hostile/poison/bees/Life()
+/*/mob/living/simple_animal/hostile/poison/bees/Life()
..()
-/* update_bees()
+ update_bees()
/mob/living/simple_animal/hostile/poison/bees/proc/update_bees()
while(overlays.len != health-1) //how many bees do we have in the swarm?
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
index 37f675f532e..3ebf60586ff 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
@@ -156,7 +156,7 @@
hostile_drone = 0
walk(src,0)
-/mob/living/simple_animal/hostile/retaliate/malf_drone/Die()
+/mob/living/simple_animal/hostile/retaliate/malf_drone/death()
src.visible_message("\blue \icon[src] [src] suddenly breaks apart.")
..()
qdel(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm
index 93d510de9ff..abfcad0e403 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm
@@ -67,7 +67,7 @@
else
invisibility = pick(0,60,60,invisibility)
..()
-/mob/living/simple_animal/hostile/retaliate/ghost/Die()
+/mob/living/simple_animal/hostile/retaliate/ghost/death()
new /obj/item/weapon/reagent_containers/food/snacks/ectoplasm(loc)
qdel(src)
return
@@ -105,7 +105,7 @@
faction = list("undead")
-/mob/living/simple_animal/hostile/retaliate/skeleton/Die()
+/mob/living/simple_animal/hostile/retaliate/skeleton/death()
new /obj/effect/decal/remains/human(loc)
qdel(src)
return
@@ -143,7 +143,7 @@
faction = list("undead")
-/mob/living/simple_animal/hostile/retaliate/zombie/Die()
+/mob/living/simple_animal/hostile/retaliate/zombie/death()
new /obj/effect/decal/cleanable/blood/gibs(loc)
qdel(src)
return
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm
index 69ad3e579d7..219eaf59801 100644
--- a/code/modules/mob/living/simple_animal/hostile/russian.dm
+++ b/code/modules/mob/living/simple_animal/hostile/russian.dm
@@ -51,7 +51,7 @@
weapon1 = /obj/item/weapon/gun/projectile/shotgun/boltaction
casingtype = /obj/item/ammo_casing/a762
-/mob/living/simple_animal/hostile/russian/Die()
+/mob/living/simple_animal/hostile/russian/death()
..()
if(corpse)
new corpse (src.loc)
diff --git a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
index 65cd340bf3f..f07b2ed1794 100644
--- a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
+++ b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
@@ -186,11 +186,11 @@
//Harder to kill the head, but it can kill off the whole worm
-/mob/living/simple_animal/hostile/spaceWorm/wormHead/Die()
+/mob/living/simple_animal/hostile/spaceWorm/wormHead/death()
..()
if(prob(catastrophicDeathProb))
for(var/mob/living/simple_animal/hostile/spaceWorm/SW in totalWormSegments)
- SW.Die()
+ SW.death()
/mob/living/simple_animal/hostile/spaceWorm/Life()
@@ -291,12 +291,12 @@
myHead.totalWormSegments -= src
if(die)
- newHead.Die()
+ newHead.death()
qdel(src)
-/mob/living/simple_animal/hostile/spaceWorm/Die()
+/mob/living/simple_animal/hostile/spaceWorm/death()
..()
if(myHead)
myHead.totalWormSegments -= src
diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm
index c2e84b06370..b9f0f53a2fb 100644
--- a/code/modules/mob/living/simple_animal/hostile/statue.dm
+++ b/code/modules/mob/living/simple_animal/hostile/statue.dm
@@ -180,7 +180,7 @@
dust(animation)
-/mob/living/simple_animal/hostile/statue/Die()
+/mob/living/simple_animal/hostile/statue/death()
living_mob_list -= src
dead_mob_list += src
if(key)
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index 2a11f876f2f..b81a9161686 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -34,7 +34,7 @@
faction = list("syndicate")
status_flags = CANPUSH
-/mob/living/simple_animal/hostile/syndicate/Die()
+/mob/living/simple_animal/hostile/syndicate/death()
..()
if(corpse)
new corpse (src.loc)
@@ -162,7 +162,7 @@
minbodytemp = 0
flying = 1
-/mob/living/simple_animal/hostile/viscerator/Die()
+/mob/living/simple_animal/hostile/viscerator/death()
..()
visible_message("\red [src] is smashed into pieces!")
qdel(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm
index a5138f08d08..5dd06aaca94 100644
--- a/code/modules/mob/living/simple_animal/hostile/tree.dm
+++ b/code/modules/mob/living/simple_animal/hostile/tree.dm
@@ -50,7 +50,7 @@
L.Weaken(3)
L.visible_message("\the [src] knocks down \the [L]!")
-/mob/living/simple_animal/hostile/tree/Die()
+/mob/living/simple_animal/hostile/tree/death()
..()
visible_message("\red [src] is hacked into pieces!")
new /obj/item/stack/sheet/wood(loc)
diff --git a/code/modules/mob/living/simple_animal/revenant/revenant.dm b/code/modules/mob/living/simple_animal/revenant/revenant.dm
index f3789683f2c..a62839665d7 100644
--- a/code/modules/mob/living/simple_animal/revenant/revenant.dm
+++ b/code/modules/mob/living/simple_animal/revenant/revenant.dm
@@ -194,7 +194,7 @@
return 1
return 0
-/mob/living/simple_animal/revenant/Die()
+/mob/living/simple_animal/revenant/death()
..()
src << "NO! No... it's too late, you can feel yourself fading..."
notransform = 1
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
index c722ac36e80..a006c94b11f 100644
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ b/code/modules/mob/living/simple_animal/shade.dm
@@ -28,17 +28,14 @@
status_flags = CANPUSH
- Life()
+ death()
..()
- if(stat == 2)
- new /obj/item/weapon/reagent_containers/food/snacks/ectoplasm (src.loc)
- for(var/mob/M in viewers(src, null))
- if((M.client && !( M.blinded )))
- M.show_message("\red [src] lets out a contented sigh as their form unwinds. ")
- ghostize()
- qdel(src)
- return
-
+ new /obj/item/weapon/reagent_containers/food/snacks/ectoplasm (src.loc)
+ for(var/mob/M in viewers(src, null))
+ if((M.client && !( M.blinded )))
+ M.show_message("\red [src] lets out a contented sigh as their form unwinds. ")
+ ghostize()
+ qdel(src)
attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
if(istype(O, /obj/item/device/soulstone))
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 6cde4e588aa..e93f8a22dae 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -90,43 +90,33 @@
..()
health = Clamp(health, 0, maxHealth)
+
/mob/living/simple_animal/Life()
- updatehealth()
- update_gravity(mob_has_gravity())
- update_canmove()
-
- //Health
- if(stat == DEAD)
- if(health > 0)
- icon_state = icon_living
- dead_mob_list -= src
- living_mob_list += src
- stat = CONSCIOUS
- density = 1
- return 0
-
- if(health < 1)
- Die()
+ if(..())
+ if(!ckey)
+ handle_automated_movement()
+ handle_automated_action()
+ handle_automated_speech()
+ . = 1
if(resting && icon_resting && stat != DEAD)
icon_state = icon_resting
- else if(icon_resting && stat != DEAD)
+ else if(stat != DEAD)
icon_state = icon_living
- if(sleeping)
- sleeping = max(sleeping-1, 0)
- if(ear_deaf)
- ear_deaf = max(ear_deaf-1, 0)
+/mob/living/simple_animal/handle_regular_status_updates()
+ if(..()) //alive
+ if(health < 1)
+ death()
+ return 0
+ return 1
- handle_stunned()
- handle_weakened()
- handle_paralysed()
+/mob/living/simple_animal/proc/handle_automated_action()
+ return
- handle_actions()
-
- //Movement
- if(!client && !stop_automated_movement && wander && (ckey == null))
+/mob/living/simple_animal/proc/handle_automated_movement()
+ if(!stop_automated_movement && wander)
if(isturf(src.loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc.
turns_since_move++
if(turns_since_move >= turns_per_move)
@@ -135,9 +125,10 @@
if(Process_Spacemove(anydir))
Move(get_step(src,anydir), anydir)
turns_since_move = 0
+ return
- //Speaking
- if(!client && speak_chance && (ckey == null))
+/mob/living/simple_animal/proc/handle_automated_speech()
+ if(speak_chance)
if(rand(0,200) < speak_chance)
if(speak && speak.len)
if((emote_hear && emote_hear.len) || (emote_see && emote_see.len))
@@ -171,67 +162,69 @@
custom_emote(2,pick(emote_hear))
- //Atmos
+/mob/living/simple_animal/handle_environment(datum/gas_mixture/environment)
var/atmos_suitable = 1
var/atom/A = src.loc
-
- if(istype(A,/turf))
+ if(isturf(A))
var/turf/T = A
+ var/areatemp = get_temperature(environment)
- var/datum/gas_mixture/Environment = T.return_air()
+ if( abs(areatemp - bodytemperature) > 40 && !(flags & NO_BREATHE))
+ var/diff = areatemp - bodytemperature
+ diff = diff / 5
+ bodytemperature += diff
- if(Environment)
+ if(istype(T, /turf/simulated))
+ var/turf/simulated/ST = T
+ if(ST.air)
+ var/tox = ST.air.toxins
+ var/oxy = ST.air.oxygen
+ var/n2 = ST.air.nitrogen
+ var/co2 = ST.air.carbon_dioxide
- if( abs(Environment.temperature - bodytemperature) > 40 && !(flags & NO_BREATHE))
- bodytemperature += ((Environment.temperature - bodytemperature) / 5)
-
- if(min_oxy)
- if(Environment.oxygen < min_oxy)
+ if(min_oxy && oxy < min_oxy)
+ atmos_suitable = 0
+ oxygen_alert = 1
+ else if(max_oxy && oxy > max_oxy)
atmos_suitable = 0
oxygen_alert = 1
else
oxygen_alert = 0
- if(max_oxy)
- if(Environment.oxygen > max_oxy)
+
+ if(min_tox && tox < min_tox)
atmos_suitable = 0
- if(min_tox)
- if(Environment.toxins < min_tox)
- atmos_suitable = 0
- if(max_tox)
- if(Environment.toxins > max_tox)
+ toxins_alert = 1
+ else if(max_tox && tox > max_tox)
atmos_suitable = 0
toxins_alert = 1
else
toxins_alert = 0
- if(min_n2)
- if(Environment.nitrogen < min_n2)
- atmos_suitable = 0
- if(max_n2)
- if(Environment.nitrogen > max_n2)
- atmos_suitable = 0
- if(min_co2)
- if(Environment.carbon_dioxide < min_co2)
- atmos_suitable = 0
- if(max_co2)
- if(Environment.carbon_dioxide > max_co2)
- atmos_suitable = 0
- if(flags & NO_BREATHE)
- atmos_suitable = 1
- //Atmos effect
+ if(min_n2 && n2 < min_n2)
+ atmos_suitable = 0
+ else if(max_n2 && n2 > max_n2)
+ atmos_suitable = 0
+
+ if(min_co2 && co2 < min_co2)
+ atmos_suitable = 0
+ else if(max_co2 && co2 > max_co2)
+ atmos_suitable = 0
+
+ if(!atmos_suitable)
+ adjustBruteLoss(unsuitable_atmos_damage)
+
+ else
+ if(min_oxy || min_tox || min_n2 || min_co2)
+ adjustBruteLoss(unsuitable_atmos_damage)
+
+ handle_temperature_damage()
+
+/mob/living/simple_animal/proc/handle_temperature_damage()
if(bodytemperature < minbodytemp)
- fire_alert = 2
- adjustBruteLoss(cold_damage_per_tick)
+ adjustBruteLoss(2)
else if(bodytemperature > maxbodytemp)
- fire_alert = 1
- adjustBruteLoss(heat_damage_per_tick)
- else
- fire_alert = 0
-
- if(!atmos_suitable)
- adjustBruteLoss(unsuitable_atmos_damage)
- return 1
+ adjustBruteLoss(3)
/mob/living/simple_animal/Bumped(AM as mob|obj)
if(!AM) return
@@ -450,15 +443,14 @@
statpanel("Status")
stat(null, "Health: [round((health / maxHealth) * 100)]%")
-/mob/living/simple_animal/proc/Die()
- living_mob_list -= src
- dead_mob_list += src
- if(key)
- respawnable_list += src
+/mob/living/simple_animal/death(gibbed)
+ health = 0
icon_state = icon_dead
stat = DEAD
density = 0
- return
+ if(!gibbed)
+ visible_message("\The [src] stops moving...")
+ ..()
/mob/living/simple_animal/ex_act(severity)
..()
@@ -597,4 +589,4 @@
resize = RESIZE_DEFAULT_SIZE
if(changed)
- animate(src, transform = ntransform, time = 2, easing = EASE_IN|EASE_OUT)
\ No newline at end of file
+ animate(src, transform = ntransform, time = 2, easing = EASE_IN|EASE_OUT)
diff --git a/code/modules/mob/living/simple_animal/slaughter/slaughter.dm b/code/modules/mob/living/simple_animal/slaughter/slaughter.dm
index c1ad9d79f67..f5edb4ac363 100644
--- a/code/modules/mob/living/simple_animal/slaughter/slaughter.dm
+++ b/code/modules/mob/living/simple_animal/slaughter/slaughter.dm
@@ -83,7 +83,7 @@
else
speed = 0
-/mob/living/simple_animal/slaughter/Die()
+/mob/living/simple_animal/slaughter/death()
..()
var/obj/effect/decal/cleanable/blood/innards = new (get_turf(src))
innards.icon = 'icons/obj/surgery.dmi'
diff --git a/code/modules/mob/living/simple_animal/tribbles.dm b/code/modules/mob/living/simple_animal/tribbles.dm
index b4eac82db6c..3f082c020db 100644
--- a/code/modules/mob/living/simple_animal/tribbles.dm
+++ b/code/modules/mob/living/simple_animal/tribbles.dm
@@ -80,7 +80,7 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles,
src.procreate()
-/mob/living/simple_animal/tribble/Die() // Gotta make sure to remove tribbles from the list on death
+/mob/living/simple_animal/tribble/death() // Gotta make sure to remove tribbles from the list on death
..()
totaltribbles -= 1
diff --git a/code/modules/mob/living/simple_animal/vox.dm b/code/modules/mob/living/simple_animal/vox.dm
index d350e7c4704..3929e9f8f75 100644
--- a/code/modules/mob/living/simple_animal/vox.dm
+++ b/code/modules/mob/living/simple_animal/vox.dm
@@ -22,7 +22,7 @@
var/amp = null
var/quills = 3
-/mob/living/simple_animal/vox/armalis/Die()
+/mob/living/simple_animal/vox/armalis/death()
living_mob_list -= src
dead_mob_list += src
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 2c96609324d..a51f24cc8cc 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1401,6 +1401,14 @@ mob/proc/yank_out_object()
location.add_poop_floor()
playsound(location, 'sound/effects/splat.ogg', 50, 1)
+
+
+/mob/proc/adjustEarDamage()
+ return
+
+/mob/proc/setEarDamage()
+ return
+
/mob/proc/AddSpell(var/obj/effect/proc_holder/spell/spell)
spell_list += spell
if(!spell.action)
diff --git a/paradise.dme b/paradise.dme
index 578e68069d7..d1ccd59eae7 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1279,6 +1279,7 @@
#include "code\modules\mob\living\bloodcrawl.dm"
#include "code\modules\mob\living\damage_procs.dm"
#include "code\modules\mob\living\default_language.dm"
+#include "code\modules\mob\living\life.dm"
#include "code\modules\mob\living\living.dm"
#include "code\modules\mob\living\living_defense.dm"
#include "code\modules\mob\living\living_defines.dm"