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)