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:
ShadowLarkens
2025-09-17 01:50:37 -04:00
committed by GitHub
co-authored by Kashargul Cameron Lennox
parent bd8893cbdb
commit a1322afa05
80 changed files with 1748 additions and 237 deletions
+1 -1
View File
@@ -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")
+1 -1
View File
@@ -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()
+4 -3
View File
@@ -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)
+1 -1
View File
@@ -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)
-42
View File
@@ -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
+2 -5
View File
@@ -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
+4 -5
View File
@@ -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)
+7 -20
View File
@@ -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()
+1 -1
View File
@@ -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()
+2 -4
View File
@@ -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
-3
View File
@@ -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()
+1 -6
View File
@@ -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
+1 -79
View File
@@ -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.
+8 -1
View File
@@ -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
+179
View File
@@ -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
+1 -1
View File
@@ -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 .=..()
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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.
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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)