mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-10 07:41:16 +01:00
85 lines
2.9 KiB
Plaintext
85 lines
2.9 KiB
Plaintext
/// Status effect that is tied to the existence of a reagent in a mob's system
|
|
/datum/status_effect/reagent_effect
|
|
abstract_type = /datum/status_effect/reagent_effect
|
|
id = STATUS_EFFECT_ID_ABSTRACT
|
|
alert_type = null
|
|
tick_interval = STATUS_EFFECT_NO_TICK
|
|
/// We need this reagent type
|
|
var/reagent_typepath
|
|
/// Whether subtypes of the reagent are allowed to keep the effect active
|
|
var/subtypes_allowed
|
|
|
|
/datum/status_effect/reagent_effect/on_creation(mob/living/new_owner, reagent_typepath, subtypes_allowed = TRUE)
|
|
if(isnull(src.reagent_typepath))
|
|
if(isnull(reagent_typepath))
|
|
stack_trace("Reagent effect [src] created without a reagent typepath!")
|
|
src.reagent_typepath = reagent_typepath
|
|
if(isnull(src.subtypes_allowed))
|
|
src.subtypes_allowed = subtypes_allowed
|
|
return ..()
|
|
|
|
/datum/status_effect/reagent_effect/on_apply()
|
|
if(isnull(owner.reagents) || isnull(reagent_typepath) || !can_effect())
|
|
return FALSE
|
|
|
|
RegisterSignal(owner.reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(check_reagents))
|
|
add_effect()
|
|
return TRUE
|
|
|
|
/datum/status_effect/reagent_effect/on_remove()
|
|
remove_effect()
|
|
UnregisterSignal(owner.reagents, COMSIG_REAGENTS_HOLDER_UPDATED)
|
|
|
|
/datum/status_effect/reagent_effect/proc/check_reagents(datum/reagents/updated_reagents)
|
|
SIGNAL_HANDLER
|
|
|
|
if(owner.reagents?.has_reagent(reagent_typepath, check_subtypes = subtypes_allowed))
|
|
return
|
|
qdel(src)
|
|
|
|
/// Can we add this effect to the owner?
|
|
/datum/status_effect/reagent_effect/proc/can_effect()
|
|
return TRUE
|
|
|
|
/// Add the side effect to the owner
|
|
/datum/status_effect/reagent_effect/proc/add_effect()
|
|
return
|
|
|
|
/// Remove the side effect from the owner
|
|
/datum/status_effect/reagent_effect/proc/remove_effect()
|
|
return
|
|
|
|
/datum/status_effect/reagent_effect/fakedeath
|
|
id = "reagent_fake_death"
|
|
|
|
/datum/status_effect/reagent_effect/fakedeath/add_effect()
|
|
owner.fakedeath(type)
|
|
|
|
/datum/status_effect/reagent_effect/fakedeath/remove_effect()
|
|
owner.cure_fakedeath(type)
|
|
|
|
/datum/status_effect/reagent_effect/freeze
|
|
id = "reagent_freeze"
|
|
|
|
/datum/status_effect/reagent_effect/freeze/can_effect()
|
|
return !HAS_TRAIT(owner, TRAIT_RESISTCOLD)
|
|
|
|
/datum/status_effect/reagent_effect/freeze/add_effect()
|
|
owner.apply_status_effect(/datum/status_effect/frozenstasis/irresistable)
|
|
owner.apply_status_effect(/datum/status_effect/grouped/stasis, type)
|
|
RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(escape_prison))
|
|
|
|
/datum/status_effect/reagent_effect/freeze/remove_effect()
|
|
owner.remove_status_effect(/datum/status_effect/frozenstasis/irresistable)
|
|
owner.remove_status_effect(/datum/status_effect/grouped/stasis, type)
|
|
UnregisterSignal(owner, COMSIG_MOVABLE_MOVED)
|
|
|
|
/datum/status_effect/reagent_effect/freeze/proc/escape_prison(...)
|
|
SIGNAL_HANDLER
|
|
|
|
if(isturf(owner.loc)) // we escaped ice prison
|
|
owner.reagents?.del_reagent(reagent_typepath)
|
|
if(!QDELETED(src))
|
|
stack_trace("Despite nuking the reagent from the mob, [owner] still has [type]")
|
|
qdel(src)
|