Ports Components from TG: "I don't actually know what I'm doing" edition (#8890)

God is with us.
This commit is contained in:
Matt Atlas
2020-05-19 20:59:50 +02:00
committed by GitHub
parent 9a4c257549
commit 0a162f61ee
30 changed files with 857 additions and 181 deletions
+3
View File
@@ -187,9 +187,12 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage
if(!istype(D))
del(D)
else if(isnull(D.gcDestroyed))
if (SEND_SIGNAL(D, COMSIG_PARENT_PREQDELETED, force)) // Give the components a chance to prevent their parent from being deleted
return
D.gcDestroyed = GC_CURRENTLY_BEING_QDELETED
var/start_time = world.time
var/hint = D.Destroy(force) // Let our friend know they're about to get fucked up.
SEND_SIGNAL(D, COMSIG_PARENT_QDELETING, force) // Let the (remaining) components know about the result of Destroy
if(world.time != start_time)
SSgarbage.sleptDestroy["[D.type]"]++
if(!D)
@@ -0,0 +1,58 @@
/var/datum/controller/subsystem/processing/dcs/SSdcs
/datum/controller/subsystem/processing/dcs
name = "Datum Component System"
flags = SS_NO_INIT
var/list/elements_by_type = list()
/datum/controller/subsystem/processing/dcs/New()
NEW_SS_GLOBAL(SSdcs)
/datum/controller/subsystem/processing/dcs/Recover()
comp_lookup = SSdcs.comp_lookup
/datum/controller/subsystem/processing/dcs/proc/GetElement(list/arguments)
var/datum/element/eletype = arguments[1]
var/element_id = eletype
if(!ispath(eletype, /datum/element))
CRASH("Attempted to instantiate [eletype] as a /datum/element")
if(initial(eletype.element_flags) & ELEMENT_BESPOKE)
element_id = GetIdFromArguments(arguments)
. = elements_by_type[element_id]
if(.)
return
. = elements_by_type[element_id] = new eletype
/****
* Generates an id for bespoke elements when given the argument list
* Generating the id here is a bit complex because we need to support named arguments
* Named arguments can appear in any order and we need them to appear after ordered arguments
* We assume that no one will pass in a named argument with a value of null
**/
/datum/controller/subsystem/processing/dcs/proc/GetIdFromArguments(list/arguments)
var/datum/element/eletype = arguments[1]
var/list/fullid = list("[eletype]")
var/list/named_arguments = list()
for(var/i in initial(eletype.id_arg_index) to length(arguments))
var/key = arguments[i]
var/value
if(istext(key))
value = arguments[key]
if(!(istext(key) || isnum(key)))
key = ref(key)
key = "[key]" // Key is stringified so numbers dont break things
if(!isnull(value))
if(!(istext(value) || isnum(value)))
value = ref(value)
named_arguments["[key]"] = value
else
fullid += "[key]"
if(length(named_arguments))
named_arguments = sortList(named_arguments)
fullid += named_arguments
return list2params(fullid)