41 lines
1.4 KiB
Plaintext
41 lines
1.4 KiB
Plaintext
PROCESSING_SUBSYSTEM_DEF(radiation)
|
|
name = "Radiation"
|
|
flags = SS_NO_INIT | SS_BACKGROUND
|
|
priority = 25
|
|
|
|
var/list/warned_atoms = list()
|
|
var/list/next_warn = list()
|
|
var/last_warn = 0
|
|
|
|
/datum/controller/subsystem/processing/radiation/proc/warn(datum/component/radioactive)
|
|
if(!radioactive || QDELETED(radioactive))
|
|
return
|
|
if(warned_atoms["\ref[radioactive.parent]"])
|
|
return
|
|
var/atom/master = radioactive.parent
|
|
SSblackbox.add_details("contaminated", "[master.type]")
|
|
next_warn["\ref[master]"] = "\ref[radioactive]"
|
|
var/wait_time = max(0, 500-(world.time-last_warn))+20 // wait at least 20 ticks, longer if we just messaged
|
|
addtimer(CALLBACK(src, .proc/send_warn), wait_time, TIMER_UNIQUE | TIMER_OVERRIDE)
|
|
|
|
/datum/controller/subsystem/processing/radiation/proc/send_warn()
|
|
var/msg = "Atom(s) have become contaminated by radiation and are strong enough they could pass it on:"
|
|
var/still_alive = FALSE
|
|
var/list/next_warn = src.next_warn // It's free performance!
|
|
for(var/i in next_warn)
|
|
var/atom/parent = locate(i)
|
|
var/datum/component/radioactive/radioactive = locate(next_warn[i])
|
|
if(!parent || !istype(parent) || !radioactive || !istype(radioactive))
|
|
continue
|
|
if(!still_alive)
|
|
msg += "\n"
|
|
still_alive = TRUE
|
|
else
|
|
msg += ", "
|
|
msg += "[parent][ADMIN_VV(parent)]source:[radioactive.source]"
|
|
if(!still_alive)
|
|
return
|
|
warned_atoms += next_warn
|
|
src.next_warn = list()
|
|
last_warn = world.time
|
|
message_admins(msg) |