diff --git a/code/ATMOSPHERICS/components/binary_devices/circulator.dm b/code/ATMOSPHERICS/components/binary_devices/circulator.dm
index e2dd952213a..5574f97ea66 100644
--- a/code/ATMOSPHERICS/components/binary_devices/circulator.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/circulator.dm
@@ -98,16 +98,16 @@
else
return "South"
-/obj/machinery/atmospherics/binary/circulator/attackby(obj/item/W as obj, mob/user as mob, params)
- if(ismultitool(W))
- if(side_inverted == 0)
- side_inverted = 1
- else
- side_inverted = 0
- to_chat(user, "You reverse the circulator's valve settings. The inlet of the circulator is now on the [get_inlet_side(dir)] side.")
- desc = "A gas circulator pump and heat exchanger. Its input port is on the [get_inlet_side(dir)] side, and its output port is on the [get_outlet_side(dir)] side."
+/obj/machinery/atmospherics/binary/circulator/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(!side_inverted)
+ side_inverted = TRUE
else
- return ..()
+ side_inverted = FALSE
+ to_chat(user, "You reverse the circulator's valve settings. The inlet of the circulator is now on the [get_inlet_side(dir)] side.")
+ desc = "A gas circulator pump and heat exchanger. Its input port is on the [get_inlet_side(dir)] side, and its output port is on the [get_outlet_side(dir)] side."
/obj/machinery/atmospherics/binary/circulator/update_icon()
..()
diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
index 1b920002227..afdca1d19ce 100644
--- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
@@ -344,27 +344,6 @@
playsound(loc, 'sound/weapons/bladeslice.ogg', 100, TRUE)
/obj/machinery/atmospherics/unary/vent_pump/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = W
- if(WT.remove_fuel(0,user))
- to_chat(user, "Now welding the vent.")
- if(do_after(user, 20 * WT.toolspeed, target = src))
- if(!src || !WT.isOn()) return
- playsound(src.loc, WT.usesound, 50, 1)
- if(!welded)
- user.visible_message("[user] welds the vent shut.", "You weld the vent shut.", "You hear welding.")
- welded = 1
- update_icon()
- else
- user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.")
- welded = 0
- update_icon()
- else
- to_chat(user, "The welding tool needs to be on to start this task.")
- return 1
- else
- to_chat(user, "You need more welding fuel to complete this task.")
- return 1
if(istype(W, /obj/item/screwdriver))
if(!welded)
if(open)
@@ -400,6 +379,23 @@
return ..()
+/obj/machinery/atmospherics/unary/vent_pump/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ WELDER_ATTEMPT_WELD_MESSAGE
+ if(I.use_tool(src, user, 20, volume = I.tool_volume))
+ if(!welded)
+ welded = TRUE
+ visible_message("[user] welds [src] shut!",\
+ "You weld [src] shut!")
+ else
+ welded = FALSE
+ visible_message("[user] unwelds [src]!",\
+ "You unweld [src]!")
+ update_icon()
+
+
/obj/machinery/atmospherics/unary/vent_pump/attack_hand()
if(!welded)
if(open)
diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
index 5fcf7817a30..d9aff36688b 100644
--- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
@@ -393,27 +393,6 @@
playsound(loc, 'sound/weapons/bladeslice.ogg', 100, TRUE)
/obj/machinery/atmospherics/unary/vent_scrubber/attackby(var/obj/item/W as obj, var/mob/user as mob, params)
- if(istype(W, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = W
- if(WT.remove_fuel(0,user))
- to_chat(user, "Now welding the scrubber.")
- if(do_after(user, 20 * WT.toolspeed, target = src))
- if(!src || !WT.isOn()) return
- playsound(get_turf(src), WT.usesound, 50, 1)
- if(!welded)
- user.visible_message("[user] welds the scrubber shut.", "You weld the vent scrubber.", "You hear welding.")
- welded = 1
- update_icon()
- else
- user.visible_message("[user] unwelds the scrubber.", "You unweld the scrubber.", "You hear welding.")
- welded = 0
- update_icon()
- else
- to_chat(user, "The welding tool needs to be on to start this task.")
- return 1
- else
- to_chat(user, "You need more welding fuel to complete this task.")
- return 1
if(istype(W, /obj/item/multitool))
update_multitool_menu(user)
return 1
@@ -423,3 +402,19 @@
return 1
return ..()
+
+/obj/machinery/atmospherics/unary/vent_scrubber/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ WELDER_ATTEMPT_WELD_MESSAGE
+ if(I.use_tool(src, user, 20, volume = I.tool_volume))
+ if(!welded)
+ welded = TRUE
+ visible_message("[user] welds [src] shut!",\
+ "You weld [src] shut!")
+ else
+ welded = FALSE
+ visible_message("[user] unwelds [src]!",\
+ "You unweld [src]!")
+ update_icon()
diff --git a/code/__DEFINES/tools.dm b/code/__DEFINES/tools.dm
new file mode 100644
index 00000000000..d0204e1d013
--- /dev/null
+++ b/code/__DEFINES/tools.dm
@@ -0,0 +1,46 @@
+#define TOOL_CROWBAR "crowbar"
+#define TOOL_MULTITOOL "multitool"
+#define TOOL_SCREWDRIVER "screwdriver"
+#define TOOL_WIRECUTTER "wirecutter"
+#define TOOL_WRENCH "wrench"
+#define TOOL_WELDER "welder"
+
+#define MIN_TOOL_SOUND_DELAY 20
+
+//Crowbar messages
+#define CROWBAR_ATTEMPT_PRY_CIRCUIT_MESSAGE user.visible_message("[user] begins removing the circuit board from [src]...", "You begin removing the circuit board from [src]...", "You hear prying noises.")
+#define CROWBAR_PRY_CIRCUIT_SUCCESS_MESSAGE user.visible_message("[user] pries out the circuit board from [src]!", "You pry out the circuit board from [src]!", "You hear prying noises.")
+
+//Screwdriver messages
+#define SCREWDRIVER_SCREW_MESSAGE user.visible_message("[user] tightens the screws on [src]!", "You tighten the screws on [src]!", "You hear a screwdriver.")
+#define SCREWDRIVER_UNSCREW_MESSAGE user.visible_message("[user] loosens the screws on [src]!", "You loosen the screws on [src]!", "You hear a screwdriver.")
+#define SCREWDRIVER_OPEN_PANEL_MESSAGE user.visible_message("[user] opens the panel on [src]!", "You open the panel on [src]!", "You hear a screwdriver.")
+#define SCREWDRIVER_CLOSE_PANEL_MESSAGE user.visible_message("[user] closes the panel on [src]!", "You close the panel on [src]!", "You hear a screwdriver.")
+
+//Wirecutter messages
+#define WIRECUTTER_SNIP_MESSAGE user.visible_message("[user] cuts the wires from [src]!", "You cut the wires from [src]!", "You hear snipping.")
+#define WIRECUTTER_ATTEMPT_DISMANTLE_MESSAGE user.visible_message("[user] begins cutting [src] apart... ", "You begin cutting [src] apart...", "You hear snipping.")
+#define WIRECUTTER_DISMANTLE_SUCCESS_MESSAGE user.visible_message("[user] cuts [src] apart!", "You cut [src] apart!", "You hear snipping.")
+
+//Welder messages and other stuff
+#define HEALPERWELD 15
+#define WELDER_ATTEMPT_WELD_MESSAGE user.visible_message("[user] begins welding [src]...", "You begin welding [src]...", "You hear welding.")
+#define WELDER_WELD_SUCCESS_MESSAGE to_chat(user, "You finish welding [src]!")
+#define WELDER_ATTEMPT_REPAIR_MESSAGE user.visible_message("[user] begins repairing the damage on [src]...", "You begin repairing [src]...", "You hear welding.")
+#define WELDER_REPAIR_SUCCESS_MESSAGE to_chat(user, "You repair the damage on [src]!")
+#define WELDER_ATTEMPT_SLICING_MESSAGE user.visible_message("[user] begins slicing through [src]...", "You begin slicing through [src]...", "You hear welding.")
+#define WELDER_SLICING_SUCCESS_MESSAGE to_chat(user, "You slice clean through [src]!")
+#define WELDER_ATTEMPT_FLOOR_SLICE_MESSAGE user.visible_message("[user] begins slicing [src] free from [get_turf(src)]...", "You begin slicing [src] free from [get_turf(src)]...", "You hear welding.")
+#define WELDER_FLOOR_SLICE_SUCCESS_MESSAGE to_chat(user, "You slice [src] clear of [get_turf(src)]!")
+#define WELDER_ATTEMPT_FLOOR_WELD_MESSAGE user.visible_message("[user] begins welding [src] to [get_turf(src)]...", "You begin welding [src] to [get_turf(src)]...", "You hear welding.")
+#define WELDER_FLOOR_WELD_SUCCESS_MESSAGE to_chat(user, "You weld [src] to [get_turf(src)]!")
+
+//Wrench messages
+#define WRENCH_ANCHOR_MESSAGE user.visible_message("[user] tightens the bolts on [src]!", "You tighten the bolts on [src]!", "You hear ratcheting.")
+#define WRENCH_UNANCHOR_MESSAGE user.visible_message("[user] loosens the bolts on [src]!", "You loosen the bolts on [src]!", "You hear ratcheting.")
+#define WRENCH_UNANCHOR_WALL_MESSAGE user.visible_message("[user] unwrenches [src] from the wall!", "You unwrench [src] from the wall!", "You hear ratcheting.")
+#define WRENCH_ANCHOR_TO_WALL_MESSAGE user.visible_message("[user] affixes [src] to the wall!", "You affix [src] to the wall!", "You hear ratcheting.")
+
+//Generic tool messages that don't correspond to any particular tool
+#define TOOL_ATTEMPT_DISMANTLE_MESSAGE user.visible_message("[user] begins to disassemble [src] with [I]...", "You begin to disassemble [src] with [I]...", "You hear someone using some kind of tool.")
+#define TOOL_DISMANTLE_SUCCESS_MESSAGE user.visible_message("[user] dismantles [src]!", "You dismantle [src]!", "You hear someone using some kind of tool.")
diff --git a/code/__HELPERS/tool_helpers.dm b/code/__HELPERS/tool_helpers.dm
new file mode 100644
index 00000000000..15c8e60591e
--- /dev/null
+++ b/code/__HELPERS/tool_helpers.dm
@@ -0,0 +1,51 @@
+//Quick type checks for some tools
+
+/proc/iswrench(O)
+ if(istype(O, /obj/item/wrench))
+ return TRUE
+ return FALSE
+
+/proc/iswelder(O)
+ if(istype(O, /obj/item/weldingtool))
+ return TRUE
+ return FALSE
+
+/proc/iswirecutter(O)
+ if(istype(O, /obj/item/wirecutters))
+ return TRUE
+ return FALSE
+
+/proc/isscrewdriver(O)
+ if(istype(O, /obj/item/screwdriver))
+ return TRUE
+ return FALSE
+
+/proc/ismultitool(O)
+ if(istype(O, /obj/item/multitool))
+ return TRUE
+ return FALSE
+
+/proc/iscrowbar(O)
+ if(istype(O, /obj/item/crowbar))
+ return TRUE
+ return FALSE
+
+/proc/iscoil(O)
+ if(istype(O, /obj/item/stack/cable_coil))
+ return TRUE
+ return FALSE
+
+/proc/ispowertool(O)//used to check if a tool can force powered doors
+ if(istype(O, /obj/item/crowbar/power) || istype(O, /obj/item/mecha_parts/mecha_equipment/medical/rescue_jaw))
+ return TRUE
+ return FALSE
+
+/proc/is_surgery_tool(obj/item/W as obj)
+ return ( \
+ istype(W, /obj/item/scalpel) || \
+ istype(W, /obj/item/hemostat) || \
+ istype(W, /obj/item/retractor) || \
+ istype(W, /obj/item/cautery) || \
+ istype(W, /obj/item/bonegel) || \
+ istype(W, /obj/item/bonesetter)
+ )
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index f1611b38fd9..afe9858badd 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1142,73 +1142,11 @@ var/list/can_embed_types = typecacheof(list(
if(is_type_in_typecache(W, can_embed_types))
return 1
-//Quick type checks for some tools
-var/global/list/common_tools = list(
-/obj/item/stack/cable_coil,
-/obj/item/wrench,
-/obj/item/weldingtool,
-/obj/item/screwdriver,
-/obj/item/wirecutters,
-/obj/item/multitool,
-/obj/item/crowbar)
-
-/proc/istool(O)
- if(O && is_type_in_list(O, common_tools))
- return 1
- return 0
-
-/proc/iswrench(O)
- if(istype(O, /obj/item/wrench))
- return 1
- return 0
-
-/proc/iswelder(O)
- if(istype(O, /obj/item/weldingtool))
- return 1
- return 0
-
-/proc/iscoil(O)
- if(istype(O, /obj/item/stack/cable_coil))
- return 1
- return 0
-
-/proc/iswirecutter(O)
- if(istype(O, /obj/item/wirecutters))
- return 1
- return 0
-
-/proc/isscrewdriver(O)
- if(istype(O, /obj/item/screwdriver))
- return 1
- return 0
-
-/proc/ismultitool(O)
- if(istype(O, /obj/item/multitool))
- return 1
- return 0
-
-/proc/iscrowbar(O)
- if(istype(O, /obj/item/crowbar))
- return 1
- return 0
-
-/proc/ispowertool(O)//used to check if a tool can force powered doors
- if(istype(O, /obj/item/crowbar/power) || istype(O, /obj/item/mecha_parts/mecha_equipment/medical/rescue_jaw))
- return TRUE
- return FALSE
-
-/proc/iswire(O)
- if(istype(O, /obj/item/stack/cable_coil))
- return 1
- return 0
-
/proc/is_hot(obj/item/W as obj)
- if(istype(W, /obj/item/weldingtool))
- var/obj/item/weldingtool/O = W
- if(O.isOn())
- return 2500
- else
- return 0
+ if(W.tool_behaviour == TOOL_WELDER && W.tool_enabled)
+ return 2500
+ else
+ return 0
if(istype(W, /obj/item/lighter))
var/obj/item/lighter/O = W
if(O.lit)
@@ -1260,16 +1198,6 @@ var/global/list/common_tools = list(
return 1
return 0
-/proc/is_surgery_tool(obj/item/W as obj)
- return ( \
- istype(W, /obj/item/scalpel) || \
- istype(W, /obj/item/hemostat) || \
- istype(W, /obj/item/retractor) || \
- istype(W, /obj/item/cautery) || \
- istype(W, /obj/item/bonegel) || \
- istype(W, /obj/item/bonesetter)
- )
-
/proc/reverse_direction(var/dir)
switch(dir)
if(NORTH)
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 47b5f2ba337..bdd2da3c1e2 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -1,10 +1,17 @@
/obj/item/proc/melee_attack_chain(mob/user, atom/target, params)
- if(pre_attackby(target, user, params))
+ if(!tool_attack_chain(user, target) && pre_attackby(target, user, params))
// Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example)
var/resolved = target.attackby(src, user, params)
if(!resolved && target && !QDELETED(src))
afterattack(target, user, 1, params) // 1: clicking something Adjacent
+//Checks if the item can work as a tool, calling the appropriate tool behavior on the target
+//Note that if tool_act returns TRUE, then the tool won't call attack_by.
+/obj/item/proc/tool_attack_chain(mob/user, atom/target)
+ if(!tool_behaviour)
+ return FALSE
+ return target.tool_act(user, src, tool_behaviour)
+
// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown.
/obj/item/proc/attack_self(mob/user)
if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SELF, user) & COMPONENT_NO_INTERACT)
@@ -51,11 +58,6 @@
else
return 1
- if(isscrewdriver(src) && ismachine(M) && user.a_intent == INTENT_HELP)
- if(!attempt_initiate_surgery(src, M, user))
- return 0
- else
- return 1
if(is_sharp(src) && user.a_intent == INTENT_HELP)
if(!attempt_initiate_surgery(src, M, user))
return 0
diff --git a/code/datums/helper_datums/construction_datum.dm b/code/datums/helper_datums/construction_datum.dm
index 8cc1bdc27d8..f73607a2a4e 100644
--- a/code/datums/helper_datums/construction_datum.dm
+++ b/code/datums/helper_datums/construction_datum.dm
@@ -1,5 +1,6 @@
#define FORWARD -1
#define BACKWARD 1
+#define CONSTRUCTION_TOOL_BEHAVIOURS list(TOOL_CROWBAR, TOOL_SCREWDRIVER, TOOL_WELDER, TOOL_WRENCH)
/datum/construction
var/list/steps
@@ -38,30 +39,13 @@
/datum/construction/proc/is_right_key(atom/used_atom) // returns current step num if used_atom is of the right type.
var/list/L = steps[steps.len]
- if(istype(used_atom, L["key"]))
+ if(do_tool_or_atom_check(used_atom, L["key"]))
return steps.len
return 0
+
/datum/construction/proc/custom_action(step, used_atom, user)
- if(istype(used_atom, /obj/item/weldingtool))
- var/obj/item/weldingtool/W = used_atom
- if(W.remove_fuel(0, user))
- playsound(holder, W.usesound, 50, 1)
- else
- return 0
- else if(istype(used_atom, /obj/item/wrench))
- var/obj/item/wrench/W = used_atom
- playsound(holder, W.usesound, 50, 1)
-
- else if(istype(used_atom, /obj/item/screwdriver))
- var/obj/item/screwdriver/S = used_atom
- playsound(holder, S.usesound, 50, 1)
-
- else if(istype(used_atom, /obj/item/wirecutters))
- var/obj/item/wirecutters/W = used_atom
- playsound(holder, W.usesound, 50, 1)
-
- else if(istype(used_atom, /obj/item/stack/cable_coil))
+ if(istype(used_atom, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = used_atom
if(C.amount<4)
to_chat(user, ("There's not enough cable to finish the task."))
@@ -76,18 +60,22 @@
return 0
else
S.use(5)
+ else if(isitem(used_atom))
+ var/obj/item/I = used_atom
+ if(I.tool_behaviour in CONSTRUCTION_TOOL_BEHAVIOURS)
+ if(!I.use_tool(holder, user, 0, volume = I.tool_volume))
+ return 0
return 1
/datum/construction/proc/check_all_steps(atom/used_atom,mob/user as mob) //check all steps, remove matching one.
for(var/i=1;i<=steps.len;i++)
var/list/L = steps[i];
- if(istype(used_atom, L["key"]))
- if(custom_action(i, used_atom, user))
- steps[i]=null;//stupid byond list from list removal...
- listclearnulls(steps);
- if(!steps.len)
- spawn_result(user)
- return 1
+ if(do_tool_or_atom_check(used_atom, L["key"]) && custom_action(i, used_atom, user))
+ steps[i]=null;//stupid byond list from list removal...
+ listclearnulls(steps);
+ if(!steps.len)
+ spawn_result(user)
+ return 1
return 0
@@ -116,15 +104,12 @@
if(!coil.use(amount))
to_chat(user, "You don't have enough cable! You need at least [amount] coils.")
return 0
- // WELDER
- if(istype(used_atom,/obj/item/weldingtool))
- var/obj/item/weldingtool/welder=used_atom
- if(!welder.isOn())
- to_chat(user, "You tap the [src] with your unlit welder. [pick("Ding","Dong")].")
- return 0
- if(!welder.remove_fuel(amount,user))
- to_chat(user, "You don't have enough fuel!")
- return 0
+ // TOOLS
+ if(isitem(used_atom))
+ var/obj/item/I = used_atom
+ if(I.tool_behaviour in CONSTRUCTION_TOOL_BEHAVIOURS)
+ if(!I.use(amount))
+ return 0
// STACKS
if(istype(used_atom,/obj/item/stack))
var/obj/item/stack/stack=used_atom
@@ -134,6 +119,14 @@
stack.use(amount)
return 1
+/datum/construction/proc/do_tool_or_atom_check(used_atom, thing_to_check) //Checks if an atom is either a required thing; or if it's a required tool
+ if(istype(used_atom, thing_to_check))
+ return TRUE
+ else if(isitem(used_atom))
+ var/obj/item/I = used_atom
+ if(I.tool_behaviour == thing_to_check)
+ return TRUE
+
/datum/construction/reversible
var/index
@@ -152,9 +145,9 @@
/datum/construction/reversible/is_right_key(atom/used_atom) // returns index step
var/list/L = steps[index]
- if(istype(used_atom, L["key"]))
+ if(do_tool_or_atom_check(used_atom, L["key"]))
return FORWARD //to the first step -> forward
- else if(L["backkey"] && istype(used_atom, L["backkey"]))
+ else if(L["backkey"] && do_tool_or_atom_check(used_atom, L["backkey"]))
return BACKWARD //to the last step -> backwards
return 0
@@ -198,13 +191,13 @@
var/list/state = steps[index]
if(state_next in state)
var/list/step = state[state_next]
- if(istype(used_atom, step["key"]))
+ if(do_tool_or_atom_check(used_atom, step["key"]))
//if(L["consume"] && !try_consume(used_atom,L["consume"]))
// return 0
return FORWARD //to the first step -> forward
else if(state_prev in state)
var/list/step = state[state_prev]
- if(istype(used_atom, step["key"]))
+ if(do_tool_or_atom_check(used_atom, step["key"]))
//if(L["consume"] && !try_consume(used_atom,L["consume"]))
// return 0
return BACKWARD //to the first step -> forward
diff --git a/code/datums/wires/alarm.dm b/code/datums/wires/alarm.dm
index f412e96b5ee..daf8a0dcd48 100644
--- a/code/datums/wires/alarm.dm
+++ b/code/datums/wires/alarm.dm
@@ -54,8 +54,7 @@ var/const/AALARM_WIRE_AALARM = 16
// to_chat(world, "Power wire cut")
if(AALARM_WIRE_AI_CONTROL)
- if(A.aidisabled == !mended)
- A.aidisabled = mended
+ A.aidisabled = !mended
// to_chat(world, "AI Control Wire Cut")
if(AALARM_WIRE_SYPHON)
diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm
index 5220fd83a6d..a201617682d 100644
--- a/code/datums/wires/wires.dm
+++ b/code/datums/wires/wires.dm
@@ -5,12 +5,6 @@
#define MAX_FLAG 65535
-/proc/is_wire_tool(obj/item/I)
- if(ismultitool(I))
- return TRUE
- if(iswirecutter(I))
- return TRUE
-
var/list/same_wires = list()
// 12 colours, if you're adding more than 12 wires then add more colours here
var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown", "gold", "gray", "cyan", "navy", "purple", "pink")
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 8a19fb14d9c..cd7e1e45015 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -332,6 +332,47 @@
if(reagents)
reagents.temperature_reagents(exposed_temperature)
+/atom/proc/tool_act(mob/living/user, obj/item/I, tool_type)
+ switch(tool_type)
+ if(TOOL_CROWBAR)
+ return crowbar_act(user, I)
+ if(TOOL_MULTITOOL)
+ return multitool_act(user, I)
+ if(TOOL_SCREWDRIVER)
+ return screwdriver_act(user, I)
+ if(TOOL_WRENCH)
+ return wrench_act(user, I)
+ if(TOOL_WIRECUTTER)
+ return wirecutter_act(user, I)
+ if(TOOL_WELDER)
+ return welder_act(user, I)
+
+
+// Tool-specific behavior procs. To be overridden in subtypes.
+/atom/proc/crowbar_act(mob/living/user, obj/item/I)
+ return
+
+/atom/proc/multitool_act(mob/living/user, obj/item/I)
+ return
+
+//Check if the multitool has an item in its data buffer
+/atom/proc/multitool_check_buffer(user, silent = FALSE)
+ if(!silent)
+ to_chat(user, "[src] has no data buffer!")
+ return FALSE
+
+/atom/proc/screwdriver_act(mob/living/user, obj/item/I)
+ return
+
+/atom/proc/wrench_act(mob/living/user, obj/item/I)
+ return
+
+/atom/proc/wirecutter_act(mob/living/user, obj/item/I)
+ return
+
+/atom/proc/welder_act(mob/living/user, obj/item/I)
+ return
+
/atom/proc/emag_act()
return
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index 32ab33fc983..de42b5b253f 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -205,21 +205,8 @@
user.stop_pulling()
/obj/machinery/dna_scannernew/attackby(var/obj/item/item as obj, var/mob/user as mob, params)
- if(istype(item, /obj/item/screwdriver))
- if(occupant)
- to_chat(user, "The maintenance panel is locked.")
- return
- default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]", item)
- return
if(exchange_parts(user, item))
return
-
- if(istype(item, /obj/item/crowbar))
- if(panel_open)
- for(var/obj/I in contents) // in case there is something in the scanner
- I.forceMove(src.loc)
- default_deconstruction_crowbar(item)
- return
else if(istype(item, /obj/item/reagent_containers/glass))
if(beaker)
to_chat(user, "A beaker is already loaded into the machine.")
@@ -255,6 +242,18 @@
return
return ..()
+/obj/machinery/dna_scannernew/crowbar_act(mob/user, obj/item/I)
+ if(default_deconstruction_crowbar(user, I))
+ for(var/obj/thing in contents) // in case there is something in the scanner
+ thing.forceMove(src.loc)
+
+/obj/machinery/dna_scannernew/screwdriver_act(mob/user, obj/item/I)
+ if(occupant)
+ to_chat(user, "The maintenance panel is locked.")
+ return TRUE
+ if(default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]", I))
+ return TRUE
+
/obj/machinery/dna_scannernew/relaymove(mob/user as mob)
if(user.incapacitated())
return 0 //maybe they should be able to get out with cuffs, but whatever
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
index 962da01b74d..c27b230b3b2 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
@@ -587,10 +587,8 @@ Congratulations! You are now trained for invasive xenobiology research!"}
..()
make_syndie()
-/obj/item/radio/headset/abductor/attackby(obj/item/I, mob/user, params)
- if(isscrewdriver(I))
- return // Stops humans from disassembling abductor headsets.
- return ..()
+/obj/item/radio/headset/abductor/screwdriver_act()
+ return// Stops humans from disassembling abductor headsets.
/obj/item/scalpel/alien
name = "alien scalpel"
@@ -683,15 +681,6 @@ Congratulations! You are now trained for invasive xenobiology research!"}
density = TRUE
/obj/structure/table_frame/abductor/attackby(obj/item/I, mob/user, params)
- if(iswrench(I))
- to_chat(user, "You start disassembling [src]...")
- playsound(loc, I.usesound, 50, 1)
- if(do_after(user, 30*I.toolspeed, target = src))
- playsound(loc, 'sound/items/deconstruct.ogg', 50, 1)
- for(var/i = 1, i <= framestackamount, i++)
- new framestack(get_turf(src))
- qdel(src)
- return
if(istype(I, /obj/item/stack/sheet/mineral/abductor))
var/obj/item/stack/sheet/P = I
if(P.get_amount() < 1)
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index 63905bc3390..e764f97a46a 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -41,15 +41,17 @@
return
to_chat(user, "Picking up the swarmer may cause it to activate. You should be careful about this.")
-/obj/effect/mob_spawn/swarmer/attackby(obj/item/I, mob/user, params)
- if(isscrewdriver(I) && user.a_intent != INTENT_HARM)
- user.visible_message("[usr.name] deactivates [src].",
- "After some fiddling, you find a way to disable [src]'s power source.",
- "You hear clicking.")
- new /obj/item/deactivated_swarmer(get_turf(src))
- qdel(src)
- else
- return ..()
+/obj/effect/mob_spawn/swarmer/screwdriver_act(mob/user, obj/item/I)
+ if(user.a_intent == INTENT_HARM)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ user.visible_message("[usr.name] deactivates [src].",
+ "After some fiddling, you find a way to disable [src]'s power source.",
+ "You hear clicking.")
+ new /obj/item/deactivated_swarmer(get_turf(src))
+ qdel(src)
////The Mob itself////
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index 1c4956d096e..714ccbf1d5f 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -1,3 +1,10 @@
+#define NUKE_INTACT 0
+#define NUKE_COVER_OFF 1
+#define NUKE_COVER_OPEN 2
+#define NUKE_SEALANT_OPEN 3
+#define NUKE_UNWRENCHED 4
+#define NUKE_MOBILE 5
+
var/bomb_set
/obj/machinery/nuclearbomb
@@ -17,7 +24,7 @@ var/bomb_set
var/yes_code = 0
var/safety = 1
var/obj/item/disk/nuclear/auth = null
- var/removal_stage = 0 // 0 is no removal, 1 is covers removed, 2 is covers open, 3 is sealant open, 4 is unwrenched, 5 is removed from bolts.
+ var/removal_stage = NUKE_INTACT
var/lastentered
var/is_syndicate = 0
use_power = NO_POWER_USE
@@ -50,33 +57,6 @@ var/bomb_set
return
/obj/machinery/nuclearbomb/attackby(obj/item/O as obj, mob/user as mob, params)
- if(istype(O, /obj/item/screwdriver))
- add_fingerprint(user)
- if(auth)
- if(panel_open == 0)
- panel_open = 1
- overlays += image(icon, "npanel_open")
- to_chat(user, "You unscrew the control panel of [src].")
- playsound(src, O.usesound, 50, 1)
- else
- panel_open = 0
- overlays -= image(icon, "npanel_open")
- to_chat(user, "You screw the control panel of [src] back on.")
- playsound(src, O.usesound, 50, 1)
- else
- if(panel_open == 0)
- to_chat(user, "[src] emits a buzzing noise, the panel staying locked in.")
- if(panel_open == 1)
- panel_open = 0
- overlays -= image(icon, "npanel_open")
- to_chat(user, "You screw the control panel of [src] back on.")
- playsound(src, O.usesound, 50, 1)
- flick("nuclearbombc", src)
- return
-
- if(panel_open && (istype(O, /obj/item/multitool) || istype(O, /obj/item/wirecutters)))
- return attack_hand(user)
-
if(istype(O, /obj/item/disk/nuclear))
if(extended)
if(!user.drop_item())
@@ -89,77 +69,107 @@ var/bomb_set
else
to_chat(user, "You need to deploy \the [src] first. Right click on the sprite, select 'Make Deployable' then click on \the [src] with an empty hand.")
return
-
- if(anchored)
- switch(removal_stage)
- if(0)
- if(istype(O,/obj/item/weldingtool))
- var/obj/item/weldingtool/WT = O
- if(!WT.isOn()) return
- if(WT.get_fuel() < 5) // uses up 5 fuel.
- to_chat(user, "You need more fuel to complete this task.")
- return
-
- user.visible_message("[user] starts cutting loose the anchoring bolt covers on [src].", "You start cutting loose the anchoring bolt covers with [O]...")
-
- if(do_after(user,40, target = src))
- if(!src || !user || !WT.remove_fuel(5, user)) return
- user.visible_message("[user] cuts through the bolt covers on [src].", "You cut through the bolt cover.")
- removal_stage = 1
- return
-
- if(1)
- if(istype(O,/obj/item/crowbar))
- user.visible_message("[user] starts forcing open the bolt covers on [src].", "You start forcing open the anchoring bolt covers with [O]...")
-
- if(do_after(user,15, target = src))
- if(!src || !user) return
- user.visible_message("[user] forces open the bolt covers on [src].", "You force open the bolt covers.")
- removal_stage = 2
- return
-
- if(2)
- if(istype(O,/obj/item/weldingtool))
-
- var/obj/item/weldingtool/WT = O
- if(!WT.isOn()) return
- if(WT.get_fuel() < 5) // uses up 5 fuel.
- to_chat(user, "You need more fuel to complete this task.")
- return
-
- user.visible_message("[user] starts cutting apart the anchoring system sealant on [src].", "You start cutting apart the anchoring system's sealant with [O]...")
-
- if(do_after(user,40, target = src))
- if(!src || !user || !WT.remove_fuel(5, user)) return
- user.visible_message("[user] cuts apart the anchoring system sealant on [src].", "You cut apart the anchoring system's sealant.")
- removal_stage = 3
- return
-
- if(3)
- if(istype(O,/obj/item/wrench))
-
- user.visible_message("[user] begins unwrenching the anchoring bolts on [src].", "You begin unwrenching the anchoring bolts...")
-
- if(do_after(user,50, target = src))
- if(!src || !user) return
- user.visible_message("[user] unwrenches the anchoring bolts on [src].", "You unwrench the anchoring bolts.")
- removal_stage = 4
- return
-
- if(4)
- if(istype(O,/obj/item/crowbar))
-
- user.visible_message("[user] begins lifting [src] off of the anchors.", "You begin lifting the device off the anchors...")
-
- if(do_after(user,80, target = src))
- if(!src || !user) return
- user.visible_message("[user] crowbars [src] off of the anchors. It can now be moved.", "You jam the crowbar under the nuclear device and lift it off its anchors. You can now move it!")
- anchored = 0
- removal_stage = 5
- return
- return
return ..()
+/obj/machinery/nuclearbomb/crowbar_act(mob/user, obj/item/I)
+ if(!anchored)
+ return
+ if(removal_stage != NUKE_UNWRENCHED && removal_stage != NUKE_COVER_OFF)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ if(removal_stage == NUKE_COVER_OFF)
+ user.visible_message("[user] starts forcing open the bolt covers on [src].", "You start forcing open the anchoring bolt covers with [I]...")
+ if(!I.use_tool(src, user, 15, volume = I.tool_volume) || removal_stage != NUKE_COVER_OFF)
+ return
+ user.visible_message("[user] forces open the bolt covers on [src].", "You force open the bolt covers.")
+ removal_stage = NUKE_COVER_OPEN
+ else
+ user.visible_message("[user] begins lifting [src] off of the anchors.", "You begin lifting the device off the anchors...")
+ if(!I.use_tool(src, user, 80, volume = I.tool_volume) || removal_stage != NUKE_UNWRENCHED)
+ return
+ user.visible_message("[user] crowbars [src] off of the anchors. It can now be moved.", "You jam the crowbar under the nuclear device and lift it off its anchors. You can now move it!")
+ anchored = FALSE
+ removal_stage = NUKE_MOBILE
+
+/obj/machinery/nuclearbomb/wrench_act(mob/user, obj/item/I)
+ if(!anchored)
+ return
+ if(removal_stage != NUKE_SEALANT_OPEN)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ user.visible_message("[user] begins unwrenching the anchoring bolts on [src].", "You begin unwrenching the anchoring bolts...")
+ if(!I.use_tool(src, user, 50, volume = I.tool_volume) || removal_stage != NUKE_SEALANT_OPEN)
+ return
+ user.visible_message("[user] unwrenches the anchoring bolts on [src].", "You unwrench the anchoring bolts.")
+ removal_stage = NUKE_UNWRENCHED
+
+/obj/machinery/nuclearbomb/multitool_act(mob/user, obj/item/I)
+ if(!panel_open)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ attack_hand(user)
+
+/obj/machinery/nuclearbomb/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(auth)
+ if(!panel_open)
+ panel_open = TRUE
+ overlays += image(icon, "npanel_open")
+ to_chat(user, "You unscrew the control panel of [src].")
+ else
+ panel_open = FALSE
+ overlays -= image(icon, "npanel_open")
+ to_chat(user, "You screw the control panel of [src] back on.")
+ else
+ if(!panel_open)
+ to_chat(user, "[src] emits a buzzing noise, the panel staying locked in.")
+ if(panel_open == TRUE)
+ panel_open = FALSE
+ overlays -= image(icon, "npanel_open")
+ to_chat(user, "You screw the control panel of [src] back on.")
+ flick("nuclearbombc", src)
+
+/obj/machinery/nuclearbomb/wirecutter_act(mob/user, obj/item/I)
+ if(!panel_open)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ attack_hand(user)
+
+/obj/machinery/nuclearbomb/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(removal_stage != NUKE_INTACT && removal_stage != NUKE_COVER_OPEN)
+ return
+ if(!I.tool_use_check(user, 0))
+ return
+ if(removal_stage == NUKE_INTACT)
+ visible_message("[user] starts cutting loose the anchoring bolt covers on [src].",\
+ "You start cutting loose the anchoring bolt covers with [I]...",\
+ "You hear welding.")
+ if(!I.use_tool(src, user, 40, 5, volume = I.tool_volume) || removal_stage != NUKE_INTACT)
+ return
+ visible_message("[user] cuts through the bolt covers on [src].",\
+ "You cut through the bolt cover.")
+ removal_stage = NUKE_COVER_OFF
+ else if(removal_stage == NUKE_COVER_OPEN)
+ visible_message("[user] starts cutting apart the anchoring system sealant on [src].",\
+ "You start cutting apart the anchoring system's sealant with [I]...",\
+ "You hear welding.")
+ if(!I.use_tool(src, user, 40, 5, volume = I.tool_volume) || removal_stage != NUKE_COVER_OPEN)
+ return
+ visible_message("[user] cuts apart the anchoring system sealant on [src].",\
+ "You cut apart the anchoring system's sealant.")
+ removal_stage = NUKE_SEALANT_OPEN
+
/obj/machinery/nuclearbomb/attack_ghost(mob/user as mob)
if(extended)
attack_hand(user)
@@ -171,7 +181,7 @@ var/bomb_set
else
ui_interact(user)
else if(deployable)
- if(removal_stage < 5)
+ if(removal_stage != NUKE_MOBILE)
anchored = 1
visible_message("With a steely snap, bolts slide out of [src] and anchor it to the flooring!")
else
@@ -317,7 +327,7 @@ var/bomb_set
timing = 0
bomb_set = 0
if(href_list["anchor"])
- if(removal_stage == 5)
+ if(removal_stage == NUKE_MOBILE)
anchored = 0
visible_message("\The [src] makes a highly unpleasant crunching noise. It looks like the anchoring bolts have been cut.")
SSnanoui.update_uis(src)
@@ -453,3 +463,10 @@ var/bomb_set
else
error("[src] was supposed to be destroyed, but we were unable to locate a blobstart landmark to spawn a new one.")
return QDEL_HINT_LETMELIVE // Cancel destruction unless forced.
+
+#undef NUKE_INTACT
+#undef NUKE_COVER_OFF
+#undef NUKE_COVER_OPEN
+#undef NUKE_SEALANT_OPEN
+#undef NUKE_UNWRENCHED
+#undef NUKE_MOBILE
diff --git a/code/game/machinery/Freezer.dm b/code/game/machinery/Freezer.dm
index 91afce20b4d..8f2625b8854 100644
--- a/code/game/machinery/Freezer.dm
+++ b/code/game/machinery/Freezer.dm
@@ -50,36 +50,39 @@
..(dir,dir)
/obj/machinery/atmospherics/unary/cold_sink/freezer/attackby(obj/item/I, mob/user, params)
- if(default_deconstruction_screwdriver(user, "freezer-o", "freezer", I))
- on = 0
- update_icon()
- return
-
if(exchange_parts(user, I))
return
-
- if(default_deconstruction_crowbar(I))
- return
-
- if(iswrench(I))
- if(!panel_open)
- to_chat(user, "Open the maintenance panel first.")
- return
- var/list/choices = list("West" = WEST, "East" = EAST, "South" = SOUTH, "North" = NORTH)
- var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in choices
- dir = choices[selected]
- playsound(src.loc, I.usesound, 50, 1)
- var/node_connect = dir
- initialize_directions = dir
- for(var/obj/machinery/atmospherics/target in get_step(src,node_connect))
- if(target.initialize_directions & get_dir(target,src))
- node = target
- break
- build_network()
- update_icon()
- return
return ..()
+/obj/machinery/atmospherics/unary/cold_sink/freezer/crowbar_act(mob/user, obj/item/I)
+ if(default_deconstruction_crowbar(user, I))
+ return TRUE
+
+/obj/machinery/atmospherics/unary/cold_sink/freezer/screwdriver_act(mob/user, obj/item/I)
+ if(default_deconstruction_screwdriver(user, "freezer-o", "freezer", I))
+ on = FALSE
+ update_icon()
+ return TRUE
+
+/obj/machinery/atmospherics/unary/cold_sink/freezer/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(!panel_open)
+ to_chat(user, "Open the maintenance panel first.")
+ return
+ var/list/choices = list("West" = WEST, "East" = EAST, "South" = SOUTH, "North" = NORTH)
+ var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in choices
+ dir = choices[selected]
+ var/node_connect = dir
+ initialize_directions = dir
+ for(var/obj/machinery/atmospherics/target in get_step(src,node_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ node = target
+ break
+ build_network()
+ update_icon()
+
/obj/machinery/atmospherics/unary/cold_sink/freezer/update_icon()
if(panel_open)
icon_state = "freezer-o"
@@ -217,35 +220,38 @@
current_heat_capacity = 1000 * ((H - 1) ** 2)
/obj/machinery/atmospherics/unary/heat_reservoir/heater/attackby(obj/item/I, mob/user, params)
+ if(exchange_parts(user, I))
+ return
+ return ..()
+
+/obj/machinery/atmospherics/unary/heat_reservoir/heater/crowbar_act(mob/user, obj/item/I)
+ if(default_deconstruction_crowbar(user, I))
+ return TRUE
+
+/obj/machinery/atmospherics/unary/heat_reservoir/heater/screwdriver_act(mob/user, obj/item/I)
if(default_deconstruction_screwdriver(user, "heater-o", "heater", I))
on = 0
update_icon()
- return
+ return TRUE
- if(exchange_parts(user, I))
+/obj/machinery/atmospherics/unary/heat_reservoir/heater/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
-
- if(default_deconstruction_crowbar(I))
+ if(!panel_open)
+ to_chat(user, "Open the maintenance panel first.")
return
-
- if(iswrench(I))
- if(!panel_open)
- to_chat(user, "Open the maintenance panel first.")
- return
- var/list/choices = list("West" = WEST, "East" = EAST, "South" = SOUTH, "North" = NORTH)
- var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in choices
- dir = choices[selected]
- playsound(src.loc, I.usesound, 50, 1)
- var/node_connect = dir
- initialize_directions = dir
- for(var/obj/machinery/atmospherics/target in get_step(src,node_connect))
- if(target.initialize_directions & get_dir(target,src))
- node = target
- break
- build_network()
- update_icon()
- return
- return ..()
+ var/list/choices = list("West" = WEST, "East" = EAST, "South" = SOUTH, "North" = NORTH)
+ var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in choices
+ dir = choices[selected]
+ var/node_connect = dir
+ initialize_directions = dir
+ for(var/obj/machinery/atmospherics/target in get_step(src,node_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ node = target
+ break
+ build_network()
+ update_icon()
/obj/machinery/atmospherics/unary/heat_reservoir/heater/update_icon()
if(panel_open)
diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm
index 2c6e60c3d52..8c93028649b 100644
--- a/code/game/machinery/OpTable.dm
+++ b/code/game/machinery/OpTable.dm
@@ -131,15 +131,18 @@
if(iscarbon(G.affecting))
take_victim(G.affecting, user)
qdel(G)
- if(iswrench(I))
- playsound(loc, I.usesound, 50, 1)
- if(do_after(user, 20 * I.toolspeed, target = src))
- to_chat(user, "You deconstruct the table.")
- new /obj/item/stack/sheet/plasteel(loc, 5)
- qdel(src)
else
return ..()
+/obj/machinery/optable/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_start_check(user, 0))
+ return
+ if(I.use_tool(src, user, 20, volume = I.tool_volume))
+ to_chat(user, "You deconstruct the table.")
+ new /obj/item/stack/sheet/plasteel(loc, 5)
+ qdel(src)
+
/obj/machinery/optable/proc/check_table(mob/living/carbon/patient as mob)
if(src.victim && get_turf(victim) == get_turf(src) && victim.lying)
to_chat(usr, "The table is already occupied!")
diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm
index 817d56cb47a..83778a99c26 100644
--- a/code/game/machinery/PDApainter.dm
+++ b/code/game/machinery/PDApainter.dm
@@ -75,27 +75,15 @@
P.forceMove(src)
P.add_fingerprint(user)
update_icon()
- else if(iswelder(I) && user.a_intent != INTENT_HARM)
- var/obj/item/weldingtool/WT = I
- if(stat & BROKEN)
- if(WT.remove_fuel(0,user))
- user.visible_message("[user] is repairing [src].", \
- "You begin repairing [src]...", \
- "You hear welding.")
- playsound(loc, WT.usesound, 40, 1)
- if(do_after(user,40*WT.toolspeed, 1, target = src))
- if(!WT.isOn() || !(stat & BROKEN))
- return
- to_chat(user, "You repair [src].")
- playsound(loc, 'sound/items/welder2.ogg', 50, 1)
- stat &= ~BROKEN
- obj_integrity = max_integrity
- update_icon()
- else
- to_chat(user, "[src] does not need repairs.")
else
return ..()
+/obj/machinery/pdapainter/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ default_welder_repair(user, I)
+
/obj/machinery/pdapainter/deconstruct(disassembled = TRUE)
if(!(flags & NODECONSTRUCT))
if(!(stat & BROKEN))
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index fbe594f2269..f1adf1a5f11 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -280,35 +280,9 @@
to_chat(user, "The sleeper has a beaker already.")
return
- if(isscrewdriver(I))
- if(occupant)
- to_chat(user, "The maintenance panel is locked.")
- return
- default_deconstruction_screwdriver(user, "[base_icon]-o", "[base_icon]-open", I)
- return
-
- if(iswrench(I))
- if(occupant)
- to_chat(user, "The scanner is occupied.")
- return
- if(panel_open)
- to_chat(user, "Close the maintenance panel first.")
- return
- if(dir == EAST)
- orient = "LEFT"
- setDir(WEST)
- else
- orient = "RIGHT"
- setDir(EAST)
- playsound(loc, I.usesound, 50, 1)
- return
-
if(exchange_parts(user, I))
return
- if(default_deconstruction_crowbar(I))
- return
-
if(istype(I, /obj/item/grab))
var/obj/item/grab/G = I
if(panel_open)
@@ -343,6 +317,34 @@
return ..()
+/obj/machinery/sleeper/crowbar_act(mob/user, obj/item/I)
+ if(default_deconstruction_crowbar(user, I))
+ return TRUE
+
+/obj/machinery/sleeper/screwdriver_act(mob/user, obj/item/I)
+ if(occupant)
+ to_chat(user, "The maintenance panel is locked.")
+ return TRUE
+ if(default_deconstruction_screwdriver(user, "[base_icon]-o", "[base_icon]-open", I))
+ return TRUE
+
+/obj/machinery/sleeper/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(occupant)
+ to_chat(user, "The scanner is occupied.")
+ return
+ if(panel_open)
+ to_chat(user, "Close the maintenance panel first.")
+ return
+ if(dir == EAST)
+ orient = "LEFT"
+ setDir(WEST)
+ else
+ orient = "RIGHT"
+ setDir(EAST)
+
/obj/machinery/sleeper/ex_act(severity)
if(filtering)
toggle_filter()
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 0863b65415a..edb12487a68 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -40,33 +40,9 @@
RefreshParts()
/obj/machinery/bodyscanner/attackby(obj/item/I, mob/user)
- if(isscrewdriver(I))
- if(occupant)
- to_chat(user, "The maintenance panel is locked.")
- return
- default_deconstruction_screwdriver(user, "bodyscanner-o", "bodyscanner-open", I)
- return
-
- if(iswrench(I))
- if(occupant)
- to_chat(user, "The scanner is occupied.")
- return
- if(panel_open)
- to_chat(user, "Close the maintenance panel first.")
- return
- if(dir == EAST)
- setDir(WEST)
- else
- setDir(EAST)
- playsound(loc, I.usesound, 50, 1)
- return
-
if(exchange_parts(user, I))
return
- if(default_deconstruction_crowbar(I))
- return
-
if(istype(I, /obj/item/grab))
var/obj/item/grab/TYPECAST_YOUR_SHIT = I
if(panel_open)
@@ -93,6 +69,28 @@
return ..()
+/obj/machinery/bodyscanner/crowbar_act(mob/user, obj/item/I)
+ if(default_deconstruction_crowbar(user, I))
+ return TRUE
+
+/obj/machinery/bodyscanner/screwdriver_act(mob/user, obj/item/I)
+ if(default_deconstruction_screwdriver(user, "bodyscanner-o", "bodyscanner-open", I))
+ return TRUE
+
+/obj/machinery/bodyscanner/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(occupant)
+ to_chat(user, "The scanner is occupied.")
+ return
+ if(panel_open)
+ to_chat(user, "Close the maintenance panel first.")
+ return
+ if(dir == EAST)
+ setDir(WEST)
+ else
+ setDir(EAST)
/obj/machinery/bodyscanner/MouseDrop_T(mob/living/carbon/human/H, mob/user)
if(!istype(H))
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index d13406eee99..5d286c0a367 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -62,6 +62,10 @@
#define MAX_TEMPERATURE 363.15 // 90C
#define MIN_TEMPERATURE 233.15 // -40C
+#define AIR_ALARM_FRAME 0
+#define AIR_ALARM_BUILDING 1
+#define AIR_ALARM_READY 2
+
//all air alarms in area are connected via magic
/area
var/obj/machinery/alarm/master_air_alarm
@@ -111,7 +115,7 @@
var/danger_level = ATMOS_ALARM_NONE
var/alarmActivated = 0 // Manually activated (independent from danger level)
- var/buildstage = 2 //2 is built, 1 is building, 0 is frame.
+ var/buildstage = AIR_ALARM_READY
var/target_temperature = T20C
var/regulating_temperature = 0
@@ -948,24 +952,6 @@
switch(buildstage)
if(2)
- if(isscrewdriver(I)) // Opening that Air Alarm up.
- wiresexposed = !wiresexposed
- to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]")
- update_icon()
- return
-
- if(iswirecutter(I)) // cutting the wires out
- if(wires.wires_status == 31) // all wires cut
- var/obj/item/stack/cable_coil/new_coil = new /obj/item/stack/cable_coil()
- new_coil.amount = 5
- new_coil.forceMove(user.loc)
- buildstage = 1
- update_icon()
- return
-
- if(wiresexposed && ((ismultitool(I) || iswirecutter(I))))
- return attack_hand(user)
-
if(istype(I, /obj/item/card/id) || istype(I, /obj/item/pda))// trying to unlock the interface with an ID card
if(stat & (NOPOWER|BROKEN))
to_chat(user, "It does nothing")
@@ -980,7 +966,7 @@
return
if(1)
- if(istype(I, /obj/item/stack/cable_coil))
+ if(iscoil(I))
var/obj/item/stack/cable_coil/coil = I
if(coil.amount < 5)
to_chat(user, "You need more cable for this!")
@@ -996,19 +982,6 @@
update_icon()
first_run()
return
-
- else if(iscrowbar(I))
- to_chat(user, "You start prying out the circuit.")
- playsound(get_turf(src), I.usesound, 50, 1)
- if(do_after(user, 20 * I.toolspeed, target = src))
- if(buildstage != 1)
- return
- to_chat(user, "You pry out the circuit!")
- var/obj/item/airalarm_electronics/circuit = new /obj/item/airalarm_electronics()
- circuit.forceMove(user.loc)
- buildstage = 0
- update_icon()
- return
if(0)
if(istype(I, /obj/item/airalarm_electronics))
to_chat(user, "You insert the circuit!")
@@ -1017,16 +990,70 @@
buildstage = 1
update_icon()
return
-
- else if(iswrench(I))
- to_chat(user, "You remove the fire alarm assembly from the wall!")
- new /obj/item/mounted/frame/alarm_frame(get_turf(user))
- playsound(get_turf(src), I.usesound, 50, 1)
- qdel(src)
- return
-
return ..()
+/obj/machinery/alarm/crowbar_act(mob/user, obj/item/I)
+ if(buildstage != AIR_ALARM_BUILDING)
+ return
+ . = TRUE
+ if(!I.tool_start_check(user, 0))
+ return
+ to_chat(user, "You start prying out the circuit.")
+ if(!I.use_tool(src, user, 20, volume = I.tool_volume))
+ return
+ if(buildstage != AIR_ALARM_BUILDING)
+ return
+ to_chat(user, "You pry out the circuit!")
+ new /obj/item/airalarm_electronics(user.drop_location())
+ buildstage = AIR_ALARM_FRAME
+ update_icon()
+
+/obj/machinery/alarm/multitool_act(mob/user, obj/item/I)
+ if(buildstage != AIR_ALARM_READY)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(wiresexposed)
+ attack_hand(user)
+
+/obj/machinery/alarm/screwdriver_act(mob/user, obj/item/I)
+ if(buildstage != AIR_ALARM_READY)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ wiresexposed = !wiresexposed
+ update_icon()
+ if(wiresexposed)
+ SCREWDRIVER_OPEN_PANEL_MESSAGE
+ else
+ SCREWDRIVER_CLOSE_PANEL_MESSAGE
+
+/obj/machinery/alarm/wirecutter_act(mob/user, obj/item/I)
+ if(buildstage != AIR_ALARM_READY)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(wires.wires_status == 31) // all wires cut
+ var/obj/item/stack/cable_coil/new_coil = new /obj/item/stack/cable_coil(user.drop_location())
+ new_coil.amount = 5
+ buildstage = AIR_ALARM_BUILDING
+ update_icon()
+ if(wiresexposed)
+ wires.Interact(user)
+
+/obj/machinery/alarm/wrench_act(mob/user, obj/item/I)
+ if(buildstage != AIR_ALARM_FRAME)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ new /obj/item/mounted/frame/alarm_frame(get_turf(user))
+ WRENCH_UNANCHOR_WALL_MESSAGE
+ qdel(src)
+
/obj/machinery/alarm/power_change()
if(powered(power_channel))
stat &= ~NOPOWER
@@ -1076,3 +1103,8 @@ Just an object used in constructing air alarms
origin_tech = "engineering=2;programming=1"
toolspeed = 1
usesound = 'sound/items/deconstruct.ogg'
+
+
+#undef AIR_ALARM_FRAME
+#undef AIR_ALARM_BUILDING
+#undef AIR_ALARM_READY
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 3210e899876..230401b673b 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -78,7 +78,6 @@ var/datum/canister_icons/canister_icon_container = new()
use_power = NO_POWER_USE
interact_offline = 1
var/release_log = ""
- var/busy = 0
var/update_flag = 0
/obj/machinery/portable_atmospherics/canister/New()
@@ -264,22 +263,6 @@ update_flag
return
canister_break()
-/obj/machinery/portable_atmospherics/canister/attackby(obj/item/I, mob/user, params)
- if(user.a_intent != INTENT_HARM && iswelder(I))
- var/obj/item/weldingtool/WT = I
- if(stat & BROKEN)
- if(!WT.remove_fuel(0, user))
- return
- playsound(loc, WT.usesound, 40, 1)
- to_chat(user, "You begin cutting [src] apart...")
- if(do_after(user, 30, target = src))
- deconstruct(TRUE)
- else
- to_chat(user, "You cannot slice [src] apart when it isn't broken.")
- return TRUE
- else
- return ..()
-
/obj/machinery/portable_atmospherics/canister/proc/canister_break()
disconnect()
var/datum/gas_mixture/expelled_gas = air_contents.remove(air_contents.total_moles())
@@ -610,21 +593,14 @@ update_flag
src.update_icon() // Otherwise new canisters do not have their icon updated with the pressure light, likely want to add this to the canister class constructor, avoiding at current time to refrain from screwing up code for other canisters. --DZD
return 1
-/obj/machinery/portable_atmospherics/canister/proc/weld(var/obj/item/weldingtool/WT, var/mob/user)
-
- if(busy)
- return 0
- if(!WT.remove_fuel(0, user))
- return 0
-
- // Do after stuff here
- to_chat(user, "You start to slice away at \the [src]...")
- playsound(src.loc, WT.usesound, 50, 1)
- busy = 1
- if(do_after(user, 50 * WT.toolspeed, target = src))
- busy = 0
- if(!WT.isOn())
- return 0
- return 1
- busy = 0
- return 0
+/obj/machinery/portable_atmospherics/canister/welder_act(mob/user, obj/item/I)
+ if(!(stat & BROKEN))
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ WELDER_ATTEMPT_SLICING_MESSAGE
+ if(I.use_tool(src, user, 50, volume = I.tool_volume))
+ to_chat(user, "You salvage whats left of [src]!")
+ new /obj/item/stack/sheet/metal(drop_location(), 3)
+ qdel(src)
diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm
index b7c2dd152da..5008f4791ba 100644
--- a/code/game/machinery/atmoalter/portable_atmospherics.dm
+++ b/code/game/machinery/atmoalter/portable_atmospherics.dm
@@ -126,30 +126,32 @@
src.holding = T
update_icon()
return
- else if(istype(W, /obj/item/wrench))
- if(connected_port)
- disconnect()
- to_chat(user, "You disconnect [name] from the port.")
- update_icon()
- return
- else
- var/obj/machinery/atmospherics/unary/portables_connector/possible_port = locate(/obj/machinery/atmospherics/unary/portables_connector/) in loc
- if(possible_port)
- if(connect(possible_port))
- to_chat(user, "You connect [name] to the port.")
- update_icon()
- return
- else
- to_chat(user, "[name] failed to connect to the port.")
- return
- else
- to_chat(user, "Nothing happens.")
- return
if((istype(W, /obj/item/analyzer)) && get_dist(user, src) <= 1)
atmosanalyzer_scan(air_contents, user)
return
return ..()
+/obj/machinery/portable_atmospherics/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(connected_port)
+ disconnect()
+ to_chat(user, "You disconnect [name] from the port.")
+ update_icon()
+ else
+ var/obj/machinery/atmospherics/unary/portables_connector/possible_port = locate(/obj/machinery/atmospherics/unary/portables_connector/) in loc
+ if(possible_port)
+ if(connect(possible_port))
+ to_chat(user, "You connect [src] to the port.")
+ update_icon()
+ return
+ else
+ to_chat(user, "[src] failed to connect to the port.")
+ return
+ else
+ to_chat(user, "Nothing happens.")
+
/obj/machinery/portable_atmospherics/attacked_by(obj/item/I, mob/user)
if(I.force < 10 && !(stat & BROKEN))
take_damage(0)
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index ae0611e69d4..52ee48f067b 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -174,21 +174,8 @@
if(busy)
to_chat(user, "The autolathe is busy. Please wait for completion of previous operation.")
return 1
-
- if(default_deconstruction_screwdriver(user, "autolathe_t", "autolathe", O))
- SSnanoui.update_uis(src)
- return
-
if(exchange_parts(user, O))
return
-
- if(panel_open)
- if(istype(O, /obj/item/crowbar))
- default_deconstruction_crowbar(O)
- return 1
- else
- attack_hand(user)
- return 1
if(stat)
return 1
@@ -215,6 +202,50 @@
return ..()
+/obj/machinery/autolathe/crowbar_act(mob/user, obj/item/I)
+ if(!I.use_tool(src, user, 0, volume = 0))
+ return
+ . = TRUE
+ if(busy)
+ to_chat(user, "The autolathe is busy. Please wait for completion of previous operation.")
+ return
+ if(panel_open)
+ default_deconstruction_crowbar(user, I)
+ I.play_tool_sound(user, I.tool_volume)
+
+/obj/machinery/autolathe/screwdriver_act(mob/user, obj/item/I)
+ if(!I.use_tool(src, user, 0, volume = 0))
+ return
+ . = TRUE
+ if(busy)
+ to_chat(user, "The autolathe is busy. Please wait for completion of previous operation.")
+ return
+ if(default_deconstruction_screwdriver(user, "autolathe_t", "autolathe", I))
+ SSnanoui.update_uis(src)
+ I.play_tool_sound(user, I.tool_volume)
+
+/obj/machinery/autolathe/wirecutter_act(mob/user, obj/item/I)
+ if(!panel_open)
+ return
+ if(!I.use_tool(src, user, 0, volume = 0))
+ return
+ . = TRUE
+ if(busy)
+ to_chat(user, "The autolathe is busy. Please wait for completion of previous operation.")
+ return
+ interact(user)
+
+/obj/machinery/autolathe/multitool_act(mob/user, obj/item/I)
+ if(!panel_open)
+ return
+ if(!I.use_tool(src, user, 0, volume = 0))
+ return
+ . = TRUE
+ if(busy)
+ to_chat(user, "The autolathe is busy. Please wait for completion of previous operation.")
+ return
+ interact(user)
+
/obj/machinery/autolathe/proc/AfterMaterialInsert(type_inserted, id_inserted, amount_inserted)
switch(id_inserted)
if(MAT_METAL)
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 7e0508ba24f..bb09c247bca 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -127,27 +127,7 @@
var/msg = "You attach [I] into the assembly inner circuits."
var/msg2 = "The camera already has that upgrade!"
- // DECONSTRUCTION
- if(isscrewdriver(I))
- panel_open = !panel_open
- to_chat(user, "You screw the camera's panel [panel_open ? "open" : "closed"].")
- playsound(loc, I.usesound, 50, 1)
-
- else if((iswirecutter(I) || ismultitool(I)) && panel_open)
- wires.Interact(user)
-
- else if(iswelder(I) && panel_open && wires.CanDeconstruct())
- var/obj/item/weldingtool/WT = I
- if(!WT.remove_fuel(0, user))
- return
- to_chat(user, "You start to weld [src]...")
- playsound(loc, WT.usesound, 50, 1)
- if(do_after(user, 100 * WT.toolspeed, target = src))
- user.visible_message("[user] unwelds [src], leaving it as just a frame bolted to the wall.",
- "You unweld [src], leaving it as just a frame bolted to the wall")
- deconstruct(TRUE)
-
- else if(istype(I, /obj/item/analyzer) && panel_open) //XRay
+ if(istype(I, /obj/item/analyzer) && panel_open) //XRay
if(!user.drop_item())
to_chat(user, "[I] is stuck to your hand!")
return
@@ -233,6 +213,40 @@
else
return ..()
+
+/obj/machinery/camera/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ panel_open = !panel_open
+ to_chat(user, "You screw [src]'s panel [panel_open ? "open" : "closed"].")
+
+/obj/machinery/camera/wirecutter_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = 0))
+ return
+ if(panel_open)
+ wires.Interact(user)
+
+/obj/machinery/camera/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = 0))
+ return
+ if(panel_open)
+ wires.Interact(user)
+
+/obj/machinery/camera/welder_act(mob/user, obj/item/I)
+ if(!panel_open || !wires.CanDeconstruct())
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ WELDER_ATTEMPT_WELD_MESSAGE
+ if(I.use_tool(src, user, 100, volume = I.tool_volume))
+ visible_message("[user] unwelds [src], leaving it as just a frame bolted to the wall.",
+ "You unweld [src], leaving it as just a frame bolted to the wall")
+ deconstruct(TRUE)
+
/obj/machinery/camera/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
if(stat & BROKEN)
return damage_amount
diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm
index 34915f2d01b..bd795ab340b 100644
--- a/code/game/machinery/camera/camera_assembly.dm
+++ b/code/game/machinery/camera/camera_assembly.dm
@@ -3,6 +3,7 @@
#define ASSEMBLY_WELDED 2 // Welded in place
#define ASSEMBLY_WIRED 3 // Wires attached (Upgradable now)
#define ASSEMBLY_BUILT 4 // Fully built (incl panel closed)
+#define HEY_IM_WORKING_HERE 666 //So nobody can mess with the camera while we're inputting settings
/obj/item/camera_assembly
name = "camera assembly"
@@ -16,7 +17,6 @@
var/list/obj/item/possible_upgrades = list(/obj/item/assembly/prox_sensor, /obj/item/stack/sheet/mineral/plasma, /obj/item/analyzer)
var/list/upgrades = list()
var/state = ASSEMBLY_UNBUILT
- var/busy = FALSE
/obj/item/camera_assembly/Destroy()
@@ -24,106 +24,18 @@
return ..()
/obj/item/camera_assembly/attackby(obj/item/I, mob/living/user, params)
-
- switch(state)
- if(ASSEMBLY_UNBUILT)
- // State 0
- if(iswrench(I) && isturf(loc))
- playsound(loc, I.usesound, 50, 1)
- to_chat(user, "You wrench the assembly into place.")
- anchored = 1
- state = ASSEMBLY_WRENCHED
- update_icon()
- auto_turn()
- return
-
- if(ASSEMBLY_WRENCHED)
- // State 1
- if(iswelder(I))
- if(weld(I, user))
- to_chat(user, "You weld the assembly securely into place.")
- anchored = TRUE
- state = ASSEMBLY_WELDED
- return
-
- else if(iswrench(I))
- playsound(loc, I.usesound, 50, 1)
- to_chat(user, "You unattach the assembly from it's place.")
- anchored = FALSE
- update_icon()
- state = ASSEMBLY_UNBUILT
- return
-
- if(ASSEMBLY_WELDED)
- if(iscoil(I))
- var/obj/item/stack/cable_coil/C = I
- if(C.use(2))
- to_chat(user, "You add wires to the assembly.")
- playsound(loc, I.usesound, 50, 1)
- state = ASSEMBLY_WIRED
- else
- to_chat(user, "You need 2 coils of wire to wire the assembly.")
- return
-
- else if(iswelder(I))
- if(weld(I, user))
- to_chat(user, "You unweld the assembly from it's place.")
- state = ASSEMBLY_WRENCHED
- anchored = TRUE
- return
-
-
- if(ASSEMBLY_WIRED)
- if(isscrewdriver(I))
- playsound(loc, I.usesound, 50, 1)
-
- var/input = strip_html(input(usr, "Which networks would you like to connect this camera to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13"))
- if(!input)
- to_chat(usr, "No input found please hang up and try your call again.")
- return
-
- var/list/tempnetwork = splittext(input, ",")
- if(tempnetwork.len < 1)
- to_chat(usr, "No network found please hang up and try your call again.")
- return
-
- var/area/camera_area = get_area(src)
- var/temptag = "[sanitize(camera_area.name)] ([rand(1, 999)])"
- input = strip_html(input(usr, "How would you like to name the camera?", "Set Camera Name", temptag))
-
- state = ASSEMBLY_BUILT
- var/obj/machinery/camera/C = new(loc)
- loc = C
- C.assembly = src
-
- C.auto_turn()
-
- C.network = uniquelist(tempnetwork)
- tempnetwork = difflist(C.network,GLOB.restricted_camera_networks)
- if(!tempnetwork.len) // Camera isn't on any open network - remove its chunk from AI visibility.
- cameranet.removeCamera(C)
-
- C.c_tag = input
-
- for(var/i = 5; i >= 0; i -= 1)
- var/direct = input(user, "Direction?", "Assembling Camera", null) in list("LEAVE IT", "NORTH", "EAST", "SOUTH", "WEST" )
- if(direct != "LEAVE IT")
- C.dir = text2dir(direct)
- if(i != 0)
- var/confirm = alert(user, "Is this what you want? Chances Remaining: [i]", "Confirmation", "Yes", "No")
- if(confirm == "Yes")
- break
- return
-
- else if(iswirecutter(I))
- new/obj/item/stack/cable_coil(get_turf(src), 2)
- playsound(loc, I.usesound, 50, 1)
- to_chat(user, "You cut the wires from the circuits.")
- state = ASSEMBLY_WELDED
- return
+ if(state == ASSEMBLY_WELDED && iscoil(I))
+ var/obj/item/stack/cable_coil/C = I
+ if(C.use(2))
+ to_chat(user, "You add wires to the assembly.")
+ playsound(loc, I.usesound, 50, 1)
+ state = ASSEMBLY_WIRED
+ else
+ to_chat(user, "You need 2 coils of wire to wire the assembly.")
+ return
// Upgrades!
- if(is_type_in_list(I, possible_upgrades) && !is_type_in_list(I, upgrades)) // Is a possible upgrade and isn't in the camera already.
+ else if(is_type_in_list(I, possible_upgrades) && !is_type_in_list(I, upgrades)) // Is a possible upgrade and isn't in the camera already.
if(!user.unEquip(I))
to_chat(user, "[I] is stuck!")
return
@@ -132,20 +44,117 @@
user.drop_item()
I.loc = src
return
-
- // Taking out upgrades
- else if(iscrowbar(I) && upgrades.len)
- var/obj/U = locate(/obj) in upgrades
- if(U)
- to_chat(user, "You unattach an upgrade from the assembly.")
- playsound(loc, I.usesound, 50, 1)
- U.loc = get_turf(src)
- upgrades -= U
- return
-
else
return ..()
+/obj/item/camera_assembly/crowbar_act(mob/user, obj/item/I)
+ if(!upgrades.len)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ var/obj/U = locate(/obj) in upgrades
+ if(U)
+ to_chat(user, "You unattach an upgrade from the assembly.")
+ playsound(loc, I.usesound, 50, 1)
+ U.loc = get_turf(src)
+ upgrades -= U
+
+/obj/item/camera_assembly/screwdriver_act(mob/user, obj/item/I)
+ if(state != ASSEMBLY_WIRED)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ state = HEY_IM_WORKING_HERE
+ var/input = strip_html(input(usr, "Which networks would you like to connect this camera to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13"))
+ if(!input)
+ state = ASSEMBLY_WIRED
+ to_chat(usr, "No input found please hang up and try your call again.")
+ return
+
+ var/list/tempnetwork = splittext(input, ",")
+ if(tempnetwork.len < 1)
+ state = ASSEMBLY_WIRED
+ to_chat(usr, "No network found please hang up and try your call again.")
+ return
+
+ var/area/camera_area = get_area(src)
+ var/temptag = "[sanitize(camera_area.name)] ([rand(1, 999)])"
+ input = strip_html(input(usr, "How would you like to name the camera?", "Set Camera Name", temptag))
+ state = ASSEMBLY_BUILT
+ var/obj/machinery/camera/C = new(loc)
+ loc = C
+ C.assembly = src
+
+ C.auto_turn()
+
+ C.network = uniquelist(tempnetwork)
+ tempnetwork = difflist(C.network,GLOB.restricted_camera_networks)
+ if(!tempnetwork.len) // Camera isn't on any open network - remove its chunk from AI visibility.
+ cameranet.removeCamera(C)
+
+ C.c_tag = input
+
+ for(var/i = 5; i >= 0; i -= 1)
+ var/direct = input(user, "Direction?", "Assembling Camera", null) in list("LEAVE IT", "NORTH", "EAST", "SOUTH", "WEST" )
+ if(direct != "LEAVE IT")
+ C.dir = text2dir(direct)
+ if(i != 0)
+ var/confirm = alert(user, "Is this what you want? Chances Remaining: [i]", "Confirmation", "Yes", "No")
+ if(confirm == "Yes")
+ break
+
+
+/obj/item/camera_assembly/wirecutter_act(mob/user, obj/item/I)
+ if(state != ASSEMBLY_WIRED)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ new/obj/item/stack/cable_coil(get_turf(src), 2)
+ WIRECUTTER_SNIP_MESSAGE
+ state = ASSEMBLY_WELDED
+ return
+
+/obj/item/camera_assembly/wrench_act(mob/user, obj/item/I)
+ if(state != ASSEMBLY_UNBUILT && state != ASSEMBLY_WRENCHED)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(state == ASSEMBLY_UNBUILT && isturf(loc))
+ WRENCH_ANCHOR_TO_WALL_MESSAGE
+ anchored = TRUE
+ state = ASSEMBLY_WRENCHED
+ update_icon()
+ auto_turn()
+ else if(state == ASSEMBLY_WRENCHED)
+ WRENCH_UNANCHOR_WALL_MESSAGE
+ anchored = FALSE
+ update_icon()
+ state = ASSEMBLY_UNBUILT
+ else
+ to_chat(user, "[src] can't fit here!")
+
+/obj/item/camera_assembly/welder_act(mob/user, obj/item/I)
+ if(state == ASSEMBLY_UNBUILT)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ WELDER_ATTEMPT_WELD_MESSAGE
+ if(state == ASSEMBLY_WRENCHED)
+ if(!I.use_tool(src, user, 50, volume = I.tool_volume))
+ return
+ to_chat(user, "You weld [src] into place.")
+ state = ASSEMBLY_WELDED
+ else if(state == ASSEMBLY_WELDED)
+ if(!I.use_tool(src, user, 50, volume = I.tool_volume))
+ return
+ to_chat(user, "You unweld [src] from its place.")
+ state = ASSEMBLY_WRENCHED
+
/obj/item/camera_assembly/update_icon()
if(anchored)
icon_state = "camera1"
@@ -156,23 +165,6 @@
if(!anchored)
..()
-/obj/item/camera_assembly/proc/weld(obj/item/weldingtool/WT, mob/living/user)
- if(busy)
- return FALSE
- if(!WT.remove_fuel(0, user))
- return FALSE
-
- to_chat(user, "You start to weld the [src]...")
- playsound(loc, WT.usesound, 50, 1)
- busy = TRUE
- if(do_after(user, 20 * WT.toolspeed, target = src))
- busy = FALSE
- if(!WT.isOn())
- return FALSE
- return TRUE
- busy = FALSE
- return FALSE
-
/obj/item/camera_assembly/deconstruct(disassembled = TRUE)
if(!(flags & NODECONSTRUCT))
new /obj/item/stack/sheet/metal(loc)
@@ -184,3 +176,4 @@
#undef ASSEMBLY_WELDED
#undef ASSEMBLY_WIRED
#undef ASSEMBLY_BUILT
+#undef HEY_IM_WORKING_HERE
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index e6c957c1779..fb87d91e3f0 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -68,17 +68,22 @@
user.visible_message("[user] inserts a cell into the charger.", "You insert a cell into the charger.")
chargelevel = -1
updateicon()
- else if(iswrench(I))
- if(charging)
- to_chat(user, "Remove the cell first!")
- return
-
- anchored = !anchored
- to_chat(user, "You [anchored ? "attach" : "detach"] the cell charger [anchored ? "to" : "from"] the ground")
- playsound(src.loc, I.usesound, 75, 1)
else
return ..()
+/obj/machinery/cell_charger/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(charging)
+ to_chat(user, "Remove the cell first!")
+ return
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ anchored = !anchored
+ if(anchored)
+ WRENCH_ANCHOR_MESSAGE
+ else
+ WRENCH_UNANCHOR_MESSAGE
+
/obj/machinery/cell_charger/proc/removecell()
charging.update_icon()
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 83a12a6ff81..c2ec08c8115 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -363,16 +363,9 @@
//Let's unlock this early I guess. Might be too early, needs tweaking.
/obj/machinery/clonepod/attackby(obj/item/I, mob/user, params)
- if(!(occupant || mess))
- if(default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]", I))
- return
-
if(exchange_parts(user, I))
return
- if(default_deconstruction_crowbar(I))
- return
-
if(I.GetID())
if(!check_access(I))
to_chat(user, "Access Denied.")
@@ -392,29 +385,42 @@
to_chat(user, "[src] processes [I].")
biomass += BIOMASS_MEAT_AMOUNT
qdel(I)
- else if(iswrench(I))
- if(occupant)
- to_chat(user, "Can not do that while [src] is in use.")
- else
- if(anchored)
- anchored = FALSE
- connected.pods -= src
- connected = null
- else
- anchored = TRUE
- playsound(loc, I.usesound, 100, 1)
- if(anchored)
- 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(ismultitool(I))
- var/obj/item/multitool/M = I
- M.buffer = src
- to_chat(user, "You load connection data from [src] to [M].")
- return
else
return ..()
+/obj/machinery/clonepod/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ default_deconstruction_crowbar(user, I)
+
+/obj/machinery/clonepod/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(!I.multitool_check_buffer(user))
+ return
+ var/obj/item/multitool/M = I
+ M.set_multitool_buffer(user, src)
+
+/obj/machinery/clonepod/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]", I)
+
+/obj/machinery/clonepod/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(occupant)
+ to_chat(user, "Can not do that while [src] is in use.")
+ return
+ if(anchored)
+ WRENCH_UNANCHOR_MESSAGE
+ anchored = FALSE
+ connected.pods -= src
+ connected = null
+ else
+ WRENCH_ANCHOR_MESSAGE
+ anchored = TRUE
+
/obj/machinery/clonepod/emag_act(user)
if(isnull(occupant))
return
diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm
index dfac3250d44..ddc7ef69660 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/machinery/computer/ai_core.dm
@@ -17,197 +17,185 @@
return ..()
/obj/structure/AIcore/attackby(obj/item/P, mob/user, params)
- if(istype(P, /obj/item/wrench))
- return default_unfasten_wrench(user, P, 20)
- if(!anchored)
- if(iswelder(P))
- if(state != EMPTY_CORE)
- to_chat(user, "The core must be empty to deconstruct it!")
+ switch(state)
+ if(EMPTY_CORE)
+ if(istype(P, /obj/item/circuitboard/aicore))
+ if(!user.drop_item())
+ return
+ playsound(loc, P.usesound, 50, 1)
+ to_chat(user, "You place the circuit board inside the frame.")
+ update_icon()
+ state = CIRCUIT_CORE
+ P.forceMove(src)
+ circuit = P
return
- var/obj/item/weldingtool/WT = P
- if(!WT.isOn())
- to_chat(user, "The welder must be on for this task!")
- return
- playsound(loc, WT.usesound, 50, 1)
- to_chat(user, "You start to deconstruct the frame...")
- if(do_after(user, 20*P.toolspeed, target = src) && src && state == EMPTY_CORE && WT && WT.remove_fuel(0, user))
- to_chat(user, "You deconstruct the frame.")
- deconstruct(TRUE)
- return
- else
- switch(state)
- if(EMPTY_CORE)
- if(istype(P, /obj/item/circuitboard/aicore))
- if(!user.drop_item())
- return
- playsound(loc, P.usesound, 50, 1)
- to_chat(user, "You place the circuit board inside the frame.")
- update_icon()
- state = CIRCUIT_CORE
- P.forceMove(src)
- circuit = P
- return
- if(CIRCUIT_CORE)
- if(isscrewdriver(P))
- playsound(loc, P.usesound, 50, 1)
- to_chat(user, "You screw the circuit board into place.")
- state = SCREWED_CORE
- update_icon()
- return
- if(iscrowbar(P))
- playsound(loc, P.usesound, 50, 1)
- to_chat(user, "You remove the circuit board.")
- state = EMPTY_CORE
- update_icon()
- circuit.forceMove(loc)
- circuit = null
- return
- if(SCREWED_CORE)
- if(iswirecutter(P) && circuit)
- playsound(loc, P.usesound, 50, 1)
- to_chat(user, "You unfasten the circuit board.")
- state = CIRCUIT_CORE
- update_icon()
- return
- if(istype(P, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/C = P
- if(C.get_amount() >= 5)
- playsound(loc, 'sound/items/deconstruct.ogg', 50, 1)
- to_chat(user, "You start to add cables to the frame...")
- if(do_after(user, 20, target = src) && state == SCREWED_CORE && C.use(5))
- to_chat(user, "You add cables to the frame.")
- state = CABLED_CORE
- update_icon()
- else
- to_chat(user, "You need five lengths of cable to wire the AI core!")
- return
- if(CABLED_CORE)
- if(iswirecutter(P))
- if(brain)
- to_chat(user, "Get that [brain.name] out of there first!")
- else
- playsound(loc, P.usesound, 50, 1)
- to_chat(user, "You remove the cables.")
- state = SCREWED_CORE
+ if(SCREWED_CORE)
+ if(istype(P, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/C = P
+ if(C.get_amount() >= 5)
+ playsound(loc, 'sound/items/deconstruct.ogg', 50, 1)
+ to_chat(user, "You start to add cables to the frame...")
+ if(do_after(user, 20, target = src) && state == SCREWED_CORE && C.use(5))
+ to_chat(user, "You add cables to the frame.")
+ state = CABLED_CORE
update_icon()
- var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( loc )
- A.amount = 5
+ else
+ to_chat(user, "You need five lengths of cable to wire the AI core!")
+ return
+ if(CABLED_CORE)
+ if(istype(P, /obj/item/stack/sheet/rglass))
+ var/obj/item/stack/sheet/rglass/G = P
+ if(G.get_amount() >= 2)
+ playsound(loc, 'sound/items/deconstruct.ogg', 50, 1)
+ to_chat(user, "You start to put in the glass panel...")
+ if(do_after(user, 20, target = src) && state == CABLED_CORE && G.use(2))
+ to_chat(user, "You put in the glass panel.")
+ state = GLASS_CORE
+ update_icon()
+ else
+ to_chat(user, "You need two sheets of reinforced glass to insert them into the AI core!")
+ return
+
+ if(istype(P, /obj/item/aiModule/purge))
+ laws.clear_inherent_laws()
+ to_chat(usr, "Law module applied.")
+ return
+
+ if(istype(P, /obj/item/aiModule/freeform))
+ var/obj/item/aiModule/freeform/M = P
+ laws.add_inherent_law(M.newFreeFormLaw)
+ to_chat(usr, "Added a freeform law.")
+ return
+
+ if(istype(P, /obj/item/aiModule))
+ var/obj/item/aiModule/M = P
+ if(!M.laws)
+ to_chat(usr, "This AI module can not be applied directly to AI cores.")
+ return
+ laws = M.laws
+
+ if(istype(P, /obj/item/mmi) && !brain)
+ var/obj/item/mmi/M = P
+ if(!M.brainmob)
+ to_chat(user, "Sticking an empty [P] into the frame would sort of defeat the purpose.")
+ return
+ if(M.brainmob.stat == DEAD)
+ to_chat(user, "Sticking a dead [P] into the frame would sort of defeat the purpose.")
return
- if(istype(P, /obj/item/stack/sheet/rglass))
- var/obj/item/stack/sheet/rglass/G = P
- if(G.get_amount() >= 2)
- playsound(loc, 'sound/items/deconstruct.ogg', 50, 1)
- to_chat(user, "You start to put in the glass panel...")
- if(do_after(user, 20, target = src) && state == CABLED_CORE && G.use(2))
- to_chat(user, "You put in the glass panel.")
- state = GLASS_CORE
- update_icon()
- else
- to_chat(user, "You need two sheets of reinforced glass to insert them into the AI core!")
+ if(!M.brainmob.client)
+ to_chat(user, "Sticking an inactive [M.name] into the frame would sort of defeat the purpose.")
return
- if(istype(P, /obj/item/aiModule/purge))
- laws.clear_inherent_laws()
- to_chat(usr, "Law module applied.")
+ if(jobban_isbanned(M.brainmob, "AI") || jobban_isbanned(M.brainmob, "nonhumandept"))
+ to_chat(user, "This [P] does not seem to fit.")
return
- if(istype(P, /obj/item/aiModule/freeform))
- var/obj/item/aiModule/freeform/M = P
- laws.add_inherent_law(M.newFreeFormLaw)
- to_chat(usr, "Added a freeform law.")
+ if(!M.brainmob.mind)
+ to_chat(user, "This [M.name] is mindless!")
return
- if(istype(P, /obj/item/aiModule))
- var/obj/item/aiModule/M = P
- if(!M.laws)
- to_chat(usr, "This AI module can not be applied directly to AI cores.")
- return
- laws = M.laws
-
- if(istype(P, /obj/item/mmi) && !brain)
- var/obj/item/mmi/M = P
- if(!M.brainmob)
- to_chat(user, "Sticking an empty [P] into the frame would sort of defeat the purpose.")
- return
- if(M.brainmob.stat == DEAD)
- to_chat(user, "Sticking a dead [P] into the frame would sort of defeat the purpose.")
- return
-
- if(!M.brainmob.client)
- to_chat(user, "Sticking an inactive [M.name] into the frame would sort of defeat the purpose.")
- return
-
- if(jobban_isbanned(M.brainmob, "AI") || jobban_isbanned(M.brainmob, "nonhumandept"))
- to_chat(user, "This [P] does not seem to fit.")
- return
-
- if(!M.brainmob.mind)
- to_chat(user, "This [M.name] is mindless!")
- return
-
- if(istype(P, /obj/item/mmi/syndie))
- to_chat(user, "This MMI does not seem to fit!")
- return
-
- if(!user.drop_item())
- return
-
- M.forceMove(src)
- brain = M
- to_chat(user, "You add [M.name] to the frame.")
- update_icon()
+ if(istype(P, /obj/item/mmi/syndie))
+ to_chat(user, "This MMI does not seem to fit!")
return
- if(iscrowbar(P) && brain)
- playsound(loc, P.usesound, 50, 1)
- to_chat(user, "You remove the brain.")
- brain.forceMove(loc)
- brain = null
- update_icon()
+ if(!user.drop_item())
return
- if(GLASS_CORE)
- if(istype(P, /obj/item/crowbar))
- playsound(loc, P.usesound, 50, 1)
- to_chat(user, "You remove the glass panel.")
- state = CABLED_CORE
- update_icon()
- new /obj/item/stack/sheet/rglass(loc, 2)
- return
+ M.forceMove(src)
+ brain = M
+ to_chat(user, "You add [M.name] to the frame.")
+ update_icon()
+ return
- if(isscrewdriver(P))
- playsound(loc, P.usesound, 50, 1)
- to_chat(user, "You connect the monitor.")
- if(!brain)
- var/open_for_latejoin = alert(user, "Would you like this core to be open for latejoining AIs?", "Latejoin", "Yes", "Yes", "No") == "Yes"
- var/obj/structure/AIcore/deactivated/D = new(loc)
- if(open_for_latejoin)
- empty_playable_ai_cores += D
- else
- if(brain.brainmob.mind)
- SSticker.mode.remove_cultist(brain.brainmob.mind, 1)
- SSticker.mode.remove_revolutionary(brain.brainmob.mind, 1)
-
- var/mob/living/silicon/ai/A = new /mob/living/silicon/ai(loc, laws, brain)
- if(A) //if there's no brain, the mob is deleted and a structure/AIcore is created
- A.rename_self("AI", 1)
- feedback_inc("cyborg_ais_created",1)
- qdel(src)
-
- if(AI_READY_CORE)
- if(istype(P, /obj/item/aicard))
- P.transfer_ai("INACTIVE", "AICARD", src, user)
- return
-
- if(isscrewdriver(P))
- playsound(loc, P.usesound, 50, 1)
- to_chat(user, "You disconnect the monitor.")
- state = GLASS_CORE
- update_icon()
- return
+ if(AI_READY_CORE)
+ if(istype(P, /obj/item/aicard))
+ P.transfer_ai("INACTIVE", "AICARD", src, user)
+ return
return ..()
+/obj/structure/AIcore/crowbar_act(mob/living/user, obj/item/I)
+ if(state !=CIRCUIT_CORE || state != GLASS_CORE || !(state == CABLED_CORE && brain))
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ switch(state)
+ if(CIRCUIT_CORE)
+ to_chat(user, "You remove the circuit board.")
+ state = EMPTY_CORE
+ circuit.forceMove(loc)
+ circuit = null
+ return
+ if(GLASS_CORE)
+ to_chat(user, "You remove the glass panel.")
+ state = CABLED_CORE
+ new /obj/item/stack/sheet/rglass(loc, 2)
+ return
+ if(CABLED_CORE)
+ if(brain)
+ to_chat(user, "You remove the brain.")
+ brain.forceMove(loc)
+ brain = null
+ update_icon()
+
+/obj/structure/AIcore/screwdriver_act(mob/living/user, obj/item/I)
+ if(state in list(SCREWED_CORE, CIRCUIT_CORE, GLASS_CORE, AI_READY_CORE))
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ switch(state)
+ if(SCREWED_CORE)
+ to_chat(user, "You unfasten the circuit board.")
+ state = CIRCUIT_CORE
+ if(CIRCUIT_CORE)
+ to_chat(user, "You screw the circuit board into place.")
+ state = SCREWED_CORE
+ if(GLASS_CORE)
+ to_chat(user, "You connect the monitor.")
+ if(!brain)
+ var/open_for_latejoin = alert(user, "Would you like this core to be open for latejoining AIs?", "Latejoin", "Yes", "Yes", "No") == "Yes"
+ var/obj/structure/AIcore/deactivated/D = new(loc)
+ if(open_for_latejoin)
+ empty_playable_ai_cores += D
+ else
+ if(brain.brainmob.mind)
+ SSticker.mode.remove_cultist(brain.brainmob.mind, 1)
+ SSticker.mode.remove_revolutionary(brain.brainmob.mind, 1)
+
+ var/mob/living/silicon/ai/A = new /mob/living/silicon/ai(loc, laws, brain)
+ if(A) //if there's no brain, the mob is deleted and a structure/AIcore is created
+ A.rename_self("AI", 1)
+ feedback_inc("cyborg_ais_created",1)
+ qdel(src)
+ if(AI_READY_CORE)
+ to_chat(user, "You disconnect the monitor.")
+ state = GLASS_CORE
+ update_icon()
+
+
+/obj/structure/AIcore/wirecutter_act(mob/living/user, obj/item/I)
+ if(state != CABLED_CORE)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(brain)
+ to_chat(user, "Get that [brain.name] out of there first!")
+ else
+ to_chat(user, "You remove the cables.")
+ state = SCREWED_CORE
+ update_icon()
+ var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( loc )
+ A.amount = 5
+
+/obj/structure/AIcore/wrench_act(mob/living/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ default_unfasten_wrench(user, I, 20)
+
/obj/structure/AIcore/update_icon()
switch(state)
if(EMPTY_CORE)
@@ -237,6 +225,18 @@
new /obj/item/stack/sheet/plasteel(loc, 4)
qdel(src)
+/obj/structure/AIcore/welder_act(mob/user, obj/item/I)
+ if(!state)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ WELDER_ATTEMPT_WELD_MESSAGE
+ if(I.use_tool(src, user, 20, volume = I.tool_volume))
+ to_chat(user, "You deconstruct the frame.")
+ new /obj/item/stack/sheet/plasteel(drop_location(), 4)
+ qdel(src)
+
/obj/structure/AIcore/deactivated
name = "inactive AI"
icon_state = "ai-empty"
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index 9e8bc08f9b2..6b0e167cbb6 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -454,17 +454,6 @@
anchored = 1
state = 1
return
- if(istype(P, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = P
- if(!WT.remove_fuel(0, user))
- to_chat(user, "The welding tool must be on to complete this task.")
- return
- playsound(loc, WT.usesound, 50, 1)
- if(do_after(user, 20 * WT.toolspeed, target = src))
- if(!src || !WT.isOn()) return
- to_chat(user, "You deconstruct the frame.")
- deconstruct(TRUE)
- return
if(1)
if(istype(P, /obj/item/wrench))
playsound(loc, P.usesound, 50, 1)
@@ -573,6 +562,18 @@
return ..()
+/obj/structure/computerframe/welder_act(mob/user, obj/item/I)
+ if(state)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ WELDER_ATTEMPT_SLICING_MESSAGE
+ if(I.use_tool(src, user, 50, volume = I.tool_volume) && !state)
+ to_chat(user, "You deconstruct [src].")
+ deconstruct(TRUE)
+
+
/obj/structure/computerframe/HONKputer
name = "Bananium Computer-frame"
@@ -588,17 +589,6 @@
to_chat(user, "You wrench the frame into place.")
anchored = 1
state = 1
- if(istype(P, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = P
- if(!WT.remove_fuel(0, user))
- to_chat(user, "The welding tool must be on to complete this task.")
- return
- playsound(loc, WT.usesound, 50, 1)
- if(do_after(user, 20 * WT.toolspeed, target = src))
- if(!src || !WT.isOn()) return
- to_chat(user, "You deconstruct the frame.")
- deconstruct(TRUE)
- return
if(1)
if(istype(P, /obj/item/wrench))
playsound(loc, P.usesound, 50, 1)
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 45f390082a1..3462677d615 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -79,24 +79,24 @@
ui_interact(user)
-/obj/machinery/computer/security/telescreen/attackby(obj/item/I, mob/user, params)
- if(ismultitool(I))
- var/direction = input(user, "Which direction?", "Select direction!") as null|anything in list("North", "East", "South", "West", "Centre")
- if(!direction || !Adjacent(user))
- return
- pixel_x = 0
- pixel_y = 0
- switch(direction)
- if("North")
- pixel_y = 32
- if("East")
- pixel_x = 32
- if("South")
- pixel_y = -32
- if("West")
- pixel_x = -32
- else
- return ..()
+/obj/machinery/computer/security/telescreen/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ var/direction = input(user, "Which direction?", "Select direction!") as null|anything in list("North", "East", "South", "West", "Centre")
+ if(!direction || !Adjacent(user))
+ return
+ pixel_x = 0
+ pixel_y = 0
+ switch(direction)
+ if("North")
+ pixel_y = 32
+ if("East")
+ pixel_x = 32
+ if("South")
+ pixel_y = -32
+ if("West")
+ pixel_x = -32
/obj/machinery/computer/security/emag_act(user as mob)
if(!emagged)
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 438c8f92246..aec41c80be3 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -133,10 +133,10 @@
if(istype(user, /mob/dead/observer)) return 0
return ..()
-/obj/machinery/computer/attackby(obj/item/I, mob/user, params)
- if(isscrewdriver(I) && circuit && !(flags & NODECONSTRUCT))
- playsound(loc, I.usesound, 50, TRUE)
- if(do_after(user, 20 * I.toolspeed, target = src))
- deconstruct(TRUE, user)
+/obj/machinery/computer/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_start_check(user, 0))
return
- return ..()
\ No newline at end of file
+ if(circuit && !(flags & NODECONSTRUCT))
+ if(I.use_tool(src, user, 20, volume = I.tool_volume))
+ deconstruct(TRUE, user)
diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm
index fef40c9f93a..55107809ce3 100644
--- a/code/game/machinery/computer/message.dm
+++ b/code/game/machinery/computer/message.dm
@@ -35,11 +35,8 @@
light_color = LIGHT_COLOR_DARKGREEN
-/obj/machinery/computer/message_monitor/attackby(obj/item/O as obj, mob/living/user as mob, params)
- if(!istype(user))
- return
- if(isscrewdriver(O) && emag)
- //Stops people from just unscrewing the monitor and putting it back to get the console working again.
+/obj/machinery/computer/message_monitor/screwdriver_act(mob/user, obj/item/I)
+ if(emag) //Stops people from just unscrewing the monitor and putting it back to get the console working again.
to_chat(user, "It is too hot to mess with!")
return
return ..()
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index 36ad92714c6..b051ae34ca9 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -257,18 +257,20 @@ to destroy them and players will be able to make replacements.
/obj/machinery/vending/modularpc = "Deluxe Silicate Selections",
/obj/machinery/vending/crittercare = "CritterCare")
-/obj/item/circuitboard/vendor/attackby(obj/item/I, mob/user, params)
- if(isscrewdriver(I))
- var/static/list/display_vending_names_paths
- if(!display_vending_names_paths)
- display_vending_names_paths = list()
- for(var/path in vending_names_paths)
- display_vending_names_paths[vending_names_paths[path]] = path
- var/choice = input(user, "Choose a new brand","Select an Item") as null|anything in display_vending_names_paths
- set_type(display_vending_names_paths[choice])
- else
- return ..()
-
+/obj/item/circuitboard/vendor/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ var/static/list/display_vending_names_paths
+ if(!display_vending_names_paths)
+ display_vending_names_paths = list()
+ for(var/path in vending_names_paths)
+ display_vending_names_paths[vending_names_paths[path]] = path
+ var/choice = input(user, "Choose a new brand","Select an Item") as null|anything in display_vending_names_paths
+ if(loc != user)
+ to_chat(user, "You need to keep [src] in your hands while doing that!")
+ return
+ set_type(display_vending_names_paths[choice])
/obj/item/circuitboard/vendor/proc/set_type(obj/machinery/vending/typepath)
build_path = typepath
@@ -583,20 +585,20 @@ to destroy them and players will be able to make replacements.
/obj/item/stock_parts/manipulator = 1,
/obj/item/stack/sheet/glass = 1)
-/obj/item/circuitboard/chem_master/attackby(obj/item/I, mob/user, params)
- if(isscrewdriver(I))
- var/new_name = "ChemMaster"
- var/new_path = /obj/machinery/chem_master
+/obj/item/circuitboard/chem_master/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ var/new_name = "ChemMaster"
+ var/new_path = /obj/machinery/chem_master
- if(build_path == /obj/machinery/chem_master)
- new_name = "CondiMaster"
- new_path = /obj/machinery/chem_master/condimaster
+ if(build_path == /obj/machinery/chem_master)
+ new_name = "CondiMaster"
+ new_path = /obj/machinery/chem_master/condimaster
- build_path = new_path
- name = "circuit board ([new_name] 3000)"
- to_chat(user, "You change the circuit board setting to \"[new_name]\".")
- else
- return ..()
+ build_path = new_path
+ name = "circuit board ([new_name] 3000)"
+ to_chat(user, "You change the circuit board setting to \"[new_name]\".")
/obj/item/circuitboard/chem_master/condi_master
name = "circuit board (CondiMaster 3000)"
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 3df7cc8c6ec..16e761d01c6 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -302,20 +302,9 @@
user.visible_message("[user] adds \a [B] to [src]!", "You add \a [B] to [src]!")
return
-
- if(istype(G, /obj/item/screwdriver))
- if(occupant || on)
- to_chat(user, "The maintenance panel is locked.")
- return
- default_deconstruction_screwdriver(user, "pod0-o", "pod0", G)
- return
-
if(exchange_parts(user, G))
return
- if(default_deconstruction_crowbar(G))
- return
-
if(istype(G, /obj/item/grab))
var/obj/item/grab/GG = G
if(panel_open)
@@ -332,6 +321,17 @@
return
return ..()
+/obj/machinery/atmospherics/unary/cryo_cell/crowbar_act(mob/user, obj/item/I)
+ if(default_deconstruction_crowbar(user, I))
+ return
+
+/obj/machinery/atmospherics/unary/cryo_cell/screwdriver_act(mob/user, obj/item/I)
+ if(occupant || on)
+ to_chat(user, "The maintenance panel is locked.")
+ return TRUE
+ if(default_deconstruction_screwdriver(user, "pod0-o", "pod0", I))
+ return TRUE
+
/obj/machinery/atmospherics/unary/cryo_cell/update_icon()
handle_update_icon()
diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm
index 211f878231f..1fb2dfc422d 100644
--- a/code/game/machinery/dance_machine.dm
+++ b/code/game/machinery/dance_machine.dm
@@ -57,18 +57,19 @@
STOP_PROCESSING(SSobj, src)
return ..()
-/obj/machinery/disco/attackby(obj/item/O, mob/user, params)
- if(!active)
- if(iswrench(O))
- if(!anchored && !isinspace())
- to_chat(user,"You secure [src] to the floor.")
- anchored = TRUE
- else if(anchored)
- to_chat(user,"You unsecure and disconnect [src].")
- anchored = FALSE
- playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
+/obj/machinery/disco/wrench_act(mob/user, obj/item/I)
+ if(active)
return
- return ..()
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(!anchored && !isinspace())
+ anchored = TRUE
+ WRENCH_ANCHOR_MESSAGE
+ else if(anchored)
+ anchored = FALSE
+ WRENCH_UNANCHOR_MESSAGE
+ playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
/obj/machinery/disco/update_icon()
if(active)
diff --git a/code/game/machinery/defib_mount.dm b/code/game/machinery/defib_mount.dm
index 267ea5da392..ff9609a31bc 100644
--- a/code/game/machinery/defib_mount.dm
+++ b/code/game/machinery/defib_mount.dm
@@ -98,16 +98,6 @@
else if(defib && I == defib.paddles)
user.drop_item()
return
- else if(iswrench(I))
- if(!defib)
- user.visible_message("[user] unwrenches [src] from the wall!", \
- "You unwrench [src]!")
- new /obj/item/mounted/frame/defib_mount(get_turf(user))
- playsound(get_turf(src), I.usesound, 50, 1)
- qdel(src)
- return
- to_chat(user, "The [defib] is blocking access to the bolts!")
- return
var/obj/item/card/id = I.GetID()
if(id)
if(check_access(id) || security_level >= SEC_LEVEL_RED) //anyone can toggle the clamps in red alert!
@@ -122,6 +112,17 @@
return
return ..()
+/obj/machinery/defibrillator_mount/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(defib)
+ to_chat(user, "The [defib] is blocking access to the bolts!")
+ return
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ WRENCH_UNANCHOR_WALL_MESSAGE
+ new /obj/item/mounted/frame/defib_mount(get_turf(user))
+ qdel(src)
+
/obj/machinery/defibrillator_mount/AltClick(mob/living/carbon/user)
if(!istype(user))
return
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index 60d9953e980..f3f75f3c32c 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -29,17 +29,20 @@
if(stacktype)
new stacktype(get_turf(src), drop_amount)
-/obj/structure/barricade/attackby(obj/item/I, mob/user, params)
- if(iswelder(I) && user.a_intent != INTENT_HARM && bar_material == METAL)
- var/obj/item/weldingtool/WT = I
- if(obj_integrity < max_integrity)
- if(WT.remove_fuel(0, user))
- to_chat(user, "You begin repairing [src]...")
- playsound(loc, WT.usesound, 40, 1)
- if(do_after(user, 40 * I.toolspeed, target = src))
- obj_integrity = Clamp(obj_integrity + 20, 0, max_integrity)
- else
- return ..()
+/obj/structure/barricade/welder_act(mob/user, obj/item/I)
+ if(obj_integrity >= max_integrity)
+ to_chat(user, "[src] does not need repairs.")
+ return
+ if(user.a_intent == INTENT_HARM)
+ return
+ if(!I.tool_use_check(user, 0))
+ return
+ WELDER_ATTEMPT_REPAIR_MESSAGE
+ if(I.use_tool(src, user, 40, volume = I.tool_volume))
+ WELDER_REPAIR_SUCCESS_MESSAGE
+ obj_integrity = Clamp(obj_integrity + 20, 0, max_integrity)
+ update_icon()
+ return TRUE
/obj/structure/barricade/CanPass(atom/movable/mover, turf/target)//So bullets will fly over and stuff.
if(locate(/obj/structure/barricade) in get_turf(mover))
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 610bbb73b06..29e414ab658 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -37,6 +37,8 @@
#define AIRLOCK_INTEGRITY_MULTIPLIER 1.5 // How much reinforced doors health increases
#define AIRLOCK_DAMAGE_DEFLECTION_N 21 // Normal airlock damage deflection
#define AIRLOCK_DAMAGE_DEFLECTION_R 30 // Reinforced airlock damage deflection
+#define AIRLOCK_WELD_ME "weld"
+
var/list/airlock_overlays = list()
/obj/machinery/door/airlock
@@ -823,14 +825,9 @@ About the new airlock wires panel:
return 1
/obj/machinery/door/airlock/attackby(obj/item/C, mob/user, params)
- if(shock_user(user, 75))
- return
-
add_fingerprint(user)
-
- if(headbutt_airlock(user))//See if the user headbutts the airlock
+ if(!headbutt_shock_check(user))
return
-
if(panel_open)
switch(security_level)
if(AIRLOCK_SECURITY_NONE)
@@ -864,116 +861,7 @@ About the new airlock wires panel:
damage_deflection = AIRLOCK_DAMAGE_DEFLECTION_R
update_icon()
return
- if(AIRLOCK_SECURITY_METAL)
- if(iswelder(C))
- var/obj/item/weldingtool/WT = C
- if(!WT.remove_fuel(2, user))
- return
- to_chat(user, "You begin cutting the panel's shielding...")
- playsound(loc, WT.usesound, 40, 1)
- if(do_after(user, 40 * WT.toolspeed, 1, target = src))
- if(!panel_open || !WT.isOn())
- return
- playsound(loc, WT.usesound, 50, 1)
- user.visible_message("[user] cuts through \the [src]'s shielding.",
- "You cut through \the [src]'s shielding.",
- "You hear welding.")
- security_level = AIRLOCK_SECURITY_NONE
- spawn_atom_to_turf(/obj/item/stack/sheet/metal, user.loc, 2)
- update_icon()
- return
- if(AIRLOCK_SECURITY_PLASTEEL_I_S)
- if(iscrowbar(C))
- var/obj/item/crowbar/W = C
- to_chat(user, "You start removing the inner layer of shielding...")
- playsound(src, W.usesound, 100, 1)
- if(do_after(user, 40 * W.toolspeed, 1, target = src))
- if(!panel_open)
- return
- if(security_level != AIRLOCK_SECURITY_PLASTEEL_I_S)
- return
- user.visible_message("[user] remove \the [src]'s shielding.",
- "You remove \the [src]'s inner shielding.")
- security_level = AIRLOCK_SECURITY_NONE
- modify_max_integrity(normal_integrity)
- damage_deflection = AIRLOCK_DAMAGE_DEFLECTION_N
- spawn_atom_to_turf(/obj/item/stack/sheet/plasteel, user.loc, 1)
- update_icon()
- return
- if(AIRLOCK_SECURITY_PLASTEEL_I)
- if(iswelder(C))
- var/obj/item/weldingtool/WT = C
- if(!WT.remove_fuel(2, user))
- return
- to_chat(user, "You begin cutting the inner layer of shielding...")
- playsound(loc, WT.usesound, 40, 1)
- if(do_after(user, 40 * WT.toolspeed, 1, target = src))
- if(!panel_open || !WT.isOn())
- return
- playsound(loc, WT.usesound, 50, 1)
- user.visible_message("[user] cuts through \the [src]'s shielding.",
- "You cut through \the [src]'s shielding.",
- "You hear welding.")
- security_level = AIRLOCK_SECURITY_PLASTEEL_I_S
- return
- if(AIRLOCK_SECURITY_PLASTEEL_O_S)
- if(iscrowbar(C))
- var/obj/item/crowbar/W = C
- to_chat(user, "You start removing outer layer of shielding...")
- playsound(src, W.usesound, 100, 1)
- if(do_after(user, 40 * W.toolspeed, 1, target = src))
- if(!panel_open)
- return
- if(security_level != AIRLOCK_SECURITY_PLASTEEL_O_S)
- return
- user.visible_message("[user] remove \the [src]'s shielding.",
- "You remove \the [src]'s shielding.")
- security_level = AIRLOCK_SECURITY_PLASTEEL_I
- spawn_atom_to_turf(/obj/item/stack/sheet/plasteel, user.loc, 1)
- return
- if(AIRLOCK_SECURITY_PLASTEEL_O)
- if(iswelder(C))
- var/obj/item/weldingtool/WT = C
- if(!WT.remove_fuel(2, user))
- return
- to_chat(user, "You begin cutting the outer layer of shielding...")
- playsound(loc, WT.usesound, 40, 1)
- if(do_after(user, 40 * WT.toolspeed, 1, target = src))
- if(!panel_open || !WT.isOn())
- return
- playsound(loc, WT.usesound, 50, 1)
- user.visible_message("[user] cuts through \the [src]'s shielding.",
- "You cut through \the [src]'s shielding.",
- "You hear welding.")
- security_level = AIRLOCK_SECURITY_PLASTEEL_O_S
- return
- if(AIRLOCK_SECURITY_PLASTEEL)
- if(iswirecutter(C))
- var/obj/item/wirecutters/W = C
- if(arePowerSystemsOn() && shock(user, 60)) // Protective grille of wiring is electrified
- return
- to_chat(user, "You start cutting through the outer grille.")
- playsound(src, W.usesound, 100, 1)
- if(do_after(user, 10 * W.toolspeed, 1, target = src))
- if(!panel_open)
- return
- user.visible_message("[user] cut through \the [src]'s outer grille.",
- "You cut through \the [src]'s outer grille.")
- security_level = AIRLOCK_SECURITY_PLASTEEL_O
- return
- if(isscrewdriver(C))
- panel_open = !panel_open
- to_chat(user, "You [panel_open ? "open":"close"] the maintenance panel of the airlock.")
- playsound(loc, C.usesound, 50, 1)
- update_icon()
- else if(iswirecutter(C))
- if(note)
- remove_airlock_note(user, TRUE)
- else
- return interact_with_panel(user)
- else if(ismultitool(C))
- return interact_with_panel(user)
else if(istype(C, /obj/item/assembly/signaler))
return interact_with_panel(user)
else if(istype(C, /obj/item/pai_cable)) // -- TLE
@@ -993,102 +881,221 @@ About the new airlock wires panel:
else
return ..()
-/obj/machinery/door/airlock/try_to_weld(obj/item/weldingtool/W, mob/user)
+/obj/machinery/door/airlock/screwdriver_act(mob/user, obj/item/I)
+ if(!headbutt_shock_check(user))
+ return
+ if(user.a_intent == INTENT_HARM)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ panel_open = !panel_open
+ to_chat(user, "You [panel_open ? "open":"close"] [src]'s maintenance panel.")
+ update_icon()
+
+/obj/machinery/door/airlock/crowbar_act(mob/user, obj/item/I)
+ if(!headbutt_shock_check(user))
+ return
+ if(user.a_intent == INTENT_HARM)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = 0))
+ return
+ if(panel_open && security_level == AIRLOCK_SECURITY_PLASTEEL_I_S)
+ to_chat(user, "You start removing the inner layer of shielding...")
+ if(I.use_tool(src, user, 40, volume = I.tool_volume))
+ if(!panel_open || security_level != AIRLOCK_SECURITY_PLASTEEL_I_S)
+ return
+ user.visible_message("[user] remove \the [src]'s shielding.",
+ "You remove \the [src]'s inner shielding.")
+ security_level = AIRLOCK_SECURITY_NONE
+ modify_max_integrity(normal_integrity)
+ damage_deflection = AIRLOCK_DAMAGE_DEFLECTION_N
+ spawn_atom_to_turf(/obj/item/stack/sheet/plasteel, user.loc, 1)
+ update_icon()
+ else if(panel_open && security_level == AIRLOCK_SECURITY_PLASTEEL_O_S)
+ to_chat(user, "You start removing outer layer of shielding...")
+ if(I.use_tool(src, user, 40, volume = I.tool_volume))
+ if(!panel_open || security_level != AIRLOCK_SECURITY_PLASTEEL_O_S)
+ return
+ user.visible_message("[user] remove \the [src]'s shielding.",
+ "You remove \the [src]'s shielding.")
+ security_level = AIRLOCK_SECURITY_PLASTEEL_I
+ spawn_atom_to_turf(/obj/item/stack/sheet/plasteel, user.loc, 1)
+ else
+ try_to_crowbar(user, I)
+
+/obj/machinery/door/airlock/wirecutter_act(mob/user, obj/item/I)
+ if(!headbutt_shock_check(user))
+ return
+ if(!panel_open || user.a_intent == INTENT_HARM)
+ return
+ . = TRUE
+ if(!I.tool_start_check(user, 0))
+ return
+ if(security_level == AIRLOCK_SECURITY_PLASTEEL)
+ if(arePowerSystemsOn() && shock(user, 60)) // Protective grille of wiring is electrified
+ return
+ to_chat(user, "You start cutting through the outer grille.")
+ if(I.use_tool(src, user, 10, volume = I.tool_volume))
+ if(!panel_open || security_level != AIRLOCK_SECURITY_PLASTEEL)
+ return
+ user.visible_message("[user] cut through \the [src]'s outer grille.",
+ "You cut through \the [src]'s outer grille.")
+ security_level = AIRLOCK_SECURITY_PLASTEEL_O
+ return
+ if(note)
+ remove_airlock_note(user, TRUE)
+ else
+ return interact_with_panel(user)
+
+/obj/machinery/door/airlock/multitool_act(mob/user, obj/item/I)
+ if(!headbutt_shock_check(user))
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ interact_with_panel(user)
+
+/obj/machinery/door/airlock/welder_act(mob/user, obj/item/I) //This is god awful but I don't care
+ if(!headbutt_shock_check(user))
+ return
+ var/thing_to_do
if(!operating && density)
- if(user.a_intent != INTENT_HELP)
- if(W.remove_fuel(0, user))
+ thing_to_do = AIRLOCK_WELD_ME
+ else
+ thing_to_do = security_level
+ if(!thing_to_do)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ switch(thing_to_do)
+ if(AIRLOCK_WELD_ME)
+ if(user.a_intent != INTENT_HELP)
user.visible_message("[user] is [welded ? "unwelding":"welding"] the airlock.", \
- "You begin [welded ? "unwelding":"welding"] the airlock...", \
- "You hear welding.")
- playsound(loc, W.usesound, 40, 1)
- if(do_after(user, 40 * W.toolspeed, 1, target = src, extra_checks = CALLBACK(src, .proc/weld_checks, W, user)))
- playsound(loc, 'sound/items/welder2.ogg', 50, 1)
+ "You begin [welded ? "unwelding":"welding"] the airlock...", \
+ "You hear welding.")
+
+ if(I.use_tool(src, user, 40, volume = I.tool_volume, extra_checks = CALLBACK(src, .proc/weld_checks, I, user)))
+ if(!density && !welded)
+ return
welded = !welded
user.visible_message("[user.name] has [welded? "welded shut":"unwelded"] [src].", \
- "You [welded ? "weld the airlock shut":"unweld the airlock"].")
+ "You [welded ? "weld the airlock shut":"unweld the airlock"].")
update_icon()
- else
- if(obj_integrity < max_integrity)
- if(W.remove_fuel(0, user))
- user.visible_message("[user] is welding the airlock.", \
- "You begin repairing the airlock...", \
- "You hear welding.")
- playsound(loc, W.usesound, 40, 1)
- if(do_after(user, 40 * W.toolspeed, 1, target = src, extra_checks = CALLBACK(src, .proc/weld_checks, W, user)))
- playsound(loc, 'sound/items/welder2.ogg', 50, 1)
- obj_integrity = max_integrity
- stat &= ~BROKEN
- user.visible_message("[user.name] has repaired [src].", \
- "You finish repairing the airlock.")
- update_icon()
+ else if(obj_integrity < max_integrity)
+ user.visible_message("[user] is welding the airlock.", \
+ "You begin repairing the airlock...", \
+ "You hear welding.")
+ if(I.use_tool(src, user, 40, volume = I.tool_volume, extra_checks = CALLBACK(src, .proc/weld_checks, I, user)))
+ obj_integrity = max_integrity
+ stat &= ~BROKEN
+ user.visible_message("[user.name] has repaired [src].", \
+ "You finish repairing the airlock.")
+ update_icon()
else
to_chat(user, "The airlock doesn't need repairing.")
+ if(AIRLOCK_SECURITY_METAL)
+ to_chat(user, "You begin cutting the panel's shielding...")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume))
+ return
+ if(!panel_open)
+ return
+ visible_message("[user] cuts through \the [src]'s shielding.",
+ "You cut through \the [src]'s shielding.",
+ "You hear welding.")
+ security_level = AIRLOCK_SECURITY_NONE
+ spawn_atom_to_turf(/obj/item/stack/sheet/metal, user.loc, 2)
+ if(AIRLOCK_SECURITY_PLASTEEL_O)
+ to_chat(user, "You begin cutting the outer layer of shielding...")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume))
+ return
+ if(!panel_open)
+ return
+ visible_message("[user] cuts through \the [src]'s shielding.",
+ "You cut through \the [src]'s shielding.",
+ "You hear welding.")
+ security_level = AIRLOCK_SECURITY_PLASTEEL_O_S
+ if(AIRLOCK_SECURITY_PLASTEEL_I)
+ to_chat(user, "You begin cutting the inner layer of shielding...")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume))
+ return
+ if(!panel_open)
+ return
+ user.visible_message("[user] cuts through \the [src]'s shielding.",
+ "You cut through \the [src]'s shielding.",
+ "You hear welding.")
+ security_level = AIRLOCK_SECURITY_PLASTEEL_I_S
+ update_icon()
-/obj/machinery/door/airlock/proc/weld_checks(obj/item/weldingtool/W, mob/user)
- return !operating && density && user && W && W.isOn() && user.loc
+/obj/machinery/door/airlock/proc/weld_checks(obj/item/I, mob/user)
+ return !operating && density && user && I && I.tool_use_check() && user.loc
-/obj/machinery/door/airlock/try_to_crowbar(obj/item/I, mob/living/user)
- var/beingcrowbarred = null
- if(iscrowbar(I))
- beingcrowbarred = 1
- else
- beingcrowbarred = 0
- if(beingcrowbarred && panel_open && ((emagged) || (density && welded && !operating && !arePowerSystemsOn() && !locked)))
- playsound(loc, I.usesound, 100, 1)
+/obj/machinery/door/airlock/proc/headbutt_shock_check(mob/user)
+ if(shock_user(user, 75))
+ return
+ if(headbutt_airlock(user))//See if the user headbutts the airlock
+ return
+ return TRUE
+
+/obj/machinery/door/airlock/try_to_crowbar(mob/living/user, obj/item/I) //*scream
+ if(operating)
+ return
+ var/beingcrowbarred = FALSE
+ if(I.tool_behaviour == TOOL_CROWBAR && I.tool_use_check(user, 0))
+ beingcrowbarred = TRUE
+ if(beingcrowbarred && panel_open && (emagged || (density && welded && !operating && !arePowerSystemsOn() && !locked)))
user.visible_message("[user] removes the electronics from the airlock assembly.", \
"You start to remove electronics from the airlock assembly...")
- if(do_after(user, 40 * I.toolspeed, target = src))
+ if(I.use_tool(src, user, 40, volume = I.tool_volume))
deconstruct(TRUE, user)
- return
- else if(arePowerSystemsOn())
- to_chat(user, "The airlock's motors resist your efforts to force it!")
- else if(locked)
+ return
+ if(welded)
+ to_chat(user, "[src] is welded shut!")
+ return
+ if(locked)
to_chat(user, "The airlock's bolts prevent it from being forced!")
- else if(!welded && !operating)
- if(istype(I, /obj/item/twohanded/fireaxe)) //let's make this more specific
- var/obj/item/twohanded/fireaxe/F = I
- if(F.wielded)
- spawn(0)
- if(density)
- open(1)
- else
- close(1)
- else
- to_chat(user, "You need to be wielding the fire axe to do that!")
- else
+ return
+ if(istype(I, /obj/item/twohanded/fireaxe)) //let's make this more specific //FUCK YOU
+ var/obj/item/twohanded/fireaxe/F = I
+ if(F.wielded)
spawn(0)
if(density)
open(1)
else
close(1)
-
- if(ispowertool(I)) //jaws of life and rescue claw
- if(isElectrified())
- shock(user, 100)//it's like sticking a forck in a power socket
+ else
+ to_chat(user, "You need to be wielding the fire axe to do that!")
return
-
- if(!density)//already open
- return
-
- if(locked)
- to_chat(user, "The bolts are down, it won't budge!")
- return
-
- if(welded)
- to_chat(user, "It's welded, it won't budge!")
- return
-
- var/time_to_open = 5
- if(arePowerSystemsOn() && !prying_so_hard)
- time_to_open = 50
- playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, 1) //is it aliens or just the CE being a dick?
- prying_so_hard = TRUE
- var/result = do_after(user, time_to_open, target = src)
- prying_so_hard = FALSE
- if(result)
+ else if(!arePowerSystemsOn())
+ spawn(0)
+ if(density)
open(1)
- if(density && !open(1))
- to_chat(user, "Despite your attempts, [src] refuses to open.")
+ else
+ close(1)
+ return
+ else if(!ispowertool(I))
+ to_chat(user, "The airlock's motors resist your efforts to force it!")
+ return
+ if(isElectrified())
+ shock(user, 100)//it's like sticking a forck in a power socket
+ return
+
+ if(!density)//already open
+ return
+
+ var/time_to_open = 5
+ if(!prying_so_hard)
+ time_to_open = 50
+ playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, 1) //is it aliens or just the CE being a dick?
+ prying_so_hard = TRUE
+ var/result = do_after(user, time_to_open, target = src)
+ prying_so_hard = FALSE
+ if(result)
+ open(1)
+ if(density && !open(1))
+ to_chat(user, "Despite your attempts, [src] refuses to open.")
/obj/machinery/door/airlock/open(forced=0)
if(operating || welded || locked || emagged)
@@ -1391,3 +1398,4 @@ About the new airlock wires panel:
#undef AIRLOCK_INTEGRITY_MULTIPLIER
#undef AIRLOCK_DAMAGE_DEFLECTION_N
#undef AIRLOCK_DAMAGE_DEFLECTION_R
+#undef AIRLOCK_WELD_ME
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
index b53a0139fb2..96e4ec8da1c 100644
--- a/code/game/machinery/doors/airlock_types.dm
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -379,14 +379,20 @@
return
add_fingerprint(user)
- if((iswelder(C) && !operating && density))
- var/obj/item/weldingtool/W = C
- if(W.remove_fuel(0,user))
- welded = !welded
- update_icon()
- return
- else
- return
+
+/obj/machinery/door/airlock/hatch/gamma/welder_act(mob/user, obj/item/I)
+ if(shock_user(user, 75))
+ return
+ if(operating || !density)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, amount = 0, volume = I.tool_volume))
+ return
+ welded = !welded
+ visible_message("[user] [welded ? null : "un"]welds [src]!",\
+ "You [welded ? null : "un"]weld [src]!",\
+ "You hear welding.")
+ update_icon()
/obj/machinery/door/airlock/maintenance_hatch
name = "maintenance hatch"
@@ -424,14 +430,22 @@
return
add_fingerprint(user)
- if((iswelder(C) && !operating && density))
- var/obj/item/weldingtool/W = C
- if(W.remove_fuel(0,user))
- welded = !welded
- update_icon()
- return
- else
- return
+
+
+/obj/machinery/door/airlock/highsecurity/red/welder_act(mob/user, obj/item/I)
+ if(shock_user(user, 75))
+ return
+ if(operating || !density)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ welded = !welded
+ visible_message("[user] [welded ? null : "un"]welds [src]!",\
+ "You [welded ? null : "un"]weld [src]!",\
+ "You hear welding.")
+ update_icon()
+
//////////////////////////////////
/*
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index d1144d7317d..e1a9e78f5b3 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -185,24 +185,27 @@
/obj/machinery/door/proc/unrestricted_side(mob/M) //Allows for specific side of airlocks to be unrestrected (IE, can exit maint freely, but need access to enter)
return get_dir(src, M) & unres_sides
-/obj/machinery/door/proc/try_to_weld(obj/item/weldingtool/W, mob/user)
- return
-
/obj/machinery/door/proc/try_to_crowbar(obj/item/I, mob/user)
return
/obj/machinery/door/attackby(obj/item/I, mob/user, params)
- if(user.a_intent != INTENT_HARM && (iscrowbar(I) || istype(I, /obj/item/twohanded/fireaxe)))
+ if(user.a_intent != INTENT_HARM && istype(I, /obj/item/twohanded/fireaxe))
try_to_crowbar(I, user)
return 1
- else if(iswelder(I))
- try_to_weld(I, user)
- return 1
else if(!(I.flags & NOBLUDGEON) && user.a_intent != INTENT_HARM)
try_to_activate_door(user)
return 1
return ..()
+
+/obj/machinery/door/crowbar_act(mob/user, obj/item/I)
+ if(user.a_intent == INTENT_HARM)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ try_to_crowbar(I, user)
+
/obj/machinery/door/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
. = ..()
if(. && obj_integrity > 0)
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index d562c6b78ea..43dada83ca9 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -87,47 +87,60 @@
if(operating)
return
-
- if(welded)
- if(iswrench(C))
- if(boltslocked)
- to_chat(user, "There are screws locking the bolts in place!")
- return
- playsound(get_turf(src), C.usesound, 50, 1)
- user.visible_message("[user] starts undoing [src]'s bolts...", \
- "You start unfastening [src]'s floor bolts...")
- if(!do_after(user, 50 * C.toolspeed, target = src))
- return
- playsound(get_turf(src), C.usesound, 50, 1)
- user.visible_message("[user] unfastens [src]'s bolts.", \
- "You undo [src]'s floor bolts.")
- deconstruct(TRUE)
- return
- if(isscrewdriver(C))
- user.visible_message("[user] [boltslocked ? "unlocks" : "locks"] [src]'s bolts.", \
- "You [boltslocked ? "unlock" : "lock"] [src]'s floor bolts.")
- playsound(get_turf(src), C.usesound, 50, 1)
- boltslocked = !boltslocked
- return
-
return ..()
/obj/machinery/door/firedoor/try_to_activate_door(mob/user)
return
-/obj/machinery/door/firedoor/try_to_weld(obj/item/weldingtool/W, mob/user)
- if(W.remove_fuel(0, user))
- playsound(get_turf(src), W.usesound, 50, 1)
- user.visible_message("[user] starts [welded ? "unwelding" : "welding"] [src].", "You start welding [src].")
- if(do_after(user, 40 * W.toolspeed, 1, target=src))
- welded = !welded
- to_chat(user, "[user] [welded ? "welds" : "unwelds"] [src].", "You [welded ? "weld" : "unweld"] [src].")
- update_icon()
+/obj/machinery/door/firedoor/screwdriver_act(mob/user, obj/item/I)
+ if(user.a_intent == INTENT_HARM)
+ return
+ if(operating || !welded)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ user.visible_message("[user] [boltslocked ? "unlocks" : "locks"] [src]'s bolts.", \
+ "You [boltslocked ? "unlock" : "lock"] [src]'s floor bolts.")
+ boltslocked = !boltslocked
+
+/obj/machinery/door/firedoor/wrench_act(mob/user, obj/item/I)
+ if(user.a_intent == INTENT_HARM)
+ return
+ if(operating || !welded)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ if(boltslocked)
+ to_chat(user, "There are screws locking the bolts in place!")
+ return
+ user.visible_message("[user] starts undoing [src]'s bolts...", \
+ "You start unfastening [src]'s floor bolts...")
+ if(!I.use_tool(src, user, 50, volume = I.tool_volume) || boltslocked)
+ return
+ user.visible_message("[user] unfastens [src]'s bolts.", \
+ "You undo [src]'s floor bolts.")
+ deconstruct(TRUE)
+
+/obj/machinery/door/firedoor/welder_act(mob/user, obj/item/I)
+ if(!density)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ WELDER_ATTEMPT_WELD_MESSAGE
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume))
+ return
+ if(!density) //In case someone opens it while it's getting welded
+ return
+ WELDER_WELD_SUCCESS_MESSAGE
+ welded = !welded
+ update_icon()
/obj/machinery/door/firedoor/try_to_crowbar(obj/item/I, mob/user)
if(welded || operating)
return
-
if(density)
open()
else
@@ -308,40 +321,6 @@
/obj/structure/firelock_frame/attackby(obj/item/C, mob/user)
switch(constructionStep)
if(CONSTRUCTION_PANEL_OPEN)
- if(iscrowbar(C))
- playsound(get_turf(src), C.usesound, 50, 1)
- user.visible_message("[user] starts prying something out from [src]...", \
- "You begin prying out the wire cover...")
- if(!do_after(user, 50 * C.toolspeed, target = src))
- return
- if(constructionStep != CONSTRUCTION_PANEL_OPEN)
- return
- playsound(get_turf(src), C.usesound, 50, 1)
- user.visible_message("[user] pries out a metal plate from [src], exposing the wires.", \
- "You remove the cover plate from [src], exposing the wires.")
- constructionStep = CONSTRUCTION_WIRES_EXPOSED
- update_icon()
- return
- if(iswrench(C))
- if(locate(/obj/machinery/door/firedoor) in get_turf(src))
- to_chat(user, "There's already a firelock there.")
- return
- playsound(get_turf(src), C.usesound, 50, 1)
- user.visible_message("[user] starts bolting down [src]...", \
- "You begin bolting [src]...")
- if(!do_after(user, 30 * C.toolspeed, target = src))
- return
- if(locate(/obj/machinery/door/firedoor) in get_turf(src))
- return
- user.visible_message("[user] finishes the firelock.", \
- "You finish the firelock.")
- playsound(get_turf(src), C.usesound, 50, 1)
- if(reinforced)
- new /obj/machinery/door/firedoor/heavy(get_turf(src))
- else
- new /obj/machinery/door/firedoor(get_turf(src))
- qdel(src)
- return
if(istype(C, /obj/item/stack/sheet/plasteel))
var/obj/item/stack/sheet/plasteel/P = C
if(reinforced)
@@ -362,53 +341,7 @@
P.use(2)
reinforced = 1
return
-
- if(CONSTRUCTION_WIRES_EXPOSED)
- if(iswirecutter(C))
- playsound(get_turf(src), C.usesound, 50, 1)
- user.visible_message("[user] starts cutting the wires from [src]...", \
- "You begin removing [src]'s wires...")
- if(!do_after(user, 60 * C.toolspeed, target = src))
- return
- if(constructionStep != CONSTRUCTION_WIRES_EXPOSED)
- return
- user.visible_message("[user] removes the wires from [src].", \
- "You remove the wiring from [src], exposing the circuit board.")
- var/obj/item/stack/cable_coil/B = new(get_turf(src))
- B.amount = 5
- constructionStep = CONSTRUCTION_GUTTED
- update_icon()
- return
- if(iscrowbar(C))
- playsound(get_turf(src), C.usesound, 50, 1)
- user.visible_message("[user] starts prying a metal plate into [src]...", \
- "You begin prying the cover plate back onto [src]...")
- if(!do_after(user, 80 * C.toolspeed, target = src))
- return
- if(constructionStep != CONSTRUCTION_WIRES_EXPOSED)
- return
- playsound(get_turf(src), C.usesound, 50, 1)
- user.visible_message("[user] pries the metal plate into [src].", \
- "You pry [src]'s cover plate into place, hiding the wires.")
- constructionStep = CONSTRUCTION_PANEL_OPEN
- update_icon()
- return
if(CONSTRUCTION_GUTTED)
- if(iscrowbar(C))
- user.visible_message("[user] begins removing the circuit board from [src]...", \
- "You begin prying out the circuit board from [src]...")
- playsound(get_turf(src), C.usesound, 50, 1)
- if(!do_after(user, 50 * C.toolspeed, target = src))
- return
- if(constructionStep != CONSTRUCTION_GUTTED)
- return
- user.visible_message("[user] removes [src]'s circuit board.", \
- "You remove the circuit board from [src].")
- new /obj/item/firelock_electronics(get_turf(src))
- playsound(get_turf(src), C.usesound, 50, 1)
- constructionStep = CONSTRUCTION_NOCIRCUIT
- update_icon()
- return
if(iscoil(C))
var/obj/item/stack/cable_coil/B = C
if(B.get_amount() < 5)
@@ -427,26 +360,6 @@
constructionStep = CONSTRUCTION_WIRES_EXPOSED
update_icon()
return
- if(CONSTRUCTION_NOCIRCUIT)
- if(iswelder(C))
- var/obj/item/weldingtool/W = C
- if(W.remove_fuel(1,user))
- playsound(get_turf(src), W.usesound, 50, 1)
- user.visible_message("[user] begins cutting apart [src]'s frame...", \
- "You begin slicing [src] apart...")
- if(!do_after(user, 40 * W.toolspeed, target = src))
- return
- if(constructionStep != CONSTRUCTION_NOCIRCUIT)
- return
- user.visible_message("[user] cuts apart [src]!", \
- "You cut [src] into metal.")
- playsound(get_turf(src), W.usesound, 50, 1)
- var/turf/T = get_turf(src)
- new /obj/item/stack/sheet/metal(T, 3)
- if(reinforced)
- new /obj/item/stack/sheet/plasteel(T, 2)
- qdel(src)
- return
if(istype(C, /obj/item/firelock_electronics))
user.visible_message("[user] starts adding [C] to [src]...", \
"You begin adding a circuit board to [src]...")
@@ -465,6 +378,109 @@
return
return ..()
+/obj/structure/firelock_frame/crowbar_act(mob/user, obj/item/I)
+ if(!(constructionStep in list(CONSTRUCTION_WIRES_EXPOSED, CONSTRUCTION_PANEL_OPEN, CONSTRUCTION_GUTTED)))
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ if(constructionStep == CONSTRUCTION_WIRES_EXPOSED)
+ user.visible_message("[user] starts prying a metal plate into [src]...", \
+ "You begin prying the cover plate back onto [src]...")
+ if(!I.use_tool(src, user, 50, volume = I.tool_volume))
+ return
+ if(constructionStep != CONSTRUCTION_WIRES_EXPOSED)
+ return
+ user.visible_message("[user] pries the metal plate into [src].", \
+ "You pry [src]'s cover plate into place, hiding the wires.")
+ constructionStep = CONSTRUCTION_PANEL_OPEN
+ else if(constructionStep == CONSTRUCTION_PANEL_OPEN)
+ user.visible_message("[user] starts prying something out from [src]...", \
+ "You begin prying out the wire cover...")
+ if(!I.use_tool(src, user, 50, volume = I.tool_volume))
+ return
+ if(constructionStep != CONSTRUCTION_PANEL_OPEN)
+ return
+ user.visible_message("[user] pries out a metal plate from [src], exposing the wires.", \
+ "You remove the cover plate from [src], exposing the wires.")
+ constructionStep = CONSTRUCTION_WIRES_EXPOSED
+ else if(constructionStep == CONSTRUCTION_GUTTED)
+ user.visible_message("[user] begins removing the circuit board from [src]...", \
+ "You begin prying out the circuit board from [src]...")
+ if(!I.use_tool(src, user, 50, volume = I.tool_volume))
+ return
+ if(constructionStep != CONSTRUCTION_GUTTED)
+ return
+ user.visible_message("[user] removes [src]'s circuit board.", \
+ "You remove the circuit board from [src].")
+ new /obj/item/firelock_electronics(get_turf(src))
+ constructionStep = CONSTRUCTION_NOCIRCUIT
+ update_icon()
+
+/obj/structure/firelock_frame/wirecutter_act(mob/user, obj/item/I)
+ if(constructionStep != CONSTRUCTION_WIRES_EXPOSED)
+ return
+ . = TRUE
+ if(!I.tool_start_check(user, 0))
+ return
+
+ user.visible_message("[user] starts cutting the wires from [src]...", \
+ "You begin removing [src]'s wires...")
+ if(!I.use_tool(src, user, 50, volume = I.tool_volume))
+ return
+ if(constructionStep != CONSTRUCTION_WIRES_EXPOSED)
+ return
+ user.visible_message("[user] removes the wires from [src].", \
+ "You remove the wiring from [src], exposing the circuit board.")
+ var/obj/item/stack/cable_coil/B = new(get_turf(src))
+ B.amount = 5
+ constructionStep = CONSTRUCTION_GUTTED
+ update_icon()
+
+/obj/structure/firelock_frame/wrench_act(mob/user, obj/item/I)
+ if(constructionStep != CONSTRUCTION_PANEL_OPEN)
+ return
+ . = TRUE
+ if(locate(/obj/machinery/door/firedoor) in get_turf(src))
+ to_chat(user, "There's already a firelock there.")
+ return
+ if(!I.tool_start_check(user, 0))
+ return
+ user.visible_message("[user] starts bolting down [src]...", \
+ "You begin bolting [src]...")
+ if(!I.use_tool(src, user, 50, volume = I.tool_volume))
+ return
+ if(locate(/obj/machinery/door/firedoor) in get_turf(src))
+ return
+ user.visible_message("[user] finishes the firelock.", \
+ "You finish the firelock.")
+ if(reinforced)
+ new /obj/machinery/door/firedoor/heavy(get_turf(src))
+ else
+ new /obj/machinery/door/firedoor(get_turf(src))
+ qdel(src)
+
+
+
+
+
+/obj/structure/firelock_frame/welder_act(mob/user, obj/item/I)
+ if(constructionStep != CONSTRUCTION_NOCIRCUIT)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ WELDER_ATTEMPT_SLICING_MESSAGE
+ if(!I.use_tool(src, user, 40, amount = 1, volume = I.tool_volume))
+ return
+ if(constructionStep != CONSTRUCTION_NOCIRCUIT)
+ return
+ WELDER_SLICING_SUCCESS_MESSAGE
+ new /obj/item/stack/sheet/metal(drop_location(), 3)
+ if(reinforced)
+ new /obj/item/stack/sheet/plasteel(drop_location(), 2)
+ qdel(src)
+
/obj/structure/firelock_frame/heavy
name = "heavy firelock frame"
reinforced = 1
@@ -473,4 +489,4 @@
#undef CONSTRUCTION_PANEL_OPEN
#undef CONSTRUCTION_WIRES_EXPOSED
#undef CONSTRUCTION_GUTTED
-#undef CONSTRUCTION_NOCIRCUIT
\ No newline at end of file
+#undef CONSTRUCTION_NOCIRCUIT
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index fe104ff794c..a69535e9fc9 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -231,69 +231,79 @@
return
add_fingerprint(user)
-
- if(!(flags & NODECONSTRUCT))
- if(isscrewdriver(I))
- if(density || operating)
- to_chat(user, "You need to open the door to access the maintenance panel!")
- return
- playsound(src.loc, I.usesound, 50, 1)
- panel_open = !panel_open
- to_chat(user, "You [panel_open ? "open":"close"] the maintenance panel of the [src.name].")
- return
-
- if(iscrowbar(I))
- if(panel_open && !density && !operating)
- playsound(loc, I.usesound, 100, 1)
- user.visible_message("[user] removes the electronics from the [name].", \
- "You start to remove electronics from the [name]...")
- if(do_after(user, 40 * I.toolspeed, target = src))
- if(panel_open && !density && !operating && loc)
- var/obj/structure/windoor_assembly/WA = new /obj/structure/windoor_assembly(loc)
- switch(base_state)
- if("left")
- WA.facing = "l"
- if("right")
- WA.facing = "r"
- if("leftsecure")
- WA.facing = "l"
- WA.secure = TRUE
- if("rightsecure")
- WA.facing = "r"
- WA.secure = TRUE
- WA.anchored = TRUE
- WA.state= "02"
- WA.setDir(dir)
- WA.ini_dir = dir
- WA.update_icon()
- WA.created_name = name
-
- if(emagged)
- to_chat(user, "You discard the damaged electronics.")
- qdel(src)
- return
-
- to_chat(user, "You remove the airlock electronics.")
-
- var/obj/item/airlock_electronics/ae
- if(!electronics)
- ae = new/obj/item/airlock_electronics(loc)
- if(!req_access)
- check_access()
- if(req_access.len)
- ae.conf_access = req_access
- else if(req_one_access.len)
- ae.conf_access = req_one_access
- ae.one_access = 1
- else
- ae = electronics
- electronics = null
- ae.forceMove(loc)
-
- qdel(src)
- return
return ..()
+/obj/machinery/door/window/screwdriver_act(mob/user, obj/item/I)
+ if(flags & NODECONSTRUCT)
+ return
+ . = TRUE
+ if(density || operating)
+ to_chat(user, "You need to open the door to access the maintenance panel!")
+ return
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ panel_open = !panel_open
+ to_chat(user, "You [panel_open ? "open":"close"] the maintenance panel of the [src.name].")
+
+
+/obj/machinery/door/window/crowbar_act(mob/user, obj/item/I)
+ if(operating)
+ return
+ if(flags & NODECONSTRUCT)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ if(panel_open && !density && !operating)
+ user.visible_message("[user] removes the electronics from the [name].", \
+ "You start to remove electronics from the [name]...")
+ if(I.use_tool(src, user, 40, volume = I.tool_volume))
+ if(panel_open && !density && !operating && loc)
+ var/obj/structure/windoor_assembly/WA = new /obj/structure/windoor_assembly(loc)
+ switch(base_state)
+ if("left")
+ WA.facing = "l"
+ if("right")
+ WA.facing = "r"
+ if("leftsecure")
+ WA.facing = "l"
+ WA.secure = TRUE
+ if("rightsecure")
+ WA.facing = "r"
+ WA.secure = TRUE
+ WA.anchored = TRUE
+ WA.state= "02"
+ WA.setDir(dir)
+ WA.ini_dir = dir
+ WA.update_icon()
+ WA.created_name = name
+
+ if(emagged)
+ to_chat(user, "You discard the damaged electronics.")
+ qdel(src)
+ return
+
+ to_chat(user, "You remove the airlock electronics.")
+
+ var/obj/item/airlock_electronics/ae
+ if(!electronics)
+ ae = new/obj/item/airlock_electronics(loc)
+ if(!req_access)
+ check_access()
+ if(req_access.len)
+ ae.conf_access = req_access
+ else if(req_one_access.len)
+ ae.conf_access = req_one_access
+ ae.one_access = 1
+ else
+ ae = electronics
+ electronics = null
+ ae.forceMove(loc)
+
+ qdel(src)
+ else
+ try_to_crowbar(I, user)
+
/obj/machinery/door/window/try_to_crowbar(obj/item/I, mob/user)
if(!hasPower())
if(density)
diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm
index d4dc8f854ef..d0fe753a9de 100644
--- a/code/game/machinery/doppler_array.dm
+++ b/code/game/machinery/doppler_array.dm
@@ -41,17 +41,6 @@ var/list/doppler_arrays = list()
return PROCESS_KILL
/obj/machinery/doppler_array/attackby(obj/item/I, mob/user, params)
- if(iswrench(I))
- if(!anchored && !isinspace())
- anchored = TRUE
- power_change()
- to_chat(user, "You fasten [src].")
- else if(anchored)
- anchored = FALSE
- power_change()
- to_chat(user, "You unfasten [src].")
- playsound(loc, I.usesound, 50, 1)
- return
if(istype(I, /obj/item/disk/tech_disk))
var/obj/item/disk/tech_disk/disk = I
disk.load_tech(toxins_tech)
@@ -59,6 +48,18 @@ var/list/doppler_arrays = list()
return
return ..()
+/obj/machinery/doppler_array/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(!anchored && !isinspace())
+ anchored = TRUE
+ WRENCH_ANCHOR_MESSAGE
+ else if(anchored)
+ anchored = FALSE
+ WRENCH_UNANCHOR_MESSAGE
+ power_change()
+
/obj/machinery/doppler_array/attack_hand(mob/user)
if(..())
return
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 255d8d3cce1..7ae268fca46 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -1,6 +1,11 @@
/*
FIRE ALARM
*/
+
+#define FIRE_ALARM_FRAME 0
+#define FIRE_ALARM_UNWIRED 1
+#define FIRE_ALARM_READY 2
+
/obj/machinery/firealarm
name = "fire alarm"
desc = "\"Pull this in case of emergency\". Thus, keep pulling it forever."
@@ -83,68 +88,94 @@ FIRE ALARM
/obj/machinery/firealarm/attackby(obj/item/I, mob/user, params)
add_fingerprint(user)
-
- if(isscrewdriver(I) && buildstage == 2)
- wiresexposed = !wiresexposed
- update_icon()
- return
-
if(wiresexposed)
- switch(buildstage)
- if(2)
- if(ismultitool(I))
- detecting = !detecting
- if(detecting)
- user.visible_message("[user] has reconnected [src]'s detecting unit!", "You have reconnected [src]'s detecting unit.")
- else
- user.visible_message("[user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.")
-
- else if(iswirecutter(I)) // cutting the wires out
+ if(buildstage == FIRE_ALARM_UNWIRED)
+ if(istype(I, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/coil = I
+ if(!coil.use(5))
to_chat(user, "You cut the wires!")
- playsound(loc, I.usesound, 50, 1)
- var/obj/item/stack/cable_coil/new_coil = new /obj/item/stack/cable_coil()
- new_coil.amount = 5
- new_coil.forceMove(user.loc)
- buildstage = 1
- update_icon()
- if(1)
- if(istype(I, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/coil = I
- if(!coil.use(5))
- to_chat(user, "You cut the wires!")
- return
-
- buildstage = 2
- playsound(get_turf(src), I.usesound, 50, 1)
- to_chat(user, "You wire [src]!")
- update_icon()
-
- else if(iscrowbar(I))
- to_chat(user, "You pry out the circuit!")
- playsound(get_turf(src), I.usesound, 50, 1)
- if(do_after(user, 20 * I.toolspeed, target = src))
- if(buildstage != 1)
- return
- var/obj/item/firealarm_electronics/circuit = new /obj/item/firealarm_electronics()
- circuit.forceMove(get_turf(src))
- buildstage = 0
- update_icon()
- if(0)
- if(istype(I, /obj/item/firealarm_electronics))
- to_chat(user, "You insert the circuit!")
- qdel(I)
- buildstage = 1
- update_icon()
-
- else if(iswrench(I))
- to_chat(user, "You remove the fire alarm assembly from the wall!")
- new /obj/item/mounted/frame/firealarm(get_turf(user))
- playsound(get_turf(src), I.usesound, 50, 1)
- qdel(src)
+ return
+ buildstage = FIRE_ALARM_READY
+ playsound(get_turf(src), I.usesound, 50, 1)
+ to_chat(user, "You wire [src]!")
+ update_icon()
+ if(buildstage == FIRE_ALARM_FRAME)
+ if(istype(I, /obj/item/firealarm_electronics))
+ to_chat(user, "You insert the circuit!")
+ qdel(I)
+ buildstage = FIRE_ALARM_UNWIRED
+ update_icon()
return
return ..()
+/obj/machinery/firealarm/crowbar_act(mob/user, obj/item/I)
+ if(buildstage != FIRE_ALARM_UNWIRED)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ CROWBAR_ATTEMPT_PRY_CIRCUIT_MESSAGE
+ if(!I.use_tool(src, user, 20, volume = I.tool_volume) || buildstage != FIRE_ALARM_UNWIRED)
+ return
+ new /obj/item/firealarm_electronics(drop_location())
+ buildstage = FIRE_ALARM_FRAME
+ update_icon()
+ CROWBAR_PRY_CIRCUIT_SUCCESS_MESSAGE
+
+/obj/machinery/firealarm/multitool_act(mob/user, obj/item/I)
+ if(buildstage != FIRE_ALARM_READY)
+ return
+ . = TRUE
+ if(!wiresexposed)
+ to_chat(user, "You need to expose the wires first!")
+ return
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ detecting = !detecting
+ if(detecting)
+ user.visible_message("[user] has reconnected [src]'s detecting unit!", "You have reconnected [src]'s detecting unit.")
+ else
+ user.visible_message("[user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.")
+
+/obj/machinery/firealarm/screwdriver_act(mob/user, obj/item/I)
+ if(buildstage != FIRE_ALARM_READY)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ wiresexposed = !wiresexposed
+ if(wiresexposed)
+ SCREWDRIVER_OPEN_PANEL_MESSAGE
+ else
+ SCREWDRIVER_CLOSE_PANEL_MESSAGE
+ update_icon()
+
+/obj/machinery/firealarm/wirecutter_act(mob/user, obj/item/I)
+ if(buildstage != FIRE_ALARM_READY)
+ return
+ . = TRUE
+ if(!wiresexposed)
+ to_chat(user, "You need to expose the wires first!")
+ return
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ WIRECUTTER_SNIP_MESSAGE
+ var/obj/item/stack/cable_coil/new_coil = new /obj/item/stack/cable_coil(drop_location())
+ new_coil.amount = 5
+ buildstage = FIRE_ALARM_UNWIRED
+
+
+/obj/machinery/firealarm/wrench_act(mob/user, obj/item/I)
+ if(buildstage != FIRE_ALARM_FRAME)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ WRENCH_UNANCHOR_WALL_MESSAGE
+ new /obj/item/mounted/frame/firealarm(get_turf(user))
+ qdel(src)
+
/obj/machinery/firealarm/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
. = ..()
if(.) //damage received
@@ -406,3 +437,8 @@ Just a object used in constructing fire alarms
usr << browse(null, "window=partyalarm")
return
return
+
+
+#undef FIRE_ALARM_FRAME
+#undef FIRE_ALARM_UNWIRED
+#undef FIRE_ALARM_READY
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index 30069ff0310..1f42a6a78c4 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -40,18 +40,6 @@
icon_state = "[base_state]1-p"
// sd_set_light(0)
-//Don't want to render prison breaks impossible
-/obj/machinery/flasher/attackby(obj/item/I, mob/user, params)
- if(iswirecutter(I))
- add_fingerprint(user)
- disable = !disable
- if(disable)
- user.visible_message("[user] has disconnected [src]'s flashbulb!", "You disconnect [src]'s flashbulb!")
- if(!disable)
- user.visible_message("[user] has connected [src]'s flashbulb!", "You connect [src]'s flashbulb!")
- else
- return ..()
-
//Let the AI trigger them directly.
/obj/machinery/flasher/attack_ai(mob/user)
if(anchored)
@@ -100,20 +88,28 @@
if((M.m_intent != MOVE_INTENT_WALK) && (anchored))
flash()
-/obj/machinery/flasher/portable/attackby(obj/item/I, mob/user, params)
- if(iswrench(I))
- add_fingerprint(user)
- anchored = !anchored
+//Don't want to render prison breaks impossible
+/obj/machinery/flasher/portable/wirecutter_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ disable = !disable
+ if(disable)
+ user.visible_message("[user] has disconnected [src]'s flashbulb!", "You disconnect [src]'s flashbulb!")
+ if(!disable)
+ user.visible_message("[user] has connected [src]'s flashbulb!", "You connect [src]'s flashbulb!")
- if(!anchored)
- user.show_message(text("[src] can now be moved."))
- overlays.Cut()
-
- else if(anchored)
- user.show_message(text("[src] is now secured."))
- overlays += "[base_state]-s"
- else
- return ..()
+/obj/machinery/flasher/portable/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ anchored = !anchored
+ if(anchored)
+ WRENCH_ANCHOR_MESSAGE
+ overlays.Cut()
+ else if(anchored)
+ WRENCH_UNANCHOR_MESSAGE
+ overlays += "[base_state]-s"
// Flasher button
/obj/machinery/flasher_button
diff --git a/code/game/machinery/gameboard.dm b/code/game/machinery/gameboard.dm
index 2df0496ae67..edc1d3499ec 100644
--- a/code/game/machinery/gameboard.dm
+++ b/code/game/machinery/gameboard.dm
@@ -93,10 +93,10 @@
if(href_list["close"])
close_game()
-/obj/machinery/gameboard/attackby(obj/item/I, mob/user, params)
- if(default_unfasten_wrench(user, I))
- return
+/obj/machinery/gameboard/crowbar_act(mob/user, obj/item/I)
+ if(default_deconstruction_crowbar(user, I, ignore_panel = TRUE))
+ return TRUE
- if(default_deconstruction_crowbar(I, ignore_panel = TRUE))
- return
- return ..()
+/obj/machinery/gameboard/wrench_act(mob/user, obj/item/I)
+ if(default_unfasten_wrench(user, I))
+ return TRUE
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 10708ff9c0e..a742f6b7109 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -100,19 +100,22 @@ var/list/holopads = list()
holo_range = holograph_range
/obj/machinery/hologram/holopad/attackby(obj/item/I, mob/user, params)
- if(default_deconstruction_screwdriver(user, "holopad_open", "holopad0", I))
- return
-
if(exchange_parts(user, I))
return
-
- if(default_unfasten_wrench(user, I))
- return
-
- if(default_deconstruction_crowbar(I))
- return
return ..()
+/obj/machinery/hologram/holopad/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ default_deconstruction_screwdriver(user, "holopad_open", "holopad0", I)
+
+
+/obj/machinery/hologram/holopad/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ default_unfasten_wrench(user, I)
+
+/obj/machinery/hologram/holopad/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ default_deconstruction_crowbar(user, I)
/obj/machinery/hologram/holopad/attack_hand(mob/living/carbon/human/user)
if(..())
diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm
index 45056369662..e4bdb0d5478 100755
--- a/code/game/machinery/igniter.dm
+++ b/code/game/machinery/igniter.dm
@@ -78,21 +78,23 @@
/obj/machinery/sparker/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/detective_scanner))
return
- if(isscrewdriver(I))
- add_fingerprint(user)
- disable = !disable
- if(disable)
- user.visible_message("[user] has disabled [src]!", "You disable the connection to [src].")
- icon_state = "[base_state]-d"
- if(!disable)
- user.visible_message("[user] has reconnected [src]!", "You fix the connection to [src].")
- if(powered())
- icon_state = "[base_state]"
- else
- icon_state = "[base_state]-p"
- return
return ..()
+/obj/machinery/sparker/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ disable = !disable
+ if(disable)
+ user.visible_message("[user] has disabled [src]!", "You disable the connection to [src].")
+ icon_state = "[base_state]-d"
+ if(!disable)
+ user.visible_message("[user] has reconnected [src]!", "You fix the connection to [src].")
+ if(powered())
+ icon_state = "[base_state]"
+ else
+ icon_state = "[base_state]-p"
+
/obj/machinery/sparker/attack_ai()
if(src.anchored)
return src.spark()
diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm
index 4d27ad6b5b5..13406ac4b0f 100644
--- a/code/game/machinery/lightswitch.dm
+++ b/code/game/machinery/lightswitch.dm
@@ -147,21 +147,26 @@
/obj/machinery/light_switch/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/detective_scanner))
return
-
- if(istype(W, /obj/item/multitool))
- update_multitool_menu(user)
- return 1
-
- if(istype(W, /obj/item/wrench))
- playsound(get_turf(src), W.usesound, 50, 1)
- if(do_after(user, 30 * W.toolspeed, target = src))
- to_chat(user, "You detach \the [src] from the wall.")
- new/obj/item/mounted/frame/light_switch(get_turf(src))
- qdel(src)
- return 1
-
return ..()
+/obj/machinery/light_switch/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ update_multitool_menu(user)
+
+/obj/machinery/light_switch/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ user.visible_message("[user] starts unwrenching [src] from the wall...", "You are unwrenching [src] from the wall...", "You hear ratcheting.")
+ . = TRUE
+ if(!I.use_tool(src, user, 30, volume = I.tool_volume))
+ return
+ WRENCH_UNANCHOR_WALL_MESSAGE
+ new/obj/item/mounted/frame/light_switch(get_turf(src))
+ qdel(src)
+
/obj/machinery/light_switch/multitool_menu(var/mob/user, var/obj/item/multitool/P)
return {"
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 8f9381cec34..5991bf0006f 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -176,6 +176,10 @@ Class Procs:
use_power(7500/severity)
new /obj/effect/temp_visual/emp(loc)
..()
+/obj/machinery/default_welder_repair(mob/user, obj/item/I)
+ . = ..()
+ if(.)
+ stat &= ~BROKEN
//sets the use_power var and then forces an area power update
/obj/machinery/proc/update_use_power(var/new_use_power)
@@ -371,13 +375,6 @@ Class Procs:
uid = gl_uid
gl_uid++
-/obj/machinery/proc/default_deconstruction_crowbar(var/obj/item/crowbar/C, var/ignore_panel = 0)
- if(istype(C) && (panel_open || ignore_panel) && !(flags & NODECONSTRUCT))
- playsound(loc, C.usesound, 50, 1)
- deconstruct(TRUE)
- return 1
- return 0
-
/obj/machinery/deconstruct(disassembled = TRUE)
if(!(flags & NODECONSTRUCT))
on_deconstruction()
@@ -402,9 +399,23 @@ Class Procs:
if(!(flags & NODECONSTRUCT))
stat |= BROKEN
-/obj/machinery/proc/default_deconstruction_screwdriver(var/mob/user, var/icon_state_open, var/icon_state_closed, var/obj/item/screwdriver/S)
- if(!(flags & NODECONSTRUCT) && istype(S))
- playsound(loc, S.usesound, 50, 1)
+/obj/machinery/proc/default_deconstruction_crowbar(user, obj/item/I, ignore_panel = 0)
+ if(I.tool_behaviour != TOOL_CROWBAR)
+ return FALSE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return FALSE
+ if((panel_open || ignore_panel) && !(flags & NODECONSTRUCT))
+ deconstruct(TRUE)
+ to_chat(user, "You disassemble [src].")
+ return 1
+ return 0
+
+/obj/machinery/proc/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/I)
+ if(I.tool_behaviour != TOOL_SCREWDRIVER)
+ return FALSE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return FALSE
+ if(!(flags & NODECONSTRUCT))
if(!panel_open)
panel_open = 1
icon_state = icon_state_open
@@ -416,27 +427,20 @@ Class Procs:
return 1
return 0
-/obj/machinery/proc/default_change_direction_wrench(var/mob/user, var/obj/item/wrench/W)
- if(panel_open && istype(W))
- playsound(loc, W.usesound, 50, 1)
+/obj/machinery/proc/default_change_direction_wrench(mob/user, obj/item/I)
+ if(I.tool_behaviour != TOOL_WRENCH)
+ return FALSE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return FALSE
+ if(panel_open)
dir = turn(dir,-90)
to_chat(user, "You rotate [src].")
- return 1
- return 0
+ return TRUE
+ return FALSE
-/obj/proc/default_unfasten_wrench(mob/user, obj/item/wrench/W, time = 20)
- if(!(flags & NODECONSTRUCT) && istype(W))
- to_chat(user, "Now [anchored ? "un" : ""]securing [name].")
- playsound(loc, W.usesound, 50, 1)
- if(do_after(user, time * W.toolspeed, target = src))
- to_chat(user, "You've [anchored ? "un" : ""]secured [name].")
- anchored = !anchored
- if(istype(src, /obj/machinery))
- var/obj/machinery/M = src
- M.power_change() //Turn on or off the machine depending on the status of power in the new area.
- playsound(loc, W.usesound, 50, 1)
- return 1
- return 0
+/obj/machinery/default_unfasten_wrench(mob/user, obj/item/I, time)
+ if(..())
+ power_change()
/obj/machinery/proc/exchange_parts(mob/user, obj/item/storage/part_replacer/W)
var/shouldplaysound = 0
diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm
index 68878e3ad13..9e6f0d672cc 100644
--- a/code/game/machinery/mass_driver.dm
+++ b/code/game/machinery/mass_driver.dm
@@ -101,18 +101,6 @@
/obj/machinery/mass_driver_frame/attackby(var/obj/item/W as obj, var/mob/user as mob)
switch(build)
if(0) // Loose frame
- if(istype(W, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = W
- if(!WT.remove_fuel(0, user))
- to_chat(user, "The welding tool must be on to complete this task.")
- return 1
- playsound(get_turf(src), WT.usesound, 50, 1)
- to_chat(user, "You begin to cut the frame apart...")
- if(do_after(user, 30 * WT.toolspeed, target = src) && (build == 0))
- to_chat(user, "You detach the plasteel sheets from each others.")
- new /obj/item/stack/sheet/plasteel(get_turf(src),3)
- qdel(src)
- return 1
if(istype(W, /obj/item/wrench))
to_chat(user, "You begin to anchor \the [src] on the floor.")
playsound(get_turf(src), W.usesound, 50, 1)
@@ -133,31 +121,7 @@
anchored = 0
to_chat(user, "You de-anchored \the [src]!")
return 1
- if(istype(W, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = W
- if(!WT.remove_fuel(0, user))
- to_chat(user, "The welding tool must be on to complete this task.")
- return 1
- playsound(get_turf(src), WT.usesound, 50, 1)
- to_chat(user, "You begin to weld \the [src] to the floor...")
- if(do_after(user, 40 * WT.toolspeed, target = src) && (build == 1))
- to_chat(user, "You welded \the [src] to the floor.")
- build++
- update_icon()
- return 1
- return
if(2) // Welded to the floor
- if(istype(W, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = W
- if(!WT.remove_fuel(0, user))
- to_chat(user, "The welding tool must be on to complete this task.")
- return 1
- playsound(get_turf(src), WT.usesound, 50, 1)
- to_chat(user, "You begin to unweld \the [src] to the floor...")
- if(do_after(user, 40 * WT.toolspeed, target = src) && (build == 2))
- to_chat(user, "You unwelded \the [src] to the floor.")
- build--
- update_icon()
if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = W
to_chat(user, "You start adding cables to \the [src]...")
@@ -208,6 +172,30 @@
return
return ..()
+/obj/machinery/mass_driver_frame/welder_act(mob/user, obj/item/I)
+ if(build != 0 && build != 1 && build != 2)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ if(build == 0) //can deconstruct
+ WELDER_ATTEMPT_SLICING_MESSAGE
+ if(I.use_tool(src, user, 30, volume = I.tool_volume))
+ WELDER_SLICING_SUCCESS_MESSAGE
+ new /obj/item/stack/sheet/plasteel(drop_location(),3)
+ qdel(src)
+ else if(build == 1) //wrenched but not welded down
+ WELDER_ATTEMPT_FLOOR_WELD_MESSAGE
+ if(I.use_tool(src, user, 40, volume = I.tool_volume) && build == 1)
+ WELDER_FLOOR_WELD_SUCCESS_MESSAGE
+ build = 2
+ else if(build == 2) //welded down
+ WELDER_ATTEMPT_FLOOR_SLICE_MESSAGE
+ if(I.use_tool(src, user, 40, volume = I.tool_volume) && build == 2)
+ WELDER_FLOOR_SLICE_SUCCESS_MESSAGE
+ build = 1
+ update_icon()
+
/obj/machinery/mass_driver_frame/update_icon()
icon_state = "mass_driver_b[build]"
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index fba07d684ac..61d96602343 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -568,41 +568,29 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
SSnanoui.update_uis(src)
return 1
-/obj/machinery/newscaster/attackby(obj/item/I, mob/living/user, params)
- if(istype(I, /obj/item/wrench))
- to_chat(user, "Now [anchored ? "un" : ""]securing [name]")
- playsound(loc, I.usesound, 50, 1)
- if(do_after(user, 60 * I.toolspeed, target = src))
- playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE)
- if(stat & BROKEN)
- to_chat(user, "The broken remains of [src] fall on the ground.")
- new /obj/item/stack/sheet/metal(loc, 5)
- new /obj/item/shard(loc)
- new /obj/item/shard(loc)
- else
- to_chat(user, "You [anchored ? "un" : ""]secure [name].")
- new /obj/item/mounted/frame/newscaster_frame(loc)
- qdel(src)
- else if(iswelder(I) && user.a_intent != INTENT_HARM)
- var/obj/item/weldingtool/WT = I
- if(stat & BROKEN)
- if(WT.remove_fuel(0, user))
- user.visible_message("[user] is repairing [src].",
- "You begin repairing [src]...",
- "You hear welding.")
- playsound(loc, WT.usesound, 40, 1)
- if(do_after(user,40 * WT.toolspeed, 1, target = src))
- if(!WT.isOn() || !(stat & BROKEN))
- return
- to_chat(user, "You repair [src].")
- playsound(loc, 'sound/items/welder2.ogg', 50, 1)
- obj_integrity = max_integrity
- stat &= ~BROKEN
- update_icon()
- else
- to_chat(user, "[src] does not need repairs.")
+/obj/machinery/newscaster/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ to_chat(user, "Now [anchored ? "un" : ""]securing [name]")
+ if(!I.use_tool(src, user, 60, volume = I.tool_volume))
+ return
+ playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE)
+ if(stat & BROKEN)
+ to_chat(user, "The broken remains of [src] fall on the ground.")
+ new /obj/item/stack/sheet/metal(loc, 5)
+ new /obj/item/shard(loc)
+ new /obj/item/shard(loc)
else
- return ..()
+ to_chat(user, "You [anchored ? "un" : ""]secure [name].")
+ new /obj/item/mounted/frame/newscaster_frame(loc)
+ qdel(src)
+
+/obj/machinery/newscaster/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ default_welder_repair(user, I)
/obj/machinery/newscaster/play_attack_sound(damage, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index b4241b5f19d..570256898f4 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -323,9 +323,10 @@
/obj/item/pipe/attack_self(mob/user as mob)
return rotate()
-/obj/item/pipe/attackby(var/obj/item/W as obj, var/mob/user as mob, params)
- if(!istype(W, /obj/item/wrench))
- return ..()
+/obj/item/pipe/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
if(!isturf(src.loc))
return 1
@@ -506,7 +507,6 @@
var/obj/machinery/atmospherics/omni/filter/P = new(loc)
P.on_construction(dir, pipe_dir, color)
- playsound(src.loc, W.usesound, 50, 1)
user.visible_message( \
"[user] fastens the [src].", \
"You have fastened the [src].", \
diff --git a/code/game/machinery/poolcontroller.dm b/code/game/machinery/poolcontroller.dm
index 12804cfcc88..53dd0135c54 100644
--- a/code/game/machinery/poolcontroller.dm
+++ b/code/game/machinery/poolcontroller.dm
@@ -57,18 +57,15 @@
emagged = 1 //Set the emag var to true.
-/obj/machinery/poolcontroller/attackby(obj/item/I, mob/user, params) //Proc is called when a user hits the pool controller with something.
- if(ismultitool(I)) //If the mob hits the pool controller with a multitool, reset the emagged status
- if(emagged) //Check the emag status
- to_chat(user, "You re-enable [src]'s temperature safeguards.")//Inform the user that they have just fixed the safeguards.
-
- emagged = FALSE //Set the emagged var to false.
- else
- to_chat(user, "Nothing happens.")//If not emagged, don't do anything, and don't tell the user that it can be emagged.
-
-
- else //If it's not a multitool, defer to /obj/machinery/attackby
- return ..()
+/obj/machinery/poolcontroller/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(emagged) //Check the emag status
+ to_chat(user, "You re-enable [src]'s temperature safeguards.")//Inform the user that they have just fixed the safeguards.
+ emagged = FALSE //Set the emagged var to false.
+ else
+ to_chat(user, "Nothing happens.")//If not emagged, don't do anything, and don't tell the user that it can be emagged.
/obj/machinery/poolcontroller/attack_hand(mob/user as mob)
ui_interact(user)
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 68c029f2111..f61b920814b 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -830,23 +830,6 @@ var/list/turret_icons
build_step = 3
return
- else if(istype(I, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = I
- if(!WT.isOn())
- return
- if(WT.get_fuel() < 5) //uses up 5 fuel.
- to_chat(user, "You need more fuel to complete this task.")
- return
-
- playsound(loc, WT.usesound, 50, 1)
- if(do_after(user, 20 * WT.toolspeed, target = src))
- if(!src || !WT.remove_fuel(5, user)) return
- build_step = 1
- to_chat(user, "You remove the turret's interior metal armor.")
- new /obj/item/stack/sheet/metal( loc, 2)
- return
-
-
if(3)
if(istype(I, /obj/item/gun/energy)) //the gun installation part
@@ -911,31 +894,6 @@ var/list/turret_icons
build_step = 5
to_chat(user, "You open the internal access hatch.")
return
-
- if(7)
- if(istype(I, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = I
- if(!WT.isOn()) return
- if(WT.get_fuel() < 5)
- to_chat(user, "You need more fuel to complete this task.")
-
- playsound(loc, WT.usesound, 50, 1)
- if(do_after(user, 30 * WT.toolspeed, target = src))
- if(!src || !WT.remove_fuel(5, user))
- return
- build_step = 8
- to_chat(user, "You weld the turret's armor down.")
-
- //The final step: create a full turret
- var/obj/machinery/porta_turret/Turret = new target_type(loc)
- Turret.name = finish_name
- Turret.installation = installation
- Turret.gun_charge = gun_charge
- Turret.enabled = 0
- Turret.setup()
-
- qdel(src) // qdel
-
else if(istype(I, /obj/item/crowbar))
playsound(loc, I.usesound, 75, 1)
to_chat(user, "You pry off the turret's exterior armor.")
@@ -955,6 +913,33 @@ var/list/turret_icons
return
..()
+/obj/machinery/porta_turret_construct/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(build_step == 2)
+ if(!I.use_tool(src, user, 20, 5, volume = I.tool_volume))
+ return
+ if(build_step != 2)
+ return
+ build_step = 1
+ to_chat(user, "You remove the turret's interior metal armor.")
+ new /obj/item/stack/sheet/metal(drop_location(), 2)
+ else if(build_step == 7)
+ if(!I.use_tool(src, user, 50, amount = 5, volume = I.tool_volume))
+ return
+ if(build_step != 7)
+ return
+ build_step = 8
+ to_chat(user, "You weld the turret's armor down.")
+
+ //The final step: create a full turret
+ var/obj/machinery/porta_turret/Turret = new target_type(loc)
+ Turret.name = finish_name
+ Turret.installation = installation
+ Turret.gun_charge = gun_charge
+ Turret.enabled = 0
+ Turret.setup()
+
+ qdel(src)
/obj/machinery/porta_turret_construct/attack_hand(mob/user)
switch(build_step)
diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm
index e5a43c523f5..739d8e31a5d 100644
--- a/code/game/machinery/quantum_pad.dm
+++ b/code/game/machinery/quantum_pad.dm
@@ -42,30 +42,35 @@
teleport_cooldown -= (E * 100)
/obj/machinery/quantumpad/attackby(obj/item/I, mob/user, params)
- if(default_deconstruction_screwdriver(user, "pad-idle-o", "qpad-idle", I))
- return
-
- if(panel_open)
- if(ismultitool(I))
- var/obj/item/multitool/M = I
- M.buffer = src
- to_chat(user, "You save the data in the [I.name]'s buffer.")
- return 1
- else if(ismultitool(I))
- var/obj/item/multitool/M = I
- if(istype(M.buffer, /obj/machinery/quantumpad))
- linked_pad = M.buffer
- to_chat(user, "You link the [src] to the one in the [I.name]'s buffer.")
- return 1
-
if(exchange_parts(user, I))
return
-
- if(default_deconstruction_crowbar(I))
- return
-
return ..()
+/obj/machinery/quantumpad/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ default_deconstruction_crowbar(user, I)
+
+/obj/machinery/quantumpad/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(!I.multitool_check_buffer(user))
+ return
+ var/obj/item/multitool/M = I
+ if(panel_open)
+ M.set_multitool_buffer(user, src)
+ else
+ linked_pad = M.buffer
+ to_chat(user, "You link the [src] to the one in the [I.name]'s buffer.")
+
+/obj/machinery/quantumpad/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ default_deconstruction_screwdriver(user, "pad-idle-o", "qpad-idle", I)
+
/obj/machinery/quantumpad/attack_hand(mob/user)
if(panel_open)
to_chat(user, "The panel must be closed before operating this machine!")
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 8e4e5e3dc59..82b473b50f0 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -29,16 +29,6 @@
recharge_coeff = C.rating
/obj/machinery/recharger/attackby(obj/item/G, mob/user, params)
- if(iswrench(G))
- if(charging)
- to_chat(user, "Remove the charging item first!")
- return
- anchored = !anchored
- power_change()
- to_chat(user, "You [anchored ? "attached" : "detached"] [src].")
- playsound(loc, G.usesound, 75, 1)
- return
-
var/allowed = is_type_in_list(G, allowed_devices)
if(allowed)
@@ -67,17 +57,30 @@
else
to_chat(user, "[src] isn't connected to anything!")
return 1
-
- if(anchored && !charging)
- if(default_deconstruction_screwdriver(user, "rechargeropen", "recharger0", G))
- return
-
- if(panel_open && istype(G, /obj/item/crowbar))
- default_deconstruction_crowbar(G)
- return
-
return ..()
+
+/obj/machinery/recharger/crowbar_act(mob/user, obj/item/I)
+ if(panel_open && !charging && default_deconstruction_crowbar(user, I))
+ return TRUE
+
+/obj/machinery/recharger/screwdriver_act(mob/user, obj/item/I)
+ if(anchored && !charging && default_deconstruction_screwdriver(user, "rechargeropen", "recharger0", I))
+ return TRUE
+
+/obj/machinery/recharger/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(charging)
+ to_chat(user, "Remove the charging item first!")
+ return
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ anchored = !anchored
+ if(anchored)
+ WRENCH_ANCHOR_MESSAGE
+ else
+ WRENCH_UNANCHOR_MESSAGE
+
/obj/machinery/recharger/attack_hand(mob/user)
if(issilicon(user))
return
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 57903822b50..5907a27f70e 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -110,21 +110,23 @@
icon_state = "borgcharger0"
/obj/machinery/recharge_station/attackby(obj/item/I, mob/user, params)
- if(isscrewdriver(I))
- if(occupant)
- to_chat(user, "The maintenance panel is locked.")
- return
- default_deconstruction_screwdriver(user, "borgdecon2", "borgcharger0", I)
- return
-
if(exchange_parts(user, I))
return
- if(default_deconstruction_crowbar(I))
- return
else
return ..()
+/obj/machinery/recharge_station/crowbar_act(mob/user, obj/item/I)
+ if(default_deconstruction_crowbar(user, I))
+ return TRUE
+
+/obj/machinery/recharge_station/screwdriver_act(mob/user, obj/item/I)
+ if(occupant)
+ to_chat(user, "The maintenance panel is locked.")
+ return TRUE
+ if(default_deconstruction_screwdriver(user, "borgdecon2", "borgcharger0", I))
+ return TRUE
+
/obj/machinery/recharge_station/proc/process_occupant()
if(src.occupant)
if(istype(occupant, /mob/living/silicon/robot))
@@ -201,7 +203,7 @@
//Welding tools
if(istype(O, /obj/item/weldingtool))
var/obj/item/weldingtool/weld = O
- weld.reagents.check_and_add("fuel", weld.max_fuel, 2 * coeff)
+ weld.reagents.check_and_add("fuel", weld.maximum_fuel, 2 * coeff)
if(R)
if(R.module)
R.module.respawn_consumable(R)
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index eecdc0e4f4a..27c1261b3e9 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -51,22 +51,25 @@ var/const/SAFETY_COOLDOWN = 100
..()
update_icon()
-
/obj/machinery/recycler/attackby(obj/item/I, mob/user, params)
add_fingerprint(user)
- if(default_deconstruction_screwdriver(user, "grinder-oOpen", "grinder-o0", I))
- return
-
if(exchange_parts(user, I))
return
+ return ..()
+/obj/machinery/recycler/crowbar_act(mob/user, obj/item/I)
+ if(default_deconstruction_crowbar(user, I))
+ return TRUE
+
+/obj/machinery/recycler/screwdriver_act(mob/user, obj/item/I)
+ if(default_deconstruction_screwdriver(user, "grinder-oOpen", "grinder-o0", I))
+ return TRUE
+
+/obj/machinery/recycler/wrench_act(mob/user, obj/item/I)
if(default_unfasten_wrench(user, I))
- return
+ return TRUE
+
- if(default_deconstruction_crowbar(I))
- return
- else
- return ..()
/obj/machinery/recycler/emag_act(mob/user)
if(!emagged)
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index 3cb06daab94..eba5e2f383d 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -240,15 +240,6 @@
malfunction = TRUE
update_icon()
- else if(isscrewdriver(I))
- playsound(loc, I.usesound, 100, 1)
- if(is_open)
- to_chat(user, "You close the panel.")
- is_open = FALSE
- else
- to_chat(user, "You open the panel and expose the wiring.")
- is_open = TRUE
-
else if(istype(I, /obj/item/stack/cable_coil) && malfunction && is_open)
var/obj/item/stack/cable_coil/coil = I
to_chat(user, "You begin to replace the wires.")
@@ -262,25 +253,6 @@
to_chat(user, "You repair the [src]!")
update_icon()
- else if(istype(I, /obj/item/wrench))
- if(locked)
- to_chat(user, "The bolts are covered, unlocking this would retract the covers.")
- return
- if(anchored)
- playsound(loc, I.usesound, 100, 1)
- to_chat(user, "You unsecure the [src] from the floor!")
- if(active)
- to_chat(user, "The [src] shuts off!")
- shields_down()
- anchored = 0
- else
- if(istype(get_turf(src), /turf/space))
- return //No wrenching these in space!
- playsound(loc, I.usesound, 100, 1)
- to_chat(user, "You secure the [src] to the floor!")
- anchored = 1
-
-
else if(istype(I, /obj/item/card/id) || istype(I, /obj/item/pda))
if(allowed(user))
locked = !locked
@@ -289,8 +261,36 @@
to_chat(user, "Access denied.")
else
- ..()
+ return ..()
+/obj/machinery/shieldgen/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ is_open = !is_open
+ if(is_open)
+ SCREWDRIVER_OPEN_PANEL_MESSAGE
+ else
+ SCREWDRIVER_CLOSE_PANEL_MESSAGE
+
+/obj/machinery/shieldgen/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(locked)
+ to_chat(user, "The bolts are covered, unlocking this would retract the covers.")
+ return
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(anchored)
+ WRENCH_UNANCHOR_MESSAGE
+ if(active)
+ visible_message("[src] shuts off!")
+ shields_down()
+ anchored = FALSE
+ else
+ if(istype(get_turf(src), /turf/space))
+ return //No wrenching these in space!
+ WRENCH_ANCHOR_MESSAGE
+ anchored = TRUE
/obj/machinery/shieldgen/update_icon()
if(active)
diff --git a/code/game/machinery/snow_machine.dm b/code/game/machinery/snow_machine.dm
index cc59f0a3017..acb69590f9a 100644
--- a/code/game/machinery/snow_machine.dm
+++ b/code/game/machinery/snow_machine.dm
@@ -43,20 +43,22 @@
to_chat(user, "You [active ? "turn on" : "turn off"] [src].")
return ..()
-/obj/machinery/snow_machine/attackby(obj/item/I, mob/user)
- if(isscrewdriver(I))
- if(default_deconstruction_screwdriver(user, "snow_machine_openpanel", "snow_machine_off", I))
- turn_on_or_off(FALSE)
- else if(iscrowbar(I))
- default_deconstruction_crowbar(I)
- else if(iswrench(I))
- var/obj/item/wrench/W = I
- anchored = !anchored
- to_chat(user, "You [anchored ? "tighten" : "loosen"] [src]'s wheels.")
- playsound(loc, W.usesound, 50, TRUE)
+/obj/machinery/snow_machine/crowbar_act(mob/user, obj/item/I)
+ if(default_deconstruction_crowbar(user, I))
+ return TRUE
+
+/obj/machinery/snow_machine/screwdriver_act(mob/user, obj/item/I)
+ if(default_deconstruction_screwdriver(user, "snow_machine_openpanel", "snow_machine_off", I))
turn_on_or_off(FALSE)
- else
- return ..()
+ return TRUE
+
+/obj/machinery/snow_machine/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ anchored = !anchored
+ to_chat(user, "You [anchored ? "tighten" : "loosen"] [src]'s wheels.")
+ turn_on_or_off(FALSE)
/obj/machinery/snow_machine/process()
if(power_used_this_cycle)
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index 3cfe6fe50ff..4021b11c39a 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -68,16 +68,24 @@
else
to_chat(user, "The hatch must be open to insert a power cell.")
return
- else if(isscrewdriver(I))
- open = !open
- user.visible_message("[user] [open ? "opens" : "closes"] the hatch on [src].", "You [open ? "open" : "close"] the hatch on [src].")
- update_icon()
- if(!open && user.machine == src)
- user << browse(null, "window=spaceheater")
- user.unset_machine()
+
else
return ..()
+/obj/machinery/space_heater/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ open = !open
+ if(open)
+ SCREWDRIVER_OPEN_PANEL_MESSAGE
+ else
+ SCREWDRIVER_CLOSE_PANEL_MESSAGE
+ update_icon()
+ if(!open && user.machine == src)
+ user << browse(null, "window=spaceheater")
+ user.unset_machine()
+
/obj/machinery/space_heater/attack_hand(mob/user as mob)
src.add_fingerprint(user)
interact(user)
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 3437bafeb3b..c3ad823ad3d 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -297,12 +297,7 @@
else
to_chat(usr, "The unit is not operational.")
return
- if(isscrewdriver(I))
- panel_open = !panel_open
- playsound(loc, I.usesound, 100, 1)
- to_chat(user, text("You [panel_open ? "open up" : "close"] the unit's maintenance panel."))
- updateUsrDialog()
- return
+
if(panel_open)
wires.Interact(user)
return
@@ -313,10 +308,27 @@
updateUsrDialog()
to_chat(user, "You load the [I] into the storage compartment.")
else
- to_chat(user, "The unit already contains that item.")
+ to_chat(user, "You can't fit [I] into [src]!")
return
return ..()
+/obj/machinery/suit_storage_unit/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(shocked && shock(user, 100))
+ return
+ if(!is_operational())
+ if(panel_open)
+ to_chat(user, "Close the maintenance panel first.")
+ else
+ to_chat(user, "The unit is not operational.")
+ return
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+
+ panel_open = !panel_open
+ to_chat(user, text("You [panel_open ? "open up" : "close"] the unit's maintenance panel."))
+ updateUsrDialog()
+ return
/obj/machinery/suit_storage_unit/proc/store_item(obj/item/I, mob/user)
. = FALSE
diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm
index bc5eace7338..e9b0d25c672 100644
--- a/code/game/machinery/syndicatebeacon.dm
+++ b/code/game/machinery/syndicatebeacon.dm
@@ -82,7 +82,7 @@
var/datum/antagonist/traitor/T = new()
T.give_objectives = FALSE
N.mind.add_antag_datum(T)
-
+
to_chat(M, "You have joined the ranks of the Syndicate and become a traitor to the station!")
message_admins("[key_name_admin(N)] has accepted a traitor objective from a syndicate beacon.")
@@ -153,26 +153,24 @@
return
-/obj/machinery/power/singularity_beacon/attackby(obj/item/I, mob/user, params)
- if(isscrewdriver(I))
- if(active)
- to_chat(user, "You need to deactivate the beacon first!")
- return
-
- if(anchored)
- anchored = FALSE
- to_chat(user, "You unscrew the beacon from the floor.")
- disconnect_from_network()
- return
- else
- if(!connect_to_network())
- to_chat(user, "This device must be placed over an exposed cable.")
- return
- anchored = TRUE
- to_chat(user, "You screw the beacon to the floor and attach the cable.")
+/obj/machinery/power/singularity_beacon/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(active)
+ to_chat(user, "You need to deactivate the beacon first!")
+ return
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(anchored)
+ anchored = FALSE
+ to_chat(user, "You unscrew the beacon from the floor.")
+ disconnect_from_network()
+ return
else
- return ..()
-
+ if(!connect_to_network())
+ to_chat(user, "This device must be placed over an exposed cable.")
+ return
+ anchored = TRUE
+ to_chat(user, "You screw the beacon to the floor and attach the cable.")
/obj/machinery/power/singularity_beacon/Destroy()
if(active)
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index 28a35680cdb..f038b573871 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -111,45 +111,9 @@
. = timer_set
/obj/machinery/syndicatebomb/attackby(obj/item/I, mob/user, params)
- if(iswrench(I) && can_unanchor)
- if(!anchored)
- if(!isturf(loc) || isspaceturf(loc))
- to_chat(user, "The bomb must be placed on solid ground to attach it.")
- else
- to_chat(user, "You firmly wrench the bomb to the floor.")
- playsound(loc, I.usesound, 50, 1)
- anchored = 1
- if(active)
- to_chat(user, "The bolts lock in place.")
- else
- if(!active)
- to_chat(user, "You wrench the bomb from the floor.")
- playsound(loc, I.usesound, 50, 1)
- anchored = 0
- else
- to_chat(user, "The bolts are locked down!")
-
- else if(isscrewdriver(I))
- open_panel = !open_panel
- update_icon()
- to_chat(user, "You [open_panel ? "open" : "close"] the wire panel.")
-
- else if(istype(I, /obj/item/wirecutters) || istype(I, /obj/item/multitool) || istype(I, /obj/item/assembly/signaler ))
+ if(istype(I, /obj/item/assembly/signaler))
if(open_panel)
wires.Interact(user)
-
- else if(iscrowbar(I))
- if(open_panel && wires.IsAllCut())
- if(payload)
- to_chat(user, "You carefully pry out [payload].")
- payload.loc = user.loc
- payload = null
- else
- to_chat(user, "There isn't anything in here to remove!")
- else if(open_panel)
- to_chat(user, "The wires connecting the shell to the explosives are holding it down!")
- else
- to_chat(user, "The cover is screwed on, it won't pry off!")
else if(istype(I, /obj/item/bombcore))
if(!payload)
if(!user.drop_item())
@@ -159,27 +123,82 @@
payload.forceMove(src)
else
to_chat(user, "[payload] is already loaded into [src], you'll have to remove it first.")
- else if(iswelder(I))
- if(payload || !wires.IsAllCut() || !open_panel)
- return
- var/obj/item/weldingtool/WT = I
- if(!WT.isOn())
- return
- if(WT.get_fuel() < 5) //uses up 5 fuel.
- to_chat(user, "You need more fuel to complete this task!")
- return
-
- playsound(loc, WT.usesound, 50, 1)
- to_chat(user, "You start to cut the [src] apart...")
- if(do_after(user, 20*I.toolspeed, target = src))
- if(!WT.isOn() || !WT.remove_fuel(5, user))
- return
- to_chat(user, "You cut the [src] apart.")
- new /obj/item/stack/sheet/plasteel(loc, 3)
- qdel(src)
else
return ..()
+/obj/machinery/syndicatebomb/wrench_act(mob/user, obj/item/I)
+ if(!can_unanchor)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(!anchored)
+ if(!isturf(loc) || isspaceturf(loc))
+ to_chat(user, "The bomb must be placed on solid ground to attach it.")
+ else
+ WRENCH_ANCHOR_MESSAGE
+ anchored = TRUE
+ if(active)
+ to_chat(user, "The bolts lock in place.")
+ else
+ if(!active)
+ WRENCH_UNANCHOR_MESSAGE
+ anchored = FALSE
+ else
+ to_chat(user, "The bolts are locked down!")
+
+/obj/machinery/syndicatebomb/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ open_panel = !open_panel
+ update_icon()
+ to_chat(user, "You [open_panel ? "open" : "close"] the wire panel.")
+
+/obj/machinery/syndicatebomb/wirecutter_act(mob/user, obj/item/I)
+ if(!open_panel)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ wires.Interact(user)
+
+/obj/machinery/syndicatebomb/multitool_act(mob/user, obj/item/I)
+ if(!open_panel)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ wires.Interact(user)
+
+/obj/machinery/syndicatebomb/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(open_panel && wires.IsAllCut())
+ if(payload)
+ to_chat(user, "You carefully pry out [payload].")
+ payload.loc = user.loc
+ payload = null
+ else
+ to_chat(user, "There isn't anything in here to remove!")
+ else if(open_panel)
+ to_chat(user, "The wires connecting the shell to the explosives are holding it down!")
+ else
+ to_chat(user, "The cover is screwed on, it won't pry off!")
+
+/obj/machinery/syndicatebomb/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(payload || !wires.IsAllCut() || !open_panel)
+ return
+ if(!I.tool_use_check(user, 0))
+ return
+ WELDER_ATTEMPT_SLICING_MESSAGE
+ if(I.use_tool(src, user, 50, volume = I.tool_volume))
+ WELDER_SLICING_SUCCESS_MESSAGE
+ new /obj/item/stack/sheet/plasteel(drop_location(), 3)
+ qdel(src)
+
/obj/machinery/syndicatebomb/attack_ghost(mob/user)
interact(user)
@@ -497,13 +516,7 @@
qdel(src)
/obj/item/bombcore/chemical/attackby(obj/item/I, mob/user, params)
- if(iscrowbar(I) && beakers.len > 0)
- playsound(loc, I.usesound, 50, 1)
- for (var/obj/item/B in beakers)
- B.loc = get_turf(src)
- beakers -= B
- return
- else if(istype(I, /obj/item/reagent_containers/glass/beaker) || istype(I, /obj/item/reagent_containers/glass/bottle))
+ if(istype(I, /obj/item/reagent_containers/glass/beaker) || istype(I, /obj/item/reagent_containers/glass/bottle))
if(beakers.len < max_beakers)
if(!user.drop_item())
return
@@ -516,6 +529,16 @@
else
return ..()
+/obj/item/bombcore/chemical/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(beakers.len == 0)
+ return
+ for(var/obj/item/B in beakers)
+ B.loc = get_turf(src)
+ beakers -= B
+
/obj/item/bombcore/chemical/CheckParts(list/parts_list)
..()
// Using different grenade casings, causes the payload to have different properties.
@@ -564,11 +587,7 @@
var/obj/item/transfer_valve/ttv = null
/obj/item/bombcore/toxins/attackby(obj/item/I, mob/user)
- if(iscrowbar(I) && ttv)
- playsound(loc, I.usesound, 50, 1)
- ttv.forceMove(get_turf(src))
- ttv = null
- else if(istype(I, /obj/item/transfer_valve))
+ if(istype(I, /obj/item/transfer_valve))
if(!ttv && !check_attached(I))
if(!user.drop_item())
return
@@ -582,6 +601,17 @@
else
return ..()
+/obj/item/bombcore/toxins/crowbar_act(mob/user, obj/item/I)
+ if(!ttv)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ ttv.forceMove(get_turf(src))
+ ttv = null
+
+
+
/obj/item/bombcore/toxins/proc/check_attached(obj/item/transfer_valve/ttv)
if (ttv.attached_device)
return TRUE
diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm
index 1fe1490442a..9ee390ef9ec 100644
--- a/code/game/machinery/telecomms/traffic_control.dm
+++ b/code/game/machinery/telecomms/traffic_control.dm
@@ -10,12 +10,12 @@
var/window_id // mostly used to let the configuration datum update the user's UI
var/unlocked = FALSE
-/obj/machinery/computer/telecomms/traffic/attackby(obj/item/I, mob/user)
- if(ismultitool(I))
- unlocked = !unlocked
- to_chat(user, "This computer is now [unlocked ? "Unlocked" : "Locked"]. Reopen the UI to see the difference.")
+/obj/machinery/computer/telecomms/traffic/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
- return ..()
+ unlocked = !unlocked
+ to_chat(user, "This computer is now [unlocked ? "Unlocked" : "Locked"]. Reopen the UI to see the difference.")
/obj/machinery/computer/telecomms/traffic/attack_hand(mob/user)
interact(user)
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index ca2f1c1fa1a..04803286db1 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -348,17 +348,18 @@
return
/obj/machinery/teleport/hub/attackby(obj/item/I, mob/user, params)
- if(default_deconstruction_screwdriver(user, "tele-o", "tele0", I))
- return
-
if(exchange_parts(user, I))
return
-
- if(default_deconstruction_crowbar(I))
- return
-
return ..()
+/obj/machinery/teleport/hub/crowbar_act(mob/user, obj/item/I)
+ if(default_deconstruction_crowbar(user, I))
+ return TRUE
+
+/obj/machinery/teleport/hub/screwdriver_act(mob/user, obj/item/I)
+ if(default_deconstruction_screwdriver(user, "tele-o", "tele0", I))
+ return TRUE
+
/obj/machinery/teleport/hub/proc/teleport(atom/movable/M as mob|obj, turf/T)
. = TRUE
var/obj/machinery/computer/teleporter/com = power_station.teleporter_console
@@ -450,17 +451,18 @@
icon_state = "tele0"
/obj/machinery/teleport/perma/attackby(obj/item/I, mob/user, params)
- if(default_deconstruction_screwdriver(user, "tele-o", "tele0", I))
- return
-
if(exchange_parts(user, I))
return
-
- if(default_deconstruction_crowbar(I))
- return
-
return ..()
+/obj/machinery/teleport/perma/crowbar_act(mob/user, obj/item/I)
+ if(default_deconstruction_crowbar(user, I))
+ return TRUE
+
+/obj/machinery/teleport/perma/screwdriver_act(mob/user, obj/item/I)
+ if(default_deconstruction_screwdriver(user, "tele-o", "tele0", I))
+ return TRUE
+
/obj/machinery/teleport/station
name = "station"
desc = "The power control station for a bluespace teleporter."
@@ -520,8 +522,27 @@
return ..()
/obj/machinery/teleport/station/attackby(obj/item/I, mob/user, params)
- if(ismultitool(I) && !panel_open)
- var/obj/item/multitool/M = I
+ if(exchange_parts(user, I))
+ return
+ if(panel_open && istype(I, /obj/item/circuitboard/teleporter_perma))
+ var/obj/item/circuitboard/teleporter_perma/C = I
+ C.target = teleporter_console.target
+ to_chat(user, "You copy the targeting information from [src] to [C]")
+ return
+ return ..()
+
+/obj/machinery/teleport/station/crowbar_act(mob/user, obj/item/I)
+ if(default_deconstruction_crowbar(user, I))
+ return TRUE
+
+/obj/machinery/teleport/station/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(!I.multitool_check_buffer(user))
+ return
+ var/obj/item/multitool/M = I
+ if(!panel_open)
if(M.buffer && istype(M.buffer, /obj/machinery/teleport/station) && M.buffer != src)
if(linked_stations.len < efficiency)
linked_stations.Add(M.buffer)
@@ -530,34 +551,21 @@
else
to_chat(user, "This station can't hold more information, try to use better parts.")
return
+ M.set_multitool_buffer(user, src)
+/obj/machinery/teleport/station/screwdriver_act(mob/user, obj/item/I)
if(default_deconstruction_screwdriver(user, "controller-o", "controller", I))
update_icon()
- return
+ return TRUE
- if(exchange_parts(user, I))
+/obj/machinery/teleport/station/wirecutter_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
-
- if(default_deconstruction_crowbar(I))
- return
-
if(panel_open)
- if(ismultitool(I))
- var/obj/item/multitool/M = I
- M.buffer = src
- to_chat(user, "You download the data to the [M]'s buffer.")
- return
- if(iswirecutter(I))
- link_console_and_hub()
- to_chat(user, "You reconnect the station to nearby machinery.")
- return
- if(istype(I, /obj/item/circuitboard/teleporter_perma))
- var/obj/item/circuitboard/teleporter_perma/C = I
- C.target = teleporter_console.target
- to_chat(user, "You copy the targeting information from [src] to [C]")
- return
+ link_console_and_hub()
+ to_chat(user, "You reconnect the station to nearby machinery.")
- return ..()
/obj/machinery/teleport/station/attack_ai()
src.attack_hand()
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 03b325dd649..7a0cd5e8f03 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -246,25 +246,6 @@
SSnanoui.update_uis(src)
return // don't smack that machine with your 2 thalers
- if(default_unfasten_wrench(user, I, time = 60))
- return
-
- if(isscrewdriver(I) && anchored)
- playsound(loc, I.usesound, 50, 1)
- panel_open = !panel_open
- to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.")
- overlays.Cut()
- if(panel_open)
- overlays += image(icon, "[initial(icon_state)]-panel")
- SSnanoui.update_uis(src) // Speaker switch is on the main UI, not wires UI
- return
-
- if(panel_open)
- if(ismultitool(I) || iswirecutter(I))
- return attack_hand(user)
- if(component_parts && iscrowbar(I))
- default_deconstruction_crowbar(I)
- return
if(istype(I, /obj/item/coin) && premium.len)
if(!user.drop_item())
return
@@ -296,6 +277,46 @@
return
return ..()
+
+
+/obj/machinery/vending/crowbar_act(mob/user, obj/item/I)
+ if(!component_parts)
+ return
+ . = TRUE
+ default_deconstruction_crowbar(user, I)
+
+/obj/machinery/vending/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ wires.Interact(user)
+
+/obj/machinery/vending/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(anchored)
+ panel_open = !panel_open
+ if(panel_open)
+ SCREWDRIVER_OPEN_PANEL_MESSAGE
+ overlays += image(icon, "[initial(icon_state)]-panel")
+ else
+ SCREWDRIVER_CLOSE_PANEL_MESSAGE
+ overlays.Cut()
+ SSnanoui.update_uis(src) // Speaker switch is on the main UI, not wires UI
+
+/obj/machinery/vending/wirecutter_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ wires.Interact(user)
+
+/obj/machinery/vending/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ default_unfasten_wrench(user, I, time = 60)
+
//Override this proc to do per-machine checks on the inserted item, but remember to call the parent to handle these generic checks before your logic!
/obj/machinery/vending/proc/item_slot_check(mob/user, obj/item/I)
if(!item_slot)
diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm
index 895361f301b..239d2ce493f 100644
--- a/code/game/mecha/mech_bay.dm
+++ b/code/game/mecha/mech_bay.dm
@@ -68,20 +68,23 @@
max_charge = MC * 25
/obj/machinery/mech_bay_recharge_port/attackby(obj/item/I, mob/user, params)
- if(default_deconstruction_screwdriver(user, "recharge_port-o", "recharge_port", I))
- return
-
- if(default_change_direction_wrench(user, I))
- recharging_turf = get_step(loc, dir)
- return
-
if(exchange_parts(user, I))
return
-
- if(default_deconstruction_crowbar(I))
- return
return ..()
+/obj/machinery/mech_bay_recharge_port/screwdriver_act(mob/user, obj/item/I)
+ if(default_deconstruction_screwdriver(user, "recharge_port-o", "recharge_port", I))
+ return TRUE
+
+/obj/machinery/mech_bay_recharge_port/wrench_act(mob/user, obj/item/I)
+ if(default_change_direction_wrench(user, I))
+ recharging_turf = get_step(loc, dir)
+ return TRUE
+
+/obj/machinery/mech_bay_recharge_port/crowbar_act(mob/user, obj/item/I)
+ if(default_deconstruction_crowbar(user, I))
+ return TRUE
+
/obj/machinery/mech_bay_recharge_port/Destroy()
if(recharge_console)
recharge_console.recharge_port = null
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 1254f9e5357..769ac8d0d54 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -434,7 +434,7 @@
if(exchange_parts(user, W))
return
- if(default_deconstruction_crowbar(W))
+ if(default_deconstruction_crowbar(user, W))
return TRUE
else
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 85f511395f1..7c4aee9781c 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -696,31 +696,6 @@
else
to_chat(user, "Maintenance protocols disabled by operator.")
- else if(iswrench(W))
- if(state==1)
- state = 2
- to_chat(user, "You undo the securing bolts.")
- else if(state==2)
- state = 1
- to_chat(user, "You tighten the securing bolts.")
- return
-
- else if(iscrowbar(W))
- if(state==2)
- state = 3
- to_chat(user, "You open the hatch to the power unit")
- else if(state==3)
- state=2
- to_chat(user, "You close the hatch to the power unit")
- else if(state==4 && pilot_is_mmi())
- // Since having maint protocols available is controllable by the MMI, I see this as a consensual way to remove an MMI without destroying the mech
- user.visible_message("[user] begins levering out the MMI from the [src].", "You begin to lever out the MMI from the [src].")
- to_chat(occupant, "[user] is prying you out of the exosuit!")
- if(do_after(user, 80 * W.toolspeed, target=src))
- user.visible_message("[user] pries the MMI out of the [src]!", "You finish removing the MMI from the [src]!")
- go_out()
- return
-
else if(istype(W, /obj/item/stack/cable_coil))
if(state == 3 && hasInternalDamage(MECHA_INT_SHORT_CIRCUIT))
var/obj/item/stack/cable_coil/CC = W
@@ -732,21 +707,6 @@
to_chat(user, "There's not enough wire to finish the task.")
return
- else if(isscrewdriver(W) && user.a_intent != INTENT_HARM)
- if(hasInternalDamage(MECHA_INT_TEMP_CONTROL))
- clearInternalDamage(MECHA_INT_TEMP_CONTROL)
- to_chat(user, "You repair the damaged temperature controller.")
- else if(state==3 && cell)
- cell.forceMove(loc)
- cell = null
- state = 4
- to_chat(user, "You unscrew and pry out the powercell.")
- log_message("Powercell removed")
- else if(state==4 && cell)
- state=3
- to_chat(user, "You screw the cell in place.")
- return
-
else if(istype(W, /obj/item/stock_parts/cell))
if(state==4)
if(!cell)
@@ -760,24 +720,6 @@
to_chat(user, "There's already a powercell installed.")
return
- else if(iswelder(W) && user.a_intent != INTENT_HARM)
- var/obj/item/weldingtool/WT = W
- if(obj_integrity < max_integrity)
- if(WT.remove_fuel(0, user))
- user.visible_message("[user] starts repairing some damage to [name].", "You start repairing some damage to [name]")
- if(do_after_once(user, 15 * WT.toolspeed, target = src, attempt_cancel_message = "You stop repairing [name]."))
- if(internal_damage & MECHA_INT_TANK_BREACH)
- clearInternalDamage(MECHA_INT_TANK_BREACH)
- user.visible_message("[user] repairs the damaged gas tank.", "You repair the damaged gas tank.")
- else
- user.visible_message("[user] repairs some damage to [name].", "You repair some damage to [name].")
- obj_integrity += min(10, max_integrity - obj_integrity)
- else
- to_chat(user, "The welder must be on for this task!")
- else
- to_chat(user, "The [name] is at full integrity!")
- return TRUE
-
else if(istype(W, /obj/item/mecha_parts/mecha_tracking))
if(!user.unEquip(W))
to_chat(user, "\the [W] is stuck to your hand, you cannot put it in \the [src]")
@@ -828,6 +770,81 @@
else
return ..()
+
+/obj/mecha/crowbar_act(mob/user, obj/item/I)
+ if(state != 2 && state != 3 && !(state == 4 && pilot_is_mmi()))
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(state == 2)
+ state = 3
+ to_chat(user, "You open the hatch to the power unit")
+ else if(state == 3)
+ state = 2
+ to_chat(user, "You close the hatch to the power unit")
+ else
+ // Since having maint protocols available is controllable by the MMI, I see this as a consensual way to remove an MMI without destroying the mech
+ user.visible_message("[user] begins levering out the MMI from the [src].", "You begin to lever out the MMI from the [src].")
+ to_chat(occupant, "[user] is prying you out of the exosuit!")
+ if(I.use_tool(src, user, 80, volume = I.tool_volume) && pilot_is_mmi())
+ user.visible_message("[user] pries the MMI out of the [src]!", "You finish removing the MMI from the [src]!")
+ go_out()
+
+/obj/mecha/screwdriver_act(mob/user, obj/item/I)
+ if(user.a_intent == INTENT_HARM)
+ return
+ if(!(state==3 && cell) && !(state==4 && cell))
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(hasInternalDamage(MECHA_INT_TEMP_CONTROL))
+ clearInternalDamage(MECHA_INT_TEMP_CONTROL)
+ to_chat(user, "You repair the damaged temperature controller.")
+ else if(state==3 && cell)
+ cell.forceMove(loc)
+ cell = null
+ state = 4
+ to_chat(user, "You unscrew and pry out the powercell.")
+ log_message("Powercell removed")
+ else if(state==4 && cell)
+ state=3
+ to_chat(user, "You screw the cell in place.")
+
+/obj/mecha/wrench_act(mob/user, obj/item/I)
+ if(state != 1 && state != 2)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(state==1)
+ state = 2
+ to_chat(user, "You undo the securing bolts.")
+ else
+ state = 1
+ to_chat(user, "You tighten the securing bolts.")
+
+/obj/mecha/welder_act(mob/user, obj/item/I)
+ if(user.a_intent == INTENT_HARM)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ if((obj_integrity >= max_integrity) && !internal_damage)
+ to_chat(user, "[src] is at full integrity!")
+ return
+ WELDER_ATTEMPT_REPAIR_MESSAGE
+ if(I.use_tool(src, user, 15, volume = I.tool_volume))
+ if(internal_damage & MECHA_INT_TANK_BREACH)
+ clearInternalDamage(MECHA_INT_TANK_BREACH)
+ user.visible_message("[user] repairs the damaged gas tank.", "You repair the damaged gas tank.")
+ else if(obj_integrity < max_integrity)
+ user.visible_message("[user] repairs some damage to [name].", "You repair some damage to [name].")
+ obj_integrity += min(10, max_integrity - obj_integrity)
+ else
+ to_chat(user, "[src] is at full integrity!")
+
/obj/mecha/mech_melee_attack(obj/mecha/M)
if(!has_charge(melee_energy_drain))
return 0
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index 59de4cc45b4..64eac560d39 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -5,25 +5,7 @@
////////////////////////////////
/datum/construction/mecha/custom_action(step, atom/used_atom, mob/user)
- if(istype(used_atom, /obj/item/weldingtool))
- var/obj/item/weldingtool/W = used_atom
- if(W.remove_fuel(0, user))
- playsound(holder, W.usesound, 50, 1)
- else
- return 0
- else if(istype(used_atom, /obj/item/wrench))
- var/obj/item/wrench/W = used_atom
- playsound(holder, W.usesound, 50, 1)
-
- else if(istype(used_atom, /obj/item/screwdriver))
- var/obj/item/screwdriver/S = used_atom
- playsound(holder, S.usesound, 50, 1)
-
- else if(istype(used_atom, /obj/item/wirecutters))
- var/obj/item/wirecutters/W = used_atom
- playsound(holder, W.usesound, 50, 1)
-
- else if(istype(used_atom, /obj/item/stack/cable_coil))
+ if(istype(used_atom, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = used_atom
if(C.use(4))
playsound(holder, C.usesound, 50, 1)
@@ -37,28 +19,11 @@
return 0
else
S.use(STANDARD_STACK_AMOUNT)
- return 1
+ else
+ return ..()
/datum/construction/reversible/mecha/custom_action(index as num, diff as num, atom/used_atom, mob/user as mob)
- if(istype(used_atom, /obj/item/weldingtool))
- var/obj/item/weldingtool/W = used_atom
- if(W.remove_fuel(0, user))
- playsound(holder, W.usesound, 50, 1)
- else
- return 0
- else if(istype(used_atom, /obj/item/wrench))
- var/obj/item/wrench/W = used_atom
- playsound(holder, W.usesound, 50, 1)
-
- else if(istype(used_atom, /obj/item/screwdriver))
- var/obj/item/screwdriver/S = used_atom
- playsound(holder, S.usesound, 50, 1)
-
- else if(istype(used_atom, /obj/item/wirecutters))
- var/obj/item/wirecutters/W = used_atom
- playsound(holder, W.usesound, 50, 1)
-
- else if(istype(used_atom, /obj/item/stack/cable_coil))
+ if(istype(used_atom, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = used_atom
if(C.use(4))
playsound(holder, C.usesound, 50, 1)
@@ -72,6 +37,11 @@
return 0
else
S.use(STANDARD_STACK_AMOUNT)
+ else if(isitem(used_atom))
+ var/obj/item/I = used_atom
+ if(I.tool_behaviour in CONSTRUCTION_TOOL_BEHAVIOURS)
+ if(!I.use_tool(holder, user, 0, volume = I.tool_volume))
+ return 0
return 1
@@ -108,59 +78,59 @@
taskpath = /datum/job_objective/make_ripley
steps = list(
//1
- list("key"=/obj/item/weldingtool,
- "backkey"=/obj/item/wrench,
+ list("key"=TOOL_WELDER,
+ "backkey"=TOOL_WRENCH,
"desc"="External armor is wrenched."),
//2
- list("key"=/obj/item/wrench,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_WRENCH,
+ "backkey"=TOOL_CROWBAR,
"desc"="External armor is installed."),
//3
list("key"=/obj/item/stack/sheet/plasteel,
- "backkey"=/obj/item/weldingtool,
+ "backkey"=TOOL_WELDER,
"desc"="Internal armor is welded."),
//4
- list("key"=/obj/item/weldingtool,
- "backkey"=/obj/item/wrench,
+ list("key"=TOOL_WELDER,
+ "backkey"=TOOL_WRENCH,
"desc"="Internal armor is wrenched."),
//5
- list("key"=/obj/item/wrench,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_WRENCH,
+ "backkey"=TOOL_CROWBAR,
"desc"="Internal armor is installed."),
//6
list("key"=/obj/item/stack/sheet/metal,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="Peripherals control module is secured."),
//7
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_CROWBAR,
"desc"="Peripherals control module is installed."),
//8
list("key"=/obj/item/circuitboard/mecha/ripley/peripherals,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="Central control module is secured."),
//9
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_CROWBAR,
"desc"="Central control module is installed."),
//10
list("key"=/obj/item/circuitboard/mecha/ripley/main,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="The wiring is adjusted."),
//11
list("key"=/obj/item/wirecutters,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="The wiring is added."),
//12
list("key"=/obj/item/stack/cable_coil,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="The hydraulic systems are active."),
//13
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/wrench,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_WRENCH,
"desc"="The hydraulic systems are connected."),
//14
- list("key"=/obj/item/wrench,
+ list("key"=TOOL_WRENCH,
"desc"="The hydraulic systems are disconnected.")
)
@@ -317,83 +287,83 @@
result = "/obj/mecha/combat/gygax"
steps = list(
//1
- list("key"=/obj/item/weldingtool,
- "backkey"=/obj/item/wrench,
+ list("key"=TOOL_WELDER,
+ "backkey"=TOOL_WRENCH,
"desc"="External armor is wrenched."),
//2
- list("key"=/obj/item/wrench,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_WRENCH,
+ "backkey"=TOOL_CROWBAR,
"desc"="External armor is installed."),
//3
list("key"=/obj/item/mecha_parts/part/gygax_armour,
- "backkey"=/obj/item/weldingtool,
+ "backkey"=TOOL_WELDER,
"desc"="Internal armor is welded."),
//4
- list("key"=/obj/item/weldingtool,
- "backkey"=/obj/item/wrench,
+ list("key"=TOOL_WELDER,
+ "backkey"=TOOL_WRENCH,
"desc"="Internal armor is wrenched."),
//5
- list("key"=/obj/item/wrench,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_WRENCH,
+ "backkey"=TOOL_CROWBAR,
"desc"="Internal armor is installed."),
//6
list("key"=/obj/item/stack/sheet/metal,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="Advanced capacitor is secured."),
//7
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_CROWBAR,
"desc"="Advanced capacitor is installed."),
//8
list("key"=/obj/item/stock_parts/capacitor/adv,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="Advanced scanner module is secured."),
//9
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_CROWBAR,
"desc"="Advanced scanner module is installed."),
//10
list("key"=/obj/item/stock_parts/scanning_module/adv,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="Scanning module is secured."),
//11
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_CROWBAR,
"desc"="Scanning module is installed."),
//12
list("key"=/obj/item/circuitboard/mecha/gygax/targeting,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="Peripherals control module is secured."),
//13
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_CROWBAR,
"desc"="Peripherals control module is installed."),
//14
list("key"=/obj/item/circuitboard/mecha/gygax/peripherals,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="Central control module is secured."),
//15
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_CROWBAR,
"desc"="Central control module is installed."),
//16
list("key"=/obj/item/circuitboard/mecha/gygax/main,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="The wiring is adjusted."),
//17
list("key"=/obj/item/wirecutters,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="The wiring is added."),
//18
list("key"=/obj/item/stack/cable_coil,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="The hydraulic systems are active."),
//19
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/wrench,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_WRENCH,
"desc"="The hydraulic systems are connected."),
//20
- list("key"=/obj/item/wrench,
+ list("key"=TOOL_WRENCH,
"desc"="The hydraulic systems are disconnected.")
)
@@ -597,64 +567,64 @@
taskpath = /datum/job_objective/make_ripley
steps = list(
//1
- list("key"=/obj/item/weldingtool,
- "backkey"=/obj/item/wrench,
+ list("key"=TOOL_WELDER,
+ "backkey"=TOOL_WRENCH,
"desc"="External armor is wrenched."),
//2
- list("key"=/obj/item/wrench,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_WRENCH,
+ "backkey"=TOOL_CROWBAR,
"desc"="External armor is installed."),
//3
list("key"=/obj/item/stack/sheet/plasteel,
- "backkey"=/obj/item/crowbar,
+ "backkey"=TOOL_CROWBAR,
"desc"="External armor is being installed."),
//4
list("key"=/obj/item/stack/sheet/plasteel,
- "backkey"=/obj/item/weldingtool,
+ "backkey"=TOOL_WELDER,
"desc"="Internal armor is welded."),
//5
- list("key"=/obj/item/weldingtool,
- "backkey"=/obj/item/wrench,
+ list("key"=TOOL_WELDER,
+ "backkey"=TOOL_WRENCH,
"desc"="Internal armor is wrenched."),
//6
- list("key"=/obj/item/wrench,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_WRENCH,
+ "backkey"=TOOL_CROWBAR,
"desc"="Internal armor is installed."),
//7
list("key"=/obj/item/stack/sheet/plasteel,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="Peripherals control module is secured."),
//8
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_CROWBAR,
"desc"="Peripherals control module is installed."),
//9
list("key"=/obj/item/circuitboard/mecha/ripley/peripherals,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="Central control module is secured."),
//10
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_CROWBAR,
"desc"="Central control module is installed."),
//11
list("key"=/obj/item/circuitboard/mecha/ripley/main,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="The wiring is adjusted."),
//12
list("key"=/obj/item/wirecutters,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="The wiring is added."),
//13
list("key"=/obj/item/stack/cable_coil,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="The hydraulic systems are active."),
//14
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/wrench,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_WRENCH,
"desc"="The hydraulic systems are connected."),
//15
- list("key"=/obj/item/wrench,
+ list("key"=TOOL_WRENCH,
"desc"="The hydraulic systems are disconnected.")
)
@@ -973,83 +943,83 @@
result = "/obj/mecha/combat/durand"
steps = list(
//1
- list("key"=/obj/item/weldingtool,
- "backkey"=/obj/item/wrench,
+ list("key"=TOOL_WELDER,
+ "backkey"=TOOL_WRENCH,
"desc"="External armor is wrenched."),
//2
- list("key"=/obj/item/wrench,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_WRENCH,
+ "backkey"=TOOL_CROWBAR,
"desc"="External armor is installed."),
//3
list("key"=/obj/item/mecha_parts/part/durand_armor,
- "backkey"=/obj/item/weldingtool,
+ "backkey"=TOOL_WELDER,
"desc"="Internal armor is welded."),
//4
- list("key"=/obj/item/weldingtool,
- "backkey"=/obj/item/wrench,
+ list("key"=TOOL_WELDER,
+ "backkey"=TOOL_WRENCH,
"desc"="Internal armor is wrenched."),
//5
- list("key"=/obj/item/wrench,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_WRENCH,
+ "backkey"=TOOL_CROWBAR,
"desc"="Internal armor is installed."),
//6
list("key"=/obj/item/stack/sheet/metal,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="Super capacitor is secured."),
//7
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_CROWBAR,
"desc"="Super capacitor is installed."),
//8
list("key"=/obj/item/stock_parts/capacitor/super,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="Phasic scanner module is secured."),
//9
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_CROWBAR,
"desc"="Phasic scanner module is installed."),
//10
list("key"=/obj/item/stock_parts/scanning_module/phasic,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="Scanning module is secured."),
//11
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_CROWBAR,
"desc"="Scanning module is installed."),
//12
list("key"=/obj/item/circuitboard/mecha/durand/targeting,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="Peripherals control module is secured."),
//13
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_CROWBAR,
"desc"="Peripherals control module is installed."),
//14
list("key"=/obj/item/circuitboard/mecha/durand/peripherals,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="Central control module is secured."),
//15
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_CROWBAR,
"desc"="Central control module is installed."),
//16
list("key"=/obj/item/circuitboard/mecha/durand/main,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="The wiring is adjusted."),
//17
list("key"=/obj/item/wirecutters,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="The wiring is added."),
//18
list("key"=/obj/item/stack/cable_coil,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="The hydraulic systems are active."),
//19
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/wrench,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_WRENCH,
"desc"="The hydraulic systems are connected."),
//20
- list("key"=/obj/item/wrench,
+ list("key"=TOOL_WRENCH,
"desc"="The hydraulic systems are disconnected.")
)
@@ -1259,95 +1229,95 @@
"backkey"=null, //Cannot remove the anomaly core once it's in
"desc"="Anomaly core socket is open and awaiting connection."),
//2
- list("key"=/obj/item/weldingtool,
- "backkey"=/obj/item/wrench,
+ list("key"=TOOL_WELDER,
+ "backkey"=TOOL_WRENCH,
"desc"="External armor is wrenched."),
//3
- list("key"=/obj/item/wrench,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_WRENCH,
+ "backkey"=TOOL_CROWBAR,
"desc"="External armor is installed."),
//4
list("key"=/obj/item/mecha_parts/part/phazon_armor,
- "backkey"=/obj/item/weldingtool,
+ "backkey"=TOOL_WELDER,
"desc"="Phase armor is welded."),
//5
- list("key"=/obj/item/weldingtool,
- "backkey"=/obj/item/wrench,
+ list("key"=TOOL_WELDER,
+ "backkey"=TOOL_WRENCH,
"desc"="Phase armor is wrenched."),
//6
- list("key"=/obj/item/wrench,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_WRENCH,
+ "backkey"=TOOL_CROWBAR,
"desc"="Phase armor is installed."),
//7
list("key"=/obj/item/stack/sheet/plasteel,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="The bluespace crystal is engaged."),
//8
- list("key"=/obj/item/screwdriver,
+ list("key"=TOOL_SCREWDRIVER,
"backkey"=/obj/item/wirecutters,
"desc"="The bluespace crystal is connected."),
//9
list("key"=/obj/item/stack/cable_coil,
- "backkey"=/obj/item/crowbar,
+ "backkey"=TOOL_CROWBAR,
"desc"="The bluespace crystal is installed."),
//10
list("key"=/obj/item/stack/ore/bluespace_crystal,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="Super capacitor is secured."),
//11
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_CROWBAR,
"desc"="Super capacitor is installed."),
//12
list("key"=/obj/item/stock_parts/capacitor/super,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="Phasic scanner module is secured."),
//13
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_CROWBAR,
"desc"="Phasic scanner module is installed."),
//14
list("key"=/obj/item/stock_parts/scanning_module/phasic,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="Scanning module is secured."),
//15
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_CROWBAR,
"desc"="Scanning module is installed."),
//16
list("key"=/obj/item/circuitboard/mecha/phazon/targeting,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="Peripherals control module is secured."),
//17
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_CROWBAR,
"desc"="Peripherals control module is installed"),
//18
list("key"=/obj/item/circuitboard/mecha/phazon/peripherals,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="Central control module is secured."),
//19
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_CROWBAR,
"desc"="Central control module is installed."),
//20
list("key"=/obj/item/circuitboard/mecha/phazon/main,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="The wiring is adjusted."),
//21
list("key"=/obj/item/wirecutters,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="The wiring is added."),
//22
list("key"=/obj/item/stack/cable_coil,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="The hydraulic systems are active."),
//23
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/wrench,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_WRENCH,
"desc"="The hydraulic systems are connected."),
//24
- list("key"=/obj/item/wrench,
+ list("key"=TOOL_WRENCH,
"desc"="The hydraulic systems are disconnected.")
)
@@ -1579,59 +1549,59 @@
result = "/obj/mecha/medical/odysseus"
steps = list(
//1
- list("key"=/obj/item/weldingtool,
- "backkey"=/obj/item/wrench,
+ list("key"=TOOL_WELDER,
+ "backkey"=TOOL_WRENCH,
"desc"="External armor is wrenched."),
//2
- list("key"=/obj/item/wrench,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_WRENCH,
+ "backkey"=TOOL_CROWBAR,
"desc"="External armor is installed."),
//3
list("key"=/obj/item/stack/sheet/plasteel,
- "backkey"=/obj/item/weldingtool,
+ "backkey"=TOOL_WELDER,
"desc"="Internal armor is welded."),
//4
- list("key"=/obj/item/weldingtool,
- "backkey"=/obj/item/wrench,
+ list("key"=TOOL_WELDER,
+ "backkey"=TOOL_WRENCH,
"desc"="Internal armor is wrenched."),
//5
- list("key"=/obj/item/wrench,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_WRENCH,
+ "backkey"=TOOL_CROWBAR,
"desc"="Internal armor is installed."),
//6
list("key"=/obj/item/stack/sheet/metal,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="Peripherals control module is secured."),
//7
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_CROWBAR,
"desc"="Peripherals control module is installed."),
//8
list("key"=/obj/item/circuitboard/mecha/odysseus/peripherals,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="Central control module is secured."),
//9
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/crowbar,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_CROWBAR,
"desc"="Central control module is installed."),
//10
list("key"=/obj/item/circuitboard/mecha/odysseus/main,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="The wiring is adjusted."),
//11
list("key"=/obj/item/wirecutters,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="The wiring is added."),
//12
list("key"=/obj/item/stack/cable_coil,
- "backkey"=/obj/item/screwdriver,
+ "backkey"=TOOL_SCREWDRIVER,
"desc"="The hydraulic systems are active."),
//13
- list("key"=/obj/item/screwdriver,
- "backkey"=/obj/item/wrench,
+ list("key"=TOOL_SCREWDRIVER,
+ "backkey"=TOOL_WRENCH,
"desc"="The hydraulic systems are connected."),
//14
- list("key"=/obj/item/wrench,
+ list("key"=TOOL_WRENCH,
"desc"="The hydraulic systems are disconnected.")
)
diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm
index 0e0ed85b727..9f01dc83af4 100644
--- a/code/game/mecha/mecha_wreckage.dm
+++ b/code/game/mecha/mecha_wreckage.dm
@@ -49,46 +49,45 @@
return
. += "The AI recovery beacon is active."
-/obj/structure/mecha_wreckage/attackby(obj/item/I, mob/user, params)
- if(iswelder(I))
- if(salvage_num <= 0 || !length(welder_salvage))
- to_chat(user, "You don't see anything that can be cut with [I]!")
- return
- var/obj/item/weldingtool/WT = I
- playsound(get_turf(src), WT.usesound, 50, TRUE)
- if(!WT.remove_fuel(0, user))
- return
- if(prob(30))
- to_chat(user, "You fail to salvage anything valuable from [src]!")
- return
- var/type = pick(welder_salvage)
- var/N = new type(get_turf(user))
- user.visible_message("[user] cuts [N] from [src].", "You cut [N] from [src].")
- if(!istype(N, /obj/item/stack))
- welder_salvage -= type
- salvage_num--
+/obj/structure/mecha_wreckage/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
-
- if(iswirecutter(I))
- if(wires_removed)
- to_chat(user, "You don't see anything that can be cut with [I]!")
- return
- var/N = new /obj/item/stack/cable_coil(get_turf(user), rand(1, 3))
- user.visible_message("[user] cuts [N] from [src].", "You cut [N] from [src].")
- wires_removed = TRUE
+ if(crowbar_salvage.len)
+ var/obj/S = pick(crowbar_salvage)
+ S.forceMove(user.drop_location())
+ user.visible_message("[user] pries [S] from [src].", "You pry [S] from [src].")
+ crowbar_salvage -= S
return
+ to_chat(user, "You don't see anything that can be cut with [I]!")
- if(iscrowbar(I))
- if(crowbar_salvage.len)
- var/obj/S = pick(crowbar_salvage)
- S.forceMove(user.drop_location())
- user.visible_message("[user] pries [S] from [src].", "You pry [S] from [src].")
- crowbar_salvage -= S
- return
+/obj/structure/mecha_wreckage/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ if(salvage_num <= 0 || !length(welder_salvage))
to_chat(user, "You don't see anything that can be cut with [I]!")
return
- return ..()
+ if(prob(30))
+ to_chat(user, "You fail to salvage anything valuable from [src]!")
+ return
+ var/type = pick(welder_salvage)
+ var/N = new type(get_turf(user))
+ user.visible_message("[user] cuts [N] from [src].", "You cut [N] from [src].")
+ if(!istype(N, /obj/item/stack))
+ welder_salvage -= type
+ salvage_num--
+/obj/structure/mecha_wreckage/wirecutter_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(wires_removed)
+ to_chat(user, "You don't see anything that can be cut with [I]!")
+ return
+ var/N = new /obj/item/stack/cable_coil(get_turf(user), rand(1, 3))
+ user.visible_message("[user] cuts [N] from [src].", "You cut [N] from [src].")
+ wires_removed = TRUE
/obj/structure/mecha_wreckage/transfer_ai(interaction, mob/user, null, obj/item/aicard/card)
if(!..())
@@ -213,4 +212,4 @@
/obj/item/mecha_parts/part/odysseus_left_arm,
/obj/item/mecha_parts/part/odysseus_right_arm,
/obj/item/mecha_parts/part/odysseus_left_leg,
- /obj/item/mecha_parts/part/odysseus_right_leg)
\ No newline at end of file
+ /obj/item/mecha_parts/part/odysseus_right_leg)
diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm
index 88821ae34c6..da03aa51837 100644
--- a/code/game/objects/effects/decals/contraband.dm
+++ b/code/game/objects/effects/decals/contraband.dm
@@ -85,17 +85,16 @@
poster_item_icon_state = initial(selected.poster_item_icon_state)
ruined = initial(selected.ruined)
-/obj/structure/sign/poster/attackby(obj/item/I, mob/user, params)
- if(iswirecutter(I))
- playsound(loc, I.usesound, 100, 1)
- if(ruined)
- to_chat(user, "You remove the remnants of the poster.")
- qdel(src)
- else
- to_chat(user, "You carefully remove the poster from the wall.")
- roll_and_drop(user.loc)
+/obj/structure/sign/poster/wirecutter_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
- return ..()
+ if(ruined)
+ to_chat(user, "You remove the remnants of the poster.")
+ qdel(src)
+ else
+ to_chat(user, "You carefully remove the poster from the wall.")
+ roll_and_drop(user.loc)
/obj/structure/sign/poster/attack_hand(mob/user)
if(ruined)
diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm
index 99f1ec2965f..ddf43f9c077 100644
--- a/code/game/objects/effects/portals.dm
+++ b/code/game/objects/effects/portals.dm
@@ -70,12 +70,14 @@
if(target)
O.forceMove(target)
-/obj/effect/portal/attackby(obj/item/A, mob/user)
- if(ismultitool(A) && can_multitool_to_remove)
+/obj/effect/portal/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(can_multitool_to_remove)
qdel(src)
- else if(user && Adjacent(user))
+ else
user.forceMove(get_turf(src))
- return TRUE
/obj/effect/portal/proc/can_teleport(atom/movable/M)
. = TRUE
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 4955f7f508a..955998fc0f6 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -83,6 +83,9 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
var/embedded_unsafe_removal_time = EMBEDDED_UNSAFE_REMOVAL_TIME //A time in ticks, multiplied by the w_class.
var/embedded_ignore_throwspeed_threshold = FALSE
+ var/tool_behaviour = NONE //What kind of tool are we?
+ var/tool_enabled = TRUE //If we can turn on or off, are we currently active? Mostly for welders and this will normally be TRUE
+ var/tool_volume = 50 //How loud are we when we use our tool?
var/toolspeed = 1 // If this item is a tool, the speed multiplier
/* Species-specific sprites, concept stolen from Paradise//vg/.
@@ -351,6 +354,16 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
return 1
return 0
+// Generic use proc. Depending on the item, it uses up fuel, charges, sheets, etc.
+// Returns TRUE on success, FALSE on failure.
+/obj/item/proc/use(used)
+ return !used
+
+//Generic refill proc. Transfers something (e.g. fuel, charge) from an atom to our tool. returns TRUE if it was successful, FALSE otherwise
+//Not sure if there should be an argument that indicates what exactly is being refilled
+/obj/item/proc/refill(mob/user, atom/A, amount)
+ return FALSE
+
/obj/item/proc/talk_into(mob/M, var/text, var/channel=null)
return
diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm
index 7b6d3612351..ca142e6f8be 100644
--- a/code/game/objects/items/candle.dm
+++ b/code/game/objects/items/candle.dm
@@ -32,28 +32,15 @@
/obj/item/candle/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = W
- if(WT.isOn()) //Badasses dont get blinded by lighting their candle with a welding tool
- light("[user] casually lights [src] with [WT], what a badass.")
- return
- if(istype(W, /obj/item/lighter))
- var/obj/item/lighter/L = W
- if(L.lit)
- light("After some fiddling, [user] manages to light [src] with [L].")
- return
- if(istype(W, /obj/item/match))
- var/obj/item/match/M = W
- if(M.lit)
- light("[user] lights [src] with [M]")
- return
- if(istype(W, /obj/item/candle))
- var/obj/item/candle/C = W
- if(C.lit)
- light("[user] tilts [C] and lights [src] with it.")
+ if(is_hot(W))
+ light("[user] lights [src] with [W].")
return
return ..()
+/obj/item/candle/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(I.tool_use_check(user, 0)) //Don't need to flash eyes because you are a badass
+ light("[user] casually lights the [name] with [I], what a badass.")
/obj/item/candle/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
if(!lit)
diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm
index 3942407b3d8..538b4efaf49 100644
--- a/code/game/objects/items/devices/instruments.dm
+++ b/code/game/objects/items/devices/instruments.dm
@@ -167,7 +167,7 @@
reqs = list(/obj/item/stack/sheet/wood = 5,
/obj/item/stack/cable_coil = 6,
/obj/item/stack/tape_roll = 5)
- tools = list(/obj/item/screwdriver, /obj/item/wirecutters)
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
time = 80
category = CAT_MISC
@@ -177,7 +177,7 @@
reqs = list(/obj/item/stack/sheet/wood = 5,
/obj/item/stack/cable_coil = 6,
/obj/item/stack/tape_roll = 5)
- tools = list(/obj/item/screwdriver, /obj/item/wirecutters)
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
time = 80
category = CAT_MISC
@@ -187,6 +187,6 @@
reqs = list(/obj/item/stack/sheet/metal = 5,
/obj/item/stack/cable_coil = 6,
/obj/item/stack/tape_roll = 5)
- tools = list(/obj/item/screwdriver, /obj/item/wirecutters)
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
time = 80
category = CAT_MISC
\ No newline at end of file
diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm
index 562800c2ce0..e354adc28e4 100644
--- a/code/game/objects/items/devices/powersink.dm
+++ b/code/game/objects/items/devices/powersink.dm
@@ -63,27 +63,27 @@
update_icon()
set_light(0)
-/obj/item/powersink/attackby(obj/item/I, mob/user)
- if(isscrewdriver(I))
- if(mode == DISCONNECTED)
- var/turf/T = loc
- if(isturf(T) && !T.intact)
- attached = locate() in T
- if(!attached)
- to_chat(user, "No exposed cable here to attach to.")
- return
- else
- set_mode(CLAMPED_OFF)
- visible_message("[user] attaches [src] to the cable!")
- message_admins("Power sink activated by [key_name_admin(user)] at ([x],[y],[z] - JMP)")
- log_game("Power sink activated by [key_name(user)] at ([x],[y],[z])")
+/obj/item/powersink/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(mode == DISCONNECTED)
+ var/turf/T = loc
+ if(isturf(T) && !T.intact)
+ attached = locate() in T
+ if(!attached)
+ to_chat(user, "No exposed cable here to attach to.")
+ return
else
- to_chat(user, "Device must be placed over an exposed cable to attach to it.")
+ set_mode(CLAMPED_OFF)
+ visible_message("[user] attaches [src] to the cable!")
+ message_admins("Power sink activated by [key_name_admin(user)] at ([x],[y],[z] - JMP)")
+ log_game("Power sink activated by [key_name(user)] at ([x],[y],[z])")
else
- set_mode(DISCONNECTED)
- src.visible_message("[user] detaches [src] from the cable!")
+ to_chat(user, "Device must be placed over an exposed cable to attach to it.")
else
- return ..()
+ set_mode(DISCONNECTED)
+ src.visible_message("[user] detaches [src] from the cable!")
/obj/item/powersink/attack_ai()
return
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 0ef3b0b0728..e6716a4f5c8 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -311,34 +311,8 @@
return ..()
/obj/item/radio/headset/attackby(obj/item/W as obj, mob/user as mob)
- user.set_machine(src)
- if(!( istype(W, /obj/item/screwdriver) || (istype(W, /obj/item/encryptionkey/ ))))
- return ..()
-
- if(istype(W, /obj/item/screwdriver))
- if(keyslot1 || keyslot2)
-
- for(var/ch_name in channels)
- SSradio.remove_object(src, SSradio.radiochannels[ch_name])
- secure_radio_connections[ch_name] = null
-
- if(keyslot1)
- var/turf/T = get_turf(user)
- if(T)
- keyslot1.loc = T
- keyslot1 = null
- if(keyslot2)
- var/turf/T = get_turf(user)
- if(T)
- keyslot2.loc = T
- keyslot2 = null
-
- recalculateChannels()
- to_chat(user, "You pop out the encryption keys in the headset!")
- else
- to_chat(user, "This headset doesn't have any encryption keys! How useless...")
-
if(istype(W, /obj/item/encryptionkey/))
+ user.set_machine(src)
if(keyslot1 && keyslot2)
to_chat(user, "The headset can't hold another key!")
return
@@ -351,10 +325,37 @@
user.drop_item()
W.loc = src
keyslot2 = W
+ recalculateChannels()
+ else
+ return ..()
+
+/obj/item/radio/headset/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = 0))
+ return
+ user.set_machine(src)
+ if(keyslot1 || keyslot2)
+
+ for(var/ch_name in channels)
+ SSradio.remove_object(src, SSradio.radiochannels[ch_name])
+ secure_radio_connections[ch_name] = null
+
+ if(keyslot1)
+ var/turf/T = get_turf(user)
+ if(T)
+ keyslot1.loc = T
+ keyslot1 = null
+ if(keyslot2)
+ var/turf/T = get_turf(user)
+ if(T)
+ keyslot2.loc = T
+ keyslot2 = null
recalculateChannels()
- return
-
+ to_chat(user, "You pop out the encryption keys in the headset!")
+ I.play_tool_sound(user, I.tool_volume)
+ else
+ to_chat(user, "This headset doesn't have any encryption keys! How useless...")
/obj/item/radio/headset/proc/recalculateChannels(var/setDescription = FALSE)
channels = list()
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index 8e440dc1d94..f0c97a66d97 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -138,76 +138,82 @@
/obj/item/radio/intercom/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/stack/tape_roll)) //eww
return
- switch(buildstage)
- if(3)
- if(iswirecutter(W) && b_stat && wires.IsAllCut())
- to_chat(user, "You cut out the intercoms wiring and disconnect its electronics.")
- playsound(get_turf(src), W.usesound, 50, 1)
- if(do_after(user, 10 * W.toolspeed, target = src))
- if(buildstage != 3)
- return
- new /obj/item/stack/cable_coil(get_turf(src),5)
- on = 0
- b_stat = 1
- buildstage = 1
- update_icon()
- STOP_PROCESSING(SSobj, src)
- return 1
- else return ..()
- if(2)
- if(isscrewdriver(W))
- playsound(get_turf(src), W.usesound, 50, 1)
- if(do_after(user, 10 * W.toolspeed, target = src))
- update_icon()
- on = 1
- b_stat = 0
- buildstage = 3
- to_chat(user, "You secure the electronics!")
- update_icon()
- START_PROCESSING(SSobj, src)
- for(var/i, i<= 5, i++)
- wires.UpdateCut(i,1)
- return 1
- if(1)
- if(iscoil(W))
- var/obj/item/stack/cable_coil/coil = W
- if(coil.amount < 5)
- to_chat(user, "You need more cable for this!")
- return
- if(do_after(user, 10 * coil.toolspeed, target = src))
- coil.use(5)
- to_chat(user, "You wire \the [src]!")
- buildstage = 2
- return 1
- if(iscrowbar(W))
- to_chat(user, "You begin removing the electronics...")
- playsound(get_turf(src), W.usesound, 50, 1)
- if(do_after(user, 10 * W.toolspeed, target = src))
- if(buildstage != 1)
- return
- new /obj/item/intercom_electronics(get_turf(src))
- to_chat(user, "The circuitboard pops out!")
- buildstage = 0
- return 1
- if(0)
- if(istype(W,/obj/item/intercom_electronics))
- playsound(get_turf(src), W.usesound, 50, 1)
- if(do_after(user, 10 * W.toolspeed, target = src))
- qdel(W)
- to_chat(user, "You insert \the [W] into \the [src]!")
- buildstage = 1
- return 1
- if(iswelder(W))
- var/obj/item/weldingtool/WT=W
- playsound(get_turf(src), WT.usesound, 50, 1)
- if(!WT.remove_fuel(3, user))
- to_chat(user, "You're out of welding fuel.")
- return 1
- if(do_after(user, 10 * WT.toolspeed, target = src))
- to_chat(user, "You cut the intercom frame from the wall!")
- new /obj/item/mounted/frame/intercom(get_turf(src))
- qdel(src)
- return 1
+ else if(iscoil(W) && buildstage == 1)
+ var/obj/item/stack/cable_coil/coil = W
+ if(coil.amount < 5)
+ to_chat(user, "You need more cable for this!")
+ return
+ if(do_after(user, 10 * coil.toolspeed, target = src) && buildstage == 1)
+ coil.use(5)
+ to_chat(user, "You wire \the [src]!")
+ buildstage = 2
+ return 1
+ else if(istype(W,/obj/item/intercom_electronics) && buildstage == 0)
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 10 * W.toolspeed, target = src) && buildstage == 0)
+ qdel(W)
+ to_chat(user, "You insert \the [W] into \the [src]!")
+ buildstage = 1
+ return 1
+ else
+ return ..()
+
+/obj/item/radio/intercom/crowbar_act(mob/user, obj/item/I)
+ if(buildstage != 1)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ to_chat(user, "You begin removing the electronics...")
+ if(!I.use_tool(src, user, 10, volume = I.tool_volume) || buildstage != 1)
+ return
+ new /obj/item/intercom_electronics(get_turf(src))
+ to_chat(user, "The circuit board pops out!")
+ buildstage = 0
+
+/obj/item/radio/intercom/screwdriver_act(mob/user, obj/item/I)
+ if(buildstage != 2)
+ return ..()
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ if(!I.use_tool(src, user, 10, volume = I.tool_volume) || buildstage != 2)
+ return
+ update_icon()
+ on = 1
+ b_stat = 0
+ buildstage = 3
+ to_chat(user, "You secure the electronics!")
+ update_icon()
+ START_PROCESSING(SSobj, src)
+ for(var/i, i<= 5, i++)
+ wires.UpdateCut(i,1)
+
+/obj/item/radio/intercom/wirecutter_act(mob/user, obj/item/I)
+ if(!(buildstage == 3 && b_stat && wires.IsAllCut()))
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ WIRECUTTER_SNIP_MESSAGE
+ new /obj/item/stack/cable_coil(get_turf(src),5)
+ on = 0
+ b_stat = 1
+ buildstage = 1
+ update_icon()
+ STOP_PROCESSING(SSobj, src)
+
+/obj/item/radio/intercom/welder_act(mob/user, obj/item/I)
+ if(!buildstage)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 3))
+ return
+ to_chat(user, "You start slicing [src] from the wall...")
+ if(I.use_tool(src, user, 10, amount = 3, volume = I.tool_volume))
+ to_chat(user, "You cut [src] free from the wall!")
+ new /obj/item/mounted/frame/intercom(get_turf(src))
+ qdel(src)
/obj/item/radio/intercom/update_icon()
if(!circuitry_installed)
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index aab926f768e..b6b55c9d370 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -603,22 +603,30 @@ var/global/list/default_medbay_channels = list(
else
. += "\the [src] can not be modified or attached!"
-/obj/item/radio/attackby(obj/item/W as obj, mob/user as mob, params)
- ..()
- user.set_machine(src)
- if(!( istype(W, /obj/item/screwdriver) ))
+/obj/item/radio/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
- b_stat = !( b_stat )
+ user.set_machine(src)
+ b_stat = !b_stat
if(!istype(src, /obj/item/radio/beacon))
if(b_stat)
user.show_message("The radio can now be attached and modified!")
else
user.show_message("The radio can no longer be modified or attached!")
updateDialog()
- //Foreach goto(83)
- add_fingerprint(user)
+
+/obj/item/radio/wirecutter_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
- else return
+ interact(user)
+
+/obj/item/radio/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ interact(user)
/obj/item/radio/emp_act(severity)
on = 0
@@ -689,33 +697,8 @@ var/global/list/default_medbay_channels = list(
set_frequency(ERT_FREQ)
/obj/item/radio/borg/attackby(obj/item/W as obj, mob/user as mob, params)
-// ..()
- user.set_machine(src)
- if(!( istype(W, /obj/item/screwdriver) || (istype(W, /obj/item/encryptionkey/ ))))
- return
-
- if(istype(W, /obj/item/screwdriver))
- if(keyslot)
-
-
- for(var/ch_name in channels)
- SSradio.remove_object(src, SSradio.radiochannels[ch_name])
- secure_radio_connections[ch_name] = null
-
-
- if(keyslot)
- var/turf/T = get_turf(user)
- if(T)
- keyslot.loc = T
- keyslot = null
-
- recalculateChannels()
- to_chat(user, "You pop out the encryption key in the radio!")
-
- else
- to_chat(user, "This radio doesn't have any encryption keys!")
-
if(istype(W, /obj/item/encryptionkey/))
+ user.set_machine(src)
if(keyslot)
to_chat(user, "The radio can't hold another key!")
return
@@ -726,8 +709,32 @@ var/global/list/default_medbay_channels = list(
keyslot = W
recalculateChannels()
+ else
+ return ..()
- return
+/obj/item/radio/borg/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = 0))
+ return
+ user.set_machine(src)
+ if(keyslot)
+ for(var/ch_name in channels)
+ SSradio.remove_object(src, SSradio.radiochannels[ch_name])
+ secure_radio_connections[ch_name] = null
+
+
+ if(keyslot)
+ var/turf/T = get_turf(user)
+ if(T)
+ keyslot.loc = T
+ keyslot = null
+
+ recalculateChannels()
+ to_chat(user, "You pop out the encryption key in the radio!")
+ I.play_tool_sound(user, I.tool_volume)
+
+ else
+ to_chat(user, "This radio doesn't have any encryption keys!")
/obj/item/radio/borg/proc/recalculateChannels()
channels = list()
diff --git a/code/game/objects/items/flag.dm b/code/game/objects/items/flag.dm
index d0118d815fb..1b2eae4db8d 100644
--- a/code/game/objects/items/flag.dm
+++ b/code/game/objects/items/flag.dm
@@ -245,22 +245,25 @@
message_admins("[key_name_admin(user)] has hidden [I] in the [src] ready for detonation at [A.name] (JMP).")
log_game("[key_name(user)] has hidden [I] in the [src] ready for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).")
investigate_log("[key_name(user)] has hidden [I] in the [src] ready for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).", INVESTIGATE_BOMB)
- else if(isscrewdriver(I) && boobytrap && user == trapper)
- to_chat(user, "You remove [boobytrap] from the [src].")
- boobytrap.forceMove(get_turf(src))
- boobytrap = null
- trapper = null
- else
- return ..()
-
-/obj/item/flag/chameleon/attackby(obj/item/W, mob/user, params)
- if(is_hot(W) && !(resistance_flags & ON_FIRE) && boobytrap && trapper)
+ else if(is_hot(I) && !(resistance_flags & ON_FIRE) && boobytrap && trapper)
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
message_admins("[key_name_admin(user)] has lit the [src] trapped with [boobytrap] by [key_name_admin(trapper)] at [A.name] (JMP).")
log_game("[key_name_admin(user)] has lit the [src] trapped with [boobytrap] by [key_name_admin(trapper)] at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).")
investigate_log("[key_name_admin(user)] has lit the [src] trapped with [boobytrap] by [key_name_admin(trapper)] at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).", INVESTIGATE_BOMB)
- return ..()
+ else
+ return ..()
+
+/obj/item/flag/chameleon/screwdriver_act(mob/user, obj/item/I)
+ if(!boobytrap || user != trapper)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ to_chat(user, "You remove [boobytrap] from [src].")
+ boobytrap.forceMove(get_turf(src))
+ boobytrap = null
+ trapper = null
/obj/item/flag/chameleon/burn()
if(boobytrap)
diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm
index 8c2d64bda59..959b308ee05 100644
--- a/code/game/objects/items/shooting_range.dm
+++ b/code/game/objects/items/shooting_range.dm
@@ -31,15 +31,12 @@
// the stake now, we have to push the target.
-
-/obj/item/target/attackby(obj/item/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = W
- if(WT.remove_fuel(0, user))
- overlays.Cut()
- to_chat(usr, "You slice off [src]'s uneven chunks of aluminum and scorch marks.")
- return
-
+/obj/item/target/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!use_tool(src, user, 0,, volume = I.tool_volume))
+ return
+ overlays.Cut()
+ to_chat(usr, "You slice off [src]'s uneven chunks of aluminum and scorch marks.")
/obj/item/target/attack_hand(mob/user as mob)
// taking pinned targets off!
diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm
index f3716459f18..37f726b215d 100644
--- a/code/game/objects/items/stacks/rods.dm
+++ b/code/game/objects/items/stacks/rods.dm
@@ -46,29 +46,23 @@ var/global/list/datum/stack_recipe/rod_recipes = list ( \
else
icon_state = "rods"
-/obj/item/stack/rods/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = W
-
- if(get_amount() < 2)
- to_chat(user, "You need at least two rods to do this!")
- return
-
- if(WT.remove_fuel(0,user))
- var/obj/item/stack/sheet/metal/new_item = new(user.loc)
- if(new_item.get_amount() <= 0)
- // stack was moved into another one on the pile
- new_item = locate() in user.loc
-
- user.visible_message("[user.name] shape [src] into metal with the welding tool.", \
- "You shape [src] into metal with the welding tool.", \
- "You hear welding.")
-
- var/replace = user.is_in_inactive_hand(src)
- use(2)
- if(get_amount() <= 0 && replace)
- user.unEquip(src, 1)
- if(new_item)
- user.put_in_hands(new_item)
+/obj/item/stack/rods/welder_act(mob/user, obj/item/I)
+ if(get_amount() < 2)
+ to_chat(user, "You need at least two rods to do this!")
return
- ..()
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ var/obj/item/stack/sheet/metal/new_item = new(drop_location())
+ if(new_item.get_amount() <= 0)
+ // stack was moved into another one on the pile
+ new_item = locate() in user.loc
+ visible_message("[user.name] shapes [src] into metal with [I]!", \
+ "You shape [src] into metal with [I]!", \
+ "You hear welding.")
+ var/replace = user.is_in_inactive_hand(src)
+ use(2)
+ if(get_amount() <= 0 && replace)
+ user.unEquip(src, 1)
+ if(new_item)
+ user.put_in_hands(new_item)
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index 047ffb3292a..a78711f915e 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -216,14 +216,12 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \
..()
recipes = plasma_recipes
-/obj/item/stack/sheet/mineral/plasma/attackby(obj/item/W, mob/user, params)
- if(is_hot(W) > 300)//If the temperature of the object is over 300, then ignite
+/obj/item/stack/sheet/mineral/plasma/welder_act(mob/user, obj/item/I)
+ if(I.use_tool(src, user, volume = I.tool_volume))
message_admins("Plasma sheets ignited by [key_name_admin(user)]([ADMIN_QUE(user,"?")]) ([ADMIN_FLW(user,"FLW")]) in ([x],[y],[z] - JMP)",0,1)
log_game("Plasma sheets ignited by [key_name(user)] in ([x],[y],[z])")
investigate_log("was ignited by [key_name(user)]","atmos")
fire_act()
- else
- return ..()
/obj/item/stack/sheet/mineral/plasma/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
..()
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index a4141a7a58a..08179c69edb 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -222,7 +222,7 @@
interact(usr)
return
-/obj/item/stack/proc/use(used, check = TRUE)
+/obj/item/stack/use(used, check = TRUE)
if(check && zero_amount())
return FALSE
if(amount < used)
diff --git a/code/game/objects/items/stacks/tiles/tile_mineral.dm b/code/game/objects/items/stacks/tiles/tile_mineral.dm
index 019ca77b6ad..0b0044005e7 100644
--- a/code/game/objects/items/stacks/tiles/tile_mineral.dm
+++ b/code/game/objects/items/stacks/tiles/tile_mineral.dm
@@ -8,6 +8,16 @@
mineralType = "plasma"
materials = list(MAT_PLASMA=500)
+/obj/item/stack/tile/mineral/plasma/welder_act(mob/user, obj/item/I)
+ if(I.use_tool(src, user, volume = I.tool_volume))
+ atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 5)
+ user.visible_message("[user.name] sets the plasma tiles on fire!", \
+ "You set the plasma tiles on fire!")
+ message_admins("Plasma tiles ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
+ log_game("Plasma tiles ignited by [key_name(user)] in ([x],[y],[z])")
+ investigate_log("was ignited by [key_name(user)]","atmos")
+ qdel(src)
+
/obj/item/stack/tile/mineral/uranium
name = "uranium tile"
singular_name = "uranium floor tile"
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index 564010b1aed..3e664c951a5 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -21,56 +21,38 @@
pixel_x = rand(-3, 3)
pixel_y = rand(-3, 3) //randomize a little
-/obj/item/stack/tile/attackby(obj/item/W, mob/user, params)
- if(iswelder(W))
- var/obj/item/weldingtool/WT = W
+/obj/item/stack/tile/welder_act(mob/user, obj/item/I)
+ if(get_amount() < 4)
+ to_chat(user, "You need at least four tiles to do this!")
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, volume = I.tool_volume))
+ to_chat(user, "You can not reform this!")
+ return
+ if (mineralType == "metal")
+ var/obj/item/stack/sheet/metal/new_item = new(user.loc)
+ user.visible_message("[user.name] shaped [src] into metal with the welding tool.", \
+ "You shaped [src] into metal with the welding tool.", \
+ "You hear welding.")
+ var/obj/item/stack/rods/R = src
+ src = null
+ var/replace = (user.get_inactive_hand()==R)
+ R.use(4)
+ if(!R && replace)
+ user.put_in_hands(new_item)
- if(is_hot(W) && !mineralType)
- to_chat(user, "You can not reform this!")
- return
-
- if(get_amount() < 4)
- to_chat(user, "You need at least four tiles to do this!")
- return
-
- if(WT.remove_fuel(0,user))
-
- if(mineralType == "plasma")
- atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 5)
- user.visible_message("[user.name] sets the plasma tiles on fire!", \
- "You set the plasma tiles on fire!")
- message_admins("Plasma tiles ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
- log_game("Plasma tiles ignited by [key_name(user)] in ([x],[y],[z])")
- investigate_log("was ignited by [key_name(user)]","atmos")
- qdel(src)
- return
-
- if (mineralType == "metal")
- var/obj/item/stack/sheet/metal/new_item = new(user.loc)
- user.visible_message("[user.name] shaped [src] into metal with the welding tool.", \
- "You shaped [src] into metal with the welding tool.", \
- "You hear welding.")
- var/obj/item/stack/rods/R = src
- src = null
- var/replace = (user.get_inactive_hand()==R)
- R.use(4)
- if(!R && replace)
- user.put_in_hands(new_item)
-
- else
- var/sheet_type = text2path("/obj/item/stack/sheet/mineral/[mineralType]")
- var/obj/item/stack/sheet/mineral/new_item = new sheet_type(user.loc)
- user.visible_message("[user.name] shaped [src] into a sheet with the welding tool.", \
- "You shaped [src] into a sheet with the welding tool.", \
- "You hear welding.")
- var/obj/item/stack/rods/R = src
- src = null
- var/replace = (user.get_inactive_hand()==R)
- R.use(4)
- if (!R && replace)
- user.put_in_hands(new_item)
else
- return ..()
+ var/sheet_type = text2path("/obj/item/stack/sheet/mineral/[mineralType]")
+ var/obj/item/stack/sheet/mineral/new_item = new sheet_type(user.loc)
+ user.visible_message("[user.name] shaped [src] into a sheet with the welding tool.", \
+ "You shaped [src] into a sheet with the welding tool.", \
+ "You hear welding.")
+ var/obj/item/stack/rods/R = src
+ src = null
+ var/replace = (user.get_inactive_hand()==R)
+ R.use(4)
+ if (!R && replace)
+ user.put_in_hands(new_item)
//Grass
/obj/item/stack/tile/grass
diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm
new file mode 100644
index 00000000000..134194bf4a7
--- /dev/null
+++ b/code/game/objects/items/tools/crowbar.dm
@@ -0,0 +1,85 @@
+/obj/item/crowbar
+ name = "pocket crowbar"
+ desc = "A small crowbar. This handy tool is useful for lots of things, such as prying floor tiles or opening unpowered doors."
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "crowbar"
+ item_state = "crowbar"
+ usesound = 'sound/items/crowbar.ogg'
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+ force = 5
+ throwforce = 7
+ item_state = "crowbar"
+ w_class = WEIGHT_CLASS_SMALL
+ materials = list(MAT_METAL=50)
+ origin_tech = "engineering=1;combat=1"
+ attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked")
+ toolspeed = 1
+
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
+ tool_behaviour = TOOL_CROWBAR
+
+/obj/item/crowbar/red
+ icon_state = "crowbar_red"
+ item_state = "crowbar_red"
+ force = 8
+
+/obj/item/crowbar/brass
+ name = "brass crowbar"
+ desc = "A brass crowbar. It feels faintly warm to the touch."
+ icon_state = "crowbar_brass"
+ item_state = "crowbar_brass"
+ toolspeed = 0.5
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+
+/obj/item/crowbar/abductor
+ name = "alien crowbar"
+ desc = "A hard-light crowbar. It appears to pry by itself, without any effort required."
+ icon = 'icons/obj/abductor.dmi'
+ usesound = 'sound/weapons/sonic_jackhammer.ogg'
+ icon_state = "crowbar"
+ toolspeed = 0.1
+ origin_tech = "combat=4;engineering=4;abductor=3"
+
+/obj/item/crowbar/large
+ name = "crowbar"
+ desc = "It's a big crowbar. It doesn't fit in your pockets, because its too big."
+ force = 12
+ w_class = WEIGHT_CLASS_NORMAL
+ throw_speed = 3
+ throw_range = 3
+ materials = list(MAT_METAL=70)
+ icon_state = "crowbar_large"
+ item_state = "crowbar_large"
+ toolspeed = 0.5
+
+/obj/item/crowbar/cyborg
+ name = "hydraulic crowbar"
+ desc = "A hydraulic prying tool, compact but powerful. Designed to replace crowbar in construction cyborgs."
+ usesound = 'sound/items/jaws_pry.ogg'
+ force = 10
+ toolspeed = 0.5
+
+/obj/item/crowbar/power
+ name = "jaws of life"
+ desc = "A set of jaws of life, the magic of science has managed to fit it down into a device small enough to fit in a tool belt. It's fitted with a prying head."
+ icon_state = "jaws_pry"
+ item_state = "jawsoflife"
+ materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
+ origin_tech = "materials=2;engineering=2"
+ usesound = 'sound/items/jaws_pry.ogg'
+ force = 15
+ toolspeed = 0.25
+ var/airlock_open_time = 100 // Time required to open powered airlocks
+
+/obj/item/crowbar/power/suicide_act(mob/user)
+ user.visible_message("[user] is putting [user.p_their()] head in [src]. It looks like [user.p_theyre()] trying to commit suicide!")
+ playsound(loc, 'sound/items/jaws_pry.ogg', 50, 1, -1)
+ return BRUTELOSS
+
+/obj/item/crowbar/power/attack_self(mob/user)
+ playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
+ var/obj/item/wirecutters/power/cutjaws = new /obj/item/wirecutters/power
+ to_chat(user, "You attach the cutting jaws to [src].")
+ qdel(src)
+ user.put_in_active_hand(cutjaws)
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/tools/multitool.dm
similarity index 88%
rename from code/game/objects/items/devices/multitool.dm
rename to code/game/objects/items/tools/multitool.dm
index 62fc36863fc..22c9861da6e 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/tools/multitool.dm
@@ -1,111 +1,121 @@
-#define PROXIMITY_NONE ""
-#define PROXIMITY_ON_SCREEN "_red"
-#define PROXIMITY_NEAR "_yellow"
-
-/**
- * Multitool -- A multitool is used for hacking electronic devices.
- * TO-DO -- Using it as a power measurement tool for cables etc. Nannek.
- *
- */
-
-/obj/item/multitool
- name = "multitool"
- desc = "Used for pulsing wires to test which to cut. Not recommended by doctors."
- icon = 'icons/obj/device.dmi'
- icon_state = "multitool"
- flags = CONDUCT
- force = 5.0
- w_class = WEIGHT_CLASS_SMALL
- throwforce = 0
- throw_range = 7
- throw_speed = 3
- materials = list(MAT_METAL=50, MAT_GLASS=20)
- origin_tech = "magnets=1;engineering=2"
- toolspeed = 1
- hitsound = 'sound/weapons/tap.ogg'
- var/shows_wire_information = FALSE // shows what a wire does if set to TRUE
- var/obj/machinery/buffer // simple machine buffer for device linkage
-
-/obj/item/multitool/proc/IsBufferA(var/typepath)
- if(!buffer)
- return 0
- return istype(buffer,typepath)
-
-// Syndicate device disguised as a multitool; it will turn red when an AI camera is nearby.
-
-/obj/item/multitool/Destroy()
- buffer = null
- return ..()
-
-/obj/item/multitool/ai_detect
- var/track_cooldown = 0
- var/track_delay = 10 //How often it checks for proximity
- var/detect_state = PROXIMITY_NONE
- var/rangealert = 8 //Glows red when inside
- var/rangewarning = 20 //Glows yellow when inside
- origin_tech = "magnets=1;engineering=2;syndicate=1"
-
-/obj/item/multitool/ai_detect/New()
- ..()
- START_PROCESSING(SSobj, src)
-
-/obj/item/multitool/ai_detect/Destroy()
- STOP_PROCESSING(SSobj, src)
- return ..()
-
-/obj/item/multitool/ai_detect/process()
- if(track_cooldown > world.time)
- return
- detect_state = PROXIMITY_NONE
- multitool_detect()
- icon_state = "[initial(icon_state)][detect_state]"
- track_cooldown = world.time + track_delay
-
-/obj/item/multitool/ai_detect/proc/multitool_detect()
- var/turf/our_turf = get_turf(src)
- for(var/mob/living/silicon/ai/AI in ai_list)
- if(AI.cameraFollow == src)
- detect_state = PROXIMITY_ON_SCREEN
- break
-
- if(!detect_state && cameranet.chunkGenerated(our_turf.x, our_turf.y, our_turf.z))
- var/datum/camerachunk/chunk = cameranet.getCameraChunk(our_turf.x, our_turf.y, our_turf.z)
- if(chunk)
- if(chunk.seenby.len)
- for(var/mob/camera/aiEye/A in chunk.seenby)
- var/turf/detect_turf = get_turf(A)
- if(get_dist(our_turf, detect_turf) < rangealert)
- detect_state = PROXIMITY_ON_SCREEN
- break
- if(get_dist(our_turf, detect_turf) < rangewarning)
- detect_state = PROXIMITY_NEAR
- break
-
-/obj/item/multitool/ai_detect/admin
- desc = "Used for pulsing wires to test which to cut. Not recommended by doctors. Has a strange tag that says 'Grief in Safety'" //What else should I say for a meme item?
- track_delay = 5
- shows_wire_information = TRUE
-
-/obj/item/multitool/ai_detect/admin/multitool_detect()
- var/turf/our_turf = get_turf(src)
- for(var/mob/J in urange(rangewarning,our_turf))
- if(check_rights(R_ADMIN, 0, J))
- detect_state = PROXIMITY_NEAR
- var/turf/detect_turf = get_turf(J)
- if(get_dist(our_turf, detect_turf) < rangealert)
- detect_state = PROXIMITY_ON_SCREEN
- break
-
-/obj/item/multitool/cyborg
- name = "multitool"
- desc = "Optimised and stripped-down version of a regular multitool."
- toolspeed = 0.5
-
-/obj/item/multitool/abductor
- name = "alien multitool"
- desc = "An omni-technological interface."
- icon = 'icons/obj/abductor.dmi'
- icon_state = "multitool"
- toolspeed = 0.1
- origin_tech = "magnets=5;engineering=5;abductor=3"
- shows_wire_information = TRUE
+#define PROXIMITY_NONE ""
+#define PROXIMITY_ON_SCREEN "_red"
+#define PROXIMITY_NEAR "_yellow"
+
+/**
+ * Multitool -- A multitool is used for hacking electronic devices.
+ */
+
+/obj/item/multitool
+ name = "multitool"
+ desc = "Used for pulsing wires to test which to cut. Not recommended by doctors."
+ icon = 'icons/obj/device.dmi'
+ icon_state = "multitool"
+ flags = CONDUCT
+ force = 5.0
+ w_class = WEIGHT_CLASS_SMALL
+ throwforce = 0
+ throw_range = 7
+ throw_speed = 3
+ materials = list(MAT_METAL=50, MAT_GLASS=20)
+ origin_tech = "magnets=1;engineering=2"
+ toolspeed = 1
+ tool_behaviour = TOOL_MULTITOOL
+ hitsound = 'sound/weapons/tap.ogg'
+ var/shows_wire_information = FALSE // shows what a wire does if set to TRUE
+ var/obj/machinery/buffer // simple machine buffer for device linkage
+
+/obj/item/multitool/proc/IsBufferA(var/typepath)
+ if(!buffer)
+ return 0
+ return istype(buffer,typepath)
+
+/obj/item/multitool/multitool_check_buffer(user, silent = FALSE)
+ return TRUE
+
+/obj/item/multitool/proc/set_multitool_buffer(mob/user, obj/machinery/M) //Loads a machine into memory, returns TRUE if it does
+ if(!ismachinery(M))
+ to_chat(user, "That's not a machine!")
+ return
+ buffer = M
+ to_chat(user, "You load [M] into [src]'s internal buffer.")
+ return TRUE
+
+// Syndicate device disguised as a multitool; it will turn red when an AI camera is nearby.
+
+/obj/item/multitool/Destroy()
+ buffer = null
+ return ..()
+
+/obj/item/multitool/ai_detect
+ var/track_cooldown = 0
+ var/track_delay = 10 //How often it checks for proximity
+ var/detect_state = PROXIMITY_NONE
+ var/rangealert = 8 //Glows red when inside
+ var/rangewarning = 20 //Glows yellow when inside
+ origin_tech = "magnets=1;engineering=2;syndicate=1"
+
+/obj/item/multitool/ai_detect/New()
+ ..()
+ START_PROCESSING(SSobj, src)
+
+/obj/item/multitool/ai_detect/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
+/obj/item/multitool/ai_detect/process()
+ if(track_cooldown > world.time)
+ return
+ detect_state = PROXIMITY_NONE
+ multitool_detect()
+ icon_state = "[initial(icon_state)][detect_state]"
+ track_cooldown = world.time + track_delay
+
+/obj/item/multitool/ai_detect/proc/multitool_detect()
+ var/turf/our_turf = get_turf(src)
+ for(var/mob/living/silicon/ai/AI in ai_list)
+ if(AI.cameraFollow == src)
+ detect_state = PROXIMITY_ON_SCREEN
+ break
+
+ if(!detect_state && cameranet.chunkGenerated(our_turf.x, our_turf.y, our_turf.z))
+ var/datum/camerachunk/chunk = cameranet.getCameraChunk(our_turf.x, our_turf.y, our_turf.z)
+ if(chunk)
+ if(chunk.seenby.len)
+ for(var/mob/camera/aiEye/A in chunk.seenby)
+ var/turf/detect_turf = get_turf(A)
+ if(get_dist(our_turf, detect_turf) < rangealert)
+ detect_state = PROXIMITY_ON_SCREEN
+ break
+ if(get_dist(our_turf, detect_turf) < rangewarning)
+ detect_state = PROXIMITY_NEAR
+ break
+
+/obj/item/multitool/ai_detect/admin
+ desc = "Used for pulsing wires to test which to cut. Not recommended by doctors. Has a strange tag that says 'Grief in Safety'" //What else should I say for a meme item?
+ track_delay = 5
+ shows_wire_information = TRUE
+
+/obj/item/multitool/ai_detect/admin/multitool_detect()
+ var/turf/our_turf = get_turf(src)
+ for(var/mob/J in urange(rangewarning,our_turf))
+ if(check_rights(R_ADMIN, 0, J))
+ detect_state = PROXIMITY_NEAR
+ var/turf/detect_turf = get_turf(J)
+ if(get_dist(our_turf, detect_turf) < rangealert)
+ detect_state = PROXIMITY_ON_SCREEN
+ break
+
+/obj/item/multitool/cyborg
+ name = "multitool"
+ desc = "Optimised and stripped-down version of a regular multitool."
+ toolspeed = 0.5
+
+/obj/item/multitool/abductor
+ name = "alien multitool"
+ desc = "An omni-technological interface."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "multitool"
+ toolspeed = 0.1
+ origin_tech = "magnets=5;engineering=5;abductor=3"
+ shows_wire_information = TRUE
diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm
new file mode 100644
index 00000000000..17169ce8970
--- /dev/null
+++ b/code/game/objects/items/tools/screwdriver.dm
@@ -0,0 +1,101 @@
+//Screwdriver
+/obj/item/screwdriver
+ name = "screwdriver"
+ desc = "You can be totally screwy with this."
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "screwdriver_map"
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+ force = 5
+ w_class = WEIGHT_CLASS_TINY
+ throwforce = 5
+ throw_speed = 3
+ throw_range = 5
+ materials = list(MAT_METAL=75)
+ attack_verb = list("stabbed")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ usesound = 'sound/items/screwdriver.ogg'
+ toolspeed = 1
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
+ tool_behaviour = TOOL_SCREWDRIVER
+ var/random_color = TRUE //if the screwdriver uses random coloring
+
+/obj/item/screwdriver/nuke
+ name = "screwdriver"
+ desc = "A screwdriver with an ultra thin tip."
+ icon_state = "screwdriver_nuke"
+ toolspeed = 0.5
+
+/obj/item/screwdriver/suicide_act(mob/user)
+ user.visible_message("[user] is stabbing [src] into [user.p_their()] [pick("temple", "heart")]! It looks like [user.p_theyre()] trying to commit suicide!")
+ return BRUTELOSS
+
+/obj/item/screwdriver/New(loc, var/param_color = null)
+ ..()
+ if(random_color)
+ if(!param_color)
+ param_color = pick("red","blue","pink","brown","green","cyan","yellow")
+ icon_state = "screwdriver_[param_color]"
+
+ if (prob(75))
+ src.pixel_y = rand(0, 16)
+
+/obj/item/screwdriver/attack(mob/living/carbon/M, mob/living/carbon/user)
+ if(!istype(M) || user.a_intent == INTENT_HELP)
+ return ..()
+ if(user.zone_selected != "eyes" && user.zone_selected != "head")
+ return ..()
+ if((CLUMSY in user.mutations) && prob(50))
+ M = user
+ return eyestab(M,user)
+
+/obj/item/screwdriver/brass
+ name = "brass screwdriver"
+ desc = "A screwdriver made of brass. The handle feels freezing cold."
+ icon_state = "screwdriver_brass"
+ toolspeed = 0.5
+ random_color = FALSE
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+
+/obj/item/screwdriver/abductor
+ name = "alien screwdriver"
+ desc = "An ultrasonic screwdriver."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "screwdriver"
+ usesound = 'sound/items/pshoom.ogg'
+ toolspeed = 0.1
+ random_color = FALSE
+
+/obj/item/screwdriver/power
+ name = "hand drill"
+ desc = "A simple hand drill with a screwdriver bit attached."
+ icon_state = "drill_screw"
+ item_state = "drill"
+ materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
+ origin_tech = "materials=2;engineering=2" //done for balance reasons, making them high value for research, but harder to get
+ force = 8 //might or might not be too high, subject to change
+ throwforce = 8
+ throw_speed = 2
+ throw_range = 3//it's heavier than a screw driver/wrench, so it does more damage, but can't be thrown as far
+ attack_verb = list("drilled", "screwed", "jabbed","whacked")
+ hitsound = 'sound/items/drill_hit.ogg'
+ usesound = 'sound/items/drill_use.ogg'
+ toolspeed = 0.25
+ random_color = FALSE
+
+/obj/item/screwdriver/power/suicide_act(mob/user)
+ user.visible_message("[user] is putting [src] to [user.p_their()] temple. It looks like [user.p_theyre()] trying to commit suicide!")
+ return BRUTELOSS
+
+/obj/item/screwdriver/power/attack_self(mob/user)
+ playsound(get_turf(user), 'sound/items/change_drill.ogg', 50, 1)
+ var/obj/item/wrench/power/b_drill = new /obj/item/wrench/power
+ to_chat(user, "You attach the bolt driver bit to [src].")
+ qdel(src)
+ user.put_in_active_hand(b_drill)
+
+/obj/item/screwdriver/cyborg
+ name = "powered screwdriver"
+ desc = "An electrical screwdriver, designed to be both precise and quick."
+ usesound = 'sound/items/drill_use.ogg'
+ toolspeed = 0.5
diff --git a/code/game/objects/items/tools/tool_behaviour.dm b/code/game/objects/items/tools/tool_behaviour.dm
new file mode 100644
index 00000000000..c937f80c30d
--- /dev/null
+++ b/code/game/objects/items/tools/tool_behaviour.dm
@@ -0,0 +1,60 @@
+// Called when a mob tries to use the item as a tool.
+// Handles most checks.
+/obj/item/proc/use_tool(atom/target, mob/living/user, delay, amount=0, volume=0, datum/callback/extra_checks)
+ // No delay means there is no start message, and no reason to call tool_start_check before use_tool.
+ // Run the start check here so we wouldn't have to call it manually.
+ target.add_fingerprint(user)
+ if(!tool_start_check(user, amount) && !delay)
+ return
+ delay *= toolspeed
+
+ // Play tool sound at the beginning of tool usage.
+ play_tool_sound(target, volume)
+
+ if(delay)
+ // Create a callback with checks that would be called every tick by do_after.
+ var/datum/callback/tool_check = CALLBACK(src, .proc/tool_check_callback, user, target, amount, extra_checks)
+
+ if(ismob(target))
+ if(!do_mob(user, target, delay, extra_checks=tool_check))
+ return
+
+ else
+ if(!do_after(user, delay, target=target, extra_checks=tool_check))
+ return
+ else
+ // Invoke the extra checks once, just in case.
+ if(extra_checks && !extra_checks.Invoke())
+ return
+
+ // Use tool's fuel, stack sheets or charges if amount is set.
+ if(amount && !use(amount))
+ return
+
+ // Play tool sound at the end of tool usage,
+ // but only if the delay between the beginning and the end is not too small
+ if(delay >= MIN_TOOL_SOUND_DELAY)
+ play_tool_sound(target, volume)
+ return TRUE
+
+// Called before use_tool if there is a delay, or by use_tool if there isn't.
+// Only ever used by welding tools and stacks, so it's not added on any other use_tool checks.
+/obj/item/proc/tool_start_check(mob/living/user, amount=0)
+ return tool_use_check(user, amount)
+
+// A check called by tool_start_check once, and by use_tool on every tick of delay.
+/obj/item/proc/tool_use_check(mob/living/user, amount)
+ return !amount
+
+/obj/item/proc/play_tool_sound(atom/target, volume = tool_volume)
+ if(target && usesound && volume)
+ var/played_sound = usesound
+
+ if(islist(usesound))
+ played_sound = pick(usesound)
+
+ playsound(target, played_sound, volume, 1)
+
+// Used in a callback that is passed by use_tool into do_after call. Do not override, do not call manually.
+/obj/item/proc/tool_check_callback(mob/living/user, atom/target, amount, datum/callback/extra_checks)
+ return tool_use_check(user, amount) && (!extra_checks || extra_checks.Invoke())
diff --git a/code/game/objects/items/tools/welder.dm b/code/game/objects/items/tools/welder.dm
new file mode 100644
index 00000000000..b002ed32205
--- /dev/null
+++ b/code/game/objects/items/tools/welder.dm
@@ -0,0 +1,232 @@
+#define GET_FUEL reagents.get_reagent_amount("fuel")
+
+/obj/item/weldingtool
+ name = "welding tool"
+ desc = "A standard edition welder provided by Nanotrasen."
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "welder"
+ item_state = "welder"
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+ force = 3
+ throwforce = 5
+ throw_speed = 3
+ throw_range = 5
+ hitsound = "swing_hit"
+ w_class = WEIGHT_CLASS_SMALL
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
+ resistance_flags = FIRE_PROOF
+ materials = list(MAT_METAL=70, MAT_GLASS=30)
+ origin_tech = "engineering=1;plasmatech=1"
+ tool_behaviour = TOOL_WELDER
+ toolspeed = 1
+ tool_enabled = FALSE
+ usesound = 'sound/items/welder.ogg'
+ var/maximum_fuel = 20
+ var/requires_fuel = TRUE //Set to FALSE if it doesn't need fuel, but serves equally well as a cost modifier
+ var/refills_over_time = FALSE //Do we regenerate fuel?
+ var/activation_sound = 'sound/items/welderactivate.ogg'
+ var/deactivation_sound = 'sound/items/welderdeactivate.ogg'
+ var/light_intensity = 2
+ var/low_fuel_changes_icon = TRUE//More than one icon_state due to low fuel?
+ var/progress_flash_divisor = 10 //Length of time between each "eye flash"
+
+/obj/item/weldingtool/Initialize(mapload)
+ ..()
+ create_reagents(maximum_fuel)
+ reagents.add_reagent("fuel", maximum_fuel)
+ if(refills_over_time)
+ reagents.reagents_generated_per_cycle += list("fuel" = 1)
+ update_icon()
+
+/obj/item/weldingtool/examine(mob/user)
+ . = ..()
+ if(get_dist(user, src) <= 0)
+ . += "It contains [GET_FUEL] unit\s of fuel out of [maximum_fuel]."
+
+/obj/item/weldingtool/suicide_act(mob/user)
+ user.visible_message("[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide!")
+ return FIRELOSS
+
+/obj/item/weldingtool/process()
+ var/turf/T = get_turf(src)
+ T.hotspot_expose(2500, 5)
+ if(prob(5))
+ remove_fuel(1)
+ ..()
+
+/obj/item/weldingtool/attack_self(mob/user)
+ if(tool_enabled) //Turn off the welder if it's on
+ to_chat(user, "You switch off [src].")
+ toggle_welder()
+ return
+ else if(GET_FUEL) //The welder is off, but we need to check if there is fuel in the tank
+ to_chat(user, "You switch on [src].")
+ toggle_welder()
+ else //The welder is off and unfuelled
+ to_chat(user, "[src] is out of fuel!")
+
+/obj/item/weldingtool/proc/toggle_welder(turn_off = FALSE) //Turn it on or off, forces it to deactivate
+ tool_enabled = turn_off ? FALSE : !tool_enabled
+ if(tool_enabled)
+ START_PROCESSING(SSobj, src)
+ damtype = BURN
+ force = 15
+ hitsound = 'sound/items/welder.ogg'
+ playsound(loc, activation_sound, 50, 1)
+ set_light(light_intensity)
+ else
+ STOP_PROCESSING(SSobj, src)
+ damtype = BRUTE
+ force = 3
+ hitsound = "swing_hit"
+ playsound(loc, deactivation_sound, 50, 1)
+ set_light(0)
+ update_icon()
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_r_hand()
+ M.update_inv_l_hand()
+
+// If welding tool ran out of fuel during a construction task, construction fails.
+/obj/item/weldingtool/tool_use_check(mob/living/user, amount)
+ if(!tool_enabled)
+ to_chat(user, "[src] has to be on to complete this task!")
+ return FALSE
+ if(GET_FUEL >= amount * requires_fuel)
+ return TRUE
+ else
+ to_chat(user, "You need more welding fuel to complete this task!")
+ return FALSE
+
+// When welding is about to start, run a normal tool_use_check, then flash a mob if it succeeds.
+/obj/item/weldingtool/tool_start_check(mob/living/user, amount=0)
+ . = tool_use_check(user, amount)
+ if(. && user)
+ user.flash_eyes(light_intensity)
+
+/obj/item/weldingtool/use(amount)
+ if(GET_FUEL < amount * requires_fuel)
+ return
+ remove_fuel(amount)
+ return TRUE
+
+/obj/item/weldingtool/use_tool(target, user, delay, amount, volume, datum/callback/extra_checks)
+ var/did_thing = ..()
+ if(did_thing)
+ remove_fuel(1) //Consume some fuel after we do a welding action
+ if(delay)
+ progress_flash_divisor = initial(progress_flash_divisor)
+ return did_thing
+
+/obj/item/weldingtool/tool_check_callback(mob/living/user, amount, datum/callback/extra_checks)
+ . = ..()
+ if(. && user)
+ if(progress_flash_divisor == 0)
+ user.flash_eyes(min(light_intensity, 1))
+ progress_flash_divisor = initial(progress_flash_divisor)
+ else
+ progress_flash_divisor--
+
+/obj/item/weldingtool/proc/remove_fuel(amount) //NB: doesn't check if we have enough fuel, it just removes however much is left if there's not enough
+ reagents.remove_reagent("fuel", amount * requires_fuel)
+ if(!GET_FUEL)
+ toggle_welder(TRUE)
+
+/obj/item/weldingtool/refill(mob/user, atom/A, amount)
+ if(!A.reagents)
+ return
+ if(GET_FUEL >= maximum_fuel)
+ to_chat(user, "[src] is already full!")
+ return
+ var/amount_transferred = A.reagents.trans_id_to(src, "fuel", amount)
+ if(amount_transferred)
+ to_chat(user, "You refuel [src] by [amount_transferred] unit\s.")
+ playsound(src, 'sound/effects/refill.ogg', 50, 1)
+ update_icon()
+ return amount_transferred
+ else
+ to_chat(user, "There's not enough fuel in [A] to refuel [src]!")
+
+/obj/item/weldingtool/proc/update_torch()
+ overlays.Cut()
+ if(tool_enabled)
+ overlays += "[initial(icon_state)]-on"
+ item_state = "[initial(item_state)]1"
+ else
+ item_state = "[initial(item_state)]"
+
+/obj/item/weldingtool/update_icon()
+ if(low_fuel_changes_icon)
+ var/ratio = GET_FUEL / maximum_fuel
+ ratio = Ceiling(ratio*4) * 25
+ if(ratio == 100)
+ icon_state = initial(icon_state)
+ else
+ icon_state = "[initial(icon_state)][ratio]"
+ update_torch()
+ ..()
+
+
+/obj/item/weldingtool/largetank
+ name = "industrial welding tool"
+ desc = "A slightly larger welder with a larger tank."
+ icon_state = "indwelder"
+ maximum_fuel = 40
+ materials = list(MAT_METAL=70, MAT_GLASS=60)
+ origin_tech = "engineering=2;plasmatech=2"
+
+/obj/item/weldingtool/largetank/cyborg
+ name = "integrated welding tool"
+ desc = "An advanced welder designed to be used in robotic systems."
+ toolspeed = 0.5
+
+/obj/item/weldingtool/mini
+ name = "emergency welding tool"
+ desc = "A miniature welder used during emergencies."
+ icon_state = "miniwelder"
+ maximum_fuel = 10
+ w_class = WEIGHT_CLASS_TINY
+ materials = list(MAT_METAL=30, MAT_GLASS=10)
+ low_fuel_changes_icon = FALSE
+
+/obj/item/weldingtool/abductor
+ name = "alien welding tool"
+ desc = "An alien welding tool. Whatever fuel it uses, it never runs out."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "welder"
+ toolspeed = 0.1
+ light_intensity = 0
+ origin_tech = "plasmatech=5;engineering=5;abductor=3"
+ requires_fuel = FALSE
+ refills_over_time = TRUE
+ low_fuel_changes_icon = FALSE
+
+/obj/item/weldingtool/hugetank
+ name = "upgraded welding tool"
+ desc = "An upgraded welder based off the industrial welder."
+ icon_state = "upindwelder"
+ item_state = "upindwelder"
+ maximum_fuel = 80
+ materials = list(MAT_METAL=70, MAT_GLASS=120)
+ origin_tech = "engineering=3;plasmatech=2"
+
+/obj/item/weldingtool/experimental
+ name = "experimental welding tool"
+ desc = "An experimental welder capable of self-fuel generation and less harmful to the eyes."
+ icon_state = "exwelder"
+ item_state = "exwelder"
+ maximum_fuel = 40
+ materials = list(MAT_METAL=70, MAT_GLASS=120)
+ origin_tech = "materials=4;engineering=4;bluespace=3;plasmatech=4"
+ light_intensity = 1
+ toolspeed = 0.5
+ refills_over_time = TRUE
+ low_fuel_changes_icon = FALSE
+
+/obj/item/weldingtool/experimental/brass
+ name = "brass welding tool"
+ desc = "A brass welder that seems to constantly refuel itself. It is faintly warm to the touch."
+ icon_state = "brasswelder"
+ item_state = "brasswelder"
+ resistance_flags = FIRE_PROOF | ACID_PROOF
diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm
new file mode 100644
index 00000000000..939139ce0b8
--- /dev/null
+++ b/code/game/objects/items/tools/wirecutters.dm
@@ -0,0 +1,95 @@
+/obj/item/wirecutters
+ name = "wirecutters"
+ desc = "This cuts wires."
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "cutters"
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+ force = 6
+ throw_speed = 3
+ throw_range = 7
+ w_class = WEIGHT_CLASS_SMALL
+ materials = list(MAT_METAL=80)
+ origin_tech = "materials=1;engineering=1"
+ attack_verb = list("pinched", "nipped")
+ hitsound = 'sound/items/wirecutter.ogg'
+ usesound = 'sound/items/wirecutter.ogg'
+ sharp = 1
+ toolspeed = 1
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
+ tool_behaviour = TOOL_WIRECUTTER
+ var/random_color = TRUE
+
+/obj/item/wirecutters/New(loc, param_color = null)
+ ..()
+ if(random_color)
+ if(!param_color)
+ param_color = pick("yellow", "red")
+ icon_state = "cutters_[param_color]"
+
+/obj/item/wirecutters/attack(mob/living/carbon/C, mob/user)
+ if(istype(C) && C.handcuffed && istype(C.handcuffed, /obj/item/restraints/handcuffs/cable))
+ user.visible_message("[user] cuts [C]'s restraints with [src]!")
+ QDEL_NULL(C.handcuffed)
+ if(C.buckled && C.buckled.buckle_requires_restraints)
+ C.buckled.unbuckle_mob(C)
+ C.update_handcuffed()
+ return
+ else
+ ..()
+
+/obj/item/wirecutters/suicide_act(mob/user)
+ user.visible_message("[user] is cutting at [user.p_their()] arteries with [src]! It looks like [user.p_theyre()] trying to commit suicide!")
+ playsound(loc, usesound, 50, 1, -1)
+ return BRUTELOSS
+
+/obj/item/wirecutters/brass
+ name = "brass wirecutters"
+ desc = "A pair of wirecutters made of brass. The handle feels freezing cold to the touch."
+ icon_state = "cutters_brass"
+ toolspeed = 0.5
+ random_color = FALSE
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+
+/obj/item/wirecutters/abductor
+ name = "alien wirecutters"
+ desc = "Extremely sharp wirecutters, made out of a silvery-green metal."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "cutters"
+ toolspeed = 0.1
+ origin_tech = "materials=5;engineering=4;abductor=3"
+ random_color = FALSE
+
+/obj/item/wirecutters/cyborg
+ name = "wirecutters"
+ desc = "This cuts wires."
+ toolspeed = 0.5
+
+/obj/item/wirecutters/power
+ name = "jaws of life"
+ desc = "A set of jaws of life, the magic of science has managed to fit it down into a device small enough to fit in a tool belt. It's fitted with a cutting head."
+ icon_state = "jaws_cutter"
+ item_state = "jawsoflife"
+ origin_tech = "materials=2;engineering=2"
+ materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
+ usesound = 'sound/items/jaws_cut.ogg'
+ toolspeed = 0.25
+ random_color = FALSE
+
+/obj/item/wirecutters/power/suicide_act(mob/user)
+ user.visible_message("[user] is wrapping \the [src] around [user.p_their()] neck. It looks like [user.p_theyre()] trying to rip [user.p_their()] head off!")
+ playsound(loc, 'sound/items/jaws_cut.ogg', 50, 1, -1)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ var/obj/item/organ/external/head/head = H.bodyparts_by_name["head"]
+ if(head)
+ head.droplimb(0, DROPLIMB_BLUNT, FALSE, TRUE)
+ playsound(loc,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1)
+ return BRUTELOSS
+
+/obj/item/wirecutters/power/attack_self(mob/user)
+ playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
+ var/obj/item/crowbar/power/pryjaws = new /obj/item/crowbar/power
+ to_chat(user, "You attach the pry jaws to [src].")
+ qdel(src)
+ user.put_in_active_hand(pryjaws)
diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm
new file mode 100644
index 00000000000..5af1185e90b
--- /dev/null
+++ b/code/game/objects/items/tools/wrench.dm
@@ -0,0 +1,105 @@
+//Wrench
+/obj/item/wrench
+ name = "wrench"
+ desc = "A wrench with common uses. Can be found in your hand."
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "wrench"
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+ force = 5
+ throwforce = 7
+ usesound = 'sound/items/ratchet.ogg'
+ w_class = WEIGHT_CLASS_SMALL
+ materials = list(MAT_METAL=150)
+ origin_tech = "materials=1;engineering=1"
+ attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
+ toolspeed = 1
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
+ tool_behaviour = TOOL_WRENCH
+
+/obj/item/wrench/suicide_act(mob/user)
+ user.visible_message("[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!")
+ playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1)
+ return BRUTELOSS
+
+/obj/item/wrench/cyborg
+ name = "automatic wrench"
+ desc = "An advanced robotic wrench. Can be found in construction cyborgs."
+ toolspeed = 0.5
+
+/obj/item/wrench/brass
+ name = "brass wrench"
+ desc = "A brass wrench. It's faintly warm to the touch."
+ icon_state = "wrench_brass"
+ toolspeed = 0.5
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+
+/obj/item/wrench/abductor
+ name = "alien wrench"
+ desc = "A polarized wrench. It causes anything placed between the jaws to turn."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "wrench"
+ usesound = 'sound/effects/empulse.ogg'
+ toolspeed = 0.1
+ origin_tech = "materials=5;engineering=5;abductor=3"
+
+/obj/item/wrench/power
+ name = "hand drill"
+ desc = "A simple powered drill with a bolt bit."
+ icon_state = "drill_bolt"
+ item_state = "drill"
+ usesound = 'sound/items/drill_use.ogg'
+ materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
+ origin_tech = "materials=2;engineering=2" //done for balance reasons, making them high value for research, but harder to get
+ force = 8 //might or might not be too high, subject to change
+ throwforce = 8
+ attack_verb = list("drilled", "screwed", "jabbed")
+ toolspeed = 0.25
+
+/obj/item/wrench/power/attack_self(mob/user)
+ playsound(get_turf(user),'sound/items/change_drill.ogg', 50, 1)
+ var/obj/item/wirecutters/power/s_drill = new /obj/item/screwdriver/power
+ to_chat(user, "You attach the screwdriver bit to [src].")
+ qdel(src)
+ user.put_in_active_hand(s_drill)
+
+/obj/item/wrench/power/suicide_act(mob/user)
+ user.visible_message("[user] is pressing [src] against [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide!")
+ return BRUTELOSS
+
+/obj/item/wrench/medical
+ name = "medical wrench"
+ desc = "A medical wrench with common (medical?) uses. Can be found in your hand."
+ icon_state = "wrench_medical"
+ force = 2 //MEDICAL
+ throwforce = 4
+ origin_tech = "materials=1;engineering=1;biotech=3"
+ attack_verb = list("wrenched", "medicaled", "tapped", "jabbed", "whacked")
+
+/obj/item/wrench/medical/suicide_act(mob/user)
+ user.visible_message("[user] is praying to the medical wrench to take [user.p_their()] soul. It looks like [user.p_theyre()] trying to commit suicide!")
+ // TODO Make them glow with the power of the M E D I C A L W R E N C H
+ // during their ascension
+
+ // Stun stops them from wandering off
+ user.Stun(5)
+ playsound(loc, 'sound/effects/pray.ogg', 50, 1, -1)
+
+ // Let the sound effect finish playing
+ sleep(20)
+
+ if(!user)
+ return
+
+ for(var/obj/item/W in user)
+ user.unEquip(W)
+
+ var/obj/item/wrench/medical/W = new /obj/item/wrench/medical(loc)
+ W.add_fingerprint(user)
+ W.desc += " For some reason, it reminds you of [user.name]."
+
+ if(!user)
+ return
+
+ user.dust()
+ return OBLITERATION
diff --git a/code/game/objects/items/weapons/RCL.dm b/code/game/objects/items/weapons/RCL.dm
index 10e52fc716a..fc803a5398e 100644
--- a/code/game/objects/items/weapons/RCL.dm
+++ b/code/game/objects/items/weapons/RCL.dm
@@ -36,26 +36,30 @@
return
update_icon()
to_chat(user, "You add the cables to the [src]. It now contains [loaded.amount].")
- else if(isscrewdriver(W))
- if(!loaded)
- return
- to_chat(user, "You loosen the securing screws on the side, allowing you to lower the guiding edge and retrieve the wires.")
- while(loaded.amount > 30) //There are only two kinds of situations: "nodiff" (60,90), or "diff" (31-59, 61-89)
- var/diff = loaded.amount % 30
- if(diff)
- loaded.use(diff)
- new /obj/item/stack/cable_coil(user.loc, diff)
- else
- loaded.use(30)
- new /obj/item/stack/cable_coil(user.loc, 30)
- loaded.max_amount = initial(loaded.max_amount)
- loaded.forceMove(user.loc)
- user.put_in_hands(loaded)
- loaded = null
- update_icon()
else
..()
+/obj/item/twohanded/rcl/screwdriver_act(mob/user, obj/item/I)
+ if(!loaded)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ to_chat(user, "You loosen the securing screws on the side, allowing you to lower the guiding edge and retrieve the wires.")
+ while(loaded.amount > 30) //There are only two kinds of situations: "nodiff" (60,90), or "diff" (31-59, 61-89)
+ var/diff = loaded.amount % 30
+ if(diff)
+ loaded.use(diff)
+ new /obj/item/stack/cable_coil(user.loc, diff)
+ else
+ loaded.use(30)
+ new /obj/item/stack/cable_coil(user.loc, 30)
+ loaded.max_amount = initial(loaded.max_amount)
+ loaded.forceMove(user.loc)
+ user.put_in_hands(loaded)
+ loaded = null
+ update_icon()
+
/obj/item/twohanded/rcl/examine(mob/user)
. = ..()
if(loaded)
diff --git a/code/game/objects/items/weapons/cigs.dm b/code/game/objects/items/weapons/cigs.dm
index fa4b90e0e37..de3eb52bdd2 100644
--- a/code/game/objects/items/weapons/cigs.dm
+++ b/code/game/objects/items/weapons/cigs.dm
@@ -64,14 +64,14 @@ LIGHTERS ARE IN LIGHTERS.DM
..()
light()
+/obj/item/clothing/mask/cigarette/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(I.tool_use_check(user, 0)) //Don't need to flash eyes because you are a badass
+ light("[user] casually lights the [name] with [I], what a badass.")
+
/obj/item/clothing/mask/cigarette/attackby(obj/item/W as obj, mob/user as mob, params)
..()
- if(istype(W, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = W
- if(WT.isOn())//Badasses dont get blinded while lighting their cig with a welding tool
- light("[user] casually lights the [name] with [W], what a badass.")
-
- else if(istype(W, /obj/item/lighter/zippo))
+ if(istype(W, /obj/item/lighter/zippo))
var/obj/item/lighter/zippo/Z = W
if(Z.lit)
light("With a single flick of [user.p_their()] wrist, [user] smoothly lights [user.p_their()] [name] with [user.p_their()] [W]. Damn [user.p_theyre()] cool.")
diff --git a/code/game/objects/items/weapons/conversion_kit.dm b/code/game/objects/items/weapons/conversion_kit.dm
new file mode 100644
index 00000000000..4eb09ff6f6e
--- /dev/null
+++ b/code/game/objects/items/weapons/conversion_kit.dm
@@ -0,0 +1,21 @@
+// Conversion kit
+/obj/item/conversion_kit
+ name = "\improper Revolver Conversion Kit"
+ desc = "A professional conversion kit used to convert any knock off revolver into the real deal capable of shooting lethal .357 rounds without the possibility of catastrophic failure."
+ icon_state = "kit"
+ flags = CONDUCT
+ w_class = WEIGHT_CLASS_SMALL
+ origin_tech = "combat=2"
+ var/open = 0
+
+/obj/item/conversion_kit/New()
+ ..()
+ update_icon()
+
+/obj/item/conversion_kit/update_icon()
+ icon_state = "[initial(icon_state)]_[open]"
+
+/obj/item/conversion_kit/attack_self(mob/user)
+ open = !open
+ to_chat(user, "You [open ? "open" : "close"] the conversion kit.")
+ update_icon()
diff --git a/code/game/objects/items/weapons/fireworks.dm b/code/game/objects/items/weapons/fireworks.dm
index d2e523cf953..7db6eb18250 100644
--- a/code/game/objects/items/weapons/fireworks.dm
+++ b/code/game/objects/items/weapons/fireworks.dm
@@ -7,7 +7,7 @@ obj/item/firework
obj/item/firework/attackby(obj/item/W,mob/user, params)
if(litzor)
return
- if(istype(W, /obj/item/weldingtool) && W:welding || istype(W,/obj/item/lighter) && W:lit)
+ if(is_hot(W))
for(var/mob/M in viewers(user))
to_chat(M, "[user] lits \the [src]")
litzor = 1
@@ -29,7 +29,7 @@ obj/item/sparkler
obj/item/sparkler/attackby(obj/item/W,mob/user, params)
if(litzor)
return
- if(istype(W, /obj/item/weldingtool) && W:welding || istype(W,/obj/item/lighter) && W:lit)
+ if(is_hot(W))
for(var/mob/M in viewers(user))
to_chat(M, "[user] lits \the [src]")
litzor = 1
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index 298ce493b14..fc1a0ca6c12 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -76,28 +76,7 @@
flame_turf(turflist)
/obj/item/flamethrower/attackby(obj/item/I, mob/user, params)
- if(iswrench(I) && !status)//Taking this apart
- var/turf/T = get_turf(src)
- if(weldtool)
- weldtool.forceMove(T)
- weldtool = null
- if(igniter)
- igniter.forceMove(T)
- igniter = null
- if(ptank)
- ptank.forceMove(T)
- ptank = null
- new /obj/item/stack/rods(T)
- qdel(src)
- return
-
- else if(isscrewdriver(I) && igniter && !lit)
- status = !status
- to_chat(user, "[igniter] is now [status ? "secured" : "unsecured"]!")
- update_icon()
- return
-
- else if(isigniter(I))
+ if(isigniter(I))
var/obj/item/assembly/igniter/IG = I
if(IG.secured)
return
@@ -130,6 +109,34 @@
else
return ..()
+/obj/item/flamethrower/wrench_act(mob/user, obj/item/I)
+ if(status)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ var/turf/T = get_turf(src)
+ if(weldtool)
+ weldtool.forceMove(T)
+ weldtool = null
+ if(igniter)
+ igniter.forceMove(T)
+ igniter = null
+ if(ptank)
+ ptank.forceMove(T)
+ ptank = null
+ new /obj/item/stack/rods(T)
+ qdel(src)
+
+/obj/item/flamethrower/screwdriver_act(mob/user, obj/item/I)
+ if(!igniter || lit)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ status = !status
+ to_chat(user, "[igniter] is now [status ? "secured" : "unsecured"]!")
+ update_icon()
/obj/item/flamethrower/attack_self(mob/user)
toggle_igniter(user)
@@ -168,7 +175,6 @@
..()
weldtool = locate(/obj/item/weldingtool) in contents
igniter = locate(/obj/item/assembly/igniter) in contents
- weldtool.status = FALSE
igniter.secured = FALSE
status = TRUE
update_icon()
@@ -216,7 +222,6 @@
if(create_full)
if(!weldtool)
weldtool = new /obj/item/weldingtool(src)
- weldtool.status = FALSE
if(!igniter)
igniter = new igniter_type(src)
igniter.secured = FALSE
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 91c6252d9b2..fdb60805f3b 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -387,18 +387,18 @@
origin_tech = "combat=3;engineering=4"
var/unit_spread = 10 // Amount of units per repeat. Can be altered with a multitool.
-/obj/item/grenade/chem_grenade/adv_release/attackby(obj/item/I, mob/user, params)
- if(ismultitool(I))
- switch(unit_spread)
- if(0 to 24)
- unit_spread += 5
- if(25 to 99)
- unit_spread += 25
- else
- unit_spread = 5
- to_chat(user, " You set the time release to [unit_spread] units per detonation.")
+/obj/item/grenade/chem_grenade/adv_release/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
- ..()
+ switch(unit_spread)
+ if(0 to 24)
+ unit_spread += 5
+ if(25 to 99)
+ unit_spread += 25
+ else
+ unit_spread = 5
+ to_chat(user, " You set the time release to [unit_spread] units per detonation.")
/obj/item/grenade/chem_grenade/adv_release/prime()
if(stage != READY)
diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm
index 6a2ee5635d7..21127f6869f 100644
--- a/code/game/objects/items/weapons/pneumaticCannon.dm
+++ b/code/game/objects/items/weapons/pneumaticCannon.dm
@@ -138,8 +138,7 @@
/datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but
name = "Pneumatic Cannon"
result = /obj/item/pneumatic_cannon/ghetto
- tools = list(/obj/item/weldingtool,
- /obj/item/wrench)
+ tools = list(TOOL_WELDER, TOOL_WRENCH)
reqs = list(/obj/item/stack/sheet/metal = 4,
/obj/item/stack/packageWrap = 8,
/obj/item/pipe = 2)
diff --git a/code/game/objects/items/weapons/powerfist.dm b/code/game/objects/items/weapons/powerfist.dm
index 4aab2c25d22..217cb963719 100644
--- a/code/game/objects/items/weapons/powerfist.dm
+++ b/code/game/objects/items/weapons/powerfist.dm
@@ -37,20 +37,29 @@
to_chat(user, "[IT] is too small for [src].")
return
updateTank(W, 0, user)
- else if(iswrench(W))
- switch(fisto_setting)
- if(1)
- fisto_setting = 2
- if(2)
- fisto_setting = 3
- if(3)
- fisto_setting = 1
- playsound(loc, W.usesound, 50, 1)
- to_chat(user, "You tweak [src]'s piston valve to [fisto_setting].")
- else if(isscrewdriver(W))
- if(tank)
- updateTank(tank, 1, user)
+ return
+ return ..()
+/obj/item/melee/powerfist/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ switch(fisto_setting)
+ if(1)
+ fisto_setting = 2
+ if(2)
+ fisto_setting = 3
+ if(3)
+ fisto_setting = 1
+ to_chat(user, "You tweak [src]'s piston valve to [fisto_setting].")
+
+/obj/item/melee/powerfist/screwdriver_act(mob/user, obj/item/I)
+ if(!tank)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ updateTank(tank, 1, user)
/obj/item/melee/powerfist/proc/updateTank(obj/item/tank/thetank, removing = 0, mob/living/carbon/human/user)
if(removing)
diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm
index 1bad335bb49..52c2aea5ddb 100644
--- a/code/game/objects/items/weapons/shards.dm
+++ b/code/game/objects/items/weapons/shards.dm
@@ -60,26 +60,27 @@
H.UpdateDamageIcon()
/obj/item/shard/attackby(obj/item/I, mob/user, params)
- if(iswelder(I))
- var/obj/item/weldingtool/WT = I
- if(WT.remove_fuel(0, user))
- var/obj/item/stack/sheet/NG = new welded_type(user.loc)
- for(var/obj/item/stack/sheet/G in user.loc)
- if(!istype(G, welded_type))
- continue
- if(G == NG)
- continue
- if(G.amount >= G.max_amount)
- continue
- G.attackby(NG, user)
- to_chat(user, "You add the newly-formed glass to the stack. It now contains [NG.amount] sheet\s.")
- qdel(src)
- return
if(istype(I, /obj/item/lightreplacer))
I.attackby(src, user)
return
return ..()
+/obj/item/shard/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, volume = I.tool_volume))
+ return
+ var/obj/item/stack/sheet/NG = new welded_type(user.loc)
+ for(var/obj/item/stack/sheet/G in user.loc)
+ if(!istype(G, welded_type))
+ continue
+ if(G == NG)
+ continue
+ if(G.amount >= G.max_amount)
+ continue
+ G.attackby(NG, user)
+ to_chat(user, "You add the newly-formed glass to the stack. It now contains [NG.amount] sheet\s.")
+ qdel(src)
+
/obj/item/shard/Crossed(mob/living/L, oldloc)
if(istype(L) && has_gravity(loc))
if(L.incorporeal_move || L.flying)
@@ -95,4 +96,4 @@
icon_state = "plasmalarge"
materials = list(MAT_PLASMA = MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
icon_prefix = "plasma"
- welded_type = /obj/item/stack/sheet/plasmaglass
\ No newline at end of file
+ welded_type = /obj/item/stack/sheet/plasmaglass
diff --git a/code/game/objects/items/weapons/storage/briefcase.dm b/code/game/objects/items/weapons/storage/briefcase.dm
index 8ba79674ab9..3f747e0f799 100644
--- a/code/game/objects/items/weapons/storage/briefcase.dm
+++ b/code/game/objects/items/weapons/storage/briefcase.dm
@@ -48,19 +48,7 @@
stored_gun.afterattack(A, user, flag, params)
/obj/item/storage/briefcase/false_bottomed/attackby(var/obj/item/I, mob/user)
- if(isscrewdriver(I))
- if(!bottom_open && !busy_hunting)
- to_chat(user, "You begin to hunt around the rim of the [src]...")
- busy_hunting = TRUE
- if(do_after(user, 20, target = src))
- if(user)
- to_chat(user, "You pry open the false bottom!")
- bottom_open = TRUE
- busy_hunting = FALSE
- else if(bottom_open)
- to_chat(user, "You push the false bottom down and close it with a click[stored_item ? ", with the [stored_item] snugly inside." : "."]")
- bottom_open = FALSE
- else if(bottom_open)
+ if(bottom_open)
if(stored_item)
to_chat(user, "There's already something in the false bottom!")
return
@@ -78,6 +66,24 @@
else
return ..()
+/obj/item/storage/briefcase/false_bottomed/screwdriver_act(mob/user, obj/item/I)
+ if(!bottom_open && busy_hunting)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(!bottom_open)
+ to_chat(user, "You begin to hunt around the rim of the [src]...")
+ busy_hunting = TRUE
+ if(do_after(user, 20, target = src))
+ if(user)
+ to_chat(user, "You pry open the false bottom!")
+ bottom_open = TRUE
+ busy_hunting = FALSE
+ else
+ to_chat(user, "You push the false bottom down and close it with a click[stored_item ? ", with the [stored_item] snugly inside." : "."]")
+ bottom_open = FALSE
+
/obj/item/storage/briefcase/false_bottomed/attack_hand(mob/user)
if(bottom_open && stored_item)
user.put_in_hands(stored_item)
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index fdaea1eb183..c37e3907593 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -311,17 +311,17 @@
hitsound = 'sound/weapons/blade1.ogg'
w_class = w_class_on
-/obj/item/twohanded/dualsaber/attackby(obj/item/W, mob/user, params)
- if(ismultitool(W))
- if(!hacked)
- hacked = TRUE
- to_chat(user, "2XRNBW_ENGAGE")
- blade_color = "rainbow"
- update_icon()
- else
- to_chat(user, "It's starting to look like a triple rainbow - no, nevermind.")
+/obj/item/twohanded/dualsaber/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(!hacked)
+ hacked = TRUE
+ to_chat(user, "2XRNBW_ENGAGE")
+ blade_color = "rainbow"
+ update_icon()
else
- return ..()
+ to_chat(user, "It's starting to look like a triple rainbow - no, nevermind.")
//spears
/obj/item/twohanded/spear
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index c1afed03b96..355bb7c89b7 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -271,6 +271,38 @@ a {
user.set_machine(src)
onclose(user, "mtcomputer")
+/obj/proc/default_welder_repair(mob/user, obj/item/I) //Returns TRUE if the object was successfully repaired. Fully repairs an object (setting BROKEN to FALSE), default repair time = 40
+ if(obj_integrity >= max_integrity)
+ to_chat(user, "[src] does not need repairs.")
+ return
+ if(I.tool_behaviour != TOOL_WELDER)
+ return
+ if(!I.tool_use_check(user, 0))
+ return
+ var/time = max(50 * (1 - obj_integrity / max_integrity), 5)
+ WELDER_ATTEMPT_REPAIR_MESSAGE
+ if(I.use_tool(src, user, time, volume = I.tool_volume))
+ WELDER_REPAIR_SUCCESS_MESSAGE
+ obj_integrity = max_integrity
+ update_icon()
+ return TRUE
+
+/obj/proc/default_unfasten_wrench(mob/user, obj/item/I, time = 20)
+ if(!anchored && !isfloorturf(loc))
+ user.visible_message("A floor must be present to secure [src]!")
+ return FALSE
+ if(I.tool_behaviour != TOOL_WRENCH)
+ return FALSE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return FALSE
+ if(!(flags & NODECONSTRUCT))
+ to_chat(user, "Now [anchored ? "un" : ""]securing [name].")
+ if(I.use_tool(src, user, time, volume = I.tool_volume))
+ to_chat(user, "You've [anchored ? "un" : ""]secured [name].")
+ anchored = !anchored
+ return TRUE
+ return FALSE
+
/obj/water_act(volume, temperature, source, method = TOUCH)
. = ..()
extinguish()
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 23ee0d0c5df..f6617feed87 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -14,9 +14,7 @@
var/locked = FALSE
var/wall_mounted = 0 //never solid (You can always pass over it)
var/lastbang
- var/cutting_tool = /obj/item/weldingtool
var/sound = 'sound/machines/click.ogg'
- var/cutting_sound
var/storage_capacity = 30 //This is so that someone can't pack hundreds of items in a locker/crate then open it in a populated area to crash clients.
var/material_drop = /obj/item/stack/sheet/metal
var/material_drop_amount = 2
@@ -220,22 +218,6 @@
MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet
if(istype(W,/obj/item/tk_grab))
return FALSE
- if(istype(W, cutting_tool))
- if(istype(W, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = W
- if(!WT.remove_fuel(0, user))
- return
- to_chat(user, "You begin cutting \the [src] apart...")
- playsound(loc, cutting_sound ? cutting_sound : WT.usesound, 40, 1)
- if(do_after(user, 40 * WT.toolspeed, 1, target = src))
- if(!opened || !WT.isOn())
- return
- playsound(loc, cutting_sound ? cutting_sound : WT.usesound, 50, 1)
- visible_message("[user] slices apart \the [src].",
- "You cut \the [src] apart with \the [WT].",
- "You hear welding.")
- deconstruct(TRUE)
- return
if(isrobot(user))
return
if(!user.drop_item()) //couldn't drop the item
@@ -245,25 +227,36 @@
W.forceMove(loc)
else if(istype(W, /obj/item/stack/packageWrap))
return
- else if(istype(W, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = W
- if(src == user.loc)
- to_chat(user, "You can not [welded?"unweld":"weld"] the locker from inside.")
- return
- if(!WT.remove_fuel(0, user))
- to_chat(user, "You need more welding fuel to complete this task.")
- return
- if(!do_after_once(user, 15, target = src))
- return
- welded = !welded
- update_icon()
- for(var/mob/M in viewers(src))
- M.show_message("[src] has been [welded?"welded shut":"unwelded"] by [user.name].", 3, "You hear welding.", 2)
else if(user.a_intent != INTENT_HARM)
attack_hand(user)
else
return ..()
+/obj/structure/closet/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!opened && user.loc == src)
+ to_chat(user, "You can't weld [src] from inside!")
+ return
+ if(!I.tool_use_check(user, 0))
+ return
+ if(opened)
+ WELDER_ATTEMPT_SLICING_MESSAGE
+ if(I.use_tool(src, user, 40, volume = I.tool_volume))
+ WELDER_SLICING_SUCCESS_MESSAGE
+ deconstruct(TRUE)
+ return
+ else
+ var/adjective = welded ? "open" : "shut"
+ user.visible_message("[user] begins welding [src] [adjective]...", "You begin welding [src] [adjective]...", "You hear welding.")
+ if(I.use_tool(src, user, 15, volume = I.tool_volume))
+ if(opened)
+ to_chat(user, "Keep [src] shut while doing that!")
+ return
+ user.visible_message("[user] welds [src] [adjective]!", "You weld [src] [adjective]!")
+ welded = !welded
+ update_icon()
+ return
+
/obj/structure/closet/MouseDrop_T(atom/movable/O, mob/user)
..()
if(istype(O, /obj/screen)) //fix for HUD elements making their way into the world -Pete
diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
index 6f0bd9f257c..593212c97f2 100644
--- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
+++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
@@ -11,7 +11,6 @@
sound = 'sound/effects/rustle2.ogg'
material_drop = /obj/item/stack/sheet/cardboard
var/amt = 4
- cutting_sound = 'sound/items/poster_ripped.ogg'
var/move_delay = 0
var/egged = 0
@@ -58,11 +57,11 @@
I.alpha = 0
animate(I, pixel_z = 32, alpha = 255, time = 5, easing = ELASTIC_EASING)
+/obj/structure/closet/cardboard/welder_act()
+ return
/obj/structure/closet/cardboard/attackby(obj/item/W as obj, mob/user as mob, params)
if(src.opened)
- if(istype(W, /obj/item/weldingtool))
- return
if(istype(W, /obj/item/wirecutters))
var/obj/item/wirecutters/WC = W
new /obj/item/stack/sheet/cardboard(src.loc, amt)
diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
index dea63a0d69d..741a9bae5a2 100644
--- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
@@ -196,4 +196,7 @@
return
/obj/structure/closet/fireaxecabinet/close()
- return
\ No newline at end of file
+ return
+
+/obj/structure/closet/fireaxecabinet/welder_act(mob/user, obj/item/I) //A bastion of sanity in a sea of madness
+ return
diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm
index a6fe47e0e9d..3cd753740fb 100644
--- a/code/game/objects/structures/crates_lockers/closets/statue.dm
+++ b/code/game/objects/structures/crates_lockers/closets/statue.dm
@@ -92,6 +92,9 @@
shatter(M)
..()
+/obj/structure/closet/statue/welder_act()
+ return
+
/obj/structure/closet/statue/MouseDrop_T()
return
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 1b116678151..31747323e07 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -185,6 +185,9 @@
dump_contents()
..()
+/obj/structure/closet/crate/welder_act()
+ return
+
/obj/structure/closet/crate/attack_hand(mob/user)
if(manifest)
to_chat(user, "You tear the manifest off of the crate.")
@@ -439,35 +442,11 @@
icon_closed = "largebin"
anchored = TRUE
-/obj/structure/closet/crate/can/attackby(obj/item/W, mob/living/user, params)
- if(iswrench(W))
- add_fingerprint(user)
- user.changeNext_move(CLICK_CD_MELEE)
- if(anchored)
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] starts loosening [src]'s floor casters.", \
- "You start loosening [src]'s floor casters...")
- if(do_after(user, 40 * W.toolspeed, target = src))
- if(!loc || !anchored)
- return
- user.visible_message("[user] loosened [src]'s floor casters.", \
- "You loosen [src]'s floor casters.")
- anchored = FALSE
- else
- if(!isfloorturf(loc))
- user.visible_message("A floor must be present to secure [src]!")
- return
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] start securing [src]'s floor casters...", \
- "You start securing [src]'s floor casters...")
- if(do_after(user, 40 * W.toolspeed, target = src))
- if(!loc || anchored)
- return
- user.visible_message("[user] has secured [src]'s floor casters.", \
- "You have secured [src]'s floor casters.")
- anchored = TRUE
- else
- return ..()
+/obj/structure/closet/crate/can/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ default_unfasten_wrench(user, I, 40)
/obj/structure/closet/crate/radiation
desc = "A crate with a radiation sign on it."
diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm
index 7a3f787b91e..e2ab534923d 100644
--- a/code/game/objects/structures/curtains.dm
+++ b/code/game/objects/structures/curtains.dm
@@ -41,34 +41,36 @@
/obj/structure/curtain/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/toy/crayon))
color = input(user, "Choose Color") as color
- else if(isscrewdriver(W))
- if(anchored)
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] unscrews [src] from the floor.", "You start to unscrew [src] from the floor...", "You hear rustling noises.")
- if(do_after(user, 50 * W.toolspeed, target = src))
- if(!anchored)
- return
- anchored = FALSE
- to_chat(user, "You unscrew [src] from the floor.")
- else
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] screws [src] to the floor.", "You start to screw [src] to the floor...", "You hear rustling noises.")
- if(do_after(user, 50 * W.toolspeed, target = src))
- if(anchored)
- return
- anchored = TRUE
- to_chat(user, "You screw [src] to the floor.")
- else if(istype(W, /obj/item/wirecutters))
- if(!anchored)
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] cuts apart [src].", "You start to cut apart [src].", "You hear cutting.")
- if(do_after(user, 50 * W.toolspeed, target = src))
- if(anchored)
- return
- to_chat(user, "You cut apart [src].")
- deconstruct()
+ return
+ return ..()
+
+/obj/structure/curtain/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_start_check(user, 0))
+ return
+ if(anchored)
+ user.visible_message("[user] unscrews [src] from the floor.", "You start to unscrew [src] from the floor...", "You hear rustling noises.")
+ if(I.use_tool(src, user, 50, volume = I.tool_volume) && anchored)
+ anchored = FALSE
+ to_chat(user, "You unscrew [src] from the floor.")
else
- return ..()
+ user.visible_message("[user] screws [src] to the floor.", "You start to screw [src] to the floor...", "You hear rustling noises.")
+ if(I.use_tool(src, user, 50, volume = I.tool_volume) && !anchored)
+ anchored = TRUE
+ to_chat(user, "You screw [src] to the floor.")
+
+
+
+/obj/structure/curtain/wirecutter_act(mob/user, obj/item/I)
+ if(anchored)
+ return
+ . = TRUE
+ if(!I.tool_start_check(user, 0))
+ return
+ WIRECUTTER_ATTEMPT_DISMANTLE_MESSAGE
+ if(I.use_tool(src, user, 50, volume = I.tool_volume))
+ WIRECUTTER_DISMANTLE_SUCCESS_MESSAGE
+ deconstruct()
/obj/structure/curtain/deconstruct(disassembled = TRUE)
new /obj/item/stack/sheet/cloth(loc, 2)
diff --git a/code/game/objects/structures/depot.dm b/code/game/objects/structures/depot.dm
index 5ea249b5ed2..5f7088f49b5 100644
--- a/code/game/objects/structures/depot.dm
+++ b/code/game/objects/structures/depot.dm
@@ -37,21 +37,22 @@
if(obj_integrity <= 0 && istype(depotarea))
overload(TRUE)
-/obj/structure/fusionreactor/attackby(obj/item/I, mob/user, params)
- if(iswrench(I))
- playsound(loc, I.usesound, 50, 1)
- to_chat(user, "The [src] is too well secured to the floor.")
- return
- if(isscrewdriver(I))
- to_chat(user, "You try to screwdriver open [src], but accidentally release some radiation!")
- if(prob(50))
- empulse(src, 4, 10)
- else
- for(var/mob/living/M in range(10, loc))
- M.apply_effect(rand(5, 25), IRRADIATE)
+/obj/structure/fusionreactor/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
+ to_chat(user, "You try to screwdriver open [src], but accidentally release some radiation!")
+ if(prob(50))
+ empulse(src, 4, 10)
else
- return ..()
+ for(var/mob/living/M in range(10, loc))
+ M.apply_effect(rand(5, 25), IRRADIATE)
+
+/obj/structure/fusionreactor/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ to_chat(user, "The [src] is too well secured to the floor.")
/obj/structure/fusionreactor/proc/overload(containment_failure = FALSE, skip_qdel = FALSE)
if(has_overloaded)
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 68755d0fb68..f515471acfc 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -105,31 +105,6 @@
toggle_lock(user)
else
to_chat(user, "Access denied.")
- else if(iswelder(I) && user.a_intent == INTENT_HELP && !broken)
- var/obj/item/weldingtool/WT = I
- if(obj_integrity < max_integrity && WT.remove_fuel(5, user))
- to_chat(user, "You begin repairing [src].")
- playsound(loc, WT.usesound, 40, 1)
- if(do_after(user, 40 * WT.toolspeed, target = src))
- obj_integrity = max_integrity
- playsound(loc, 'sound/items/welder2.ogg', 50, 1)
- update_icon()
- to_chat(user, "You repair [src].")
- else
- to_chat(user, "[src] is already in good condition!")
- return
- else if(!alert && iscrowbar(I) && openable) //Only applies to the lab cage and player made display cases
- if(broken)
- if(showpiece)
- to_chat(user, "Remove the displayed object first.")
- else
- to_chat(user, "You remove the destroyed case")
- qdel(src)
- else
- to_chat(user, "You start to [open ? "close":"open"] [src].")
- if(do_after(user, 20 * I.toolspeed, target = src))
- to_chat(user, "You [open ? "close":"open"] [src].")
- toggle_lock(user)
else if(open && !showpiece)
if(user.drop_item())
I.forceMove(src)
@@ -150,6 +125,30 @@
else
return ..()
+/obj/structure/displaycase/crowbar_act(mob/user, obj/item/I) //Only applies to the lab cage and player made display cases
+ if(alert || !openable)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ if(broken)
+ if(showpiece)
+ to_chat(user, "Remove the displayed object first.")
+ if(I.use_tool(src, user, 0, volume = I.tool_volume))
+ to_chat(user, "You remove the destroyed case")
+ qdel(src)
+ else
+ to_chat(user, "You start to [open ? "close":"open"] [src].")
+ if(!I.use_tool(src, user, 20, volume = I.tool_volume))
+ return
+ to_chat(user, "You [open ? "close":"open"] [src].")
+ toggle_lock(user)
+
+obj/structure/displaycase/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(default_welder_repair(user, I))
+ broken = FALSE
+
/obj/structure/displaycase/proc/toggle_lock(mob/user)
open = !open
update_icon()
@@ -180,15 +179,7 @@
var/obj/item/airlock_electronics/electronics
/obj/structure/displaycase_chassis/attackby(obj/item/I, mob/user, params)
- if(iswrench(I)) //The player can only deconstruct the wooden frame
- to_chat(user, "You start disassembling [src]...")
- playsound(src.loc, I.usesound, 50, 1)
- if(do_after(user, 30 * I.toolspeed, target = src))
- playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
- new /obj/item/stack/sheet/wood(get_turf(src), 5)
- qdel(src)
-
- else if(istype(I, /obj/item/airlock_electronics))
+ if(istype(I, /obj/item/airlock_electronics))
to_chat(user, "You start installing the electronics into [src]...")
playsound(src.loc, I.usesound, 50, 1)
if(do_after(user, 30, target = src))
@@ -217,6 +208,16 @@
else
return ..()
+/obj/structure/displaycase_chassis/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ TOOL_ATTEMPT_DISMANTLE_MESSAGE
+ if(!I.use_tool(src, user, 30, volume = I.tool_volume))
+ return
+ TOOL_DISMANTLE_SUCCESS_MESSAGE
+ new /obj/item/stack/sheet/wood(get_turf(src), 5)
+ qdel(src)
//The lab cage and captains display case do not spawn with electronics, which is why req_access is needed.
/obj/structure/displaycase/captain
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index 461f300ae4d..ee30932dabe 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -63,58 +63,6 @@
created_name = t
return
- else if(iswelder(W) && (mineral || glass || !anchored ))
- var/obj/item/weldingtool/WT = W
- if(WT.remove_fuel(0, user))
- playsound(loc, WT.usesound, 50, 1)
- if(mineral)
- var/obj/item/stack/sheet/mineral/mineral_path = text2path("/obj/item/stack/sheet/mineral/[mineral]")
- user.visible_message("[user] welds the [mineral] plating off the airlock assembly.", "You start to weld the [mineral] plating off the airlock assembly...")
- if(do_after(user, 40 * WT.toolspeed, target = src))
- if(!src || !WT.isOn())
- return
- to_chat(user, "You weld the [mineral] plating off.")
- new mineral_path(loc, 2)
- var/obj/structure/door_assembly/PA = new previous_assembly(loc)
- transfer_assembly_vars(src, PA)
-
- else if(glass)
- user.visible_message("[user] welds the glass panel out of the airlock assembly.", "You start to weld the glass panel out of the airlock assembly...")
- if(do_after(user, 40 * WT.toolspeed, target = src))
- if(!src || !WT.isOn())
- return
- to_chat(user, "You weld the glass panel out.")
- if(heat_proof_finished)
- new /obj/item/stack/sheet/rglass(get_turf(src))
- heat_proof_finished = FALSE
- else
- new /obj/item/stack/sheet/glass(get_turf(src))
- glass = FALSE
- else if(!anchored)
- user.visible_message("[user] disassembles the airlock assembly.", \
- "You start to disassemble the airlock assembly...")
- if(do_after(user, 40 * WT.toolspeed, target = src))
- if(!src || !WT.isOn())
- return
- to_chat(user, "You disassemble the airlock assembly.")
- deconstruct(TRUE)
- else
- to_chat(user, "You need more welding fuel.")
- return
-
- else if(iswrench(W) && state == AIRLOCK_ASSEMBLY_NEEDS_WIRES)
- playsound(loc, W.usesound, 100, 1)
- if(anchored)
- user.visible_message("[user] unsecures the airlock assembly from the floor.", "You start to unsecure the airlock assembly from the floor...")
- else
- user.visible_message("[user] secures the airlock assembly to the floor.", "You start to secure the airlock assembly to the floor...")
-
- if(do_after(user, 40 * W.toolspeed, target = src))
- if(!src)
- return
- to_chat(user, "You [anchored ? "un" : ""]secure the airlock assembly.")
- anchored = !anchored
-
else if(iscoil(W) && state == AIRLOCK_ASSEMBLY_NEEDS_WIRES && anchored)
var/obj/item/stack/cable_coil/coil = W
if(coil.get_amount() < 1)
@@ -128,17 +76,6 @@
state = AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS
to_chat(user, "You wire the airlock assembly.")
- else if(iswirecutter(W) && state == AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS)
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly...")
-
- if(do_after(user, 40 * W.toolspeed, target = src))
- if(state != AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS)
- return
- to_chat(user, "You cut the wires from the airlock assembly.")
- new/obj/item/stack/cable_coil(get_turf(user), 1)
- state = AIRLOCK_ASSEMBLY_NEEDS_WIRES
-
else if(istype(W, /obj/item/airlock_electronics) && state == AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS && W.icon_state != "door_electronics_smoked")
playsound(loc, W.usesound, 100, 1)
user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly...")
@@ -153,24 +90,6 @@
name = "near finished airlock assembly"
electronics = W
- else if(iscrowbar(W) && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER )
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly...")
-
- if(do_after(user, 40 * W.toolspeed, target = src))
- if(state != AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER)
- return
- to_chat(user, "You remove the airlock electronics.")
- state = AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS
- name = "wired airlock assembly"
- var/obj/item/airlock_electronics/ae
- if(!electronics)
- ae = new/obj/item/airlock_electronics(loc)
- else
- ae = electronics
- electronics = null
- ae.forceMove(loc)
-
else if(istype(W, /obj/item/stack/sheet) && (!glass || !mineral))
var/obj/item/stack/sheet/S = W
if(S)
@@ -210,41 +129,135 @@
to_chat(user, "You cannot add [S] to [src]!")
else
to_chat(user, "You cannot add [S] to [src]!")
-
- else if(isscrewdriver(W) && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER )
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] finishes the airlock.", \
- "You start finishing the airlock...")
-
- if(do_after(user, 40 * W.toolspeed, target = src))
- if(loc && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER)
- to_chat(user, "You finish the airlock.")
- var/obj/machinery/door/airlock/door
- if(glass)
- door = new glass_type(loc)
- else
- door = new airlock_type(loc)
- door.setDir(dir)
- door.electronics = electronics
- door.unres_sides = electronics.unres_sides
- door.heat_proof = heat_proof_finished
- if(electronics.one_access)
- door.req_access = null
- door.req_one_access = electronics.conf_access
- else
- door.req_access = electronics.conf_access
- if(created_name)
- door.name = created_name
- else
- door.name = base_name
- door.previous_airlock = previous_assembly
- electronics.forceMove(door)
- qdel(src)
else
return ..()
update_name()
update_icon()
+/obj/structure/door_assembly/crowbar_act(mob/user, obj/item/I)
+ if(state != AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER )
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ user.visible_message("[user] is removing the electronics from the airlock assembly...", "You start to remove electronics from the airlock assembly...")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume) || state != AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER)
+ return
+ to_chat(user, "You remove the airlock electronics.")
+ state = AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS
+ name = "wired airlock assembly"
+ var/obj/item/airlock_electronics/ae
+ if(!electronics)
+ ae = new/obj/item/airlock_electronics(loc)
+ else
+ ae = electronics
+ electronics = null
+ ae.forceMove(loc)
+ update_icon()
+ update_name()
+
+/obj/structure/door_assembly/screwdriver_act(mob/user, obj/item/I)
+ if(state != AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER )
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ user.visible_message("[user] is finishing the airlock...", \
+ "You start finishing the airlock...")
+ . = TRUE
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume) || state != AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER)
+ return
+ to_chat(user, "You finish the airlock.")
+ var/obj/machinery/door/airlock/door
+ if(glass)
+ door = new glass_type(loc)
+ else
+ door = new airlock_type(loc)
+ door.setDir(dir)
+ door.electronics = electronics
+ door.unres_sides = electronics.unres_sides
+ door.heat_proof = heat_proof_finished
+ if(electronics.one_access)
+ door.req_access = null
+ door.req_one_access = electronics.conf_access
+ else
+ door.req_access = electronics.conf_access
+ if(created_name)
+ door.name = created_name
+ else
+ door.name = base_name
+ door.previous_airlock = previous_assembly
+ electronics.forceMove(door)
+ qdel(src)
+ update_icon()
+
+/obj/structure/door_assembly/wirecutter_act(mob/user, obj/item/I)
+ if(state != AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ user.visible_message("[user] is cutting the wires from the airlock assembly...", "You start to cut the wires from airlock assembly...")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume) || state != AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS)
+ return
+ to_chat(user, "You cut the wires from the airlock assembly.")
+ new/obj/item/stack/cable_coil(get_turf(user), 1)
+ state = AIRLOCK_ASSEMBLY_NEEDS_WIRES
+ update_icon()
+
+/obj/structure/door_assembly/wrench_act(mob/user, obj/item/I)
+ if(state != AIRLOCK_ASSEMBLY_NEEDS_WIRES)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ if(anchored)
+ user.visible_message("[user] is unsecuring the airlock assembly from the floor...", "You start to unsecure the airlock assembly from the floor...")
+ else
+ user.visible_message("[user] is securing the airlock assembly to the floor...", "You start to secure the airlock assembly to the floor...")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume) || state != AIRLOCK_ASSEMBLY_NEEDS_WIRES)
+ return
+ to_chat(user, "You [anchored ? "un" : ""]secure the airlock assembly.")
+ anchored = !anchored
+
+/obj/structure/door_assembly/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ if(mineral)
+ var/obj/item/stack/sheet/mineral/mineral_path = text2path("/obj/item/stack/sheet/mineral/[mineral]")
+ visible_message("[user] welds the [mineral] plating off [src].",\
+ "You start to weld the [mineral] plating off [src]...",\
+ "You hear welding.")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume))
+ return
+ to_chat(user, "You weld the [mineral] plating off.")
+ new mineral_path(loc, 2)
+ var/obj/structure/door_assembly/PA = new previous_assembly(loc)
+ transfer_assembly_vars(src, PA)
+ else if(glass)
+ visible_message("[user] welds the glass panel out of [src].",\
+ "You start to weld the glass panel out of the [src]...",\
+ "You hear welding.")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume))
+ return
+ to_chat(user, "You weld the glass panel out.")
+ if(heat_proof_finished)
+ new /obj/item/stack/sheet/rglass(get_turf(src))
+ heat_proof_finished = FALSE
+ else
+ new /obj/item/stack/sheet/glass(get_turf(src))
+ glass = FALSE
+ else if(!anchored)
+ visible_message("[user] disassembles [src].", \
+ "You start to disassemble [src]...",\
+ "You hear welding.")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume))
+ return
+ to_chat(user, "You disassemble the airlock assembly.")
+ deconstruct(TRUE)
+ update_icon()
+
/obj/structure/door_assembly/update_icon()
overlays.Cut()
if(!glass)
diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm
index 1c657b9e244..f432e19b51a 100644
--- a/code/game/objects/structures/dresser.dm
+++ b/code/game/objects/structures/dresser.dm
@@ -53,41 +53,29 @@
add_fingerprint(H)
H.update_body()
-/obj/structure/dresser/attackby(obj/item/W, mob/living/user, params)
- add_fingerprint(user)
- user.changeNext_move(CLICK_CD_MELEE)
- if(iswrench(W))
- if(anchored)
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] is loosening [src]'s bolts.", \
- "You are loosening [src]'s bolts...")
- if(do_after(user, 40 * W.toolspeed, target = src))
- if(!loc || !anchored)
- return
- user.visible_message("[user] loosened [src]'s bolts!", \
- "You loosen [src]'s bolts!")
- anchored = 0
- else
- if(!isfloorturf(loc))
- user.visible_message("A floor must be present to secure [src]!")
- return
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] is securing [src]'s bolts...", \
- "You are securing [src]'s bolts...")
- if(do_after(user, 40 * W.toolspeed, target = src))
- if(!loc || anchored)
- return
- user.visible_message("[user] has secured [src]'s bolts.", \
- "You have secured [src]'s bolts.")
- anchored = 1
+
+/obj/structure/dresser/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_start_check(user, 0))
return
- if(iscrowbar(W) && !anchored)
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] is attempting to dismantle [src].", "You begin to dismantle [src]...")
- if(do_after(user, 40 * W.toolspeed, target = src))
- deconstruct()
+ TOOL_ATTEMPT_DISMANTLE_MESSAGE
+ if(I.use_tool(src, user, 50, volume = I.tool_volume))
+ TOOL_DISMANTLE_SUCCESS_MESSAGE
+
+
+/obj/structure/dresser/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
- return ..()
+ if(anchored)
+ WRENCH_UNANCHOR_MESSAGE
+ anchored = FALSE
+ else
+ if(!isfloorturf(loc))
+ user.visible_message("A floor must be present to secure [src]!")
+ return
+ WRENCH_ANCHOR_MESSAGE
+ anchored = TRUE
/obj/structure/dresser/deconstruct(disassembled = TRUE)
new /obj/item/stack/sheet/wood(drop_location(), 30)
diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm
index 0a8be5854ab..2dc0cf415cc 100644
--- a/code/game/objects/structures/extinguisher.dm
+++ b/code/game/objects/structures/extinguisher.dm
@@ -77,25 +77,6 @@
playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3)
opened = !opened
update_icon()
- else if(istype(O, /obj/item/weldingtool))
- if(has_extinguisher)
- to_chat(user, "You need to remove the extinguisher before deconstructing the cabinet!")
- return
- if(!opened)
- to_chat(user, "Open the cabinet before cutting it apart!")
- return
- var/obj/item/weldingtool/WT = O
- if(!WT.remove_fuel(0, user))
- return
- to_chat(user, "You begin cutting [src] apart...")
- playsound(loc, WT.usesound, 40, 1)
- if(do_after(user, 40 * WT.toolspeed, 1, target = src))
- if(!src ||!opened || !WT.isOn()) // !src to prevent it being duped
- return
- visible_message("[user] slices apart [src].",
- "You cut [src] apart with [WT].",
- "You hear welding.")
- deconstruct(TRUE)
else if(user.a_intent != INTENT_HARM)
playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3)
opened = !opened
@@ -103,6 +84,20 @@
else
return ..()
+/obj/structure/extinguisher_cabinet/welder_act(mob/user, obj/item/I)
+ if(has_extinguisher)
+ to_chat(user, "You need to remove the extinguisher before deconstructing [src]!")
+ return
+ if(!opened)
+ to_chat(user, "Open the cabinet before cutting it apart!")
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ WELDER_ATTEMPT_SLICING_MESSAGE
+ if(I.use_tool(src, user, 40, volume = I.tool_volume))
+ WELDER_SLICING_SUCCESS_MESSAGE
+ deconstruct(TRUE)
/obj/structure/extinguisher_cabinet/attack_hand(mob/user)
if(isrobot(user) || isalien(user))
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 113d1d12e7b..57c133388ac 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -119,16 +119,20 @@
return
user.visible_message("[user] tightens some bolts on the wall.", "You tighten the bolts on the wall.")
ChangeToWall()
- if(istype(W, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = W
- if(WT.remove_fuel(0,user))
- dismantle(user, TRUE)
else
to_chat(user, "You can't reach, close it first!")
if(istype(W, /obj/item/gun/energy/plasmacutter) || istype(W, /obj/item/pickaxe/drill/diamonddrill) || istype(W, /obj/item/pickaxe/drill/jackhammer) || istype(W, /obj/item/melee/energy/blade))
dismantle(user, TRUE)
+/obj/structure/falsewall/welder_act(mob/user, obj/item/I)
+ if(!density)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, volume = I.tool_volume))
+ return
+ dismantle(user, TRUE)
+
/obj/structure/falsewall/proc/dismantle(mob/user, disassembled = TRUE)
user.visible_message("[user] dismantles the false wall.", "You dismantle the false wall.")
playsound(src, 'sound/items/welder.ogg', 100, TRUE)
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 01d60f8860d..6b65d3028d9 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -9,6 +9,7 @@
max_integrity = 200
var/can_displace = TRUE //If the girder can be moved around by crowbarring it
var/metalUsed = 2 //used to determine amount returned in deconstruction
+ var/metal_type = /obj/item/stack/sheet/metal
/obj/structure/girder/examine(mob/user)
. = ..()
@@ -27,7 +28,7 @@
/obj/structure/girder/proc/refundMetal(metalAmount) //refunds metal used in construction when deconstructed
for(var/i=0;i < metalAmount;i++)
- new /obj/item/stack/sheet/metal(get_turf(src))
+ new metal_type(get_turf(src))
/obj/structure/girder/temperature_expose(datum/gas_mixture/air, exposed_temperature)
..()
@@ -37,62 +38,7 @@
/obj/structure/girder/attackby(obj/item/W, mob/user, params)
add_fingerprint(user)
- if(isscrewdriver(W))
- if(state == GIRDER_DISPLACED)
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] disassembles the girder.", \
- "You start to disassemble the girder...", "You hear clanking and banging noises.")
- if(do_after(user, 40*W.toolspeed, target = src))
- if(state != GIRDER_DISPLACED)
- return
- state = GIRDER_DISASSEMBLED
- to_chat(user, "You disassemble the girder.")
- var/obj/item/stack/sheet/metal/M = new(loc, 2)
- M.add_fingerprint(user)
- qdel(src)
- else if(state == GIRDER_REINF)
- playsound(loc, W.usesound, 100, 1)
- to_chat(user, "You start unsecuring support struts...")
- if(do_after(user, 40*W.toolspeed, target = src))
- if(state != GIRDER_REINF)
- return
- to_chat(user, "You unsecure the support struts.")
- state = GIRDER_REINF_STRUTS
- else if(state == GIRDER_REINF_STRUTS)
- playsound(loc, W.usesound, 100, 1)
- to_chat(user, "You start securing support struts...")
- if(do_after(user, 40*W.toolspeed, target = src))
- if(state != GIRDER_REINF_STRUTS)
- return
- to_chat(user, "You secure the support struts.")
- state = GIRDER_REINF
-
- else if(iswrench(W))
- if(state == GIRDER_NORMAL)
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] disassembles the girder.", \
- "You start to disassemble the girder...", "You hear clanking and banging noises.")
- if(do_after(user, 40*W.toolspeed, target = src))
- if(state != GIRDER_NORMAL)
- return
- state = GIRDER_DISASSEMBLED
- to_chat(user, "You disassemble the girder.")
- var/obj/item/stack/sheet/metal/M = new(loc, 2)
- M.add_fingerprint(user)
- qdel(src)
- else if(state == GIRDER_DISPLACED)
- if(!isfloorturf(loc))
- to_chat(user, "A floor must be present to secure the girder!")
- return
- playsound(loc, W.usesound, 100, 1)
- to_chat(user, "You start securing the girder...")
- if(do_after(user, 40*W.toolspeed, target = src))
- to_chat(user, "You secure the girder.")
- var/obj/structure/girder/G = new(loc)
- transfer_fingerprints_to(G)
- qdel(src)
-
- else if(istype(W, /obj/item/gun/energy/plasmacutter))
+ if(istype(W, /obj/item/gun/energy/plasmacutter))
to_chat(user, "You start slicing apart the girder...")
if(do_after(user, 40 * W.toolspeed, target = src))
if(!src)
@@ -113,28 +59,6 @@
refundMetal(metalUsed)
qdel(src)
- else if(iswirecutter(W) && state == GIRDER_REINF_STRUTS)
- playsound(loc, W.usesound, 100, 1)
- to_chat(user, "You start removing the inner grille...")
- if(do_after(user, 40 * W.toolspeed, target = src))
- if(!src)
- return
- to_chat(user, "You remove the inner grille.")
- new /obj/item/stack/sheet/plasteel(get_turf(src))
- var/obj/structure/girder/G = new (loc)
- transfer_fingerprints_to(G)
- qdel(src)
-
- else if(iscrowbar(W))
- if(state == GIRDER_NORMAL && can_displace)
- playsound(loc, W.usesound, 100, 1)
- to_chat(user, "You start dislodging the girder...")
- if(do_after(user, 40*W.toolspeed, target = src))
- to_chat(user, "You dislodge the girder.")
- var/obj/structure/girder/displaced/D = new (loc)
- transfer_fingerprints_to(D)
- qdel(src)
-
else if(istype(W, /obj/item/stack))
if(iswallturf(loc))
to_chat(user, "There is already a wall present!")
@@ -342,6 +266,101 @@
else
return ..()
+/obj/structure/girder/crowbar_act(mob/user, obj/item/I)
+ if(!can_displace || state != GIRDER_NORMAL)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ to_chat(user, "You start dislodging the girder...")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume) || state != GIRDER_NORMAL)
+ return
+ to_chat(user, "You dislodge the girder.")
+ var/obj/structure/girder/displaced/D = new (loc)
+ transfer_fingerprints_to(D)
+ qdel(src)
+
+/obj/structure/girder/screwdriver_act(mob/user, obj/item/I)
+ if(state != GIRDER_DISPLACED && state != GIRDER_REINF && state != GIRDER_REINF_STRUTS)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ switch(state)
+ if(GIRDER_DISPLACED)
+ TOOL_ATTEMPT_DISMANTLE_MESSAGE
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume) || state != GIRDER_DISPLACED)
+ return
+ state = GIRDER_DISASSEMBLED
+ TOOL_DISMANTLE_SUCCESS_MESSAGE
+ var/obj/item/stack/sheet/metal/M = new(loc, 2)
+ M.add_fingerprint(user)
+ qdel(src)
+ if(GIRDER_REINF)
+ to_chat(user, "You start unsecuring support struts...")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume) || state != GIRDER_REINF)
+ return
+ to_chat(user, "You unsecure the support struts.")
+ state = GIRDER_REINF_STRUTS
+ if(GIRDER_REINF_STRUTS)
+ to_chat(user, "You start securing support struts...")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume) || state != GIRDER_REINF_STRUTS)
+ return
+ to_chat(user, "You secure the support struts.")
+ state = GIRDER_REINF
+
+/obj/structure/girder/wirecutter_act(mob/user, obj/item/I)
+ if(state != GIRDER_REINF_STRUTS)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ to_chat(user, "You start removing the inner grille...")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume) || state != GIRDER_REINF_STRUTS)
+ return
+ to_chat(user, "You remove the inner grille.")
+ new /obj/item/stack/sheet/plasteel(get_turf(src))
+ var/obj/structure/girder/G = new (loc)
+ transfer_fingerprints_to(G)
+ qdel(src)
+
+/obj/structure/girder/wrench_act(mob/user, obj/item/I)
+ if(state != GIRDER_NORMAL && state != GIRDER_DISPLACED)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ if(state == GIRDER_NORMAL)
+ TOOL_ATTEMPT_DISMANTLE_MESSAGE
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume) || state != GIRDER_NORMAL)
+ return
+ state = GIRDER_DISASSEMBLED
+ TOOL_DISMANTLE_SUCCESS_MESSAGE
+ var/obj/item/stack/sheet/metal/M = new(loc, 2)
+ M.add_fingerprint(user)
+ qdel(src)
+ else
+ if(!isfloorturf(loc))
+ to_chat(user, "A floor must be present to secure the girder!")
+ return
+ to_chat(user, "You start securing the girder...")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume) || state != GIRDER_DISPLACED)
+ return
+ to_chat(user, "You secure the girder.")
+ var/obj/structure/girder/G = new(loc)
+ transfer_fingerprints_to(G)
+ qdel(src)
+
+/obj/structure/girder/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ WELDER_ATTEMPT_SLICING_MESSAGE
+ if(I.use_tool(src, user, 40, volume = I.tool_volume))
+ WELDER_SLICING_SUCCESS_MESSAGE
+ refundMetal(metalUsed)
+ qdel(src)
+
/obj/structure/girder/CanPass(atom/movable/mover, turf/target, height=0)
if(height==0)
return 1
@@ -392,6 +411,7 @@
icon_state = "cultgirder"
can_displace = FALSE
metalUsed = 1
+ metal_type = /obj/item/stack/sheet/runed_metal
/obj/structure/girder/cult/New()
. = ..()
@@ -407,21 +427,6 @@
user.visible_message("[user] strikes [src] with [W]!", "You demolish [src].")
refundMetal(metalUsed)
qdel(src)
-
- else if(iswelder(W))
- var/obj/item/weldingtool/WT = W
- if(WT.remove_fuel(0,user))
- playsound(loc, W.usesound, 50, 1)
- to_chat(user, "You start slicing apart the girder...")
- if(do_after(user, 40*W.toolspeed, target = src))
- if(!WT.isOn())
- return
- to_chat(user, "You slice apart the girder.")
- var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src))
- R.amount = 1
- transfer_fingerprints_to(R)
- qdel(src)
-
else if(istype(W, /obj/item/gun/energy/plasmacutter))
to_chat(user, "You start slicing apart the girder...")
if(do_after(user, 40* W.toolspeed, target = src))
@@ -431,7 +436,6 @@
R.amount = 1
transfer_fingerprints_to(R)
qdel(src)
-
else if(istype(W, /obj/item/pickaxe/drill/jackhammer))
var/obj/item/pickaxe/drill/jackhammer/D = W
to_chat(user, "Your jackhammer smashes through the girder!")
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 5244bcb32e1..ae24a1a23e9 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -118,18 +118,7 @@
/obj/structure/grille/attackby(obj/item/W, mob/user, params)
user.changeNext_move(CLICK_CD_MELEE)
add_fingerprint(user)
- if(iswirecutter(W))
- if(!shock(user, 100))
- playsound(loc, W.usesound, 100, 1)
- deconstruct()
- else if((isscrewdriver(W)) && (istype(loc, /turf/simulated) || anchored))
- if(!shock(user, 90))
- playsound(src, W.usesound, 100, 1)
- anchored = !anchored
- user.visible_message("[user] [anchored ? "fastens" : "unfastens"] [src].", \
- "You [anchored ? "fasten [src] to" : "unfasten [src] from"] the floor.")
- return
- else if(istype(W, /obj/item/stack/rods) && broken)
+ if(istype(W, /obj/item/stack/rods) && broken)
var/obj/item/stack/rods/R = W
if(!shock(user, 90))
user.visible_message("[user] rebuilds the broken grille.", \
@@ -148,6 +137,26 @@
else if(istype(W, /obj/item/shard) || !shock(user, 70))
return ..()
+/obj/structure/grille/wirecutter_act(mob/user, obj/item/I)
+ . = TRUE
+ if(shock(user, 100))
+ return
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ deconstruct()
+
+/obj/structure/grille/screwdriver_act(mob/user, obj/item/I)
+ if(!(istype(loc, /turf/simulated) || anchored))
+ return
+ . = TRUE
+ if(shock(user, 90))
+ return
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ anchored = !anchored
+ user.visible_message("[user] [anchored ? "fastens" : "unfastens"] [src].", \
+ "You [anchored ? "fasten [src] to" : "unfasten [src] from"] the floor.")
+
/obj/structure/grille/proc/build_window(obj/item/stack/sheet/S, mob/user)
var/dir_to_set = NORTH
if(!istype(S) || !user)
diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm
index eba923d5ea4..e5b5b6c7373 100644
--- a/code/game/objects/structures/guillotine.dm
+++ b/code/game/objects/structures/guillotine.dm
@@ -175,52 +175,45 @@
else
to_chat(user, "You need to raise the blade in order to sharpen it!")
return
- if(iswrench(W))
- if(current_action)
- return
-
- current_action = GUILLOTINE_ACTION_WRENCH
-
- if(do_after(user, GUILLOTINE_WRENCH_DELAY, target = src))
- current_action = 0
- if(has_buckled_mobs())
- to_chat(user, "Can't unfasten, someone's strapped in!")
- return
-
- if(current_action)
- return
- to_chat(user, "You [anchored ? "un" : ""]secure [src].")
- anchored = !anchored
- playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
- dir = SOUTH
- return TRUE
- else
- current_action = 0
- if(iswelder(W))
- var/obj/item/weldingtool/WT = W
- if(!WT.remove_fuel(0, user))
- return
- to_chat(user, "You begin cutting [src] apart...")
- playsound(loc, WT.usesound, 40, 1)
- if(do_after(user, 150 * WT.toolspeed, 1, target = src))
- if(!WT.isOn())
- return
- playsound(loc, WT.usesound, 50, 1)
- visible_message("[user] slices apart [src].",
- "You cut [src] apart with [WT].",
- "You hear welding.")
- var/turf/T = get_turf(src)
- if(blade_sharpness == GUILLOTINE_BLADE_MAX_SHARP)
- new /obj/item/stack/sheet/plasteel(T, 3)
- else
- new /obj/item/stack/sheet/plasteel(T, 2) //prevents reconstructing to sharpen the guillotine without additional plasteel
- new /obj/item/stack/sheet/wood(T, 20)
- new /obj/item/stack/cable_coil(T, 10)
- qdel(src)
- return
else
return ..()
+/obj/structure/guillotine/wrench_act(mob/user, obj/item/I)
+ if(current_action)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ current_action = GUILLOTINE_ACTION_WRENCH
+ if(!I.use_tool(src, user, GUILLOTINE_WRENCH_DELAY, volume = I.tool_volume))
+ current_action = 0
+ return
+ if(has_buckled_mobs())
+ to_chat(user, "Can't unfasten, someone's strapped in!")
+ return
+
+ current_action = 0
+ to_chat(user, "You [anchored ? "un" : ""]secure [src].")
+ anchored = !anchored
+ playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
+ dir = SOUTH
+
+/obj/structure/guillotine/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ WELDER_ATTEMPT_SLICING_MESSAGE
+ if(I.use_tool(src, user, 40, volume = I.tool_volume))
+ WELDER_SLICING_SUCCESS_MESSAGE
+ var/turf/T = get_turf(src)
+ if(blade_sharpness == GUILLOTINE_BLADE_MAX_SHARP)
+ new /obj/item/stack/sheet/plasteel(T, 3)
+ else
+ new /obj/item/stack/sheet/plasteel(T, 2) //prevents reconstructing to sharpen the guillotine without additional plasteel
+ new /obj/item/stack/sheet/wood(T, 20)
+ new /obj/item/stack/cable_coil(T, 10)
+ qdel(src)
+
/obj/structure/guillotine/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE)
if(!anchored)
to_chat(usr, "The [src] needs to be wrenched to the floor!")
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index 83da489a466..6a34c39a94d 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -45,19 +45,20 @@
desc = "Oh no, seven years of bad luck!"
broken = TRUE
-/obj/structure/mirror/attackby(obj/item/I, mob/living/user, params)
- if(isscrewdriver(I))
- user.visible_message("[user] begins to unfasten [src].", "You begin to unfasten [src].")
- if(do_after(user, 30 * I.toolspeed, target = src))
- if(broken)
- user.visible_message("[user] drops the broken shards to the floor.", "You drop the broken shards on the floor.")
- new /obj/item/shard(get_turf(user))
- else
- user.visible_message("[user] carefully places [src] on the floor.", "You carefully place [src] on the floor.")
- new /obj/item/mounted/mirror(get_turf(user))
- qdel(src)
+/obj/structure/mirror/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
return
- return ..()
+ user.visible_message("[user] begins to unfasten [src].", "You begin to unfasten [src].")
+ if(!I.use_tool(src, user, 30, volume = I.tool_volume))
+ return
+ if(broken)
+ user.visible_message("[user] drops the broken shards to the floor.", "You drop the broken shards on the floor.")
+ new /obj/item/shard(get_turf(user))
+ else
+ user.visible_message("[user] carefully places [src] on the floor.", "You carefully place [src] on the floor.")
+ new /obj/item/mounted/mirror(get_turf(user))
+ qdel(src)
/obj/structure/mirror/deconstruct(disassembled = TRUE)
if(!(flags & NODECONSTRUCT))
diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm
index da3ec759d36..8c025b63a97 100644
--- a/code/game/objects/structures/musician.dm
+++ b/code/game/objects/structures/musician.dm
@@ -315,25 +315,27 @@
/obj/structure/piano/Topic(href, href_list)
song.Topic(href, href_list)
-/obj/structure/piano/attackby(obj/item/O as obj, mob/user as mob, params)
- if(iswrench(O))
- if(!anchored && !isinspace())
- playsound(src.loc, O.usesound, 50, 1)
- to_chat(user, " You begin to tighten \the [src] to the floor...")
- if(do_after(user, 20 * O.toolspeed, target = src))
- user.visible_message( \
- "[user] tightens \the [src]'s casters.", \
- " You have tightened \the [src]'s casters. Now it can be played again.", \
- "You hear ratchet.")
- anchored = 1
- else if(anchored)
- playsound(src.loc, O.usesound, 50, 1)
- to_chat(user, " You begin to loosen \the [src]'s casters...")
- if(do_after(user, 40 * O.toolspeed, target = src))
- user.visible_message( \
- "[user] loosens \the [src]'s casters.", \
- " You have loosened \the [src]. Now it can be pulled somewhere else.", \
- "You hear ratchet.")
- anchored = 0
+/obj/structure/piano/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ if(!anchored && !isinspace())
+ WRENCH_ANCHOR_MESSAGE
+ if(!I.use_tool(src, user, 20, volume = I.tool_volume))
+ return
+ user.visible_message( \
+ "[user] tightens [src]'s casters.", \
+ " You have tightened [src]'s casters. Now it can be played again.", \
+ "You hear ratchet.")
+ anchored = TRUE
+ else if(anchored)
+ to_chat(user, " You begin to loosen [src]'s casters...")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume))
+ return
+ user.visible_message( \
+ "[user] loosens [src]'s casters.", \
+ " You have loosened [src]. Now it can be pulled somewhere else.", \
+ "You hear ratchet.")
+ anchored = FALSE
else
- return ..()
+ to_chat(user, "[src] needs to be bolted to the floor!")
diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm
index 2ce0918ac16..15b3c5d6420 100644
--- a/code/game/objects/structures/plasticflaps.dm
+++ b/code/game/objects/structures/plasticflaps.dm
@@ -17,43 +17,37 @@
if(PLASTIC_FLAPS_DETACHED)
. += "[src] are no longer screwed to the floor, and the flaps can be sliced apart."
-/obj/structure/plasticflaps/attackby(obj/item/W, mob/user, params)
- add_fingerprint(user)
- if(isscrewdriver(W))
- if(state == PLASTIC_FLAPS_NORMAL)
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] unscrews [src] from the floor.", "You start to unscrew [src] from the floor...", "You hear rustling noises.")
- if(do_after(user, 180*W.toolspeed, target = src))
- if(state != PLASTIC_FLAPS_NORMAL)
- return
- state = PLASTIC_FLAPS_DETACHED
- anchored = FALSE
- to_chat(user, "You unscrew [src] from the floor.")
- else if(state == PLASTIC_FLAPS_DETACHED)
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] screws [src] to the floor.", "You start to screw [src] to the floor...", "You hear rustling noises.")
- if(do_after(user, 40*W.toolspeed, target = src))
- if(state != PLASTIC_FLAPS_DETACHED)
- return
- state = PLASTIC_FLAPS_NORMAL
- anchored = TRUE
- to_chat(user, "You screw [src] to the floor.")
- else if(iswelder(W))
- if(state == PLASTIC_FLAPS_DETACHED)
- var/obj/item/weldingtool/WT = W
- if(!WT.remove_fuel(0, user))
- return
- playsound(loc, WT.usesound, 100, 1)
- user.visible_message("[user] slices apart [src].", "You start to slice apart [src].", "You hear welding.")
- if(do_after(user, 120*WT.toolspeed, target = src))
- if(state != PLASTIC_FLAPS_DETACHED)
- return
- to_chat(user, "You slice apart [src].")
- var/obj/item/stack/sheet/plastic/five/P = new(loc)
- P.add_fingerprint(user)
- qdel(src)
- else
- return ..()
+/obj/structure/plasticflaps/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ if(state == PLASTIC_FLAPS_NORMAL)
+ user.visible_message("[user] starts unscrewing [src] from the floor...", "You start to unscrew [src] from the floor...", "You hear rustling noises.")
+ if(!I.use_tool(src, user, 180, volume = I.tool_volume) || state != PLASTIC_FLAPS_NORMAL)
+ return
+ state = PLASTIC_FLAPS_DETACHED
+ anchored = FALSE
+ to_chat(user, "You unscrew [src] from the floor.")
+ else if(state == PLASTIC_FLAPS_DETACHED)
+ user.visible_message("[user] starts screwing [src] to the floor.", "You start to screw [src] to the floor...", "You hear rustling noises.")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume) || state != PLASTIC_FLAPS_DETACHED)
+ return
+ state = PLASTIC_FLAPS_NORMAL
+ anchored = TRUE
+ to_chat(user, "You screw [src] to the floor.")
+
+/obj/structure/plasticflaps/welder_act(mob/user, obj/item/I)
+ if(state != PLASTIC_FLAPS_DETACHED)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ WELDER_ATTEMPT_SLICING_MESSAGE
+ if(I.use_tool(src, user, 120, volume = I.tool_volume))
+ WELDER_SLICING_SUCCESS_MESSAGE
+ var/obj/item/stack/sheet/plastic/five/P = new(drop_location())
+ P.add_fingerprint(user)
+ qdel(src)
/obj/structure/plasticflaps/CanPass(atom/A, turf/T)
if(istype(A) && A.checkpass(PASSGLASS))
diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm
index 51738446750..5620422cc45 100644
--- a/code/game/objects/structures/reflector.dm
+++ b/code/game/objects/structures/reflector.dm
@@ -39,43 +39,6 @@
/obj/structure/reflector/attackby(obj/item/W, mob/user, params)
- if(iswrench(W))
- if(anchored)
- to_chat(user, "Unweld [src] first!")
- return
- playsound(user, 'sound/items/Ratchet.ogg', 50, 1)
- to_chat(user, "You begin to dismantle [src].")
- if(do_after(user, 80, target = src))
- playsound(user, 'sound/items/Ratchet.ogg', 50, 1)
- to_chat(user, "You dismantle [src].")
- new /obj/item/stack/sheet/metal(src.loc, 5)
- qdel(src)
- return
- if(istype(W, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = W
- if(!anchored)
- if(WT.remove_fuel(0,user))
- playsound(user, 'sound/items/Welder2.ogg', 50, 1)
- user.visible_message("[user.name] starts to weld [src.name] to the floor.", \
- "You start to weld [src] to the floor...", \
- "You hear welding.")
- if(do_after(user,20, target = src))
- if(!src || !WT.isOn())
- return
- anchored = 1
- to_chat(user, "You weld [src] to the floor.")
- else
- if(WT.remove_fuel(0,user))
- playsound(user, 'sound/items/Welder2.ogg', 50, 1)
- user.visible_message("[user] starts to cut [src] free from the floor.", \
- "You start to cut [src] free from the floor...", \
- "You hear welding.")
- if(do_after(user,20, target = src))
- if(!src || !WT.isOn())
- return
- anchored = 0
- to_chat(user, "You cut [src] free from the floor.")
- return
//Finishing the frame
if(istype(W,/obj/item/stack/sheet))
if(finished)
@@ -105,6 +68,38 @@
return
return ..()
+/obj/structure/reflector/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(anchored)
+ to_chat(user, "Unweld [src] first!")
+ return
+ if(!I.tool_use_check(user, 0))
+ return
+ TOOL_ATTEMPT_DISMANTLE_MESSAGE
+ if(!I.use_tool(src, user, 80, volume = I.tool_volume))
+ return
+ playsound(user, 'sound/items/Ratchet.ogg', 50, 1)
+ TOOL_DISMANTLE_SUCCESS_MESSAGE
+ new /obj/item/stack/sheet/metal(src.loc, 5)
+ qdel(src)
+
+/obj/structure/reflector/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ if(anchored)
+ WELDER_ATTEMPT_FLOOR_SLICE_MESSAGE
+ if(!I.use_tool(src, user, 20, volume = I.tool_volume))
+ return
+ WELDER_FLOOR_SLICE_SUCCESS_MESSAGE
+ anchored = FALSE
+ else
+ WELDER_ATTEMPT_FLOOR_WELD_MESSAGE
+ if(!I.use_tool(src, user, 20, volume = I.tool_volume))
+ return
+ WELDER_FLOOR_WELD_SUCCESS_MESSAGE
+ anchored = TRUE
+
/obj/structure/reflector/proc/get_reflection(srcdir,pdir)
return 0
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index 707d30dbcfa..930dcc0995c 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -17,19 +17,22 @@
if(BURN)
playsound(loc, 'sound/items/welder.ogg', 80, TRUE)
-/obj/structure/sign/attackby(obj/item/tool as obj, mob/user as mob) //deconstruction
- if(istype(tool, /obj/item/screwdriver) && !istype(src, /obj/structure/sign/double))
- to_chat(user, "You unfasten the sign with your [tool].")
- var/obj/item/sign/S = new(src.loc)
- S.name = name
- S.desc = desc
- S.icon_state = icon_state
- //var/icon/I = icon('icons/obj/decals.dmi', icon_state)
- //S.icon = I.Scale(24, 24)
- S.sign_state = icon_state
- qdel(src)
- else
- return ..()
+/obj/structure/sign/screwdriver_act(mob/user, obj/item/I)
+ if(istype(src, /obj/structure/sign/double))
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ to_chat(user, "You unfasten the sign with [I].")
+ var/obj/item/sign/S = new(src.loc)
+ S.name = name
+ S.desc = desc
+ S.icon_state = icon_state
+ //var/icon/I = icon('icons/obj/decals.dmi', icon_state)
+ //S.icon = I.Scale(24, 24)
+ S.sign_state = icon_state
+ qdel(src)
+
/obj/item/sign
name = "sign"
diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm
index 6af52d6999b..0d6166b928e 100644
--- a/code/game/objects/structures/statues.dm
+++ b/code/game/objects/structures/statues.dm
@@ -25,23 +25,21 @@
"You slice apart the [name].")
deconstruct(TRUE)
return
-
- else if(iswelder(W))
- var/obj/item/weldingtool/WT = W
- if(WT.remove_fuel(0, user))
- playsound(loc, W.usesound, 40, 1)
- user.visible_message("[user] is slicing apart the [name].", \
- "You are slicing apart the [name]...")
- if(do_after(user, 40 * W.toolspeed, target = src))
- if(!loc)
- return
- playsound(loc, W.usesound, 50, 1)
- user.visible_message("[user] slices apart the [name].", \
- "You slice apart the [name]!")
- deconstruct(TRUE)
- return
return ..()
+
+/obj/structure/statue/welder_act(mob/user, obj/item/I)
+ if(anchored)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ WELDER_ATTEMPT_SLICING_MESSAGE
+ if(I.use_tool(src, user, 40, volume = I.tool_volume))
+ WELDER_SLICING_SUCCESS_MESSAGE
+ deconstruct(TRUE)
+
+
/obj/structure/statue/attack_hand(mob/living/user)
user.changeNext_move(CLICK_CD_MELEE)
add_fingerprint(user)
@@ -139,6 +137,18 @@
return
return ..()
+/obj/structure/statue/plasma/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, volume = I.tool_volume))
+ return
+ user.visible_message("[user] sets [src] on fire!",\
+ "[src] disintegrates into a cloud of plasma!",\
+ "You hear a 'whoompf' and a roar.")
+ message_admins("[key_name_admin(user)] ignited a plasma statue at [COORD(loc)]")
+ log_game("[key_name(user)] ignited plasma a statue at [COORD(loc)]")
+ investigate_log("[key_name(user)] ignited a plasma statue at [COORD(loc)]", "atmos")
+ ignite(2500)
+
/obj/structure/statue/plasma/proc/PlasmaBurn()
atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 160)
deconstruct(FALSE)
diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
index 23802cf56a5..b823cc1b623 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
@@ -40,12 +40,14 @@
/obj/structure/bed/proc/handle_rotation()
return
-/obj/structure/bed/attackby(obj/item/W, mob/user, params)
- if(iswrench(W) && !(flags & NODECONSTRUCT))
- playsound(loc, W.usesound, 50, TRUE)
- deconstruct(TRUE)
- else
- return ..()
+/obj/structure/bed/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(flags & NODECONSTRUCT)
+ to_chat(user, "You can't figure out how to deconstruct [src]!")
+ return
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ deconstruct(TRUE)
/obj/structure/bed/deconstruct(disassembled = TRUE)
if(!(flags & NODECONSTRUCT))
diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
index 0e9b7b3a6ae..90b489300d3 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
@@ -54,12 +54,17 @@
SK.master = E
qdel(src)
return
- if(iswrench(W) && !(flags & NODECONSTRUCT))
- playsound(loc, W.usesound, 50, 1)
- deconstruct(TRUE)
- return
return ..()
+/obj/structure/chair/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(flags & NODECONSTRUCT)
+ to_chat(user, "Try as you might, you can't figure out how to deconstruct [src].")
+ return
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ deconstruct(TRUE)
+
/obj/structure/chair/deconstruct()
// If we have materials, and don't have the NOCONSTRUCT flag
if(buildstacktype && (!(flags & NODECONSTRUCT)))
diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm
index fe2ee995413..575f666848a 100644
--- a/code/game/objects/structures/table_frames.dm
+++ b/code/game/objects/structures/table_frames.dm
@@ -22,13 +22,7 @@
var/framestackamount = 2
/obj/structure/table_frame/attackby(obj/item/I, mob/user, params)
- if(iswrench(I))
- to_chat(user, "You start disassembling [src]...")
- playsound(loc, I.usesound, 50, 1)
- if(do_after(user, 30*I.toolspeed, target = src))
- playsound(loc, 'sound/items/deconstruct.ogg', 50, 1)
- deconstruct(TRUE)
- else if(istype(I, /obj/item/stack/sheet/plasteel))
+ if(istype(I, /obj/item/stack/sheet/plasteel))
var/obj/item/stack/sheet/plasteel/P = I
if(P.get_amount() < 1)
to_chat(user, "You need one plasteel sheet to do this!")
@@ -71,6 +65,17 @@
else
return ..()
+/obj/structure/table_frame/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ TOOL_ATTEMPT_DISMANTLE_MESSAGE
+ if(I.use_tool(src, user, 30, volume = I.tool_volume))
+ TOOL_DISMANTLE_SUCCESS_MESSAGE
+ for(var/i = 1, i <= framestackamount, i++)
+ new framestack(get_turf(src))
+ qdel(src)
+
/obj/structure/table_frame/proc/make_new_table(table_type) //makes sure the new table made retains what we had as a frame
var/obj/structure/table/T = new table_type(loc)
T.frame = type
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index c8c148ac1e1..264c5afd088 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -212,21 +212,6 @@
if(istype(I, /obj/item/grab))
tablepush(I, user)
return
- if(!(flags & NODECONSTRUCT))
- if(isscrewdriver(I) && deconstruction_ready)
- to_chat(user, "You start disassembling [src]...")
- playsound(loc, I.usesound, 50, 1)
- if(do_after(user, 20*I.toolspeed, target = src))
- deconstruct(TRUE)
- return
-
- if(iswrench(I) && deconstruction_ready)
- to_chat(user, "You start deconstructing [src]...")
- playsound(loc, I.usesound, 50, 1)
- if(do_after(user, 40*I.toolspeed, target = src))
- playsound(loc, 'sound/items/deconstruct.ogg', 50, 1)
- deconstruct(TRUE, 1)
- return
if(isrobot(user))
return
@@ -245,6 +230,33 @@
else
return ..()
+
+/obj/structure/table/screwdriver_act(mob/user, obj/item/I)
+ if(flags & NODECONSTRUCT)
+ return
+ if(!deconstruction_ready)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ TOOL_ATTEMPT_DISMANTLE_MESSAGE
+ if(I.use_tool(src, user, 20, volume = I.tool_volume) && deconstruction_ready)
+ deconstruct(TRUE, 1)
+ TOOL_DISMANTLE_SUCCESS_MESSAGE
+
+/obj/structure/table/wrench_act(mob/user, obj/item/I)
+ if(flags & NODECONSTRUCT)
+ return
+ if(!deconstruction_ready)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ TOOL_ATTEMPT_DISMANTLE_MESSAGE
+ if(I.use_tool(src, user, 40, volume = I.tool_volume) && deconstruction_ready)
+ deconstruct(TRUE, 1)
+ TOOL_DISMANTLE_SUCCESS_MESSAGE
+
/obj/structure/table/deconstruct(disassembled = TRUE, wrench_disassembly = 0)
if(!(flags & NODECONSTRUCT))
var/turf/T = get_turf(src)
@@ -524,27 +536,14 @@
else
return ..()
-/obj/structure/table/reinforced/attackby(obj/item/W, mob/user, params)
- if(iswelder(W))
- var/obj/item/weldingtool/WT = W
- if(WT.remove_fuel(0, user))
- playsound(loc, W.usesound, 50, 1)
- if(deconstruction_ready)
- to_chat(user, "You start strengthening the reinforced table...")
- if (do_after(user, 50*W.toolspeed, target = src))
- if(!src || !WT.isOn())
- return
- to_chat(user, "You strengthen the table.")
- deconstruction_ready = FALSE
- else
- to_chat(user, "You start weakening the reinforced table...")
- if (do_after(user, 50*W.toolspeed, target = src))
- if(!src || !WT.isOn())
- return
- to_chat(user, "You weaken the table.")
- deconstruction_ready = TRUE
- else
- return ..()
+/obj/structure/table/reinforced/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ to_chat(user, "You start [deconstruction_ready ? "strengthening" : "weakening"] the reinforced table...")
+ if(I.use_tool(src, user, 50, volume = I.tool_volume))
+ to_chat(user, "You [deconstruction_ready ? "strengthen" : "weaken"] the table.")
+ deconstruction_ready = !deconstruction_ready
/obj/structure/table/reinforced/brass
name = "brass table"
@@ -682,10 +681,6 @@
step(O, get_dir(O, src))
/obj/structure/rack/attackby(obj/item/W, mob/user, params)
- if(iswrench(W) && !(flags & NODECONSTRUCT) && user.a_intent != INTENT_HELP)
- playsound(loc, W.usesound, 50, 1)
- deconstruct(TRUE)
- return
if(isrobot(user))
return
if(user.a_intent == INTENT_HARM)
@@ -695,6 +690,15 @@
W.Move(loc)
return
+/obj/structure/rack/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(flags & NODECONSTRUCT)
+ to_chat(user, "Try as you might, you can't figure out how to deconstruct this.")
+ return
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ deconstruct(TRUE)
+
/obj/structure/rack/attack_hand(mob/living/user)
if(user.IsWeakened() || user.resting || user.lying)
return
@@ -750,12 +754,12 @@
materials = list(MAT_METAL=2000)
var/building = FALSE
-/obj/item/rack_parts/attackby(obj/item/W, mob/user, params)
- if(iswrench(W))
- new /obj/item/stack/sheet/metal(user.loc)
- qdel(src)
- else
- return ..()
+/obj/item/rack_parts/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ new /obj/item/stack/sheet/metal(user.loc)
+ qdel(src)
/obj/item/rack_parts/attack_self(mob/user)
if(building)
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index d518d86c777..32c9daf3c76 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -63,54 +63,6 @@
layer = FLY_LAYER
/obj/structure/toilet/attackby(obj/item/I, mob/living/user, params)
- if(iswrench(I))
- var/choices = list()
- if(cistern)
- choices += "Stash"
- if(anchored)
- choices += "Disconnect"
- else
- choices += "Connect"
- choices += "Rotate"
-
- var/response = input(user, "What do you want to do?", "[src]") as null|anything in choices
- if(!Adjacent(user) || !response) //moved away or cancelled
- return
- switch(response)
- if("Stash")
- stash_goods(I, user)
- if("Disconnect")
- user.visible_message("[user] starts disconnecting [src].", "You begin disconnecting [src]...")
- if(do_after(user, 40 * I.toolspeed, target = src))
- if(!loc || !anchored)
- return
- user.visible_message("[user] disconnects [src]!", "You disconnect [src]!")
- anchored = 0
- update_icon()
- if("Connect")
- user.visible_message("[user] starts connecting [src].", "You begin connecting [src]...")
- if(do_after(user, 40 * I.toolspeed, target = src))
- if(!loc || anchored)
- return
- user.visible_message("[user] connects [src]!", "You connect [src]!")
- anchored = 1
- update_icon()
- if("Rotate")
- var/list/dir_choices = list("North" = NORTH, "East" = EAST, "South" = SOUTH, "West" = WEST)
- var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in dir_choices
- dir = dir_choices[selected]
- update_icon() //is this necessary? probably not
- return
-
- if(istype(I, /obj/item/crowbar))
- to_chat(user, "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]...")
- playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1)
- if(do_after(user, 30 * I.toolspeed, target = src))
- user.visible_message("[user] [cistern ? "replaces the lid on the cistern" : "lifts the lid off the cistern"]!", "You [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]!", "You hear grinding porcelain.")
- cistern = !cistern
- update_icon()
- return
-
if(istype(I, /obj/item/reagent_containers))
if(!open)
return
@@ -158,6 +110,58 @@
stash_goods(I, user)
return
+
+/obj/structure/toilet/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ to_chat(user, "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]...")
+ playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1)
+ if(I.use_tool(src, user, 30, volume = I.tool_volume))
+ user.visible_message("[user] [cistern ? "replaces the lid on the cistern" : "lifts the lid off the cistern"]!", "You [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]!", "You hear grinding porcelain.")
+ cistern = !cistern
+ update_icon()
+ return
+
+/obj/structure/toilet/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ var/choices = list()
+ if(cistern)
+ choices += "Stash"
+ if(anchored)
+ choices += "Disconnect"
+ else
+ choices += "Connect"
+ choices += "Rotate"
+
+ var/response = input(user, "What do you want to do?", "[src]") as null|anything in choices
+ if(!Adjacent(user) || !response) //moved away or cancelled
+ return
+ switch(response)
+ if("Stash")
+ stash_goods(I, user)
+ if("Disconnect")
+ user.visible_message("[user] starts disconnecting [src].", "You begin disconnecting [src]...")
+ if(I.use_tool(src, user, 40, volume = I.tool_volume))
+ if(!loc || !anchored)
+ return
+ user.visible_message("[user] disconnects [src]!", "You disconnect [src]!")
+ anchored = 0
+ if("Connect")
+ user.visible_message("[user] starts connecting [src].", "You begin connecting [src]...")
+ if(I.use_tool(src, user, 40, volume = I.tool_volume))
+ if(!loc || anchored)
+ return
+ user.visible_message("[user] connects [src]!", "You connect [src]!")
+ anchored = 1
+ if("Rotate")
+ var/list/dir_choices = list("North" = NORTH, "East" = EAST, "South" = SOUTH, "West" = WEST)
+ var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in dir_choices
+ dir = dir_choices[selected]
+ update_icon() //is this necessary? probably not
+
/obj/structure/toilet/proc/stash_goods(obj/item/I, mob/user)
if(!I)
return
@@ -196,27 +200,6 @@
/obj/structure/urinal/attackby(obj/item/I, mob/user, params)
- if(iswrench(I))
- if(anchored)
- user.visible_message("[user] begins disconnecting [src]...", "You begin to disconnect [src]...")
- if(do_after(user, 40 * I.toolspeed, target = src))
- if(!loc || !anchored)
- return
- user.visible_message("[user] disconnects [src]!", "You disconnect [src]!")
- anchored = 0
- pixel_x = 0
- pixel_y = 0
- else
- user.visible_message("[user] begins connecting [src]...", "You begin to connect [src]...")
- if(do_after(user, 40 * I.toolspeed, target = src))
- if(!loc || anchored)
- return
- user.visible_message("[user] connects [src]!", "You connect [src]!")
- anchored = 1
- pixel_x = 0
- pixel_y = 32
- return
-
if(istype(I, /obj/item/grab))
var/obj/item/grab/G = I
if(!G.confirm())
@@ -234,7 +217,28 @@
else
to_chat(user, "You need a tighter grip!")
-
+/obj/structure/urinal/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ if(anchored)
+ user.visible_message("[user] begins disconnecting [src]...", "You begin to disconnect [src]...")
+ if(I.use_tool(src, user, 40, volume = I.tool_volume))
+ if(!loc || !anchored)
+ return
+ user.visible_message("[user] disconnects [src]!", "You disconnect [src]!")
+ anchored = 0
+ pixel_x = 0
+ pixel_y = 0
+ else
+ user.visible_message("[user] begins connecting [src]...", "You begin to connect [src]...")
+ if(I.use_tool(src, user, 40, volume = I.tool_volume))
+ if(!loc || anchored)
+ return
+ user.visible_message("[user] connects [src]!", "You connect [src]!")
+ anchored = 1
+ pixel_x = 0
+ pixel_y = 32
/obj/machinery/shower
name = "shower"
@@ -298,41 +302,41 @@
/obj/machinery/shower/attackby(obj/item/I as obj, mob/user as mob, params)
if(I.type == /obj/item/analyzer)
to_chat(user, "The water temperature seems to be [watertemp].")
- if(iswrench(I))
- to_chat(user, "You begin to adjust the temperature valve with the [I].")
- if(do_after(user, 50 * I.toolspeed, target = src))
- switch(watertemp)
- if("normal")
- watertemp = "freezing"
- if("freezing")
- watertemp = "boiling"
- if("boiling")
- watertemp = "normal"
- user.visible_message("[user] adjusts the shower with the [I].", "You adjust the shower with the [I].")
- update_icon() //letsa update whenever we change the temperature, since the mist might need to change
- if(iswelder(I))
- if(on)
- to_chat(user, "Turn [src] off before you attempt to cut it loose.")
- return
- var/obj/item/weldingtool/WT = I
- if(WT.isOn())
- user.visible_message("[user] begins to cut [src] loose.", "You begin to cut [src] loose.")
- if(do_after(user, 40 * WT.toolspeed, target = src))
- if(!src || !WT.remove_fuel(0, user))
- return
- if(on) //in case someone turned it back on while you were working, make sure we shut that all down
- on = 0
- if(mymist)
- qdel(mymist)
- ismist = 0
- user.visible_message("[user] cuts [src] loose!", "You cut [src] loose!")
- var/obj/item/mounted/shower/S = new /obj/item/mounted/shower(get_turf(user))
- transfer_prints_to(S, TRUE)
- qdel(src)
- else
- to_chat(user, "[WT] must be on for this task.")
if(on)
I.water_act(100, convertHeat(), src)
+ return ..()
+
+/obj/machinery/shower/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ to_chat(user, "You begin to adjust the temperature valve with the [I].")
+ if(I.use_tool(src, user, 50, volume = I.tool_volume))
+ switch(watertemp)
+ if("normal")
+ watertemp = "freezing"
+ if("freezing")
+ watertemp = "boiling"
+ if("boiling")
+ watertemp = "normal"
+ user.visible_message("[user] adjusts the shower with the [I].", "You adjust [src] to [watertemp].")
+ update_icon() //letsa update whenever we change the temperature, since the mist might need to change
+
+/obj/machinery/shower/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(on)
+ to_chat(user, "Turn [src] off before you attempt to cut it loose.")
+ return
+ if(!I.tool_use_check(user, 0))
+ return
+ visible_message("[user] begins slicing [src] free...", "You begin slicing [src] free...", "You hear welding.")
+ if(I.use_tool(src, user, 40, volume = I.tool_volume))
+ if(mymist)
+ qdel(mymist)
+ user.visible_message("[user] cuts [src] loose!", "You cut [src] loose!")
+ var/obj/item/mounted/shower/S = new /obj/item/mounted/shower(get_turf(user))
+ transfer_prints_to(S, TRUE)
+ qdel(src)
/obj/machinery/shower/update_icon() //this makes the shower mist up or clear mist (depending on water temperature)
overlays.Cut() //once it's been on for a while, in addition to handling the water overlay.
@@ -577,53 +581,6 @@
if(!(istype(O)))
return
- if(iswrench(O))
- var/obj/item/wrench/W = O
-
- var/choices = list()
- if(anchored)
- choices += "Wash"
- if(can_move)
- choices += "Disconnect"
- else
- choices += "Connect"
- if(can_rotate)
- choices += "Rotate"
-
- var/response = input(user, "What do you want to do?", "[src]") as null|anything in choices
- if(!Adjacent(user) || !response) //moved away or cancelled
- return
- switch(response)
- if("Wash")
- busy = 1
- var/wateract = 0
- wateract = (W.wash(user, src))
- busy = 0
- if(wateract)
- W.water_act(20, COLD_WATER_TEMPERATURE, src)
- if("Disconnect")
- user.visible_message("[user] starts disconnecting [src].", "You begin disconnecting [src]...")
- if(do_after(user, 40 * O.toolspeed, target = src))
- if(!loc || !anchored)
- return
- user.visible_message("[user] disconnects [src]!", "You disconnect [src]!")
- anchored = 0
- update_icon()
- if("Connect")
- user.visible_message("[user] starts connecting [src].", "You begin connecting [src]...")
- if(do_after(user, 40 * O.toolspeed, target = src))
- if(!loc || anchored)
- return
- user.visible_message("[user] connects [src]!", "You connect [src]!")
- anchored = 1
- update_icon()
- if("Rotate")
- var/list/dir_choices = list("North" = NORTH, "East" = EAST, "South" = SOUTH, "West" = WEST)
- var/selected = input(user, "Select a direction for the connector.", "Connector Direction") in dir_choices
- dir = dir_choices[selected]
- update_icon() //is this necessary? probably not
- return
-
if(!anchored)
to_chat(user, "[src] isn't connected, wrench it into position first!")
return
@@ -635,6 +592,51 @@
if(wateract)
O.water_act(20, COLD_WATER_TEMPERATURE, src)
+/obj/structure/sink/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ var/choices = list()
+ if(anchored)
+ choices += "Wash"
+ if(can_move)
+ choices += "Disconnect"
+ else
+ choices += "Connect"
+ if(can_rotate)
+ choices += "Rotate"
+
+ var/response = input(user, "What do you want to do?", "[src]") as null|anything in choices
+ if(!Adjacent(user) || !response) //moved away or cancelled
+ return
+ switch(response)
+ if("Wash")
+ busy = 1
+ var/wateract = 0
+ wateract = (I.wash(user, src))
+ busy = 0
+ if(wateract)
+ I.water_act(20, COLD_WATER_TEMPERATURE, src)
+ if("Disconnect")
+ user.visible_message("[user] starts disconnecting [src].", "You begin disconnecting [src]...")
+ if(I.use_tool(src, user, 40, volume = I.tool_volume))
+ if(!loc || !anchored)
+ return
+ user.visible_message("[user] disconnects [src]!", "You disconnect [src]!")
+ anchored = FALSE
+ if("Connect")
+ user.visible_message("[user] starts connecting [src].", "You begin connecting [src]...")
+ if(I.use_tool(src, user, 40, volume = I.tool_volume))
+ if(!loc || anchored)
+ return
+ user.visible_message("[user] connects [src]!", "You connect [src]!")
+ anchored = TRUE
+ if("Rotate")
+ var/list/dir_choices = list("North" = NORTH, "East" = EAST, "South" = SOUTH, "West" = WEST)
+ var/selected = input(user, "Select a direction for the connector.", "Connector Direction") in dir_choices
+ dir = dir_choices[selected]
+ update_icon() //is this necessary? probably not
+
/obj/structure/sink/update_icon()
..()
layer = OBJ_LAYER
diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm
index 0eee91ee068..3a1546bdd2b 100644
--- a/code/game/objects/structures/windoor_assembly.dm
+++ b/code/game/objects/structures/windoor_assembly.dm
@@ -1,4 +1,4 @@
-/* Windoor (window door) assembly -Nodrak
+/* Windoor (window door) assembly -Nodrak //I hope you step on a plug
* Step 1: Create a windoor out of rglass
* Step 2: Add plasteel to the assembly to make a secure windoor (Optional)
* Step 3: Rotate or Flip the assembly to face and open the way you want
@@ -84,70 +84,13 @@ obj/structure/windoor_assembly/Destroy()
else
return 1
-
/obj/structure/windoor_assembly/attackby(obj/item/W, mob/user, params)
//I really should have spread this out across more states but thin little windoors are hard to sprite.
add_fingerprint(user)
switch(state)
if("01")
- if(iswelder(W) && !anchored)
- var/obj/item/weldingtool/WT = W
- if(WT.remove_fuel(0,user))
- user.visible_message("[user] disassembles the windoor assembly.", "You start to disassemble the windoor assembly...")
- playsound(loc, 'sound/items/welder2.ogg', 50, 1)
-
- if(do_after(user, 40 * WT.toolspeed, target = src))
- if(!src || !WT.isOn())
- return
- to_chat(user, "You disassemble the windoor assembly.")
- var/obj/item/stack/sheet/rglass/RG = new (get_turf(src), 5)
- RG.add_fingerprint(user)
- if(secure)
- var/obj/item/stack/rods/R = new (get_turf(src), 4)
- R.add_fingerprint(user)
- qdel(src)
- return
-
- //Wrenching an unsecure assembly anchors it in place. Step 4 complete
- if(iswrench(W) && !anchored)
- for(var/obj/machinery/door/window/WD in loc)
- if(WD.dir == dir)
- to_chat(user, "There is already a windoor in that location!")
- return
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] secures the windoor assembly to the floor.", "You start to secure the windoor assembly to the floor...")
-
- if(do_after(user, 40 * W.toolspeed, target = src))
- if(!src || anchored)
- return
- for(var/obj/machinery/door/window/WD in loc)
- if(WD.dir == dir)
- to_chat(user, "There is already a windoor in that location!")
- return
- to_chat(user, "You secure the windoor assembly.")
- anchored = TRUE
- if(secure)
- name = "secure anchored windoor assembly"
- else
- name = "anchored windoor assembly"
-
- //Unwrenching an unsecure assembly un-anchors it. Step 4 undone
- else if(iswrench(W) && anchored)
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] unsecures the windoor assembly from the floor.", "You start to unsecure the windoor assembly from the floor...")
-
- if(do_after(user, 40 * W.toolspeed, target = src))
- if(!src || !anchored)
- return
- to_chat(user, "You unsecure the windoor assembly.")
- anchored = FALSE
- if(secure)
- name = "secure windoor assembly"
- else
- name = "windoor assembly"
-
//Adding plasteel makes the assembly a secure windoor assembly. Step 2 (optional) complete.
- else if(istype(W, /obj/item/stack/sheet/plasteel) && !secure)
+ if(istype(W, /obj/item/stack/sheet/plasteel) && !secure)
var/obj/item/stack/sheet/plasteel/P = W
if(P.get_amount() < 2)
to_chat(user, "You need more plasteel to do this!")
@@ -187,26 +130,8 @@ obj/structure/windoor_assembly/Destroy()
return ..()
if("02")
-
- //Removing wire from the assembly. Step 5 undone.
- if(iswirecutter(W))
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly...")
-
- if(do_after(user, 40 * W.toolspeed, target = src))
- if(!src || state != "02")
- return
-
- to_chat(user, "You cut the windoor wires.")
- new/obj/item/stack/cable_coil(get_turf(user), 1)
- state = "01"
- if(secure)
- name = "secure anchored windoor assembly"
- else
- name = "anchored windoor assembly"
-
//Adding airlock electronics for access. Step 6 complete.
- else if(istype(W, /obj/item/airlock_electronics))
+ if(istype(W, /obj/item/airlock_electronics))
playsound(loc, W.usesound, 100, 1)
user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly...")
user.drop_item()
@@ -222,24 +147,6 @@ obj/structure/windoor_assembly/Destroy()
else
W.forceMove(loc)
- //Screwdriver to remove airlock electronics. Step 6 undone.
- else if(isscrewdriver(W))
- if(!electronics)
- return
-
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to uninstall electronics from the airlock assembly...")
-
- if(do_after(user, 40 * W.toolspeed, target = src))
- if(!src || !electronics)
- return
- to_chat(user, "You remove the airlock electronics.")
- name = "wired windoor assembly"
- var/obj/item/airlock_electronics/ae
- ae = electronics
- electronics = null
- ae.forceMove(loc)
-
else if(istype(W, /obj/item/pen))
var/t = stripped_input(user, "Enter the name for the door.", name, created_name,MAX_NAME_LEN)
if(!t)
@@ -248,65 +155,153 @@ obj/structure/windoor_assembly/Destroy()
return
created_name = t
return
-
-
-
- //Crowbar to complete the assembly, Step 7 complete.
- else if(iscrowbar(W))
- if(!electronics)
- to_chat(usr, "The assembly is missing electronics!")
- return
- usr << browse(null, "window=windoor_access")
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] pries the windoor into the frame.", "You start prying the windoor into the frame...")
-
- if(do_after(user, 40 * W.toolspeed, target = src))
-
- if(loc && electronics)
- for(var/obj/machinery/door/window/WD in loc)
- if(WD.dir == dir)
- return
-
- density = TRUE //Shouldn't matter but just incase
- to_chat(user, "You finish the windoor.")
- var/obj/machinery/door/window/windoor
- if(secure)
- windoor = new /obj/machinery/door/window/brigdoor(src.loc)
- if(facing == "l")
- windoor.icon_state = "leftsecureopen"
- windoor.base_state = "leftsecure"
- else
- windoor.icon_state = "rightsecureopen"
- windoor.base_state = "rightsecure"
- else
- windoor = new /obj/machinery/door/window(loc)
- if(facing == "l")
- windoor.icon_state = "leftopen"
- windoor.base_state = "left"
- else
- windoor.icon_state = "rightopen"
- windoor.base_state = "right"
- windoor.setDir(dir)
- windoor.density = FALSE
-
- if(electronics.one_access)
- windoor.req_one_access = electronics.conf_access
- else
- windoor.req_access = electronics.conf_access
- windoor.electronics = src.electronics
- electronics.forceMove(windoor)
- electronics = null
- if(created_name)
- windoor.name = created_name
- qdel(src)
- windoor.close()
-
else
return ..()
//Update to reflect changes(if applicable)
update_icon()
+/obj/structure/windoor_assembly/crowbar_act(mob/user, obj/item/I) //Crowbar to complete the assembly, Step 7 complete.
+ if(state != "02")
+ return
+ . = TRUE
+ if(!electronics)
+ to_chat(user, "[src] is missing electronics!")
+ return
+ if(!I.tool_use_check(user, 0))
+ return
+ user << browse(null, "window=windoor_access")
+ user.visible_message("[user] pries the windoor into the frame.", "You start prying the windoor into the frame...")
+
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume))
+ return
+ if(loc && electronics)
+ for(var/obj/machinery/door/window/WD in loc)
+ if(WD.dir == dir)
+ return
+
+ density = TRUE //Shouldn't matter but just incase
+ to_chat(user, "You finish the windoor.")
+ var/obj/machinery/door/window/windoor
+ if(secure)
+ windoor = new /obj/machinery/door/window/brigdoor(src.loc)
+ if(facing == "l")
+ windoor.icon_state = "leftsecureopen"
+ windoor.base_state = "leftsecure"
+ else
+ windoor.icon_state = "rightsecureopen"
+ windoor.base_state = "rightsecure"
+ else
+ windoor = new /obj/machinery/door/window(loc)
+ if(facing == "l")
+ windoor.icon_state = "leftopen"
+ windoor.base_state = "left"
+ else
+ windoor.icon_state = "rightopen"
+ windoor.base_state = "right"
+ windoor.setDir(dir)
+ windoor.density = FALSE
+
+ if(electronics.one_access)
+ windoor.req_one_access = electronics.conf_access
+ else
+ windoor.req_access = electronics.conf_access
+ windoor.electronics = src.electronics
+ electronics.forceMove(windoor)
+ electronics = null
+ if(created_name)
+ windoor.name = created_name
+ qdel(src)
+ windoor.close()
+
+/obj/structure/windoor_assembly/screwdriver_act(mob/user, obj/item/I)
+ if(state != "02" || electronics)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to uninstall electronics from the airlock assembly...")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume) || electronics)
+ return
+ to_chat(user, "You remove the airlock electronics.")
+ name = "wired windoor assembly"
+ var/obj/item/airlock_electronics/ae
+ ae = electronics
+ electronics = null
+ ae.forceMove(loc)
+
+/obj/structure/windoor_assembly/wirecutter_act(mob/user, obj/item/I)
+ if(state != "02")
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly...")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume) || state != "02")
+ return
+ to_chat(user, "You cut the windoor wires.")
+ new/obj/item/stack/cable_coil(get_turf(user), 1)
+ state = "01"
+ if(secure)
+ name = "secure anchored windoor assembly"
+ else
+ name = "anchored windoor assembly"
+ update_icon()
+
+/obj/structure/windoor_assembly/wrench_act(mob/user, obj/item/I)
+ if(state != "01")
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ if(!anchored) //Wrenching an unsecure assembly anchors it in place. Step 4 complete
+ for(var/obj/machinery/door/window/WD in loc)
+ if(WD.dir == dir)
+ to_chat(user, "There is already a windoor in that location!")
+ return
+ user.visible_message("[user] secures the windoor assembly to the floor.", "You start to secure the windoor assembly to the floor...")
+
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume) || anchored || state != "01")
+ return
+ for(var/obj/machinery/door/window/WD in loc)
+ if(WD.dir == dir)
+ to_chat(user, "There is already a windoor in that location!")
+ return
+ to_chat(user, "You secure the windoor assembly.")
+ anchored = TRUE
+ if(secure)
+ name = "secure anchored windoor assembly"
+ else
+ name = "anchored windoor assembly"
+
+ else //Unwrenching an unsecure assembly un-anchors it. Step 4 undone
+ user.visible_message("[user] unsecures the windoor assembly from the floor.", "You start to unsecure the windoor assembly from the floor...")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume) || !anchored || state != "01")
+ return
+ to_chat(user, "You unsecure the windoor assembly.")
+ anchored = FALSE
+ if(secure)
+ name = "secure windoor assembly"
+ else
+ name = "windoor assembly"
+ update_icon()
+
+/obj/structure/windoor_assembly/welder_act(mob/user, obj/item/I)
+ if(state != "01")
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ WELDER_ATTEMPT_SLICING_MESSAGE
+ if(I.use_tool(src, user, 40, volume = I.tool_volume) && state == "01")
+ WELDER_FLOOR_SLICE_SUCCESS_MESSAGE
+ var/obj/item/stack/sheet/rglass/RG = new (get_turf(src), 5)
+ RG.add_fingerprint(user)
+ if(secure)
+ var/obj/item/stack/rods/R = new (get_turf(src), 4)
+ R.add_fingerprint(user)
+ qdel(src)
+
//Rotates the windoor assembly clockwise
/obj/structure/windoor_assembly/verb/revrotate()
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 553f2c476e7..90d20ecbd75 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -212,22 +212,6 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
return 1 //skip the afterattack
add_fingerprint(user)
-
- if(iswelder(I) && user.a_intent == INTENT_HELP)
- var/obj/item/weldingtool/WT = I
- if(obj_integrity < max_integrity)
- if(WT.remove_fuel(0,user))
- to_chat(user, "You begin repairing [src]...")
- playsound(src, WT.usesound, 40, 1)
- if(do_after(user, 40*I.toolspeed, target = src))
- obj_integrity = max_integrity
- playsound(src, 'sound/items/welder2.ogg', 50, 1)
- update_nearby_icons()
- to_chat(user, "You repair [src].")
- else
- to_chat(user, "[src] is already in good condition!")
- return
-
if(istype(I, /obj/item/grab) && get_dist(src, user) < 2)
var/obj/item/grab/G = I
if(isliving(G.affecting))
@@ -256,51 +240,87 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
M.apply_damage(30)
take_damage(75)
return
-
- if(!(flags & NODECONSTRUCT))
- if(isscrewdriver(I))
- playsound(src, I.usesound, 75, 1)
- if(reinf)
- if(state == WINDOW_SCREWED_TO_FRAME || state == WINDOW_IN_FRAME)
- to_chat(user, "You begin to [state == WINDOW_SCREWED_TO_FRAME ? "unscrew the window from":"screw the window to"] the frame...")
- if(do_after(user, decon_speed*I.toolspeed, target = src, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored)))
- state = (state == WINDOW_IN_FRAME ? WINDOW_SCREWED_TO_FRAME : WINDOW_IN_FRAME)
- to_chat(user, "You [state == WINDOW_IN_FRAME ? "unfasten the window from":"fasten the window to"] the frame.")
- else if(state == WINDOW_OUT_OF_FRAME)
- to_chat(user, "You begin to [anchored ? "unscrew the frame from":"screw the frame to"] the floor...")
- if(do_after(user, decon_speed*I.toolspeed, target = src, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored)))
- anchored = !anchored
- update_nearby_icons()
- to_chat(user, "You [anchored ? "fasten the frame to":"unfasten the frame from"] the floor.")
- else //if we're not reinforced, we don't need to check or update state
- to_chat(user, "You begin to [anchored ? "unscrew the window from":"screw the window to"] the floor...")
- if(do_after(user, decon_speed*I.toolspeed, target = src, extra_checks = CALLBACK(src, .proc/check_anchored, anchored)))
- anchored = !anchored
- air_update_turf(TRUE)
- update_nearby_icons()
- to_chat(user, "You [anchored ? "fasten the window to":"unfasten the window from"] the floor.")
- return
-
- else if(iscrowbar(I) && reinf && (state == WINDOW_OUT_OF_FRAME || state == WINDOW_IN_FRAME))
- to_chat(user, "You begin to lever the window [state == WINDOW_OUT_OF_FRAME ? "into":"out of"] the frame...")
- playsound(src, I.usesound, 75, 1)
- if(do_after(user, decon_speed*I.toolspeed, target = src, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored)))
- state = (state == WINDOW_OUT_OF_FRAME ? WINDOW_IN_FRAME : WINDOW_OUT_OF_FRAME)
- to_chat(user, "You pry the window [state == WINDOW_IN_FRAME ? "into":"out of"] the frame.")
- return
-
- else if(iswrench(I) && !anchored)
- playsound(src, I.usesound, 75, 1)
- to_chat(user, " You begin to disassemble [src]...")
- if(do_after(user, decon_speed*I.toolspeed, target = src, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored)))
- var/obj/item/stack/sheet/G = new glass_type(user.loc, glass_amount)
- G.add_fingerprint(user)
- playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
- to_chat(user, "You successfully disassemble [src].")
- qdel(src)
- return
return ..()
+
+/obj/structure/window/crowbar_act(mob/user, obj/item/I)
+ if(!reinf)
+ return
+ if(state != WINDOW_OUT_OF_FRAME && state != WINDOW_IN_FRAME)
+ return
+ if(flags & NODECONSTRUCT)
+ return
+ . = TRUE
+ if(!can_be_reached(user))
+ return
+ to_chat(user, "You begin to lever the window [state == WINDOW_OUT_OF_FRAME ? "into":"out of"] the frame...")
+ if(!I.use_tool(src, user, decon_speed, volume = I.tool_volume, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored)))
+ return
+ state = (state == WINDOW_OUT_OF_FRAME ? WINDOW_IN_FRAME : WINDOW_OUT_OF_FRAME)
+ to_chat(user, "You pry the window [state == WINDOW_IN_FRAME ? "into":"out of"] the frame.")
+
+/obj/structure/window/screwdriver_act(mob/user, obj/item/I)
+ if(flags & NODECONSTRUCT)
+ return
+ . = TRUE
+ if(!can_be_reached(user))
+ return
+ if(reinf)
+ if(state == WINDOW_SCREWED_TO_FRAME || state == WINDOW_IN_FRAME)
+ to_chat(user, "You begin to [state == WINDOW_SCREWED_TO_FRAME ? "unscrew the window from":"screw the window to"] the frame...")
+ if(!I.use_tool(src, user, decon_speed, volume = I.tool_volume, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored)))
+ return
+ state = (state == WINDOW_IN_FRAME ? WINDOW_SCREWED_TO_FRAME : WINDOW_IN_FRAME)
+ to_chat(user, "You [state == WINDOW_IN_FRAME ? "unfasten the window from":"fasten the window to"] the frame.")
+ else if(state == WINDOW_OUT_OF_FRAME)
+ to_chat(user, "You begin to [anchored ? "unscrew the frame from":"screw the frame to"] the floor...")
+ if(!I.use_tool(src, user, decon_speed, volume = I.tool_volume, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored)))
+ return
+ anchored = !anchored
+ update_nearby_icons()
+ to_chat(user, "You [anchored ? "fasten the frame to":"unfasten the frame from"] the floor.")
+ else //if we're not reinforced, we don't need to check or update state
+ to_chat(user, "You begin to [anchored ? "unscrew the window from":"screw the window to"] the floor...")
+ if(!I.use_tool(src, user, decon_speed, volume = I.tool_volume, extra_checks = CALLBACK(src, .proc/check_anchored, anchored)))
+ return
+ anchored = !anchored
+ air_update_turf(TRUE)
+ update_nearby_icons()
+ to_chat(user, "You [anchored ? "fasten the window to":"unfasten the window from"] the floor.")
+
+/obj/structure/window/wrench_act(mob/user, obj/item/I)
+ if(flags & NODECONSTRUCT)
+ return
+ if(anchored)
+ return
+ . = TRUE
+ if(!can_be_reached(user))
+ return
+ TOOL_ATTEMPT_DISMANTLE_MESSAGE
+ if(!I.use_tool(src, user, decon_speed, volume = I.tool_volume, extra_checks = CALLBACK(src, .proc/check_state_and_anchored, state, anchored)))
+ return
+ var/obj/item/stack/sheet/G = new glass_type(user.loc, glass_amount)
+ G.add_fingerprint(user)
+ playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
+ to_chat(user, "You successfully disassemble [src].")
+ qdel(src)
+
+/obj/structure/window/welder_act(mob/user, obj/item/I)
+ if(user.a_intent != INTENT_HELP)
+ return
+ . = TRUE
+ if(!can_be_reached(user))
+ return
+ if(obj_integrity >= max_integrity)
+ to_chat(user, "[src] is already in good condition!")
+ return
+ if(!I.tool_use_check(user, 0))
+ return
+ WELDER_ATTEMPT_REPAIR_MESSAGE
+ if(I.use_tool(src, user, 40, volume = I.tool_volume))
+ obj_integrity = max_integrity
+ WELDER_REPAIR_SUCCESS_MESSAGE
+
/obj/structure/window/proc/check_state(checked_state)
if(state == checked_state)
return TRUE
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index 2124d9c49ea..cfa5f43858e 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -30,6 +30,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
var/obj/item/stack/tile/builtin_tile = null //needed for performance reasons when the singularity rips off floor tiles
var/list/broken_states = list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
var/list/burnt_states = list("floorscorched1", "floorscorched2")
+ var/list/prying_tool_list = list(TOOL_CROWBAR) //What tool/s can we use to pry up the tile?
/turf/simulated/floor/New()
..()
@@ -144,10 +145,6 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
if(..())
return TRUE
- if(intact && iscrowbar(C))
- pry_tile(C, user)
- return TRUE
-
if(intact && istype(C, /obj/item/stack/tile))
try_replace_tile(C, user, params)
@@ -178,21 +175,28 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
return TRUE
return FALSE
+/turf/simulated/floor/crowbar_act(mob/user, obj/item/I)
+ if(!intact)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ pry_tile(I, user, TRUE)
+
/turf/simulated/floor/proc/try_replace_tile(obj/item/stack/tile/T, mob/user, params)
if(T.turf_type == type)
return
- var/obj/item/crowbar/CB
- if(iscrowbar(user.get_inactive_hand()))
- CB = user.get_inactive_hand()
- if(!CB)
+ var/obj/item/thing = user.get_inactive_hand()
+ if(!prying_tool_list.Find(thing.tool_behaviour))
return
- var/turf/simulated/floor/plating/P = pry_tile(CB, user, TRUE)
+ var/turf/simulated/floor/plating/P = pry_tile(thing, user, TRUE)
if(!istype(P))
return
P.attackby(T, user, params)
/turf/simulated/floor/proc/pry_tile(obj/item/C, mob/user, silent = FALSE)
- playsound(src, C.usesound, 80, 1)
+ if(!silent)
+ playsound(src, C.usesound, 80, 1)
return remove_tile(user, silent)
/turf/simulated/floor/proc/remove_tile(mob/user, silent = FALSE, make_tile = TRUE)
diff --git a/code/game/turfs/simulated/floor/asteroid.dm b/code/game/turfs/simulated/floor/asteroid.dm
index 049f5ff8509..eccc5805657 100644
--- a/code/game/turfs/simulated/floor/asteroid.dm
+++ b/code/game/turfs/simulated/floor/asteroid.dm
@@ -100,6 +100,9 @@
ChangeTurf(Z.turf_type, keep_icon = FALSE)
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
+/turf/simulated/floor/plating/asteroid/welder_act(mob/user, obj/item/I)
+ return
+
/turf/simulated/floor/plating/asteroid/basalt
name = "volcanic floor"
baseturf = /turf/simulated/floor/plating/asteroid/basalt
diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm
index 2ce85481751..07f9806c8f4 100644
--- a/code/game/turfs/simulated/floor/fancy_floor.dm
+++ b/code/game/turfs/simulated/floor/fancy_floor.dm
@@ -1,6 +1,7 @@
/turf/simulated/floor/wood
icon_state = "wood"
floor_tile = /obj/item/stack/tile/wood
+ prying_tool_list = list(TOOL_SCREWDRIVER)
broken_states = list("wood-broken", "wood-broken2", "wood-broken3", "wood-broken4", "wood-broken5", "wood-broken6", "wood-broken7")
footstep_sounds = list(
@@ -8,49 +9,34 @@
"xeno" = list('sound/effects/footstep/wood_all.ogg') //@RonaldVanWonderen of Freesound.org
)
-/turf/simulated/floor/wood/attackby(obj/item/C, mob/user, params)
- if(..())
- return
- if(isscrewdriver(C))
- pry_tile(C, user)
+/turf/simulated/floor/wood/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
+ remove_tile(user, FALSE, TRUE)
-/turf/simulated/floor/wood/try_replace_tile(obj/item/stack/tile/T, mob/user, params)
- if(T.turf_type == type)
+/turf/simulated/floor/wood/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
- var/obj/item/tool
- if(isscrewdriver(user.get_inactive_hand()))
- tool = user.get_inactive_hand()
- if(!tool && iscrowbar(user.get_inactive_hand()))
- tool = user.get_inactive_hand()
- if(!tool)
- return
- var/turf/simulated/floor/plating/P = pry_tile(tool, user, TRUE)
- if(!istype(P))
- return
- P.attackby(T, user, params)
-
-/turf/simulated/floor/wood/pry_tile(obj/item/C, mob/user, silent = FALSE)
- var/is_screwdriver = isscrewdriver(C)
- playsound(src, C.usesound, 80, 1)
- return remove_tile(user, silent, make_tile = is_screwdriver)
+ remove_tile(user, FALSE, FALSE)
/turf/simulated/floor/wood/remove_tile(mob/user, silent = FALSE, make_tile = TRUE)
if(broken || burnt)
broken = 0
burnt = 0
if(user && !silent)
- to_chat(user, "You remove the broken planks.")
+ to_chat(user, "You remove the broken planks.")
else
if(make_tile)
if(user && !silent)
- to_chat(user, "You unscrew the planks.")
+ to_chat(user, "You unscrew the planks.")
if(builtin_tile)
builtin_tile.forceMove(src)
builtin_tile = null
else
if(user && !silent)
- to_chat(user, "You forcefully pry off the planks, destroying them in the process.")
+ to_chat(user, "You forcefully pry off the planks, destroying them in the process.")
return make_plating()
/turf/simulated/floor/wood/cold
diff --git a/code/game/turfs/simulated/floor/lava.dm b/code/game/turfs/simulated/floor/lava.dm
index 22b056568de..5a512b5455f 100644
--- a/code/game/turfs/simulated/floor/lava.dm
+++ b/code/game/turfs/simulated/floor/lava.dm
@@ -113,6 +113,9 @@
/turf/simulated/floor/plating/lava/attackby(obj/item/C, mob/user, params) //Lava isn't a good foundation to build on
return
+/turf/simulated/floor/plating/lava/welder_act()
+ return
+
/turf/simulated/floor/plating/lava/break_tile()
return
diff --git a/code/game/turfs/simulated/floor/light_floor.dm b/code/game/turfs/simulated/floor/light_floor.dm
index dab0ecff341..332cf745a4c 100644
--- a/code/game/turfs/simulated/floor/light_floor.dm
+++ b/code/game/turfs/simulated/floor/light_floor.dm
@@ -76,8 +76,6 @@
update_icon()
/turf/simulated/floor/light/attackby(obj/item/C, mob/user, params)
- if(..())
- return
if(istype(C,/obj/item/light/bulb)) //only for light tiles
if(istype(builtin_tile, /obj/item/stack/tile/light))
if(!state)
@@ -87,19 +85,24 @@
to_chat(user, "You replace the light bulb.")
else
to_chat(user, "The light bulb seems fine, no need to replace it.")
- if(ismultitool(C))
- if(!can_modify_colour)
- return
- if(state != 0)
- if(state < LIGHTFLOOR_PURPLE)
- state++
- else
- state = LIGHTFLOOR_ON
- to_chat(user, "You change \the [src]'s light bulb color.")
- update_icon()
- else
- to_chat(user, "\The [src]'s light bulb appears to have burned out.")
+ else
+ return ..()
+/turf/simulated/floor/light/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!can_modify_colour)
+ return
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(state != 0)
+ if(state < LIGHTFLOOR_PURPLE)
+ state++
+ else
+ state = LIGHTFLOOR_ON
+ to_chat(user, "You change [src]'s light bulb color.")
+ update_icon()
+ else
+ to_chat(user, "[src]'s light bulb appears to have burned out.")
//Cycles through all of the colours
/turf/simulated/floor/light/colour_cycle
diff --git a/code/game/turfs/simulated/floor/mineral.dm b/code/game/turfs/simulated/floor/mineral.dm
index 9031a0a350c..1d52c9274c3 100644
--- a/code/game/turfs/simulated/floor/mineral.dm
+++ b/code/game/turfs/simulated/floor/mineral.dm
@@ -46,6 +46,16 @@
return
..()
+/turf/simulated/floor/mineral/plasma/welder_act(mob/user, obj/item/I)
+ if(I.use_tool(src, user, volume = I.tool_volume))
+ user.visible_message("[user] sets [src] on fire!",\
+ "[src] disintegrates into a cloud of plasma!",\
+ "You hear a 'whoompf' and a roar.")
+ ignite(2500) //Big enough to ignite
+ message_admins("Plasma wall ignited by [key_name_admin(user)] in ([x], [y], [z] - JMP)",0,1)
+ log_game("Plasma wall ignited by [key_name(user)] in ([x], [y], [z])")
+ investigate_log("was ignited by [key_name(user)]","atmos")
+
/turf/simulated/floor/mineral/plasma/proc/PlasmaBurn()
make_plating()
atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 20)
diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm
index a29eab05a3b..ee7c1bcbb30 100644
--- a/code/game/turfs/simulated/floor/misc_floor.dm
+++ b/code/game/turfs/simulated/floor/misc_floor.dm
@@ -155,17 +155,15 @@
for(var/obj/structure/lattice/L in src)
L.ratvar_act()
-/turf/simulated/floor/clockwork/attackby(obj/item/I, mob/living/user, params)
- if(iscrowbar(I))
- user.visible_message("[user] begins slowly prying up [src]...", "You begin painstakingly prying up [src]...")
- playsound(src, I.usesound, 20, 1)
- if(!do_after(user, 70 * I.toolspeed, target = src))
- return 0
- user.visible_message("[user] pries up [src]!", "You pry up [src]!")
- playsound(src, I.usesound, 80, 1)
- make_plating()
- return 1
- return ..()
+/turf/simulated/floor/clockwork/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ user.visible_message("[user] begins slowly prying up [src]...", "You begin painstakingly prying up [src]...")
+ if(!I.use_tool(src, user, 70, volume = I.tool_volume))
+ return
+ user.visible_message("[user] pries up [src]!", "You pry up [src]!")
+ make_plating()
/turf/simulated/floor/clockwork/make_plating()
if(!dropped_brass)
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index e5b41154dbf..85b03d3378d 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -72,40 +72,37 @@
to_chat(user, "This section is too damaged to support a tile! Use a welder to fix the damage.")
return TRUE
- else if(isscrewdriver(C))
- var/obj/item/screwdriver/screwdriver = C
- to_chat(user, "You start [unfastened ? "fastening" : "unfastening"] [src].")
- playsound(src, screwdriver.usesound, 50, 1)
- if(do_after(user, 20 * screwdriver.toolspeed, target = src) && screwdriver)
- to_chat(user, "You [unfastened ? "fasten" : "unfasten"] [src].")
- unfastened = !unfastened
- return TRUE
+/turf/simulated/floor/plating/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ to_chat(user, "You start [unfastened ? "fastening" : "unfastening"] [src].")
+ . = TRUE
+ if(!I.use_tool(src, user, 20, volume = I.tool_volume))
+ return
+ to_chat(user, "You [unfastened ? "fasten" : "unfasten"] [src].")
+ unfastened = !unfastened
- else if(iswelder(C))
- var/obj/item/weldingtool/welder = C
- if(welder.isOn())
- if(!welder.remove_fuel(0, user))
- to_chat(user, "You need more welding fuel to complete this task.")
- return TRUE
-
- if(broken || burnt)
- to_chat(user, "You fix some dents on the broken plating.")
- playsound(src, welder.usesound, 80, 1)
- overlays -= current_overlay
- current_overlay = null
- burnt = FALSE
- broken = FALSE
- update_icon()
- if(unfastened)
- to_chat(user, "You start removing [src] exposing space after you're done!")
- playsound(src, welder.usesound, 100, 1)
- if(do_after(user, 50 * welder.toolspeed, target = src) && welder && welder.isOn())
- to_chat(user, "You remove [src].")
- new /obj/item/stack/tile/plasteel(get_turf(src))
- remove_plating(user)
- return TRUE
-
- return TRUE
+/turf/simulated/floor/plating/welder_act(mob/user, obj/item/I)
+ if(!broken && !burnt && !unfastened)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ if(unfastened)
+ to_chat(user, "You start removing [src], exposing space after you're done!")
+ if(!I.use_tool(src, user, 50, volume = I.tool_volume * 2)) //extra loud to let people know something's going down
+ return
+ new /obj/item/stack/tile/plasteel(get_turf(src))
+ remove_plating(user)
+ return
+ if(I.use_tool(src, user, volume = I.tool_volume)) //If we got this far, something needs fixing
+ to_chat(user, "You fix some dents on the broken plating.")
+ overlays -= current_overlay
+ current_overlay = null
+ burnt = FALSE
+ broken = FALSE
+ update_icon()
/turf/simulated/floor/plating/proc/remove_plating(mob/user)
if(baseturf == /turf/space)
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 75709978b86..8672c65ea69 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -25,6 +25,7 @@
thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT
heat_capacity = 312500 //a little over 5 cm thick , 312500 for 1 m by 2.5 m by 0.25 m plasteel wall
+ var/can_dismantle_with_welder = TRUE
var/hardness = 40 //lower numbers are harder. Used to determine the probability of a hulk smashing through.
var/slicing_duration = 100
var/engraving //engraving on the wall
@@ -326,54 +327,58 @@
return ..()
-/turf/simulated/wall/proc/try_rot(obj/item/I, mob/user, params)
- if(iswelder(I))
- var/obj/item/weldingtool/WT = I
- if(WT.remove_fuel(0, user))
- to_chat(user, "You burn away the fungi with [WT].")
- playsound(src, WT.usesound, 10, 1)
+/turf/simulated/wall/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(rotting)
+ if(I.use_tool(src, user, volume = I.tool_volume))
for(var/obj/effect/overlay/wall_rot/WR in src)
qdel(WR)
- rotting = 0
- return TRUE
- else if((!is_sharp(I) && I.force >= 10) || I.force >= 20)
+ rotting = FALSE
+ to_chat(user, "You burn off the fungi with [I].")
+ return
+
+ if(!I.tool_use_check(user, 0)) //Wall repair stuff
+ return
+
+ var/time_required = slicing_duration
+ var/intention
+ if(can_dismantle_with_welder)
+ intention = "Dismantle"
+ if(damage || LAZYLEN(dent_decals))
+ intention = "Repair"
+ if(can_dismantle_with_welder)
+ var/moved_away = user.loc
+ intention = alert(user, "Would you like to repair or dismantle [src]?", "[src]", "Repair", "Dismantle")
+ if(user.loc != moved_away)
+ to_chat(user, "Stay still while doing this!")
+ return
+ if(intention == "Repair")
+ time_required = max(5, damage / 5)
+ if(!intention)
+ return
+ if(intention == "Dismantle")
+ WELDER_ATTEMPT_SLICING_MESSAGE
+ else
+ WELDER_ATTEMPT_REPAIR_MESSAGE
+ if(I.use_tool(src, user, time_required, volume = I.tool_volume))
+ if(intention == "Dismantle")
+ WELDER_SLICING_SUCCESS_MESSAGE
+ dismantle_wall()
+ else
+ WELDER_REPAIR_SUCCESS_MESSAGE
+ cut_overlay(dent_decals)
+ dent_decals?.Cut()
+ take_damage(-damage)
+
+/turf/simulated/wall/proc/try_rot(obj/item/I, mob/user, params)
+ if((!is_sharp(I) && I.force >= 10) || I.force >= 20)
to_chat(user, "[src] crumbles away under the force of your [I.name].")
dismantle_wall(1)
return TRUE
return FALSE
/turf/simulated/wall/proc/try_decon(obj/item/I, mob/user, params)
- if(iswelder(I))
- var/obj/item/weldingtool/WT = I
- if(!WT.remove_fuel(0, user))
- to_chat(user, "You need more welding fuel to complete this task.")
- return TRUE // this means "don't continue trying to find alternative uses in attackby", not "decon succeeded"
-
- var/response = "Dismantle"
- if(damage || LAZYLEN(dent_decals))
- response = alert(user, "Would you like to repair or dismantle [src]?", "[src]", "Repair", "Dismantle")
-
- switch(response)
- if("Repair")
- to_chat(user, "You start repairing the damage to [src].")
- playsound(src, WT.usesound, 100, 1)
- if(do_after(user, max(5, damage / 5) * WT.toolspeed, target = src) && WT && WT.isOn())
- to_chat(user, "You finish repairing the damage to [src].")
- cut_overlay(dent_decals)
- dent_decals?.Cut()
- take_damage(-damage)
- else
- to_chat(user, "You begin slicing through the outer plating.")
- playsound(src, WT.usesound, 100, 1)
-
- if(do_after(user, slicing_duration * WT.toolspeed, target = src) && WT && WT.isOn())
- to_chat(user, "You remove the outer plating.")
- dismantle_wall()
- else
- to_chat(user, "You stop slicing through [src].")
- return TRUE
-
- else if(istype(I, /obj/item/gun/energy/plasmacutter))
+ if(istype(I, /obj/item/gun/energy/plasmacutter))
to_chat(user, "You begin slicing through the outer plating.")
playsound(src, I.usesound, 100, 1)
diff --git a/code/game/turfs/simulated/walls_indestructible.dm b/code/game/turfs/simulated/walls_indestructible.dm
index a5cfa4956ac..9b522e34640 100644
--- a/code/game/turfs/simulated/walls_indestructible.dm
+++ b/code/game/turfs/simulated/walls_indestructible.dm
@@ -6,6 +6,9 @@
/turf/simulated/wall/indestructible/take_damage(dam)
return
+/turf/simulated/wall/indestructible/welder_act()
+ return
+
/turf/simulated/wall/indestructible/ex_act(severity)
return
diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm
index 4ab20600b1a..78bfa26fef6 100644
--- a/code/game/turfs/simulated/walls_mineral.dm
+++ b/code/game/turfs/simulated/walls_mineral.dm
@@ -101,6 +101,16 @@
return
..()
+/turf/simulated/wall/mineral/plasma/welder_act(mob/user, obj/item/I)
+ if(I.tool_enabled)
+ ignite(2500) //The number's big enough
+ user.visible_message("[user] sets [src] on fire!",\
+ "[src] disintegrates into a cloud of plasma!",\
+ "You hear a 'whoompf' and a roar.")
+ message_admins("Plasma wall ignited by [key_name_admin(user)] in ([x], [y], [z] - JMP)",0,1)
+ log_game("Plasma wall ignited by [key_name(user)] in ([x], [y], [z])")
+ investigate_log("was ignited by [key_name(user)]","atmos")
+
/turf/simulated/wall/mineral/plasma/proc/PlasmaBurn(temperature)
new girder_type(src)
ChangeTurf(/turf/simulated/floor)
diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm
index ce3d7f1a258..7988f9cccf1 100644
--- a/code/game/turfs/simulated/walls_reinforced.dm
+++ b/code/game/turfs/simulated/walls_reinforced.dm
@@ -12,6 +12,8 @@
sheet_type = /obj/item/stack/sheet/plasteel
sheet_amount = 1
girder_type = /obj/structure/girder/reinforced
+ can_dismantle_with_welder = FALSE
+
var/d_state = RWALL_INTACT
var/can_be_reinforced = 1
@@ -34,50 +36,48 @@
. += "The support rods have been sliced through, and the outer sheath is connected loosely to the girder."
/turf/simulated/wall/r_wall/attackby(obj/item/I, mob/user, params)
- if(try_repair(I, user, params))
+ if(d_state == RWALL_COVER && istype(I, /obj/item/gun/energy/plasmacutter))
+ to_chat(user, "You begin slicing through the metal cover...")
+ if(I.use_tool(src, user, 40, volume = I.tool_volume) && d_state == RWALL_COVER)
+ d_state = RWALL_CUT_COVER
+ update_icon()
+ to_chat(user, "You press firmly on the cover, dislodging it.")
return
- return ..()
-
-/turf/simulated/wall/r_wall/proc/try_repair(obj/item/I, mob/user, params)
- if((damage || LAZYLEN(dent_decals)) && iswelder(I))
- var/obj/item/weldingtool/WT = I
- if(!WT.remove_fuel(0, user))
- to_chat(user, "You need more welding fuel to complete this task.")
- return TRUE
-
- to_chat(user, "You start repairing the damage to [src].")
- playsound(src, WT.usesound, 100, 1)
- if(do_after(user, max(5, damage / 5) * WT.toolspeed, target = src) && WT && WT.isOn())
- to_chat(user, "You finish repairing the damage to [src].")
- cut_overlay(dent_decals)
- dent_decals?.Cut()
- take_damage(-damage)
- return TRUE
-
- if(d_state)
+ else if(RWALL_SUPPORT_RODS && istype(I, /obj/item/gun/energy/plasmacutter))
+ to_chat(user, "You begin slicing through the support rods...")
+ if(I.use_tool(src, user, 70, volume = I.tool_volume) && d_state == RWALL_SUPPORT_RODS)
+ d_state = RWALL_SHEATH
+ update_icon()
+ return
+ else if(d_state == RWALL_SUPPORT_LINES && istype(I, /obj/item/stack/rods))
+ var/obj/item/stack/S = I
+ if(S.use(1))
+ d_state = RWALL_INTACT
+ update_icon()
+ to_chat(user, "You replace the outer grille.")
+ else
+ to_chat(user, "You don't have enough rods for that!")
+ return
+ else if(d_state)
// Repairing
if(istype(I, /obj/item/stack/sheet/metal))
var/obj/item/stack/sheet/metal/MS = I
-
to_chat(user, "You begin patching-up the wall with [MS]...")
if(do_after(user, max(20 * d_state, 100) * MS.toolspeed, target = src) && d_state)
if(!MS.use(1))
to_chat(user, "You don't have enough [MS.name] for that!")
- return TRUE
-
+ return
d_state = RWALL_INTACT
update_icon()
queue_smooth_neighbors(src)
to_chat(user, "You repair the last of the damage.")
-
- return TRUE
+ return
else if(istype(I, /obj/item/stack/sheet/plasteel))
var/obj/item/stack/sheet/plasteel/PS = I
if(!can_be_reinforced)
to_chat(user, "The wall is already coated!")
- return FALSE
-
+ return
to_chat(user, "You begin adding an additional layer of coating to the wall with [PS]...")
if(do_after(user, 40 * PS.toolspeed, target = src) && !d_state)
if(!PS.use(2))
@@ -88,185 +88,113 @@
update_icon()
queue_smooth_neighbors(src)
can_be_reinforced = FALSE
- return TRUE
- return FALSE
+ return
+ else
+ return ..()
+/turf/simulated/wall/r_wall/welder_act(mob/user, obj/item/I)
+ if(!(d_state in list(RWALL_COVER, RWALL_SUPPORT_RODS, RWALL_CUT_COVER)))
+ return ..()
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ if(d_state == RWALL_COVER)
+ to_chat(user, "You begin slicing through the metal cover...")
+ if(I.use_tool(src, user, 60, volume = I.tool_volume) && d_state == RWALL_COVER)
+ d_state = RWALL_CUT_COVER
+ to_chat(user, "You press firmly on the cover, dislodging it.")
+ else if(d_state == RWALL_SUPPORT_RODS)
+ to_chat(user, "You begin slicing through the support rods...")
+ if(I.use_tool(src, user, 100, volume = I.tool_volume) && d_state == RWALL_SUPPORT_RODS)
+ d_state = RWALL_SHEATH
+ else if(d_state == RWALL_CUT_COVER)
+ to_chat(user, "You begin welding the metal cover back to the frame...")
+ if(I.use_tool(src, user, 60, volume = I.tool_volume) && d_state == RWALL_CUT_COVER)
+ to_chat(user, "The metal cover has been welded securely to the frame.")
+ d_state = RWALL_COVER
+ update_icon()
-/turf/simulated/wall/r_wall/try_decon(obj/item/I, mob/user, params)
+/turf/simulated/wall/r_wall/crowbar_act(mob/user, obj/item/I)
+ if(!(d_state in list(RWALL_CUT_COVER, RWALL_SHEATH, RWALL_BOLTS)))
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
switch(d_state)
- if(RWALL_INTACT)
- // RWALL_INTACT > RWALL_SUPPORT_LINES
- if(iswirecutter(I))
- playsound(src, I.usesound, 100, 1)
- d_state = RWALL_SUPPORT_LINES
- update_icon()
- new /obj/item/stack/rods(src)
- to_chat(user, "You cut the outer grille.")
- return TRUE
-
- if(RWALL_SUPPORT_LINES)
- // RWALL_SUPPORT_LINES > RWALL_COVER
- if(isscrewdriver(I))
- to_chat(user, "You begin unsecuring the support lines...")
- playsound(src, I.usesound, 100, 1)
-
- if(do_after(user, 40 * I.toolspeed, target = src) && d_state == RWALL_SUPPORT_LINES)
- d_state = RWALL_COVER
- update_icon()
- to_chat(user, "You unsecure the support lines.")
- return TRUE
-
- // RWALL_INTACT < RWALL_SUPPORT_LINES
- if(istype(I, /obj/item/stack/rods))
- var/obj/item/stack/S = I
- if(S.use(1))
- d_state = RWALL_INTACT
- update_icon()
- to_chat(user, "You replace the outer grille.")
- else
- to_chat(user, "You don't have enough rods for that!")
- return TRUE
-
- if(RWALL_COVER)
- // RWALL_COVER > RWALL_CUT_COVER
- if(iswelder(I))
- var/obj/item/weldingtool/WT = I
- if(!WT.remove_fuel(0, user))
- to_chat(user, "You need more welding fuel to complete this task.")
- return TRUE
-
- to_chat(user, "You begin slicing through the metal cover...")
- playsound(src, WT.usesound, 100, 1)
-
- if(do_after(user, 60 * WT.toolspeed, target = src) && d_state == RWALL_COVER)
- d_state = RWALL_CUT_COVER
- update_icon()
- to_chat(user, "You press firmly on the cover, dislodging it.")
- return TRUE
-
- // RWALL_COVER > RWALL_CUT_COVER
- if(istype(I, /obj/item/gun/energy/plasmacutter))
- to_chat(user, "You begin slicing through the metal cover...")
- playsound(src, I.usesound, 100, 1)
-
- if(do_after(user, 40 * I.toolspeed, target = src) && d_state == RWALL_COVER)
- d_state = RWALL_CUT_COVER
- update_icon()
- to_chat(user, "You press firmly on the cover, dislodging it.")
- return TRUE
-
- // RWALL_SUPPORT_LINES < RWALL_COVER
- if(isscrewdriver(I))
- to_chat(user, "You begin securing the support lines...")
- playsound(src, I.usesound, 100, 1)
- if(do_after(user, 40 * I.toolspeed, target = src))
- if(!istype(src, /turf/simulated/wall/r_wall) || !I || d_state != RWALL_COVER)
- return TRUE
- d_state = RWALL_SUPPORT_LINES
- update_icon()
- to_chat(user, "The support lines have been secured.")
- return TRUE
-
if(RWALL_CUT_COVER)
- // RWALL_CUT_COVER > RWALL_BOLTS
- if(iscrowbar(I))
- to_chat(user, "You struggle to pry off the cover...")
- playsound(src, I.usesound, 100, 1)
-
- if(do_after(user, 100 * I.toolspeed, target = src) && d_state == RWALL_CUT_COVER)
- d_state = RWALL_BOLTS
- update_icon()
- to_chat(user, "You pry off the cover.")
- return TRUE
-
- // RWALL_COVER < RWALL_CUT_COVER
- if(iswelder(I))
- var/obj/item/weldingtool/WT = I
- if(!WT.remove_fuel(0, user))
- return TRUE
-
- to_chat(user, "You begin welding the metal cover back to the frame...")
- playsound(src, WT.usesound, 100, 1)
- if(do_after(user, 60 * WT.toolspeed, target = src))
- if(!istype(src, /turf/simulated/wall/r_wall) || !WT || !WT.isOn() || d_state != RWALL_CUT_COVER)
- return TRUE
- d_state = RWALL_COVER
- update_icon()
- to_chat(user, "The metal cover has been welded securely to the frame.")
- return TRUE
-
- if(RWALL_BOLTS)
- // RWALL_BOLTS > RWALL_SUPPORT_RODS
- if(iswrench(I))
- to_chat(user, "You start loosening the anchoring bolts which secure the support rods to their frame...")
- playsound(src, I.usesound, 100, 1)
-
- if(do_after(user, 40 * I.toolspeed, target = src) && d_state == RWALL_BOLTS)
- d_state = RWALL_SUPPORT_RODS
- update_icon()
- to_chat(user, "You remove the bolts anchoring the support rods.")
- return TRUE
-
- // RWALL_CUT_COVER < RWALL_BOLTS
- if(iscrowbar(I))
- to_chat(user, "You start to pry the cover back into place...")
- playsound(src, I.usesound, 100, 1)
- if(do_after(user, 20 * I.toolspeed, target = src))
- if(!istype(src, /turf/simulated/wall/r_wall) || !I || d_state != RWALL_BOLTS)
- return TRUE
- d_state = RWALL_CUT_COVER
- update_icon()
- to_chat(user, "The metal cover has been pried back into place.")
- return TRUE
-
- if(RWALL_SUPPORT_RODS)
- // RWALL_SUPPORT_RODS > RWALL_SHEATH
- if(iswelder(I))
- var/obj/item/weldingtool/WT = I
- if(!WT.remove_fuel(0, user))
- to_chat(user, "You need more welding fuel to complete this task.")
- return TRUE
-
- to_chat(user, "You begin slicing through the support rods...")
- playsound(src, WT.usesound, 100, 1)
-
- if(do_after(user, 100 * WT.toolspeed, target = src) && d_state == RWALL_SUPPORT_RODS)
- d_state = RWALL_SHEATH
- update_icon()
- return TRUE
-
- // RWALL_SUPPORT_RODS > RWALL_SHEATH
- if(istype(I, /obj/item/gun/energy/plasmacutter))
- to_chat(user, "You begin slicing through the support rods...")
- playsound(src, I.usesound, 100, 1)
-
- if(do_after(user, 70 * I.toolspeed, target = src) && d_state == RWALL_SUPPORT_RODS)
- d_state = RWALL_SHEATH
- update_icon()
- return TRUE
-
- // RWALL_BOLTS < RWALL_SUPPORT_RODS
- if(iswrench(I))
- to_chat(user, "You start tightening the bolts which secure the support rods to their frame...")
- playsound(src, I.usesound, 100, 1)
- if(do_after(user, 40 * I.toolspeed, target = src))
- if(!istype(src, /turf/simulated/wall/r_wall) || !I || d_state != RWALL_SUPPORT_RODS)
- return TRUE
- d_state = RWALL_BOLTS
- update_icon()
- to_chat(user, "You tighten the bolts anchoring the support rods.")
- return TRUE
-
+ to_chat(user, "You struggle to pry off the cover...")
+ if(!I.use_tool(src, user, 100, volume = I.tool_volume) || d_state != RWALL_CUT_COVER)
+ return
+ d_state = RWALL_BOLTS
+ to_chat(user, "You pry off the cover.")
if(RWALL_SHEATH)
- // RWALL_SHEATH > deconstructed
- if(iscrowbar(I))
- to_chat(user, "You struggle to pry off the outer sheath...")
- playsound(src, I.usesound, 100, 1)
+ to_chat(user, "You struggle to pry off the outer sheath...")
+ if(!I.use_tool(src, user, 100, volume = I.tool_volume) || d_state != RWALL_SHEATH)
+ return
+ to_chat(user, "You pry off the outer sheath.")
+ dismantle_wall()
+ return
+ if(RWALL_BOLTS)
+ to_chat(user, "You start to pry the cover back into place...")
+ playsound(src, I.usesound, 100, 1)
+ if(!I.use_tool(src, user, 20, volume = I.tool_volume) || d_state != RWALL_BOLTS)
+ return
+ d_state = RWALL_CUT_COVER
+ to_chat(user, "The metal cover has been pried back into place.")
+ update_icon()
- if(do_after(user, 100 * I.toolspeed, target = src) && d_state == RWALL_SHEATH)
- to_chat(user, "You pry off the outer sheath.")
- dismantle_wall()
- return TRUE
+/turf/simulated/wall/r_wall/screwdriver_act(mob/user, obj/item/I)
+ if(d_state != RWALL_SUPPORT_LINES && d_state != RWALL_COVER)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ var/state_check = d_state
+ if(d_state == RWALL_SUPPORT_LINES)
+ to_chat(user, "You begin unsecuring the support lines...")
+ else
+ to_chat(user, "You begin securing the support lines...")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume) || state_check != d_state)
+ return
+ if(d_state == RWALL_SUPPORT_LINES)
+ d_state = RWALL_COVER
+ to_chat(user, "You unsecure the support lines.")
+ else
+ d_state = RWALL_SUPPORT_LINES
+ to_chat(user, "The support lines have been secured.")
+ update_icon()
+
+/turf/simulated/wall/r_wall/wirecutter_act(mob/user, obj/item/I)
+ if(d_state != RWALL_INTACT)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ d_state = RWALL_SUPPORT_LINES
+ update_icon()
+ new /obj/item/stack/rods(src)
+ to_chat(user, "You cut the outer grille.")
+
+/turf/simulated/wall/r_wall/wrench_act(mob/user, obj/item/I)
+ if(d_state != RWALL_BOLTS && d_state != RWALL_SUPPORT_RODS)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ var/state_check = d_state
+ if(d_state == RWALL_BOLTS)
+ to_chat(user, "You start loosening the anchoring bolts which secure the support rods to their frame...")
+ else
+ to_chat(user, "You start tightening the bolts which secure the support rods to their frame...")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume) || state_check != d_state)
+ return
+ if(d_state == RWALL_BOLTS)
+ d_state = RWALL_SUPPORT_RODS
+ to_chat(user, "You remove the bolts anchoring the support rods.")
+ else
+ d_state = RWALL_BOLTS
+ to_chat(user, "You tighten the bolts anchoring the support rods.")
+ update_icon()
/turf/simulated/wall/r_wall/try_destroy(obj/item/I, mob/user, params)
if(istype(I, /obj/item/pickaxe/drill/diamonddrill))
diff --git a/code/modules/arcade/arcade_base.dm b/code/modules/arcade/arcade_base.dm
index 80d6cad031a..df007b83ad3 100644
--- a/code/modules/arcade/arcade_base.dm
+++ b/code/modules/arcade/arcade_base.dm
@@ -78,7 +78,7 @@
tokens += 1
return
if(panel_open && component_parts && istype(O, /obj/item/crowbar))
- default_deconstruction_crowbar(O)
+ default_deconstruction_crowbar(user, O)
return
return ..()
diff --git a/code/modules/arcade/prize_counter.dm b/code/modules/arcade/prize_counter.dm
index a48b1011adc..4d1d6973909 100644
--- a/code/modules/arcade/prize_counter.dm
+++ b/code/modules/arcade/prize_counter.dm
@@ -52,7 +52,7 @@
if(component_parts && istype(O, /obj/item/crowbar))
if(tickets) //save the tickets!
print_tickets()
- default_deconstruction_crowbar(O)
+ default_deconstruction_crowbar(user, O)
return
return ..()
diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm
index d94e3243013..b2a44940053 100644
--- a/code/modules/assembly/assembly.dm
+++ b/code/modules/assembly/assembly.dm
@@ -116,14 +116,18 @@
if(!A.secured && !secured)
attach_assembly(A, user)
return
- if(isscrewdriver(W))
- if(toggle_secure())
- to_chat(user, "[src] is ready!")
- else
- to_chat(user, "[src] can now be attached!")
- return
+
return ..()
+/obj/item/assembly/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(toggle_secure())
+ to_chat(user, "[src] is ready!")
+ else
+ to_chat(user, "[src] can now be attached!")
+
/obj/item/assembly/process()
STOP_PROCESSING(SSobj, src)
diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm
index e0454d5f5ea..d5039af0a84 100644
--- a/code/modules/assembly/bomb.dm
+++ b/code/modules/assembly/bomb.dm
@@ -28,35 +28,38 @@
if(istype(W, /obj/item/analyzer))
bombtank.attackby(W, user, params)
return
- if(iswrench(W) && !status) //This is basically bomb assembly code inverted. apparently it works.
+ return ..()
- to_chat(user, "You disassemble [src].")
-
- bombassembly.loc = user.loc
- bombassembly.master = null
- bombassembly = null
-
- bombtank.loc = user.loc
- bombtank.master = null
- bombtank = null
-
- qdel(src)
+/obj/item/onetankbomb/wrench_act(mob/user, obj/item/I) //This is basically bomb assembly code inverted. apparently it works.
+ if(status)
return
- if(iswelder(W))
- var/obj/item/weldingtool/WT = W
- if(WT.welding)
- if(!status)
- status = TRUE
- investigate_log("[key_name(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]", INVESTIGATE_BOMB)
- msg_admin_attack("[key_name_admin(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]", ATKLOG_FEW)
- log_game("[key_name(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature - T0C]")
- to_chat(user, "A pressure hole has been bored to [bombtank] valve. [bombtank] can now be ignited.")
- else
- status = FALSE
- investigate_log("[key_name(user)] unwelded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]", INVESTIGATE_BOMB)
- to_chat(user, "The hole has been closed.")
- add_fingerprint(user)
- ..()
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ to_chat(user, "You disassemble [src].")
+ bombassembly.loc = user.loc
+ bombassembly.master = null
+ bombassembly = null
+ bombtank.loc = user.loc
+ bombtank.master = null
+ bombtank = null
+ qdel(src)
+
+/obj/item/onetankbomb/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, volume = I.tool_volume))
+ return
+ if(!status)
+ status = TRUE
+ investigate_log("[key_name(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]", INVESTIGATE_BOMB)
+ msg_admin_attack("[key_name_admin(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]", ATKLOG_FEW)
+ log_game("[key_name(user)] welded a single tank bomb. Temperature: [bombtank.air_contents.temperature - T0C]")
+ to_chat(user, "A pressure hole has been bored to [bombtank] valve. [bombtank] can now be ignited.")
+ else
+ status = FALSE
+ investigate_log("[key_name(user)] unwelded a single tank bomb. Temperature: [bombtank.air_contents.temperature-T0C]", INVESTIGATE_BOMB)
+ to_chat(user, "The hole has been closed.")
+
/obj/item/onetankbomb/attack_self(mob/user) //pressing the bomb accesses its assembly
bombassembly.attack_self(user, 1)
diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm
index 3a543e38f72..6648a9ce22d 100644
--- a/code/modules/assembly/health.dm
+++ b/code/modules/assembly/health.dm
@@ -28,17 +28,16 @@
update_icon()
return secured
-/obj/item/assembly/health/attackby(obj/item/W, mob/user)
- if(ismultitool(W))
- if(alarm_health == 0)
- alarm_health = -90
- user.show_message("You toggle [src] to \"detect death\" mode.")
- else
- alarm_health = 0
- user.show_message("You toggle [src] to \"detect critical state\" mode.")
+/obj/item/assembly/health/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
+ if(alarm_health == 0)
+ alarm_health = -90
+ user.show_message("You toggle [src] to \"detect death\" mode.")
else
- return ..()
+ alarm_health = 0
+ user.show_message("You toggle [src] to \"detect critical state\" mode.")
/obj/item/assembly/health/process()
if(!scanning || !secured)
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
index a7007806289..236ee94bd9d 100644
--- a/code/modules/assembly/holder.dm
+++ b/code/modules/assembly/holder.dm
@@ -139,24 +139,21 @@
..()
return
-/obj/item/assembly_holder/attackby(obj/item/W, mob/user, params)
- if(isscrewdriver(W))
- if(!a_left || !a_right)
- to_chat(user, "BUG:Assembly part missing, please report this!")
- return
- a_left.toggle_secure()
- a_right.toggle_secure()
- secured = !secured
- if(secured)
- to_chat(user, "[src] is ready!")
- else
- to_chat(user, "[src] can now be taken apart!")
- update_icon()
+/obj/item/assembly_holder/screwdriver_act(mob/user, obj/item/I)
+ if(!a_left || !a_right)
+ to_chat(user, "BUG:Assembly part missing, please report this!")
return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ a_left.toggle_secure()
+ a_right.toggle_secure()
+ secured = !secured
+ if(secured)
+ to_chat(user, "[src] is ready!")
else
- ..()
- return
-
+ to_chat(user, "[src] can now be taken apart!")
+ update_icon()
/obj/item/assembly_holder/attack_self(mob/user)
add_fingerprint(user)
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index fef737982fa..429a87ba58a 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -143,13 +143,18 @@
update_icon()
else
to_chat(user, "[src] already has a cell.")
+ else
+ return ..()
- else if(iswirecutter(W))
- if(cell)
- to_chat(user, "You cut [cell] away from [src].")
- cell.forceMove(get_turf(loc))
- cell = null
- update_icon()
+/obj/item/clothing/gloves/color/yellow/stun/wirecutter_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(cell)
+ to_chat(user, "You cut [cell] away from [src].")
+ cell.forceMove(get_turf(loc))
+ cell = null
+ update_icon()
/obj/item/clothing/gloves/fingerless/rapid
name = "Gloves of the North Star"
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index 789696ae874..867a50cb70f 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -135,14 +135,7 @@
materials = list(MAT_METAL=500, MAT_GLASS=50)
/obj/item/clothing/mask/muzzle/safety/shock/attackby(obj/item/W, mob/user, params)
- if(isscrewdriver(W) && trigger)
- to_chat(user, "You disassemble [src].")
- trigger.forceMove(get_turf(user))
- trigger.master = null
- trigger.holder = null
- trigger = null
- return TRUE
- else if(istype(W, /obj/item/assembly/signaler) || istype(W, /obj/item/assembly/voice))
+ if(istype(W, /obj/item/assembly/signaler) || istype(W, /obj/item/assembly/voice))
if(istype(trigger, /obj/item/assembly/signaler) || istype(trigger, /obj/item/assembly/voice))
to_chat(user, "Something is already attached to [src].")
return FALSE
@@ -161,6 +154,17 @@
return ..()
+/obj/item/clothing/mask/muzzle/safety/shock/screwdriver_act(mob/user, obj/item/I)
+ if(!trigger)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ to_chat(user, "You remove [trigger] from [src].")
+ trigger.forceMove(get_turf(user))
+ trigger.master = null
+ trigger.holder = null
+ trigger = null
/obj/item/clothing/mask/muzzle/safety/shock/proc/can_shock(obj/item/clothing/C)
if(istype(C))
diff --git a/code/modules/clothing/spacesuits/breaches.dm b/code/modules/clothing/spacesuits/breaches.dm
index c8891fde00d..483c122fd80 100644
--- a/code/modules/clothing/spacesuits/breaches.dm
+++ b/code/modules/clothing/spacesuits/breaches.dm
@@ -194,25 +194,18 @@ var/global/list/breach_burn_descriptors = list(
repair_breaches(BURN, ( istype(P,/obj/item/stack/sheet/plastic) ? 3 : 5), user)
return
- else if(istype(W, /obj/item/weldingtool))
- if(istype(src.loc,/mob/living))
- to_chat(user, "How do you intend to patch a hardsuit while someone is wearing it?")
- return
-
- if(!damage || ! brute_damage)
- to_chat(user, "There is no structural damage on \the [src] to repair.")
- return
-
- var/obj/item/weldingtool/WT = W
- if(!WT.remove_fuel(5))
- to_chat(user, "You need more welding fuel to repair this suit.")
- return
-
- repair_breaches(BRUTE, 3, user)
+/obj/item/clothing/suit/space/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(istype(src.loc,/mob/living))
+ to_chat(user, "How do you intend to patch a hardsuit while someone is wearing it?")
return
-
- ..()
+ if(!damage || ! brute_damage)
+ to_chat(user, "There is no structural damage on \the [src] to repair.")
+ return
+ if(!I.use_tool(src, user, amount = 5, volume = I.tool_volume))
+ return
+ repair_breaches(BRUTE, 3, user)
/obj/item/clothing/suit/space/examine(mob/user)
. = ..()
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 32b594b1387..f9366e12778 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -138,21 +138,23 @@
jetpack = I
to_chat(user, "You successfully install the jetpack into [src].")
return
- else if(isscrewdriver(I))
- if(!jetpack)
- to_chat(user, "[src] has no jetpack installed.")
- return
- if(src == user.get_item_by_slot(slot_wear_suit))
- to_chat(user, "You cannot remove the jetpack from [src] while wearing it.")
- return
-
- jetpack.turn_off(user)
- jetpack.forceMove(drop_location())
- jetpack = null
- to_chat(user, "You successfully remove the jetpack from [src].")
- return
return ..()
+/obj/item/clothing/suit/space/hardsuit/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(!jetpack)
+ to_chat(user, "[src] has no jetpack installed.")
+ return
+ if(src == user.get_item_by_slot(slot_wear_suit))
+ to_chat(user, "You cannot remove the jetpack from [src] while wearing it.")
+ return
+ jetpack.turn_off(user)
+ jetpack.forceMove(drop_location())
+ jetpack = null
+ to_chat(user, "You successfully remove the jetpack from [src].")
+
/obj/item/clothing/suit/space/hardsuit/equipped(mob/user, slot)
..()
if(jetpack)
@@ -560,24 +562,24 @@
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi
jetpack = /obj/item/tank/jetpack/suit
-/obj/item/clothing/suit/space/hardsuit/shielded/syndi/attackby(obj/item/I, mob/user, params)
- if(ismultitool(I))
- if(shield_state == "broken")
- to_chat(user, "You can't interface with the hardsuit's software if the shield's broken!")
- return
-
- if(shield_state == "shield-red")
- shield_state = "shield-old"
- shield_on = "shield-old"
- to_chat(user, "You roll back the hardsuit's software, changing the shield's color!")
-
- else
- shield_state = "shield-red"
- shield_on = "shield-red"
- to_chat(user, "You update the hardsuit's hardware, changing back the shield's color to red.")
- user.update_inv_wear_suit()
+/obj/item/clothing/suit/space/hardsuit/shielded/syndi/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
- return ..()
+ if(shield_state == "broken")
+ to_chat(user, "You can't interface with the hardsuit's software if the shield's broken!")
+ return
+
+ if(shield_state == "shield-red")
+ shield_state = "shield-old"
+ shield_on = "shield-old"
+ to_chat(user, "You roll back the hardsuit's software, changing the shield's color!")
+
+ else
+ shield_state = "shield-red"
+ shield_on = "shield-red"
+ to_chat(user, "You update the hardsuit's hardware, changing back the shield's color to red.")
+ user.update_inv_wear_suit()
/obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi
name = "blood-red hardsuit helmet"
diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm
index e87e35a0dea..4b19d2a7753 100644
--- a/code/modules/clothing/spacesuits/rig/modules/utility.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm
@@ -465,18 +465,12 @@
else
to_chat(holder.wearer, "You need to have a welding tool in one of your hands to dispense fuel.")
-/obj/item/rig_module/welding_tank/proc/fill_welder(var/obj/item/weldingtool/W)
+/obj/item/rig_module/welding_tank/proc/fill_welder(obj/item/weldingtool/W)
if(!istype(W))
- return 0
-
- if(reagents)
- if(get_fuel() >= W.max_fuel)
- reagents.trans_to(W, W.max_fuel)
- to_chat(holder.wearer, "Your [holder] dispenses some of the contents of the welding fuel tank into \the [W].")
- else
- reagents.trans_to(W, W.max_fuel)
- to_chat(holder.wearer, "You hear a faint dripping as your hardsuit welding tank completely empties.")
- W.update_icon()
+ return
+ W.refill(holder.wearer, src, W.maximum_fuel)
+ if(!reagents.get_reagent_amount("fuel"))
+ to_chat(holder.wearer, "You hear a faint dripping as your hardsuit welding tank completely empties.")
/obj/item/rig_module/welding_tank/proc/get_fuel()
return reagents.get_reagent_amount("fuel")
diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm
index 391338fc181..2e5c7d99082 100644
--- a/code/modules/crafting/craft.dm
+++ b/code/modules/crafting/craft.dm
@@ -108,19 +108,25 @@
if(!R.tools.len)
return TRUE
var/list/possible_tools = list()
+ var/list/tools_used = list()
for(var/obj/item/I in user.contents)
if(istype(I, /obj/item/storage))
for(var/obj/item/SI in I.contents)
- possible_tools += SI.type
- possible_tools += I.type
+ if(SI.tool_behaviour) //Only add things that we could actually use as a tool
+ possible_tools += SI
+ if(I.tool_behaviour)
+ possible_tools += I
possible_tools |= contents["other"]
-
main_loop:
for(var/A in R.tools)
- for(var/I in possible_tools)
- if(ispath(I,A))
+ for(var/obj/item/I in possible_tools)
+ if(A == I.tool_behaviour)
+ tools_used += I
continue main_loop
return FALSE
+ for(var/obj/item/T in tools_used)
+ if(!T.tool_start_check(user, 0)) //Check if all our tools are valid for their use
+ return FALSE
return TRUE
/datum/personal_crafting/proc/construct_item(mob/user, datum/crafting_recipe/R)
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index b49e20f1302..63a3b953864 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -65,7 +65,7 @@
/obj/item/gun/energy/gun/advtaser = 1,
/obj/item/stock_parts/cell = 1,
/obj/item/assembly/prox_sensor = 1)
- tools = list(/obj/item/weldingtool, /obj/item/screwdriver)
+ tools = list(TOOL_WELDER, TOOL_SCREWDRIVER)
time = 60
category = CAT_ROBOT
@@ -77,7 +77,7 @@
/obj/item/melee/baton = 1,
/obj/item/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 1)
- tools = list(/obj/item/weldingtool)
+ tools = list(TOOL_WELDER)
time = 60
category = CAT_ROBOT
@@ -90,7 +90,7 @@
/obj/item/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 2,
/obj/item/robot_parts/l_arm = 2)
- tools = list(/obj/item/weldingtool)
+ tools = list(TOOL_WELDER)
time = 120
category = CAT_ROBOT
@@ -142,7 +142,7 @@
/obj/item/stack/rods = 1)
parts = list(/obj/item/assembly/igniter = 1,
/obj/item/weldingtool = 1)
- tools = list(/obj/item/screwdriver)
+ tools = list(TOOL_SCREWDRIVER)
time = 10
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
@@ -153,7 +153,7 @@
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
/obj/item/rcd_ammo = 1,
/obj/item/stock_parts/manipulator = 2)
- tools = list(/obj/item/screwdriver)
+ tools = list(TOOL_SCREWDRIVER)
time = 5
category = CAT_WEAPONRY
subcategory = CAT_AMMO
@@ -164,7 +164,7 @@
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
/obj/item/stock_parts/capacitor/adv = 2,
/obj/item/stock_parts/micro_laser/ultra = 1)
- tools = list(/obj/item/screwdriver)
+ tools = list(TOOL_SCREWDRIVER)
time = 5
category = CAT_WEAPONRY
subcategory = CAT_AMMO
@@ -174,7 +174,7 @@
result = /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
/datum/reagent/phosphorus = 5,)
- tools = list(/obj/item/screwdriver)
+ tools = list(TOOL_SCREWDRIVER)
time = 5
category = CAT_WEAPONRY
subcategory = CAT_AMMO
@@ -186,7 +186,7 @@
/datum/reagent/glycerol = 5,
/datum/reagent/acid = 5,
/datum/reagent/acid/facid = 5,)
- tools = list(/obj/item/screwdriver)
+ tools = list(TOOL_SCREWDRIVER)
time = 5
category = CAT_WEAPONRY
subcategory = CAT_AMMO
@@ -197,7 +197,7 @@
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
/obj/item/stock_parts/micro_laser/ultra = 1,
/obj/item/stock_parts/subspace/crystal = 1)
- tools = list(/obj/item/screwdriver)
+ tools = list(TOOL_SCREWDRIVER)
time = 5
category = CAT_WEAPONRY
subcategory = CAT_AMMO
@@ -209,7 +209,7 @@
/obj/item/stack/sheet/metal = 1,
/obj/item/stack/cable_coil = 1,
/datum/reagent/fuel = 10)
- tools = list(/obj/item/screwdriver)
+ tools = list(TOOL_SCREWDRIVER)
time = 5
category = CAT_WEAPONRY
subcategory = CAT_AMMO
@@ -220,7 +220,7 @@
reqs = list(/obj/item/ammo_casing/shotgun/improvised = 1,
/datum/reagent/blackpowder = 10,
/datum/reagent/plasma_dust = 20)
- tools = list(/obj/item/screwdriver)
+ tools = list(TOOL_SCREWDRIVER)
time = 5
category = CAT_WEAPONRY
subcategory = CAT_AMMO
@@ -231,7 +231,7 @@
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
/obj/item/stock_parts/capacitor/adv = 1,
/obj/item/stock_parts/micro_laser/high = 1)
- tools = list(/obj/item/screwdriver)
+ tools = list(TOOL_SCREWDRIVER)
time = 5
category = CAT_WEAPONRY
subcategory = CAT_AMMO
@@ -243,7 +243,7 @@
/obj/item/pipe = 1,
/obj/item/weaponcrafting/stock = 1,
/obj/item/stack/packageWrap = 5,)
- tools = list(/obj/item/screwdriver)
+ tools = list(TOOL_SCREWDRIVER)
time = 100
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
@@ -254,7 +254,7 @@
reqs = list(/obj/item/circular_saw = 1,
/obj/item/stack/cable_coil = 1,
/obj/item/stack/sheet/plasteel = 1)
- tools = list(/obj/item/weldingtool)
+ tools = list(TOOL_WELDER)
time = 50
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
@@ -316,7 +316,7 @@
result = /obj/item/arrow/rod
time = 5
reqs = list(/obj/item/stack/rods = 1)
- tools = list(/obj/item/weldingtool)
+ tools = list(TOOL_WELDER)
category = CAT_WEAPONRY
subcategory = CAT_AMMO
@@ -328,8 +328,8 @@
/obj/item/stack/cable_coil = 10,
/obj/item/stack/sheet/plastic = 3,
/obj/item/stack/sheet/wood = 5)
- tools = list(/obj/item/weldingtool,
- /obj/item/screwdriver)
+ tools = list(TOOL_WELDER,
+ TOOL_SCREWDRIVER)
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
@@ -525,7 +525,7 @@
reqs = list(/obj/item/stack/sheet/plasteel = 3,
/obj/item/stack/sheet/wood = 20,
/obj/item/stack/cable_coil = 10)
- tools = list(/obj/item/screwdriver, /obj/item/wrench, /obj/item/weldingtool)
+ tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER)
category = CAT_MISC
/datum/crafting_recipe/drill
@@ -537,7 +537,7 @@
/obj/item/stock_parts/cell = 1,
/obj/item/stack/rods = 2,
/obj/item/assembly/timer = 1)
- tools = list(/obj/item/screwdriver, /obj/item/wrench)
+ tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH)
category = CAT_MISC
/datum/crafting_recipe/d_drill
@@ -549,7 +549,7 @@
/obj/item/stock_parts/cell = 1,
/obj/item/stack/rods = 2,
/obj/item/assembly/prox_sensor = 1) // Not a timer because the system sees a diamond drill as a drill too, letting you make both otherwise.
- tools = list(/obj/item/screwdriver, /obj/item/wrench)
+ tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH)
category = CAT_MISC
/datum/crafting_recipe/faketoolbox
diff --git a/code/modules/crafting/tailoring.dm b/code/modules/crafting/tailoring.dm
index a46e509001c..6973fd04ad3 100644
--- a/code/modules/crafting/tailoring.dm
+++ b/code/modules/crafting/tailoring.dm
@@ -54,7 +54,7 @@
name = "Security HUDsunglasses"
result = /obj/item/clothing/glasses/hud/security/sunglasses
time = 20
- tools = list(/obj/item/screwdriver, /obj/item/wirecutters)
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/hud/security = 1,
/obj/item/clothing/glasses/sunglasses = 1,
/obj/item/stack/cable_coil = 5)
@@ -64,7 +64,7 @@
name = "Security HUD removal"
result = /obj/item/clothing/glasses/sunglasses
time = 20
- tools = list(/obj/item/screwdriver, /obj/item/wirecutters)
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/hud/security/sunglasses = 1)
category = CAT_CLOTHING
@@ -72,7 +72,7 @@
name = "Medical HUDsunglasses"
result = /obj/item/clothing/glasses/hud/health/sunglasses
time = 20
- tools = list(/obj/item/screwdriver, /obj/item/wirecutters)
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/hud/health = 1,
/obj/item/clothing/glasses/sunglasses = 1,
/obj/item/stack/cable_coil = 5)
@@ -82,7 +82,7 @@
name = "Medical HUD removal"
result = /obj/item/clothing/glasses/sunglasses
time = 20
- tools = list(/obj/item/screwdriver, /obj/item/wirecutters)
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/hud/health/sunglasses = 1)
category = CAT_CLOTHING
@@ -90,7 +90,7 @@
name = "Diagnostic HUDsunglasses"
result = /obj/item/clothing/glasses/hud/diagnostic/sunglasses
time = 20
- tools = list(/obj/item/screwdriver, /obj/item/wirecutters)
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/hud/diagnostic = 1,
/obj/item/clothing/glasses/sunglasses = 1,
/obj/item/stack/cable_coil = 5)
@@ -100,7 +100,7 @@
name = "Diagnostic HUD removal"
result = /obj/item/clothing/glasses/sunglasses
time = 20
- tools = list(/obj/item/screwdriver, /obj/item/wirecutters)
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/hud/diagnostic/sunglasses = 1)
category = CAT_CLOTHING
@@ -108,7 +108,7 @@
name = "Beer Goggles"
result = /obj/item/clothing/glasses/sunglasses/reagent
time = 20
- tools = list(/obj/item/screwdriver, /obj/item/wirecutters)
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/science = 1,
/obj/item/clothing/glasses/sunglasses = 1,
/obj/item/stack/cable_coil = 5)
@@ -118,7 +118,7 @@
name = "Beer Goggles removal"
result = /obj/item/clothing/glasses/sunglasses
time = 20
- tools = list(/obj/item/screwdriver, /obj/item/wirecutters)
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
reqs = list(/obj/item/clothing/glasses/sunglasses/reagent = 1)
category = CAT_CLOTHING
@@ -126,7 +126,7 @@
name = "Ghost Sheet"
result = /obj/item/clothing/suit/ghost_sheet
time = 5
- tools = list(/obj/item/wirecutters)
+ tools = list(TOOL_WIRECUTTER)
reqs = list(/obj/item/bedsheet = 1)
category = CAT_CLOTHING
diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm
index 95cf9f15799..d54e22c6fc4 100644
--- a/code/modules/fish/fishtank.dm
+++ b/code/modules/fish/fishtank.dm
@@ -364,6 +364,12 @@
egg_list.Add(parent2.egg_item)
egg_count++
+/obj/machinery/fishtank/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ default_welder_repair(user, I)
+
////////////////////////////// Note from FalseIncarnate:
// EXAMINE PROC // This proc is massive, messy, and probably could be handled better.
////////////////////////////// Feel free to try cleaning it up if you think of a better way to do it.
@@ -558,25 +564,8 @@
qdel(src)
/obj/machinery/fishtank/attackby(obj/item/O, mob/user)
- //Welders repair damaged tanks on help intent, damage on all others
- if(iswelder(O))
- var/obj/item/weldingtool/W = O
- if(user.a_intent == INTENT_HELP)
- if(W.isOn())
- if(obj_integrity < max_integrity)
- playsound(loc, W.usesound, 50, 1)
- to_chat(user, "You repair some of the cracks on [src].")
- obj_integrity = min(obj_integrity + 20, max_integrity)
- check_health()
- else
- to_chat(user, "There is no damage to fix!")
- else
- if(obj_integrity < max_integrity)
- to_chat(user, "[W] must be on to repair this damage.")
- else
- return ..()
//Open reagent containers add and remove water
- else if(O.is_drainable())
+ if(O.is_drainable())
//Containers with any reagents will get dumped in
if(O.reagents.total_volume)
var/water_value = 0
@@ -616,15 +605,6 @@
O.reagents.add_reagent("fishwater", water_level)
adjust_water_level(-water_level)
user.visible_message("[user.name] scoops out some water from [src].", "You fill [O.name] with the last of the water in [src].")
- //Wrenches can deconstruct empty tanks, but not tanks with any water. Kills any fish left inside and destroys any unharvested eggs in the process
- else if(iswrench(O))
- if(!water_level)
- to_chat(user, "Now disassembling [src].")
- playsound(loc, O.usesound, 50, 1)
- if(do_after(user, 50 * O.toolspeed, target = src))
- deconstruct(TRUE)
- else
- to_chat(user, "[src] must be empty before you disassemble it!")
//Fish eggs
else if(istype(O, /obj/item/fish_eggs))
var/obj/item/fish_eggs/egg = O
@@ -670,4 +650,15 @@
adjust_filth_level(-filth_level)
user.visible_message("[user.name] scrubs the inside of [src], cleaning the filth.", "You scrub the inside of [src], cleaning the filth.")
else
- return ..()
\ No newline at end of file
+ return ..()
+
+/obj/machinery/fishtank/wrench_act(mob/user, obj/item/I) //Wrenches can deconstruct empty tanks, but not tanks with any water. Kills any fish left inside and destroys any unharvested eggs in the process
+ . = TRUE
+ if(water_level)
+ to_chat(user, "[src] must be empty before you disassemble it!")
+ return
+ if(!I.tool_use_check(user, 0))
+ return
+ to_chat(user, "Now disassembling [src].")
+ if(I.use_tool(src, user, 50, volume = I.tool_volume))
+ deconstruct(TRUE)
diff --git a/code/modules/food_and_drinks/drinks/bottler/bottler.dm b/code/modules/food_and_drinks/drinks/bottler/bottler.dm
index 4cf5c58bd06..39d175968d4 100644
--- a/code/modules/food_and_drinks/drinks/bottler/bottler.dm
+++ b/code/modules/food_and_drinks/drinks/bottler/bottler.dm
@@ -40,15 +40,6 @@
qdel(recipe)
/obj/machinery/bottler/attackby(obj/item/O, mob/user, params)
- if(iswrench(O)) //This being before the canUnequip check allows borgs to (un)wrench bottlers in case they need move them to fix stuff
- playsound(src, O.usesound, 50, 1)
- if(anchored)
- anchored = 0
- to_chat(user, "[src] can now be moved.")
- else
- anchored = 1
- to_chat(user, "[src] is now secured.")
- return 1
if(!user.canUnEquip(O, 0))
to_chat(user, "[O] is stuck to your hand, you can't seem to put it down!")
return 0
@@ -91,7 +82,17 @@
else //If it doesn't qualify in the above checks, we don't want it. Inform the person so they (ideally) stop trying to put the nuke disc in.
to_chat(user, "You aren't sure this is able to be processed by the machine.")
return 0
- //..()
+ return ..()
+
+/obj/machinery/bottler/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ anchored = !anchored
+ if(anchored)
+ WRENCH_ANCHOR_MESSAGE
+ else
+ WRENCH_UNANCHOR_MESSAGE
/obj/machinery/bottler/proc/insert_item(obj/item/O, mob/user)
if(!O || !user)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/cooker.dm b/code/modules/food_and_drinks/kitchen_machinery/cooker.dm
index 802f8f08c54..eb2e8bd3e7b 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/cooker.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/cooker.dm
@@ -98,12 +98,6 @@
if(upgradeable)
//Not all cooker types currently support build/upgrade stuff, so not all of it will work well with this
//Until we decide whether or not we want to bring back the cereal maker or old grill/oven in some form, this initial check will have to suffice
- if(isscrewdriver(I))
- default_deconstruction_screwdriver(user, openicon, officon, I)
- return
- if(iscrowbar(I))
- default_deconstruction_crowbar(I)
- return
if(istype(I, /obj/item/storage/part_replacer))
exchange_parts(user, I)
return
@@ -146,6 +140,20 @@
turnoff(I)
//qdel(I)
+/obj/machinery/cooker/crowbar_act(mob/user, obj/item/I)
+ if(!upgradeable)
+ return
+ if(default_deconstruction_crowbar(user, I))
+ return TRUE
+
+/obj/machinery/cooker/screwdriver_act(mob/user, obj/item/I)
+ if(!upgradeable)
+ return
+ if(default_deconstruction_screwdriver(user, openicon, officon, I))
+ return TRUE
+
+
+
/obj/machinery/cooker/proc/special_attack(obj/item/grab/G, mob/user)
return 0
diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index 2aee35c225d..e0f456facec 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -108,7 +108,7 @@
if(default_unfasten_wrench(user, P))
return
- if(default_deconstruction_crowbar(P))
+ if(default_deconstruction_crowbar(user, P))
return
return ..()
diff --git a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
index 298a5ae2e7e..e0d0c5ec396 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
@@ -78,7 +78,7 @@
to_chat(user, "\The [src] is now secured.")
return
- default_deconstruction_crowbar(O)
+ default_deconstruction_crowbar(user, O)
if(broken > 0)
if(broken == 2 && istype(O, /obj/item/screwdriver)) // If it's broken and they're using a screwdriver
diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
index 6bbd1f20ee5..a648d37656d 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
@@ -56,7 +56,7 @@ GLOBAL_LIST_EMPTY(monkey_recyclers)
power_change()
return
- if(default_deconstruction_crowbar(O))
+ if(default_deconstruction_crowbar(user, O))
return
if(istype(O, /obj/item/multitool))
diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
index 394ee10384b..61f887e44bc 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
@@ -175,7 +175,7 @@
if(default_unfasten_wrench(user, O))
return
- default_deconstruction_crowbar(O)
+ default_deconstruction_crowbar(user, O)
var/obj/item/what = O
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index 3cd95f37923..3986bb64ae0 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -253,7 +253,7 @@
power_change()
return
- if(default_deconstruction_crowbar(O))
+ if(default_deconstruction_crowbar(user, O))
return
if(istype(O, /obj/item/multitool)||istype(O, /obj/item/wirecutters))
@@ -386,7 +386,7 @@
return data
/obj/machinery/smartfridge/Topic(href, href_list)
- if(..())
+ if(..())
return FALSE
var/mob/user = usr
@@ -492,7 +492,7 @@
/obj/machinery/smartfridge/drying_rack/spawn_frame()
return
-/obj/machinery/smartfridge/drying_rack/default_deconstruction_crowbar(obj/item/crowbar/C, ignore_panel = 1)
+/obj/machinery/smartfridge/drying_rack/default_deconstruction_crowbar(user, obj/item/crowbar/C, ignore_panel = 1)
..()
/obj/machinery/smartfridge/drying_rack/Topic(href, href_list)
diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm
index 5427ac9f2c9..4f9daa1ea92 100644
--- a/code/modules/hydroponics/beekeeping/beebox.dm
+++ b/code/modules/hydroponics/beekeeping/beebox.dm
@@ -160,10 +160,6 @@
to_chat(user, "There's no room for anymore frames in the apiary!")
return
- if(iswrench(I))
- if(default_unfasten_wrench(user, I, time = 20))
- return
-
if(istype(I, /obj/item/queen_bee))
if(queen_bee)
to_chat(user, "This hive already has a queen!")
@@ -202,6 +198,11 @@
return
return ..()
+/obj/structure/beebox/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ default_unfasten_wrench(user, I, time = 20)
/obj/structure/beebox/attack_hand(mob/user)
if(ishuman(user))
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index 3332b12e1bd..c1b5e471315 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -93,7 +93,7 @@
if(exchange_parts(user, O))
return
- if(default_deconstruction_crowbar(O))
+ if(default_deconstruction_crowbar(user, O))
return
if(istype(O, /obj/item/reagent_containers/glass))
diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm
index fce2a2905fc..d39a0168f14 100644
--- a/code/modules/hydroponics/gene_modder.dm
+++ b/code/modules/hydroponics/gene_modder.dm
@@ -100,7 +100,7 @@
return
if(exchange_parts(user, I))
return
- if(default_deconstruction_crowbar(I))
+ if(default_deconstruction_crowbar(user, I))
return
if(isrobot(user))
return
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 752c915f145..58c7636ae7c 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -85,14 +85,17 @@
if(exchange_parts(user, I))
return
- if(iscrowbar(I))
- if(using_irrigation)
- to_chat(user, "Disconnect the hoses first!")
- else if(default_deconstruction_crowbar(I, 1))
- return
else
return ..()
+/obj/machinery/hydroponics/constructable/crowbar_act(mob/user, obj/item/I)
+
+ if(using_irrigation)
+ to_chat(user, "Disconnect the hoses first!")
+ return TRUE
+ if(default_deconstruction_crowbar(user, I, 1))
+ return TRUE
+
/obj/machinery/hydroponics/proc/FindConnected()
var/list/connected = list()
var/list/processing_atoms = list(src)
@@ -847,39 +850,6 @@
return
S.handle_item_insertion(G, 1)
- else if(iswrench(O) && wrenchable)
- if(using_irrigation)
- to_chat(user, "Disconnect the hoses first!")
- return
-
- if(!anchored && !isinspace())
- user.visible_message("[user] begins to wrench [src] into place.", "You begin to wrench [src] in place...")
- playsound(loc, O.usesound, 50, 1)
- if (do_after(user, 20 * O.toolspeed, target = src))
- if(anchored)
- return
- anchored = 1
- user.visible_message("[user] wrenches [src] into place.", \
- "You wrench [src] in place.")
- else if(anchored)
- user.visible_message("[user] begins to unwrench [src].", \
- "You begin to unwrench [src]...")
- playsound(loc, O.usesound, 50, 1)
- if (do_after(user, 20 * O.toolspeed, target = src))
- if(!anchored)
- return
- anchored = 0
- user.visible_message("[user] unwrenches [src].", \
- "You unwrench [src].")
-
- else if(iswirecutter(O) && wrenchable)
- using_irrigation = !using_irrigation
- playsound(src, O.usesound, 50, 1)
- user.visible_message("[user] [using_irrigation ? "" : "dis"]connects [src]'s irrigation hoses.", \
- "You [using_irrigation ? "" : "dis"]connect [src]'s irrigation hoses.")
- for(var/obj/machinery/hydroponics/h in range(1,src))
- h.update_icon()
-
else if(istype(O, /obj/item/shovel/spade))
if(!myseed && !weedlevel)
to_chat(user, "[src] doesn't have any plants or weeds!")
@@ -905,6 +875,44 @@
else
return ..()
+/obj/machinery/hydroponics/wirecutter_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ else if(wrenchable)
+ using_irrigation = !using_irrigation
+ user.visible_message("[user] [using_irrigation ? "" : "dis"]connects [src]'s irrigation hoses.", \
+ "You [using_irrigation ? "" : "dis"]connect [src]'s irrigation hoses.")
+ for(var/obj/machinery/hydroponics/h in range(1,src))
+ h.update_icon()
+
+/obj/machinery/hydroponics/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_start_check(user, 0))
+ return
+ if(wrenchable)
+ if(using_irrigation)
+ to_chat(user, "Disconnect the hoses first!")
+ return
+
+ if(!anchored && !isinspace())
+ user.visible_message("[user] begins to wrench [src] into place.", "You begin to wrench [src] in place...")
+ if(I.use_tool(src, user, 20, volume = I.tool_volume))
+ if(anchored)
+ return
+ anchored = TRUE
+ user.visible_message("[user] wrenches [src] into place.", \
+ "You wrench [src] in place.")
+ else if(anchored)
+ user.visible_message("[user] begins to unwrench [src].", \
+ "You begin to unwrench [src]...")
+ if(I.use_tool(src, user, 20, volume = I.tool_volume))
+ if(!anchored)
+ return
+ anchored = FALSE
+ user.visible_message("[user] unwrenches [src].", \
+ "You unwrench [src].")
+
/obj/machinery/hydroponics/attack_hand(mob/user)
if(issilicon(user)) //How does AI know what plant is?
return
diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm
index 72b92f21964..36e58f46395 100644
--- a/code/modules/hydroponics/seed_extractor.dm
+++ b/code/modules/hydroponics/seed_extractor.dm
@@ -77,7 +77,7 @@
if(default_unfasten_wrench(user, O))
return
- if(default_deconstruction_crowbar(O))
+ if(default_deconstruction_crowbar(user, O))
return
if (istype(O,/obj/item/storage/bag/plants))
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index 4439993326c..dabd25c0f74 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -244,17 +244,14 @@
scanner.computer.inventory.Add(src)
to_chat(user, "[W]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'")
return 1
- else if(istype(W, /obj/item/kitchen/knife) || iswirecutter(W))
- if(carved)
- return 1
- to_chat(user, "You begin to carve out [title].")
- if(do_after(user, 30 * W.toolspeed, target = src))
- to_chat(user, "You carve out the pages from [title]! You didn't want to read it anyway.")
- carved = 1
- return 1
+ else if(istype(W, /obj/item/kitchen/knife) && !carved)
+ carve_book(user, W)
else
return ..()
+/obj/item/book/wirecutter_act(mob/user, obj/item/I)
+ return carve_book(user, I)
+
/obj/item/book/attack(mob/M, mob/living/user)
if(user.a_intent == INTENT_HELP)
force = 0
@@ -264,6 +261,17 @@
attack_verb = list("bashed", "whacked")
..()
+/obj/item/book/proc/carve_book(mob/user, obj/item/I)
+ if(!I.sharp && I.tool_behaviour != TOOL_WIRECUTTER) //Only sharp and wirecutter things can carve books
+ to_chat(user, "")
+ return
+ if(carved)
+ return
+ to_chat(user, "You begin to carve out [title].")
+ if(I.use_tool(src, user, 30, volume = I.tool_volume))
+ to_chat(user, "You carve out the pages from [title]! You didn't want to read it anyway.")
+ carved = TRUE
+ return TRUE
/*
* Barcode Scanner
*/
diff --git a/code/modules/logic/logic_base.dm b/code/modules/logic/logic_base.dm
index 50aecd79283..e2e4450c982 100644
--- a/code/modules/logic/logic_base.dm
+++ b/code/modules/logic/logic_base.dm
@@ -210,7 +210,7 @@
to_chat(user, "You [panel_open ? "open" : "close"] the access panel.")
return 1
if(panel_open && istype(O, /obj/item/crowbar))
- default_deconstruction_crowbar(O)
+ default_deconstruction_crowbar(user, O)
return 1
return ..()
diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm
index df943d6f30d..ee3eb10598a 100644
--- a/code/modules/mining/equipment/kinetic_crusher.dm
+++ b/code/modules/mining/equipment/kinetic_crusher.dm
@@ -40,21 +40,24 @@
. += "It has \a [T] attached, which causes [T.effect_desc()]."
/obj/item/twohanded/kinetic_crusher/attackby(obj/item/I, mob/living/user)
- if(iscrowbar(I))
- if(LAZYLEN(trophies))
- to_chat(user, "You remove [src]'s trophies.")
- playsound(loc, I.usesound, 100, 1)
- for(var/t in trophies)
- var/obj/item/crusher_trophy/T = t
- T.remove_from(src, user)
- else
- to_chat(user, "There are no trophies on [src].")
- else if(istype(I, /obj/item/crusher_trophy))
+ if(istype(I, /obj/item/crusher_trophy))
var/obj/item/crusher_trophy/T = I
T.add_to(src, user)
else
return ..()
+/obj/item/twohanded/kinetic_crusher/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(LAZYLEN(trophies))
+ to_chat(user, "You remove [src]'s trophies.")
+ for(var/t in trophies)
+ var/obj/item/crusher_trophy/T = t
+ T.remove_from(src, user)
+ else
+ to_chat(user, "There are no trophies on [src].")
+
/obj/item/twohanded/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user)
if(!wielded)
to_chat(user, "[src] is too heavy to use with one hand. You fumble and drop everything.")
diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm
index bab4c8bee1a..922b18023a3 100644
--- a/code/modules/mining/machine_redemption.dm
+++ b/code/modules/mining/machine_redemption.dm
@@ -188,13 +188,6 @@
/obj/machinery/mineral/ore_redemption/attackby(obj/item/W, mob/user, params)
if(exchange_parts(user, W))
return
- if(default_unfasten_wrench(user, W))
- return
- if(default_deconstruction_screwdriver(user, "ore_redemption-open", "ore_redemption", W))
- updateUsrDialog()
- return
- if(default_deconstruction_crowbar(W))
- return
if(!powered())
return
@@ -208,12 +201,6 @@
interact(user)
return
- if(ismultitool(W) && panel_open)
- input_dir = turn(input_dir, -90)
- output_dir = turn(output_dir, -90)
- to_chat(user, "You change [src]'s I/O settings, setting the input to [dir2text(input_dir)] and the output to [dir2text(output_dir)].")
- return
-
if(istype(W, /obj/item/disk/design_disk))
if(user.drop_item())
W.forceMove(src)
@@ -223,6 +210,32 @@
return ..()
+
+/obj/machinery/mineral/ore_redemption/crowbar_act(mob/user, obj/item/I)
+ if(default_deconstruction_crowbar(user, I))
+ return TRUE
+
+/obj/machinery/mineral/ore_redemption/multitool_act(mob/user, obj/item/I)
+ if(!panel_open)
+ return
+ . = TRUE
+ if(!powered())
+ return
+ if(!I.tool_start_check(user, 0))
+ return
+ input_dir = turn(input_dir, -90)
+ output_dir = turn(output_dir, -90)
+ to_chat(user, "You change [src]'s I/O settings, setting the input to [dir2text(input_dir)] and the output to [dir2text(output_dir)].")
+
+/obj/machinery/mineral/ore_redemption/screwdriver_act(mob/user, obj/item/I)
+ if(default_deconstruction_screwdriver(user, "ore_redemption-open", "ore_redemption", I))
+ updateUsrDialog()
+ return TRUE
+
+/obj/machinery/mineral/ore_redemption/wrench_act(mob/user, obj/item/I)
+ if(default_unfasten_wrench(user, I))
+ return TRUE
+
/obj/machinery/mineral/ore_redemption/attack_hand(mob/user)
if(..())
return
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index c8fbba6fe51..663bbc742f2 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -187,7 +187,7 @@
if(istype(I, /obj/item/crowbar))
if(inserted_id)
inserted_id.forceMove(loc) //Prevents deconstructing the ORM from deleting whatever ID was inside it.
- default_deconstruction_crowbar(I)
+ default_deconstruction_crowbar(user, I)
return 1
if(istype(I, /obj/item/mining_voucher))
if(!powered())
diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm
index 869864e5768..fdd6b15e8ae 100644
--- a/code/modules/mining/minebot.dm
+++ b/code/modules/mining/minebot.dm
@@ -88,28 +88,41 @@
/mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I, mob/user, params)
- if(iswelder(I) && user.a_intent == INTENT_HELP)
- var/obj/item/weldingtool/W = I
- if(W.welding && !stat)
- if(AIStatus != AI_OFF && AIStatus != AI_IDLE)
- to_chat(user, "[src] is moving around too much to repair!")
- return
- if(do_after_once(user, 15, target = src))
- if(maxHealth == health)
- to_chat(user, "[src] is at full integrity.")
- else
- adjustBruteLoss(-20)
- to_chat(user, "You repair some of the armor on [src].")
- return
if(istype(I, /obj/item/mining_scanner) || istype(I, /obj/item/t_scanner/adv_mining_scanner))
to_chat(user, "You instruct [src] to drop any collected ore.")
DropOre()
return
- if(iscrowbar(I) || istype(I, /obj/item/borg/upgrade/modkit))
+ if(istype(I, /obj/item/borg/upgrade/modkit))
I.melee_attack_chain(user, stored_gun, params)
return
..()
+/mob/living/simple_animal/hostile/mining_drone/crowbar_act(mob/user, obj/item/I)
+ if(user.a_intent != INTENT_HELP)
+ return
+ . = TRUE
+ if(!I.tool_start_check(user, 0))
+ return
+ I.melee_attack_chain(user, stored_gun)
+
+/mob/living/simple_animal/hostile/mining_drone/welder_act(mob/user, obj/item/I)
+ if(user.a_intent != INTENT_HELP)
+ return
+ . = TRUE
+ if(health == maxHealth)
+ to_chat(user, "[src] doesn't need repairing!")
+ return
+ if(!I.tool_use_check(user, 1))
+ return
+ if(AIStatus != AI_OFF && AIStatus != AI_IDLE)
+ to_chat(user, "[src] is moving around too much to repair!")
+ return
+ WELDER_ATTEMPT_REPAIR_MESSAGE
+ if(I.use_tool(src, user, 15, 1, volume = I.tool_volume) && health != maxHealth)
+ adjustBruteLoss(-20)
+ WELDER_REPAIR_SUCCESS_MESSAGE
+ return
+
/mob/living/simple_animal/hostile/mining_drone/death()
DropOre(0)
if(stored_gun)
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index 37ff230ff44..d8daffac00a 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -21,15 +21,16 @@
if(is_mining_level(z))
score_oremined++ //When ore spawns, increment score. Only include ore spawned on mining level (No Clown Planet)
-/obj/item/stack/ore/attackby(obj/item/I, mob/user, params)
- ..()
- if(istype(I, /obj/item/weldingtool))
- var/obj/item/weldingtool/W = I
- if(W.remove_fuel(15) && refined_type)
- new refined_type(get_turf(src.loc), amount)
- qdel(src)
- else if(W.isOn())
- to_chat(user, "Not enough fuel to smelt [src].")
+/obj/item/stack/ore/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!refined_type)
+ to_chat(user, "You can't smelt [src] into anything useful!")
+ return
+ if(!I.use_tool(src, user, 0, 15, volume = I.tool_volume))
+ return
+ new refined_type(drop_location(), amount)
+ to_chat(user, "You smelt [src] into its refined form!")
+ qdel(src)
/obj/item/stack/ore/Crossed(atom/movable/AM, oldloc)
var/obj/item/storage/bag/ore/OB
@@ -144,14 +145,6 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
refined_type = /obj/item/stack/sheet/mineral/plasma
materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT)
-/obj/item/stack/ore/plasma/attackby(obj/item/I as obj, mob/user as mob, params)
- if(istype(I, /obj/item/weldingtool))
- var/obj/item/weldingtool/W = I
- if(W.welding)
- to_chat(user, "You can't hit a high enough temperature to smelt [src] properly!")
- else
- ..()
-
/obj/item/stack/ore/silver
name = "silver ore"
icon_state = "Silver ore"
@@ -443,21 +436,24 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
overlays = list()
string_attached = null
to_chat(user, "You detach the string from the coin.")
- else if(istype(W,/obj/item/weldingtool))
- var/obj/item/weldingtool/WT = W
- if(WT.welding && WT.remove_fuel(0, user))
- var/typelist = list("iron" = /obj/item/clothing/gloves/ring,
- "silver" = /obj/item/clothing/gloves/ring/silver,
- "gold" = /obj/item/clothing/gloves/ring/gold,
- "plasma" = /obj/item/clothing/gloves/ring/plasma,
- "uranium" = /obj/item/clothing/gloves/ring/uranium)
- var/typekey = typelist[cmineral]
- if(ispath(typekey))
- to_chat(user, "You make [src] into a ring.")
- new typekey(get_turf(loc))
- qdel(src)
else ..()
+/obj/item/coin/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ var/typelist = list("iron" = /obj/item/clothing/gloves/ring,
+ "silver" = /obj/item/clothing/gloves/ring/silver,
+ "gold" = /obj/item/clothing/gloves/ring/gold,
+ "plasma" = /obj/item/clothing/gloves/ring/plasma,
+ "uranium" = /obj/item/clothing/gloves/ring/uranium)
+ var/typekey = typelist[cmineral]
+ if(ispath(typekey))
+ to_chat(user, "You make [src] into a ring.")
+ new typekey(get_turf(loc))
+ qdel(src)
+
+
/obj/item/coin/attack_self(mob/user as mob)
if(cooldown < world.time - 15)
var/coinflip = pick(sideslist)
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index ffe70211a37..e3cf646d579 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -90,25 +90,28 @@
return
// Maybe later add encryption key support, but that's a pain in the neck atm
- if(isscrewdriver(O))
- if(radio)
- user.visible_message("[user] begins to uninstall the radio from [src]...", \
- "You start to uninstall the radio from [src]...")
- if(do_after(user, 40 * O.toolspeed, target = src))
- uninstall_radio()
- new /obj/item/mmi_radio_upgrade(get_turf(src))
- user.visible_message("[user] uninstalls the radio from [src].", \
- "You uninstall the radio from [src].")
- else
- to_chat(user, "There is no radio in [src]!")
- return
if(brainmob)
O.attack(brainmob, user)//Oh noooeeeee
// Brainmobs can take damage, but they can't actually die. Maybe should fix.
return
- ..()
+ return ..()
+/obj/item/mmi/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ if(!radio)
+ to_chat(user, "There is no radio in [src]!")
+ return
+ user.visible_message("[user] begins to uninstall the radio from [src]...", \
+ "You start to uninstall the radio from [src]...")
+ if(!I.use_tool(src, user, 40, volume = I.tool_volume) || !radio)
+ return
+ uninstall_radio()
+ new /obj/item/mmi_radio_upgrade(get_turf(src))
+ user.visible_message("[user] uninstalls the radio from [src].", \
+ "You uninstall the radio from [src].")
/obj/item/mmi/attack_self(mob/user as mob)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 037b9fb7d87..1eb3936748d 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -35,6 +35,73 @@ emp_act
return (..(P , def_zone))
+/mob/living/carbon/human/screwdriver_act(mob/user, obj/item/I)
+ if(!can_operate(src)) //Checks if mob is lying down on table for surgery
+ return
+ if(!ismachine(src))
+ return
+ if(user.a_intent != INTENT_HELP)
+ return
+ if(attempt_initiate_surgery(I, src, user))
+ return TRUE
+
+/mob/living/carbon/human/welder_act(mob/user, obj/item/I)
+ if(user.a_intent != INTENT_HELP)
+ return
+ if(!I.tool_use_check(user, 1))
+ return
+ var/obj/item/organ/external/S = bodyparts_by_name[user.zone_selected]
+ if(!S)
+ return
+ if(!S.is_robotic() || S.open == 2)
+ return
+ . = TRUE
+ if(S.brute_dam > ROBOLIMB_SELF_REPAIR_CAP)
+ to_chat(user, "The damage is far too severe to patch over externally.")
+ return
+
+ if(!S.brute_dam)
+ to_chat(user, "Nothing to fix!")
+ return
+
+ var/surgery_time = 0
+ if(user == src)
+ surgery_time = 10
+ if(!I.use_tool(src, user, surgery_time, amount = 1, volume = I.tool_volume))
+ return
+ var/rembrute = HEALPERWELD
+ var/nrembrute = 0
+ var/childlist
+ if(!isnull(S.children))
+ childlist = S.children.Copy()
+ var/parenthealed = FALSE
+ while(rembrute > 0)
+ var/obj/item/organ/external/E
+ if(S.brute_dam)
+ E = S
+ else if(LAZYLEN(childlist))
+ E = pick_n_take(childlist)
+ if(!E.brute_dam || !E.is_robotic())
+ continue
+ else if(S.parent && !parenthealed)
+ E = S.parent
+ parenthealed = TRUE
+ if(!E.brute_dam || !E.is_robotic())
+ break
+ else
+ break
+ nrembrute = max(rembrute - E.brute_dam, 0)
+ E.heal_damage(rembrute,0,0,1)
+ rembrute = nrembrute
+ user.visible_message("[user] patches some dents on [src]'s [E.name] with [I].")
+ if(bleed_rate && isSynthetic())
+ bleed_rate = 0
+ user.visible_message("[user] patches some leaks on [src] with [I].")
+ if(IgniteMob())
+ message_admins("[key_name_admin(user)] set [key_name_admin(src)] on fire with [I]")
+ log_game("[key_name(user)] set [key_name(src)] on fire with [I]")
+
+
/mob/living/carbon/human/check_projectile_dismemberment(obj/item/projectile/P, def_zone)
var/obj/item/organ/external/affecting = get_organ(check_zone(def_zone))
if(affecting && !affecting.cannot_amputate && affecting.get_damage() >= (affecting.max_damage - P.dismemberment))
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index ba822c9cc5e..8ab2b44865f 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -270,6 +270,13 @@
take_organ_damage(acidpwr * min(1, acid_volume * 0.1))
return 1
+/mob/living/welder_act(mob/user, obj/item/I)
+ if(!I.tool_use_check(null, 0)) //Don't need the message, just if it succeeded
+ return
+ if(IgniteMob())
+ message_admins("[key_name_admin(user)] set [key_name_admin(src)] on fire with [I]")
+ log_game("[key_name(user)] set [key_name(src)] on fire with [I]")
+
/mob/living/proc/updatehealth(reason = "none given")
if(status_flags & GODMODE)
health = maxHealth
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index adc1ace2fa8..8ae4fc6a419 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -1125,6 +1125,8 @@ var/list/ai_verbs_default = list(
else
return ..()
+/mob/living/silicon/ai/welder_act()
+ return
/mob/living/silicon/ai/proc/control_integrated_radio()
set name = "Radio Settings"
diff --git a/code/modules/mob/living/silicon/decoy/decoy.dm b/code/modules/mob/living/silicon/decoy/decoy.dm
index d8f82cf9d93..64965ae518f 100644
--- a/code/modules/mob/living/silicon/decoy/decoy.dm
+++ b/code/modules/mob/living/silicon/decoy/decoy.dm
@@ -19,6 +19,9 @@
else
return ..()
+/mob/living/silicon/decoy/welder_act()
+ return
+
/mob/living/silicon/decoy/syndicate
faction = list("syndicate")
name = "R.O.D.G.E.R"
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 4e280b20de8..a022e29eb5b 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -470,6 +470,9 @@
close_up()
return
+/mob/living/silicon/pai/welder_act()
+ return
+
/mob/living/silicon/pai/attack_hand(mob/user as mob)
if(stat == DEAD)
return
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 1cded581118..e148a4fe75a 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -621,28 +621,7 @@ var/list/robot_verbs_default = list(
return
- if(istype(W, /obj/item/weldingtool) && user.a_intent == INTENT_HELP)
- if(W == module_active)
- return
- if(!getBruteLoss())
- to_chat(user, "Nothing to fix!")
- return
- else if(!getBruteLoss(TRUE))
- to_chat(user, "The damaged components are beyond saving!")
- return
- var/obj/item/weldingtool/WT = W
- user.changeNext_move(CLICK_CD_MELEE)
- if(WT.remove_fuel(0))
- playsound(src.loc, W.usesound, 50, 1)
- adjustBruteLoss(-30)
- add_fingerprint(user)
- user.visible_message("\The [user] patches some dents on \the [src] with \the [WT].")
- else
- to_chat(user, "Need more welding fuel!")
- return
-
-
- else if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == INTENT_HELP && (wiresexposed || istype(src, /mob/living/silicon/robot/drone)))
+ if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == INTENT_HELP && (wiresexposed || istype(src, /mob/living/silicon/robot/drone)))
user.changeNext_move(CLICK_CD_MELEE)
if(!getFireLoss())
to_chat(user, "Nothing to fix!")
@@ -657,58 +636,6 @@ var/list/robot_verbs_default = list(
coil.use(1)
user.visible_message("\The [user] fixes some of the burnt wires on \the [src] with \the [coil].")
- else if(istype(W, /obj/item/crowbar)) // crowbar means open or close the cover
- if(opened)
- if(cell)
- to_chat(user, "You close the cover.")
- opened = 0
- update_icons()
- else if(wiresexposed && wires.IsAllCut())
- //Cell is out, wires are exposed, remove MMI, produce damaged chassis, baleet original mob.
- if(!mmi)
- to_chat(user, "[src] has no brain to remove.")
- return
-
- to_chat(user, "You jam the crowbar into the robot and begin levering the securing bolts.")
- if(do_after(user, 30 * W.toolspeed, target = src))
- user.visible_message("[user] deconstructs [src]!", "You unfasten the securing bolts, and [src] falls to pieces!")
- deconstruct()
- else
- // Okay we're not removing the cell or an MMI, but maybe something else?
- var/list/removable_components = list()
- for(var/V in components)
- if(V == "power cell") continue
- var/datum/robot_component/C = components[V]
- if(C.installed == 1 || C.installed == -1)
- removable_components += V
- if(module)
- removable_components += module.custom_removals
- var/remove = input(user, "Which component do you want to pry out?", "Remove Component") as null|anything in removable_components
- if(!remove)
- return
- if(module && module.handle_custom_removal(remove, user, W, params))
- return
- var/datum/robot_component/C = components[remove]
- var/obj/item/robot_parts/robot_component/I = C.wrapped
- to_chat(user, "You remove \the [I].")
- if(istype(I))
- I.brute = C.brute_damage
- I.burn = C.electronics_damage
-
- I.loc = src.loc
- var/was_installed = C.installed
- C.installed = 0
- if(was_installed == 1)
- C.uninstall()
-
- else
- if(locked)
- to_chat(user, "The cover is locked and cannot be opened.")
- else
- to_chat(user, "You open the cover.")
- opened = 1
- update_icons()
-
else if(istype(W, /obj/item/stock_parts/cell) && opened) // trying to put a cell inside
var/datum/robot_component/C = components["power cell"]
if(wiresexposed)
@@ -729,24 +656,6 @@ var/list/robot_verbs_default = list(
C.electronics_damage = 0
diag_hud_set_borgcell()
- else if(istype(W, /obj/item/wirecutters) || istype(W, /obj/item/multitool))
- if(wiresexposed)
- wires.Interact(user)
- else
- to_chat(user, "You can't reach the wiring.")
-
- else if(istype(W, /obj/item/screwdriver) && opened && !cell) // haxing
- wiresexposed = !wiresexposed
- to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]")
- update_icons()
-
- else if(istype(W, /obj/item/screwdriver) && opened && cell) // radio
- if(radio)
- radio.attackby(W,user)//Push it to the radio to let it handle everything
- else
- to_chat(user, "Unable to locate a radio.")
- update_icons()
-
else if(istype(W, /obj/item/encryptionkey/) && opened)
if(radio)//sanityyyyyy
radio.attackby(W,user)//GTFO, you have your own procs
@@ -801,6 +710,108 @@ var/list/robot_verbs_default = list(
else
return ..()
+/mob/living/silicon/robot/wirecutter_act(mob/user, obj/item/I)
+ if(!opened)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = 0))
+ return
+ if(wiresexposed)
+ wires.Interact(user)
+
+/mob/living/silicon/robot/multitool_act(mob/user, obj/item/I)
+ if(!opened)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = 0))
+ return
+ if(wiresexposed)
+ wires.Interact(user)
+
+/mob/living/silicon/robot/screwdriver_act(mob/user, obj/item/I)
+ if(!opened)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = 0))
+ return
+ if(!cell) // haxing
+ wiresexposed = !wiresexposed
+ to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]")
+ update_icons()
+ I.play_tool_sound(user, I.tool_volume)
+ else //radio check
+ if(radio)
+ radio.screwdriver_act(user, I)//Push it to the radio to let it handle everything
+ else
+ to_chat(user, "Unable to locate a radio.")
+ update_icons()
+
+/mob/living/silicon/robot/crowbar_act(mob/user, obj/item/I)
+ if(user.a_intent != INTENT_HELP)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ if(!opened)
+ if(locked)
+ to_chat(user, "The cover is locked and cannot be opened.")
+ return
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ to_chat(user, "You open the cover.")
+ opened = TRUE
+ update_icons()
+ return
+ else if(cell)
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ to_chat(user, "You close the cover.")
+ opened = FALSE
+ update_icons()
+ return
+ else if(wiresexposed && wires.IsAllCut())
+ //Cell is out, wires are exposed, remove MMI, produce damaged chassis, baleet original mob.
+ if(!mmi)
+ to_chat(user, "[src] has no brain to remove.")
+ return
+ to_chat(user, "You jam the crowbar into the robot and begin levering the securing bolts...")
+ if(I.use_tool(src, user, 30, volume = I.tool_volume))
+ user.visible_message("[user] deconstructs [src]!", "You unfasten the securing bolts, and [src] falls to pieces!")
+ deconstruct()
+ return
+ // Okay we're not removing the cell or an MMI, but maybe something else?
+ var/list/removable_components = list()
+ for(var/V in components)
+ if(V == "power cell")
+ continue
+ var/datum/robot_component/C = components[V]
+ if(C.installed == 1 || C.installed == -1)
+ removable_components += V
+ if(module)
+ removable_components += module.custom_removals
+ var/remove = input(user, "Which component do you want to pry out?", "Remove Component") as null|anything in removable_components
+ if(!remove)
+ return
+ if(module && module.handle_custom_removal(remove, user, I))
+ return
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ var/datum/robot_component/C = components[remove]
+ var/obj/item/robot_parts/robot_component/thing = C.wrapped
+ to_chat(user, "You remove \the [thing].")
+ if(istype(thing))
+ thing.brute = C.brute_damage
+ thing.burn = C.electronics_damage
+
+ thing.loc = loc
+ var/was_installed = C.installed
+ C.installed = 0
+ if(was_installed == 1)
+ C.uninstall()
+
+
+
+
/mob/living/silicon/robot/attacked_by(obj/item/I, mob/living/user, def_zone)
if(I.force && I.damtype != STAMINA && stat != DEAD) //only sparks if real damage is dealt.
spark_system.start()
@@ -1457,4 +1468,3 @@ var/list/robot_verbs_default = list(
SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT)
sync_lighting_plane_alpha()
-
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 76c7f5bc1af..d7754ff747b 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -106,7 +106,7 @@
R.module_actions.Cut()
// Return true in an overridden subtype to prevent normal removal handling
-/obj/item/robot_module/proc/handle_custom_removal(component_id, mob/living/user, obj/item/W, params)
+/obj/item/robot_module/proc/handle_custom_removal(component_id, mob/living/user, obj/item/W)
return FALSE
/obj/item/robot_module/proc/handle_death(gibbed)
@@ -358,10 +358,10 @@
fix_modules()
-/obj/item/robot_module/miner/handle_custom_removal(component_id, mob/living/user, obj/item/W, params)
+/obj/item/robot_module/miner/handle_custom_removal(component_id, mob/living/user, obj/item/W)
if(component_id == "KA modkits")
for(var/obj/item/gun/energy/kinetic_accelerator/cyborg/D in src)
- D.attackby(W, user, params)
+ D.attackby(W, user)
return TRUE
return ..()
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 51841440989..e70c00158a7 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -100,6 +100,25 @@
/mob/living/silicon/IsAdvancedToolUser()
return TRUE
+/mob/living/silicon/robot/welder_act(mob/user, obj/item/I)
+ if(user.a_intent != INTENT_HELP)
+ return
+ if(user == src) //No self-repair dummy
+ return
+ . = TRUE
+ if(!getBruteLoss())
+ to_chat(user, "Nothing to fix!")
+ return
+ else if(!getBruteLoss(TRUE))
+ to_chat(user, "The damaged components are beyond saving!")
+ return
+ if(!I.use_tool(src, user, volume = I.tool_volume))
+ return
+ adjustBruteLoss(-30)
+ add_fingerprint(user)
+ user.visible_message("[user] patches some dents on [src] with [I].")
+
+
/mob/living/silicon/bullet_act(var/obj/item/projectile/Proj)
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index c9613043836..7f1868b0bdb 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -357,25 +357,25 @@
user.visible_message("[user] uses [W] to pull [paicard] out of [bot_name]!","You pull [paicard] out of [bot_name] with [W].")
ejectpai(user)
else
- user.changeNext_move(CLICK_CD_MELEE)
- if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM)
- if(health >= maxHealth)
- to_chat(user, "[src] does not need a repair!")
- return
- if(!open)
- to_chat(user, "Unable to repair with the maintenance panel closed!")
- return
- var/obj/item/weldingtool/WT = W
- if(WT.remove_fuel(0, user))
- adjustHealth(-10)
- add_fingerprint(user)
- user.visible_message("[user] repairs [src]!","You repair [src].")
- else
- to_chat(user, "The welder must be on for this task!")
- else
- if(W.force) //if force is non-zero
- do_sparks(5, 1, src)
- ..()
+ return ..()
+
+/mob/living/simple_animal/bot/welder_act(mob/user, obj/item/I)
+ if(user.a_intent != INTENT_HELP)
+ return
+ if(user == src) //No self-repair dummy
+ return
+ . = TRUE
+ if(health >= maxHealth)
+ to_chat(user, "[src] does not need a repair!")
+ return
+ if(!open)
+ to_chat(user, "Unable to repair with the maintenance panel closed!")
+ return
+ if(!I.use_tool(src, user, volume = I.tool_volume))
+ return
+ adjustBruteLoss(-10)
+ add_fingerprint(user)
+ user.visible_message("[user] repairs [src]!","You repair [src].")
/mob/living/simple_animal/bot/bullet_act(obj/item/projectile/Proj)
if(Proj && (Proj.damage_type == BRUTE || Proj.damage_type == BURN))
diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm
index 5feebb53059..52155a73a44 100644
--- a/code/modules/mob/living/simple_animal/bot/construction.dm
+++ b/code/modules/mob/living/simple_animal/bot/construction.dm
@@ -96,12 +96,10 @@ var/robot_arm = /obj/item/robot_parts/l_arm
icon_state = "[lasercolor]ed209_shell"
if(3)
- if(istype(W, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = W
- if(WT.remove_fuel(0,user))
- build_step++
- name = "shielded frame assembly"
- to_chat(user, "You weld the vest to [src].")
+ if(W.tool_behaviour == TOOL_WELDER && W.use_tool(src, user, volume = W.tool_volume))
+ build_step++
+ name = "shielded frame assembly"
+ to_chat(user, "You weld the vest to [src].")
if(4)
switch(lasercolor)
if("b")
@@ -440,19 +438,15 @@ var/robot_arm = /obj/item/robot_parts/l_arm
/obj/item/secbot_assembly/attackby(obj/item/I, mob/user, params)
..()
- if(istype(I, /obj/item/weldingtool))
+ if(I.tool_behaviour == TOOL_WELDER && I.use_tool(src, user, volume = I.tool_volume))
if(!build_step)
- var/obj/item/weldingtool/WT = I
- if(WT.remove_fuel(0, user))
- build_step++
- overlays += "hs_hole"
- to_chat(user, "You weld a hole in [src]!")
+ build_step++
+ overlays += "hs_hole"
+ to_chat(user, "You weld a hole in [src]!")
else if(build_step == 1)
- var/obj/item/weldingtool/WT = I
- if(WT.remove_fuel(0, user))
- build_step--
- overlays -= "hs_hole"
- to_chat(user, "You weld the hole in [src] shut!")
+ build_step--
+ overlays -= "hs_hole"
+ to_chat(user, "You weld the hole in [src] shut!")
else if(isprox(I) && (build_step == 1))
if(!user.unEquip(I))
diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
index 424d852d56b..dd248b88a62 100644
--- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
+++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
@@ -87,19 +87,6 @@
update_icon()
return 1
- else if(iswelder(O) && user.a_intent == INTENT_HELP)
- var/obj/item/weldingtool/WT = O
- user.changeNext_move(CLICK_CD_MELEE)
- if(WT.remove_fuel(0))
- if(health < maxHealth)
- adjustHealth(-5)
- playsound(loc, WT.usesound, 50, 1)
- add_fingerprint(user)
- visible_message("[user] has spot-welded some of the damage to [src]!")
- else
- to_chat(user, "[src] is undamaged!")
- else
- to_chat(user, "Need more welding fuel!")
else if(istype(O, /obj/item/card/id) || istype(O, /obj/item/pda))
if(!mmi)
to_chat(user, "There's no reason to swipe your ID - the spiderbot has no brain to remove.")
@@ -128,6 +115,23 @@
else
..()
+/mob/living/simple_animal/spiderbot/welder_act(mob/user, obj/item/I)
+ if(user.a_intent != INTENT_HELP)
+ return
+ if(user == src) //No self-repair dummy
+ return
+ if(health >= maxHealth)
+ to_chat(user, "[src] does not need repairing!")
+ return
+ to_chat(user, "Unable to repair with the maintenance panel closed!")
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, volume = I.tool_volume))
+ return
+ adjustHealth(-5)
+ add_fingerprint(user)
+ user.visible_message("[user] repairs [src]!","You repair [src].")
+
/mob/living/simple_animal/spiderbot/emag_act(mob/living/user)
if(emagged)
to_chat(user, "[src] doesn't seem to respond.")
diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm
index b58dfd4cc66..1e43884df9a 100644
--- a/code/modules/modular_computers/computers/item/computer.dm
+++ b/code/modules/modular_computers/computers/item/computer.dm
@@ -325,23 +325,6 @@
qdel(src)
return
- if(istype(W, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = W
- if(!WT.isOn())
- to_chat(user, "\The [W] is off.")
- return
-
- if(obj_integrity == max_integrity)
- to_chat(user, "\The [src] does not require repairs.")
- return
-
- to_chat(user, "You begin repairing damage to \the [src]...")
- var/dmg = round(max_integrity - obj_integrity)
- if(WT.remove_fuel(round(dmg/75)) && do_after(usr, dmg/10))
- obj_integrity = max_integrity
- to_chat(user, "You repair \the [src].")
- return
-
if(istype(W, /obj/item/screwdriver))
if(!all_components.len)
to_chat(user, "This device doesn't have any components installed.")
@@ -369,6 +352,12 @@
..()
+/obj/item/modular_computer/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ default_welder_repair(user, I)
+
// Used by processor to relay qdel() to machinery type.
/obj/item/modular_computer/proc/relay_qdel()
return
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index e7be4698fcf..0954127b00a 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -167,10 +167,6 @@
updateUsrDialog()
else
to_chat(user, "This cartridge is not yet ready for replacement! Use up the rest of the toner.")
- else if(istype(O, /obj/item/wrench))
- playsound(loc, O.usesound, 50, 1)
- anchored = !anchored
- to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].")
else if(istype(O, /obj/item/grab)) //For ass-copying.
var/obj/item/grab/G = O
if(ismob(G.affecting) && G.affecting != ass)
@@ -185,6 +181,10 @@
else
return ..()
+/obj/machinery/photocopier/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ default_unfasten_wrench(user, I)
+
/obj/machinery/photocopier/proc/copy(var/obj/item/paper/copy)
var/obj/item/paper/c = new /obj/item/paper (loc)
c.info = copy.info
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 4d7dafa69bf..83b3578495c 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -441,59 +441,6 @@
if(issilicon(user) && get_dist(src,user)>1)
return src.attack_hand(user)
- if(istype(W, /obj/item/crowbar)) //Using crowbar
- if(opened) // a) on open apc
- if(has_electronics==1)
- if(terminal)
- to_chat(user, "Disconnect the wires first!")
- return
- playsound(src.loc, W.usesound, 50, 1)
- to_chat(user, "You are trying to remove the power control board..." )
- if(do_after(user, 50*W.toolspeed, target = src))
- if(has_electronics==1)
- has_electronics = 0
- if(stat & BROKEN)
- user.visible_message(\
- "[user.name] has broken the power control board inside [src.name]!",
- "You break the charred power control board and remove the remains.",
- "You hear a crack.")
- return
- //SSticker.mode:apcs-- //XSI said no and I agreed. -rastaf0
- else if(emagged) // We emag board, not APC's frame
- emagged = FALSE
- user.visible_message(
- "[user.name] has discarded emaged power control board from [src.name]!",
- "You discarded shorten board.")
- return
- else if(malfhack) // AI hacks board, not APC's frame
- user.visible_message(\
- "[user.name] has discarded strangely programmed power control board from [src.name]!",
- "You discarded strangely programmed board.")
- malfai = null
- malfhack = 0
- return
- else
- user.visible_message(\
- "[user.name] has removed the power control board from [src.name]!",
- "You remove the power control board.")
- new /obj/item/apc_electronics(loc)
- return
- else if(opened!=2) //cover isn't removed
- opened = 0
- coverlocked = TRUE //closing cover relocks it
- update_icon()
- return
- else if(!(stat & BROKEN)) // b) on closed and not broken APC
- if(coverlocked && !(stat & MAINT)) // locked...
- to_chat(user, "The cover is locked and cannot be opened!")
- return
- else if(panel_open) // wires are exposed
- to_chat(user, "Exposed wires prevents you from opening it!")
- return
- else
- opened = 1
- update_icon()
- return
else if (istype(W, /obj/item/stock_parts/cell) && opened) // trying to put a cell inside
if(cell)
@@ -513,35 +460,6 @@
chargecount = 0
update_icon()
- else if(istype(W, /obj/item/screwdriver)) // haxing
- if(opened)
- if(cell)
- to_chat(user, "Close the APC first!") //Less hints more mystery!
- return
- else
- if(has_electronics==1)
- has_electronics = 2
- stat &= ~MAINT
- playsound(src.loc, W.usesound, 50, 1)
- to_chat(user, "You screw the circuit electronics into place.")
- else if(has_electronics==2)
- has_electronics = 1
- stat |= MAINT
- playsound(src.loc, W.usesound, 50, 1)
- to_chat(user, "You unfasten the electronics.")
- else /* has_electronics==0 */
- to_chat(user, "There is nothing to secure!")
- return
- update_icon()
- else if(emagged)
- to_chat(user, "The interface is broken!")
- else if((stat & MAINT) && !opened)
- ..() //its an empty closed frame... theres no wires to expose!
- else
- panel_open = !panel_open
- to_chat(user, "The wires have been [panel_open ? "exposed" : "unexposed"]")
- update_icon()
-
else if(W.GetID()) // trying to unlock the interface with an ID card
togglelock(user)
@@ -581,9 +499,6 @@
make_terminal()
terminal.connect_to_network()
- else if(istype(W, /obj/item/wirecutters) && terminal && opened)
- terminal.dismantle(user, W)
-
else if(istype(W, /obj/item/apc_electronics) && opened)
if(has_electronics!=0) // there are already electronicks inside
to_chat(user, "You cannot put the board inside, there already is one!")
@@ -602,31 +517,6 @@
to_chat(user, "You place the power control board inside the frame.")
qdel(W)
- else if(istype(W, /obj/item/weldingtool) && opened && has_electronics==0 && !terminal)
- var/obj/item/weldingtool/WT = W
- if(WT.get_fuel() < 3)
- to_chat(user, "You need more welding fuel to complete this task!")
- return
- user.visible_message("[user.name] welds [src].", \
- "You start welding the APC frame...", \
- "You hear welding.")
- playsound(src.loc, WT.usesound, 50, 1)
- if(do_after(user, 50*W.toolspeed, target = src))
- if(!src || !WT.remove_fuel(3, user))
- return
- if((stat & BROKEN) || opened==2)
- new /obj/item/stack/sheet/metal(loc)
- user.visible_message(\
- "[user.name] has cut [src] apart with [W].",\
- "You disassembled the broken APC frame.")
- else
- new /obj/item/mounted/frame/apc_frame(loc)
- user.visible_message(\
- "[user.name] has cut [src] from the wall with [W].",\
- "You cut the APC frame from the wall.")
- qdel(src)
- return
-
else if(istype(W, /obj/item/mounted/frame/apc_frame) && opened)
if(!(stat & BROKEN || opened==2 || obj_integrity < max_integrity)) // There is nothing to repair
to_chat(user, "You found no reason for repairing this APC")
@@ -654,11 +544,110 @@
opened = 1
update_icon()
return
- else if(panel_open && !opened && is_wire_tool(W))
- wires.Interact(user)
else
return ..()
+
+/obj/machinery/power/apc/crowbar_act(mob/living/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_start_check(user, 0))
+ return
+ if(opened) // a) on open apc
+ if(has_electronics==1)
+ if(terminal)
+ to_chat(user, "Disconnect the wires first!")
+ return
+ to_chat(user, "You are trying to remove the power control board..." )
+ if(I.use_tool(src, user, 50, volume = I.tool_volume))
+ if(has_electronics==1)
+ has_electronics = 0
+ if(stat & BROKEN)
+ user.visible_message(\
+ "[user.name] has broken the power control board inside [src.name]!",
+ "You break the charred power control board and remove the remains.",
+ "You hear a crack.")
+ return
+ //SSticker.mode:apcs-- //XSI said no and I agreed. -rastaf0
+ else if(emagged) // We emag board, not APC's frame
+ emagged = FALSE
+ user.visible_message(
+ "[user.name] has discarded emaged power control board from [src.name]!",
+ "You discarded shorten board.")
+ return
+ else if(malfhack) // AI hacks board, not APC's frame
+ user.visible_message(\
+ "[user.name] has discarded strangely programmed power control board from [src.name]!",
+ "You discarded strangely programmed board.")
+ malfai = null
+ malfhack = 0
+ return
+ else
+ user.visible_message(\
+ "[user.name] has removed the power control board from [src.name]!",
+ "You remove the power control board.")
+ new /obj/item/apc_electronics(loc)
+ return
+ else if(opened!=2) //cover isn't removed
+ opened = 0
+ coverlocked = TRUE //closing cover relocks it
+ update_icon()
+ return
+ else if(!(stat & BROKEN)) // b) on closed and not broken APC
+ if(coverlocked && !(stat & MAINT)) // locked...
+ to_chat(user, "The cover is locked and cannot be opened!")
+ return
+ else if(panel_open) // wires are exposed
+ to_chat(user, "Exposed wires prevents you from opening it!")
+ return
+ else
+ opened = 1
+ update_icon()
+
+/obj/machinery/power/apc/screwdriver_act(mob/living/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ else if(opened)
+ if(cell && !(stat & MAINT))
+ to_chat(user, "Close the APC first!") //Less hints more mystery!
+ return
+ else
+ if(has_electronics==1)
+ has_electronics = 2
+ stat &= ~MAINT
+ to_chat(user, "You screw the circuit electronics into place.")
+ else if(has_electronics==2)
+ has_electronics = 1
+ stat |= MAINT
+ to_chat(user, "You unfasten the electronics.")
+ else
+ to_chat(user, "There is nothing to secure!")
+ return
+ update_icon()
+ else if(emagged)
+ to_chat(user, "The interface is broken!")
+ else
+ panel_open = !panel_open
+ to_chat(user, "The wires have been [panel_open ? "exposed" : "unexposed"]")
+ update_icon()
+
+
+/obj/machinery/power/apc/wirecutter_act(mob/living/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(panel_open && !opened)
+ wires.Interact(user)
+ else if(terminal && opened)
+ terminal.dismantle(user, I)
+
+/obj/machinery/power/apc/multitool_act(mob/living/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(panel_open && !opened)
+ wires.Interact(user)
+
/obj/machinery/power/apc/proc/togglelock(mob/living/user)
if(emagged)
to_chat(user, "The interface is broken!")
@@ -695,6 +684,26 @@
visible_message("The APC cover is knocked down!")
update_icon()
+/obj/machinery/power/apc/welder_act(mob/user, obj/item/I)
+ if(!opened || has_electronics || terminal)
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 3))
+ return
+ WELDER_ATTEMPT_SLICING_MESSAGE
+ if(I.use_tool(src, user, 50, amount = 3, volume = I.tool_volume))
+ if((stat & BROKEN) || opened==2)
+ new /obj/item/stack/sheet/metal(loc)
+ user.visible_message(\
+ "[user.name] has cut [src] apart with [I].",\
+ "You disassembled the broken APC frame.")
+ else
+ new /obj/item/mounted/frame/apc_frame(loc)
+ user.visible_message(\
+ "[user.name] has cut [src] from the wall with [I].",\
+ "You cut the APC frame from the wall.")
+ qdel(src)
+
/obj/machinery/power/apc/emag_act(user as mob)
if(!(emagged || malfhack)) // trying to unlock with an emag card
if(opened)
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 6d22afe282f..9f48d451f36 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -159,20 +159,10 @@ By design, d1 is the smallest direction and d2 is the highest
// - Multitool : get the power currently passing through the cable
//
/obj/structure/cable/attackby(obj/item/W, mob/user)
-
var/turf/T = get_turf(src)
if(T.intact)
return
- if(iswirecutter(W))
- if(shock(user, 50))
- return
- user.visible_message("[user] cuts the cable.", "You cut the cable.")
- investigate_log("was cut by [key_name(usr, 1)] in [get_area(user)]([T.x], [T.y], [T.z] - [ADMIN_JMP(T)])","wires")
- deconstruct()
- return
-
-
else if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/coil = W
if(coil.get_amount() < 1)
@@ -186,14 +176,6 @@ By design, d1 is the smallest direction and d2 is the highest
R.loaded.cable_join(src, user)
R.is_empty(user)
- else if(istype(W, /obj/item/multitool))
-
- if(powernet && (powernet.avail > 0)) // is it powered?
- to_chat(user, "Total power: [DisplayPower(powernet.avail)]\nLoad: [DisplayPower(powernet.load)]\nExcess power: [DisplayPower(surplus())]")
- else
- to_chat(user, "The cable is not powered.")
- shock(user, 5, 0.2)
-
else if(istype(W, /obj/item/toy/crayon))
var/obj/item/toy/crayon/C = W
cable_color(C.colourName)
@@ -204,6 +186,32 @@ By design, d1 is the smallest direction and d2 is the highest
add_fingerprint(user)
+/obj/structure/cable/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ var/turf/T = get_turf(src)
+ if(T.intact)
+ return
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(powernet && (powernet.avail > 0)) // is it powered?
+ to_chat(user, "Total power: [DisplayPower(powernet.avail)]\nLoad: [DisplayPower(powernet.load)]\nExcess power: [DisplayPower(surplus())]")
+ else
+ to_chat(user, "The cable is not powered.")
+ shock(user, 5, 0.2)
+
+/obj/structure/cable/wirecutter_act(mob/user, obj/item/I)
+ . = TRUE
+ var/turf/T = get_turf(src)
+ if(T.intact)
+ return
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(shock(user, 50))
+ return
+ user.visible_message("[user] cuts the cable.", "You cut the cable.")
+ investigate_log("was cut by [key_name(usr, 1)] in [get_area(user)]([T.x], [T.y], [T.z] - [ADMIN_JMP(T)])","wires")
+ deconstruct()
+
// shock the user with probability prb
/obj/structure/cable/proc/shock(mob/user, prb, siemens_coeff = 1)
if(!prob(prb))
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 9a7818ed321..588ea6b231f 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -64,7 +64,7 @@
return 100 * charge / maxcharge
// use power from a cell
-/obj/item/stock_parts/cell/proc/use(amount)
+/obj/item/stock_parts/cell/use(amount)
if(rigged && amount > 0)
explode()
return 0
diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm
index 3d137a3c298..4a88e3363fc 100644
--- a/code/modules/power/generator.dm
+++ b/code/modules/power/generator.dm
@@ -158,34 +158,37 @@
return
interact(user)
-/obj/machinery/power/generator/attackby(obj/item/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/wrench))
- anchored = !anchored
- if(!anchored)
- disconnect()
- power_change()
- else
- connect()
- playsound(loc, W.usesound, 50, 1)
- to_chat(user, "You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor.")
- else if(ismultitool(W))
- if(cold_dir == WEST)
- cold_dir = EAST
- hot_dir = WEST
- else if(cold_dir == NORTH)
- cold_dir = SOUTH
- hot_dir = NORTH
- else if(cold_dir == EAST)
- cold_dir = WEST
- hot_dir = EAST
- else
- cold_dir = NORTH
- hot_dir = SOUTH
- connect()
- to_chat(user, "You reverse the generator's circulator settings. The cold circulator is now on the [dir2text(cold_dir)] side, and the heat circulator is now on the [dir2text(hot_dir)] side.")
- update_desc()
+/obj/machinery/power/generator/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(cold_dir == WEST)
+ cold_dir = EAST
+ hot_dir = WEST
+ else if(cold_dir == NORTH)
+ cold_dir = SOUTH
+ hot_dir = NORTH
+ else if(cold_dir == EAST)
+ cold_dir = WEST
+ hot_dir = EAST
else
- return ..()
+ cold_dir = NORTH
+ hot_dir = SOUTH
+ connect()
+ to_chat(user, "You reverse the generator's circulator settings. The cold circulator is now on the [dir2text(cold_dir)] side, and the heat circulator is now on the [dir2text(hot_dir)] side.")
+ update_desc()
+
+/obj/machinery/power/generator/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ anchored = !anchored
+ if(!anchored)
+ disconnect()
+ power_change()
+ else
+ connect()
+ to_chat(user, "You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor.")
/obj/machinery/power/generator/proc/get_menu(include_link = 1)
var/t = ""
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index 08464600487..d45981c7c22 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -187,15 +187,6 @@ var/const/GRAV_NEEDS_WRENCH = 3
broken_state++
update_icon()
return
- if(GRAV_NEEDS_WELDING)
- if(istype(I, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = I
- if(WT.remove_fuel(1, user))
- to_chat(user, "You mend the damaged framework.")
- playsound(src.loc, WT.usesound, 50, 1)
- broken_state++
- update_icon()
- return
if(GRAV_NEEDS_PLASTEEL)
if(istype(I, /obj/item/stack/sheet/plasteel))
var/obj/item/stack/sheet/plasteel/PS = I
@@ -216,6 +207,16 @@ var/const/GRAV_NEEDS_WRENCH = 3
return
return ..()
+/obj/machinery/gravity_generator/main/welder_act(mob/user, obj/item/I)
+ if(broken_state != GRAV_NEEDS_WELDING)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, amount = 1, volume = I.tool_volume))
+ return
+ to_chat(user, "You mend the damaged framework.")
+ broken_state++
+ update_icon()
+
/obj/machinery/gravity_generator/main/attack_hand(mob/user as mob)
if(!..())
return interact(user)
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index ee0924578ff..05150c7389d 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -306,7 +306,7 @@
exchange_parts(user, O)
return
else if(istype(O, /obj/item/crowbar) && panel_open)
- default_deconstruction_crowbar(O)
+ default_deconstruction_crowbar(user, O)
else
return ..()
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 82d78e99e53..3899d429d59 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -286,42 +286,6 @@
to_chat(user, "The [src.name] needs to be unwelded from the floor.")
return
- if(istype(W, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = W
- if(active)
- to_chat(user, "Turn off the [src] first.")
- return
- switch(state)
- if(0)
- to_chat(user, "The [src.name] needs to be wrenched to the floor.")
- if(1)
- if(WT.remove_fuel(0,user))
- playsound(src.loc, WT.usesound, 50, 1)
- user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \
- "You start to weld the [src] to the floor.", \
- "You hear welding")
- if(do_after(user, 20 * WT.toolspeed, target = src))
- if(!src || !WT.isOn()) return
- state = 2
- to_chat(user, "You weld the [src] to the floor.")
- connect_to_network()
- else
- to_chat(user, "You need more welding fuel to complete this task.")
- if(2)
- if(WT.remove_fuel(0,user))
- playsound(src.loc, WT.usesound, 50, 1)
- user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \
- "You start to cut the [src] free from the floor.", \
- "You hear welding")
- if(do_after(user, 20 * WT.toolspeed, target = src))
- if(!src || !WT.isOn()) return
- state = 1
- to_chat(user, "You cut the [src] free from the floor.")
- disconnect_from_network()
- else
- to_chat(user, "You need more welding fuel to complete this task.")
- return
-
if(istype(W, /obj/item/card/id) || istype(W, /obj/item/pda))
if(emagged)
to_chat(user, "The lock seems to be broken")
@@ -343,7 +307,7 @@
if(exchange_parts(user, W))
return
- if(default_deconstruction_crowbar(W))
+ if(default_deconstruction_crowbar(user, W))
return
return ..()
@@ -354,3 +318,29 @@
emagged = 1
if(user)
user.visible_message("[user.name] emags the [src.name].","You short out the lock.")
+
+
+/obj/machinery/power/emitter/welder_act(mob/user, obj/item/I)
+ if(active)
+ to_chat(user, "Turn off [src] first.")
+ return
+ if(state == 0)
+ to_chat(user, "[src] needs to be wrenched to the floor.")
+ return
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ if(state == 1)
+ WELDER_ATTEMPT_FLOOR_WELD_MESSAGE
+ else if(state == 2)
+ WELDER_ATTEMPT_FLOOR_SLICE_MESSAGE
+ if(!I.use_tool(src, user, 20, volume = I.tool_volume))
+ return
+ if(state == 1)
+ WELDER_FLOOR_WELD_SUCCESS_MESSAGE
+ connect_to_network()
+ state = 2
+ else if(state == 2)
+ WELDER_FLOOR_SLICE_SUCCESS_MESSAGE
+ disconnect_from_network()
+ state = 1
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index d6711be53e1..7dcd7c71135 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -101,41 +101,29 @@ field_generator power level display
anchored = 0
if(FG_WELDED)
to_chat(user, "The [name] needs to be unwelded from the floor!")
-
- else if(istype(W, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = W
- switch(state)
- if(FG_UNSECURED)
- to_chat(user, "The [name] needs to be wrenched to the floor!")
-
- if(FG_SECURED)
- if(WT.remove_fuel(0,user))
- playsound(loc, WT.usesound, 50, 1)
- user.visible_message("[user.name] starts to weld the [name] to the floor.", \
- "You start to weld \the [src] to the floor...", \
- "You hear welding.")
- if(do_after(user, 20 * WT.toolspeed, target = src))
- if(!src || !WT.isOn())
- return
- state = FG_WELDED
- to_chat(user, "You weld the field generator to the floor.")
-
- if(FG_WELDED)
- if(WT.remove_fuel(0,user))
- playsound(loc, WT.usesound, 50, 1)
- user.visible_message("[user.name] starts to cut the [name] free from the floor.", \
- "You start to cut \the [src] free from the floor...", \
- "You hear welding.")
- if(do_after(user, 20 * WT.toolspeed, target = src))
- if(!src || !WT.isOn())
- return
- state = FG_SECURED
- to_chat(user, "You cut \the [src] free from the floor.")
-
else
return ..()
+/obj/machinery/field/generator/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(state == FG_UNSECURED)
+ to_chat(user, "[src] needs to be wrenched to the floor!")
+ return
+ if(!I.tool_use_check(user, 0))
+ return
+ if(state == FG_SECURED)
+ WELDER_ATTEMPT_FLOOR_SLICE_MESSAGE
+ else if(state == FG_WELDED)
+ WELDER_ATTEMPT_FLOOR_WELD_MESSAGE
+ if(I.use_tool(src, user, 20, volume = I.tool_volume))
+ if(state == FG_SECURED)
+ WELDER_FLOOR_SLICE_SUCCESS_MESSAGE
+ state = FG_WELDED
+ else if(state == FG_WELDED)
+ WELDER_FLOOR_WELD_SUCCESS_MESSAGE
+ state = FG_SECURED
+
/obj/machinery/field/generator/emp_act()
return 0
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index 2942acfdb35..059f5e78b7b 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -54,6 +54,10 @@ Strength being set by the computer and a null strength (Computer is powered off
So, hopefully this is helpful if any more icons are to be added/changed/wondering what the hell is going on here
*/
+#define ACCELERATOR_UNWRENCHED 0
+#define ACCELERATOR_WRENCHED 1
+#define ACCELERATOR_WIRED 2
+#define ACCELERATOR_READY 3
/obj/structure/particle_accelerator
name = "Particle Accelerator"
@@ -136,12 +140,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
desc = desc_holder
. = ..()
-/obj/structure/particle_accelerator/attackby(obj/item/W, mob/user, params)
- if(istool(W))
- if(process_tool_hit(W,user))
- return
- return..()
-
/obj/structure/particle_accelerator/deconstruct(disassembled = TRUE)
if(!(flags & NODECONSTRUCT))
new /obj/item/stack/sheet/metal (loc, 5)
@@ -196,66 +194,58 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
return 1
return 0
+/obj/structure/particle_accelerator/attackby(obj/item/W, mob/user, params)
+ if(!iscoil(W))
+ return ..()
+ if(construction_state == ACCELERATOR_WRENCHED)
+ var/obj/item/stack/cable_coil/C = W
+ if(C.use(1))
+ playsound(loc, C.usesound, 50, 1)
+ user.visible_message("[user.name] adds wires to the [name].", \
+ "You add some wires.")
+ construction_state = ACCELERATOR_WIRED
+ update_icon()
-/obj/structure/particle_accelerator/proc/process_tool_hit(var/obj/item/O, var/mob/user)
- if(!(O) || !(user))
- return 0
- if(!ismob(user) || !isobj(O))
- return 0
- var/temp_state = construction_state
+/obj/structure/particle_accelerator/screwdriver_act(mob/user, obj/item/I)
+ if(construction_state != ACCELERATOR_WIRED && construction_state != ACCELERATOR_READY)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(construction_state == ACCELERATOR_WIRED)
+ SCREWDRIVER_CLOSE_PANEL_MESSAGE
+ construction_state = ACCELERATOR_READY
- switch(construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps
- if(0)
- if(iswrench(O) && !isinspace())
- playsound(loc, O.usesound, 50, 1)
- anchored = 1
- user.visible_message("[user.name] secures the [name] to the floor.", \
- "You secure the external bolts.")
- temp_state++
- if(1)
- if(iswrench(O))
- playsound(loc, O.usesound, 50, 1)
- anchored = 0
- user.visible_message("[user.name] detaches the [name] from the floor.", \
- "You remove the external bolts.")
- temp_state--
- else if(iscoil(O))
- var/obj/item/stack/cable_coil/C = O
- if(C.use(1))
- playsound(loc, O.usesound, 50, 1)
- user.visible_message("[user.name] adds wires to the [name].", \
- "You add some wires.")
- temp_state++
- else
- to_chat(user, "You need one length of cable to wire the [name]!")
- return
- if(2)
- if(iswirecutter(O))//TODO:Shock user if its on?
- playsound(loc, O.usesound, 50, 1)
- user.visible_message("[user.name] removes some wires from the [name].", \
- "You remove some wires.")
- temp_state--
- else if(isscrewdriver(O))
- playsound(loc, O.usesound, 50, 1)
- user.visible_message("[user.name] closes the [name]'s access panel.", \
- "You close the access panel.")
- temp_state++
- if(3)
- if(isscrewdriver(O))
- playsound(loc, O.usesound, 50, 1)
- user.visible_message("[user.name] opens the [name]'s access panel.", \
- "You open the access panel.")
- temp_state--
- if(temp_state == construction_state)//Nothing changed
- return 0
else
- construction_state = temp_state
- if(construction_state < 3)//Was taken apart, update state
- update_state()
- update_icon()
- return 1
- return 0
+ construction_state = ACCELERATOR_WIRED
+ SCREWDRIVER_OPEN_PANEL_MESSAGE
+ update_state()
+ update_icon()
+/obj/structure/particle_accelerator/wirecutter_act(mob/user, obj/item/I)
+ if(construction_state != ACCELERATOR_WIRED)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ WIRECUTTER_SNIP_MESSAGE
+ construction_state = ACCELERATOR_WRENCHED
+
+/obj/structure/particle_accelerator/wrench_act(mob/user, obj/item/I)
+ if(construction_state != ACCELERATOR_UNWRENCHED && construction_state != ACCELERATOR_WRENCHED)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(construction_state == ACCELERATOR_UNWRENCHED)
+ anchored = TRUE
+ WRENCH_ANCHOR_MESSAGE
+ construction_state = ACCELERATOR_WRENCHED
+ else
+ anchored = FALSE
+ WRENCH_UNANCHOR_MESSAGE
+ construction_state = ACCELERATOR_UNWRENCHED
+ update_icon()
/obj/machinery/particle_accelerator
@@ -306,72 +296,65 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
return
/obj/machinery/particle_accelerator/attackby(obj/item/W, mob/user, params)
- if(istool(W))
- if(process_tool_hit(W,user))
- return
- return ..()
+ if(!iscoil(W))
+ return ..()
+ if(construction_state == ACCELERATOR_WRENCHED)
+ var/obj/item/stack/cable_coil/C = W
+ if(C.use(1))
+ playsound(loc, C.usesound, 50, 1)
+ user.visible_message("[user.name] adds wires to the [name].", \
+ "You add some wires.")
+ construction_state = ACCELERATOR_WIRED
+ update_icon()
+
+/obj/machinery/particle_accelerator/screwdriver_act(mob/user, obj/item/I)
+ if(construction_state != ACCELERATOR_WIRED && construction_state != ACCELERATOR_READY)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(construction_state == ACCELERATOR_WIRED)
+ SCREWDRIVER_CLOSE_PANEL_MESSAGE
+ construction_state = ACCELERATOR_READY
+ use_power = IDLE_POWER_USE
+ else
+ construction_state = ACCELERATOR_WIRED
+ SCREWDRIVER_OPEN_PANEL_MESSAGE
+ use_power = NO_POWER_USE
+ update_state()
+ update_icon()
+
+/obj/machinery/particle_accelerator/wirecutter_act(mob/user, obj/item/I)
+ if(construction_state != ACCELERATOR_WIRED)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ WIRECUTTER_SNIP_MESSAGE
+ construction_state = ACCELERATOR_WRENCHED
+
+/obj/machinery/particle_accelerator/wrench_act(mob/user, obj/item/I)
+ if(construction_state != ACCELERATOR_UNWRENCHED && construction_state != ACCELERATOR_WRENCHED)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(construction_state == ACCELERATOR_UNWRENCHED)
+ anchored = TRUE
+ WRENCH_ANCHOR_MESSAGE
+ construction_state = ACCELERATOR_WRENCHED
+ else
+ anchored = FALSE
+ WRENCH_UNANCHOR_MESSAGE
+ construction_state = ACCELERATOR_UNWRENCHED
+ update_icon()
+
/obj/machinery/particle_accelerator/proc/update_state()
return 0
-/obj/machinery/particle_accelerator/proc/process_tool_hit(var/obj/item/O, var/mob/user)
- if(!(O) || !(user))
- return 0
- if(!ismob(user) || !isobj(O))
- return 0
- var/temp_state = construction_state
- switch(construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps
- if(0)
- if(iswrench(O))
- playsound(loc, O.usesound, 50, 1)
- anchored = 1
- user.visible_message("[user.name] secures the [name] to the floor.", \
- "You secure the external bolts.")
- temp_state++
- power_change()
- if(1)
- if(iswrench(O))
- playsound(loc, O.usesound, 50, 1)
- anchored = 0
- user.visible_message("[user.name] detaches the [name] from the floor.", \
- "You remove the external bolts.")
- temp_state--
- power_change()
- else if(iscoil(O))
- if(O:use(1))
- playsound(loc, O.usesound, 50, 1)
- user.visible_message("[user.name] adds wires to the [name].", \
- "You add some wires.")
- temp_state++
- if(2)
- if(iswirecutter(O))//TODO:Shock user if its on?
- playsound(loc, O.usesound, 50, 1)
- user.visible_message("[user.name] removes some wires from the [name].", \
- "You remove some wires.")
- temp_state--
- else if(isscrewdriver(O))
- playsound(loc, O.usesound, 50, 1)
- user.visible_message("[user.name] closes the [name]'s access panel.", \
- "You close the access panel.")
- temp_state++
- if(3)
- if(isscrewdriver(O))
- playsound(loc, O.usesound, 50, 1)
- user.visible_message("[user.name] opens the [name]'s access panel.", \
- "You open the access panel.")
- temp_state--
- active = 0
- if(temp_state == construction_state)//Nothing changed
- return 0
- else
- if(construction_state < 3)//Was taken apart, update state
- update_state()
- if(use_power)
- use_power = NO_POWER_USE
- construction_state = temp_state
- if(construction_state >= 3)
- use_power = IDLE_POWER_USE
- update_icon()
- return 1
- return 0
+#undef ACCELERATOR_UNWRENCHED
+#undef ACCELERATOR_WRENCHED
+#undef ACCELERATOR_WIRED
+#undef ACCELERATOR_READY
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 4773df11395..031ef83a264 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -224,7 +224,7 @@
return
//crowbarring it !
- if(default_deconstruction_crowbar(I))
+ if(default_deconstruction_crowbar(user, I))
return
return ..()
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index f3ca60effda..7d830d69321 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -55,17 +55,15 @@
update_icon()
-
-/obj/machinery/power/solar/attackby(obj/item/W, mob/user, params)
- if(iscrowbar(W))
- playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
- user.visible_message("[user] begins to take the glass off the solar panel.", "You begin to take the glass off the solar panel...")
- if(do_after(user, 50 * W.toolspeed, target = src))
- playsound(src.loc, W.usesound, 50, 1)
- user.visible_message("[user] takes the glass off the solar panel.", "You take the glass off the solar panel.")
- deconstruct(TRUE)
+/obj/machinery/power/solar/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
return
- return ..()
+ playsound(loc, 'sound/machines/click.ogg', 50, 1)
+ user.visible_message("[user] begins to take the glass off the solar panel.", "You begin to take the glass off the solar panel...")
+ if(I.use_tool(src, user, 50, volume = I.tool_volume))
+ user.visible_message("[user] takes the glass off the solar panel.", "You take the glass off the solar panel.")
+ deconstruct(TRUE)
/obj/machinery/power/solar/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm
index 6f1e84da526..5f58bcb5dd4 100644
--- a/code/modules/power/tesla/coil.dm
+++ b/code/modules/power/tesla/coil.dm
@@ -33,28 +33,48 @@
input_power_multiplier = power_multiplier
/obj/machinery/power/tesla_coil/attackby(obj/item/W, mob/user, params)
- if(default_deconstruction_screwdriver(user, "coil_open[anchored]", "coil[anchored]", W))
- return
-
if(exchange_parts(user, W))
return
- if(default_unfasten_wrench(user, W))
+ else if(istype(W, /obj/item/assembly/signaler) && panel_open)
+ wires.Interact(user)
+
+ else
+ return ..()
+
+/obj/machinery/power/tesla_coil/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ default_deconstruction_crowbar(user, I)
+
+/obj/machinery/power/tesla_coil/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(panel_open)
+ wires.Interact(user)
+
+/obj/machinery/power/tesla_coil/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ default_deconstruction_screwdriver(user, "coil_open[anchored]", "coil[anchored]", I)
+
+/obj/machinery/power/tesla_coil/wirecutter_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(panel_open)
+ wires.Interact(user)
+
+/obj/machinery/power/tesla_coil/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(default_unfasten_wrench(user, I))
if(!anchored)
disconnect_from_network()
else
connect_to_network()
- return
-
- if(default_deconstruction_crowbar(W))
- return
-
- else if(iswirecutter(W) || ismultitool(W) || istype(W, /obj/item/assembly/signaler))
- if(panel_open)
- wires.Interact(user)
-
- else
- return ..()
/obj/machinery/power/tesla_coil/tesla_act(var/power)
if(anchored && !panel_open)
@@ -97,22 +117,23 @@
RefreshParts()
/obj/machinery/power/grounding_rod/attackby(obj/item/W, mob/user, params)
- if(default_deconstruction_screwdriver(user, "grounding_rod_open[anchored]", "grounding_rod[anchored]", W))
- return
-
if(exchange_parts(user, W))
return
- if(default_unfasten_wrench(user, W))
- return
+/obj/machinery/power/grounding_rod/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ default_deconstruction_screwdriver(user, "grounding_rod_open[anchored]", "grounding_rod[anchored]", I)
- if(default_deconstruction_crowbar(W))
- return
+/obj/machinery/power/grounding_rod/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ default_unfasten_wrench(user, I)
- return ..()
+/obj/machinery/power/grounding_rod/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ default_deconstruction_crowbar(user, I)
/obj/machinery/power/grounding_rod/tesla_act(var/power)
if(anchored && !panel_open)
flick("grounding_rodhit", src)
else
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm
index 5706eb6d3da..69dc8c4fd03 100644
--- a/code/modules/power/tracker.dm
+++ b/code/modules/power/tracker.dm
@@ -59,16 +59,16 @@
if(powernet && (powernet == control.powernet)) //update if we're still in the same powernet
control.cdir = angle
-/obj/machinery/power/tracker/attackby(var/obj/item/W, var/mob/user)
- if(iscrowbar(W))
- playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
- user.visible_message("[user] begins to take the glass off the solar tracker.")
- if(do_after(user, 50 * W.toolspeed, target = src))
- playsound(src.loc, W.usesound, 50, 1)
- user.visible_message("[user] takes the glass off the tracker.")
- deconstruct(TRUE)
+/obj/machinery/power/tracker/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
return
- return ..()
+ playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
+ user.visible_message("[user] begins to take the glass off the solar tracker.")
+ if(I.use_tool(src, user, 50, volume = I.tool_volume))
+ user.visible_message("[user] takes the glass off the tracker.")
+ deconstruct(TRUE)
+
/obj/machinery/power/tracker/obj_break(damage_flag)
if(!(stat & BROKEN) && !(flags & NODECONSTRUCT))
diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm
index 6f3c0856406..15a9dcbdb84 100644
--- a/code/modules/power/turbine.dm
+++ b/code/modules/power/turbine.dm
@@ -110,9 +110,6 @@
efficiency = E / 6
/obj/machinery/power/compressor/attackby(obj/item/I, mob/user, params)
- if(default_deconstruction_screwdriver(user, initial(icon_state), initial(icon_state), I))
- return
-
if(default_change_direction_wrench(user, I))
turbine = null
inturf = get_step(src, dir)
@@ -128,10 +125,17 @@
if(exchange_parts(user, I))
return
- if(default_deconstruction_crowbar(I))
- return
+
return ..()
+/obj/machinery/power/compressor/crowbar_act(mob/user, obj/item/I)
+ if(default_deconstruction_crowbar(user, I))
+ return TRUE
+
+/obj/machinery/power/compressor/screwdriver_act(mob/user, obj/item/I)
+ if(default_deconstruction_screwdriver(user, initial(icon_state), initial(icon_state), I))
+ return TRUE
+
/obj/machinery/power/compressor/CanAtmosPass(turf/T)
return !density
@@ -285,7 +289,7 @@
if(exchange_parts(user, I))
return
- if(default_deconstruction_crowbar(I))
+ if(default_deconstruction_crowbar(user, I))
return
return ..()
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 4df4e46da20..d4a333c495d 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -301,21 +301,6 @@
if(loc == user)
A.Grant(user)
- if(isscrewdriver(I))
- if(gun_light && can_flashlight)
- for(var/obj/item/flashlight/seclite/S in src)
- to_chat(user, "You unscrew the seclite from [src].")
- gun_light = null
- S.loc = get_turf(user)
- update_gun_light(user)
- S.update_brightness(user)
- update_icon()
- for(var/datum/action/item_action/toggle_gunlight/TGL in actions)
- qdel(TGL)
- else if(bayonet && can_bayonet) //if it has a bayonet, and the bayonet can be removed
- bayonet.forceMove(get_turf(user))
- clear_bayonet()
-
if(unique_rename)
if(istype(I, /obj/item/pen))
rename_gun(user)
@@ -339,6 +324,24 @@
else
return ..()
+/obj/item/gun/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(gun_light && can_flashlight)
+ for(var/obj/item/flashlight/seclite/S in src)
+ to_chat(user, "You unscrew the seclite from [src].")
+ gun_light = null
+ S.loc = get_turf(user)
+ update_gun_light(user)
+ S.update_brightness(user)
+ update_icon()
+ for(var/datum/action/item_action/toggle_gunlight/TGL in actions)
+ qdel(TGL)
+ else if(bayonet && can_bayonet) //if it has a bayonet, and the bayonet can be removed
+ bayonet.forceMove(get_turf(user))
+ clear_bayonet()
+
/obj/item/gun/proc/toggle_gunlight()
set name = "Toggle Gun Light"
set category = "Object"
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index 60ab08f979d..518caa8ba70 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -37,20 +37,23 @@
. += "There is a [M.name] mod installed, using [M.cost]% capacity."
/obj/item/gun/energy/kinetic_accelerator/attackby(obj/item/I, mob/user)
- if(iscrowbar(I))
- if(modkits.len)
- to_chat(user, "You pry the modifications out.")
- playsound(loc, I.usesound, 100, 1)
- for(var/obj/item/borg/upgrade/modkit/M in modkits)
- M.uninstall(src)
- else
- to_chat(user, "There are no modifications currently installed.")
- else if(istype(I, /obj/item/borg/upgrade/modkit))
+ if(istype(I, /obj/item/borg/upgrade/modkit))
var/obj/item/borg/upgrade/modkit/MK = I
MK.install(src, user)
else
return ..()
+/obj/item/gun/energy/kinetic_accelerator/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!modkits.len)
+ to_chat(user, "There are no modifications currently installed.")
+ return
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ to_chat(user, "You pry the modifications out.")
+ for(var/obj/item/borg/upgrade/modkit/M in modkits)
+ M.uninstall(src)
+
/obj/item/gun/energy/kinetic_accelerator/proc/get_remaining_mod_capacity()
var/current_capacity_used = 0
for(var/A in get_modkits())
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 1945c6dffe5..28c6c0eaf8a 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -12,6 +12,7 @@ var/const/INGEST = 2
var/chem_temp = T20C
var/list/datum/reagent/addiction_list = new/list()
var/flags
+ var/list/reagents_generated_per_cycle = new/list()
/datum/reagents/New(maximum = 100)
maximum_volume = maximum
@@ -209,7 +210,7 @@ var/const/INGEST = 2
return
var/datum/reagents/R = target.reagents
- if(get_reagent_amount(reagent)[src] can now be moved.")
- else if(!anchored)
- anchored = TRUE
- to_chat(user, "[src] is now secured.")
- return
-
- if(panel_open)
- if(iscrowbar(I))
- if(beaker)
- beaker.forceMove(loc)
- beaker = null
- if(cell)
- cell.forceMove(loc)
- cell = null
- default_deconstruction_crowbar(I)
- return TRUE
-
if(isrobot(user))
return
@@ -307,6 +271,48 @@
return
return ..()
+/obj/machinery/chem_dispenser/crowbar_act(mob/user, obj/item/I)
+ if(!panel_open)
+ return
+ if(default_deconstruction_crowbar(user, I))
+ if(beaker)
+ beaker.forceMove(loc)
+ beaker = null
+ if(cell)
+ cell.forceMove(loc)
+ cell = null
+ return TRUE
+
+
+/obj/machinery/chem_dispenser/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(!hackedcheck)
+ to_chat(user, hack_message)
+ dispensable_reagents += hacked_reagents
+ hackedcheck = TRUE
+ else
+ to_chat(user, unhack_message)
+ dispensable_reagents -= hacked_reagents
+ hackedcheck = FALSE
+ SSnanoui.update_uis(src)
+
+
+/obj/machinery/chem_dispenser/screwdriver_act(mob/user, obj/item/I)
+ if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-o", "[initial(icon_state)]", I))
+ return TRUE
+
+/obj/machinery/chem_dispenser/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(anchored)
+ anchored = FALSE
+ WRENCH_UNANCHOR_MESSAGE
+ else if(!anchored)
+ anchored = TRUE
+ WRENCH_ANCHOR_MESSAGE
/obj/machinery/chem_dispenser/attack_ai(mob/user)
return attack_hand(user)
diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm
index 247c802f239..169b668250c 100644
--- a/code/modules/reagents/chemistry/machinery/chem_heater.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm
@@ -58,9 +58,6 @@
SSnanoui.update_uis(src)
/obj/machinery/chem_heater/attackby(obj/item/I, mob/user)
- if(default_unfasten_wrench(user, I))
- power_change()
- return
if(isrobot(user))
return
@@ -77,19 +74,26 @@
SSnanoui.update_uis(src)
return
- if(default_deconstruction_screwdriver(user, "mixer0b", "mixer0b", I))
- return
-
if(exchange_parts(user, I))
return
- if(panel_open)
- if(istype(I, /obj/item/crowbar))
- eject_beaker()
- default_deconstruction_crowbar(I)
- return 1
return ..()
+/obj/machinery/chem_heater/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ default_unfasten_wrench(user, I)
+
+/obj/machinery/chem_heater/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ default_deconstruction_screwdriver(user, "mixer0b", "mixer0b", I)
+
+/obj/machinery/chem_heater/crowbar_act(mob/user, obj/item/I)
+ if(!panel_open)
+ return
+ . = TRUE
+ eject_beaker()
+ default_deconstruction_crowbar(user, I)
+
/obj/machinery/chem_heater/attack_hand(mob/user)
ui_interact(user)
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index ca069ddf514..ea53c0c782d 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -77,30 +77,12 @@
update_icon()
/obj/machinery/chem_master/attackby(obj/item/I, mob/user, params)
- if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0", I))
- if(beaker)
- beaker.forceMove(get_turf(src))
- beaker = null
- reagents.clear_reagents()
- if(loaded_pill_bottle)
- loaded_pill_bottle.forceMove(get_turf(src))
- loaded_pill_bottle = null
- return
-
if(exchange_parts(user, I))
return
if(panel_open)
- if(iscrowbar(I))
- default_deconstruction_crowbar(I)
- return TRUE
- else
- to_chat(user, "You can't use the [name] while it's panel is opened!")
- return TRUE
-
- if(default_unfasten_wrench(user, I))
- power_change()
- return
+ to_chat(user, "You can't use the [name] while it's panel is opened!")
+ return TRUE
if(istype(I, /obj/item/reagent_containers/glass) || istype(I, /obj/item/reagent_containers/food/drinks/drinkingglass))
if(beaker)
@@ -131,6 +113,35 @@
else
return ..()
+
+
+
+
+/obj/machinery/chem_master/crowbar_act(mob/user, obj/item/I)
+ if(!panel_open)
+ return
+ if(default_deconstruction_crowbar(user, I))
+ return TRUE
+
+/obj/machinery/chem_master/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0", I))
+ if(beaker)
+ beaker.forceMove(get_turf(src))
+ beaker = null
+ reagents.clear_reagents()
+ if(loaded_pill_bottle)
+ loaded_pill_bottle.forceMove(get_turf(src))
+ loaded_pill_bottle = null
+ return TRUE
+
+/obj/machinery/chem_master/wrench_act(mob/user, obj/item/I)
+ if(panel_open)
+ return
+ if(default_unfasten_wrench(user, I))
+ power_change()
+ return TRUE
+
/obj/machinery/chem_master/Topic(href, href_list)
if(..())
return TRUE
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index 9601746443a..2422c7a143d 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -133,21 +133,35 @@
else
icon_state = "juicer0"
-/obj/machinery/reagentgrinder/attackby(obj/item/I, mob/user, params)
- if(default_unfasten_wrench(user, I))
+/obj/machinery/reagentgrinder/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!anchored || beaker)
return
+ if(!panel_open)
+ return
+ if(!I.tool_use_check(user, 0))
+ return
+ default_deconstruction_crowbar(I)
+
+/obj/machinery/reagentgrinder/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!anchored || beaker)
+ return
+ if(!I.tool_use_check(user, 0))
+ return
+ default_deconstruction_screwdriver(user, "juicer_open", "juicer0", I)
+
+/obj/machinery/reagentgrinder/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ default_unfasten_wrench(user, I)
+
+/obj/machinery/reagentgrinder/attackby(obj/item/I, mob/user, params)
if(exchange_parts(user, I))
return
- if(anchored && !beaker)
- if(default_deconstruction_screwdriver(user, "juicer_open", "juicer0", I))
- return
-
- if(panel_open && istype(I, /obj/item/crowbar))
- default_deconstruction_crowbar(I)
- return
-
if(istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER) )
if(beaker)
to_chat(user, "There's already a container inside.")
@@ -214,6 +228,8 @@
src.updateUsrDialog()
return FALSE
+
+
/obj/machinery/reagentgrinder/attack_ai(mob/user)
return FALSE
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index c1e4b89e774..1c74be11965 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -151,29 +151,24 @@
test.Shift(NORTH, 1)
test.Shift(EAST, 6)
overlays += test
-
- if(istype(I, /obj/item/weldingtool))
- if(!reagents.has_reagent("fuel"))
- to_chat(user, "[src] is out of fuel!")
- return
- var/obj/item/weldingtool/W = I
- if(!W.welding)
- if(W.reagents.has_reagent("fuel", W.max_fuel))
- to_chat(user, "Your [W] is already full!")
- return
- reagents.trans_to(W, W.max_fuel)
- user.visible_message("[user] refills [user.p_their()] [W].", "You refill [W].")
- playsound(src, 'sound/effects/refill.ogg', 50, 1)
- W.update_icon()
- else
- user.visible_message("[user] catastrophically fails at refilling [user.p_their()] [W]!", "That was stupid of you.")
- message_admins("[key_name_admin(user)] triggered a fueltank explosion at [COORD(loc)]")
- log_game("[key_name(user)] triggered a fueltank explosion at [COORD(loc)]")
- investigate_log("[key_name(user)] triggered a fueltank explosion at [COORD(loc)]", INVESTIGATE_BOMB)
- boom()
else
return ..()
+obj/structure/reagent_dispensers/fueltank/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!reagents.has_reagent("fuel"))
+ to_chat(user, "[src] is out of fuel!")
+ return
+ if(I.tool_enabled && I.use_tool(src, user, volume = I.tool_volume)) //check it's enabled first to prevent duplicate messages when refuelling
+ user.visible_message("[user] catastrophically fails at refilling [user.p_their()] [I]!", "That was stupid of you.")
+ message_admins("[key_name_admin(user)] triggered a fueltank explosion at [COORD(loc)]")
+ log_game("[key_name(user)] triggered a fueltank explosion at [COORD(loc)]")
+ investigate_log("[key_name(user)] triggered a fueltank explosion at [COORD(loc)]", INVESTIGATE_BOMB)
+ boom()
+ else
+ I.refill(user, src, reagents.get_reagent_amount("fuel")) //Try dump all fuel into the welder
+
+
/obj/structure/reagent_dispensers/fueltank/Move()
..()
if(rig)
@@ -233,35 +228,11 @@
user.put_in_hands(S)
paper_cups--
-/obj/structure/reagent_dispensers/water_cooler/attackby(obj/item/W, mob/living/user, params)
- add_fingerprint(user)
- user.changeNext_move(CLICK_CD_MELEE)
- if(iswrench(W))
- if(anchored)
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] starts loosening [src]'s floor casters.", \
- "You start loosening [src]'s floor casters...")
- if(do_after(user, 40 * W.toolspeed, target = src))
- if(!loc || !anchored)
- return
- user.visible_message("[user] loosened [src]'s floor casters.", \
- "You loosen [src]'s floor casters.")
- anchored = 0
- else
- if(!isfloorturf(loc))
- user.visible_message("A floor must be present to secure [src]!")
- return
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] start securing [src]'s floor casters...", \
- "You start securing [src]'s floor casters...")
- if(do_after(user, 40 * W.toolspeed, target = src))
- if(!loc || anchored)
- return
- user.visible_message("[user] has secured [src]'s floor casters.", \
- "You have secured [src]'s floor casters.")
- anchored = 1
+/obj/structure/reagent_dispensers/water_cooler/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
return
- return ..()
+ default_unfasten_wrench(user, I, 40)
/obj/structure/reagent_dispensers/beerkeg
name = "beer keg"
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index 933f223d120..4d242212f2c 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -50,20 +50,8 @@ GLOBAL_LIST_INIT(conveyor_switches, list())
// attack with item, place item on conveyor
/obj/machinery/conveyor/attackby(obj/item/I, mob/user)
- if(iscrowbar(I))
- if(!(stat & BROKEN))
- var/obj/item/conveyor_construct/C = new(loc)
- C.id = id
- transfer_fingerprints_to(C)
- playsound(loc, I.usesound, 50, 1)
- to_chat(user,"You remove the conveyor belt.")
- qdel(src)
- else if(stat & BROKEN)
+ if(stat & BROKEN)
return ..()
- else if(iswrench(I))
- set_rotation(user)
- update_move_direction()
- playsound(loc, I.usesound, 50, 1)
else if(istype(I, /obj/item/conveyor_switch_construct))
var/obj/item/conveyor_switch_construct/S = I
if(S.id == id)
@@ -79,6 +67,25 @@ GLOBAL_LIST_INIT(conveyor_switches, list())
else
return ..()
+
+/obj/machinery/conveyor/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(!(stat & BROKEN))
+ var/obj/item/conveyor_construct/C = new(loc)
+ C.id = id
+ transfer_fingerprints_to(C)
+ to_chat(user,"You remove [src].")
+ qdel(src)
+
+/obj/machinery/conveyor/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ set_rotation(user)
+ update_move_direction()
+
// attack with hand, move pulled object onto conveyor
/obj/machinery/conveyor/attack_hand(mob/user as mob)
user.Move_Pulled(src)
@@ -305,17 +312,21 @@ GLOBAL_LIST_INIT(conveyor_switches, list())
S.update_icon()
CHECK_TICK
-/obj/machinery/conveyor_switch/attackby(obj/item/I, mob/user)
- if(iscrowbar(I))
- var/obj/item/conveyor_switch_construct/C = new(loc, id)
- transfer_fingerprints_to(C)
- to_chat(user,"You detach the conveyor switch.")
- qdel(src)
- else if(ismultitool(I))
- one_way = !one_way
- to_chat(user, "[src] will now go [one_way ? "forwards only" : "both forwards and backwards"].")
- else
- return ..()
+/obj/machinery/conveyor_switch/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ var/obj/item/conveyor_switch_construct/C = new(loc, id)
+ transfer_fingerprints_to(C)
+ to_chat(user,"You detach [src].")
+ qdel(src)
+
+/obj/machinery/conveyor_switch/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ one_way = !one_way
+ to_chat(user, "[src] will now go [one_way ? "forwards only" : "both forwards and backwards"].")
/obj/machinery/conveyor_switch/power_change()
..()
diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm
index 0c1c775c1f9..66caa897f21 100644
--- a/code/modules/recycling/disposal-construction.dm
+++ b/code/modules/recycling/disposal-construction.dm
@@ -207,12 +207,9 @@
if(istype(I, /obj/item/weldingtool))
if(anchored)
- var/obj/item/weldingtool/W = I
- if(W.remove_fuel(0,user))
- playsound(src.loc, W.usesound, 100, 1)
+ if(I.tool_use_check(user, 0))
to_chat(user, "Welding the [nicetype] in place.")
- if(do_after(user, 20 * W.toolspeed, target = src))
- if(!src || !W.isOn()) return
+ if(I.use_tool(src, user, 20, volume = I.tool_volume))
to_chat(user, "The [nicetype] has been welded in place!")
update() // TODO: Make this neat
if(ispipe) // Pipe
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 02ca42e94d9..a069d386841 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -26,9 +26,12 @@
var/flush_every_ticks = 30 //Every 30 ticks it will look whether it is ready to flush
var/flush_count = 0 //this var adds 1 once per tick. When it reaches flush_every_ticks it resets and tries to flush.
var/last_sound = 0
+ var/required_mode_to_deconstruct = -1
+ var/deconstructs_to = PIPE_DISPOSALS_CHUTE
active_power_usage = 600
idle_power_usage = 100
+
// create a new disposal
// find the attached trunk (if present)
/obj/machinery/disposal/New()
@@ -110,30 +113,6 @@
playsound(src.loc, I.usesound, 50, 1)
to_chat(user, "You attach the screws around the power connection.")
return
- else if(istype(I,/obj/item/weldingtool) && mode==-1)
- if(contents.len > 0)
- to_chat(user, "Eject the items first!")
- return
- var/obj/item/weldingtool/W = I
- if(W.remove_fuel(0,user))
- playsound(src.loc, W.usesound, 100, 1)
- to_chat(user, "You start slicing the floorweld off the disposal unit.")
-
- if(do_after(user, 20 * W.toolspeed, target = src))
- if(!src || !W.isOn()) return
- to_chat(user, "You sliced the floorweld off the disposal unit.")
- var/obj/structure/disposalconstruct/C = new (src.loc)
- src.transfer_fingerprints_to(C)
- C.ptype = PIPE_DISPOSALS_BIN
- C.anchored = 1
- C.density = 1
- C.update()
- qdel(src)
- return
- else
- to_chat(user, "You need more welding fuel to complete this task.")
- return
-
if(istype(I, /obj/item/melee/energy/blade))
to_chat(user, "You can't place that item inside the disposal unit.")
return
@@ -179,6 +158,25 @@
update()
+/obj/machinery/disposal/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(mode != required_mode_to_deconstruct)
+ return
+ if(contents.len > 0)
+ to_chat(user, "Eject the items first!")
+ return
+ if(!I.tool_use_check(user, 0))
+ return
+ WELDER_ATTEMPT_FLOOR_SLICE_MESSAGE
+ if(I.use_tool(src, user, 20, volume = I.tool_volume))
+ WELDER_FLOOR_SLICE_SUCCESS_MESSAGE
+ var/obj/structure/disposalconstruct/C = new (src.loc)
+ C.ptype = deconstructs_to
+ C.update()
+ C.anchored = 1
+ C.density = 1
+ qdel(src)
+
// mouse drop another mob or self
//
/obj/machinery/disposal/MouseDrop_T(mob/target, mob/user)
@@ -893,21 +891,15 @@
add_fingerprint(user)
- if(istype(I, /obj/item/weldingtool))
- var/obj/item/weldingtool/W = I
- if(W.remove_fuel(0, user))
- to_chat(user, "You begin slicing \the [src].")
- playsound(loc, W.usesound, 100, 1)
- if(do_after(user, 30 * W.toolspeed, target = src))
- to_chat(user, "You finish slicing \the [src].")
- welded()
- else
- to_chat(user, "You need more welding fuel to cut the pipe.")
-
-// called when pipe is cut with welder
-/obj/structure/disposalpipe/proc/welded()
-
- var/obj/structure/disposalconstruct/C = new (src.loc)
+/obj/structure/disposalpipe/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ WELDER_ATTEMPT_SLICING_MESSAGE
+ if(!I.use_tool(src, user, 30, volume = I.tool_volume))
+ return
+ WELDER_SLICING_SUCCESS_MESSAGE
+ var/obj/structure/disposalconstruct/C = new (get_turf(src))
switch(base_icon_state)
if("pipe-s")
C.ptype = PIPE_DISPOSALS_STRAIGHT
@@ -927,8 +919,8 @@
C.ptype = PIPE_DISPOSALS_SORT_LEFT
src.transfer_fingerprints_to(C)
C.dir = dir
- C.density = 0
- C.anchored = 1
+ C.density = FALSE
+ C.anchored = TRUE
C.update()
qdel(src)
@@ -1210,19 +1202,6 @@
if(T.intact)
return // prevent interaction with T-scanner revealed pipes
src.add_fingerprint(user)
- if(istype(I, /obj/item/weldingtool))
- var/obj/item/weldingtool/W = I
-
- if(W.remove_fuel(0,user))
- playsound(loc, W.usesound, 100, 1)
- to_chat(user, "Slicing the disposal pipe.")
- if(do_after(user, 30 * W.toolspeed, target = src))
- if(!W.isOn())
- return
- welded()
- else
- to_chat(user, "You need more welding fuel to cut the pipe.")
- return
// would transfer to next pipe segment, but we are in a trunk
// if not entering from disposal bin,
@@ -1269,8 +1248,12 @@
update()
return
-/obj/structure/disposalpipe/broken/welded()
- qdel(src)
+/obj/structure/disposalpipe/broken/welder_act(mob/user, obj/item/I)
+ if(I.use_tool(src, user, 0, volume = I.tool_volume))
+ to_chat(user, "You remove [src]!")
+ I.play_tool_sound(src, I.tool_volume)
+ qdel(src)
+ return TRUE
// the disposal outlet machine
@@ -1334,25 +1317,21 @@
playsound(src.loc, I.usesound, 50, 1)
to_chat(user, "You attach the screws around the power connection.")
return
- else if(istype(I,/obj/item/weldingtool) && mode==1)
- var/obj/item/weldingtool/W = I
- if(W.remove_fuel(0,user))
- playsound(src.loc, W.usesound, 100, 1)
- to_chat(user, "You start slicing the floorweld off the disposal outlet.")
- if(do_after(user, 20 * W.toolspeed, target = src))
- if(!src || !W.isOn()) return
- to_chat(user, "You sliced the floorweld off the disposal outlet.")
- var/obj/structure/disposalconstruct/C = new (src.loc)
- src.transfer_fingerprints_to(C)
- C.ptype = PIPE_DISPOSALS_OUTLET
- C.update()
- C.anchored = 1
- C.density = 1
- qdel(src)
- return
- else
- to_chat(user, "You need more welding fuel to complete this task.")
- return
+
+/obj/structure/disposaloutlet/welder_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ WELDER_ATTEMPT_FLOOR_SLICE_MESSAGE
+ if(I.use_tool(src, user, 20, volume = I.tool_volume))
+ WELDER_FLOOR_SLICE_SUCCESS_MESSAGE
+ var/obj/structure/disposalconstruct/C = new (src.loc)
+ C.ptype = PIPE_DISPOSALS_OUTLET
+ C.update()
+ C.anchored = TRUE
+ C.density = TRUE
+ transfer_fingerprints_to(C)
+ qdel(src)
//When the disposalsoutlet is forcefully moved. Due to meteorshot or the recall item spell for instance
/obj/structure/disposaloutlet/Moved(atom/OldLoc, Dir)
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index fd94341d93c..5bbf8d93f90 100755
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -271,6 +271,8 @@
desc = "A chute for big and small packages alike!"
density = 1
icon_state = "intake"
+ required_mode_to_deconstruct = 1
+ deconstructs_to = PIPE_DISPOSALS_CHUTE
var/c_mode = 0
@@ -358,24 +360,6 @@
playsound(src.loc, I.usesound, 50, 1)
to_chat(user, "You attach the screws around the power connection.")
return
- else if(istype(I,/obj/item/weldingtool) && c_mode==1)
- var/obj/item/weldingtool/W = I
- if(W.remove_fuel(0,user))
- playsound(src.loc, W.usesound, 100, 1)
- to_chat(user, "You start slicing the floorweld off the delivery chute.")
- if(do_after(user, 20 * W.toolspeed, target = src))
- if(!src || !W.isOn()) return
- to_chat(user, "You sliced the floorweld off the delivery chute.")
- var/obj/structure/disposalconstruct/C = new (src.loc)
- C.ptype = PIPE_DISPOSALS_CHUTE
- C.update()
- C.anchored = 1
- C.density = 1
- qdel(src)
- return
- else
- to_chat(user, "You need more welding fuel to complete this task.")
- return
/obj/item/shippingPackage
name = "Shipping package"
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index 2ddab9b2f12..0332b30a413 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -94,7 +94,7 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
reagents.trans_to(I, reagents.total_volume)
I.loc = src.loc
materials.retrieve_all()
- default_deconstruction_crowbar(O)
+ default_deconstruction_crowbar(user, O)
return
else
to_chat(user, "You can't load the [src.name] while it's opened.")
diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm
index 027a8549df4..a360e0ee231 100644
--- a/code/modules/research/destructive_analyzer.dm
+++ b/code/modules/research/destructive_analyzer.dm
@@ -56,7 +56,7 @@ Note: Must be placed within 3 tiles of the R&D Console
if(exchange_parts(user, O))
return
- if(default_deconstruction_crowbar(O))
+ if(default_deconstruction_crowbar(user, O))
return
if(disabled)
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index 1548125b785..758943f39a7 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -125,7 +125,7 @@
return
if(panel_open && istype(O, /obj/item/crowbar))
- default_deconstruction_crowbar(O)
+ default_deconstruction_crowbar(user, O)
return
if(!checkCircumstances(O))
@@ -157,7 +157,7 @@
return
-/obj/machinery/r_n_d/experimentor/default_deconstruction_crowbar(obj/item/O)
+/obj/machinery/r_n_d/experimentor/default_deconstruction_crowbar(user, obj/item/O)
ejectItem()
..(O)
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index a441dff00b3..de71f51a0cd 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -102,7 +102,7 @@ Note: Must be placed west/left of and R&D console to function.
for(var/obj/item/reagent_containers/glass/G in component_parts)
reagents.trans_to(G, G.reagents.maximum_volume)
materials.retrieve_all()
- default_deconstruction_crowbar(O)
+ default_deconstruction_crowbar(user, O)
return 1
else
to_chat(user, "You can't load the [src.name] while it's opened.")
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index abb20ac091a..d7aefee96b7 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -146,7 +146,7 @@
if(panel_open)
if(istype(O, /obj/item/crowbar))
griefProtection()
- default_deconstruction_crowbar(O)
+ default_deconstruction_crowbar(user, O)
return 1
else
return ..()
diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm
index dbb8f597905..746e0ece0e8 100644
--- a/code/modules/research/xenobiology/xenobio_camera.dm
+++ b/code/modules/research/xenobiology/xenobio_camera.dm
@@ -163,15 +163,20 @@
if(loaded)
to_chat(user, "You fill [src] with the monkey cubes stored in [O]. [src] now has [monkeys] monkey cubes stored.")
return
- else if(ismultitool(O))
- var/obj/item/multitool/I = O
- if(istype(I.buffer, /obj/machinery/monkey_recycler))
- to_chat(user, "You link [src] with [I.buffer] in [I] buffer.")
- connected_recycler = I.buffer
- connected_recycler.connected += src
- return
return ..()
+/obj/machinery/computer/camera_advanced/xenobio/multitool_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(!I.multitool_check_buffer(user))
+ return
+ var/obj/item/multitool/M = I
+ if(istype(M.buffer, /obj/machinery/monkey_recycler))
+ M.set_multitool_buffer(user, src)
+ connected_recycler = M.buffer
+ connected_recycler.connected += src
+
/datum/action/innate/slime_place
name = "Place Slimes"
button_icon_state = "slime_down"
diff --git a/code/modules/ruins/lavalandruin_code/dead_ratvar.dm b/code/modules/ruins/lavalandruin_code/dead_ratvar.dm
index 4c37572c989..0d56293f1bc 100644
--- a/code/modules/ruins/lavalandruin_code/dead_ratvar.dm
+++ b/code/modules/ruins/lavalandruin_code/dead_ratvar.dm
@@ -92,22 +92,26 @@
/obj/structure/clockwork/wall_gear/emp_act(severity)
return
+/obj/structure/clockwork/wall_gear/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(anchored)
+ to_chat(user, "[src] needs to be unsecured to disassemble it!")
+ return
+ if(!I.tool_use_check(user, 0))
+ return
+ TOOL_ATTEMPT_DISMANTLE_MESSAGE
+ if(I.use_tool(src, user, 30, volume = I.tool_volume))
+ TOOL_DISMANTLE_SUCCESS_MESSAGE
+ deconstruct(TRUE)
+
+/obj/structure/clockwork/wall_gear/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ default_unfasten_wrench(user, I, 10)
+
/obj/structure/clockwork/wall_gear/attackby(obj/item/I, mob/user, params)
- if(iswrench(I))
- default_unfasten_wrench(user, I, 10)
- return 1
- else if(isscrewdriver(I))
- if(anchored)
- to_chat(user, "[src] needs to be unsecured to disassemble it!")
- else
- var/obj/item/screwdriver/S = I
- user.visible_message("[user] starts to disassemble [src].", "You start to disassemble [src]...")
- if(do_after(user, 30 * S.toolspeed, target = src) && !anchored)
- playsound(loc, S.usesound, 50, 1)
- to_chat(user, "You disassemble [src].")
- deconstruct(TRUE)
- return 1
- else if(istype(I, /obj/item/stack/tile/brass))
+ if(istype(I, /obj/item/stack/tile/brass))
var/obj/item/stack/tile/brass/W = I
if(W.get_amount() < 1)
to_chat(user, "You need one brass sheet to do this!")
diff --git a/code/modules/spacepods/construction.dm b/code/modules/spacepods/construction.dm
index a6a7ddb0927..eba600d883f 100644
--- a/code/modules/spacepods/construction.dm
+++ b/code/modules/spacepods/construction.dm
@@ -53,12 +53,12 @@
list(
"desc" = "A crudely-wired pod frame.",
state_prev = list(
- "key" = /obj/item/wirecutters,
+ "key" = TOOL_WIRECUTTER,
"vis_msg" = "{USER} cuts out the {HOLDER}'s wiring.",
"self_msg" = "You remove the {HOLDER}'s wiring."
),
state_next = list(
- "key" = /obj/item/screwdriver,
+ "key" = TOOL_SCREWDRIVER,
"vis_msg" = "{USER} adjusts the wiring.",
"self_msg" = "You adjust the {HOLDER}'s wiring."
)
@@ -67,7 +67,7 @@
list(
"desc" = "A wired pod frame.",
state_prev = list(
- "key" = /obj/item/screwdriver,
+ "key" = TOOL_SCREWDRIVER,
"vis_msg" = "{USER} unclips {HOLDER}'s wiring harnesses.",
"self_msg" = "You unclip {HOLDER}'s wiring harnesses."
),
@@ -82,7 +82,7 @@
list(
"desc" = "A wired pod frame with a loose mainboard.",
state_prev = list(
- "key" = /obj/item/crowbar,
+ "key" = TOOL_CROWBAR,
"vis_msg" = "{USER} pries out the mainboard.",
"self_msg" = "You pry out the mainboard.",
@@ -90,7 +90,7 @@
"amount" = 1
),
state_next = list(
- "key" = /obj/item/screwdriver,
+ "key" = TOOL_SCREWDRIVER,
"vis_msg" = "{USER} secures the mainboard.",
"self_msg" = "You secure the mainboard."
)
@@ -99,7 +99,7 @@
list(
"desc" = "A wired pod frame with a secured mainboard.",
state_prev = list(
- "key" = /obj/item/screwdriver,
+ "key" = TOOL_SCREWDRIVER,
"vis_msg" = "{USER} unsecures the mainboard.",
"self_msg" = "You unscrew the mainboard from the {HOLDER}."
),
@@ -115,7 +115,7 @@
list(
"desc" = "A naked space pod with a loose core.",
state_prev = list(
- "key" = /obj/item/crowbar,
+ "key" = TOOL_CROWBAR,
"vis_msg" = "{USER} delicately removes the core from the {HOLDER} with a crowbar.",
"self_msg" = "You delicately remove the core from the {HOLDER} with a crowbar.",
@@ -123,7 +123,7 @@
"amount" = 1
),
state_next = list(
- "key" = /obj/item/wrench,
+ "key" = TOOL_WRENCH,
"vis_msg" = "{USER} secures the core's bolts.",
"self_msg" = "You secure the core's bolts."
)
@@ -132,7 +132,7 @@
list(
"desc" = "A naked space pod with an exposed core. How lewd.",
state_prev = list(
- "key" = /obj/item/wrench,
+ "key" = TOOL_WRENCH,
"vis_msg" = "{USER} unsecures the {HOLDER}'s core.",
"self_msg" = "You unsecure the {HOLDER}'s core."
),
@@ -147,7 +147,7 @@
list(
"desc" = "A space pod with loose bulkhead panelling exposed.",
state_prev = list(
- "key" = /obj/item/crowbar,
+ "key" = TOOL_CROWBAR,
"vis_msg" = "{USER} pops the {HOLDER}'s bulkhead panelling loose.",
"self_msg" = "You pop the {HOLDER}'s bulkhead panelling loose.",
@@ -155,7 +155,7 @@
"amount" = 5,
),
state_next = list(
- "key" = /obj/item/wrench,
+ "key" = TOOL_WRENCH,
"vis_msg" = "{USER} secures the {HOLDER}'s bulkhead panelling.",
"self_msg" = "You secure the {HOLDER}'s bulkhead panelling."
)
@@ -164,12 +164,12 @@
list(
"desc" = "A space pod with unwelded bulkhead panelling exposed.",
state_prev = list(
- "key" = /obj/item/wrench,
+ "key" = TOOL_WRENCH,
"vis_msg" = "{USER} unbolts the {HOLDER}'s bulkhead panelling.",
"self_msg" = "You unbolt the {HOLDER}'s bulkhead panelling."
),
state_next = list(
- "key" = /obj/item/weldingtool,
+ "key" = TOOL_WELDER,
"vis_msg" = "{USER} seals the {HOLDER}'s bulkhead panelling with a weld.",
"self_msg" = "You seal the {HOLDER}'s bulkhead panelling with a weld."
)
@@ -178,7 +178,7 @@
list(
"desc" = "A space pod with sealed bulkhead panelling exposed.",
state_prev = list(
- "key" = /obj/item/weldingtool,
+ "key" = TOOL_WELDER,
"vis_msg" = "{USER} cuts the {HOLDER}'s bulkhead panelling loose.",
"self_msg" = "You cut the {HOLDER}'s bulkhead panelling loose."
),
@@ -193,14 +193,14 @@
list(
"desc" = "A space pod with unsecured armor.",
state_prev = list(
- "key" = /obj/item/crowbar,
+ "key" = TOOL_CROWBAR,
"vis_msg" = "{USER} pries off {HOLDER}'s armor.",
"self_msg" = "You pry off {HOLDER}'s armor.",
"spawn" = /obj/item/pod_parts/armor,
"amount" = 1
),
state_next = list(
- "key" = /obj/item/wrench,
+ "key" = TOOL_WRENCH,
"vis_msg" = "{USER} bolts down the {HOLDER}'s armor.",
"self_msg" = "You bolt down the {HOLDER}'s armor."
)
@@ -209,12 +209,12 @@
list(
"desc" = "A space pod with unsecured armor.",
state_prev = list(
- "key" = /obj/item/wrench,
+ "key" = TOOL_WRENCH,
"vis_msg" = "{USER} unsecures the {HOLDER}'s armor.",
"self_msg" = "You unsecure the {HOLDER}'s armor."
),
state_next = list(
- "key" = /obj/item/weldingtool,
+ "key" = TOOL_WELDER,
"vis_msg" = "{USER} welds the {HOLDER}'s armor.",
"self_msg" = "You weld the {HOLDER}'s armor."
)
diff --git a/code/modules/spacepods/equipment.dm b/code/modules/spacepods/equipment.dm
index 8ca4d1be65c..5996b5c7603 100644
--- a/code/modules/spacepods/equipment.dm
+++ b/code/modules/spacepods/equipment.dm
@@ -156,16 +156,16 @@
icon_state = "pod_locator"
enabled = 0
-/obj/item/spacepod_equipment/misc/tracker/attackby(obj/item/I as obj, mob/user as mob, params)
- if(isscrewdriver(I))
- if(enabled)
- enabled = 0
- user.show_message("You disable \the [src]'s power.")
- return
- enabled = 1
- user.show_message("You enable \the [src]'s power.")
- else
- return ..()
+/obj/item/spacepod_equipment/misc/tracker/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(enabled)
+ enabled = 0
+ user.show_message("You disable \the [src]'s power.")
+ return
+ enabled = 1
+ user.show_message("You enable \the [src]'s power.")
/*
///////////////////////////////////////
diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm
index 32239466b82..5b0be539578 100644
--- a/code/modules/spacepods/spacepod.dm
+++ b/code/modules/spacepods/spacepod.dm
@@ -312,106 +312,109 @@
to_chat(M, mymessage)
/obj/spacepod/attackby(obj/item/W as obj, mob/user as mob, params)
- if(user.a_intent == INTENT_HARM)
- ..()
- deal_damage(W.force)
- else
- if(iscrowbar(W))
- if(!equipment_system.lock_system || unlocked || hatch_open)
- hatch_open = !hatch_open
- playsound(loc, W.usesound, 50, 1)
- to_chat(user, "You [hatch_open ? "open" : "close"] the maintenance hatch.")
- else
- to_chat(user, "The hatch is locked shut!")
+ if(istype(W, /obj/item/stock_parts/cell))
+ if(!hatch_open)
+ to_chat(user, "The maintenance hatch is closed!")
return
- if(istype(W, /obj/item/stock_parts/cell))
- if(!hatch_open)
- to_chat(user, "The maintenance hatch is closed!")
- return
- if(battery)
- to_chat(user, "The pod already has a battery.")
- return
- to_chat(user, "You insert [W] into the pod.")
- user.drop_item(W)
- battery = W
- W.forceMove(src)
+ if(battery)
+ to_chat(user, "The pod already has a battery.")
return
- if(istype(W, /obj/item/spacepod_equipment))
- if(!hatch_open)
- to_chat(user, "The maintenance hatch is closed!")
- return
- if(!equipment_system)
- to_chat(user, "The pod has no equipment datum, yell at the coders")
- return
- if(istype(W, /obj/item/spacepod_equipment/weaponry))
- add_equipment(user, W, "weapon_system")
- return
- if(istype(W, /obj/item/spacepod_equipment/misc))
- add_equipment(user, W, "misc_system")
- return
- if(istype(W, /obj/item/spacepod_equipment/cargo))
- add_equipment(user, W, "cargo_system")
- return
- if(istype(W, /obj/item/spacepod_equipment/sec_cargo))
- add_equipment(user, W, "sec_cargo_system")
- return
- if(istype(W, /obj/item/spacepod_equipment/lock))
- add_equipment(user, W, "lock_system")
- return
-
- if(istype(W, /obj/item/spacepod_key) && istype(equipment_system.lock_system, /obj/item/spacepod_equipment/lock/keyed))
- var/obj/item/spacepod_key/key = W
- if(key.id == equipment_system.lock_system.id)
- lock_pod()
- return
- else
- to_chat(user, "This is the wrong key!")
- return
-
- if(istype(W, /obj/item/weldingtool))
- if(!hatch_open)
- to_chat(user, "You must open the maintenance hatch before attempting repairs.")
- return
- var/obj/item/weldingtool/WT = W
- if(!WT.isOn())
- to_chat(user, "The welder must be on for this task.")
- return
- if(health < initial(health))
- to_chat(user, "You start welding the spacepod...")
- playsound(loc, W.usesound, 50, 1)
- if(do_after(user, 20 * W.toolspeed, target = src))
- if(!src || !WT.remove_fuel(3, user)) return
- repair_damage(10)
- to_chat(user, "You mend some [pick("dents","bumps","damage")] with [WT]")
- return
- to_chat(user, "[src] is fully repaired!")
+ to_chat(user, "You insert [W] into the pod.")
+ user.drop_item(W)
+ battery = W
+ W.forceMove(src)
+ return
+ else if(istype(W, /obj/item/spacepod_equipment))
+ if(!hatch_open)
+ to_chat(user, "The maintenance hatch is closed!")
+ return
+ if(!equipment_system)
+ to_chat(user, "The pod has no equipment datum, yell at the coders")
+ return
+ if(istype(W, /obj/item/spacepod_equipment/weaponry))
+ add_equipment(user, W, "weapon_system")
+ return
+ if(istype(W, /obj/item/spacepod_equipment/misc))
+ add_equipment(user, W, "misc_system")
+ return
+ if(istype(W, /obj/item/spacepod_equipment/cargo))
+ add_equipment(user, W, "cargo_system")
+ return
+ if(istype(W, /obj/item/spacepod_equipment/sec_cargo))
+ add_equipment(user, W, "sec_cargo_system")
+ return
+ if(istype(W, /obj/item/spacepod_equipment/lock))
+ add_equipment(user, W, "lock_system")
return
- if(istype(W, /obj/item/lock_buster))
- var/obj/item/lock_buster/L = W
- if(L.on && equipment_system.lock_system)
- user.visible_message(user, "[user] is drilling through the [src]'s lock!",
- "You start drilling through the [src]'s lock!")
- if(do_after(user, 100 * W.toolspeed, target = src))
- QDEL_NULL(equipment_system.lock_system)
- unlocked = TRUE
- user.visible_message(user, "[user] has destroyed the [src]'s lock!",
- "You destroy the [src]'s lock!")
- else
- user.visible_message(user, "[user] fails to break through the [src]'s lock!",
- "You were unable to break through the [src]'s lock!")
- return
- if(L.on && unlocked == FALSE) //The buster is on, we don't have a lock system, and the pod is still somehow locked, unlocking.
+ else if(istype(W, /obj/item/spacepod_key) && istype(equipment_system.lock_system, /obj/item/spacepod_equipment/lock/keyed))
+ var/obj/item/spacepod_key/key = W
+ if(key.id == equipment_system.lock_system.id)
+ lock_pod()
+ return
+ else
+ to_chat(user, "This is the wrong key!")
+ return
+
+ else if(istype(W, /obj/item/lock_buster))
+ var/obj/item/lock_buster/L = W
+ if(L.on && equipment_system.lock_system)
+ user.visible_message(user, "[user] is drilling through the [src]'s lock!",
+ "You start drilling through the [src]'s lock!")
+ if(do_after(user, 100 * W.toolspeed, target = src))
+ QDEL_NULL(equipment_system.lock_system)
unlocked = TRUE
- user.visible_message(user, "[user] repairs [src]'s doors with [L].",
- "You repair [src]'s doors with [L].")
- to_chat(user, "Turn the [L] on first.")
+ user.visible_message(user, "[user] has destroyed the [src]'s lock!",
+ "You destroy the [src]'s lock!")
+ else
+ user.visible_message(user, "[user] fails to break through the [src]'s lock!",
+ "You were unable to break through the [src]'s lock!")
return
+ if(L.on && unlocked == FALSE) //The buster is on, we don't have a lock system, and the pod is still somehow locked, unlocking.
+ unlocked = TRUE
+ user.visible_message(user, "[user] repairs [src]'s doors with [L].",
+ "You repair [src]'s doors with [L].")
+ to_chat(user, "Turn the [L] on first.")
+ return
- if(cargo_hold.storage_slots > 0 && !hatch_open && unlocked) // must be the last option as all items not listed prior will be stored
- cargo_hold.attackby(W, user, params)
+ else if(cargo_hold.storage_slots > 0 && !hatch_open && unlocked) // must be the last option as all items not listed prior will be stored
+ cargo_hold.attackby(W, user, params)
+ else
+ if(user.a_intent == INTENT_HARM)
+ deal_damage(W.force)
+ return ..()
-obj/spacepod/proc/add_equipment(mob/user, var/obj/item/spacepod_equipment/SPE, var/slot)
+/obj/spacepod/crowbar_act(mob/user, obj/item/I)
+ if(user.a_intent == INTENT_HARM)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(!equipment_system.lock_system || unlocked || hatch_open)
+ hatch_open = !hatch_open
+ to_chat(user, "You [hatch_open ? "open" : "close"] the maintenance hatch.")
+ else
+ to_chat(user, "The hatch is locked shut!")
+
+/obj/spacepod/welder_act(mob/user, obj/item/I)
+ if(user.a_intent == INTENT_HARM)
+ return
+ . = TRUE
+ if(!hatch_open)
+ to_chat(user, "You must open the maintenance hatch before attempting repairs.")
+ return
+ if(health >= initial(health))
+ to_chat(user, "[src] is fully repaired!")
+ return
+ if(!I.tool_use_check(user, 0))
+ return
+ to_chat(user, "You start welding the spacepod...")
+ if(I.use_tool(src, user, 20, 3, volume = I.tool_volume))
+ repair_damage(10)
+ to_chat(user, "You mend some [pick("dents","bumps","damage")] with [I]")
+
+
+/obj/spacepod/proc/add_equipment(mob/user, var/obj/item/spacepod_equipment/SPE, var/slot)
if(equipment_system.vars[slot])
to_chat(user, "The pod already has a [slot], remove it first.")
return
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index 840b2ed5749..6215bbe88bc 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -33,17 +33,18 @@
. = ..()
. += "[src] is assembled in the [parent_organ == "r_arm" ? "right" : "left"] arm configuration. You can use a screwdriver to reassemble it."
-/obj/item/organ/internal/cyberimp/arm/attackby(obj/item/I, mob/user, params)
- if(isscrewdriver(I))
- if(parent_organ == "r_arm")
- parent_organ = "l_arm"
- else
- parent_organ = "r_arm"
- slot = parent_organ + "_device"
- to_chat(user, "You modify [src] to be installed on the [parent_organ == "r_arm" ? "right" : "left"] arm.")
- update_icon()
+/obj/item/organ/internal/cyberimp/arm/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(parent_organ == "r_arm")
+ parent_organ = "l_arm"
else
- return ..()
+ parent_organ = "r_arm"
+ slot = parent_organ + "_device"
+ to_chat(user, "You modify [src] to be installed on the [parent_organ == "r_arm" ? "right" : "left"] arm.")
+ update_icon()
+
/obj/item/organ/internal/cyberimp/arm/remove(mob/living/carbon/M, special = 0)
Retract()
diff --git a/code/modules/surgery/rig_removal.dm b/code/modules/surgery/rig_removal.dm
index 1fbd3e528a3..de15eacf8f3 100644
--- a/code/modules/surgery/rig_removal.dm
+++ b/code/modules/surgery/rig_removal.dm
@@ -31,10 +31,11 @@
/datum/surgery_step/hardsuit/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(!istype(target))
return 0
- if(istype(tool,/obj/item/weldingtool))
- var/obj/item/weldingtool/welder = tool
- if(!welder.isOn() || !welder.remove_fuel(1,user))
- return 0
+ if(tool.tool_behaviour == TOOL_WELDER)
+ if(!tool.tool_use_check(user, 0))
+ return
+ if(!tool.use(1))
+ return
return (target_zone == "chest") && istype(target.back, /obj/item/rig) && (target.back.flags&NODROP)
/datum/surgery_step/rigsuit/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm
index c3198b961be..31164aaf54e 100644
--- a/code/modules/surgery/robotics.dm
+++ b/code/modules/surgery/robotics.dm
@@ -225,9 +225,8 @@
if(!(affected.brute_dam > 0 || affected.disfigured))
to_chat(user, "The [affected] does not require welding repair!")
return -1
- if(istype(tool,/obj/item/weldingtool))
- var/obj/item/weldingtool/welder = tool
- if(!welder.isOn() || !welder.remove_fuel(1,user))
+ if(tool.tool_behaviour == TOOL_WELDER)
+ if(!tool.use(1))
return -1
user.visible_message("[user] begins to patch damage to [target]'s [affected.name]'s support structure with \the [tool]." , \
"You begin to patch damage to [target]'s [affected.name]'s support structure with \the [tool].")
diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm
index 581df91e267..1ec94634b47 100644
--- a/code/modules/telesci/telepad.dm
+++ b/code/modules/telesci/telepad.dm
@@ -37,23 +37,28 @@
efficiency = E
/obj/machinery/telepad/attackby(obj/item/I, mob/user, params)
- if(default_deconstruction_screwdriver(user, "pad-idle-o", "pad-idle", I))
- return
-
- if(panel_open)
- if(istype(I, /obj/item/multitool))
- var/obj/item/multitool/M = I
- M.buffer = src
- to_chat(user, "You save the data in the [I.name]'s buffer.")
- return
-
if(exchange_parts(user, I))
return
-
- if(default_deconstruction_crowbar(I))
- return
return ..()
+/obj/machinery/telepad/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ default_deconstruction_screwdriver(user, "pad-idle-o", "pad-idle", I)
+
+/obj/machinery/telepad/multitool_act(mob/user, obj/item/I)
+ if(!panel_open)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ if(!I.multitool_check_buffer(user))
+ return
+ var/obj/item/multitool/M = I
+ M.set_multitool_buffer(user, src)
+
+/obj/machinery/telepad/crowbar_act(mob/user, obj/item/I)
+ . = TRUE
+ default_deconstruction_crowbar(user, I)
//CARGO TELEPAD//
/obj/machinery/telepad_cargo
@@ -67,32 +72,23 @@
active_power_usage = 500
var/stage = 0
-/obj/machinery/telepad_cargo/attackby(obj/item/I, mob/user, params)
- if(iswrench(I))
- playsound(src, I.usesound, 50, 1)
- if(anchored)
- anchored = FALSE
- to_chat(user, " The [src] can now be moved.")
- else if(!anchored)
- anchored = TRUE
- to_chat(user, " The [src] is now secured.")
+/obj/machinery/telepad_cargo/crowbar_act(mob/living/user, obj/item/I)
+ if(stage != 1)
return
- if(isscrewdriver(I))
- if(stage == 0)
- playsound(src, I.usesound, 50, 1)
- to_chat(user, " You unscrew the telepad's tracking beacon.")
- stage = 1
- else if(stage == 1)
- playsound(src, I.usesound, 50, 1)
- to_chat(user, " You screw in the telepad's tracking beacon.")
- stage = 0
+ . = TRUE
+ default_deconstruction_crowbar(user, I)
+
+/obj/machinery/telepad_cargo/screwdriver_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
return
- if(iswelder(I) && stage == 1)
- playsound(src, I.usesound, 50, 1)
- to_chat(user, " You disassemble the telepad.")
- deconstruct(TRUE)
- return
- return ..()
+ to_chat(user, " You [stage ? "screw in" : "unscrew"] the telepad's tracking beacon.")
+ stage = !stage
+
+/obj/machinery/telepad_cargo/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ default_unfasten_wrench(user, I)
+
/obj/machinery/telepad_cargo/deconstruct(disassembled = TRUE)
if(!(flags & NODECONSTRUCT))
diff --git a/paradise.dme b/paradise.dme
index 62d9624cf5c..c5d936d7597 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -65,6 +65,7 @@
#include "code\__DEFINES\station_goals.dm"
#include "code\__DEFINES\status_effects.dm"
#include "code\__DEFINES\subsystems.dm"
+#include "code\__DEFINES\tools.dm"
#include "code\__DEFINES\typeids.dm"
#include "code\__DEFINES\vv.dm"
#include "code\__DEFINES\zlevel.dm"
@@ -89,6 +90,7 @@
#include "code\__HELPERS\sanitize_values.dm"
#include "code\__HELPERS\text.dm"
#include "code\__HELPERS\time.dm"
+#include "code\__HELPERS\tool_helpers.dm"
#include "code\__HELPERS\traits.dm"
#include "code\__HELPERS\type2type.dm"
#include "code\__HELPERS\typelists.dm"
@@ -869,7 +871,6 @@
#include "code\game\objects\items\devices\lightreplacer.dm"
#include "code\game\objects\items\devices\machineprototype.dm"
#include "code\game\objects\items\devices\megaphone.dm"
-#include "code\game\objects\items\devices\multitool.dm"
#include "code\game\objects\items\devices\paicard.dm"
#include "code\game\objects\items\devices\pipe_painter.dm"
#include "code\game\objects\items\devices\pizza_bomb.dm"
@@ -917,6 +918,13 @@
#include "code\game\objects\items\stacks\sheets\sheets.dm"
#include "code\game\objects\items\stacks\tiles\tile_mineral.dm"
#include "code\game\objects\items\stacks\tiles\tile_types.dm"
+#include "code\game\objects\items\tools\crowbar.dm"
+#include "code\game\objects\items\tools\multitool.dm"
+#include "code\game\objects\items\tools\screwdriver.dm"
+#include "code\game\objects\items\tools\tool_behaviour.dm"
+#include "code\game\objects\items\tools\welder.dm"
+#include "code\game\objects\items\tools\wirecutters.dm"
+#include "code\game\objects\items\tools\wrench.dm"
#include "code\game\objects\items\weapons\AI_modules.dm"
#include "code\game\objects\items\weapons\alien_specific.dm"
#include "code\game\objects\items\weapons\bee_briefcase.dm"
@@ -926,6 +934,7 @@
#include "code\game\objects\items\weapons\chrono_eraser.dm"
#include "code\game\objects\items\weapons\cigs.dm"
#include "code\game\objects\items\weapons\clown_items.dm"
+#include "code\game\objects\items\weapons\conversion_kit.dm"
#include "code\game\objects\items\weapons\cosmetics.dm"
#include "code\game\objects\items\weapons\courtroom.dm"
#include "code\game\objects\items\weapons\defib.dm"
@@ -970,7 +979,6 @@
#include "code\game\objects\items\weapons\tape.dm"
#include "code\game\objects\items\weapons\teleportation.dm"
#include "code\game\objects\items\weapons\teleprod.dm"
-#include "code\game\objects\items\weapons\tools.dm"
#include "code\game\objects\items\weapons\twohanded.dm"
#include "code\game\objects\items\weapons\vending_items.dm"
#include "code\game\objects\items\weapons\weaponry.dm"