From 6370705c0254059e3e0b1ba93ce2db6c4ee77c8b Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Tue, 17 Nov 2015 17:19:15 +0100 Subject: [PATCH 1/8] Multitool menu. Begins work on allowing the multitool to modify and alter more equipment than ever. --- baystation12.dme | 2 ++ code/datums/expansions/expansion.dm | 14 ++++++++++ code/datums/expansions/multitool/multitool.dm | 2 ++ code/game/atoms.dm | 2 +- code/game/machinery/cloning.dm | 6 ++--- code/game/machinery/computer/cloning.dm | 4 +-- .../telecomms/machine_interactions.dm | 25 +++++++++-------- code/game/objects/items/devices/multitool.dm | 27 +++++++++++++++++-- code/game/objects/items/weapons/cards_ids.dm | 6 +++-- code/game/objects/objs.dm | 5 ++++ 10 files changed, 72 insertions(+), 21 deletions(-) create mode 100644 code/datums/expansions/expansion.dm create mode 100644 code/datums/expansions/multitool/multitool.dm diff --git a/baystation12.dme b/baystation12.dme index d4c30f474d1..03a30853ba3 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -195,6 +195,8 @@ #include "code\datums\diseases\advance\symptoms\voice_change.dm" #include "code\datums\diseases\advance\symptoms\vomit.dm" #include "code\datums\diseases\advance\symptoms\weight.dm" +#include "code\datums\expansions\expansion.dm" +#include "code\datums\expansions\multitool\multitool.dm" #include "code\datums\helper_datums\construction_datum.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm" diff --git a/code/datums/expansions/expansion.dm b/code/datums/expansions/expansion.dm new file mode 100644 index 00000000000..1235467b37d --- /dev/null +++ b/code/datums/expansions/expansion.dm @@ -0,0 +1,14 @@ +/datum/expansion + +/datum/expansion + var/atom/holder = null // The holder + +/datum/expansion/New(var/atom/holder) + if(!istype(holder)) + CRASH() + src.holder = holder + ..() + +/datum/expansion/Destroy() + holder = null + return ..() diff --git a/code/datums/expansions/multitool/multitool.dm b/code/datums/expansions/multitool/multitool.dm new file mode 100644 index 00000000000..e5e1b51599c --- /dev/null +++ b/code/datums/expansions/multitool/multitool.dm @@ -0,0 +1,2 @@ +/datum/expansion/multitool/proc/interact() + return diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 77279ab1171..7d067165161 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -217,7 +217,7 @@ its easier to just keep the beam vertical. return /atom/proc/emag_act(var/remaining_charges, var/mob/user, var/emag_source) - return -1 + return NO_EMAG_ACT /atom/proc/fire_act() return diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 42b4f937a24..3c5f44ea6e3 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -241,7 +241,7 @@ user.visible_message("[user] unsecures [src] from the floor.", "You unsecure [src] from the floor.") else if(istype(W, /obj/item/device/multitool)) var/obj/item/device/multitool/M = W - M.connecting = src + M.set_buffer(src) user << "You load connection data from [src] to [M]." return else @@ -249,12 +249,12 @@ /obj/machinery/clonepod/emag_act(var/remaining_charges, var/mob/user) if(isnull(occupant)) - return + return NO_EMAG_ACT user << "You force an emergency ejection." locked = 0 go_out() return 1 - + //Put messages in the connected computer's temp var for display. /obj/machinery/clonepod/proc/connected_message(var/message) if((isnull(connected)) || (!istype(connected, /obj/machinery/computer/cloning))) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 857832d2f59..872a5ce8a54 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -72,8 +72,8 @@ return else if(istype(W, /obj/item/device/multitool)) var/obj/item/device/multitool/M = W - var/obj/machinery/clonepod/P = M.connecting - if(P && !(P in pods)) + var/obj/machinery/clonepod/P = M.get_buffer() + if(istype(P) && !(P in pods)) pods += P P.connected = src P.name = "[initial(P.name)] #[pods.len]" diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 2859083c9d6..8b3da2a7566 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -164,8 +164,9 @@ dat += "
" if(P) - if(P.buffer) - dat += "

MULTITOOL BUFFER: [P.buffer] ([P.buffer.id]) \[Link\] \[Flush\]" + var/obj/machinery/telecomms/device = P.get_buffer() + if(istype(device)) + dat += "

MULTITOOL BUFFER: [device] ([device.id])
\[Link\] \[Flush\]" else dat += "

