mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-25 04:57:47 +01:00
Port /datum/status_effect and convert wetness and fire stacks to it (#18180)
* Port /datum/status_effect system * Port fire stacks to status_effects * Fixes and adjustments to wetness * One last little thing * Fixes these compile errors A few things on the backend got updated...Adjusts them here. --------- Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com> Co-authored-by: Cameron Lennox <killer65311@gmail.com>
This commit is contained in:
co-authored by
Kashargul
Cameron Lennox
parent
bd8893cbdb
commit
a1322afa05
@@ -73,7 +73,7 @@
|
||||
if(!istype(Tar))
|
||||
return
|
||||
Tar.adjust_fire_stacks(10)
|
||||
Tar.IgniteMob()
|
||||
Tar.ignite_mob()
|
||||
Tar.visible_message(span_danger("[target] bursts into flames!"))
|
||||
|
||||
if("lightning_strike")
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
if(SMITE_SPONTANEOUSCOMBUSTION)
|
||||
target.adjust_fire_stacks(10)
|
||||
target.IgniteMob()
|
||||
target.ignite_mob()
|
||||
target.visible_message(span_danger("[target] bursts into flames!"))
|
||||
|
||||
if(SMITE_LIGHTNINGBOLT)
|
||||
|
||||
@@ -52,5 +52,5 @@
|
||||
|
||||
/datum/blob_type/pressurized_slime/on_chunk_use(obj/item/blobcore_chunk/B, mob/living/user) // Drenches you in water.
|
||||
if(user)
|
||||
user.ExtinguishMob()
|
||||
user.fire_stacks = CLAMP(user.fire_stacks - 1, -25, 25)
|
||||
user.adjust_wet_stacks(2.5)
|
||||
user.extinguish_mob()
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
if(on_fire) //Check if rag is on fire, if so igniting them and stopping.
|
||||
user.visible_message(span_danger("\The [user] hits [target] with [src]!"),)
|
||||
user.do_attack_animation(src)
|
||||
M.IgniteMob()
|
||||
M.ignite_mob()
|
||||
else if(user.zone_sel.selecting == O_MOUTH) //Check player target location, provided the rag is not on fire. Then check if mouth is exposed.
|
||||
if(ishuman(target)) //Added this since player species process reagents in majority of cases.
|
||||
var/mob/living/carbon/human/H = target
|
||||
@@ -196,7 +196,8 @@
|
||||
update_name()
|
||||
update_icon()
|
||||
|
||||
/obj/item/reagent_containers/glass/rag/proc/extinguish()
|
||||
/obj/item/reagent_containers/glass/rag/extinguish()
|
||||
. = ..()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
set_light(0)
|
||||
on_fire = 0
|
||||
@@ -218,7 +219,7 @@
|
||||
//copied from matches
|
||||
if(isliving(loc))
|
||||
var/mob/living/M = loc
|
||||
M.IgniteMob()
|
||||
M.ignite_mob()
|
||||
var/turf/location = get_turf(src)
|
||||
if(location)
|
||||
location.hotspot_expose(700, 5)
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
if(rag && rag.on_fire && isliving(against))
|
||||
rag.forceMove(loc)
|
||||
var/mob/living/L = against
|
||||
L.IgniteMob()
|
||||
L.ignite_mob()
|
||||
|
||||
playsound(src, "shatter", 70, 1)
|
||||
src.transfer_fingerprints_to(B)
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
// Ignition, but confined to the modifier system.
|
||||
// This makes it more predictable and thus, easier to balance.
|
||||
/datum/modifier/fire
|
||||
name = "on fire"
|
||||
desc = "You are on fire! You will be harmed until the fire goes out or you extinguish it with water."
|
||||
mob_overlay_state = "on_fire"
|
||||
|
||||
on_created_text = span_danger("You burst into flames!")
|
||||
on_expired_text = span_warning("The fire starts to fade.")
|
||||
stacks = MODIFIER_STACK_ALLOWED // Multiple instances will hurt a lot.
|
||||
var/damage_per_tick = 5
|
||||
|
||||
/datum/modifier/fire/intense
|
||||
mob_overlay_state = "on_fire_intense"
|
||||
damage_per_tick = 10
|
||||
|
||||
/datum/modifier/fire/tick()
|
||||
holder.inflict_heat_damage(damage_per_tick)
|
||||
|
||||
/datum/modifier/fire/weak
|
||||
damage_per_tick = 1
|
||||
|
||||
/*
|
||||
* Modifier used by projectiles, like the flamethrower, that rely heavily on fire_stacks to persist.
|
||||
*/
|
||||
|
||||
/datum/modifier/fire/stack_managed/tick()
|
||||
..()
|
||||
|
||||
if(!holder.fire_stacks || holder.fire_stacks < 0)
|
||||
if(prob(10))
|
||||
expire()
|
||||
|
||||
else if(holder.fire_stacks > 0)
|
||||
holder.fire_stacks -= 0.5
|
||||
|
||||
/datum/modifier/fire/stack_managed/intense
|
||||
mob_overlay_state = "on_fire_intense"
|
||||
damage_per_tick = 10
|
||||
|
||||
/datum/modifier/fire/stack_managed/weak
|
||||
damage_per_tick = 1
|
||||
@@ -154,8 +154,5 @@
|
||||
else
|
||||
clear_alert("alien_fire")
|
||||
|
||||
/mob/living/carbon/alien/handle_fire()
|
||||
if(..())
|
||||
return
|
||||
bodytemperature += BODYTEMP_HEATING_MAX //If you're on fire, you heat up!
|
||||
return
|
||||
/mob/living/carbon/alien/on_fire_stack(seconds_per_tick, datum/status_effect/fire_handler/fire_stacks/fire_handler)
|
||||
bodytemperature += BODYTEMP_HEATING_MAX
|
||||
|
||||
@@ -243,7 +243,7 @@
|
||||
src.adjust_fire_stacks(-0.5)
|
||||
if (prob(10) && (M.fire_stacks <= 0))
|
||||
M.adjust_fire_stacks(1)
|
||||
M.IgniteMob()
|
||||
M.ignite_mob()
|
||||
if (M.on_fire)
|
||||
M.visible_message(span_danger("The fire spreads from [src] to [M]!"),
|
||||
span_danger("The fire spreads to you as well!"))
|
||||
@@ -252,8 +252,7 @@
|
||||
if (src.fire_stacks <= 0)
|
||||
M.visible_message(span_warning("[M] successfully pats out [src]'s flames."),
|
||||
span_warning("You successfully pat out [src]'s flames."))
|
||||
src.ExtinguishMob()
|
||||
src.fire_stacks = 0
|
||||
src.extinguish_mob()
|
||||
else
|
||||
if (ishuman(src) && src:w_uniform)
|
||||
var/mob/living/carbon/human/H = src
|
||||
@@ -283,7 +282,7 @@
|
||||
src.adjust_fire_stacks(1)
|
||||
M.adjust_fire_stacks(-1)
|
||||
if(M.on_fire)
|
||||
src.IgniteMob()
|
||||
src.ignite_mob()
|
||||
M.resting = 0 //Hoist yourself up up off the ground. No para/stunned/weakened removal.
|
||||
update_canmove()
|
||||
else if(istype(hugger))
|
||||
@@ -295,7 +294,7 @@
|
||||
src.adjust_fire_stacks(1)
|
||||
M.adjust_fire_stacks(-1)
|
||||
if(M.on_fire)
|
||||
src.IgniteMob()
|
||||
src.ignite_mob()
|
||||
AdjustParalysis(-3)
|
||||
AdjustStunned(-3)
|
||||
AdjustWeakened(-3)
|
||||
|
||||
@@ -280,7 +280,7 @@
|
||||
if(AM.is_incorporeal())
|
||||
return
|
||||
|
||||
spread_fire(AM)
|
||||
spreadFire(AM)
|
||||
|
||||
..() // call parent because we moved behavior to parent
|
||||
|
||||
|
||||
@@ -652,10 +652,9 @@ emp_act
|
||||
return CLAMP(1-converted_protection, 0, 1)
|
||||
|
||||
/mob/living/carbon/human/water_act(amount)
|
||||
adjust_fire_stacks(-amount * 5)
|
||||
adjust_wet_stacks(amount * 5)
|
||||
for(var/atom/movable/AM in contents)
|
||||
AM.water_act(amount)
|
||||
remove_modifiers_of_type(/datum/modifier/fire)
|
||||
|
||||
species.handle_water_damage(src, amount)
|
||||
|
||||
|
||||
@@ -2223,26 +2223,13 @@
|
||||
|
||||
hud_updateflag = 0
|
||||
|
||||
/mob/living/carbon/human/handle_fire()
|
||||
if(..())
|
||||
return
|
||||
|
||||
var/thermal_protection = get_heat_protection(fire_stacks * 1500) // Arbitrary but below firesuit max temp when below 20 stacks.
|
||||
|
||||
if(thermal_protection == 1) // Immune.
|
||||
return
|
||||
else
|
||||
var/fire_temp_add = (BODYTEMP_HEATING_MAX + (fire_stacks * 15)) * (1-thermal_protection)
|
||||
//This is to prevent humans from heating up indefinitely. A human being on fire (fat burns at 250C) can't magically
|
||||
// increase your body temperature beyond 250C, but it's possible something else (atmos) has heated us up beyond it,
|
||||
// so don't worry about the firestacks at that point. Really, we should be cooling the room down, because it has
|
||||
// to expend energy to heat our body up! But let's not worry about that.
|
||||
|
||||
// This whole section above is ABSOLUTELY STUPID and makes no sense and this would prevent too-high-heat from even being able to hurt someone. No. We will heat up for as long as needed.
|
||||
//if((bodytemperature + fire_temp_add) > HUMAN_COMBUSTION_TEMP)
|
||||
// return
|
||||
|
||||
bodytemperature += fire_temp_add
|
||||
/mob/living/carbon/human/on_fire_stack(seconds_per_tick, datum/status_effect/fire_handler/fire_stacks/fire_handler)
|
||||
SEND_SIGNAL(src, COMSIG_HUMAN_BURNING)
|
||||
// burn_clothing(seconds_per_tick, fire_handler.stacks)
|
||||
var/no_protection = FALSE
|
||||
if(HAS_TRAIT(src, TRAIT_IGNORE_FIRE_PROTECTION))
|
||||
no_protection = TRUE
|
||||
fire_handler.harm_human(seconds_per_tick, no_protection)
|
||||
|
||||
/mob/living/carbon/human/rejuvenate()
|
||||
restore_blood()
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
span_danger("[src] has successfully extinguished themselves!"),
|
||||
span_notice("You extinguish yourself.")
|
||||
)
|
||||
ExtinguishMob()
|
||||
extinguish_mob()
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/resist_restraints()
|
||||
|
||||
@@ -192,8 +192,6 @@
|
||||
if(agony) apply_effect(agony, AGONY, blocked)
|
||||
if(flammable) adjust_fire_stacks(flammable)
|
||||
if(ignite)
|
||||
if(ignite >= 3)
|
||||
add_modifier(/datum/modifier/fire/stack_managed/intense, 60 SECONDS)
|
||||
else
|
||||
add_modifier(/datum/modifier/fire/stack_managed, 45 * ignite SECONDS)
|
||||
adjust_fire_stacks(ignite)
|
||||
ignite_mob()
|
||||
return 1
|
||||
|
||||
@@ -59,9 +59,6 @@
|
||||
if(environment)
|
||||
handle_environment(environment)
|
||||
|
||||
//Check if we're on fire
|
||||
handle_fire()
|
||||
|
||||
if(client) // Handle re-running ambience to mobs if they've remained in an area, AND have an active client assigned to them, and do not have repeating ambience disabled.
|
||||
handle_ambience()
|
||||
|
||||
|
||||
@@ -725,12 +725,11 @@
|
||||
BITSET(hud_updateflag, HEALTH_HUD)
|
||||
BITSET(hud_updateflag, STATUS_HUD)
|
||||
BITSET(hud_updateflag, LIFE_HUD)
|
||||
ExtinguishMob()
|
||||
fire_stacks = 0
|
||||
if(ai_holder) // AI gets told to sleep when killed. Since they're not dead anymore, wake it up.
|
||||
ai_holder.go_wake()
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_HUMAN_DNA_FINALIZED)
|
||||
SEND_SIGNAL(src, COMSIG_LIVING_AHEAL)
|
||||
|
||||
/mob/living/proc/rejuvenate()
|
||||
if(reagents)
|
||||
@@ -1178,10 +1177,6 @@
|
||||
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
|
||||
|
||||
@@ -416,83 +416,6 @@
|
||||
spawn(1) updatehealth()
|
||||
return 1
|
||||
|
||||
/mob/living/proc/IgniteMob()
|
||||
if(fire_stacks > 0 && !on_fire)
|
||||
on_fire = 1
|
||||
new/obj/effect/dummy/lighting_obj/moblight/fire(src)
|
||||
throw_alert("fire", /obj/screen/alert/fire)
|
||||
update_fire()
|
||||
|
||||
/mob/living/proc/ExtinguishMob()
|
||||
if(on_fire)
|
||||
on_fire = 0
|
||||
fire_stacks = 0
|
||||
for(var/obj/effect/dummy/lighting_obj/moblight/fire/F in src)
|
||||
qdel(F)
|
||||
clear_alert("fire")
|
||||
update_fire()
|
||||
|
||||
if(has_modifier_of_type(/datum/modifier/fire))
|
||||
remove_modifiers_of_type(/datum/modifier/fire)
|
||||
|
||||
/mob/living/proc/update_fire()
|
||||
return
|
||||
|
||||
/mob/living/proc/adjust_fire_stacks(add_fire_stacks) //Adjusting the amount of fire_stacks we have on person
|
||||
fire_stacks = CLAMP(fire_stacks + add_fire_stacks, FIRE_MIN_STACKS, FIRE_MAX_STACKS)
|
||||
|
||||
/mob/living/proc/handle_fire()
|
||||
if(fire_stacks < 0)
|
||||
fire_stacks = min(0, ++fire_stacks) //If we've doused ourselves in water to avoid fire, dry off slowly
|
||||
|
||||
if(fire_stacks > 0)
|
||||
fire_stacks = max(0, (fire_stacks-0.1)) //Should slowly burn out
|
||||
|
||||
if(!on_fire)
|
||||
return 1
|
||||
else if(fire_stacks <= 0)
|
||||
ExtinguishMob() //Fire's been put out.
|
||||
return 1
|
||||
|
||||
var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment
|
||||
if(G.gas[GAS_O2] < 1)
|
||||
ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire
|
||||
return 1
|
||||
|
||||
var/turf/location = get_turf(src)
|
||||
location.hotspot_expose(fire_burn_temperature(), 50, 1)
|
||||
|
||||
//altered this to cap at the temperature of the fire causing it, using the same 1:1500 value as /mob/living/carbon/human/handle_fire() in human/life.dm
|
||||
/mob/living/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
if(exposed_temperature)
|
||||
if(fire_stacks < exposed_temperature/1500) // Subject to balance
|
||||
adjust_fire_stacks(2)
|
||||
else
|
||||
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)
|
||||
return
|
||||
// This is commented out pending discussion on Polaris. If you're a downsteam and you want people to spread fire by touching each other, feel free to uncomment this.
|
||||
/*
|
||||
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
|
||||
|
||||
@@ -529,8 +452,7 @@
|
||||
// Called when touching a lava tile.
|
||||
// Does roughly 70 damage (30 instantly, up to ~40 over time) to unprotected mobs, and 10 to fully protected mobs.
|
||||
/mob/living/lava_act()
|
||||
adjust_fire_stacks(1)
|
||||
add_modifier(/datum/modifier/fire/stack_managed/intense, 8 SECONDS) // Around 40 total if left to burn and without fire protection per stack.
|
||||
adjust_fire_stacks(4)
|
||||
inflict_heat_damage(20) // Another 20, however this is instantly applied to unprotected mobs.
|
||||
adjustFireLoss(10) // Lava cannot be 100% resisted with fire protection.
|
||||
|
||||
|
||||
@@ -42,8 +42,12 @@
|
||||
var/tod = null // Time of death
|
||||
var/update_slimes = 1
|
||||
var/silent = null // Can't talk. Value goes down every life proc.
|
||||
var/on_fire = 0 //The "Are we on fire?" var
|
||||
|
||||
/// Helper vars for quick access to firestacks, these should be updated every time firestacks are adjusted
|
||||
var/on_fire = 0
|
||||
var/fire_stacks
|
||||
/// Rate at which fire stacks should decay from this mob
|
||||
var/fire_stack_decay_rate = -0.05
|
||||
|
||||
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/lastpuke = 0
|
||||
@@ -115,3 +119,6 @@
|
||||
var/ooc_notes_favs = null
|
||||
var/ooc_notes_maybes = null
|
||||
var/ooc_notes_style = FALSE
|
||||
|
||||
///a list of all status effects the mob has
|
||||
var/list/status_effects
|
||||
|
||||
@@ -0,0 +1,179 @@
|
||||
//Mobs on Fire
|
||||
|
||||
//altered this to cap at the temperature of the fire causing it, using the same 1:1500 value as /mob/living/carbon/human/handle_fire() in human/life.dm
|
||||
/mob/living/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
if(exposed_temperature)
|
||||
if(fire_stacks < exposed_temperature/1500) // Subject to balance
|
||||
adjust_fire_stacks(2)
|
||||
else
|
||||
adjust_fire_stacks(2)
|
||||
ignite_mob()
|
||||
|
||||
|
||||
/// Global list that containes cached fire overlays for mobs
|
||||
GLOBAL_LIST_EMPTY(fire_appearances)
|
||||
|
||||
/mob/living/proc/ignite_mob(silent)
|
||||
if(fire_stacks <= 0)
|
||||
return FALSE
|
||||
|
||||
var/datum/status_effect/fire_handler/fire_stacks/fire_status = has_status_effect(/datum/status_effect/fire_handler/fire_stacks)
|
||||
if(!fire_status || fire_status.on_fire)
|
||||
return FALSE
|
||||
|
||||
return fire_status.ignite(silent)
|
||||
|
||||
/**
|
||||
* Extinguish all fire on the mob
|
||||
*
|
||||
* This removes all fire stacks, fire effects, alerts, and moods
|
||||
* Signals the extinguishing.
|
||||
*/
|
||||
/mob/living/proc/extinguish_mob()
|
||||
if(HAS_TRAIT(src, TRAIT_NO_EXTINGUISH)) //The everlasting flames will not be extinguished
|
||||
return
|
||||
var/datum/status_effect/fire_handler/fire_stacks/fire_status = has_status_effect(/datum/status_effect/fire_handler/fire_stacks)
|
||||
if(!fire_status || !fire_status.on_fire)
|
||||
return
|
||||
remove_status_effect(/datum/status_effect/fire_handler/fire_stacks)
|
||||
|
||||
/mob/living/proc/update_fire()
|
||||
return
|
||||
|
||||
/**
|
||||
* Adjust the amount of fire stacks on a mob
|
||||
*
|
||||
* This modifies the fire stacks on a mob.
|
||||
*
|
||||
* Vars:
|
||||
* * stacks: int The amount to modify the fire stacks
|
||||
* * fire_type: type Type of fire status effect that we apply, should be subtype of /datum/status_effect/fire_handler/fire_stacks
|
||||
*/
|
||||
|
||||
/mob/living/proc/adjust_fire_stacks(stacks, fire_type = /datum/status_effect/fire_handler/fire_stacks)
|
||||
if(stacks < 0)
|
||||
if(HAS_TRAIT(src, TRAIT_NO_EXTINGUISH)) //You can't reduce fire stacks of the everlasting flames
|
||||
return
|
||||
stacks = max(-fire_stacks, stacks)
|
||||
apply_status_effect(fire_type, stacks)
|
||||
|
||||
/mob/living/proc/adjust_wet_stacks(stacks, wet_type = /datum/status_effect/fire_handler/wet_stacks)
|
||||
if(HAS_TRAIT(src, TRAIT_NO_EXTINGUISH)) //The everlasting flames will not be extinguished
|
||||
return
|
||||
if(stacks < 0)
|
||||
stacks = max(fire_stacks, stacks)
|
||||
apply_status_effect(wet_type, stacks)
|
||||
|
||||
/**
|
||||
* Set the fire stacks on a mob
|
||||
*
|
||||
* This sets the fire stacks on a mob, stacks are clamped between -20 and 20.
|
||||
* If the fire stacks are reduced to 0 then we will extinguish the mob.
|
||||
*
|
||||
* Vars:
|
||||
* * stacks: int The amount to set fire_stacks to
|
||||
* * fire_type: type Type of fire status effect that we apply, should be subtype of /datum/status_effect/fire_handler/fire_stacks
|
||||
* * remove_wet_stacks: bool If we remove all wet stacks upon doing this
|
||||
*/
|
||||
|
||||
/mob/living/proc/set_fire_stacks(stacks, fire_type = /datum/status_effect/fire_handler/fire_stacks, remove_wet_stacks = TRUE)
|
||||
if(stacks < 0) //Shouldn't happen, ever
|
||||
CRASH("set_fire_stacks received negative [stacks] fire stacks")
|
||||
|
||||
if(remove_wet_stacks)
|
||||
remove_status_effect(/datum/status_effect/fire_handler/wet_stacks)
|
||||
|
||||
if(stacks == 0)
|
||||
remove_status_effect(fire_type)
|
||||
return
|
||||
|
||||
apply_status_effect(fire_type, stacks, TRUE)
|
||||
|
||||
/mob/living/proc/set_wet_stacks(stacks, wet_type = /datum/status_effect/fire_handler/wet_stacks, remove_fire_stacks = TRUE)
|
||||
if(stacks < 0)
|
||||
CRASH("set_wet_stacks received negative [stacks] wet stacks")
|
||||
|
||||
if(remove_fire_stacks)
|
||||
remove_status_effect(/datum/status_effect/fire_handler/fire_stacks)
|
||||
|
||||
if(stacks == 0)
|
||||
remove_status_effect(wet_type)
|
||||
return
|
||||
|
||||
apply_status_effect(wet_type, stacks, TRUE)
|
||||
|
||||
//Share fire evenly between the two mobs
|
||||
//Called in MobBump() and Crossed()
|
||||
/mob/living/proc/spreadFire(mob/living/spread_to)
|
||||
if(!istype(spread_to))
|
||||
return
|
||||
|
||||
// can't spread fire to mobs that don't catch on fire
|
||||
if(HAS_TRAIT(spread_to, TRAIT_NOFIRE_SPREAD) || HAS_TRAIT(src, TRAIT_NOFIRE_SPREAD))
|
||||
return
|
||||
|
||||
var/datum/status_effect/fire_handler/fire_stacks/fire_status = has_status_effect(/datum/status_effect/fire_handler/fire_stacks)
|
||||
var/datum/status_effect/fire_handler/fire_stacks/their_fire_status = spread_to.has_status_effect(/datum/status_effect/fire_handler/fire_stacks)
|
||||
if(fire_status && fire_status.on_fire)
|
||||
if(their_fire_status && their_fire_status.on_fire)
|
||||
var/firesplit = (fire_stacks + spread_to.fire_stacks) / 2
|
||||
var/fire_type = (spread_to.fire_stacks > fire_stacks) ? their_fire_status.type : fire_status.type
|
||||
set_fire_stacks(firesplit, fire_type)
|
||||
spread_to.set_fire_stacks(firesplit, fire_type)
|
||||
return
|
||||
|
||||
adjust_fire_stacks(-fire_stacks / 2, fire_status.type)
|
||||
spread_to.adjust_fire_stacks(fire_stacks, fire_status.type)
|
||||
if(spread_to.ignite_mob())
|
||||
message_admins("[key_name(src)] bumped into [key_name(spread_to)] and set them on fire.")
|
||||
return
|
||||
|
||||
if(!their_fire_status || !their_fire_status.on_fire)
|
||||
return
|
||||
|
||||
spread_to.adjust_fire_stacks(-spread_to.fire_stacks / 2, their_fire_status.type)
|
||||
adjust_fire_stacks(spread_to.fire_stacks, their_fire_status.type)
|
||||
ignite_mob()
|
||||
|
||||
/**
|
||||
* Gets the fire overlay to use for this mob
|
||||
*
|
||||
* Args:
|
||||
* * stacks: Current amount of fire_stacks
|
||||
* * on_fire: If we're lit on fire
|
||||
*
|
||||
* Return a mutable appearance, the overlay that will be applied.
|
||||
*/
|
||||
|
||||
// Gets the correct icon_state for being on fire. See OnFire.dmi for the icons.
|
||||
/mob/living/proc/get_fire_icon_state()
|
||||
return "generic"
|
||||
|
||||
/mob/living/proc/get_fire_overlay(stacks, on_fire)
|
||||
RETURN_TYPE(/mutable_appearance)
|
||||
var/fire_icon = get_fire_icon_state()
|
||||
|
||||
if(!GLOB.fire_appearances[fire_icon])
|
||||
var/mutable_appearance/new_fire_overlay = mutable_appearance(
|
||||
'icons/mob/OnFire.dmi',
|
||||
fire_icon,
|
||||
FIRE_LAYER,
|
||||
appearance_flags = RESET_COLOR|KEEP_APART,
|
||||
)
|
||||
GLOB.fire_appearances[fire_icon] = new_fire_overlay
|
||||
|
||||
return GLOB.fire_appearances[fire_icon]
|
||||
|
||||
/**
|
||||
* Handles effects happening when mob is on normal fire
|
||||
*
|
||||
* Vars:
|
||||
* * seconds_per_tick
|
||||
* * times_fired
|
||||
* * fire_handler: Current fire status effect that called the proc
|
||||
*/
|
||||
|
||||
/mob/living/proc/on_fire_stack(seconds_per_tick, datum/status_effect/fire_handler/fire_stacks/fire_handler)
|
||||
return
|
||||
|
||||
//Mobs on Fire end
|
||||
@@ -55,7 +55,7 @@ default behaviour is:
|
||||
var/mob/living/tmob = AM
|
||||
|
||||
//Even if we don't push/swap places, we "touched" them, so spread fire
|
||||
spread_fire(tmob)
|
||||
spreadFire(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/grab, tmob.grabbed_by.len)) )
|
||||
|
||||
@@ -364,15 +364,15 @@
|
||||
canmove = FALSE
|
||||
return canmove
|
||||
|
||||
/mob/living/silicon/robot/fire_act()
|
||||
if(!on_fire) //Silicons don't gain stacks from hotspots, but hotspots can ignite them
|
||||
ignite_mob()
|
||||
|
||||
/mob/living/silicon/robot/update_fire()
|
||||
cut_overlay(image(icon = 'icons/mob/OnFire.dmi', icon_state = get_fire_icon_state()))
|
||||
if(on_fire)
|
||||
add_overlay(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
|
||||
IgniteMob()
|
||||
|
||||
/mob/living/silicon/robot/handle_light()
|
||||
if(lights_on)
|
||||
set_light(integrated_light_power, 1, robot_light_col)
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
var/sensor_type = 0 //VOREStation add - silicon omni "is sensor on or nah"
|
||||
|
||||
var/hudmode = null
|
||||
fire_stack_decay_rate = -0.55
|
||||
|
||||
/mob/living/silicon/Initialize(mapload, is_decoy = FALSE)
|
||||
. = ..()
|
||||
|
||||
@@ -176,17 +176,6 @@
|
||||
. = 1 - .
|
||||
. = min(., 1.0)
|
||||
|
||||
|
||||
// Fire stuff. Not really exciting at the moment.
|
||||
/mob/living/simple_mob/handle_fire()
|
||||
return
|
||||
/mob/living/simple_mob/update_fire()
|
||||
return
|
||||
/mob/living/simple_mob/IgniteMob()
|
||||
return
|
||||
/mob/living/simple_mob/ExtinguishMob()
|
||||
return
|
||||
|
||||
/mob/living/simple_mob/get_heat_protection()
|
||||
. = heat_resist
|
||||
. = 1 - . // Invert from 1 = immunity to 0 = immunity.
|
||||
|
||||
@@ -184,7 +184,7 @@
|
||||
visible_message(span_critical("\The [src]'s tank ruptures!"))
|
||||
ruptured = 1
|
||||
adjust_fire_stacks(2)
|
||||
IgniteMob()
|
||||
ignite_mob()
|
||||
return ..()
|
||||
|
||||
//Ammo Mouse
|
||||
|
||||
@@ -79,15 +79,13 @@
|
||||
name = "ember"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "explosion_particle"
|
||||
modifier_type_to_apply = /datum/modifier/fire
|
||||
modifier_duration = 6 SECONDS // About 15 damage per stack, as Life() ticks every two seconds.
|
||||
incendiary = 3
|
||||
damage = 0
|
||||
nodamage = TRUE
|
||||
|
||||
impact_effect_type = /obj/effect/temp_visual/impact_effect
|
||||
hitsound_wall = 'sound/weapons/effects/searwall.ogg'
|
||||
|
||||
|
||||
// Close to mid-ranged shooter that arcs over other things, ideal if allies are in front of it.
|
||||
// Difference from siege hivebots is that siege hivebots have limited charges for their attacks, are very long range, and
|
||||
// the projectiles have an AoE component, where as backline hivebots do not.
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
to_chat(L, span_danger("You've been burned by \the [src]!"))
|
||||
L.adjust_fire_stacks(1)
|
||||
if(prob(12))
|
||||
L.IgniteMob()
|
||||
L.ignite_mob()
|
||||
|
||||
/mob/living/simple_mob/slime/xenobio/blue
|
||||
desc = "This slime produces 'cryotoxin' and uses it against their foes. Very deadly to other slimes."
|
||||
|
||||
@@ -887,7 +887,7 @@ I think I covered everything.
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/M = target
|
||||
M.adjust_fire_stacks(fire_stacks)
|
||||
M.IgniteMob()
|
||||
M.ignite_mob()
|
||||
else
|
||||
. = ..()
|
||||
|
||||
@@ -1010,7 +1010,7 @@ I think I covered everything.
|
||||
for(var/RG in to_inject)
|
||||
if(!P.reagents.has_reagent(RG))
|
||||
P.reagents.add_reagent(RG, 10)
|
||||
L.ExtinguishMob()
|
||||
L.extinguish_mob()
|
||||
return //Don't attack people if we're on help intent
|
||||
return .=..()
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
span_userdanger("You miss the [src] and accidentally light yourself on fire!"))
|
||||
user.unEquip(P)
|
||||
user.adjust_fire_stacks(1)
|
||||
user.IgniteMob()
|
||||
user.ignite_mob()
|
||||
return
|
||||
|
||||
if(!(in_range(user, src))) //to prevent issues as a result of telepathically lighting a paper
|
||||
|
||||
@@ -346,10 +346,8 @@
|
||||
|
||||
/obj/item/projectile/bullet/incendiary/flamethrower/tiny
|
||||
damage = 2
|
||||
incendiary = 0
|
||||
incendiary = 10
|
||||
flammability = 2
|
||||
modifier_type_to_apply = /datum/modifier/fire/stack_managed/weak
|
||||
modifier_duration = 20 SECONDS
|
||||
range = 6
|
||||
agony = 0
|
||||
hud_state = "flame"
|
||||
|
||||
@@ -307,7 +307,7 @@
|
||||
// Then extinguish people on fire.
|
||||
var/needed = max(0,L.fire_stacks) * 5
|
||||
if(amount > needed)
|
||||
L.ExtinguishMob()
|
||||
L.extinguish_mob()
|
||||
L.water_act(amount / 25) // Div by 25, as water_act multiplies it by 5 in order to calculate firestack modification.
|
||||
remove_self(needed)
|
||||
// Put out cigarettes if splashed.
|
||||
|
||||
@@ -212,7 +212,7 @@
|
||||
M.SetConfused(0)
|
||||
M.SetSleeping(0)
|
||||
M.radiation = 0
|
||||
M.ExtinguishMob()
|
||||
M.extinguish_mob()
|
||||
M.fire_stacks = 0
|
||||
M.add_chemical_effect(CE_ANTIBIOTIC, ANTIBIO_SUPER)
|
||||
M.add_chemical_effect(CE_STABLE, 15)
|
||||
|
||||
@@ -100,7 +100,7 @@
|
||||
S.visible_message(span_warning("[S]'s flesh sizzles where the foam touches it!"), span_danger("Your flesh burns in the foam!"))
|
||||
if(istype(M))
|
||||
M.adjust_fire_stacks(-reac_volume)
|
||||
M.ExtinguishMob()
|
||||
M.extinguish_mob()
|
||||
|
||||
/datum/reagent/liquid_protean
|
||||
name = REAGENT_LIQUIDPROTEAN
|
||||
|
||||
@@ -135,7 +135,7 @@
|
||||
if(prob(10))
|
||||
to_chat(M, span_critical("You feel something boiling within you!"))
|
||||
spawn(rand(30, 60))
|
||||
M.IgniteMob()
|
||||
M.ignite_mob()
|
||||
|
||||
/datum/reagent/toxin/lead
|
||||
name = REAGENT_LEAD
|
||||
@@ -584,7 +584,7 @@
|
||||
to_chat(M, span_warning("Your veins feel like they're on fire!"))
|
||||
M.adjust_fire_stacks(0.1)
|
||||
else if(prob(5))
|
||||
M.IgniteMob()
|
||||
M.ignite_mob()
|
||||
to_chat(M, span_critical("Some of your veins rupture, the exposed blood igniting!"))
|
||||
|
||||
/datum/reagent/condensedcapsaicin/venom
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
animation.plane = MOB_PLANE
|
||||
animation.layer = ABOVE_MOB_LAYER
|
||||
animation.master = holder
|
||||
target.ExtinguishMob()
|
||||
target.extinguish_mob()
|
||||
if(target.buckled)
|
||||
target.buckled.unbuckle_mob( target, TRUE)
|
||||
jaunt_disappear(animation, target)
|
||||
|
||||
Reference in New Issue
Block a user