mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 10:43:20 +00:00
Co-authored-by: Cameron Lennox <killer65311@gmail.com> Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
129 lines
4.3 KiB
Plaintext
129 lines
4.3 KiB
Plaintext
/**
|
|
* Attached to mobs. Gives them godmode by stopping damage, effects, embeds, among all other negative effects.
|
|
*/
|
|
/datum/element/godmode
|
|
element_flags = ELEMENT_DETACH_ON_HOST_DESTROY|ELEMENT_BESPOKE
|
|
argument_hash_start_idx = 2
|
|
|
|
/datum/element/godmode/Attach(datum/target)
|
|
. = ..()
|
|
//Must be appliied to mobs.
|
|
if(!ismob(target))
|
|
return ELEMENT_INCOMPATIBLE
|
|
var/mob/our_target = target
|
|
if(our_target.status_flags & GODMODE) //Already have it.
|
|
return ELEMENT_INCOMPATIBLE
|
|
our_target.status_flags |= GODMODE
|
|
|
|
if(ishuman(target))
|
|
RegisterSignal(target, COMSIG_EXTERNAL_ORGAN_PRE_DAMAGE_APPLICATION, PROC_REF(on_external_damaged))
|
|
RegisterSignal(target, COMSIG_INTERNAL_ORGAN_PRE_DAMAGE_APPLICATION, PROC_REF(on_internal_damaged))
|
|
|
|
if(issilicon(target))
|
|
RegisterSignal(target, COMSIG_SILICON_EMP_ACT, PROC_REF(on_emp))
|
|
|
|
if(isrobot(target))
|
|
RegisterSignal(target, COMSIG_ROBOT_EMP_ACT, PROC_REF(on_emp))
|
|
|
|
//Four main damage types: Brute, Burn, Oxy, Tox
|
|
RegisterSignal(target, COMSIG_TAKING_OXY_DAMAGE, PROC_REF(on_oxygen_damage))
|
|
RegisterSignal(target, COMSIG_TAKING_TOX_DAMAGE, PROC_REF(on_tox_damage))
|
|
RegisterSignal(target, COMSIG_TAKING_FIRE_DAMAGE, PROC_REF(on_fire_damage))
|
|
RegisterSignal(target, COMSIG_TAKING_BRUTE_DAMAGE, PROC_REF(on_brute_damage))
|
|
|
|
//Rarer types, such as Brain, Clone, Halloss
|
|
RegisterSignal(target, COMSIG_TAKING_BRAIN_DAMAGE, PROC_REF(on_brain_damage))
|
|
RegisterSignal(target, COMSIG_TAKING_CLONE_DAMAGE, PROC_REF(on_clone_damage))
|
|
RegisterSignal(target, COMSIG_TAKING_HALO_DAMAGE, PROC_REF(on_halo_damage))
|
|
|
|
//Things such as update health.
|
|
RegisterSignal(target, COMSIG_UPDATE_HEALTH, PROC_REF(on_update_health))
|
|
RegisterSignal(target, COMSIG_TAKING_APPLY_EFFECT, PROC_REF(on_apply_effect))
|
|
|
|
//For things that don't fall into a single bucket
|
|
RegisterSignal(target, COMSIG_CHECK_FOR_GODMODE, PROC_REF(godmode_check))
|
|
RegisterSignal(target, COMSIG_BEING_ELECTROCUTED, PROC_REF(on_electrocute))
|
|
RegisterSignal(target, COMSIG_EMBED_OBJECT, PROC_REF(embed_check))
|
|
|
|
|
|
/datum/element/godmode/Detach(atom/movable/target)
|
|
//Human specific comsigs:
|
|
if(ishuman(target))
|
|
UnregisterSignal(target, list(COMSIG_EXTERNAL_ORGAN_PRE_DAMAGE_APPLICATION, COMSIG_INTERNAL_ORGAN_PRE_DAMAGE_APPLICATION))
|
|
|
|
if(issilicon(target))
|
|
UnregisterSignal(target, list(COMSIG_SILICON_EMP_ACT))
|
|
|
|
if(isrobot(target))
|
|
UnregisterSignal(target, list(COMSIG_ROBOT_EMP_ACT))
|
|
|
|
//All the general comsigs.
|
|
UnregisterSignal(target, list(COMSIG_TAKING_OXY_DAMAGE, COMSIG_TAKING_TOX_DAMAGE, COMSIG_TAKING_FIRE_DAMAGE, \
|
|
COMSIG_TAKING_BRUTE_DAMAGE, COMSIG_TAKING_BRAIN_DAMAGE, COMSIG_TAKING_CLONE_DAMAGE, COMSIG_TAKING_HALO_DAMAGE, \
|
|
COMSIG_UPDATE_HEALTH, COMSIG_TAKING_APPLY_EFFECT, COMSIG_CHECK_FOR_GODMODE, COMSIG_BEING_ELECTROCUTED, COMSIG_EMBED_OBJECT))
|
|
var/mob/our_target = target
|
|
|
|
//And finally, remove the fact we're in godmode.
|
|
our_target.status_flags &= ~GODMODE
|
|
return ..()
|
|
|
|
/datum/element/godmode/proc/on_external_damaged()
|
|
SIGNAL_HANDLER
|
|
return COMPONENT_CANCEL_EXTERNAL_ORGAN_DAMAGE
|
|
|
|
/datum/element/godmode/proc/on_internal_damaged()
|
|
SIGNAL_HANDLER
|
|
return COMPONENT_CANCEL_INTERNAL_ORGAN_DAMAGE
|
|
|
|
/datum/element/godmode/proc/on_brain_damage()
|
|
SIGNAL_HANDLER
|
|
return COMSIG_CANCEL_BRAIN_DAMAGE
|
|
|
|
/datum/element/godmode/proc/on_oxygen_damage()
|
|
SIGNAL_HANDLER
|
|
return COMSIG_CANCEL_OXY_DAMAGE
|
|
|
|
/datum/element/godmode/proc/on_tox_damage()
|
|
SIGNAL_HANDLER
|
|
return COMSIG_CANCEL_TOX_DAMAGE
|
|
|
|
/datum/element/godmode/proc/on_clone_damage()
|
|
SIGNAL_HANDLER
|
|
return COMSIG_CANCEL_CLONE_DAMAGE
|
|
|
|
/datum/element/godmode/proc/on_fire_damage()
|
|
SIGNAL_HANDLER
|
|
return COMSIG_CANCEL_FIRE_DAMAGE
|
|
|
|
/datum/element/godmode/proc/on_brute_damage()
|
|
SIGNAL_HANDLER
|
|
return COMSIG_CANCEL_BRUTE_DAMAGE
|
|
|
|
/datum/element/godmode/proc/on_halo_damage()
|
|
SIGNAL_HANDLER
|
|
return COMSIG_CANCEL_HALO_DAMAGE
|
|
|
|
/datum/element/godmode/proc/on_update_health()
|
|
SIGNAL_HANDLER
|
|
return COMSIG_UPDATE_HEALTH_GOD_MODE
|
|
|
|
/datum/element/godmode/proc/on_apply_effect()
|
|
SIGNAL_HANDLER
|
|
return COMSIG_CANCEL_EFFECT
|
|
|
|
/datum/element/godmode/proc/on_electrocute()
|
|
SIGNAL_HANDLER
|
|
return COMPONENT_CARBON_CANCEL_ELECTROCUTE
|
|
|
|
/datum/element/godmode/proc/embed_check()
|
|
SIGNAL_HANDLER
|
|
return COMSIG_CANCEL_EMBED
|
|
|
|
/datum/element/godmode/proc/on_emp()
|
|
SIGNAL_HANDLER
|
|
return COMPONENT_BLOCK_EMP
|
|
|
|
/datum/element/godmode/proc/godmode_check()
|
|
SIGNAL_HANDLER
|
|
return COMSIG_GODMODE_CANCEL
|