MULTITOOL BUFFER:
\[Add Machine\]" @@ -365,28 +366,30 @@ if(href_list["link"]) if(P) - if(P.buffer && P.buffer != src) - if(!(src in P.buffer.links)) - P.buffer.links.Add(src) + var/obj/machinery/telecomms/device = P.get_buffer() + if(istype(device) && device != src) + if(!(src in device.links)) + device.links.Add(src) - if(!(P.buffer in src.links)) - src.links.Add(P.buffer) + if(!(device in src.links)) + src.links.Add(device) - temp = "-% Successfully linked with \ref[P.buffer] [P.buffer.name] %-" + temp = "-% Successfully linked with \ref[device] [device.name] %-" else temp = "-% Unable to acquire buffer %-" if(href_list["buffer"]) - P.buffer = src - temp = "-% Successfully stored \ref[P.buffer] [P.buffer.name] in buffer %-" + P.set_buffer(src) + var/atom/buffer = P.get_buffer() + temp = "-% Successfully stored \ref[buffer] [buffer.name] in buffer %-" if(href_list["flush"]) temp = "-% Buffer successfully flushed. %-" - P.buffer = null + P.set_buffer(null) src.Options_Topic(href, href_list) diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 867e64f4461..d53ab1f5bbd 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -19,5 +19,28 @@ matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 20) origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1) - var/obj/machinery/telecomms/buffer // simple machine buffer for device linkage - var/obj/machinery/clonepod/connecting //same for cryopod linkage \ No newline at end of file + + var/buffer_name + var/atom/buffer_object + +/obj/item/device/multitool/proc/get_buffer() + if(buffer_object) + return buffer_object + buffer_name = null + +/obj/item/device/multitool/proc/set_buffer(var/atom/buffer) + if(!buffer || istype(buffer)) + buffer_object = buffer + buffer_name = buffer ? buffer_name : null + +/obj/item/device/multitool/resolve_attackby(atom/A, mob/user) + if(!isobject(A)) + return ..(A, user) + + var/obj/O = A + var/datum/expansion/multitool/MT = O.expansions[/datum/expansion/multitool] + if(!MT) + return ..(A, user) + + MT.interact(src, user) + return 1 diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 53517d91b07..c4692484e20 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -70,14 +70,16 @@ origin_tech = list(TECH_MAGNET = 2, TECH_ILLEGAL = 2) var/uses = 10 +var/const/NO_EMAG_ACT = -50 /obj/item/weapon/card/emag/resolve_attackby(atom/A, mob/user) var/used_uses = A.emag_act(uses, user, src) - if(used_uses < 0) + if(used_uses == NO_EMAG_ACT) return ..(A, user) uses -= used_uses A.add_fingerprint(user) - log_and_message_admins("emagged \an [A].") + if(used_uses) + log_and_message_admins("emagged \an [A].") if(uses<1) user.visible_message("\The [src] fizzles and sparks - it seems it's been used once too often, and is now spent.") diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 51e97c66aa4..b40972a11ac 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -15,8 +15,13 @@ 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]) + expansions.Cut() return ..() /obj/Topic(href, href_list, var/datum/topic_state/state = default_state) From 8a4250ddcd2ea3df94f648d5fd20121f250e4c61 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Tue, 17 Nov 2015 22:58:10 +0100 Subject: [PATCH 2/8] Can now connect cryo pods and computers with each other using the new multitool methodology. Also cleans up Destroys(). --- baystation12.dme | 4 ++ code/_macros.dm | 2 + code/datums/expansions/expansion.dm | 10 +++ .../datums/expansions/multitool/_multitool.dm | 3 + code/datums/expansions/multitool/cloning.dm | 24 +++++++ code/datums/expansions/multitool/multitool.dm | 69 ++++++++++++++++++- code/datums/expansions/multitool/store.dm | 22 ++++++ .../datums/expansions/multitool/~multitool.dm | 3 + code/game/machinery/cloning.dm | 11 +-- code/game/machinery/computer/cloning.dm | 38 +++++++--- code/game/objects/items/devices/multitool.dm | 12 ++-- code/game/objects/objs.dm | 3 +- code/modules/mob/dead/observer/observer.dm | 7 ++ code/modules/mob/living/silicon/ai/ai.dm | 13 +++- code/modules/mob/mob_helpers.dm | 16 +++++ 15 files changed, 214 insertions(+), 23 deletions(-) create mode 100644 code/datums/expansions/multitool/_multitool.dm create mode 100644 code/datums/expansions/multitool/cloning.dm create mode 100644 code/datums/expansions/multitool/store.dm create mode 100644 code/datums/expansions/multitool/~multitool.dm diff --git a/baystation12.dme b/baystation12.dme index 03a30853ba3..93f012236b4 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -196,7 +196,11 @@ #include "code\datums\diseases\advance\symptoms\vomit.dm" #include "code\datums\diseases\advance\symptoms\weight.dm" #include "code\datums\expansions\expansion.dm" +#include "code\datums\expansions\multitool\_multitool.dm" +#include "code\datums\expansions\multitool\cloning.dm" #include "code\datums\expansions\multitool\multitool.dm" +#include "code\datums\expansions\multitool\store.dm" +#include "code\datums\expansions\multitool\~multitool.dm" #include "code\datums\helper_datums\construction_datum.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm" diff --git a/code/_macros.dm b/code/_macros.dm index b6ddf4f12ca..69376b6e5e1 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -23,6 +23,8 @@ #define isnewplayer(A) istype(A, /mob/new_player) +#define isobj(A) istype(A, /obj) + #define isobserver(A) istype(A, /mob/dead/observer) #define isorgan(A) istype(A, /obj/item/organ/external) diff --git a/code/datums/expansions/expansion.dm b/code/datums/expansions/expansion.dm index 1235467b37d..81c53b76dd1 100644 --- a/code/datums/expansions/expansion.dm +++ b/code/datums/expansions/expansion.dm @@ -12,3 +12,13 @@ /datum/expansion/Destroy() holder = null return ..() + +/datum/expansion/CanUseTopic(var/mob/user) + return holder && user && !user.incapacitated() ? STATUS_INTERACTIVE : STATUS_CLOSE + +/datum/expansion/Topic() + if(..()) + return 1 + if(CanUseTopic(usr) != STATUS_INTERACTIVE) + return 1 + return 0 diff --git a/code/datums/expansions/multitool/_multitool.dm b/code/datums/expansions/multitool/_multitool.dm new file mode 100644 index 00000000000..6ec2a8657e7 --- /dev/null +++ b/code/datums/expansions/multitool/_multitool.dm @@ -0,0 +1,3 @@ +#define MT_NOACTION 0 +#define MT_REFRESH 1 +#define MT_CLOSE 2 diff --git a/code/datums/expansions/multitool/cloning.dm b/code/datums/expansions/multitool/cloning.dm new file mode 100644 index 00000000000..fcda47aac45 --- /dev/null +++ b/code/datums/expansions/multitool/cloning.dm @@ -0,0 +1,24 @@ +/datum/expansion/multitool/cryo/get_interact_window(var/obj/item/device/multitool/M, var/mob/user) + return buffer(M) + +/datum/expansion/multitool/cryo/receive_buffer(var/obj/item/device/multitool/M, var/atom/buffer, var/mob/user) + var/obj/machinery/clonepod/P = M.get_buffer(/obj/machinery/clonepod) + var/obj/machinery/computer/cloning/C = holder + + if(!P) + user << "No valid connection data in \the [M] buffer." + return MT_NOACTION + + var/is_connected = (P in C.pods) + if(!is_connected) + if(C.connect_pod(P)) + user << "You connect \the [P] to \the [C]." + else + user << "You failed to connect \the [P] to \the [C]." + return MT_REFRESH + + if(C.release_pod(P)) + user << "You disconnect \the [P] from \the [C]." + else + user << "You failed to disconnect \the [P] from \the [C]." + return MT_REFRESH diff --git a/code/datums/expansions/multitool/multitool.dm b/code/datums/expansions/multitool/multitool.dm index e5e1b51599c..b95bb9f1659 100644 --- a/code/datums/expansions/multitool/multitool.dm +++ b/code/datums/expansions/multitool/multitool.dm @@ -1,2 +1,69 @@ -/datum/expansion/multitool/proc/interact() +/datum/expansion/multitool + var/window_x = 370 + var/window_y = 470 + +/datum/expansion/multitool/proc/interact(var/obj/item/device/multitool/M, var/mob/user) + if(!CanUseTopic(user)) + return + + var/html = get_interact_window(M, user) + if(html) + var/datum/browser/popup = new(usr, "multitool", holder.name, window_x, window_y) + popup.set_content(html) + popup.set_title_image(user.browse_rsc_icon(holder.icon, holder.icon_state)) + popup.open() + else + close_window(usr) + +/datum/expansion/multitool/proc/get_interact_window(var/obj/item/device/multitool/M, var/mob/user) + return + +/datum/expansion/multitool/proc/close_window(var/mob/user) + user << browse(null, "window=multitool") + +/datum/expansion/multitool/proc/buffer(var/obj/item/device/multitool/multitool) + . += "Buffer Memory:
" + if(multitool.buffer_name) + . += "[multitool.buffer_name] Send Purge
" + else + . += "No connection stored in the buffer." + +/datum/expansion/multitool/CanUseTopic(var/mob/user) + . = ..() + if(. == STATUS_CLOSE) + return + + return user.get_multitool() && user.Adjacent(holder) ? STATUS_INTERACTIVE : STATUS_CLOSE + +/datum/expansion/multitool/Topic(href, href_list) + if(..()) + close_window(usr) + return 1 + + var/mob/user = usr + var/obj/item/device/multitool/M = user.get_multitool() + if(href_list["send"]) + var/atom/buffer = locate(href_list["send"]) + . = send_buffer(M, buffer, user) + else if(href_list["purge"]) + M.set_buffer(null) + . = MT_REFRESH + else + . = OnTopic(href, href_list, user) + + switch(.) + if(MT_REFRESH) + interact(M, user) + if(MT_CLOSE) + close_window(user) + return 1 + +/datum/expansion/multitool/proc/OnTopic(href, href_list, usr) + return + +/datum/expansion/multitool/proc/send_buffer(var/obj/item/device/multitool/M, var/atom/buffer, var/mob/user) + if(M.buffer_object == buffer) + receive_buffer(M, buffer, user) + +/datum/expansion/multitool/proc/receive_buffer(var/obj/item/device/multitool/M, var/atom/buffer, var/mob/user) return diff --git a/code/datums/expansions/multitool/store.dm b/code/datums/expansions/multitool/store.dm new file mode 100644 index 00000000000..f41a8d9bf2f --- /dev/null +++ b/code/datums/expansions/multitool/store.dm @@ -0,0 +1,22 @@ +/datum/expansion/multitool/store + var/can_load_connection + +/datum/expansion/multitool/store/New(var/atom/holder, var/can_load_connection) + ..() + src.can_load_connection = can_load_connection + +/datum/expansion/multitool/store/CanUseTopic() + if(can_load_connection && !call(src, can_load_connection)()) + return STATUS_CLOSE + return ..() + +/datum/expansion/multitool/store/interact(var/obj/item/device/multitool/M, var/mob/user) + if(!CanUseTopic(user)) + return + + if(M.get_buffer() == holder) + M.set_buffer(null) + user << "You purge the connection data of \the [holder] from \the [M]." + else + M.set_buffer(holder) + user << "You load connection data from \the [holder] to \the [M]." diff --git a/code/datums/expansions/multitool/~multitool.dm b/code/datums/expansions/multitool/~multitool.dm new file mode 100644 index 00000000000..875f0e47cc0 --- /dev/null +++ b/code/datums/expansions/multitool/~multitool.dm @@ -0,0 +1,3 @@ +#undef MT_NOACTION +#undef MT_REFRESH +#undef MT_CLOSE diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 3c5f44ea6e3..1a14c9e59f9 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -57,6 +57,12 @@ RefreshParts() update_icon() + expansions[/datum/expansion/multitool] = new/datum/expansion/multitool/store(src) + +/obj/machinery/clonepod/Destroy() + if(connected) + connected.release_pod(src) + return ..() /obj/machinery/clonepod/attack_ai(mob/user as mob) @@ -239,11 +245,6 @@ user.visible_message("[user] secures [src] to the floor.", "You secure [src] to the floor.") else user.visible_message("[user] unsecures [src] from the floor.", "You unsecure [src] from the floor.") - else if(istype(W, /obj/item/device/multitool)) - var/obj/item/device/multitool/M = W - M.set_buffer(src) - user << "You load connection data from [src] to [M]." - return else ..() diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 872a5ce8a54..97b196df3ad 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -18,11 +18,12 @@ /obj/machinery/computer/cloning/initialize() ..() + expansions[/datum/expansion/multitool] = new/datum/expansion/multitool/cryo(src) updatemodules() /obj/machinery/computer/cloning/Destroy() releasecloner() - ..() + return ..() /obj/machinery/computer/cloning/proc/updatemodules() src.scanner = findscanner() @@ -52,6 +53,33 @@ P.name = initial(P.name) pods.Cut() +/obj/machinery/computer/cloning/proc/connect_pod(var/obj/machinery/clonepod/P) + if(P in pods) + return 0 + + if(P.connected) + P.connected.release_pod(P) + P.connected = src + pods += P + rename_pods() + + return 1 + +/obj/machinery/computer/cloning/proc/release_pod(var/obj/machinery/clonepod/P) + if(!(P in pods)) + return + + P.connected = null + P.name = initial(P.name) + pods -= P + rename_pods() + return 1 + +/obj/machinery/computer/cloning/proc/rename_pods() + for(var/i = 1 to pods.len) + var/atom/P = pods[i] + P.name = "[initial(P.name)] #[i]" + /obj/machinery/computer/cloning/proc/findcloner() var/num = 1 var/area/A = get_area(src) @@ -70,14 +98,6 @@ user << "You insert [W]." src.updateUsrDialog() return - else if(istype(W, /obj/item/device/multitool)) - var/obj/item/device/multitool/M = W - var/obj/machinery/clonepod/P = M.get_buffer() - if(istype(P) && !(P in pods)) - pods += P - P.connected = src - P.name = "[initial(P.name)] #[pods.len]" - user << "You connect [P] to [src]." else ..() return diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index d53ab1f5bbd..e383bd0d044 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -23,18 +23,20 @@ var/buffer_name var/atom/buffer_object -/obj/item/device/multitool/proc/get_buffer() - if(buffer_object) +/obj/item/device/multitool/proc/get_buffer(var/typepath) + // Update the buffer name only 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 + if(buffer_object && (!typepath || istype(buffer_object, typepath))) return buffer_object - buffer_name = null /obj/item/device/multitool/proc/set_buffer(var/atom/buffer) if(!buffer || istype(buffer)) buffer_object = buffer - buffer_name = buffer ? buffer_name : null + buffer_name = buffer ? buffer.name : null /obj/item/device/multitool/resolve_attackby(atom/A, mob/user) - if(!isobject(A)) + if(!isobj(A)) return ..(A, user) var/obj/O = A diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index b40972a11ac..dc9d37a93d5 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -21,7 +21,8 @@ processing_objects -= src for(var/expansion in expansions) qdel(expansions[expansion]) - expansions.Cut() + if(expansions) + expansions.Cut() return ..() /obj/Topic(href, href_list, var/datum/topic_state/state = default_state) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 3a73bffb700..d1b01b6c21e 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -29,6 +29,8 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images var/image/ghostimage = null //this mobs ghost image, for deleting and stuff var/ghostvision = 1 //is the ghost able to see things humans can't? var/seedarkness = 1 + + var/obj/item/device/multitool/ghost_multitool incorporeal_move = 1 /mob/dead/observer/New(mob/body) @@ -79,9 +81,14 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images if(!name) //To prevent nameless ghosts name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) real_name = name + + ghost_multitool = new(src) ..() /mob/dead/observer/Destroy() + qdel(ghost_multitool) + ghost_multitool = null + if (ghostimage) ghost_darkness_images -= ghostimage qdel(ghostimage) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 5d3cf1a74c7..6bbdc0aae1a 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -83,6 +83,8 @@ var/list/ai_verbs_default = list( var/custom_sprite = 0 // Whether the selected icon is custom var/carded + var/obj/item/device/multitool/ai_multitool + /mob/living/silicon/ai/proc/add_ai_verbs() src.verbs |= ai_verbs_default src.verbs |= silicon_subsystems @@ -173,7 +175,6 @@ var/list/ai_verbs_default = list( ai_list += src ..() - return /mob/living/silicon/ai/proc/on_mob_init() src << "You are playing the station's AI. The AI cannot move, but can interact with many objects while viewing them (through cameras)." @@ -201,9 +202,17 @@ var/list/ai_verbs_default = list( setup_icon() /mob/living/silicon/ai/Destroy() + qdel(aiPDA) + qdel(aiMulti) + qdel(aiRadio) + aiPDA = null + aiMulti = null + aiRadio = null + ai_list -= src qdel(eyeobj) - ..() + eyeobj = null + return ..() /mob/living/silicon/ai/proc/setup_icon() var/file = file2text("config/custom_sprites.txt") diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index fe4d6ed56de..4d2fc208cc0 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -570,3 +570,19 @@ proc/is_blind(A) return threatcount #undef SAFE_PERP + +/mob/proc/get_multitool(var/obj/item/device/multitool/P) + if(istype(P)) + return P + +mob/dead/observer/get_multitool() + return can_admin_interact() && ..(ghost_multitool) + +/mob/living/carbon/human/get_multitool() + return ..(get_active_hand()) + +/mob/living/silicon/robot/get_multitool() + return ..(get_active_hand()) + +/mob/living/silicon/ai/get_multitool() + return ..(aiMulti) From 47ece5081324e892921a5d74517d194ab0412ae8 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Wed, 18 Nov 2015 00:09:29 +0100 Subject: [PATCH 3/8] Allows the AI to utilize its multitool where applicable. --- code/_helpers/areas.dm | 2 +- code/_helpers/functional.dm | 18 ++++++++++--- code/_onclick/ai.dm | 7 ++++++ code/datums/expansions/expansion.dm | 2 +- code/datums/expansions/multitool/cloning.dm | 4 +-- code/datums/expansions/multitool/multitool.dm | 25 ++++++++++++++++--- code/datums/expansions/multitool/store.dm | 14 +---------- code/game/machinery/computer/cloning.dm | 2 +- code/game/machinery/machinery.dm | 6 +++++ code/game/objects/objs.dm | 7 +++--- code/modules/mob/living/silicon/ai/ai.dm | 12 +++++++-- code/modules/nano/interaction/base.dm | 2 +- code/modules/nano/nanoui.dm | 3 ++- 13 files changed, 70 insertions(+), 34 deletions(-) diff --git a/code/_helpers/areas.dm b/code/_helpers/areas.dm index b5987c0ce16..ccf7ea2f2a3 100644 --- a/code/_helpers/areas.dm +++ b/code/_helpers/areas.dm @@ -11,7 +11,7 @@ for(var/areapath in typesof(areatype)) var/area/A = locate(areapath) for(var/turf/T in A.contents) - if(!predicates || all_predicates_true(T, predicates)) + if(!predicates || all_predicates_true(list(T), predicates)) turfs += T return turfs diff --git a/code/_helpers/functional.dm b/code/_helpers/functional.dm index c5ecfb631a6..231b8a4d261 100644 --- a/code/_helpers/functional.dm +++ b/code/_helpers/functional.dm @@ -1,14 +1,24 @@ -/proc/all_predicates_true(var/input, var/list/predicates) +/proc/all_predicates_true(var/list/input, var/list/predicates) + functional_sanity(input, predicates) + for(var/i = 1 to predicates.len) - if(!call(predicates[i])(input)) + if(!call(predicates[i])(arglist(input))) return FALSE return TRUE -/proc/any_predicate_true(var/input, var/list/predicates) +/proc/any_predicate_true(var/list/input, var/list/predicates) + functional_sanity(input, predicates) + if(!predicates.len) return TRUE for(var/i = 1 to predicates.len) - if(call(predicates[i])(input)) + if(call(predicates[i])(arglist(input))) return TRUE return FALSE + +/proc/functional_sanity(var/list/input, var/list/predicates) + if(!istype(input)) + CRASH("Expected list input. Was [input ? "[input.type]" : "null"]") + if(!istype(predicates)) + CRASH("Expected predicate list. Was [predicates ? "[predicates.type]" : "null"]") diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index dfb6de5e911..7dcf1d4c7b3 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -54,6 +54,13 @@ if(control_disabled || !canClick()) return + if(multitool_mode && isobj(A)) + var/obj/O = A + var/datum/expansion/multitool/MT = O.expansions[/datum/expansion/multitool] + if(MT) + MT.interact(aiMulti, src) + return + if(aiCamera.in_camera_mode) aiCamera.camera_mode_off() aiCamera.captureimage(A, usr) diff --git a/code/datums/expansions/expansion.dm b/code/datums/expansions/expansion.dm index 81c53b76dd1..4c32e7c590c 100644 --- a/code/datums/expansions/expansion.dm +++ b/code/datums/expansions/expansion.dm @@ -14,7 +14,7 @@ return ..() /datum/expansion/CanUseTopic(var/mob/user) - return holder && user && !user.incapacitated() ? STATUS_INTERACTIVE : STATUS_CLOSE + return holder && user ? STATUS_INTERACTIVE : STATUS_CLOSE /datum/expansion/Topic() if(..()) diff --git a/code/datums/expansions/multitool/cloning.dm b/code/datums/expansions/multitool/cloning.dm index fcda47aac45..334c192ec7f 100644 --- a/code/datums/expansions/multitool/cloning.dm +++ b/code/datums/expansions/multitool/cloning.dm @@ -2,10 +2,10 @@ return buffer(M) /datum/expansion/multitool/cryo/receive_buffer(var/obj/item/device/multitool/M, var/atom/buffer, var/mob/user) - var/obj/machinery/clonepod/P = M.get_buffer(/obj/machinery/clonepod) + var/obj/machinery/clonepod/P = buffer var/obj/machinery/computer/cloning/C = holder - if(!P) + if(!istype(P)) user << "No valid connection data in \the [M] buffer." return MT_NOACTION diff --git a/code/datums/expansions/multitool/multitool.dm b/code/datums/expansions/multitool/multitool.dm index b95bb9f1659..8e7890b783b 100644 --- a/code/datums/expansions/multitool/multitool.dm +++ b/code/datums/expansions/multitool/multitool.dm @@ -1,9 +1,18 @@ /datum/expansion/multitool var/window_x = 370 var/window_y = 470 + var/list/interact_predicates + +/datum/expansion/multitool/New(var/atom/holder, var/list/can_interact_predicates) + ..() + interact_predicates = can_interact_predicates ? can_interact_predicates : list() + +/datum/expansion/multitool/Destroy() + interact_predicates.Cut() + return ..() /datum/expansion/multitool/proc/interact(var/obj/item/device/multitool/M, var/mob/user) - if(!CanUseTopic(user)) + if(CanUseTopic(user) != STATUS_INTERACTIVE) return var/html = get_interact_window(M, user) @@ -33,7 +42,14 @@ if(. == STATUS_CLOSE) return - return user.get_multitool() && user.Adjacent(holder) ? STATUS_INTERACTIVE : STATUS_CLOSE + if(!user.get_multitool()) + return STATUS_CLOSE + + if(!all_predicates_true(list(holder, user), interact_predicates)) + return STATUS_CLOSE + + var/datum/host = holder.nano_host() + return user.default_can_use_topic(host) /datum/expansion/multitool/Topic(href, href_list) if(..()) @@ -59,11 +75,12 @@ return 1 /datum/expansion/multitool/proc/OnTopic(href, href_list, usr) - return + return MT_NOACTION /datum/expansion/multitool/proc/send_buffer(var/obj/item/device/multitool/M, var/atom/buffer, var/mob/user) - if(M.buffer_object == buffer) + if(M.get_buffer() == buffer) receive_buffer(M, buffer, user) + return MT_REFRESH /datum/expansion/multitool/proc/receive_buffer(var/obj/item/device/multitool/M, var/atom/buffer, var/mob/user) return diff --git a/code/datums/expansions/multitool/store.dm b/code/datums/expansions/multitool/store.dm index f41a8d9bf2f..e07a39ad919 100644 --- a/code/datums/expansions/multitool/store.dm +++ b/code/datums/expansions/multitool/store.dm @@ -1,17 +1,5 @@ -/datum/expansion/multitool/store - var/can_load_connection - -/datum/expansion/multitool/store/New(var/atom/holder, var/can_load_connection) - ..() - src.can_load_connection = can_load_connection - -/datum/expansion/multitool/store/CanUseTopic() - if(can_load_connection && !call(src, can_load_connection)()) - return STATUS_CLOSE - return ..() - /datum/expansion/multitool/store/interact(var/obj/item/device/multitool/M, var/mob/user) - if(!CanUseTopic(user)) + if(CanUseTopic(user) != STATUS_INTERACTIVE) return if(M.get_buffer() == holder) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 97b196df3ad..e6a5f067412 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) + expansions[/datum/expansion/multitool] = new/datum/expansion/multitool/cryo(src, list(/proc/is_operable)) updatemodules() /obj/machinery/computer/cloning/Destroy() diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 6d69941b813..88c01677c2f 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -184,6 +184,9 @@ Class Procs: use_power(active_power_usage,power_channel, 1) return 1 +/proc/is_operable(var/obj/machinery/M, var/mob/user) + return istype(M) && M.operable() + /obj/machinery/proc/operable(var/additional_flags = 0) return !inoperable(additional_flags) @@ -191,12 +194,15 @@ Class Procs: return (stat & (NOPOWER|BROKEN|additional_flags)) /obj/machinery/CanUseTopic(var/mob/user) + world << "machinery can use" if(stat & BROKEN) return STATUS_CLOSE if(!interact_offline && (stat & NOPOWER)) + world << "Offline" return STATUS_CLOSE + world << "Checking base" return ..() /obj/machinery/CouldUseTopic(var/mob/user) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index dc9d37a93d5..50d65cbba7d 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -51,12 +51,11 @@ return 1 /obj/proc/CouldUseTopic(var/mob/user) - var/atom/host = nano_host() - if(!isAI(user) && host.Adjacent(user)) + if(!isAI(user) && src.Adjacent(user)) // We are -probably- in physical contact with the object, better than how Topics() previously did it and always applied fingerprints. - host.add_fingerprint(user) + add_fingerprint(user) else - host.add_hiddenprint(user) + add_hiddenprint(user) /obj/proc/CouldNotUseTopic(var/mob/user) // Nada diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 6bbdc0aae1a..ad706d9b048 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -23,7 +23,8 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/proc/sensor_mode, /mob/living/silicon/ai/proc/show_laws_verb, /mob/living/silicon/ai/proc/toggle_acceleration, - /mob/living/silicon/ai/proc/toggle_camera_light + /mob/living/silicon/ai/proc/toggle_camera_light, + /mob/living/silicon/ai/proc/multitool_mode ) //Not sure why this is necessary... @@ -83,7 +84,7 @@ var/list/ai_verbs_default = list( var/custom_sprite = 0 // Whether the selected icon is custom var/carded - var/obj/item/device/multitool/ai_multitool + var/multitool_mode = 0 /mob/living/silicon/ai/proc/add_ai_verbs() src.verbs |= ai_verbs_default @@ -680,6 +681,13 @@ var/list/ai_verbs_default = list( return ..() +/mob/living/silicon/ai/proc/multitool_mode() + set name = "Toggle Multitool Mode" + set category = "AI Commands" + + multitool_mode = !multitool_mode + src << "Multitool mode: [multitool_mode ? "E" : "Dise"]ngaged" + /mob/living/silicon/ai/updateicon() if(!selected_sprite) selected_sprite = default_ai_icon diff --git a/code/modules/nano/interaction/base.dm b/code/modules/nano/interaction/base.dm index ccd9f3740b3..cbc65f2e08c 100644 --- a/code/modules/nano/interaction/base.dm +++ b/code/modules/nano/interaction/base.dm @@ -2,7 +2,7 @@ return src /datum/proc/CanUseTopic(var/mob/user, var/datum/topic_state/state) - var/src_object = nano_host() + var/datum/src_object = nano_host() return state.can_use_topic(src_object, user) /datum/topic_state/proc/href_list(var/mob/user) diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index e90a562fefd..8bd56e8cc80 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -140,7 +140,8 @@ nanoui is used to open and update nano browser uis * @return nothing */ /datum/nanoui/proc/update_status(var/push_update = 0) - var/new_status = src_object.CanUseTopic(user, state) + var/datum/host = src_object.nano_host() + var/new_status = host.CanUseTopic(user, state) if(master_ui) new_status = min(new_status, master_ui.status) From 79016f6d44deb472a2c3e4939a90fe3e83ebc683 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sat, 21 Nov 2015 14:41:58 +0100 Subject: [PATCH 4/8] It is now possible to use a multitool to configure alert console circuits, and the available alarm sources. --- baystation12.dme | 4 +- code/datums/expansions/expansion.dm | 2 +- .../multitool/circuitboards/circuitboards.dm | 5 ++ .../multitool/circuitboards/stationalert.dm | 29 +++++++++++ code/datums/expansions/multitool/multitool.dm | 4 +- .../datums/expansions/multitool/~multitool.dm | 3 -- code/game/machinery/computer/station_alert.dm | 48 ++++++++++++------- code/game/machinery/machinery.dm | 5 +- .../circuitboards/computer/computer.dm | 14 +----- .../circuitboards/computer/station_alert.dm | 29 +++++++++++ code/modules/nano/modules/alarm_monitor.dm | 4 ++ code/stylesheet.dm | 3 ++ maps/exodus-1.dmm | 18 +++---- maps/exodus-2.dmm | 4 +- maps/exodus-5.dmm | 2 +- 15 files changed, 121 insertions(+), 53 deletions(-) create mode 100644 code/datums/expansions/multitool/circuitboards/circuitboards.dm create mode 100644 code/datums/expansions/multitool/circuitboards/stationalert.dm delete mode 100644 code/datums/expansions/multitool/~multitool.dm create mode 100644 code/game/objects/items/weapons/circuitboards/computer/station_alert.dm diff --git a/baystation12.dme b/baystation12.dme index 93f012236b4..acc96380681 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -200,7 +200,8 @@ #include "code\datums\expansions\multitool\cloning.dm" #include "code\datums\expansions\multitool\multitool.dm" #include "code\datums\expansions\multitool\store.dm" -#include "code\datums\expansions\multitool\~multitool.dm" +#include "code\datums\expansions\multitool\circuitboards\circuitboards.dm" +#include "code\datums\expansions\multitool\circuitboards\stationalert.dm" #include "code\datums\helper_datums\construction_datum.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm" @@ -691,6 +692,7 @@ #include "code\game\objects\items\weapons\circuitboards\computer\computer.dm" #include "code\game\objects\items\weapons\circuitboards\computer\holodeckcontrol.dm" #include "code\game\objects\items\weapons\circuitboards\computer\research.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\station_alert.dm" #include "code\game\objects\items\weapons\circuitboards\computer\supply.dm" #include "code\game\objects\items\weapons\circuitboards\computer\telecomms.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\biogenerator.dm" diff --git a/code/datums/expansions/expansion.dm b/code/datums/expansions/expansion.dm index 4c32e7c590c..936adc2cbd1 100644 --- a/code/datums/expansions/expansion.dm +++ b/code/datums/expansions/expansion.dm @@ -5,7 +5,7 @@ /datum/expansion/New(var/atom/holder) if(!istype(holder)) - CRASH() + CRASH("Invalid holder.") src.holder = holder ..() diff --git a/code/datums/expansions/multitool/circuitboards/circuitboards.dm b/code/datums/expansions/multitool/circuitboards/circuitboards.dm new file mode 100644 index 00000000000..318267a6a11 --- /dev/null +++ b/code/datums/expansions/multitool/circuitboards/circuitboards.dm @@ -0,0 +1,5 @@ +/datum/expansion/multitool/circuitboards/CanUseTopic(var/mob/user) + if(isAI(user)) // No remote AI access + return STATUS_CLOSE + + return ..() diff --git a/code/datums/expansions/multitool/circuitboards/stationalert.dm b/code/datums/expansions/multitool/circuitboards/stationalert.dm new file mode 100644 index 00000000000..e3546621480 --- /dev/null +++ b/code/datums/expansions/multitool/circuitboards/stationalert.dm @@ -0,0 +1,29 @@ +/datum/expansion/multitool/circuitboards/stationalert/get_interact_window(var/obj/item/device/multitool/M, var/mob/user) + var/obj/item/weapon/circuitboard/stationalert/SA = holder + . += "Alarm Sources
" + . += "" + for(var/datum/alarm_handler/AH in alarm_manager.all_handlers) + . += "" + . += "" + if(AH in SA.alarm_handlers) + . += "" + else + . += "" + . += "" + . += "
[AH.category]ActiveInactivateInactiveActivate
" + +/datum/expansion/multitool/circuitboards/stationalert/on_topic(href, href_list, usr) + var/obj/item/weapon/circuitboard/stationalert/SA = holder + if(href_list["add"]) + var/datum/alarm_handler/AH = locate(href_list["add"]) in alarm_manager.all_handlers + if(AH) + SA.alarm_handlers |= AH + return MT_REFRESH + + if(href_list["remove"]) + var/datum/alarm_handler/AH = locate(href_list["remove"]) in alarm_manager.all_handlers + if(AH) + SA.alarm_handlers -= AH + return MT_REFRESH + + return ..() diff --git a/code/datums/expansions/multitool/multitool.dm b/code/datums/expansions/multitool/multitool.dm index 8e7890b783b..5325ca32ca4 100644 --- a/code/datums/expansions/multitool/multitool.dm +++ b/code/datums/expansions/multitool/multitool.dm @@ -65,7 +65,7 @@ M.set_buffer(null) . = MT_REFRESH else - . = OnTopic(href, href_list, user) + . = on_topic(href, href_list, user) switch(.) if(MT_REFRESH) @@ -74,7 +74,7 @@ close_window(user) return 1 -/datum/expansion/multitool/proc/OnTopic(href, href_list, usr) +/datum/expansion/multitool/proc/on_topic(href, href_list, usr) return MT_NOACTION /datum/expansion/multitool/proc/send_buffer(var/obj/item/device/multitool/M, var/atom/buffer, var/mob/user) diff --git a/code/datums/expansions/multitool/~multitool.dm b/code/datums/expansions/multitool/~multitool.dm deleted file mode 100644 index 875f0e47cc0..00000000000 --- a/code/datums/expansions/multitool/~multitool.dm +++ /dev/null @@ -1,3 +0,0 @@ -#undef MT_NOACTION -#undef MT_REFRESH -#undef MT_CLOSE diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index 22c97a955ac..a5d5fc0525a 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -1,31 +1,44 @@ /obj/machinery/computer/station_alert - name = "Station Alert Console" + name = "station alert console" desc = "Used to access the station's automated alert system." icon_keyboard = "tech_key" icon_screen = "alert:0" light_color = "#e6ffff" - circuit = /obj/item/weapon/circuitboard/stationalert_engineering + circuit = /obj/item/weapon/circuitboard/stationalert var/datum/nano_module/alarm_monitor/alarm_monitor - var/monitor_type = /datum/nano_module/alarm_monitor/engineering + var/monitor_type + +/obj/machinery/computer/station_alert/engineering + monitor_type = /datum/nano_module/alarm_monitor/engineering /obj/machinery/computer/station_alert/security monitor_type = /datum/nano_module/alarm_monitor/security - circuit = /obj/item/weapon/circuitboard/stationalert_security /obj/machinery/computer/station_alert/all monitor_type = /datum/nano_module/alarm_monitor/all - circuit = /obj/item/weapon/circuitboard/stationalert_all -/obj/machinery/computer/station_alert/New() +/obj/machinery/computer/station_alert/initialize() ..() - alarm_monitor = new monitor_type(src) - alarm_monitor.register(src, /obj/machinery/computer/station_alert/update_icon) + if(monitor_type) + register(new monitor_type(src)) /obj/machinery/computer/station_alert/Destroy() - alarm_monitor.unregister(src) - qdel(alarm_monitor) - ..() + . = ..() + unregister() + +/obj/machinery/computer/station_alert/proc/register(var/datum/nano_module/alarm_monitor/monitor) + if(monitor.host != src) + return + + alarm_monitor = monitor + alarm_monitor.register(src, /obj/machinery/computer/station_alert/update_icon) + +/obj/machinery/computer/station_alert/proc/unregister() + if(alarm_monitor) + alarm_monitor.unregister(src) + qdel(alarm_monitor) + alarm_monitor = null /obj/machinery/computer/station_alert/attack_ai(mob/user) add_fingerprint(user) @@ -42,13 +55,14 @@ return /obj/machinery/computer/station_alert/interact(mob/user) - alarm_monitor.ui_interact(user) + if(alarm_monitor) + alarm_monitor.ui_interact(user) /obj/machinery/computer/station_alert/update_icon() + icon_screen = initial(icon_screen) if(!(stat & (BROKEN|NOPOWER))) - var/list/alarms = alarm_monitor.major_alarms() - if(alarms.len) - icon_screen = "alert:2" - else - icon_screen = initial(icon_screen) + if(alarm_monitor) + var/list/alarms = alarm_monitor.major_alarms() + if(alarms.len) + icon_screen = "alert:2" ..() diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 88c01677c2f..cbfccc04430 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -186,7 +186,7 @@ Class Procs: /proc/is_operable(var/obj/machinery/M, var/mob/user) return istype(M) && M.operable() - + /obj/machinery/proc/operable(var/additional_flags = 0) return !inoperable(additional_flags) @@ -194,15 +194,12 @@ Class Procs: return (stat & (NOPOWER|BROKEN|additional_flags)) /obj/machinery/CanUseTopic(var/mob/user) - world << "machinery can use" if(stat & BROKEN) return STATUS_CLOSE if(!interact_offline && (stat & NOPOWER)) - world << "Offline" return STATUS_CLOSE - world << "Checking base" return ..() /obj/machinery/CouldUseTopic(var/mob/user) diff --git a/code/game/objects/items/weapons/circuitboards/computer/computer.dm b/code/game/objects/items/weapons/circuitboards/computer/computer.dm index 0bc090f9962..d0c5c42bee7 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/computer.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/computer.dm @@ -1,5 +1,5 @@ #ifndef T_BOARD -#error T_BOARD macro is not defined but we need it! +#error T_BOARD macro is not defined but we need it! #endif /obj/item/weapon/circuitboard/message_monitor @@ -57,18 +57,6 @@ name = T_BOARD("employment records console") build_path = /obj/machinery/computer/skills -/obj/item/weapon/circuitboard/stationalert_engineering - name = T_BOARD("station alert console (engineering)") - build_path = /obj/machinery/computer/station_alert - -/obj/item/weapon/circuitboard/stationalert_security - name = T_BOARD("station alert console (security)") - build_path = /obj/machinery/computer/station_alert - -/obj/item/weapon/circuitboard/stationalert_all - name = T_BOARD("station alert console (all)") - build_path = /obj/machinery/computer/station_alert/all - /obj/item/weapon/circuitboard/atmos_alert name = T_BOARD("atmospheric alert console") build_path = /obj/machinery/computer/atmos_alert diff --git a/code/game/objects/items/weapons/circuitboards/computer/station_alert.dm b/code/game/objects/items/weapons/circuitboards/computer/station_alert.dm new file mode 100644 index 00000000000..c6e25de422a --- /dev/null +++ b/code/game/objects/items/weapons/circuitboards/computer/station_alert.dm @@ -0,0 +1,29 @@ +/obj/item/weapon/circuitboard/stationalert + name = T_BOARD("station alert console") + build_path = /obj/machinery/computer/station_alert + var/list/alarm_handlers + +/obj/item/weapon/circuitboard/stationalert/New() + alarm_handlers = new() + expansions[/datum/expansion/multitool] = new /datum/expansion/multitool/circuitboards/stationalert(src) + ..() + +/obj/item/weapon/circuitboard/stationalert/construct(var/obj/machinery/computer/station_alert/SA) + if(..(SA)) + SA.unregister() + + var/datum/nano_module/alarm_monitor/monitor = new(SA) + monitor.alarm_handlers.Cut() + for(var/alarm_handler in alarm_handlers) + monitor.alarm_handlers += alarm_handler + + SA.register(monitor) + return 1 + +/obj/item/weapon/circuitboard/stationalert/deconstruct(var/obj/machinery/computer/station_alert/SA) + if(..(SA)) + alarm_handlers.Cut() + if(SA.alarm_monitor) + for(var/alarm_handler in SA.alarm_monitor.alarm_handlers) + alarm_handlers += alarm_handler + return 1 diff --git a/code/modules/nano/modules/alarm_monitor.dm b/code/modules/nano/modules/alarm_monitor.dm index 29ae55b04ac..1b9fba82946 100644 --- a/code/modules/nano/modules/alarm_monitor.dm +++ b/code/modules/nano/modules/alarm_monitor.dm @@ -3,6 +3,10 @@ var/list_cameras = 0 // Whether or not to list camera references. A future goal would be to merge this with the enginering/security camera console. Currently really only for AI-use. var/list/datum/alarm_handler/alarm_handlers // The particular list of alarm handlers this alarm monitor should present to the user. +/datum/nano_module/alarm_monitor/New() + ..() + alarm_handlers = list() + /datum/nano_module/alarm_monitor/all/New() ..() alarm_handlers = alarm_manager.all_handlers diff --git a/code/stylesheet.dm b/code/stylesheet.dm index d42ac80b7c8..560da8000bf 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -95,6 +95,9 @@ h1.alert, h2.alert {color: #000000;} .interface {color: #330033;} +.good {color: #4f7529; font-weight: bold;} +.bad {color: #ee0000; font-weight: bold;} + BIG IMG.icon {width: 32px; height: 32px;} "} diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm index f96e39b30d9..5e0b0bfae73 100644 --- a/maps/exodus-1.dmm +++ b/maps/exodus-1.dmm @@ -5236,7 +5236,7 @@ "bWJ" = (/turf/simulated/floor/carpet,/area/engineering/break_room) "bWK" = (/obj/machinery/newscaster{pixel_y = -32},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = "CMO Office"; name = "CMO Office"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/medbay4) "bWL" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/tiled/white,/area/medical/medbay4) -"bWM" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/powermonitor{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/stationalert_engineering{pixel_x = 1; pixel_y = -1},/obj/item/weapon/circuitboard/security/engineering,/obj/item/weapon/circuitboard/atmos_alert{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plating,/area/storage/tech) +"bWM" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/powermonitor{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/stationalert{pixel_x = 1; pixel_y = -1},/obj/item/weapon/circuitboard/security/engineering,/obj/item/weapon/circuitboard/atmos_alert{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plating,/area/storage/tech) "bWN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled/white,/area/medical/medbay4) "bWO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/medbay4) "bWP" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/structure/disposalpipe/junction{dir = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/medbay4) @@ -5663,7 +5663,7 @@ "ceU" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/powered/pump/filled,/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/engineering/foyer) "ceV" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/powered/pump/filled,/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/engineering/foyer) "ceW" = (/obj/machinery/newscaster{pixel_x = 31; pixel_y = 3},/obj/effect/floor_decal/corner/yellow,/turf/simulated/floor/tiled,/area/engineering/foyer) -"ceX" = (/obj/machinery/computer/station_alert,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/engineering/break_room) +"ceX" = (/obj/machinery/computer/station_alert/engineering,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/engineering/break_room) "ceY" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/engineering/break_room) "ceZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/research_starboard) "cfa" = (/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/obj/structure/flora/pottedplant{icon_state = "plant-20"; tag = "icon-plant-22"},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/engineering/break_room) @@ -5840,8 +5840,11 @@ "cip" = (/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 4},/obj/machinery/atmospherics/unary/heater{dir = 2; icon_state = "heater"},/obj/effect/floor_decal/corner/purple{dir = 10},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora_storage) "ciq" = (/turf/simulated/wall,/area/engineering/locker_room) "cir" = (/obj/machinery/airlock_sensor/airlock_interior{id_tag = "eng_al_int_snsr"; master_tag = "engine_room_airlock"; pixel_y = 22; req_access = list(10)},/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_room) +"cis" = (/obj/machinery/computer/station_alert/engineering,/turf/simulated/floor/tiled,/area/engineering/foyer) +"cit" = (/obj/machinery/computer/station_alert/engineering,/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring) "ciu" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/black,/turf/simulated/floor/tiled/white,/area/rnd/xenobiology) "civ" = (/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora) +"ciw" = (/obj/machinery/computer/station_alert/engineering,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "cix" = (/obj/machinery/atmospherics/pipe/manifold/hidden/black{dir = 1},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora) "ciy" = (/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 10},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology/xenoflora) "ciz" = (/obj/structure/table/rack{dir = 1},/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/floor/plating,/area/maintenance/engineering) @@ -5903,6 +5906,7 @@ "cjD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/medical/surgery2) "cjE" = (/obj/structure/table/standard,/obj/item/weapon/FixOVein,/obj/item/device/radio/intercom{dir = 4; pixel_x = 22},/obj/item/weapon/surgicaldrill,/turf/simulated/floor/tiled/white,/area/medical/surgery2) "cjF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/medbay) +"cjG" = (/obj/machinery/computer/station_alert/engineering,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station) "cjH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/virologyaccess) "cjI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/virologyaccess) "cjJ" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/tiled/freezer,/area/rnd/xenobiology/xenoflora_storage) @@ -5932,7 +5936,6 @@ "ckh" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2_sensor"},/turf/simulated/floor/reinforced/nitrogen,/area/engineering/atmos) "cki" = (/obj/item/weapon/wirecutters,/turf/simulated/floor,/area/construction) "ckj" = (/obj/machinery/door/airlock/maintenance{name = "Engineering EVA Storage Maintainance"; req_access = list(12); req_one_access = list(11,24)},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/red,/turf/simulated/floor/tiled,/area/engineering/engine_eva) -"ckk" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/tiled,/area/engineering/foyer) "ckl" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/turf/simulated/floor/tiled,/area/engineering/foyer) "ckm" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/tape_roll,/turf/simulated/floor/tiled,/area/engineering/foyer) "ckn" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=AIE"; location = "AftH"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/tiled,/area/engineering/foyer) @@ -6241,7 +6244,6 @@ "cqg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) "cqh" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Station Engineer"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring) "cqi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring) -"cqj" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring) "cqk" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/disposalpipe/segment,/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering) "cql" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled,/area/engineering/workshop) "cqm" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/engineering/workshop) @@ -7030,7 +7032,6 @@ "cFs" = (/obj/machinery/computer/general_air_control/supermatter_core{frequency = 1438; input_tag = "cooling_in"; name = "Engine Cooling Control"; output_tag = "cooling_out"; pressure_setting = 100; sensors = list("engine_sensor" = "Engine Core")},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "cFt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/computer/power_monitor,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "cFu" = (/obj/machinery/computer/rcon,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) -"cFv" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "cFw" = (/obj/machinery/computer/security/engineering,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "cFx" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eng_al_c_snsr"; pixel_x = -25; pixel_y = 0},/obj/item/device/radio/intercom{dir = 2; pixel_y = -22},/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor/plating,/area/engineering/engine_airlock) "cFy" = (/obj/machinery/light/small{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/plating,/area/engineering/engine_airlock) @@ -7286,7 +7287,6 @@ "cKO" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "engineering_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/shuttle/constructionsite/station) "cKP" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "engineering_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/shuttle/constructionsite/station) "cKX" = (/turf/simulated/shuttle/wall,/area/shuttle/constructionsite/station) -"cLb" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station) "cLc" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "engineering_shuttle"; pixel_x = 0; pixel_y = 25; req_one_access = list(13,11,24); tag_door = "engineering_shuttle_hatch"},/obj/structure/bed/chair{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/station) "cLe" = (/obj/machinery/door/airlock/maintenance{name = "Drone Fabrication/Engine Waste Handling"; req_one_access = list(10,24)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cLf" = (/obj/machinery/door/airlock/hatch{icon_state = "door_locked"; id_tag = "engine_electrical_maintenance"; locked = 1; name = "Electrical Maintenance"; req_access = list(10)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engineering/engine_room) @@ -7480,12 +7480,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEaaaaaacfkcgUcgUcgUcgfcggcejcgicghcgkcgjcgncglcgqcgpcgtcgrcgwcgucgycgxcgAcgzcgCcgBbSUbSUbSUbSUbSUbSUbSUbSUcgFcgDcaqcgGcaqbTFcbIcbIctpctqctrcbIcbIcgHcgJcgIcfYcaEcaEcaEcaEcaEcaIcgKcgLcaIchwcgMchwbZycgQcgObZybYfbYfbVibVicfCcgTbYfccobYfbYfccpcdCcdCcdCcdDbYfcdLcgXcgWcgWcgYchacgZchcchbchechdchfchfchfchfchhchgchfchichfchjchkcdSchZchlchGcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgEchmchnchmcgEchochpchocgEchqchrchqcgEaaaaaacfscgUcgUcgfcgfchscejchuchtchWchvchychxchAchzchDchCchCchEchCcaubXXchFbYechHcfKchIchKchJchKchLchMciqciqciAciAciAciAbTFciGchNchOchOchQchPchSchRchUchTchXchVciachYchYcicciUcaIcaIcaIciecidcifbZybZybZybZycigbKMbVicijcihcikbYfccobYfaaaaaaaaaaaaaaaaaaaaacdLcincilcipciobSabPwciubUUcaBcivcixcivcivciyciHciCciJciIciJciKciLcdScmpciMcjxcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgEchmciNchmcgEchociOchocgEchqciPchqcgEaaaaaacfscgUcgfcgfcgfciQcgmciSciRchWciTciWciVciYciXcgociZcjbcjacjccaubXXcjdcgCcjecjhcjgcjicjicjicjjcjmcjkcjocmRcjqcjpciAbTFciGcjschOcjtcjvcjucubcjwcjAcjycngcjBcjDcjCchYcjEciUcjFcnwcnucjHceacjIcnEcdIcdIcdJcdIcdKbVibVibVibVibYfccobYfaaaaaaaaaaaaaaaaaaaaacdLcjKcjJcjMcjLckEcdOcjNcdOckGcjOcjQcjPcjPcjQcjScjRcjPcjTcjPcjUcjVcdScjXcjWcjYcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgEcjZckbckacgEckcckeckdcgEckfckhckgcgEaaaaafcfsckicgUcgfcgfcgfcejckMckKchWchWckjchWchWchWchWckkchCcklckmcauckocknckqckpcksckrckuckuckuckvckwckwckxciAcllckyclwckzciGckAchOckBckDckCckHckFckJckIckNckLckPckOchYckQciUcnVcnXclNckSckRckTclNclRclSclTbYfceQcdIcdIcdIcdIcdIcecbYfaaaaaaaaaaaaaaaaaaaaacdLckVckUcehckWcdOckZclbclacdSclccldcldcldcleclhclfcljclicldcldclkcdScgScobcmqcmraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgEcjZckbckacgEckcckeckdcgEckfckhckgcgEaaaaafcfsckicgUcgfcgfcgfcejckMckKchWchWckjchWchWchWchWcischCcklckmcauckocknckqckpcksckrckuckuckuckvckwckwckxciAcllckyclwckzciGckAchOckBckDckCckHckFckJckIckNckLckPckOchYckQciUcnVcnXclNckSckRckTclNclRclSclTbYfceQcdIcdIcdIcdIcdIcecbYfaaaaaaaaaaaaaaaaaaaaacdLckVckUcehckWcdOckZclbclacdSclccldcldcldcleclhclfcljclicldcldclkcdScgScobcmqcmraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafcgEclXciicmjcgEcmtciicEgcgEcmtciicEgcgEaaaaafcimcgUcgUcgfcgfclmcejcmvcmuclpclncluclrclvclvclyclxclvclzclAcauclCclBclEclDcfKclFclFclGckwclHclJclIclIciAcibclKcoyclOciGclPchOclQclYclVciGclZcmbcmaciUcmccmecmdchYcmfciUclLclMclNcnlcmgcnlclNaaaaaaaaabYfbYfbYfcnnclSclSclTbYfbYfaaaaaaaaaaaacdOcdOcdOcdOcdOcdOcdOcdOcdOcmhcmkcmicdScdScjncjlcjrcdScdScdScdScjzcjlcjrcdScdScnvcmlcnvaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbOaafaafaafaaaaafcnxaafcnxaafcKAaafcpfaafcKAaafcpfaafaafaaacejcmscmncgfcgfcmwcnDcmmclgcnycnmcmxcnzcnzcmycnzcnGcmzcmocnGcnJcmBcmAcmCcnMcnOcnOcnOcnOcmEcmDcnRcnRcnRcgscgscgscgscmFciGcmGcmHclQcmJcmIciGclZcmbcmKciUcmLcmMcmdcmOcmNciUclLclMclNcmQcmPcmSclNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacdOcmTcmVcmUcwlcmWcmYcmXcomcmZcnbcnacdOaapaafaafaafaafaaaaaaaaacncaaaaaaaaaaafcoscqscosaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafcnscnHcntcoucnNcowcovcoucoxcoDcovcoKcoEcpgcoLcnycnycnycnycnycnycnycnycnecndcnhcnfcnicpocnkcnjcnocnGcnqcnpcnrcnGcnCcnBcnFcnOcnKcnIcnPcnLcnScnQcpjcpbcpbcpkcpncpncpjcrvciGciGcpccnTciGciGciGcnUcmbcnWciUciUciUcnYcphciUciUclLcpiclNcoacnZcoaclNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafcdOcoccodcoccofcoecohcogcomcomcojcomcdOcdOaaaaaaaaaaafaafaaaaacaaaaaaaaaaaaaafaaacokaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaaaaaaaafcpBconcolcopcoocorcoqcozcotcoBcoAcoFcoCcoGcorcoIcoHcoMcoJcoOcoNcoQcoPcoScoRcoUcoTcoVcpGcoXcoWcoYcpHcpacoZcpdcpIcnCcpecplcnOcnScnScnScnScnScpmcpjcqPcqPcqPcpncpncpjbTFbPxciGcpqcppcpscprciGcptcmbcpuciUcpvcpxcpwcpyciUclMclLcpiclNcpAcpzcpCclNaaaaaaaaaaaaaaaaaacqvcpScqdcpZcqvaafaaaaaaaaaaaacdOcoccoccoccoicpDcpFcpEcpKcpJcpMcpLcpNcdOaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacpOaaaaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafcqtcpQcpPcpTcpRcorcpUcorcpVcpQcpUcorcpVcpQcorcorcorcorcorcpWcorcorcorcpYcpXcqbcqacqccpGcqfcqecqgcqwcqicqhcqjcqxcnCcpecqkcnOcqlcnScnScqmcnScqncpjcrIcrKcrJcrKcrLcpjbTFcrqciGcqpcqocqrcqqcqAcqucqCcqBcqFcqEcqHcqGcqIciUcrEcrFcrGcrHcqvcqJcqvcrHaaaaaaaafaaaaaaaaacqvcqKcqNcqMcqvaafaafaaaaaaaaacdOcomcomcomcomcqOcohcqQcqQcqQcmkcqQcqRcdOaaaaaaaaaaaaaaacrPcrPcrPcbOaafaafaafaafcqSaafaafaafaafaafaaqcrPcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafcqtcpQcpPcpTcpRcorcpUcorcpVcpQcpUcorcpVcpQcorcorcorcorcorcpWcorcorcorcpYcpXcqbcqacqccpGcqfcqecqgcqwcqicqhcitcqxcnCcpecqkcnOcqlcnScnScqmcnScqncpjcrIcrKcrJcrKcrLcpjbTFcrqciGcqpcqocqrcqqcqAcqucqCcqBcqFcqEcqHcqGcqIciUcrEcrFcrGcrHcqvcqJcqvcrHaaaaaaaafaaaaaaaaacqvcqKcqNcqMcqvaafaafaaaaaaaaacdOcomcomcomcomcqOcohcqQcqQcqQcmkcqQcqRcdOaaaaaaaaaaaaaaacrPcrPcrPcbOaafaafaafaafcqSaafaafaafaafaafaaqcrPcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcpBcorcqacorcqacorcpUcorcqTcqVcqUcqVcqWcqVcqVcqYcqXcorcorcracqZcqZcqZcrccrbcrdcrdcrecpGcrhcrfcricnGcrkcrjcrlcnGcrncrmcrocqycrrcrpcrtcrscnScrucpjcsxcrKcsycrKcrwcpjbTFcizciGcrycrxcrAcrzciGcfYcufcfYciUcrBcrDcrCcrNcrMcsIcrGcrGcqvcrQcrOcrRcqvcqvcqvcqvcqvcqvcqvcqvcrScrVcrTcqvcqvcqvcrHaaaaaacdOcmTcmVcmUcslcrWcpFcqQcqQcqQcmkcqQcrXcdOaaaaaaaaaaaaaaacrPaaaaafaaaaafaaaaaaaaacrYaaaaafaafaaaaaaaaaaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaacpBcorcqacorcrZcsbcsacsdcsccsecqUcqVcsfcqVcqVcsicshcskcsjcsncsmcspcsocsocsqcqacqacsrcqzcqDcsscnzcnGcstcnGcnGcnGcsvcsucrocqLcswcvtcsAcszcnScsBcpjcvOcrKcsycrKcvRcpjctvctwciGciGcsCciGciGciGciBclMcsDciUciUciUcsEciUciUcsIcrGaaacqvcsGcsFcsHctFcsKcsJcsMcsLcsOcsNcqvcuVcsPcuVcqvcsQcsRcqvaafaafcdOcoccoccoccsScoecsUcsTcsWcsVcsXcqQcsYcdOcdOcdOcdOaaaaaacrPaaacsZcsZcsZcsZcsZaafcrYaafcsZcsZcsZcsZcsZaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacpBcorcrZcsbcsbcsbcsacsbcsbcsbcsacsbcsbcsbcsbcsbctactbcsbctdctcctecsbcsbcsbctgctfcticthcorctkctmctlctoctncttctsctnctuctyctxctActzctzctBctzctCcrgctDcuAcuzcuBcuBcpjcuCcuDcwXcuFcuFctGctEctHcuJcuJcuJcuJcItcuJcuJcuJcuKcrFcrGaaactFctJctIctKctFctMctLctNctNctPctOctQctNctRctNcuVctSctNcqvaaaaaacdOcoccoccoccslctTctVctUctXctWctZcqQcqQcuacudcuccdOaafaafcrPaafcuecugcugcugcugcuhcrYcujcuicuicuicuicukaafcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7502,7 +7502,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaafaafaaaaaqaaaaaaaafcgEcmtciicEgcgEcmtciicEgcgEcmtciicEhcgEaaacgEcEgciicEhcgEaaaaafaaacDzcJCcDhcEkcEncDicEpcEocDkcDmcDpcDncDJcDqcDucDtcDwcDvcDJcDxcDCcDBcDraaaaaacAOcDGcDEcFiaaaaaabNUbPxbPxbNUcCacDHcDHcDHcCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcDLcDKcDNcDMctNctNctNcDOcqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackEcdOcdOcdOcdOcdOcdOcdOcdOcDRcDRcDRckEaaaaaacrPcrPcrPcrPcrPaaaaaaaaacpOaaaaaaaaacrPcrPcrPcbOcrPaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaaaaafaafaaIaaaaaaaafcgEcDScDUcDTcgEcDVcDXcDWcgEcDYcEacDZcgEaafcgEcEbcEdcEccgEaaaaafaaacDzcEVcCBcEncEncEecEYcEfcFacEicElcEjcEqcEmcEscErcEucEtcFpcFmcEvcFqcDraafaaacFJcKGcKFcAOcKHaaabNUbPxcKIcFNcFOaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrHcqvcqvcCEcEwcDdcDdcDdcExcCEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEycEycEyaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaafcEzaafcrPaaaaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaaaaafaafcgEcEAcEBcEAcgEcECcEEcECcgEcEFcEGcEFcgEaaacgEcEHcEHcEIcgEaaaaafaaacDzcBQcEKcEkcEncCCcFAcCFcDkcELcENcEMcDJcEOcEQcEPcEQcERcDJcEScFTcETcDraapcEWcEUcKPcKOcEUcEUcEXbNUciEciDcGjaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacCGcEZcFbcFbcFbcFccCGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaaaaafaaacrPaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaIaafaafaaacgEcEAcFdcEAcgEcECcFecECcgEcEFcFfcEFcgEaafcgEcEHcFgcEHcgEaafaafaafcFYcFXcFjcFhcFlcFkcGdcCFcDkcFncFrcFocDJcFscFucFtcFwcFvcDJcFxcGrcFycDraaacFzcKXcFDcFBcLccLbcFEcGFcGGcGHbNUaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcCHcqdcqdcqdcxwcqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcrPcrPcrPcrPaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaIaafaafaaacgEcEAcFdcEAcgEcECcFecECcgEcEFcFfcEFcgEaafcgEcEHcFgcEHcgEaafaafaafcFYcFXcFjcFhcFlcFkcGdcCFcDkcFncFrcFocDJcFscFucFtcFwciwcDJcFxcGrcFycDraaacFzcKXcFDcFBcLccjGcFEcGFcGGcGHbNUaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcCHcqdcqdcqdcxwcqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcrPcrPcrPcrPaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbOaaaaaacgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEaaacGscgEcgEcgEcgEaaaaaaaaaaaacBNcBNcBNcBNcBNcLecGtcGtcGtcGtcLfcGtcGwcGycGxcGycGzcGtcGtcLgcGtcGtcGtcFzcKXcFGcFFcLkcLjcLlaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaaaaaaaafaafaaaaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaafaaacGQcGRcGRcGRcGScFHcFIcGCcGIcFKcFLcGJcFMceJcFQcFPcFScFRcGVcGUcGXcGWcLpcFUcHbcircFUcGtcFzcKXcFWcFVcLucLtcFZaafaaacGQcHccGQcHccGQcHcaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafcGacGccGbaaacGacGccGbaaacGacGccGbaafaafaaaaafaafaafaafaafcHqcGRcGRcGRcGScFHcGecHecGgcGfcGhcHicGicHkcGlcGkcGncGmcHucHtcHucHucHucHvcHucHwcHxcGtcGocEUcEUcEUcEUcEUcGpaafaafcHycHycHycHycHycHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaczLczLczLczLczLczLczLczLczLczLczLczLczLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/exodus-2.dmm b/maps/exodus-2.dmm index 580720dae71..9cd6a868832 100644 --- a/maps/exodus-2.dmm +++ b/maps/exodus-2.dmm @@ -1829,6 +1829,7 @@ "Ji" = (/obj/item/target/syndicate,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/wizard_station) "Jj" = (/obj/item/target/alien,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/wizard_station) "Jk" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/wizard_station) +"Jl" = (/obj/machinery/computer/station_alert/all,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "Jr" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 0},/turf/unsimulated/wall,/area/centcom/holding) "Js" = (/obj/structure/table/woodentable,/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/milosoup,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "Jt" = (/obj/structure/table/woodentable,/obj/item/weapon/dice,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) @@ -1927,7 +1928,6 @@ "Ng" = (/obj/structure/AIcore/deactivated,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) "Nh" = (/obj/machinery/computer/security,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "Ni" = (/obj/machinery/computer/secure_data,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"Nj" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "Nk" = (/obj/machinery/computer/shuttle_control/emergency,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "Nl" = (/obj/machinery/computer/communications,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "Nm" = (/obj/machinery/computer/med_data,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) @@ -2105,7 +2105,7 @@ aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM mtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvAfAfAhAoAnAqApwDtvAsArwqtvxQyKtvwqArAsvlAFxQxQzFzDtvAGAKAJAGyPyXyTzaCNtxwAzbxRtxtxaMaMaMaMaMaMaMaMaMaMtxtxtxtxtxtxtxtxyuaMaMaMaMaMypuryNuPuPyOurypaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzzmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtwgmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmt dCdCdCdCdCdCdCdCdCdCdCAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZAZdCdCdCdCdCdCdCmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMtvtvtvtvtvtvtvtvtvtvtvtvtvtvzdzdtvtvtvtvtvBaxQxQzFzDtvAGBbBbAGyPzjyTzaCNzozmzqzpzrCNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMypururzLzLururypaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumumumumumumumudCBvBvBvBvBvAZBFBzBGAZBvBvBvBvBvBvBvBvBvBvBvmumudCmumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzyzNzNzNzNzBzBzNzNzPaMtvBNxQxQzFzDtvAGAJAJAGyPzjyTzaCNzEyTyTyTzHCNaMaMaMaMaMaMaMaMaMaMaMaMzMzKNaNaNazTzQaMaMaMaMaMtxzVururururzWtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumumumumumudCBvBvBvBvBvAZBRBzBzAZBvBvBvBvBvBvBvBvBvBvBvmumudCmumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzRzUzZAaBSAcAcAdjZzNzPtvtvxxxxtvtvtvlqAGAGAGzXzjyTzaCNAizYAiAjAiCNaMaMaMaMaMaMaMaMaMaMaMzMAkNiNjNkNlNmAlzQaMaMaMaMtxtxtxtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumumumumumudCBvBvBvBvBvAZBRBzBzAZBvBvBvBvBvBvBvBvBvBvBvmumudCmumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzRzUzZAaBSAcAcAdjZzNzPtvtvxxxxtvtvtvlqAGAGAGzXzjyTzaCNAizYAiAjAiCNaMaMaMaMaMaMaMaMaMaMaMzMAkNiJlNkNlNmAlzQaMaMaMaMtxtxtxtxtxtxtxtxaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumumumumuBvBvBvAZAZAZAZBvAZAZAZAZCgAZAZAZAZAZAZAZBvBvBvBvBvmumudCmumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzRAtAmAcAcAcAcAcAcCiChvlxQxQxQxQxQxNAGCjAGCjyPzjyTAuzXyTyTAwyTABCNaMaMaMaMaMaMaMaMaMaMzMAkCoAvADAvADAvCpAlzQaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumuBvBvBvBvCuCvBzBzBzBzBzBzBzBzBzBzBzBzBzBzBzBzAZBvBvBvBvBvmumudCmumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMzRAtCEAyAzjSAzAzAzzNAAvlxQxQxQxQxQyWAGCjAGCjyPzjyTAuzXyTyTAIAEALCNaMaMaMaMaMaMaMaMaMaMACADADADCANcDEADADADACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumuBvBvBzCFCuCFBzBzBzBzBzBzBzBzBzBzBzBzBzBzBzBzAZCHCGBvBvBvmumudCmumumumumtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAMzNzNzNzNzNzNzNzNAAaMvlxQxQxQxQxQtvAGCjAGCjyPAOANAPCNAiAQASARAiCNaMaMaMaMaMaMaMaMaMaMATCRBuNhAUNgAUNfCrCSATaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM diff --git a/maps/exodus-5.dmm b/maps/exodus-5.dmm index fcd2429f685..f6ce5113d5b 100644 --- a/maps/exodus-5.dmm +++ b/maps/exodus-5.dmm @@ -901,7 +901,7 @@ "rq" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light{dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/wood,/area/outpost/engineering/meeting) "rr" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) "rs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/engineering/power) -"rt" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/status_display{pixel_y = 32},/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Meeting Room"},/obj/machinery/computer/station_alert,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) +"rt" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/status_display{pixel_y = 32},/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Meeting Room"},/obj/machinery/computer/station_alert/engineering,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) "ru" = (/obj/structure/table/standard,/obj/random/tech_supply,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) "rv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/engineering/power) "rw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/effect/floor_decal/corner/yellow/diagonal{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) From e9d8e8972577bc5b08703deaa609e9ba45a9df2b Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Mon, 23 Nov 2015 09:12:08 +0100 Subject: [PATCH 5/8] The multitool now properly releases its buffer reference when the buffer is destroyed. --- .../multitool/circuitboards/stationalert.dm | 2 +- code/game/machinery/computer/station_alert.dm | 4 ++-- code/game/objects/items/devices/multitool.dm | 13 ++++++++++++- .../weapons/circuitboards/computer/station_alert.dm | 4 ++-- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/code/datums/expansions/multitool/circuitboards/stationalert.dm b/code/datums/expansions/multitool/circuitboards/stationalert.dm index e3546621480..f46fd6ac5b6 100644 --- a/code/datums/expansions/multitool/circuitboards/stationalert.dm +++ b/code/datums/expansions/multitool/circuitboards/stationalert.dm @@ -1,6 +1,6 @@ /datum/expansion/multitool/circuitboards/stationalert/get_interact_window(var/obj/item/device/multitool/M, var/mob/user) var/obj/item/weapon/circuitboard/stationalert/SA = holder - . += "Alarm Sources
" + . += "Alarm Sources
" . += "" for(var/datum/alarm_handler/AH in alarm_manager.all_handlers) . += "" diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index a5d5fc0525a..5845dcd5c39 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -27,14 +27,14 @@ . = ..() unregister() -/obj/machinery/computer/station_alert/proc/register(var/datum/nano_module/alarm_monitor/monitor) +/obj/machinery/computer/station_alert/proc/register_monitor(var/datum/nano_module/alarm_monitor/monitor) if(monitor.host != src) return alarm_monitor = monitor alarm_monitor.register(src, /obj/machinery/computer/station_alert/update_icon) -/obj/machinery/computer/station_alert/proc/unregister() +/obj/machinery/computer/station_alert/proc/unregister_monitor() if(alarm_monitor) alarm_monitor.unregister(src) qdel(alarm_monitor) diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index e383bd0d044..e7c1872af9d 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -32,8 +32,19 @@ /obj/item/device/multitool/proc/set_buffer(var/atom/buffer) if(!buffer || istype(buffer)) - buffer_object = buffer buffer_name = buffer ? buffer.name : null + if(buffer != buffer_object) + if(buffer_object) + buffer_object.unregister(OBSERVER_EVENT_DESTROY, src) + buffer_object = buffer + if(buffer_object) + buffer_object.register(OBSERVER_EVENT_DESTROY, src, /obj/item/device/multitool/proc/on_buffer_destroyed) + +/obj/item/device/multitool/proc/on_buffer_destroyed(var/atom/destroyed_buffer) + // Only remove the buffered object, don't reset the name + // This means one cannot know if the buffer has been destroyed until one attempts to use it. + if(destroyed_buffer == buffer_object) + buffer_object = null /obj/item/device/multitool/resolve_attackby(atom/A, mob/user) if(!isobj(A)) 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 c6e25de422a..4f3c5800859 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/station_alert.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/station_alert.dm @@ -10,14 +10,14 @@ /obj/item/weapon/circuitboard/stationalert/construct(var/obj/machinery/computer/station_alert/SA) if(..(SA)) - SA.unregister() + SA.unregister_monitor() var/datum/nano_module/alarm_monitor/monitor = new(SA) monitor.alarm_handlers.Cut() for(var/alarm_handler in alarm_handlers) monitor.alarm_handlers += alarm_handler - SA.register(monitor) + SA.register_monitor(monitor) return 1 /obj/item/weapon/circuitboard/stationalert/deconstruct(var/obj/machinery/computer/station_alert/SA) From 1fa2027a8e1f0f0254c1e16bcf5398fcf393d71d Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Mon, 30 Nov 2015 12:58:09 +0100 Subject: [PATCH 6/8] Changelog entry. --- html/changelogs/PsiOmegaDelta-MultitoolPower.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/PsiOmegaDelta-MultitoolPower.yml diff --git a/html/changelogs/PsiOmegaDelta-MultitoolPower.yml b/html/changelogs/PsiOmegaDelta-MultitoolPower.yml new file mode 100644 index 00000000000..d875108dd80 --- /dev/null +++ b/html/changelogs/PsiOmegaDelta-MultitoolPower.yml @@ -0,0 +1,7 @@ +author: PsiOmegaDelta +delete-after: True +changes: + - experiment: "Adds a system to allow objects to implement custom multitool interactions in a modular manner." + - rscadd: "The AI can now toggle multitool mode on/off, using the new 'Toggle Multitool Mode' verb." + - rscadd: "Cloning vats can now be connected to a cloning console by using a multitool." + - rscadd: "Station alert console circuits can now be altered using a multitool, changing which alarm types are displayed." From 4e8eb1f4dcbce1464ee2e4077b2b0a302756a524 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sat, 5 Dec 2015 17:16:18 +0100 Subject: [PATCH 7/8] Fixes #11569. --- code/game/machinery/computer/station_alert.dm | 2 +- maps/exodus-2.dmm | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index a596b9cdce4..691214198fb 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -7,7 +7,7 @@ light_color = "#e6ffff" circuit = /obj/item/weapon/circuitboard/stationalert var/datum/nano_module/alarm_monitor/alarm_monitor - var/monitor_type + var/monitor_type = /datum/nano_module/alarm_monitor /obj/machinery/computer/station_alert/engineering monitor_type = /datum/nano_module/alarm_monitor/engineering diff --git a/maps/exodus-2.dmm b/maps/exodus-2.dmm index 3372dc591ff..0be45f14764 100644 --- a/maps/exodus-2.dmm +++ b/maps/exodus-2.dmm @@ -609,7 +609,7 @@ "lK" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "vox_west_sensor"; pixel_x = 25},/turf/simulated/shuttle/plating,/area/skipjack_station/start) "lL" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{frequency = 1331; id_tag = "vox_west_vent"},/turf/simulated/shuttle/plating,/area/skipjack_station/start) "lM" = (/obj/machinery/computer/shuttle_control/multi/vox,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) -"lN" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) +"lN" = (/obj/machinery/computer/station_alert/all,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"}) "lO" = (/obj/machinery/button/remote/blast_door{id = "skipjackshutters"; name = "remote shutter control"; req_access = list(150)},/turf/simulated/wall/voxshuttle,/area/skipjack_station/start) "lP" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) "lQ" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "vox_east_sensor"; pixel_x = -25},/turf/simulated/shuttle/plating,/area/skipjack_station/start) @@ -1266,6 +1266,7 @@ "yr" = (/obj/structure/bed/chair,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/control) "ys" = (/turf/unsimulated/floor{icon_state = "white"},/area/centcom/control) "yt" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 8},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) +"yu" = (/obj/machinery/computer/station_alert/all,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) "yw" = (/obj/effect/floor_decal/corner/green{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) "yx" = (/obj/structure/table/rack,/obj/item/weapon/rig/merc/empty,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "yy" = (/obj/effect/floor_decal/corner/green{dir = 5},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/control) @@ -1846,7 +1847,6 @@ "JP" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/chawanmushi,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "JQ" = (/obj/structure/table/woodentable,/obj/item/weapon/spacecash/c1,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station) "JR" = (/obj/machinery/computer/shuttle_control/multi/vox,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"}) -"JS" = (/obj/machinery/computer/station_alert,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"}) "JU" = (/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/holding) "JW" = (/obj/structure/bed/chair{dir = 4},/obj/structure/closet/walllocker/emerglocker{pixel_x = -28},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "JY" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/item/weapon/tank/nitrogen,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"}) @@ -2120,14 +2120,14 @@ dCmuHmHAHzCuHBCuCumumuAZHCHIAZAZAZAZAZAZAZAZAZAZCgAZAZAZAZAZAZAZAZAZAZmumuaMaMmt dCmuIhCuImCuHzCuCumumuBvBvBvAZBzBzBzBzBzBzAZIqIGIGIGIIAZBzBzBzBzBzBzAZmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMjOBhBhBhBhBhBhBhBhBhBhBhBhBhBiBkBmBmAHDqDiDrCPCPDgyXCOyXyXyXyXDsAjAjAjyXDxDzDyCNaMaMCCBuADCrCMBuADCrCMBuADCrDAaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmuBvCuIXCuIYCuCumumuaMaMmuAZBzBFBzBzBzBzAZIGIGJaIGIGAZBzBzBzBzBFBzAZmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHJcJbJbCPCPCNAjAjDByXDCyXCwAjBxDDyXCTuVJrCNaMaMCMBuADCrCMBuNcCrCMBuADCrCMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmuBvJAJzCuCuJBCumumuaMaMmuAZBzBzBzBzBzBzCgIGIGJCIGIGCgBzBzBzBzBzBzAZmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJEJDJDJDJFJFCPCPCPCPJHCPCPCPCPCPCPCPCPCPCPNyCPCNBxAjDEyXyXyXCyAjAjAjyXDGzrDHCNaMaMDfBuADCrCMBuADCrCMBuADCrDfaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmuBvBvCuCuCuCuBvmumumAaMaMAZBzBzAZJMJOJNAZIGJSJRIGIGAZJMJOJNAZBzBzAZaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUJUJUJUJUJUDmDjDkDlCPDmDnDoDlCPCPCPCPCPCPCPCPCNBxAjDIyXyXyXyXCOyXyXyXyXyXCTAjAjAjAWJWADCrDfBuADCrDfBuADDJAWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmuBvBvCuCuCuCuBvmumumAaMaMAZBzBzAZJMJOJNAZIGlNJRIGIGAZJMJOJNAZBzBzAZaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUJUJUJUJUJUDmDjDkDlCPDmDnDoDlCPCPCPCPCPCPCPCPCNBxAjDIyXyXyXyXCOyXyXyXyXyXCTAjAjAjAWJWADCrDfBuADCrDfBuADDJAWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmuBvBvBvBvJYJZBvmumBmAaMaMAZBzBzAZaMaMaMAZAZJMJOJNAZAZaMaMaMAZBzBzAZaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUKaJUJUJUJUDmDtDuDlCPDmDvDwDlCPCPDKDKDKDKDKDKCNBxAjDSDRyXyXyXCOyXyXyXyXyXCTGTDpGTKcADADKdADADADADADKdADCrACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmuBvBvBvBvBvBvmuaMaMaMaMaMKiKjKjKsaMaMaMaMaMaMaMaMaMaMaMaMaMKiKjKjKsaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUKuJUJUJUJUCPCPCPCPNyCPCPCPCPCPCPDTDTDTDTDTDTCNCNCNCNKvDXDXCNCNCNCNAjAjAjAjAjAjAjDYACNNBezSzTKxzSzTBeNNACDZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumumumumumumumuaMaMaMaMKiKzKyKsaMaMaMaMaMaMaMaMaMaMaMaMaMKiKzKyKsaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUJUKAJUKBJUDmDNDODlCPDmDPDQDlCPCPEcEiEiEiEiEiCNEkEkEkEoDVDVEqEpEpCNBxBxBxBxCNaMaMAWNENFAWNHNIEaKDNJAWNLNGAWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumumumumumumuaMaMaMaMaMKiKzKyKsaMaMaMaMaMaMaMaMaMaMaMaMaMKiKzKyKsaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNKKJUJUKLJUJUDmEeEfDlCPDmEgEhDlCPCPEiEiEiEiEiEiCNEtEjEjElDVDVDVEpEpCNCNCNCNCNCNaMaMAWKNKMAWKONVEaEaKPAWKQKRAWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumumumumumumuaMaMaMaMaMlwKjKjlxaMaMaMlwaMaMaMaMaMlxaMaMaMlwKjKjlxaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNKUJUJUJUJUKuCPCPCPCPCPCPCPCPCPCPCPEiEiEuEwEvExCNDVDVDVDVEzEyDVDVEACNaMaMaMaMaMaMaMDYEBEBAWKYEaNREbEDAWEBEBDZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumumumuaMaMaMaMaMaMaMaMlylDlClyaMaMaMlylFlGlGlGlHlyaMaMaMlylIlJlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJULiLjKaLlLkEGEFEFEFEHEHEHEIEIEJEIEIEHEHEHCNCNCNEKDVDVEzEMELEyDVENCNaMaMaMaMaMaMaMEOEVEVDZEPEaEaEaEQDYEVEVERaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM -dCmumumumumuaMaMaMaMaMaMaMaMlylLlKlyaMaMlwlylylNlMlPlOlylxaMaMlylQlRlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUJUJULlLWEZEZEZEZEZEHESFeEIFeFeFeEIFeESEHCNCNCNCNCNCNETEWEUFbDVENCNaMaMaMaMaMaMaMaMaMaMEOBeEBEBEBBeERaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM +dCmumumumumuaMaMaMaMaMaMaMaMlylLlKlyaMaMlwlylyyulMlPlOlylxaMaMlylQlRlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJUJUJULlLWEZEZEZEZEZEHESFeEIFeFeFeEIFeESEHCNCNCNCNCNCNETEWEUFbDVENCNaMaMaMaMaMaMaMaMaMaMEOBeEBEBEBBeERaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumumumuaMaMaMaMaMaMaMaMlylTlSlyaMaMlylylUlWlVlWlXlylyaMaMlylYlZlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNMjJULlLWEZEZEZEZEZEZEHFeFdFcFeFeFeFcFfFeEHFgFiFhFkFjCNDVETFbFmDVDVFnaMaMaMaMaMaMaMaMaMaMaMEOEVEVEVERaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumumumuaMaMaMaMaMaMaMaMlymalylylylylymcmbmbmbmbmbmdlylylylylymelyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNJULlLWEZEZEZEZEZEZEZEHEIFeEIFeFeFeEIFeEIEHDVDVDVDVDVMuDVDVDVDVDVDVFnaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM dCmumumumumuaMaMaMaMaMaMaMaMlymgmfmjmhmllymmmbmbmbmbmbmmlymomnmqmpoTlyaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNLlLWEZEZEZEZEZEZEZEZEHFoFeFeFeFeFeFeFeFtEHFuDVFEDVFvCNDVDVDVDVDVFwFnaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM From 39f0fcebaa8fdcd6f56719ee04fcaad83f0b6014 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sat, 5 Dec 2015 22:51:41 +0100 Subject: [PATCH 8/8] 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)