Files
Aurora.3/code/datums/observation/observation.dm
2017-10-17 20:39:50 -05:00

61 lines
1.7 KiB
Plaintext

/datum/observ
var/name = "Unnamed Event"
var/expected_type = /datum
var/list/listeners_assoc
/datum/observ/New()
all_observable_events.events += src
listeners_assoc = list()
..()
/datum/observ/proc/is_listening(var/eventSource, var/datum/procOwner, var/proc_call)
var/listeners = listeners_assoc[eventSource]
if(!listeners)
return FALSE
var/stored_proc_call = listeners[procOwner]
return stored_proc_call && (!proc_call || stored_proc_call == proc_call)
/datum/observ/proc/has_listeners(var/eventSource)
var/list/listeners = listeners_assoc[eventSource]
return LAZYLEN(listeners)
/datum/observ/proc/register(var/eventSource, var/datum/procOwner, var/proc_call)
if(!(eventSource && procOwner && procOwner))
return FALSE
if(istype(eventSource, /datum/observ))
return FALSE
if(!istype(eventSource, expected_type))
CRASH("Unexpected type. Expected [expected_type], was [eventSource]")
LAZYINITLIST(listeners_assoc[eventSource])
listeners_assoc[eventSource][procOwner] = proc_call
destroyed_event.register(procOwner, src, /datum/observ/proc/unregister)
return TRUE
/datum/observ/proc/unregister(var/eventSource, var/datum/procOwner)
if(!(eventSource && procOwner))
return FALSE
if(istype(eventSource, /datum/observ))
return FALSE
var/list/listeners = listeners_assoc[eventSource]
if(!listeners)
return FALSE
listeners -= procOwner
if (!listeners.len)
listeners_assoc -= eventSource
destroyed_event.unregister(procOwner, src)
return TRUE
/datum/observ/proc/raise_event(...)
if(!args.len)
return
var/listeners = listeners_assoc[args[1]]
if(!listeners)
return
for(var/listener in listeners)
call(listener, listeners[listener])(arglist(args))