Files
Bubberstation/code/modules/hallucination/on_fire.dm
SkyratBot 9a594755f3 [MIRROR] Renames delta time to be a more obvious name [MDB IGNORE] (#20507)
* Renames delta time to be a more obvious name

* updates to our code

---------

Co-authored-by: oranges <email@oranges.net.nz>
Co-authored-by: Gandalf <9026500+Gandalf2k15@users.noreply.github.com>
2023-04-12 20:45:43 +01:00

121 lines
3.3 KiB
Plaintext

#define RAISE_FIRE_COUNT 3
#define RAISE_FIRE_TIME 3
/datum/hallucination/fire
random_hallucination_weight = 3
/// Are we currently burning our mob?
var/active = TRUE
/// What stare of fire are we in?
var/stage = 0
/// What icon file to use for our hallucinator
var/fire_icon = 'icons/mob/effects/onfire.dmi'
/// What icon state to use for our hallucinator
var/fire_icon_state = "human_big_fire"
/// Our fire overlay we generate
var/image/fire_overlay
/// When should we do our next action of the hallucination?
var/next_action = 0
/// How may times do we apply stamina damage to our mob?
var/times_to_lower_stamina
/// Are we currently fake-clearing our hallucinated fire?
var/fire_clearing = FALSE
/// Are the stages going up or down?
var/increasing_stages = TRUE
/// How long have we spent on fire?
var/time_spent = 0
/datum/hallucination/fire/New(mob/living/hallucinator)
if(ismonkey(hallucinator))
fire_icon_state = "monkey_big_fire"
else if(!ishuman(hallucinator))
fire_icon_state = "generic_fire"
return ..()
/datum/hallucination/fire/start()
hallucinator.set_fire_stacks(max(hallucinator.fire_stacks, 0.1)) //Placebo flammability
fire_overlay = image(fire_icon, hallucinator, fire_icon_state, ABOVE_MOB_LAYER)
hallucinator.client?.images |= fire_overlay
to_chat(hallucinator, span_userdanger("You're set on fire!"))
hallucinator.throw_alert(ALERT_FIRE, /atom/movable/screen/alert/fire, override = TRUE)
times_to_lower_stamina = rand(5, 10)
addtimer(CALLBACK(src, PROC_REF(start_expanding)), 2 SECONDS)
return TRUE
/datum/hallucination/fire/Destroy()
hallucinator.adjust_fire_stacks(-0.1)
hallucinator.clear_alert(ALERT_FIRE, clear_override = TRUE)
hallucinator.clear_alert(ALERT_TEMPERATURE, clear_override = TRUE)
if(fire_overlay)
hallucinator.client?.images -= fire_overlay
fire_overlay = null
STOP_PROCESSING(SSfastprocess, src)
return ..()
/datum/hallucination/fire/proc/start_expanding()
if(QDELETED(src))
return
START_PROCESSING(SSfastprocess, src)
/datum/hallucination/fire/process(seconds_per_tick)
if(QDELETED(src))
return
if(hallucinator.fire_stacks <= 0)
clear_fire()
time_spent += seconds_per_tick
if(fire_clearing)
next_action -= seconds_per_tick
if(next_action < 0)
stage -= 1
update_temp()
next_action += 3
else if(increasing_stages)
var/new_stage = min(round(time_spent / RAISE_FIRE_TIME), RAISE_FIRE_COUNT)
if(stage != new_stage)
stage = new_stage
update_temp()
if(stage == RAISE_FIRE_COUNT)
increasing_stages = FALSE
else if(times_to_lower_stamina)
next_action -= seconds_per_tick
if(next_action < 0)
hallucinator.adjustStaminaLoss(15)
next_action += 2
times_to_lower_stamina -= 1
else
clear_fire()
/datum/hallucination/fire/proc/update_temp()
if(stage <= 0)
hallucinator.clear_alert(ALERT_TEMPERATURE, clear_override = TRUE)
else
hallucinator.clear_alert(ALERT_TEMPERATURE, clear_override = TRUE)
hallucinator.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, stage, override = TRUE)
/datum/hallucination/fire/proc/clear_fire()
if(!active)
return
active = FALSE
hallucinator.clear_alert(ALERT_FIRE, clear_override = TRUE)
hallucinator.client?.images -= fire_overlay
fire_overlay = null
fire_clearing = TRUE
next_action = 0
#undef RAISE_FIRE_COUNT
#undef RAISE_FIRE_TIME