mirror of
https://github.com/Citadel-Station-13/Citadel-Station-13-RP.git
synced 2026-08-21 13:46:55 +01:00
37 lines
1.0 KiB
Plaintext
37 lines
1.0 KiB
Plaintext
SUBSYSTEM_DEF(status_effects)
|
|
wait = 0.5
|
|
subsystem_flags = SS_NO_INIT
|
|
name = "Status Effects"
|
|
|
|
/// ticking effects
|
|
var/list/datum/status_effect/ticking = list()
|
|
/// currentrun
|
|
var/list/datum/status_effect/currentrun = list()
|
|
|
|
/datum/controller/subsystem/status_effects/Recover()
|
|
if(islist(SSstatus_effects.ticking))
|
|
src.ticking = list()
|
|
for(var/datum/status_effect/eff in SSstatus_effects.ticking)
|
|
src.ticking += eff
|
|
return ..()
|
|
|
|
/datum/controller/subsystem/status_effects/fire(resumed)
|
|
if(!resumed)
|
|
currentrun = ticking.Copy()
|
|
// cache for speed
|
|
var/list/datum/status_effect/to_tick = currentrun
|
|
if(!length(to_tick))
|
|
return
|
|
var/i
|
|
var/datum/status_effect/effect
|
|
// todo: this is mildly inefficient when there's a lot of slow-ticking status effects
|
|
for(i in 1 to length(to_tick))
|
|
effect = to_tick[i]
|
|
if(effect.tick_next > world.time)
|
|
continue
|
|
effect.tick(effect.tick_interval * 0.1)
|
|
effect.tick_next = world.time + effect.tick_interval
|
|
if(MC_TICK_CHECK_USAGE) // effect.tick() is SHOULD NOT SLEEP.
|
|
return
|
|
to_tick.Cut(1, i + 1)
|