Files
Bubberstation/code/controllers/subsystem/radioactive_nebula.dm
Time-Green 1be0841d98 Removes COMSIG_AREA_INITIALIZED_IN (#78143)
Literally just me stealing #77207 completely muhahahhahahah screw you
@Mothblocks
I did add some documentation and some radnebula related cleaning and
testing to make it work well

Copied from original PR:

> Please do NOT add code to InitAtom, it is extremely hot. The
conditions on this alone were costing nearly 200ms on my extremely
powerful machine.
> 
> Changes the radioactive nebula to perform its work by looping over
every space tile on init (which on my machine is faster than the time
being wasted on this signal), and adds a subsystem that does this in
SS_BACKGROUND every 30 seconds (usually completeable in about half a
second) for any new atoms, because the effect is hardly noticeable
anyway with how green space is.

Honestly we really don't care that much about stuff being initialized in
space. Everything that walks into space (about everything that matters
to players), is completely unaffected by this change, but roundstart is
now slightly faster
2023-09-06 15:32:44 +00:00

65 lines
2.7 KiB
Plaintext

/// Trait for tracking if something already has the fake irradiation effect, so we don't waste time on effect operations if otherwise unnecessary
#define TRAIT_RADIOACTIVE_NEBULA_FAKE_IRRADIATED "radioactive_nebula_fake_irradiated"
/// Controls making objects irradiated when Radioactive Nebula is in effect.
SUBSYSTEM_DEF(radioactive_nebula)
name = "Radioactive Nebula"
flags = SS_BACKGROUND
wait = 30 SECONDS
VAR_PRIVATE
datum/station_trait/nebula/hostile/radiation/radioactive_nebula
/datum/controller/subsystem/radioactive_nebula/Initialize()
radioactive_nebula = locate() in SSstation.station_traits
if (!radioactive_nebula)
can_fire = FALSE
return SS_INIT_NO_NEED
// We don't *really* care that this happens by the time the server is ready to play.
ASYNC
irradiate_everything()
// Don't leak that the station trait has been picked
return SS_INIT_NO_MESSAGE
/// Makes something appear irradiated for the purposes of the Radioactive Nebula
/datum/controller/subsystem/radioactive_nebula/proc/fake_irradiate(atom/movable/target)
if (HAS_TRAIT(target, TRAIT_RADIOACTIVE_NEBULA_FAKE_IRRADIATED))
return
ADD_TRAIT(target, TRAIT_RADIOACTIVE_NEBULA_FAKE_IRRADIATED, REF(src))
if(iscarbon(target))//Don't actually make EVERY. SINGLE. THING. RADIOACTIVE. Just irradiate people
target.AddComponent( \
/datum/component/radioactive_exposure, \
minimum_exposure_time = NEBULA_RADIATION_MINIMUM_EXPOSURE_TIME, \
irradiation_chance_base = RADIATION_EXPOSURE_NEBULA_BASE_CHANCE, \
irradiation_chance_increment = RADIATION_EXPOSURE_NEBULA_CHANCE_INCREMENT, \
irradiation_interval = RADIATION_EXPOSURE_NEBULA_CHECK_INTERVAL, \
source = src, \
radioactive_areas = radioactive_nebula.radioactive_areas, \
)
else if(isobj(target)) //and fake the rest
//outline clashes too much with other outlines and creates pretty ugly lines
target.add_filter(GLOW_NEBULA, 2, list("type" = "drop_shadow", "color" = radioactive_nebula.nebula_radglow, "size" = 2))
/datum/controller/subsystem/radioactive_nebula/fire()
irradiate_everything()
/// Loop through radioactive space (with lag checks) and make it all radioactive!
/datum/controller/subsystem/radioactive_nebula/proc/irradiate_everything()
for (var/area/area as anything in get_areas(radioactive_nebula.radioactive_areas))
for (var/turf/turf as anything in area.get_contained_turfs())
for (var/atom/movable/target as anything in turf)
fake_irradiate(target)
CHECK_TICK
/// Remove the fake radiation. The compontent we add to mobs handles its own removal
/datum/controller/subsystem/radioactive_nebula/proc/fake_unirradiate(atom/movable/leaver)
REMOVE_TRAIT(leaver, TRAIT_RADIOACTIVE_NEBULA_FAKE_IRRADIATED, REF(src))
leaver.remove_filter(GLOW_NEBULA)
#undef TRAIT_RADIOACTIVE_NEBULA_FAKE_IRRADIATED