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)