From c8b0a21baa0becaef5f658702e1323fa509d3e97 Mon Sep 17 00:00:00 2001 From: phil235 Date: Sat, 21 Feb 2015 00:37:04 +0100 Subject: [PATCH 1/2] Fixes a lot of duplicated code in life and its subprocs for carbon mobs. Fixes cyborg and monkeys no seeing any flash when flashed. --- code/_onclick/hud/alien.dm | 2 +- code/_onclick/hud/alien_larva.dm | 2 +- code/_onclick/hud/monkey.dm | 11 +- code/_onclick/hud/other_mobs.dm | 4 +- code/_onclick/hud/robot.dm | 2 +- code/modules/mob/living/carbon/alien/alien.dm | 41 +- .../carbon/alien/humanoid/caste/hunter.dm | 18 +- .../carbon/alien/humanoid/caste/sentinel.dm | 14 +- .../living/carbon/alien/humanoid/humanoid.dm | 51 -- .../mob/living/carbon/alien/humanoid/life.dm | 159 ----- .../mob/living/carbon/alien/humanoid/queen.dm | 18 +- .../mob/living/carbon/alien/larva/emote.dm | 6 +- .../mob/living/carbon/alien/larva/larva.dm | 66 -- .../mob/living/carbon/alien/larva/life.dm | 159 +---- code/modules/mob/living/carbon/alien/life.dm | 166 ++--- code/modules/mob/living/carbon/brain/brain.dm | 3 + code/modules/mob/living/carbon/brain/life.dm | 246 ++----- code/modules/mob/living/carbon/carbon.dm | 7 + .../mob/living/carbon/carbon_defines.dm | 5 + code/modules/mob/living/carbon/human/human.dm | 14 +- .../mob/living/carbon/human/human_defines.dm | 2 - code/modules/mob/living/carbon/human/life.dm | 358 ++-------- .../mob/living/carbon/human/species.dm | 76 +- code/modules/mob/living/carbon/life.dm | 653 ++++++++++++++++-- code/modules/mob/living/carbon/monkey/life.dm | 370 +--------- .../mob/living/carbon/monkey/monkey.dm | 23 +- code/modules/mob/living/carbon/slime/death.dm | 5 +- code/modules/mob/living/carbon/slime/life.dm | 86 +-- code/modules/mob/living/carbon/slime/slime.dm | 40 +- icons/mob/screen_alien.dmi | Bin 24212 -> 24796 bytes 30 files changed, 951 insertions(+), 1656 deletions(-) diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index 7b183381253..9e9c2aa3dac 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -152,7 +152,7 @@ mymob.blind.layer = 0 mymob.flash = new /obj/screen() - mymob.flash.icon = 'icons/mob/screen_alien.dmi' + mymob.flash.icon = 'icons/mob/screen_gen.dmi' mymob.flash.icon_state = "blank" mymob.flash.name = "flash" mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH" diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index 716947a1245..47b519f9066 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -60,7 +60,7 @@ mymob.blind.layer = 0 mymob.flash = new /obj/screen() - mymob.flash.icon = 'icons/mob/screen_alien.dmi' + mymob.flash.icon = 'icons/mob/screen_gen.dmi' mymob.flash.icon_state = "blank" mymob.flash.name = "flash" mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH" diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm index 8b2227e1009..0f2b38e9d3e 100644 --- a/code/_onclick/hud/monkey.dm +++ b/code/_onclick/hud/monkey.dm @@ -137,8 +137,17 @@ mymob.blind.screen_loc = "CENTER-7,CENTER-7" mymob.blind.layer = 0 + mymob.damageoverlay = new /obj/screen() + mymob.damageoverlay.icon = 'icons/mob/screen_full.dmi' + mymob.damageoverlay.icon_state = "oxydamageoverlay0" + mymob.damageoverlay.name = "dmg" + mymob.damageoverlay.blend_mode = BLEND_MULTIPLY + mymob.damageoverlay.screen_loc = "CENTER-7,CENTER-7" + mymob.damageoverlay.mouse_opacity = 0 + mymob.damageoverlay.layer = 18.1 //The black screen overlay sets layer to 18 to display it, this one has to be just on top. + mymob.flash = new /obj/screen() - mymob.flash.icon = ui_style + mymob.flash.icon = 'icons/mob/screen_gen.dmi' mymob.flash.icon_state = "blank" mymob.flash.name = "flash" mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH" diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm index a6a76e74355..c74f1ee7849 100644 --- a/code/_onclick/hud/other_mobs.dm +++ b/code/_onclick/hud/other_mobs.dm @@ -13,6 +13,9 @@ mymob.blind.screen_loc = "CENTER-7,CENTER-7" mymob.blind.layer = 0 + mymob.client.screen = null + mymob.client.screen += list(mymob.blind) + /datum/hud/proc/blob_hud(ui_style = 'icons/mob/screen_midnight.dmi') blobpwrdisplay = new /obj/screen() @@ -28,6 +31,5 @@ blobhealthdisplay.layer = 20 mymob.client.screen = null - mymob.client.screen += list(blobpwrdisplay, blobhealthdisplay) diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 66258562b5c..4f9d70a1b5e 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -164,7 +164,7 @@ mymob.blind.layer = 0 mymob.flash = new /obj/screen() - mymob.flash.icon = 'icons/mob/screen_cyborg.dmi' + mymob.flash.icon = 'icons/mob/screen_gen.dmi' mymob.flash.icon_state = "blank" mymob.flash.name = "flash" mymob.flash.screen_loc = "WEST,SOUTH to EAST,NORTH" diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index fd9af671dab..7ef86c2c9ab 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -25,10 +25,6 @@ var/heal_rate = 5 var/plasma_rate = 5 - var/oxygen_alert = 0 - var/toxins_alert = 0 - var/fire_alert = 0 - var/heat_protection = 0.5 var/leaping = 0 @@ -111,31 +107,28 @@ fire_alert = max(fire_alert, 2) return -/mob/living/carbon/alien/handle_mutations_and_radiation() - // Aliens love radiation nom nom nom - if (radiation) - if (radiation > 100) - radiation = 100 +/mob/living/carbon/alien/ex_act(severity, target) + ..() - if (radiation < 0) - radiation = 0 + switch (severity) + if (1.0) + gib() + return - switch(radiation) - if(0 to 50) - radiation-- - if(prob(25)) - adjustToxLoss(1) + if (2.0) + adjustBruteLoss(60) + adjustFireLoss(60) + adjustEarDamage(30,120) - if(50 to 75) - radiation -= 2 - adjustToxLoss(1) - if(prob(5)) - radiation -= 5 + if(3.0) + adjustBruteLoss(30) + if (prob(50)) + Paralyse(1) + adjustEarDamage(15,60) + + updatehealth() - if(75 to 100) - radiation -= 3 - adjustToxLoss(3) /mob/living/carbon/alien/handle_fire()//Aliens on fire code if(..()) diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index 312f0b30f51..ef341fa8a56 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -15,26 +15,26 @@ real_name = name ..() -/mob/living/carbon/alien/humanoid/hunter/handle_regular_hud_updates() - ..() //-Yvarov - +/mob/living/carbon/alien/humanoid/hunter/handle_hud_icons_health() if (healths) if (stat != 2) switch(health) if(150 to INFINITY) healths.icon_state = "health0" - if(100 to 150) + if(120 to 150) healths.icon_state = "health1" - if(50 to 100) + if(90 to 120) healths.icon_state = "health2" - if(25 to 50) + if(60 to 90) healths.icon_state = "health3" - if(0 to 25) + if(30 to 60) healths.icon_state = "health4" - else + if(0 to 30) healths.icon_state = "health5" + else + healths.icon_state = "health6" else - healths.icon_state = "health6" + healths.icon_state = "health7" /mob/living/carbon/alien/humanoid/hunter/handle_environment() diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm index f6d14be8d91..c277695df7c 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm @@ -17,9 +17,7 @@ verbs.Add(/mob/living/carbon/alien/humanoid/proc/corrosive_acid,/mob/living/carbon/alien/humanoid/proc/neurotoxin) ..() -/mob/living/carbon/alien/humanoid/sentinel/handle_regular_hud_updates() - ..() //-Yvarov - +/mob/living/carbon/alien/humanoid/sentinel/handle_hud_icons_health() if (healths) if (stat != 2) switch(health) @@ -29,14 +27,16 @@ healths.icon_state = "health1" if(75 to 100) healths.icon_state = "health2" - if(25 to 75) + if(50 to 75) healths.icon_state = "health3" - if(0 to 25) + if(25 to 50) healths.icon_state = "health4" - else + if(0 to 25) healths.icon_state = "health5" + else + healths.icon_state = "health6" else - healths.icon_state = "health6" + healths.icon_state = "health7" /mob/living/carbon/alien/humanoid/sentinel/movement_delay() . = ..() diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 6112f31c72d..50f8ed4b4a1 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -28,53 +28,6 @@ if(l_store) l_store.emp_act(severity) ..() -/mob/living/carbon/alien/humanoid/ex_act(severity, target) - ..() - - var/shielded = 0 - - var/b_loss = null - var/f_loss = null - switch (severity) - if (1.0) - gib() - return - - if (2.0) - if (!shielded) - b_loss += 60 - - f_loss += 60 - - adjustEarDamage(30, 120) - - if(3.0) - b_loss += 30 - if (prob(50) && !shielded) - Paralyse(1) - adjustEarDamage(15 , 60) - - adjustBruteLoss(b_loss) - adjustFireLoss(f_loss) - - updatehealth() - -/mob/living/carbon/alien/humanoid/blob_act() - if (stat == 2) - return - var/shielded = 0 - var/damage = null - if (stat != 2) - damage = rand(30,40) - - if(shielded) - damage /= 4 - - show_message("The blob attacks!") - adjustFireLoss(damage) - return - - /mob/living/carbon/alien/humanoid/attack_slime(mob/living/carbon/slime/M as mob) ..() var/damage = rand(5, 35) @@ -139,10 +92,6 @@ 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) user.set_machine(src) var/dat = {" diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index 3862e75e7eb..1ecd703175b 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -5,7 +5,6 @@ toxins_alert = 0 fire_alert = 0 pass_flags = PASSTABLE - var/temperature_alert = 0 /mob/living/carbon/alien/humanoid/proc/adjust_body_temperature(current, loc_temp, boost) @@ -25,162 +24,4 @@ temp_change = (temperature - current) return temp_change -/mob/living/carbon/alien/humanoid/handle_regular_status_updates() - updatehealth() - - if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP - eye_blind = 1 - silent = 0 - else //ALIVE. LIGHTS ARE ON - if(health < config.health_threshold_dead || !getorgan(/obj/item/organ/brain)) - death() - eye_blind = 1 - stat = DEAD - silent = 0 - return 1 - - //UNCONSCIOUS. NO-ONE IS HOME - if( (getOxyLoss() > 50) || (config.health_threshold_crit >= health) ) - if( health <= 20 && prob(1) ) - spawn(0) - emote("gasp") - if(!reagents.has_reagent("epinephrine")) - adjustOxyLoss(1) - Paralyse(3) - - if(paralysis) - AdjustParalysis(-1) - eye_blind = max(eye_blind, 1) - stat = UNCONSCIOUS - else if(sleeping) - sleeping = max(sleeping-1, 0) - eye_blind = max(eye_blind, 1) - stat = UNCONSCIOUS - if( prob(10) && health ) - spawn(0) - emote("hiss") - //CONSCIOUS - else - stat = CONSCIOUS - - /* What in the living hell is this?*/ - if(move_delay_add > 0) - move_delay_add = max(0, move_delay_add - rand(1, 2)) - - //Eyes - if(disabilities & BLIND) //disabled-blind, 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 - adjustEarDamage(-1, (ear_damage < 25 ? -0.05 : 0)) - //deafness, heals slowly over time - //ear damage heals slowly under this threshold. otherwise you'll need earmuffs - - //Other - if(stunned) - AdjustStunned(-1) - if(!stunned) - update_icons() - - if(weakened) - weakened = max(weakened-1,0) - if(!weakened) - update_icons() - - if(stuttering) - stuttering = max(stuttering-1, 0) - - if(silent) - silent = max(silent-1, 0) - - if(druggy) - druggy = max(druggy-1, 0) - return 1 - - -/mob/living/carbon/alien/humanoid/handle_regular_hud_updates() - - if (stat == 2) - 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_MOBS - sight &= ~SEE_TURFS - sight &= ~SEE_OBJS - if(nightvision) - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM - else if(!nightvision) - see_in_dark = 4 - see_invisible = 45 - if(see_override) - see_invisible = see_override - - if (healths) - if (stat != 2) - switch(health) - if(100 to INFINITY) - healths.icon_state = "health0" - if(75 to 100) - healths.icon_state = "health1" - if(50 to 75) - healths.icon_state = "health2" - if(25 to 50) - healths.icon_state = "health3" - if(0 to 25) - healths.icon_state = "health4" - else - healths.icon_state = "health5" - else - healths.icon_state = "health6" - - if(pullin) - if(pulling) - pullin.icon_state = "pull" - else - pullin.icon_state = "pull0" - - - if (toxin) toxin.icon_state = "tox[toxins_alert ? 1 : 0]" - if (oxygen) oxygen.icon_state = "oxy[oxygen_alert ? 1 : 0]" - if (fire) fire.icon_state = "fire[fire_alert ? 1 : 0]" - //NOTE: the alerts dont reset when youre out of danger. dont blame me, - //blame the person who coded them. Temporary fix added. - - client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) - - if ((blind && stat != 2)) - if ((eye_blind)) - blind.layer = 18 - else - blind.layer = 0 - - if (disabilities & NEARSIGHT) - 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.adminobs) - reset_view(null) - - return 1 diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index 8473fa5e8e1..a42e347ac21 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -25,26 +25,26 @@ verbs.Add(/mob/living/carbon/alien/humanoid/proc/corrosive_acid,/mob/living/carbon/alien/humanoid/proc/neurotoxin,/mob/living/carbon/alien/humanoid/proc/resin) ..() -/mob/living/carbon/alien/humanoid/queen/handle_regular_hud_updates() - ..() //-Yvarov - +/mob/living/carbon/alien/humanoid/queen/handle_hud_icons_health() if (src.healths) if (src.stat != 2) switch(health) if(250 to INFINITY) src.healths.icon_state = "health0" - if(175 to 250) + if(200 to 250) src.healths.icon_state = "health1" - if(100 to 175) + if(150 to 200) src.healths.icon_state = "health2" - if(50 to 100) + if(100 to 150) src.healths.icon_state = "health3" - if(0 to 50) + if(50 to 100) src.healths.icon_state = "health4" - else + if(0 to 50) src.healths.icon_state = "health5" + else + src.healths.icon_state = "health6" else - src.healths.icon_state = "health6" + src.healths.icon_state = "health7" /mob/living/carbon/alien/humanoid/queen/movement_delay() . = ..() diff --git a/code/modules/mob/living/carbon/alien/larva/emote.dm b/code/modules/mob/living/carbon/alien/larva/emote.dm index 1533fa673a8..57c3783ed82 100644 --- a/code/modules/mob/living/carbon/alien/larva/emote.dm +++ b/code/modules/mob/living/carbon/alien/larva/emote.dm @@ -76,9 +76,9 @@ if (!src.restrained()) message = text("[src] signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null)) m_type = 1 -// if ("sit") -// message = "[src] sits down." //Larvan can't sit down, /N -// m_type = 1 + if ("snore") + message = "[src] snores." + m_type = 2 if ("sulk") message = "[src] sulks down sadly." m_type = 1 diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index cf2753460ed..6bdcbb4307d 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -34,60 +34,6 @@ amount_grown = min(amount_grown + 1, max_grown) ..(amount) - -/mob/living/carbon/alien/larva/ex_act(severity, target) - ..() - - var/b_loss = null - var/f_loss = null - switch (severity) - if (1.0) - gib() - return - - if (2.0) - - b_loss += 60 - - f_loss += 60 - - adjustEarDamage(30,120) - - if(3.0) - b_loss += 30 - if (prob(50)) - Paralyse(1) - adjustEarDamage(15,60) - - adjustBruteLoss(b_loss) - adjustFireLoss(f_loss) - - updatehealth() - - - -/mob/living/carbon/alien/larva/blob_act() - if (stat == 2) - return - var/shielded = 0 - - var/damage = null - if (stat != 2) - damage = rand(10,30) - - if(shielded) - damage /= 4 - - //paralysis += 1 - - show_message("The blob attacks you!") - - adjustFireLoss(damage) - - updatehealth() - return - - //can't equip anything /mob/living/carbon/alien/larva/attack_ui(slot_id) return @@ -137,9 +83,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 // now constructs damage icon for each organ from mask * damage field @@ -153,15 +96,6 @@ /mob/living/carbon/alien/larva/start_pulling() return -/* Commented out because it's duplicated in life.dm -/mob/living/carbon/alien/larva/proc/grow() // Larvae can grow into full fledged Xenos if they survive long enough - if(icon_state == "larva_l" && !canmove) // This is a shit death check. It is made of shit and death. Fix later. - return - else - var/mob/living/carbon/alien/humanoid/A = new(loc) - A.key = key - qdel(src) */ - /mob/living/carbon/alien/larva/stripPanelUnequip(obj/item/what, mob/who) src << "You don't have the dexterity to do this!" return diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 1c114151162..bc843e1dc13 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -1,10 +1,11 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 -/mob/living/carbon/alien/larva - var/temperature_alert = 0 - /mob/living/carbon/alien/larva/Life() + set invisibility = 0 + set background = BACKGROUND_ENABLED + if (notransform) + return if(..()) // GROW! if(amount_grown < max_grown) @@ -13,160 +14,26 @@ //some kind of bug in canmove() isn't properly calling update_icons, so this is here as a placeholder update_icons() - -/mob/living/carbon/alien/larva/handle_regular_status_updates() - updatehealth() - - if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP - eye_blind = max(1, eye_blind) - silent = 0 - else //ALIVE. LIGHTS ARE ON - if(health < -25 || !getorgan(/obj/item/organ/brain)) - death() - eye_blind = max(1, eye_blind) - - silent = 0 - return 1 - - //UNCONSCIOUS. NO-ONE IS HOME - if( (getOxyLoss() > 25) || (config.health_threshold_crit >= health) ) - //if( health <= 20 && prob(1) ) - // spawn(0) - // emote("gasp") - if(!reagents.has_reagent("epinephrine")) - adjustOxyLoss(1) - Paralyse(3) - - if(paralysis) - AdjustParalysis(-2) - eye_blind = max(eye_blind, 1) - stat = UNCONSCIOUS - else if(sleeping) - sleeping = max(sleeping-1, 0) - eye_blind = max(eye_blind, 1) - stat = UNCONSCIOUS - if( prob(10) && health ) - spawn(0) - emote("hiss_") - //CONSCIOUS - else - stat = CONSCIOUS - - /* What in the living hell is this?*/ - if(move_delay_add > 0) - move_delay_add = max(0, move_delay_add - rand(1, 2)) - - //Eyes - if(disabilities & BLIND) //disabled-blind, 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 - adjustEarDamage(-1, (ear_damage < 25 ? -0.05 : 0)) - //deafness, heals slowly over time - //ear damage heals slowly under this threshold. otherwise you'll need earmuffs - - //Other - if(stunned) - AdjustStunned(-1) - - if(weakened) - weakened = max(weakened-1,0) - - if(stuttering) - stuttering = max(stuttering-1, 0) - - if(silent) - silent = max(silent-1, 0) - - if(druggy) - druggy = max(druggy-1, 0) - return 1 - - -/mob/living/carbon/alien/larva/handle_regular_hud_updates() - - if (stat == 2) - 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_MOBS - sight &= ~SEE_TURFS - sight &= ~SEE_OBJS - if(nightvision) - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM - else if(!nightvision) - see_in_dark = 4 - see_invisible = 45 - if(see_override) - see_invisible = see_override +/mob/living/carbon/alien/larva/handle_hud_icons_health() if (healths) if (stat != 2) switch(health) if(25 to INFINITY) healths.icon_state = "health0" - if(19 to 25) + if(20 to 25) healths.icon_state = "health1" - if(13 to 19) + if(15 to 20) healths.icon_state = "health2" - if(7 to 13) + if(10 to 15) healths.icon_state = "health3" - if(0 to 7) + if(5 to 10) healths.icon_state = "health4" - else + if(0 to 5) healths.icon_state = "health5" + else + healths.icon_state = "health6" else - healths.icon_state = "health6" - - if(pullin) - if(pulling) - pullin.icon_state = "pull" - else - pullin.icon_state = "pull0" - - if (toxin) toxin.icon_state = "tox[toxins_alert ? 1 : 0]" - if (oxygen) oxygen.icon_state = "oxy[oxygen_alert ? 1 : 0]" - if (fire) fire.icon_state = "fire[fire_alert ? 1 : 0]" - //NOTE: the alerts dont reset when youre out of danger. dont blame me, - //blame the person who coded them. Temporary fix added. - - - client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) - - if ((blind && stat != 2)) - if ((eye_blind)) - blind.layer = 18 - else - blind.layer = 0 - - if (disabilities & NEARSIGHT) - 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.adminobs) - reset_view(null) - - return 1 + healths.icon_state = "health7" diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index ac723c4cb26..a658992e26b 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -1,95 +1,5 @@ -/mob/living/carbon/alien/Life() - - if(..()) - //First, resolve location and get a breath - if(SSair.times_fired%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) - - // Handle chem smoke effect -- Doohl - for(var/obj/effect/effect/chem_smoke/smoke in view(1, src)) - if(smoke.reagents.total_volume) - smoke.reagents.reaction(src, INGEST) - spawn(5) - if(smoke) - smoke.reagents.copy_to(src, 10) // I dunno, maybe the reagents enter the blood stream through the lungs? - break // If they breathe in the nasty stuff once, no need to continue checking - - - 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 @@ -117,6 +27,10 @@ breath.toxins -= toxins_used breath.oxygen += toxins_used + //BREATH TEMPERATURE + handle_breath_temperature(breath) + +/mob/living/carbon/alien/handle_breath_temperature(datum/gas_mixture/breath) if(breath.temperature > (T0C+66)) // Hot air hurts :( if(prob(20)) src << "You feel a searing heat in your lungs!" @@ -124,8 +38,76 @@ else fire_alert = 0 - //Temporary fixes to the alerts. + return 1 + +/mob/living/carbon/alien/handle_regular_status_updates() + ..() + //natural reduction of movement delay due to stun. + if(move_delay_add > 0) + move_delay_add = max(0, move_delay_add - rand(1, 2)) return 1 +/mob/living/carbon/alien/handle_vision() + client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask) + + if (stat == 2) + 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_MOBS + sight &= ~SEE_TURFS + sight &= ~SEE_OBJS + if(nightvision) + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_MINIMUM + else if(!nightvision) + see_in_dark = 4 + see_invisible = 45 + if(see_override) + see_invisible = see_override + + if ((blind && stat != 2)) + if((eye_blind)) + blind.layer = 18 + else + blind.layer = 0 + + if (disabilities & NEARSIGHT) + 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.adminobs) + reset_view(null) + + +/mob/living/carbon/alien/handle_hud_icons() + + handle_hud_icons_health() + + if(pullin) + if(pulling) + pullin.icon_state = "pull" + else + pullin.icon_state = "pull0" + + + if (toxin) toxin.icon_state = "tox[toxins_alert ? 1 : 0]" + if (oxygen) oxygen.icon_state = "oxy[oxygen_alert ? 1 : 0]" + if (fire) fire.icon_state = "fire[fire_alert ? 1 : 0]" + + return 1 diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index e70ea378428..212bfc12fac 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -29,6 +29,9 @@ /mob/living/carbon/brain/ex_act() //you cant blow up brainmobs because it makes transfer_to() freak out when borgs blow up. return +/mob/living/carbon/brain/blob_act() + return + /mob/living/carbon/brain/Move(var/atom/newloc) if(container) container.Move(newloc) diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index e5237d1e774..0f1ef27541f 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -1,40 +1,25 @@ +/mob/living/carbon/brain/handle_breathing() + return + /mob/living/carbon/brain/handle_mutations_and_radiation() if (radiation) if (radiation > 100) - radiation = 100 if(!container)//If it's not in an MMI src << "You feel weak." else//Fluff-wise, since the brain can't detect anything itself, the MMI handles thing like that src << "STATUS: CRITICAL AMOUNTS OF RADIATION DETECTED." - if (radiation < 0) - radiation = 0 - switch(radiation) - if(0 to 50) - radiation-- - if(prob(25)) - adjustToxLoss(1) - updatehealth() if(50 to 75) - radiation -= 2 - adjustToxLoss(1) if(prob(5)) - radiation -= 5 if(!container) src << "You feel weak." else src << "STATUS: DANGEROUS LEVELS OF RADIATION DETECTED." - updatehealth() - - if(75 to 100) - radiation -= 3 - adjustToxLoss(3) - updatehealth() - + ..() /mob/living/carbon/brain/handle_environment(datum/gas_mixture/environment) if(!environment) @@ -61,193 +46,92 @@ 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) - -/mob/living/carbon/brain/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 - - /mob/living/carbon/brain/handle_regular_status_updates() //TODO: comment out the unused bits >_> - updatehealth() - if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP + if(stat == DEAD) eye_blind = max(eye_blind, 1) silent = 0 - else //ALIVE. LIGHTS ARE ON + else + updatehealth() if( !container && (health < config.health_threshold_dead || ((world.time - timeofhostdeath) > config.revival_brain_life)) ) death() eye_blind = max(eye_blind, 1) silent = 0 return 1 + if(health < config.health_threshold_crit) + stat = UNCONSCIOUS + eye_blind = max(eye_blind, 1) + else + stat = CONSCIOUS - //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 + //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 = max(eye_blind, 1) + setEarDamage(-1,1) + silent = 1 + if(!alert)//Sounds an alarm, but only once per 'level' + emote("alarm") + src << "Major electrical distruption detected: System rebooting." + alert = 1 + if(prob(75)) + emp_damage -= 1 + if(20) + alert = 0 + eye_blind = 0 + setEarDamage(-1,0) + silent = 0 + emp_damage -= 1 + if(11 to 19)//Moderate level of EMP damage, resulting in nearsightedness and ear damage + eye_blurry = 1 + setEarDamage(1,-1) + if(!alert) + emote("alert") + src << "Primary systems are now online." + alert = 1 + if(prob(50)) + emp_damage -= 1 + if(10) + alert = 0 + eye_blurry = 0 + setEarDamage(0,-1) + emp_damage -= 1 + if(2 to 9)//Low level of EMP damage, has few effects(handled elsewhere) + if(!alert) + emote("notice") + src << "System reboot nearly complete." + alert = 1 + if(prob(25)) + emp_damage -= 1 + if(1) + alert = 0 + src << "All systems restored." + emp_damage -= 1 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 = max(eye_blind, 1) - setEarDamage(-1,1) - silent = 1 - if(!alert)//Sounds an alarm, but only once per 'level' - emote("alarm") - src << "Major electrical distruption detected: System rebooting." - alert = 1 - if(prob(75)) - emp_damage -= 1 - if(20) - alert = 0 - eye_blind = 0 - setEarDamage(-1,0) - silent = 0 - emp_damage -= 1 - if(11 to 19)//Moderate level of EMP damage, resulting in nearsightedness and ear damage - eye_blurry = 1 - setEarDamage(1,-1) - if(!alert) - emote("alert") - src << "Primary systems are now online." - alert = 1 - if(prob(50)) - emp_damage -= 1 - if(10) - alert = 0 - eye_blurry = 0 - setEarDamage(0,-1) - emp_damage -= 1 - if(2 to 9)//Low level of EMP damage, has few effects(handled elsewhere) - if(!alert) - emote("notice") - src << "System reboot nearly complete." - alert = 1 - if(prob(25)) - emp_damage -= 1 - if(1) - alert = 0 - src << "All systems restored." - emp_damage -= 1 + eye_blind = 0 - //Other - /* commented out because none of these should happen - if(stunned) - AdjustStunned(-1) - - if(weakened) - weakened = max(weakened-1,0) - - if(stuttering) - stuttering = max(stuttering-1, 0) - - if(silent) - silent = max(silent-1, 0) - - if(druggy) - druggy = max(druggy-1, 0) - */ return 1 /mob/living/carbon/brain/handle_regular_hud_updates() - if (stat == 2) - 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(see_override) - see_invisible = see_override + handle_vision() - 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]" - - client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) - - if ((blind && stat != 2)) - if (eye_blind) - blind.layer = 18 - else - blind.layer = 0 - - if (disabilities & NEARSIGHT) - 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.adminobs) - reset_view(null) + handle_hud_icons_health() return 1 - -/*/mob/living/carbon/brain/emp_act(severity) - if(!(container && istype(container, /obj/item/device/mmi))) - return - else - switch(severity) - if(1) - emp_damage += rand(20,30) - if(2) - emp_damage += rand(10,20) - if(3) - emp_damage += rand(0,10) - ..()*/ diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index f1231566581..d3988ea3bde 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -425,3 +425,10 @@ var/const/GALOSHES_DONT_HELP = 8 /mob/living/carbon/is_muzzled() return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) + +/mob/living/carbon/blob_act() + if (stat == DEAD) + return + else + show_message("The blob attacks!") + adjustBruteLoss(10) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index b934cd36517..800a7db85e0 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -15,3 +15,8 @@ var/obj/item/weapon/tank/internals/internal = null var/datum/dna/dna = null//Carbon + + 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 + var/temperature_resistance = T0C+75 \ 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 2022c12574e..9065bcdb8c0 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -78,7 +78,6 @@ /mob/living/carbon/human/ex_act(severity, ex_target) - var/shielded = 0 var/b_loss = null var/f_loss = null switch (severity) @@ -95,8 +94,7 @@ //user.throw_at(target, 200, 4) if (2.0) - if (!shielded) - b_loss += 60 + b_loss += 60 f_loss += 60 @@ -106,7 +104,7 @@ if (!istype(ears, /obj/item/clothing/ears/earmuffs)) adjustEarDamage(30, 120) - if (prob(70) && !shielded) + if (prob(70)) Paralyse(10) if(3.0) @@ -115,7 +113,7 @@ b_loss = b_loss/2 if (!istype(ears, /obj/item/clothing/ears/earmuffs)) adjustEarDamage(15,60) - if (prob(50) && !shielded) + if (prob(50)) Paralyse(10) var/update = 0 @@ -138,17 +136,13 @@ ..() /mob/living/carbon/human/blob_act() - if(stat == 2) return + if(stat == DEAD) return show_message(" The blob attacks you!") var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg") var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone)) apply_damage(5, BRUTE, affecting, run_armor_check(affecting, "melee")) return -/mob/living/carbon/human/var/co2overloadtime = null -/mob/living/carbon/human/var/temperature_resistance = T0C+75 - - /mob/living/carbon/human/show_inv(mob/user) user.set_machine(src) var/has_breathable_mask = istype(wear_mask, /obj/item/clothing/mask) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 6bd44a4115d..efcec3c28ee 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -44,8 +44,6 @@ var/special_voice = "" // For changing our voice. Used by a symptom. - 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/xylophone = 0 //For the spoooooooky xylophone cooldown var/gender_ambiguous = 0 //if something goes wrong during gender reassignment this generates a line in examine diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 9913f5898ca..ec9914d0ad1 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -6,8 +6,6 @@ #define TINT_IMPAIR 2 //Threshold of tint level to apply weld mask overlay #define TINT_BLIND 3 //Threshold of tint level to obscure vision fully -#define HUMAN_MAX_OXYLOSS 3 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it. - #define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point #define HEAT_DAMAGE_LEVEL_2 3 //Amount of damage applied when your body temperature passes the 400K point #define HEAT_DAMAGE_LEVEL_3 8 //Amount of damage applied when your body temperature passes the 460K point and you are on fire @@ -26,30 +24,21 @@ #define COLD_GAS_DAMAGE_LEVEL_3 3 //Amount of damage applied when the current breath's temperature passes the 120K point /mob/living/carbon/human - var/oxygen_alert = 0 - var/toxins_alert = 0 - var/fire_alert = 0 - var/pressure_alert = 0 - var/temperature_alert = 0 var/tinttotal = 0 // Total level of visualy impairing items /mob/living/carbon/human/Life() + set invisibility = 0 + set background = BACKGROUND_ENABLED + + if (notransform) + return fire_alert = 0 //Reset this here, because both breathe() and handle_environment() have a chance to set it. tinttotal = tintcheck() //here as both hud updates and status updates call it - if(..()) - if(dna) - for(var/datum/mutation/human/HM in dna.mutations) - HM.on_life(src) - if(SSmob.times_fired%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) + ..() //Update our name based on whether our face is obscured/disfigured name = get_visible_name() @@ -76,7 +65,19 @@ /mob/living/carbon/human/handle_disabilities() - if (getBrainLoss() >= 60 && stat != 2) + ..() + //Eyes + if(!(disabilities & BLIND)) + if(tinttotal >= TINT_BLIND) //covering your eyes heals blurry eyes faster + eye_blurry = max(eye_blurry-2, 0) + + //Ears + if(!(disabilities & DEAF)) + if(istype(ears, /obj/item/clothing/ears/earmuffs)) // earmuffs rest your ears, healing ear_deaf faster and ear_damage, but keeping you deaf. + setEarDamage(max(ear_damage-0.10, 0), max(ear_deaf - 1, 1)) + + + if (getBrainLoss() >= 60 && stat != DEAD) if (prob(3)) switch(pick(1,2,3)) if(1) @@ -89,9 +90,10 @@ /mob/living/carbon/human/handle_mutations_and_radiation() if(dna) - dna.species.handle_mutations_and_radiation(src) + if(dna.species.handle_mutations_and_radiation(src)) + ..() -/mob/living/carbon/human/proc/breathe() +/mob/living/carbon/human/breathe() if(dna) dna.species.breathe(src) @@ -137,27 +139,8 @@ dna.species.ExtinguishMob(src) else ..() - //END FIRE CODE - /* -/mob/living/carbon/human/proc/adjust_body_temperature(current, loc_temp, boost) - var/temperature = current - var/difference = abs(current-loc_temp) //get difference - var/increments// = difference/10 //find how many increments apart they are - if(difference > 50) - increments = difference/5 - else - increments = difference/10 - var/change = increments*boost // Get the amount to change by (x per increment) - var/temp_change - if(current < loc_temp) - temperature = min(loc_temp, temperature+change) - else if(current > loc_temp) - temperature = max(loc_temp, temperature-change) - temp_change = (temperature - current) - return temp_change -*/ /mob/living/carbon/human/proc/stabilize_temperature_from_calories() switch(bodytemperature) @@ -294,288 +277,28 @@ return min(1,thermal_protection) -/* -/mob/living/carbon/human/proc/add_fire_protection(var/temp) - var/fire_prot = 0 - if(head) - if(head.protective_temperature > temp) - fire_prot += (head.protective_temperature/10) - if(wear_mask) - if(wear_mask.protective_temperature > temp) - fire_prot += (wear_mask.protective_temperature/10) - if(glasses) - if(glasses.protective_temperature > temp) - fire_prot += (glasses.protective_temperature/10) - if(ears) - if(ears.protective_temperature > temp) - fire_prot += (ears.protective_temperature/10) - if(wear_suit) - if(wear_suit.protective_temperature > temp) - fire_prot += (wear_suit.protective_temperature/10) - if(w_uniform) - if(w_uniform.protective_temperature > temp) - fire_prot += (w_uniform.protective_temperature/10) - if(gloves) - if(gloves.protective_temperature > temp) - fire_prot += (gloves.protective_temperature/10) - if(shoes) - if(shoes.protective_temperature > temp) - fire_prot += (shoes.protective_temperature/10) - - return fire_prot - -/mob/living/carbon/human/proc/handle_temperature_damage(body_part, exposed_temperature, exposed_intensity) - if(nodamage) - return - //world <<"body_part = [body_part], exposed_temperature = [exposed_temperature], exposed_intensity = [exposed_intensity]" - var/discomfort = min(abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0) - - if(exposed_temperature > bodytemperature) - discomfort *= 4 - - if(mutantrace == "plant") - discomfort *= TEMPERATURE_DAMAGE_COEFFICIENT * 2 //I don't like magic numbers. I'll make mutantraces a datum with vars sometime later. -- Urist - else - discomfort *= TEMPERATURE_DAMAGE_COEFFICIENT //Dangercon 2011 - now with less magic numbers! - //world <<"[discomfort]" - - switch(body_part) - if(HEAD) - apply_damage(2.5*discomfort, BURN, "head") - if(CHEST) - apply_damage(2.5*discomfort, BURN, "chest") - if(LEGS) - apply_damage(0.6*discomfort, BURN, "l_leg") - apply_damage(0.6*discomfort, BURN, "r_leg") - if(ARMS) - apply_damage(0.4*discomfort, BURN, "l_arm") - apply_damage(0.4*discomfort, BURN, "r_arm") -*/ /mob/living/carbon/human/handle_chemicals_in_body() + ..() if(dna) dna.species.handle_chemicals_in_body(src) return //TODO: DEFERRED -/mob/living/carbon/human/handle_regular_status_updates() - if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP - silent = 0 - else //ALIVE. LIGHTS ARE ON - updatehealth() //TODO - if(health <= config.health_threshold_dead || !getorgan(/obj/item/organ/brain)) - death() - silent = 0 - return 1 - - - //UNCONSCIOUS. NO-ONE IS HOME - if( (getOxyLoss() > 50) || (config.health_threshold_crit >= health) ) - Paralyse(3) - - if(hallucination) - spawn handle_hallucinations() - - if(hallucination<=2) - hallucination = 0 - else - hallucination -= 2 - - else - for(var/atom/a in hallucinations) - qdel(a) - - if(paralysis) - AdjustParalysis(-1) - stat = UNCONSCIOUS - else if(sleeping) - handle_dreams() - adjustStaminaLoss(-10) - sleeping = max(sleeping-1, 0) - stat = UNCONSCIOUS - if( prob(10) && health && !hal_crit ) - spawn(0) - emote("snore") - //CONSCIOUS - else - stat = CONSCIOUS - - //Eyes - if(disabilities & BLIND || stat) //disabled-blind, 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(tinttotal >= TINT_BLIND) //covering your eyes heals blurry eyes faster - eye_blurry = max(eye_blurry-3, 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 if (ear_damage < 100) // deafness heals slowly over time, unless ear_damage is over 100 - if(istype(ears, /obj/item/clothing/ears/earmuffs)) // earmuffs rest your ears, healing 3x faster, but keeping you deaf. - setEarDamage(max(ear_damage-0.15, 0), max(ear_deaf - 1, 1)) - else - adjustEarDamage(-0.05, -1) - - //Dizziness - if(dizziness) - var/client/C = client - var/pixel_x_diff = 0 - var/pixel_y_diff = 0 - var/temp - var/saved_dizz = dizziness - dizziness = max(dizziness-1, 0) - 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 - - //Jitteryness - if(jitteriness) - do_jitter_animation(jitteriness) - jitteriness = max(jitteriness-1, 0) - - //Other - if(stunned) - AdjustStunned(-1) - - if(weakened) - weakened = max(weakened-1,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) - - CheckStamina() +/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 + if(!client.adminobs) reset_view(null) if(dna) dna.species.handle_vision(src) - return 1 - -/mob/living/carbon/human/handle_regular_hud_updates() - if(!client) return 0 - - client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask) - - update_action_buttons() - - 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/screen_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/screen_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/screen_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 - - if(machine) - if(!machine.check_eye(src)) reset_view(null) - else - if(!client.adminobs) reset_view(null) - +/mob/living/carbon/human/handle_hud_icons() if(dna) dna.species.handle_hud_icons(src) - return 1 - /mob/living/carbon/human/handle_random_events() // Puke if toxloss is too high if(!stat) @@ -600,7 +323,22 @@ /mob/living/carbon/human/handle_changeling() - if(mind && mind.changeling) - mind.changeling.regenerate() + if(mind) + if(mind.changeling) + mind.changeling.regenerate() + hud_used.lingchemdisplay.invisibility = 0 + hud_used.lingchemdisplay.maptext = "
[mind.changeling.chem_charges]
" + else + hud_used.lingchemdisplay.invisibility = 101 -#undef HUMAN_MAX_OXYLOSS +/mob/living/carbon/human/has_smoke_protection() + if(wear_mask) + if(wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT) + . = 1 + if(glasses) + if(glasses.flags & BLOCK_GAS_SMOKE_EFFECT) + . = 1 + if(head) + if(head.flags & BLOCK_GAS_SMOKE_EFFECT) + . = 1 + return . diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 20fb3cb23ab..15258721907 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -390,7 +390,6 @@ //////// /datum/species/proc/handle_chemicals_in_body(var/mob/living/carbon/human/H) - if(H.reagents) H.reagents.metabolize(H) //The fucking FAT mutation is the dumbest shit ever. It makes the code so difficult to work with if(H.disabilities & FAT) @@ -442,22 +441,6 @@ H << "You no longer feel vigorous." H.metabolism_efficiency = 1 - if (H.drowsyness) - H.drowsyness-- - H.eye_blurry = max(2, H.eye_blurry) - if (prob(5)) - H.sleeping += 1 - H.Paralyse(5) - - H.confused = max(0, H.confused - 1) - // decrement dizziness counter, clamped to 0 - if(H.resting) - H.dizziness = max(0, H.dizziness - 15) - H.jitteriness = max(0, H.jitteriness - 15) - else - H.dizziness = max(0, H.dizziness - 3) - H.jitteriness = max(0, H.jitteriness - 3) - H.updatehealth() return @@ -476,13 +459,6 @@ if(H.seer) H.see_invisible = SEE_INVISIBLE_OBSERVER - if(H.mind) - if(H.mind.changeling) - H.hud_used.lingchemdisplay.invisibility = 0 - H.hud_used.lingchemdisplay.maptext = "
[H.mind.changeling.chem_charges]
" - else - H.hud_used.lingchemdisplay.invisibility = 101 - if(H.glasses) if(istype(H.glasses, /obj/item/clothing/glasses)) var/obj/item/clothing/glasses/G = H.glasses @@ -617,29 +593,17 @@ /datum/species/proc/handle_mutations_and_radiation(var/mob/living/carbon/human/H) - if (H.radiation && !(RADIMMUNE in specflags)) - if (H.radiation > 100) - H.radiation = 100 - H.Weaken(10) - H << "You feel weak." - H.emote("collapse") + if(!(RADIMMUNE in specflags)) + if(H.radiation) + if (H.radiation > 100) + H.Weaken(10) + H << "You feel weak." + H.emote("collapse") - if (H.radiation < 0) - H.radiation = 0 - - else switch(H.radiation) - if(0 to 50) - H.radiation-- - if(prob(25)) - H.adjustToxLoss(1) - H.updatehealth() if(50 to 75) - H.radiation -= 2 - H.adjustToxLoss(1) if(prob(5)) - H.radiation -= 5 H.Weaken(3) H << "You feel weak." H.emote("collapse") @@ -650,17 +614,14 @@ H.facial_hair_style = "Shaved" H.hair_style = "Bald" H.update_hair() - H.updatehealth() if(75 to 100) - H.radiation -= 3 - H.adjustToxLoss(3) if(prob(1)) H << "You mutate!" randmutb(H) domutcheck(H,null) H.emote("gasp") - H.updatehealth() + return 1 //////////////// // MOVE SPEED // @@ -1041,20 +1002,9 @@ breath_moles = environment.total_moles()*BREATH_PERCENTAGE breath = H.loc.remove_air(breath_moles) + // Handle chem smoke effect -- Doohl - var/block = 0 - if(H.wear_mask) - if(H.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT) - block = 1 - if(H.glasses) - if(H.glasses.flags & BLOCK_GAS_SMOKE_EFFECT) - block = 1 - if(H.head) - if(H.head.flags & BLOCK_GAS_SMOKE_EFFECT) - block = 1 - - if(!block) - + if(!H.has_smoke_protection()) for(var/obj/effect/effect/chem_smoke/smoke in view(1, H)) if(smoke.reagents.total_volume) smoke.reagents.reaction(H, INGEST) @@ -1068,12 +1018,12 @@ var/obj/location_as_object = H.loc location_as_object.handle_internal_lifeform(H, 0) - handle_breath(breath, H) + check_breath(breath, H) if(breath) H.loc.assume_air(breath) -/datum/species/proc/handle_breath(datum/gas_mixture/breath, var/mob/living/carbon/human/H) +/datum/species/proc/check_breath(datum/gas_mixture/breath, var/mob/living/carbon/human/H) if((H.status_flags & GODMODE)) return @@ -1172,11 +1122,11 @@ if(prob(20)) spawn(0) H.emote(pick("giggle", "laugh")) - handle_temperature(breath, H) + handle_breath_temperature(breath, H) return 1 -/datum/species/proc/handle_temperature(datum/gas_mixture/breath, var/mob/living/carbon/human/H) // called by human/life, handles temperatures +/datum/species/proc/handle_breath_temperature(datum/gas_mixture/breath, var/mob/living/carbon/human/H) // called by human/life, handles temperatures if( (abs(310.15 - breath.temperature) > 50) && !(mutations_list[COLDRES] in H.dna.mutations) && !(COLDRES in specflags)) // Hot air hurts :( if(breath.temperature < 260.15) if(prob(20)) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 006aa7f31f9..af12d66b2f7 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -1,3 +1,252 @@ + +/mob/living/carbon + var/oxygen_alert = 0 + var/toxins_alert = 0 + var/fire_alert = 0 + var/pressure_alert = 0 + var/temperature_alert = 0 + +/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() + + if(stat != DEAD) + + //Breathing, if applicable + handle_breathing() + + //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() + + //Blud + handle_blood() + + //Random events (vomiting etc) + handle_random_events() + + . = 1 + + //Handle temperature/pressure differences between body and environment + handle_environment(environment) + + handle_fire() + + //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_regular_status_updates() // Status updates, death etc. + + if(client) + handle_regular_hud_updates() + + return . + + + +/////////////// +// BREATHING // +/////////////// + +//Start of a breath chain, calls breathe() +/mob/living/carbon/proc/handle_breathing() + if(SSmob.times_fired%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 + + var/datum/gas_mixture/environment + if(loc) + environment = loc.return_air() + + var/datum/gas_mixture/breath + + if(health <= config.health_threshold_crit) + losebreath++ + + //Suffocate + 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_VOLUME) + + 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) + + //Harmful gasses + if(!has_smoke_protection()) + for(var/obj/effect/effect/chem_smoke/smoke in view(1,src)) + if(smoke.reagents.total_volume) + smoke.reagents.reaction(src,INGEST) + spawn(5) + if(smoke) + smoke.reagents.copy_to(src, 10) + break + + 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) + +/mob/living/carbon/proc/has_smoke_protection() + return 0 + + +//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 + + //CRIT + if(!breath || (breath.total_moles() == 0)) + if(reagents.has_reagent("epinephrine")) + return + 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 = 5 + 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") + + else + 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) + if(breath.temperature > (T0C+66)) // Hot air hurts :( + if(prob(20)) + src << "You feel a searing heat in your lungs!" + fire_alert = max(fire_alert, 2) + else + fire_alert = 0 + if(breath.temperature < (T0C-20)) + if(prob(20)) + src << "You feel your face freezing and an icicle forming in your lungs!" + return + + /mob/living/carbon/proc/get_breath_from_internal(volume_needed) if(internal) if (!contents.Find(internal)) @@ -13,85 +262,56 @@ 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) - - 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() - - //Blud - handle_blood() - - //Random events (vomiting etc) - handle_random_events() - - . = 1 - - handle_fire() - - //stuff in the stomach - handle_stomach() - - update_canmove() - - update_gravity(mob_has_gravity()) - - for(var/obj/item/weapon/grab/G in src) - G.process() - - 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 + if(radiation) + + switch(radiation) + if(0 to 50) + radiation-- + if(prob(25)) + adjustToxLoss(1) + updatehealth() + + if(50 to 75) + radiation -= 2 + adjustToxLoss(1) + if(prob(5)) + radiation -= 5 + updatehealth() + + if(75 to 100) + radiation -= 3 + adjustToxLoss(3) + updatehealth() + + radiation = Clamp(radiation, 0, 100) + /mob/living/carbon/proc/handle_chemicals_in_body() - return + if(reagents) + reagents.metabolize(src) -/mob/living/carbon/proc/handle_disabilities() + 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 /mob/living/carbon/proc/handle_blood() @@ -103,9 +323,6 @@ /mob/living/carbon/proc/handle_environment(var/datum/gas_mixture/environment) return -/mob/living/carbon/proc/handle_regular_status_updates() - return - /mob/living/carbon/proc/handle_stomach() spawn(0) for(var/mob/living/M in stomach_contents) @@ -123,7 +340,293 @@ M.adjustBruteLoss(5) nutrition += 10 +/mob/living/carbon/proc/handle_regular_status_updates() + + if(stat == DEAD) + eye_blind = max(eye_blind, 1) + silent = 0 + else + updatehealth() + if(health <= config.health_threshold_dead || !getorgan(/obj/item/organ/brain)) + death() + eye_blind = max(eye_blind, 1) + silent = 0 + return 1 + + if( (getOxyLoss() > 50) || (config.health_threshold_crit >= health) ) + Paralyse(3) + + if(paralysis) + AdjustParalysis(-1) + stat = UNCONSCIOUS + else if(sleeping) + handle_dreams() + adjustStaminaLoss(-10) + sleeping = max(sleeping-1, 0) + stat = UNCONSCIOUS + if( prob(10) && health && !hal_crit ) + spawn(0) + emote("snore") + + else if (status_flags & FAKEDEATH) + stat = UNCONSCIOUS + + else + stat = CONSCIOUS + + handle_disabilities() + + //Dizziness + if(dizziness) + var/client/C = client + var/pixel_x_diff = 0 + var/pixel_y_diff = 0 + var/temp + var/saved_dizz = dizziness + dizziness = max(dizziness-1, 0) + 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 + + //Jitteryness + if(jitteriness) + do_jitter_animation(jitteriness) + jitteriness = max(jitteriness-1, 0) + + //Other + + 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(stunned) + AdjustStunned(-1) + if(!stunned) + update_icons() + + if(weakened) + weakened = max(weakened-1,0) + if(!weakened) + update_icons() + + if(hallucination) + spawn handle_hallucinations() + + if(hallucination<=2) + hallucination = 0 + else + hallucination -= 2 + + else + for(var/atom/a in hallucinations) + qdel(a) + + CheckStamina() + return 1 + +/mob/living/carbon/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. Calles update_vision() and handle_hud_icons() /mob/living/carbon/proc/handle_regular_hud_updates() + if(!client) return 0 + + update_action_buttons() + + 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/screen_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/screen_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/screen_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 + + + handle_vision() + handle_hud_icons() + + return 1 + +/mob/living/carbon/proc/handle_vision() + + client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask) + + 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 + sight &= ~SEE_MOBS + sight &= ~SEE_OBJS + see_in_dark = 2 + see_invisible = SEE_INVISIBLE_LIVING + if(see_override) + see_invisible = see_override + + if(blind) + if(eye_blind) + blind.layer = 18 + else + blind.layer = 0 + + if (disabilities & NEARSIGHT) + client.screen += global_hud.vimpaired + + if (eye_blurry) + client.screen += global_hud.blurry + + if (druggy) + client.screen += global_hud.druggy + + if(eye_stat > 20) + if(eye_stat > 30) + client.screen += global_hud.darkMask + else + client.screen += global_hud.vimpaired + + if(machine) + if (!( machine.check_eye(src) )) + reset_view(null) + else + if(!client.adminobs) + reset_view(null) + +/mob/living/carbon/proc/handle_hud_icons() return - +/mob/living/carbon/proc/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/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index d2015e7dc8c..ef48338388d 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -1,24 +1,16 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 /mob/living/carbon/monkey - var/oxygen_alert = 0 - var/toxins_alert = 0 - var/fire_alert = 0 - var/pressure_alert = 0 - - var/temperature_alert = 0 /mob/living/carbon/monkey/Life() - if(..()) - //First, resolve location and get a breath - if(SSmob.times_fired%4==2) - //Only try to take a breath every 4 seconds, unless suffocating - 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) + set invisibility = 0 + set background = BACKGROUND_ENABLED + + if (notransform) + return + + ..() if(!client && stat == CONSCIOUS) if(prob(33) && canmove && isturf(loc) && !pulledby && !grabbed_by.len) @@ -30,203 +22,31 @@ ..() return pressure -/mob/living/carbon/monkey/handle_disabilities() - /mob/living/carbon/monkey/handle_mutations_and_radiation() if (radiation) if (radiation > 100) - radiation = 100 Weaken(10) src << "You feel weak." emote("collapse") - if (radiation < 0) - radiation = 0 - switch(radiation) - if(0 to 50) - radiation-- - if(prob(25)) - adjustToxLoss(1) - updatehealth() if(50 to 75) - radiation -= 2 - adjustToxLoss(1) if(prob(5)) - radiation -= 5 Weaken(3) src << "You feel weak." emote("collapse") - updatehealth() if(75 to 100) - radiation -= 3 - adjustToxLoss(3) if(prob(1)) src << "You mutate!" randmutb(src) domutcheck(src,null) emote("gasp") - updatehealth() + ..() -/mob/living/carbon/monkey/proc/breathe() - if(reagents) - - if(reagents.has_reagent("lexorin")) return - - if(!loc) return //probably ought to make a proper fix for this, but :effort: --NeoFite - - var/datum/gas_mixture/environment = loc.return_air() - var/datum/gas_mixture/breath - 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) - - // Handle chem smoke effect -- Doohl - var/block = 0 - if(wear_mask) - if(istype(wear_mask, /obj/item/clothing/mask/gas)) - block = 1 - - if(!block) - - for(var/obj/effect/effect/chem_smoke/smoke in view(1, src)) - if(smoke.reagents.total_volume) - smoke.reagents.reaction(src, INGEST) - spawn(5) - if(smoke) - smoke.reagents.copy_to(src, 10) // I dunno, maybe the reagents enter the blood stream through the lungs? - break // If they breathe in the nasty stuff once, no need to continue checking - - - 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/monkey/proc/handle_breath(datum/gas_mixture/breath) - if(status_flags & GODMODE) - return - - if(!breath || (breath.total_moles() == 0)) - adjustOxyLoss(7) - - oxygen_alert = max(oxygen_alert, 1) - - return 0 - - var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa - //var/safe_oxygen_max = 140 // Maximum safe partial pressure of O2, in kPa (Not used for now) - var/safe_co2_max = 10 // Yes it's an arbitrary value who cares? - var/safe_toxins_max = 0.5 - var/SA_para_min = 0.5 - var/SA_sleep_min = 5 - var/oxygen_used = 0 - var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME - - //Partial pressure of the O2 in our breath - var/O2_pp = (breath.oxygen/breath.total_moles())*breath_pressure - // Same, but for the toxins - var/Toxins_pp = (breath.toxins/breath.total_moles())*breath_pressure - // And CO2, lets say a PP of more than 10 will be bad (It's a little less really, but eh, being passed out all round aint no fun) - var/CO2_pp = (breath.carbon_dioxide/breath.total_moles())*breath_pressure - - if(O2_pp < safe_oxygen_min) // Too little oxygen - if(prob(20)) - spawn(0) emote("gasp") - if (O2_pp == 0) - O2_pp = 0.01 - var/ratio = safe_oxygen_min/O2_pp - adjustOxyLoss(min(5*ratio, 7)) // Don't fuck them up too fast (space only does 7 after all!) - oxygen_used = breath.oxygen*ratio/6 - oxygen_alert = max(oxygen_alert, 1) - /*else if (O2_pp > safe_oxygen_max) // Too much oxygen (commented this out for now, I'll deal with pressure damage elsewhere I suppose) - spawn(0) emote("cough") - var/ratio = O2_pp/safe_oxygen_max - oxyloss += 5*ratio - oxygen_used = breath.oxygen*ratio/6 - oxygen_alert = max(oxygen_alert, 1)*/ - else // We're in safe limits - adjustOxyLoss(-5) - oxygen_used = breath.oxygen/6 - oxygen_alert = 0 - - breath.oxygen -= oxygen_used - breath.carbon_dioxide += oxygen_used - - if(CO2_pp > safe_co2_max) - if(!co2overloadtime) // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so. - co2overloadtime = world.time - else if(world.time - co2overloadtime > 120) - Paralyse(3) - adjustOxyLoss(3) // Lets hurt em a little, let them know we mean business - if(world.time - co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good! - adjustOxyLoss(8) - if(prob(20)) // Lets give them some chance to know somethings not right though I guess. - spawn(0) emote("cough") - - else - co2overloadtime = 0 - - if(Toxins_pp > safe_toxins_max) // Too much toxins - var/ratio = (breath.toxins/safe_toxins_max) * 10 - //adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) //Limit amount of damage toxin exposure can do per second - if(reagents) - reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) - toxins_alert = max(toxins_alert, 1) - else - toxins_alert = 0 - - if(breath.trace_gases.len) // If there's some other shit in the air lets deal with it here. - for(var/datum/gas/sleeping_agent/SA in breath.trace_gases) - var/SA_pp = (SA.moles/breath.total_moles())*breath_pressure - if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit - Paralyse(3) // 3 gives them one second to wake up and run away a bit! - if(SA_pp > SA_sleep_min) // Enough to make us sleep as well - sleeping = max(sleeping+2, 10) - else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning - if(prob(20)) - spawn(0) emote(pick("giggle", "laugh")) - - - if(breath.temperature > (T0C+66)) // Hot air hurts :( - if(prob(20)) - src << "You feel a searing heat in your lungs!" - fire_alert = max(fire_alert, 2) - else - fire_alert = 0 - - - //Temporary fixes to the alerts. - - return 1 - /mob/living/carbon/monkey/handle_environment(datum/gas_mixture/environment) if(!environment) return @@ -267,143 +87,15 @@ /mob/living/carbon/monkey/proc/handle_temperature_damage(body_part, exposed_temperature, exposed_intensity) if(status_flags & GODMODE) return var/discomfort = min( abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0) - //adjustFireLoss(2.5*discomfort) if(exposed_temperature > bodytemperature) adjustFireLoss(20.0*discomfort) - else adjustFireLoss(5.0*discomfort) -/mob/living/carbon/monkey/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) - else - dizziness = max(0, dizziness - 1) - - updatehealth() - - return //TODO: DEFERRED - -/mob/living/carbon/monkey/handle_regular_status_updates() - updatehealth() - - if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP - silent = 0 - else //ALIVE. LIGHTS ARE ON - if(health < config.health_threshold_dead || !getorgan(/obj/item/organ/brain)) - death() - stat = DEAD - silent = 0 - return 1 - - //UNCONSCIOUS. NO-ONE IS HOME - if( (getOxyLoss() > 25) || (config.health_threshold_crit >= health) ) - if( health <= 20 && prob(1) ) - spawn(0) - emote("gasp") - if(!reagents.has_reagent("epinephrine")) - adjustOxyLoss(1) - Paralyse(3) - - if(paralysis) - AdjustParalysis(-1) - stat = UNCONSCIOUS - else if(sleeping) - sleeping = max(sleeping-1, 0) - stat = UNCONSCIOUS - if( prob(10) && health ) - spawn(0) - emote("snore") - //CONSCIOUS - else - stat = CONSCIOUS - - //Eyes - if(disabilities & BLIND || stat) //disabled-blind, doesn't get better on its own - eye_blind = max(eye_blind, 2) - 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) - - //Other - if(stunned) - AdjustStunned(-1) - - if(weakened) - weakened = max(weakened-1,0) - - if(stuttering) - stuttering = max(stuttering-1, 0) - - if(silent) - silent = max(silent-1, 0) - - if(druggy) - druggy = max(druggy-1, 0) - - CheckStamina() - return 1 - - -/mob/living/carbon/monkey/handle_regular_hud_updates() - - if (stat == 2) - 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(see_override) - see_invisible = see_override - - 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" +/mob/living/carbon/monkey/handle_hud_icons() + handle_hud_icons_health() if(pressure) pressure.icon_state = "pressure[pressure_alert]" @@ -417,8 +109,6 @@ if (toxin) toxin.icon_state = "tox[toxins_alert ? 1 : 0]" if (oxygen) oxygen.icon_state = "oxy[oxygen_alert ? 1 : 0]" if (fire) fire.icon_state = "fire[fire_alert ? 2 : 0]" - //NOTE: the alerts dont reset when youre out of danger. dont blame me, - //blame the person who coded them. Temporary fix added. if(bodytemp) switch(bodytemperature) //310.055 optimal body temp @@ -441,31 +131,6 @@ else bodytemp.icon_state = "temp-4" - client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) - - if(blind && stat != DEAD) - if(eye_blind) - blind.layer = 18 - else - blind.layer = 0 - - if(disabilities & NEARSIGHT) - 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.adminobs) - reset_view(null) - return 1 /mob/living/carbon/monkey/handle_random_events() @@ -476,11 +141,18 @@ /mob/living/carbon/monkey/handle_changeling() - if(mind && mind.changeling) - mind.changeling.regenerate() - hud_used.lingchemdisplay.invisibility = 0 - hud_used.lingchemdisplay.maptext = "
[src.mind.changeling.chem_charges]
" + if(mind) + if(mind.changeling) + mind.changeling.regenerate() + hud_used.lingchemdisplay.invisibility = 0 + hud_used.lingchemdisplay.maptext = "
[mind.changeling.chem_charges]
" + else + hud_used.lingchemdisplay.invisibility = 101 +/mob/living/carbon/monkey/has_smoke_protection() + if(wear_mask) + if(wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT) + return 1 ///FIRE CODE /mob/living/carbon/monkey/handle_fire() diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 7bdbfb459da..6519cd2b39a 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -190,9 +190,6 @@ internal = null return -/mob/living/carbon/monkey/var/co2overloadtime = null -/mob/living/carbon/monkey/var/temperature_resistance = T0C+75 - /mob/living/carbon/monkey/ex_act(severity, target) ..() switch(severity) @@ -202,28 +199,16 @@ if(2.0) adjustBruteLoss(60) adjustFireLoss(60) + adjustEarDamage(30,120) if(3.0) adjustBruteLoss(30) if (prob(50)) Paralyse(10) + adjustEarDamage(15,60) + + updatehealth() return -/mob/living/carbon/monkey/blob_act() - if (stat != 2) - show_message("The blob attacks you!") - adjustFireLoss(60) - health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - if (prob(50)) - Paralyse(10) - if (stat == DEAD && client) - gib() - return - if (stat == DEAD && !client) - gibs(loc, viruses) - qdel(src) - return - - /mob/living/carbon/monkey/IsAdvancedToolUser()//Unless its monkey mode monkeys cant use advanced tools return 0 diff --git a/code/modules/mob/living/carbon/slime/death.dm b/code/modules/mob/living/carbon/slime/death.dm index c54e5d869c3..77018a2cde4 100644 --- a/code/modules/mob/living/carbon/slime/death.dm +++ b/code/modules/mob/living/carbon/slime/death.dm @@ -24,4 +24,7 @@ if(ticker && ticker.mode) ticker.mode.check_win() - return ..(gibbed) \ No newline at end of file + return ..(gibbed) + +/mob/living/carbon/slime/gib() + qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/slime/life.dm b/code/modules/mob/living/carbon/slime/life.dm index dd04410c66b..f15fd5196a7 100644 --- a/code/modules/mob/living/carbon/slime/life.dm +++ b/code/modules/mob/living/carbon/slime/life.dm @@ -6,12 +6,19 @@ var/SStun = 0 // stun variable /mob/living/carbon/slime/Life() + set invisibility = 0 + set background = BACKGROUND_ENABLED + + if (notransform) + return if(..()) handle_nutrition() handle_targets() if (!ckey) handle_speech_and_mood() +/mob/living/carbon/slime/handle_breathing() + return /mob/living/carbon/slime/proc/AIprocess() // the master AI process @@ -25,14 +32,14 @@ AIproc = 1 - while(AIproc && stat != 2 && (attacked || hungry || rabid || Victim)) + while(AIproc && stat != DEAD && (attacked || hungry || rabid || Victim)) if(Victim) // can't eat AND have this little process at the same time break if(!Target || client) break - if(Target.health <= -70 || Target.stat == 2) + if(Target.health <= -70 || Target.stat == DEAD) Target = null AIproc = 0 break @@ -155,6 +162,13 @@ return //TODO: DEFERRED + +/mob/living/carbon/slime/handle_mutations_and_radiation() + return + +/mob/living/carbon/slime/handle_regular_hud_updates() + return + /mob/living/carbon/slime/handle_regular_status_updates() if(is_adult) @@ -162,17 +176,21 @@ else health = 150 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) - if(health < config.health_threshold_dead && stat != 2) + if(health < config.health_threshold_dead && stat != DEAD) death() return - else if(src.health < config.health_threshold_crit) + else if(health < config.health_threshold_crit) - if(!src.reagents.has_reagent("epinephrine")) - src.adjustOxyLoss(10) + if(!reagents.has_reagent("epinephrine")) + adjustOxyLoss(3) - if(src.stat != DEAD) - src.stat = UNCONSCIOUS + if(stat != DEAD) + Paralyse(3) + stat = UNCONSCIOUS + else + if(stat != DEAD) + stat = CONSCIOUS if(prob(30)) adjustOxyLoss(-1) @@ -181,46 +199,36 @@ adjustCloneLoss(-1) adjustBruteLoss(-1) - if (src.stat == DEAD) - src.lying = 1 - src.eye_blind = max(eye_blind, 1) + if (stat == DEAD) + lying = 1 + eye_blind = max(eye_blind, 1) else - if (src.paralysis || src.stunned || src.weakened || (status_flags && FAKEDEATH)) //Stunned etc. - if (src.stunned > 0) - AdjustStunned(-1) - src.stat = 0 - if (src.weakened > 0) - AdjustWeakened(-1) - src.lying = 0 - src.stat = 0 - if (src.paralysis > 0) - AdjustParalysis(-1) - src.eye_blind = 0 - src.lying = 0 - src.stat = 0 + if(stunned > 0) + AdjustStunned(-1) + if(weakened > 0) + AdjustWeakened(-1) + if (paralysis > 0) + AdjustParalysis(-1) - else - src.lying = 0 - src.stat = 0 + if(stuttering) + stuttering = 0 - if (src.stuttering) src.stuttering = 0 - - if (src.eye_blind) - src.eye_blind = 0 - src.eye_blind = max(eye_blind, 1) + if(eye_blind) + eye_blind = 0 + eye_blind = max(eye_blind, 1) setEarDamage((ear_damage < 25 ? 0 : ear_damage),(disabilities & DEAF ? 1 :0)) - src.density = !( src.lying ) + density = !( src.lying ) - if (src.disabilities & BLIND) - src.eye_blind = max(eye_blind, 1) + if(disabilities & BLIND) + eye_blind = max(eye_blind, 1) - if (src.eye_blurry > 0) - src.eye_blurry = 0 + if(eye_blurry > 0) + eye_blurry = 0 - if (src.druggy > 0) - src.druggy = 0 + if(druggy > 0) + druggy = 0 return 1 diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm index 208960cc5f1..f2c5d5eb15f 100644 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -161,49 +161,20 @@ /mob/living/carbon/slime/ex_act(severity, target) ..() - var/b_loss = null - var/f_loss = null switch (severity) if (1.0) - qdel(src) + gib() return if (2.0) - - b_loss += 60 - f_loss += 60 - + adjustBruteLoss(60) + adjustFireLoss(60) if(3.0) - b_loss += 30 - - adjustBruteLoss(b_loss) - adjustFireLoss(f_loss) + adjustBruteLoss(30) updatehealth() - -/mob/living/carbon/slime/blob_act() - if (stat == 2) - return - var/shielded = 0 - - var/damage = null - if (stat != 2) - damage = rand(10,30) - - if(shielded) - damage /= 4 - - //paralysis += 1 - - show_message(" The blob attacks you!") - - adjustFireLoss(damage) - - updatehealth() - return - /mob/living/carbon/slime/MouseDrop(var/atom/movable/A as mob|obj) if(isliving(A) && A != src && usr == src) var/mob/living/Food = A @@ -496,9 +467,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) return diff --git a/icons/mob/screen_alien.dmi b/icons/mob/screen_alien.dmi index e0257307ac14ab389f36e96d079a2fc3f921c148..2044d9897595630c1ca8972be6b48ddf95e90460 100644 GIT binary patch literal 24796 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 Date: Thu, 26 Feb 2015 16:03:47 +0100 Subject: [PATCH 2/2] Reworked slime/death() and slime/gib(). --- code/modules/mob/living/carbon/slime/death.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/slime/death.dm b/code/modules/mob/living/carbon/slime/death.dm index 77018a2cde4..ecf01af344b 100644 --- a/code/modules/mob/living/carbon/slime/death.dm +++ b/code/modules/mob/living/carbon/slime/death.dm @@ -1,4 +1,6 @@ /mob/living/carbon/slime/death(gibbed) + if(stat == DEAD) + return if(!gibbed) if(is_adult) var/mob/living/carbon/slime/M = new /mob/living/carbon/slime(loc) @@ -11,12 +13,12 @@ number = rand(1, 1000) name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" return + else + visible_message("The [name] seizes up and falls limp...") - if(stat == DEAD) return stat = DEAD icon_state = "[colour] baby slime dead" overlays.len = 0 - visible_message("The [name] seizes up and falls limp...") //ded -- Urist update_canmove() if(blind) blind.layer = 0 @@ -27,4 +29,5 @@ return ..(gibbed) /mob/living/carbon/slime/gib() + death(1) qdel(src) \ No newline at end of file