From 47b463f4cbeaa8d9aff4dde1b47fbf5f7972bf30 Mon Sep 17 00:00:00 2001 From: Neerti Date: Wed, 13 Sep 2017 06:26:08 -0400 Subject: [PATCH] Makes Fire Burn Again Being lit on fire barely did anything, for multiple reasons, all which should be fixed in this PR. First, the code to do damage based on bodytemperature was literally bugged and only applied the lowest level of damage, no matter what. Second, wounds made autohealed them fairly fast, sometimes even outhealing the incoming damage. Third, being on fire raised your temperature rather slowly. Fourth, the lowest level of 'overheating' damage was rather low. Changes: The bodytemperature part of Life() is now unbroken and I accidentally fixed freezing not hurting, so yay. Added a ten minute delay to wounds being able to autoheal them away. Applying bandage/salves will skip this. Temperature climb is now based on fire stacks while on fire, so more stacks means more and longer pain. Lowest level of overheating was tweaked. Running into people while on fire will split your fire stacks with them and light them on fire. Port's /tg/'s on fire sprite. Different mobs can have different icons for being on fire. Bonus: Rejuv now removes pain. --- code/modules/mob/living/carbon/human/human.dm | 6 +++ code/modules/mob/living/carbon/human/life.dm | 51 ++++++++++-------- .../living/carbon/human/species/species.dm | 1 + .../carbon/human/species/station/monkey.dm | 1 + .../carbon/human/species/station/seromi.dm | 2 + .../mob/living/carbon/human/update_icons.dm | 2 +- code/modules/mob/living/living.dm | 7 +++ code/modules/mob/living/living_defense.dm | 18 +++++++ code/modules/mob/living/silicon/robot/life.dm | 4 +- code/modules/organs/wound.dm | 8 +-- icons/mob/OnFire.dmi | Bin 1845 -> 6078 bytes icons/mob/screen1_health.dmi | Bin 887 -> 5090 bytes 12 files changed, 72 insertions(+), 28 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index f586ecd56c..1bbb8845e7 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -252,6 +252,7 @@ // called when something steps onto a human // this handles mulebots and vehicles +// and now mobs on fire /mob/living/carbon/human/Crossed(var/atom/movable/AM) if(istype(AM, /mob/living/bot/mulebot)) var/mob/living/bot/mulebot/MB = AM @@ -261,6 +262,8 @@ var/obj/vehicle/V = AM V.RunOver(src) + spread_fire(AM) + // Get rank from ID, ID inside PDA, PDA, ID in wallet, etc. /mob/living/carbon/human/proc/get_authentification_rank(var/if_no_id = "No id", var/if_no_job = "No job") var/obj/item/device/pda/pda = wear_id @@ -1505,6 +1508,9 @@ /mob/living/carbon/human/is_muzzled() return (wear_mask && (istype(wear_mask, /obj/item/clothing/mask/muzzle) || istype(src.wear_mask, /obj/item/weapon/grenade))) +/mob/living/carbon/human/get_fire_icon_state() + return species.fire_icon_state + // Called by job_controller. Makes drones start with a permit, might be useful for other people later too. /mob/living/carbon/human/equip_post_job() var/braintype = get_FBP_type() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 23dfdb2db3..ad05894be0 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -4,7 +4,7 @@ #define HUMAN_MAX_OXYLOSS 1 //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 HUMAN_CRIT_MAX_OXYLOSS ( 2.0 / 6) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 50HP to get through, so (1/6)*last_tick_duration per second. Breaths however only happen every 4 ticks. last_tick_duration = ~2.0 on average -#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_1 5 //Amount of damage applied when your body temperature just passes the 360.15k safety point #define HEAT_DAMAGE_LEVEL_2 10 //Amount of damage applied when your body temperature passes the 400K point #define HEAT_DAMAGE_LEVEL_3 20 //Amount of damage applied when your body temperature passes the 1000K point @@ -623,31 +623,35 @@ if(bodytemperature >= species.heat_level_1) //Body temperature is too hot. fire_alert = max(fire_alert, 1) - if(status_flags & GODMODE) return 1 //godmode + if(status_flags & GODMODE) + return 1 //godmode var/burn_dam = 0 - switch(bodytemperature) - if(species.heat_level_1 to species.heat_level_2) - burn_dam = HEAT_DAMAGE_LEVEL_1 - if(species.heat_level_2 to species.heat_level_3) - burn_dam = HEAT_DAMAGE_LEVEL_2 - if(species.heat_level_3 to INFINITY) - burn_dam = HEAT_DAMAGE_LEVEL_3 + + // switch() can't access numbers inside variables, so we need to use some ugly if() spam ladder. + if(bodytemperature >= species.heat_level_3) + burn_dam = HEAT_DAMAGE_LEVEL_3 + else if(bodytemperature >= species.heat_level_2) + burn_dam = HEAT_DAMAGE_LEVEL_2 + else if(bodytemperature >= species.heat_level_1) + burn_dam = HEAT_DAMAGE_LEVEL_1 + take_overall_damage(burn=burn_dam, used_weapon = "High Body Temperature") fire_alert = max(fire_alert, 2) else if(bodytemperature <= species.cold_level_1) fire_alert = max(fire_alert, 1) - if(status_flags & GODMODE) return 1 //godmode + if(status_flags & GODMODE) + return 1 //godmode if(!istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) var/burn_dam = 0 - switch(bodytemperature) - if(species.cold_level_1 to species.cold_level_2) - burn_dam = COLD_DAMAGE_LEVEL_1 - if(species.cold_level_2 to species.cold_level_3) - burn_dam = COLD_DAMAGE_LEVEL_2 - if(species.cold_level_3 to -INFINITY) - burn_dam = COLD_DAMAGE_LEVEL_3 + if(bodytemperature <= species.cold_level_3) + burn_dam = COLD_DAMAGE_LEVEL_3 + else if(bodytemperature <= species.cold_level_2) + burn_dam = COLD_DAMAGE_LEVEL_2 + else if(bodytemperature <= species.heat_level_1) + burn_dam = COLD_DAMAGE_LEVEL_1 + take_overall_damage(burn=burn_dam, used_weapon = "Low Body Temperature") fire_alert = max(fire_alert, 1) @@ -1181,7 +1185,7 @@ // Apply a fire overlay if we're burning. if(on_fire) - health_images += image('icons/mob/screen1_health.dmi',"burning") + health_images += image('icons/mob/OnFire.dmi',"[get_fire_icon_state()]") // Show a general pain/crit indicator if needed. if(trauma_val) @@ -1673,14 +1677,17 @@ if(..()) return - var/burn_temperature = fire_burn_temperature() - var/thermal_protection = get_heat_protection(burn_temperature) + var/thermal_protection = get_heat_protection(fire_stacks * 1500) // Arbitrary but below firesuit max temp when below 20 stacks. - if (thermal_protection < 1 && bodytemperature < burn_temperature) - bodytemperature += round(BODYTEMP_HEATING_MAX*(1-thermal_protection), 1) + if(thermal_protection == 1) // Immune. + return + else + bodytemperature += (BODYTEMP_HEATING_MAX + (fire_stacks * 15)) * (1-thermal_protection) /mob/living/carbon/human/rejuvenate() restore_blood() + shock_stage = 0 + traumatic_shock = 0 ..() #undef HUMAN_MAX_OXYLOSS diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 9dc3291215..ea4b993645 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -14,6 +14,7 @@ var/deform = 'icons/mob/human_races/r_def_human.dmi' // Mutated icon set. var/speech_bubble_appearance = "normal" // Part of icon_state to use for speech bubbles when talking. See talk.dmi for available icons. + var/fire_icon_state = "humanoid" // The icon_state used inside OnFire.dmi for when on fire. // Damage overlay and masks. var/damage_overlays = 'icons/mob/human_races/masks/dam_human.dmi' diff --git a/code/modules/mob/living/carbon/human/species/station/monkey.dm b/code/modules/mob/living/carbon/human/species/station/monkey.dm index 738284dd38..e70bc76f17 100644 --- a/code/modules/mob/living/carbon/human/species/station/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/station/monkey.dm @@ -20,6 +20,7 @@ dusted_anim = "dust-m" death_message = "lets out a faint chimper as it collapses and stops moving..." tail = "chimptail" + fire_icon_state = "monkey" unarmed_types = list(/datum/unarmed_attack/bite, /datum/unarmed_attack/claws) inherent_verbs = list(/mob/living/proc/ventcrawl) diff --git a/code/modules/mob/living/carbon/human/species/station/seromi.dm b/code/modules/mob/living/carbon/human/species/station/seromi.dm index d3dd435997..372b52d607 100644 --- a/code/modules/mob/living/carbon/human/species/station/seromi.dm +++ b/code/modules/mob/living/carbon/human/species/station/seromi.dm @@ -32,6 +32,8 @@ damage_mask = 'icons/mob/human_races/masks/dam_mask_seromi.dmi' blood_mask = 'icons/mob/human_races/masks/blood_seromi.dmi' + fire_icon_state = "generic" // Humanoid is too big for them and spriting a new one is really annoying. + slowdown = -1 total_health = 50 brute_mod = 1.35 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 9c372cf2e7..0909ed2575 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -1138,7 +1138,7 @@ var/global/list/damage_icon_parts = list() /mob/living/carbon/human/update_fire(var/update_icons=1) overlays_standing[FIRE_LAYER] = null if(on_fire) - overlays_standing[FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing", "layer"=FIRE_LAYER) + overlays_standing[FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state" = get_fire_icon_state(), "layer"=FIRE_LAYER) if(update_icons) update_icons() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index b33688e59b..ebe642809b 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -52,6 +52,9 @@ default behaviour is: if (istype(AM, /mob/living)) var/mob/living/tmob = AM + //Even if we don't push/swap places, we "touched" them, so spread fire + spread_fire(tmob) + for(var/mob/living/M in range(tmob, 1)) if(tmob.pinned.len || ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) ) if ( !(world.time % 5) ) @@ -969,6 +972,10 @@ default behaviour is: return FALSE return TRUE +// Gets the correct icon_state for being on fire. See OnFire.dmi for the icons. +/mob/living/proc/get_fire_icon_state() + return "generic" + // Called by job_controller. /mob/living/proc/equip_post_job() return diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 069630a49a..299c784ec3 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -351,6 +351,24 @@ adjust_fire_stacks(2) IgniteMob() +//Share fire evenly between the two mobs +//Called in MobCollide() and Crossed() +/mob/living/proc/spread_fire(mob/living/L) + if(!istype(L)) + return + var/L_old_on_fire = L.on_fire + + if(on_fire) //Only spread fire stacks if we're on fire + fire_stacks /= 2 + L.fire_stacks += fire_stacks + if(L.IgniteMob()) + message_admins("[key_name(src)] bumped into [key_name(L)] and set them on fire.") + + if(L_old_on_fire) //Only ignite us and gain their stacks if they were onfire before we bumped them + L.fire_stacks /= 2 + fire_stacks += L.fire_stacks + IgniteMob() + /mob/living/proc/get_cold_protection() return 0 diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index db8d7b2ead..6b914852c7 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -340,9 +340,9 @@ return canmove /mob/living/silicon/robot/update_fire() - overlays -= image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing") + overlays -= image("icon"='icons/mob/OnFire.dmi', "icon_state" = get_fire_icon_state()) if(on_fire) - overlays += image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing") + overlays += image("icon"='icons/mob/OnFire.dmi', "icon_state" = get_fire_icon_state()) /mob/living/silicon/robot/fire_act() if(!on_fire) //Silicons don't gain stacks from hotspots, but hotspots can ignite them diff --git a/code/modules/organs/wound.dm b/code/modules/organs/wound.dm index 85925d9158..dd7f5dcf89 100644 --- a/code/modules/organs/wound.dm +++ b/code/modules/organs/wound.dm @@ -85,10 +85,12 @@ return src.damage / src.amount proc/can_autoheal() + if(is_treated()) + return TRUE if(src.wound_damage() <= autoheal_cutoff) - return 1 - - return is_treated() + if(created + 10 MINUTES > world.time) // Wounds don't autoheal for ten minutes if not bandaged. + return FALSE + return TRUE // checks whether the wound has been appropriately treated proc/is_treated() diff --git a/icons/mob/OnFire.dmi b/icons/mob/OnFire.dmi index 8bf6e2c7749edd55c903e98d06314dad2297ee16..b201e636e9dac36d156cffb43741ac94b7ba549c 100644 GIT binary patch delta 6053 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 delta 1787 zcmVms*sW9G{z?6rWUDlt-E|$_lQ2E?_qU00jp$ zC0m?k*8l(pJV``BRCt{2TVa}{Dhwoe0ou6$qZe@P``_(}?zBlIinOvjZ^!yEpAw3I zjYyG<>A z1>N8SCy*PZ!`^XwwD_#RBfsrkGw_0^YdY?*bB%O3IBxHv;-|9JA@Vy>djapV?=yCb z&u@_57=-8MjV^kJ@7P4M=e(Q*r}#@FWL<95mlbIF6Tj{we;K{vlV~xm6PKbv@cbq^ z1a%>f)F$!Rvg1EL4=ACmtN{E6H-&j_RQkw3&R*~LT~rvl>q2z&?p zDERGcU%Qa5rWPat;F-fulTRxr0>8!9mL|DF1FJ*pC)+BW(d#y++lKd0FWzf|H1P@S z(@)sEW+6qefA@M`O><5-RNdu86CWRve@MQx4{5OjLYIoy3TStHbsXk7hIYYM_FjHI zsD~PO@A2zV$iI<;@!ssLz3&iCZlg?c?sF8(%VYdtjZp4s_U#YV0l9iVz$tZ#;Ke*| zfe_?2jMQtY`4V~yAa@OovO8ff=BENVLRAGvhARId)cD|qXWAQTGiFQ@I-5BZPH6s zE8oLO4~o}>l-`qiFl|xfQmFXgvKL!%XX!oRz|f1_-13e1+#e4w{=oGd1w$`J#+VvV zdXWt|f5{A`7b8AZ-sQ7;F~|Sv#0%B+VrCK+&(SQr(WF|;_fBd|{wh$lS#7KX|D>lY zeGbE4gJ5)Lmp_QlRe(2bdSl2*`9dPaQ_R(+vR!?xo&SXH}s0jNh<;?+m>c%kGgMGxdK2 zPM%^{a9$waj0(F7lPr%xeLlARWd&}!6MGJQinMdCWHheDMXNf&SGrcqvj)Bnx<}03 ze>TeDhw6iPE#-Tg9w0kca^`r2UGI4$Ux_zkgxbXpQf=`)M7|~H-anE)z&8Y4X4}^Y zS#MMr`H{3TpVfPB@c%H*%dg9!PmFg9vfa&`zFmG6hw(%5YG*5#QawV+&yDb*d(78@ ziQn>1x*vmVGPsY(@BOdLL$&lCH(T*Re|~Sp7kB+#9UnxyLPqad8_}Y}zrO>$Reiyl zWE9tHOC^XSQKJI1nbUishxRMBz30LBqzdy}MS%^$t2_Wyxu|(%d@`r^64~=l(6|_h zRq$daH&MjL0>mdBCA|kPGShpB&<|2CK6!)FRS%Q08CioEpUmpLXqnloZ&z4Le|3Cv zuvU96zpRa|kZ%T7zK%~0O3xA3dr$p2An{2btVzcmVtg{I_teUmo)>qRi!UlW>NyWx z8i%s`21d|ZYsHQK6O2QT{W>Q%QHH<$qM+9b%$d>-gMGaaqIM|sO-_DgB zd@B|gje11r5Vno*#2`Mo)Dd*;f0OO(8fy#KZQj^T!f&G2fBwaLMrHO=zUc}|LT2^e z#`PC++eRz2aO1{}AB0jhgcXYU)$>U)K1tCaT$)b`6{_cxLVU7*J}JZ}>*td?5ubb& zafb$0hsF7%213<*QixB^-K&~U>STO!Ce+R+h10z1`J~9dfw*4$NS+R8 z&i4g+uQ;C+VJh3fgF7@w@3 zPm1x$>iMJwzji(;+HYKqf79~I3cK&1em<$wfUq6aBV*6L0p$ldIXo|lOA$- zWj^U4T$xXL1Xt&i-uMwXr}xSOnwRF29&&hPKItI{!ddxNjI;TqC0SI+C*4PdeA0bX d$S3_S_z%@IiZCCK6 diff --git a/icons/mob/screen1_health.dmi b/icons/mob/screen1_health.dmi index 6905268a1353d23ff28d755cb844d3d1a9b91268..9ceea6305656e0974dd0c7a6c6ae8ffa931d25c2 100644 GIT binary patch literal 5090 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 N002ovPDHLkV1lE}mbL%@