mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-28 18:11:16 +00:00
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
65 lines
2.7 KiB
Plaintext
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
|