Files
Bubberstation/code/datums/elements/atmos_sensitive.dm
SkyratBot a8c10d1659 [MIRROR] Converts a shitload of istypes to their more concise macros [MDB IGNORE] (#15702)
Converts a shitload of istypes to their more concise macros

Co-authored-by: Seth Scherer <supernovaa41@gmx.com>
Co-authored-by: GoldenAlpharex <jerego1234@hotmail.com>
2022-08-27 16:23:44 -04:00

85 lines
3.0 KiB
Plaintext

//This element facilitates reaction to atmos changes when a tile is inactive.
//It adds the object to a list on SSair to be processed for so long as the object wants to be processed
//And removes it as soon as the object is no longer interested
//Don't put it on things that tend to clump into one spot, you will cause lag spikes.
/datum/element/atmos_sensitive
element_flags = ELEMENT_DETACH
var/static/list/pass_on = list(COMSIG_TURF_EXPOSE = /atom/proc/check_atmos_process)
/datum/element/atmos_sensitive/Attach(datum/target, mapload)
if(!isatom(target)) //How
return ELEMENT_INCOMPATIBLE
var/atom/to_track = target
to_track.AddElement(/datum/element/connect_loc, pass_on)
RegisterSignal(to_track, COMSIG_MOVABLE_MOVED, .proc/react_to_move)
if(!mapload && isopenturf(to_track.loc))
var/turf/open/new_open = to_track.loc
to_track.check_atmos_process(new_open, new_open.air, new_open.air.temperature) //Make sure you're properly registered
return ..()
/datum/element/atmos_sensitive/Detach(datum/source)
var/atom/us = source
us.RemoveElement(/datum/element/connect_loc, pass_on)
UnregisterSignal(source, COMSIG_MOVABLE_MOVED)
if(us.flags_1 & ATMOS_IS_PROCESSING_1)
us.atmos_end()
SSair.atom_process -= us
us.flags_1 &= ~ATMOS_IS_PROCESSING_1
return ..()
/datum/element/atmos_sensitive/proc/react_to_move(datum/source, atom/movable/oldloc, direction, forced)
SIGNAL_HANDLER
var/atom/atom_source = source
if(isopenturf(atom_source.loc))
var/turf/open/new_open = atom_source.loc
atom_source.check_atmos_process(new_open, new_open.air, new_open.air.temperature) //Make sure you're properly registered
/atom/proc/check_atmos_process(datum/source, datum/gas_mixture/air, exposed_temperature)
SIGNAL_HANDLER
if(should_atmos_process(air, exposed_temperature))
if(flags_1 & ATMOS_IS_PROCESSING_1)
return
SSair.atom_process += src
flags_1 |= ATMOS_IS_PROCESSING_1
else if(flags_1 & ATMOS_IS_PROCESSING_1)
atmos_end()
SSair.atom_process -= src
flags_1 &= ~ATMOS_IS_PROCESSING_1
/atom/proc/process_exposure()
var/turf/open/spot = loc
if(!isopenturf(loc))
//If you end up in a locker or a wall reconsider your life decisions
atmos_end()
SSair.atom_process -= src
flags_1 &= ~ATMOS_IS_PROCESSING_1
return
if(!should_atmos_process(spot.air, spot.air.temperature)) //Things can change without a tile becoming active
atmos_end()
SSair.atom_process -= src
flags_1 &= ~ATMOS_IS_PROCESSING_1
return
atmos_expose(spot.air, spot.air.temperature)
/turf/open/process_exposure()
if(!should_atmos_process(air, air.temperature))
atmos_end()
SSair.atom_process -= src
flags_1 &= ~ATMOS_IS_PROCESSING_1
return
atmos_expose(air, air.temperature)
///We use this proc to check if we should start processing an item, or continue processing it. Returns true/false as expected
/atom/proc/should_atmos_process(datum/gas_mixture/air, exposed_temperature)
return FALSE
///This is your process() proc
/atom/proc/atmos_expose(datum/gas_mixture/air, exposed_temperature)
return
///What to do when our requirements are no longer met
/atom/proc/atmos_end()
return