From 39f0fcebaa8fdcd6f56719ee04fcaad83f0b6014 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sat, 5 Dec 2015 22:51:41 +0100 Subject: [PATCH] Extension additions and multitool menu tweaks. Relocates obj extension code to the extension file. Adds a support method, set_extension, to ensure that proper cleanup occurs in the case of multiple additions to the same extension type. The default multitool menu title is now much shorter. The cloning computer multitool menu now lists all connected cloning pods. --- code/datums/expansions/expansion.dm | 19 ++++++++++++++++--- code/datums/expansions/multitool/cloning.dm | 6 +++++- code/datums/expansions/multitool/multitool.dm | 13 ++++++++----- code/game/machinery/cloning.dm | 2 +- code/game/machinery/computer/cloning.dm | 2 +- code/game/objects/items/devices/multitool.dm | 11 +++++++++-- .../circuitboards/computer/station_alert.dm | 2 +- code/game/objects/objs.dm | 6 ------ 8 files changed, 41 insertions(+), 20 deletions(-) diff --git a/code/datums/expansions/expansion.dm b/code/datums/expansions/expansion.dm index 936adc2cbd1..8e92e53bdc7 100644 --- a/code/datums/expansions/expansion.dm +++ b/code/datums/expansions/expansion.dm @@ -1,7 +1,5 @@ /datum/expansion - -/datum/expansion - var/atom/holder = null // The holder + var/datum/holder = null // The holder /datum/expansion/New(var/atom/holder) if(!istype(holder)) @@ -22,3 +20,18 @@ if(CanUseTopic(usr) != STATUS_INTERACTIVE) return 1 return 0 + +/obj + var/list/datum/expansion/expansions = list() + +/obj/Destroy() + if(expansions) + for(var/expansion in expansions) + qdel(expansions[expansion]) + expansions.Cut() + return ..() + +/obj/proc/set_expansion(var/type, var/instance) + if(expansions[type]) + qdel(expansions[type]) + expansions[type] = instance diff --git a/code/datums/expansions/multitool/cloning.dm b/code/datums/expansions/multitool/cloning.dm index 334c192ec7f..aeea22ef1e1 100644 --- a/code/datums/expansions/multitool/cloning.dm +++ b/code/datums/expansions/multitool/cloning.dm @@ -1,5 +1,9 @@ /datum/expansion/multitool/cryo/get_interact_window(var/obj/item/device/multitool/M, var/mob/user) - return buffer(M) + . += buffer(M) + . += "
Connected Cloning Pods:
" + var/obj/machinery/computer/cloning/C = holder + for(var/atom/cloning_pod in C.pods) + . += "[cloning_pod.name]
" /datum/expansion/multitool/cryo/receive_buffer(var/obj/item/device/multitool/M, var/atom/buffer, var/mob/user) var/obj/machinery/clonepod/P = buffer diff --git a/code/datums/expansions/multitool/multitool.dm b/code/datums/expansions/multitool/multitool.dm index 5325ca32ca4..8a2b8226171 100644 --- a/code/datums/expansions/multitool/multitool.dm +++ b/code/datums/expansions/multitool/multitool.dm @@ -17,9 +17,9 @@ var/html = get_interact_window(M, user) if(html) - var/datum/browser/popup = new(usr, "multitool", holder.name, window_x, window_y) + var/datum/browser/popup = new(usr, "multitool", "Multitool Menu", window_x, window_y) popup.set_content(html) - popup.set_title_image(user.browse_rsc_icon(holder.icon, holder.icon_state)) + popup.set_title_image(user.browse_rsc_icon(M.icon, M.icon_state)) popup.open() else close_window(usr) @@ -32,8 +32,9 @@ /datum/expansion/multitool/proc/buffer(var/obj/item/device/multitool/multitool) . += "Buffer Memory:
" - if(multitool.buffer_name) - . += "[multitool.buffer_name] Send Purge
" + var/buffer_name = multitool.get_buffer_name() + if(buffer_name) + . += "[buffer_name] Send Purge
" else . += "No connection stored in the buffer." @@ -78,8 +79,10 @@ return MT_NOACTION /datum/expansion/multitool/proc/send_buffer(var/obj/item/device/multitool/M, var/atom/buffer, var/mob/user) - if(M.get_buffer() == buffer) + if(M.get_buffer() == buffer && buffer) receive_buffer(M, buffer, user) + else if(!buffer) + user << "Unable to acquire data from the buffered object. Purging from memory." return MT_REFRESH /datum/expansion/multitool/proc/receive_buffer(var/obj/item/device/multitool/M, var/atom/buffer, var/mob/user) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index c6903b9c663..29deac78e16 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -57,7 +57,7 @@ RefreshParts() update_icon() - expansions[/datum/expansion/multitool] = new/datum/expansion/multitool/store(src) + set_expansion(/datum/expansion/multitool, new/datum/expansion/multitool/store(src)) /obj/machinery/clonepod/Destroy() if(connected) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index e6a5f067412..69400c1ffdb 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -18,7 +18,7 @@ /obj/machinery/computer/cloning/initialize() ..() - expansions[/datum/expansion/multitool] = new/datum/expansion/multitool/cryo(src, list(/proc/is_operable)) + set_expansion(/datum/expansion/multitool, new/datum/expansion/multitool/cryo(src, list(/proc/is_operable))) updatemodules() /obj/machinery/computer/cloning/Destroy() diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index e7c1872af9d..a804041694a 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -24,12 +24,19 @@ var/atom/buffer_object /obj/item/device/multitool/proc/get_buffer(var/typepath) - // Update the buffer name only when someone fetches the buffer. + // Only allow clearing the buffer name when someone fetches the buffer. // Means you cannot be sure the source hasn't been destroyed until the very moment it's needed. - buffer_name = buffer_object ? buffer_object.name : null + get_buffer_name(TRUE) if(buffer_object && (!typepath || istype(buffer_object, typepath))) return buffer_object +/obj/item/device/multitool/proc/get_buffer_name(var/null_name_if_missing = FALSE) + if(buffer_object) + buffer_name = buffer_object.name + else if(null_name_if_missing) + buffer_name = null + return buffer_name + /obj/item/device/multitool/proc/set_buffer(var/atom/buffer) if(!buffer || istype(buffer)) buffer_name = buffer ? buffer.name : null diff --git a/code/game/objects/items/weapons/circuitboards/computer/station_alert.dm b/code/game/objects/items/weapons/circuitboards/computer/station_alert.dm index 4f3c5800859..7eca3b4bf87 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/station_alert.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/station_alert.dm @@ -5,7 +5,7 @@ /obj/item/weapon/circuitboard/stationalert/New() alarm_handlers = new() - expansions[/datum/expansion/multitool] = new /datum/expansion/multitool/circuitboards/stationalert(src) + set_expansion(/datum/expansion/multitool, new/datum/expansion/multitool/circuitboards/stationalert(src)) ..() /obj/item/weapon/circuitboard/stationalert/construct(var/obj/machinery/computer/station_alert/SA) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 063c9c7693f..69d10e00e02 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -14,14 +14,8 @@ var/force = 0 var/armor_penetration = 0 - var/list/datum/expansion/expansions = list() - /obj/Destroy() processing_objects -= src - for(var/expansion in expansions) - qdel(expansions[expansion]) - if(expansions) - expansions.Cut() return ..() /obj/Topic(href, href_list, var/datum/topic_state/state = default_state)