Files
Yogstation/code/controllers/subsystem/augury.dm
XDTM 76b5ee3966 Xenobiology Species Rework (#34166)
I've always found grating that xenobiology had access to species they had no business working with, and slime magic can only explain so much. My idea is to separate those species into their respective departments/antags, instead of having them all into a centralized, cheap source.

    Androids should be made by robotics through augmentation
    Podpeople are a botany feature
    Skeletons should be limited to liches or other magic antags
    Zombies should stay limited to romerol
    Golems are still available in adamantine slimes (and luminescents can morph into golems with them)
    Shadowpeople still lack an official place, but luminescents can become shadowpeople with black cores

The basic races are mostly human and lizard, and there are mutation toxins for those in case someone wants their species back after bodyswapping/ling mutation sting/etc.
2018-01-16 11:07:06 +13:00

85 lines
2.2 KiB
Plaintext

SUBSYSTEM_DEF(augury)
name = "Augury"
flags = SS_NO_INIT
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
var/list/watchers = list()
var/list/doombringers = list()
var/list/observers_given_action = list()
/datum/controller/subsystem/augury/stat_entry(msg)
..("W:[watchers.len]|D:[doombringers.len]")
/datum/controller/subsystem/augury/proc/register_doom(atom/A, severity)
doombringers[A] = severity
/datum/controller/subsystem/augury/proc/unregister_doom(atom/A)
doombringers -= A
/datum/controller/subsystem/augury/fire()
var/biggest_doom = null
var/biggest_threat = null
for(var/db in doombringers)
var/datum/d = db
if(!d || QDELETED(d))
doombringers -= d
continue
var/threat = doombringers[d]
if((biggest_threat == null) || (biggest_threat < threat))
biggest_doom = d
biggest_threat = threat
if(doombringers.len)
for(var/i in GLOB.player_list)
if(isobserver(i) && (!(observers_given_action[i])))
var/datum/action/innate/augury/A = new
A.Grant(i)
observers_given_action[i] = TRUE
else
for(var/i in observers_given_action)
if(observers_given_action[i] && isobserver(i))
var/mob/dead/observer/O = i
for(var/datum/action/innate/augury/A in O.actions)
qdel(A)
observers_given_action -= i
for(var/w in watchers)
if(!w)
watchers -= w
continue
var/mob/dead/observer/O = w
if(biggest_doom && (!O.orbiting || O.orbiting.orbiting != biggest_doom))
O.ManualFollow(biggest_doom)
/datum/action/innate/augury
name = "Auto Follow Debris"
icon_icon = 'icons/obj/meteor.dmi'
button_icon_state = "flaming"
background_icon_state = ACTION_BUTTON_DEFAULT_BACKGROUND
/datum/action/innate/augury/Destroy()
if(owner)
SSaugury.watchers -= owner
return ..()
/datum/action/innate/augury/Activate()
SSaugury.watchers += owner
to_chat(owner, "<span class='notice'>You are now auto-following debris.</span>")
active = TRUE
UpdateButtonIcon()
/datum/action/innate/augury/Deactivate()
SSaugury.watchers -= owner
to_chat(owner, "<span class='notice'>You are no longer auto-following debris.</span>")
active = FALSE
UpdateButtonIcon()
/datum/action/innate/augury/UpdateButtonIcon(status_only = FALSE, force)
..()
if(active)
button.icon_state = "template_active"
else
button.icon_state = "template"