diff --git a/code/__DEFINES/tools.dm b/code/__DEFINES/tools.dm index e4eaf093479..b3327665178 100644 --- a/code/__DEFINES/tools.dm +++ b/code/__DEFINES/tools.dm @@ -5,3 +5,8 @@ #define TOOL_WIRECUTTER "wirecutter" #define TOOL_WRENCH "wrench" #define TOOL_WELDER "welder" + + +// If delay between the start and the end of tool operation is less than MIN_TOOL_SOUND_DELAY, +// tool sound is only played when op is started. If not, it's played twice. +#define MIN_TOOL_SOUND_DELAY 20 diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 5500c5bb6f6..c202242da96 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -534,38 +534,38 @@ // Tool behavior procedure. Redirects to tool-specific procs by default. // You can override it to catch all tool interactions, for use in complex deconstruction procs. // Just don't forget to return ..() in the end. -/atom/proc/tool_act(mob/living/user, obj/item/tool, tool_type) +/atom/proc/tool_act(mob/living/user, obj/item/I, tool_type) switch(tool_type) if(TOOL_CROWBAR) - return crowbar_act(user, tool) + return crowbar_act(user, I) if(TOOL_MULTITOOL) - return multitool_act(user, tool) + return multitool_act(user, I) if(TOOL_SCREWDRIVER) - return screwdriver_act(user, tool) + return screwdriver_act(user, I) if(TOOL_WRENCH) - return wrench_act(user, tool) + return wrench_act(user, I) if(TOOL_WIRECUTTER) - return wirecutter_act(user, tool) + return wirecutter_act(user, I) if(TOOL_WELDER) - return welder_act(user, tool) + return welder_act(user, I) // Tool-specific behavior procs. To be overridden in subtypes. -/atom/proc/crowbar_act(mob/living/user, obj/item/tool) +/atom/proc/crowbar_act(mob/living/user, obj/item/I) return -/atom/proc/multitool_act(mob/living/user, obj/item/tool) +/atom/proc/multitool_act(mob/living/user, obj/item/I) return -/atom/proc/screwdriver_act(mob/living/user, obj/item/tool) +/atom/proc/screwdriver_act(mob/living/user, obj/item/I) return -/atom/proc/wrench_act(mob/living/user, obj/item/tool) +/atom/proc/wrench_act(mob/living/user, obj/item/I) return -/atom/proc/wirecutter_act(mob/living/user, obj/item/tool) +/atom/proc/wirecutter_act(mob/living/user, obj/item/I) return -/atom/proc/welder_act(mob/living/user, obj/item/tool) +/atom/proc/welder_act(mob/living/user, obj/item/I) return /atom/proc/GenerateTag() diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index ba8be95065c..e182921abbf 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -80,21 +80,21 @@ update_icon() else if(istype(O, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) - var/obj/item/weldingtool/WT = O 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() + if(!O.tool_start_check(user, amount=0)) + return + user.visible_message("[user] is repairing [src].", \ + "You begin repairing [src]...", \ + "You hear welding.") + playsound(loc, O.usesound, 40, 1) + if(O.use_tool(src, user, 40)) + if(!(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 diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 20a88382fab..f1a3ca605de 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -290,18 +290,17 @@ Class Procs: /obj/machinery/proc/RefreshParts() //Placeholder proc for machines that are built using frames. return -/obj/machinery/proc/default_pry_open(obj/item/crowbar/C) - . = !(state_open || panel_open || is_operational() || (flags_1 & NODECONSTRUCT_1)) && istype(C) +/obj/machinery/proc/default_pry_open(obj/item/I) + . = !(state_open || panel_open || is_operational() || (flags_1 & NODECONSTRUCT_1)) && I.tool_behaviour == TOOL_CROWBAR if(.) - playsound(loc, C.usesound, 50, 1) + I.play_tool_sound(src, 50) visible_message("[usr] pries open \the [src].", "You pry open \the [src].") open_machine() - return 1 -/obj/machinery/proc/default_deconstruction_crowbar(obj/item/crowbar/C, ignore_panel = 0) - . = istype(C) && (panel_open || ignore_panel) && !(flags_1 & NODECONSTRUCT_1) +/obj/machinery/proc/default_deconstruction_crowbar(obj/item/I, ignore_panel = 0) + . = (panel_open || ignore_panel) && !(flags_1 & NODECONSTRUCT_1) && I.tool_behaviour == TOOL_CROWBAR if(.) - playsound(loc, C.usesound, 50, 1) + I.play_tool_sound(src, 50) deconstruct(TRUE) /obj/machinery/deconstruct(disassembled = TRUE) @@ -337,9 +336,9 @@ Class Procs: update_icon() updateUsrDialog() -/obj/machinery/proc/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver/S) - if(istype(S) && !(flags_1 & NODECONSTRUCT_1)) - playsound(loc, S.usesound, 50, 1) +/obj/machinery/proc/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/I) + if(!(flags_1 & NODECONSTRUCT_1) && I.tool_behaviour == TOOL_SCREWDRIVER) + I.play_tool_sound(src, 50) if(!panel_open) panel_open = TRUE icon_state = icon_state_open @@ -351,9 +350,9 @@ Class Procs: return 1 return 0 -/obj/machinery/proc/default_change_direction_wrench(mob/user, 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(panel_open && I.tool_behaviour == TOOL_WRENCH) + I.play_tool_sound(src, 50) setDir(turn(dir,-90)) to_chat(user, "You rotate [src].") return 1 @@ -365,20 +364,20 @@ Class Procs: return FAILED_UNFASTEN return SUCCESSFUL_UNFASTEN -/obj/proc/default_unfasten_wrench(mob/user, obj/item/wrench/W, time = 20) //try to unwrench an object in a WONDERFUL DYNAMIC WAY - if(istype(W) && !(flags_1 & NODECONSTRUCT_1)) +/obj/proc/default_unfasten_wrench(mob/user, obj/item/I, time = 20) //try to unwrench an object in a WONDERFUL DYNAMIC WAY + if(!(flags_1 & NODECONSTRUCT_1) && I.tool_behaviour == TOOL_WRENCH) var/can_be_unfasten = can_be_unfasten_wrench(user) if(!can_be_unfasten || can_be_unfasten == FAILED_UNFASTEN) return can_be_unfasten if(time) to_chat(user, "You begin [anchored ? "un" : ""]securing [src]...") - playsound(loc, W.usesound, 50, 1) + I.play_tool_sound(src, 50) var/prev_anchored = anchored //as long as we're the same anchored state and we're either on a floor or are anchored, toggle our anchored state - if(!time || do_after(user, time*W.toolspeed, target = src, extra_checks = CALLBACK(src, .proc/unfasten_wrench_check, prev_anchored, user))) + if(I.use_tool(src, user, time, extra_checks = CALLBACK(src, .proc/unfasten_wrench_check, prev_anchored, user))) to_chat(user, "You [anchored ? "un" : ""]secure [src].") anchored = !anchored - playsound(loc, 'sound/items/deconstruct.ogg', 50, 1) + playsound(src, 'sound/items/deconstruct.ogg', 50, 1) return SUCCESSFUL_UNFASTEN return FAILED_UNFASTEN return CANT_UNFASTEN diff --git a/code/game/machinery/aug_manipulator.dm b/code/game/machinery/aug_manipulator.dm index 299b0500cef..3e4bc1718fd 100644 --- a/code/game/machinery/aug_manipulator.dm +++ b/code/game/machinery/aug_manipulator.dm @@ -74,21 +74,23 @@ update_icon() else if(istype(O, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) - var/obj/item/weldingtool/WT = O if(obj_integrity < max_integrity) - if(WT.remove_fuel(0,user)) - user.visible_message("[user] begins repairing [src].", \ - "You begin repairing [src]...", \ - "You hear welding.") - playsound(src, WT.usesound, 40, 1) - if(do_after(user,40*WT.toolspeed, TRUE, target = src)) - if(!WT.isOn() || !(stat & BROKEN)) - return - to_chat(user, "You repair [src].") - playsound(src, 'sound/items/welder2.ogg', 50, 1) - stat &= ~BROKEN - obj_integrity = max(obj_integrity, max_integrity) - update_icon() + if(!O.tool_start_check(user, amount=0)) + return + + user.visible_message("[user] begins repairing [src].", \ + "You begin repairing [src]...", \ + "You hear welding.") + + playsound(src, O.usesound, 40, 1) + if(O.use_tool(src, user, 40)) + if(!(stat & BROKEN)) + return + to_chat(user, "You repair [src].") + playsound(src, 'sound/items/welder2.ogg', 50, 1) + stat &= ~BROKEN + obj_integrity = max(obj_integrity, max_integrity) + update_icon() else to_chat(user, "[src] does not need repairs.") else diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index b98976d83c7..510243c12a8 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -88,7 +88,7 @@ if(!device && !board && istype(W, /obj/item/wrench)) to_chat(user, "You start unsecuring the button frame...") playsound(loc, W.usesound, 50, 1) - if(do_after(user, 40*W.toolspeed, target = src)) + if(W.use_tool(src, user, 40)) to_chat(user, "You unsecure the button frame.") transfer_fingerprints_to(new /obj/item/wallframe/button(get_turf(src))) playsound(loc, 'sound/items/deconstruct.ogg', 50, 1) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 14502b9e46e..249745dfc2a 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -367,19 +367,16 @@ return null -/obj/machinery/camera/proc/weld(obj/item/weldingtool/WT, mob/living/user) +/obj/machinery/camera/proc/weld(obj/item/weldingtool/W, mob/living/user) if(busy) return FALSE - if(!WT.remove_fuel(0, user)) + if(!W.tool_start_check(user, amount=0)) return FALSE to_chat(user, "You start to weld [src]...") - playsound(src.loc, WT.usesound, 50, 1) busy = TRUE - if(do_after(user, 100*WT.toolspeed, target = src)) + if(W.use_tool(src, user, 100, volume=50)) busy = FALSE - if(!WT.isOn()) - return FALSE return TRUE busy = FALSE return FALSE diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index b6cec231106..897d783e117 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -128,16 +128,15 @@ qdel(src) return TRUE -/obj/structure/camera_assembly/proc/weld(obj/item/weldingtool/WT, mob/living/user) - if(!WT.remove_fuel(0, user)) - return 0 +/obj/structure/camera_assembly/proc/weld(obj/item/weldingtool/W, mob/living/user) + if(!W.tool_start_check(user, amount=0)) + return FALSE to_chat(user, "You start to weld \the [src]...") - playsound(src.loc, WT.usesound, 50, 1) - if(do_after(user, 20*WT.toolspeed, target = src)) - if(WT.isOn()) - playsound(loc, 'sound/items/welder2.ogg', 50, 1) - return 1 - return 0 + playsound(src.loc, W.usesound, 50, 1) + if(W.use_tool(src, user, 20)) + playsound(loc, 'sound/items/welder2.ogg', 50, 1) + return TRUE + return FALSE /obj/structure/camera_assembly/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index 44c39d80969..2bae3b30bdb 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -69,14 +69,13 @@ update_icon() return -/obj/machinery/computer/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/screwdriver) && circuit && !(flags_1&NODECONSTRUCT_1)) - playsound(src.loc, I.usesound, 50, 1) - to_chat(user, " You start to disconnect the monitor...") - if(do_after(user, 20*I.toolspeed, target = src)) +/obj/machinery/computer/screwdriver_act(mob/living/user, obj/item/I) + if(circuit && !(flags_1&NODECONSTRUCT_1)) + to_chat(user, "You start to disconnect the monitor...") + if(I.use_tool(src, user, 20, volume=50)) deconstruct(TRUE, user) - else - return ..() + return TRUE + /obj/machinery/computer/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 1cf95877dd9..9053777da58 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -8,24 +8,18 @@ switch(state) if(0) if(istype(P, /obj/item/wrench)) - playsound(src, P.usesound, 50, 1) to_chat(user, "You start wrenching the frame into place...") - if(do_after(user, 20*P.toolspeed, target = src)) + if(P.use_tool(src, user, 20, volume=50)) to_chat(user, "You wrench the frame into place.") anchored = TRUE state = 1 return if(istype(P, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = P - if(!WT.remove_fuel(0, user)) - if(!WT.isOn()) - to_chat(user, "[WT] must be on to complete this task!") + if(!P.tool_start_check(user, amount=0)) return - playsound(src, P.usesound, 50, 1) + to_chat(user, "You start deconstructing the frame...") - if(do_after(user, 20*P.toolspeed, target = src)) - if(!src || !WT.isOn()) - return + if(P.use_tool(src, user, 20, volume=50)) to_chat(user, "You deconstruct the frame.") var/obj/item/stack/sheet/metal/M = new (drop_location(), 5) M.add_fingerprint(user) @@ -33,9 +27,8 @@ return if(1) if(istype(P, /obj/item/wrench)) - playsound(src, P.usesound, 50, 1) to_chat(user, "You start to unfasten the frame...") - if(do_after(user, 20*P.toolspeed, target = src)) + if(P.use_tool(src, user, 20, volume=50)) to_chat(user, "You unfasten the frame.") anchored = FALSE state = 0 @@ -76,18 +69,16 @@ icon_state = "1" return if(istype(P, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = P - if(C.get_amount() >= 5) - playsound(src, 'sound/items/deconstruct.ogg', 50, 1) - to_chat(user, "You start adding cables to the frame...") - if(do_after(user, 20*P.toolspeed, target = src)) - if(C.get_amount() >= 5 && state == 2) - C.use(5) - to_chat(user, "You add cables to the frame.") - state = 3 - icon_state = "3" - else - to_chat(user, "You need five lengths of cable to wire the frame!") + if(!P.tool_start_check(user, amount=5)) + return + playsound(src, 'sound/items/deconstruct.ogg', 50, 1) + to_chat(user, "You start adding cables to the frame...") + if(P.use_tool(src, user, 20, amount=5)) + if(state != 2) + return + to_chat(user, "You add cables to the frame.") + state = 3 + icon_state = "3" return if(3) if(istype(P, /obj/item/wirecutters)) @@ -95,25 +86,21 @@ to_chat(user, "You remove the cables.") state = 2 icon_state = "2" - var/obj/item/stack/cable_coil/A = new (drop_location()) - A.amount = 5 + var/obj/item/stack/cable_coil/A = new (drop_location(), 5) A.add_fingerprint(user) return if(istype(P, /obj/item/stack/sheet/glass)) - var/obj/item/stack/sheet/glass/G = P - if(G.get_amount() < 2) - to_chat(user, "You need two glass sheets to continue construction!") + if(!P.tool_start_check(user, amount=2)) return - else - playsound(src, 'sound/items/deconstruct.ogg', 50, 1) - to_chat(user, "You start to put in the glass panel...") - if(do_after(user, 20, target = src)) - if(G.get_amount() >= 2 && state == 3) - G.use(2) - to_chat(user, "You put in the glass panel.") - state = 4 - src.icon_state = "4" + playsound(src, 'sound/items/deconstruct.ogg', 50, 1) + to_chat(user, "You start to put in the glass panel...") + if(P.use_tool(src, user, 20, amount=2)) + if(state != 3) + return + to_chat(user, "You put in the glass panel.") + state = 4 + src.icon_state = "4" return if(4) if(istype(P, /obj/item/crowbar)) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 97830393bd1..65510d7aab9 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -81,24 +81,20 @@ to_chat(user, "This frame does not accept circuit boards of this type!") return if(istype(P, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = P - if(C.get_amount() >= 5) - playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) - to_chat(user, "You start to add cables to the frame...") - if(do_after(user, 20*P.toolspeed, target = src)) - if(C.get_amount() >= 5 && state == 1) - C.use(5) - to_chat(user, "You add cables to the frame.") - state = 2 - icon_state = "box_1" - else - to_chat(user, "You need five length of cable to wire the frame!") + if(!P.tool_start_check(user, amount=5)) + return + + to_chat(user, "You start to add cables to the frame...") + if(P.use_tool(src, user, 20, volume=50, amount=5)) + to_chat(user, "You add cables to the frame.") + state = 2 + icon_state = "box_1" + return if(istype(P, /obj/item/screwdriver) && !anchored) - playsound(src.loc, P.usesound, 50, 1) user.visible_message("[user] disassembles the frame.", \ "You start to disassemble the frame...", "You hear banging and clanking.") - if(do_after(user, 40*P.toolspeed, target = src)) + if(P.use_tool(src, user, 40, volume=50)) if(state == 1) to_chat(user, "You disassemble the frame.") var/obj/item/stack/sheet/metal/M = new (loc, 5) @@ -107,8 +103,7 @@ return if(istype(P, /obj/item/wrench)) to_chat(user, "You start [anchored ? "un" : ""]securing [name]...") - playsound(src.loc, P.usesound, 75, 1) - if(do_after(user, 40*P.toolspeed, target = src)) + if(P.use_tool(src, user, 40, volume=75)) if(state == 1) to_chat(user, "You [anchored ? "un" : ""]secure [name].") anchored = !anchored @@ -117,8 +112,7 @@ if(2) if(istype(P, /obj/item/wrench)) to_chat(user, "You start [anchored ? "un" : ""]securing [name]...") - playsound(src.loc, P.usesound, 75, 1) - if(do_after(user, 40*P.toolspeed, target = src)) + if(P.use_tool(src, user, 40, volume=75)) to_chat(user, "You [anchored ? "un" : ""]secure [name].") anchored = !anchored return @@ -149,8 +143,7 @@ to_chat(user, "You remove the cables.") state = 1 icon_state = "box_0" - var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc ) - A.amount = 5 + new /obj/item/stack/cable_coil(drop_location(), 5) return if(3) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 66896e8794d..3edf261dda7 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -27,13 +27,13 @@ /obj/structure/barricade/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weldingtool) && user.a_intent != INTENT_HARM && 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) + if(!I.tool_start_check(user, amount=0)) + return + + to_chat(user, "You begin repairing [src]...") + if(I.use_tool(src, user, 40, volume=40)) + obj_integrity = CLAMP(obj_integrity + 20, 0, max_integrity) else return ..() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 325adb30b73..d8040b2cfbc 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -782,15 +782,12 @@ return if(AIRLOCK_SECURITY_METAL) if(istype(C, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = C - if(!WT.remove_fuel(2, user)) + if(!C.tool_start_check(user, amount=2)) 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()) + if(C.use_tool(src, user, 40, volume=50, amount = 2)) + if(!panel_open) 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.") @@ -802,8 +799,7 @@ if(istype(C, /obj/item/crowbar)) 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(W.use_tool(src, user, 40, volume=100)) if(!panel_open) return if(security_level != AIRLOCK_SECURITY_PLASTEEL_I_S) @@ -818,15 +814,12 @@ return if(AIRLOCK_SECURITY_PLASTEEL_I) if(istype(C, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = C - if(!WT.remove_fuel(2, user)) + if(!C.tool_start_check(user, amount=2)) 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()) + if(C.use_tool(src, user, 40, volume=50, amount=2)) + if(!panel_open) 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.") @@ -834,10 +827,8 @@ return if(AIRLOCK_SECURITY_PLASTEEL_O_S) if(istype(C, /obj/item/crowbar)) - 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(C.use_tool(src, user, 40, volume=100)) if(!panel_open) return if(security_level != AIRLOCK_SECURITY_PLASTEEL_O_S) @@ -849,15 +840,12 @@ return if(AIRLOCK_SECURITY_PLASTEEL_O) if(istype(C, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = C - if(!WT.remove_fuel(2, user)) + if(!C.tool_start_check(user, amount=2)) 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()) + if(C.use_tool(src, user, 40, volume=50, amount=2)) + if(!panel_open) 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.") @@ -865,12 +853,10 @@ return if(AIRLOCK_SECURITY_PLASTEEL) if(istype(C, /obj/item/wirecutters)) - var/obj/item/wirecutters/W = C if(src.hasPower() && src.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(C.use_tool(src, user, 10, volume=100)) if(!panel_open) return user.visible_message("[user] cut through \the [src]'s outer grille.", @@ -932,36 +918,38 @@ /obj/machinery/door/airlock/try_to_weld(obj/item/weldingtool/W, mob/user) if(!operating && density) if(user.a_intent != INTENT_HELP) - if(W.remove_fuel(0,user)) - 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) - welded = !welded - user.visible_message("[user.name] has [welded? "welded shut":"unwelded"] [src].", \ - "You [welded ? "weld the airlock shut":"unweld the airlock"].") - update_icon() + if(!W.tool_start_check(user, amount=0)) + return + 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(W.use_tool(src, user, 40, extra_checks = CALLBACK(src, .proc/weld_checks, W, user))) + playsound(loc, 'sound/items/welder2.ogg', 50, 1) + welded = !welded + user.visible_message("[user.name] has [welded? "welded shut":"unwelded"] [src].", \ + "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() + if(!W.tool_start_check(user, amount=0)) + return + user.visible_message("[user] is welding the airlock.", \ + "You begin repairing the airlock...", \ + "You hear welding.") + playsound(loc, W.usesound, 40, 1) + if(W.use_tool(src, user, 40, 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 to_chat(user, "The airlock doesn't need repairing.") /obj/machinery/door/airlock/proc/weld_checks(obj/item/weldingtool/W, mob/user) - return !operating && density && user && W && W.isOn() && user.loc + return !operating && density /obj/machinery/door/airlock/try_to_crowbar(obj/item/I, mob/living/user) var/beingcrowbarred = null @@ -972,7 +960,7 @@ if(panel_open && charge) to_chat(user, "You carefully start removing [charge] from [src]...") playsound(get_turf(src), I.usesound, 50, 1) - if(!do_after(user, 150*I.toolspeed, target = src)) + if(!I.use_tool(src, user, 150)) to_chat(user, "You slip and [charge] detonates!") charge.ex_act(EXPLODE_DEVASTATE) user.Knockdown(60) @@ -986,10 +974,9 @@ playsound(src.loc, I.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*I.toolspeed, target = src)) - if(src.loc) - deconstruct(TRUE, user) - return + if(I.use_tool(src, user, 40)) + deconstruct(TRUE, user) + return else if(hasPower()) to_chat(user, "The airlock's motors resist your efforts to force it!") else if(locked) diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 2874e6bf1b0..46399447e87 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -557,16 +557,14 @@ else if(istype(I, /obj/item/wrench)) if(construction_state == GEAR_SECURE) user.visible_message("[user] begins loosening [src]'s cogwheel...", "You begin loosening [src]'s cogwheel...") - playsound(src, I.usesound, 50, 1) - if(!do_after(user, 75*I.toolspeed, target = src) || construction_state != GEAR_SECURE) + if(!I.use_tool(src, user, 75, volume=50) || construction_state != GEAR_SECURE) return 1 user.visible_message("[user] loosens [src]'s cogwheel!", "[src]'s cogwheel pops off and dangles loosely.") playsound(src, 'sound/items/deconstruct.ogg', 50, 1) construction_state = GEAR_LOOSE else if(construction_state == GEAR_LOOSE) user.visible_message("[user] begins tightening [src]'s cogwheel...", "You begin tightening [src]'s cogwheel into place...") - playsound(src, I.usesound, 50, 1) - if(!do_after(user, 75*I.toolspeed, target = src) || construction_state != GEAR_LOOSE) + if(!I.use_tool(src, user, 75, volume=50) || construction_state != GEAR_LOOSE) return 1 user.visible_message("[user] tightens [src]'s cogwheel!", "You firmly tighten [src]'s cogwheel into place.") playsound(src, 'sound/items/deconstruct.ogg', 50, 1) @@ -578,8 +576,7 @@ return 1 else if(construction_state == GEAR_LOOSE) user.visible_message("[user] begins slowly lifting off [src]'s cogwheel...", "You slowly begin lifting off [src]'s cogwheel...") - playsound(src, I.usesound, 50, 1) - if(!do_after(user, 75*I.toolspeed, target = src) || construction_state != GEAR_LOOSE) + if(!I.use_tool(src, user, 75, volume=50) || construction_state != GEAR_LOOSE) return 1 user.visible_message("[user] lifts off [src]'s cogwheel, causing it to fall apart!", \ "You lift off [src]'s cogwheel, causing it to fall apart!") diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index edb55298407..6e6efca03e8 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -103,7 +103,7 @@ 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)) + if(!C.use_tool(src, user, 50)) return playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, 1) user.visible_message("[user] unfastens [src]'s bolts.", \ @@ -123,14 +123,13 @@ 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)) - playsound(get_turf(src), W.usesound, 50, 1) - welded = !welded - to_chat(user, "[user] [welded?"welds":"unwelds"] [src].", "You [welded ? "weld" : "unweld"] [src].") - update_icon() + if(!W.tool_start_check(user, amount=0)) + return + user.visible_message("[user] starts [welded ? "unwelding" : "welding"] [src].", "You start welding [src].") + if(W.use_tool(src, user, 40, volume=50)) + welded = !welded + to_chat(user, "[user] [welded?"welds":"unwelds"] [src].", "You [welded ? "weld" : "unweld"] [src].") + update_icon() /obj/machinery/door/firedoor/try_to_crowbar(obj/item/I, mob/user) if(welded || operating) @@ -282,7 +281,7 @@ 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)) + if(!C.use_tool(src, user, 50)) return if(constructionStep != CONSTRUCTION_PANEL_OPEN) return @@ -299,7 +298,7 @@ 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)) + if(!C.use_tool(src, user, 30)) return if(locate(/obj/machinery/door/firedoor) in get_turf(src)) return @@ -338,7 +337,7 @@ 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)) + if(!C.use_tool(src, user, 60)) return if(constructionStep != CONSTRUCTION_WIRES_EXPOSED) return @@ -353,7 +352,7 @@ 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)) + if(!C.use_tool(src, user, 80)) return if(constructionStep != CONSTRUCTION_WIRES_EXPOSED) return @@ -368,7 +367,7 @@ 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)) + if(!C.use_tool(src, user, 50)) return if(constructionStep != CONSTRUCTION_GUTTED) return @@ -399,13 +398,14 @@ return if(CONSTRUCTION_NOCIRCUIT) if(istype(C, /obj/item/weldingtool)) - 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, 80*C.toolspeed, target = src)) - return + if(!C.tool_start_check(user, amount=1)) + return + playsound(get_turf(src), C.usesound, 50, 1) + user.visible_message("[user] begins cutting apart [src]'s frame...", \ + "You begin slicing [src] apart...") + + if(C.use_tool(src, user, 40, amount=1)) + return if(constructionStep != CONSTRUCTION_NOCIRCUIT) return user.visible_message("[user] cuts apart [src]!", \ diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 1969b1cb169..e30665e0e9d 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -234,10 +234,9 @@ if(istype(I, /obj/item/crowbar)) if(panel_open && !density && !operating) - playsound(src.loc, I.usesound, 100, 1) user.visible_message("[user] removes the electronics from the [src.name].", \ "You start to remove electronics from the [src.name]...") - if(do_after(user,40*I.toolspeed, target = src)) + if(I.use_tool(src, user, 40, volume=50)) if(panel_open && !density && !operating && src.loc) var/obj/structure/windoor_assembly/WA = new /obj/structure/windoor_assembly(src.loc) switch(base_state) diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index 54183c155e7..91ce4cae89b 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -210,35 +210,26 @@ else icon_state = icon_on -/obj/machinery/droneDispenser/attackby(obj/item/O, mob/living/user) - if(istype(O, /obj/item/crowbar)) +/obj/machinery/droneDispenser/attackby(obj/item/I, mob/living/user) + if(istype(I, /obj/item/crowbar)) GET_COMPONENT(materials, /datum/component/material_container) materials.retrieve_all() - playsound(loc, O.usesound, 50, 1) + playsound(loc, I.usesound, 50, 1) to_chat(user, "You retrieve the materials from [src].") - else if(istype(O, /obj/item/weldingtool)) + else if(istype(I, /obj/item/weldingtool)) if(!(stat & BROKEN)) to_chat(user, "[src] doesn't need repairs.") return - var/obj/item/weldingtool/WT = O - - if(!WT.isOn()) + if(!I.tool_start_check(user, amount=1)) return - if(WT.get_fuel() < 1) - to_chat(user, "You need more fuel to complete this task!") - return - - playsound(src, WT.usesound, 50, 1) user.visible_message( - "[user] begins patching up [src] with [WT].", + "[user] begins patching up [src] with [I].", "You begin restoring the damage to [src]...") - if(!do_after(user, 40*O.toolspeed, target = src)) - return - if(!src || !WT.remove_fuel(1, user)) + if(!I.use_tool(src, user, 40, volume=50, amount=1)) return user.visible_message( diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 583a2299373..f523c613e55 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -158,15 +158,16 @@ if(panel_open) if(istype(W, /obj/item/weldingtool) && user.a_intent == INTENT_HELP) - var/obj/item/weldingtool/WT = W 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*WT.toolspeed, target = src)) - obj_integrity = max_integrity - playsound(loc, 'sound/items/welder2.ogg', 50, 1) - to_chat(user, "You repair [src].") + if(!W.tool_start_check(user, amount=0)) + return + + to_chat(user, "You begin repairing [src]...") + playsound(loc, W.usesound, 40, 1) + if(W.use_tool(src, user, 40)) + obj_integrity = max_integrity + playsound(loc, 'sound/items/welder2.ogg', 50, 1) + to_chat(user, "You repair [src].") else to_chat(user, "[src] is already in good condition!") return @@ -201,10 +202,9 @@ return else if(istype(W, /obj/item/crowbar)) - playsound(src.loc, W.usesound, 50, 1) user.visible_message("[user.name] removes the electronics from [src.name].", \ "You start prying out the circuit...") - if(do_after(user, 20*W.toolspeed, target = src)) + if(W.use_tool(src, user, 20, volume=50)) if(buildstage == 1) if(stat & BROKEN) to_chat(user, "You remove the destroyed circuit.") diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 9bf40542a77..49dc740eba7 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -54,8 +54,7 @@ if (istype(W, /obj/item/wirecutters)) if (bulb) user.visible_message("[user] begins to disconnect [src]'s flashbulb.", "You begin to disconnect [src]'s flashbulb...") - playsound(src.loc, W.usesound, 100, 1) - if(do_after(user, 30*W.toolspeed, target = src) && bulb) + if(W.use_tool(src, user, 30, volume=50) && bulb) user.visible_message("[user] has disconnected [src]'s flashbulb!", "You disconnect [src]'s flashbulb.") bulb.forceMove(loc) bulb = null @@ -74,8 +73,7 @@ else if (istype(W, /obj/item/wrench)) if(!bulb) to_chat(user, "You start unsecuring the flasher frame...") - playsound(loc, W.usesound, 50, 1) - if(do_after(user, 40*W.toolspeed, target = src)) + if(W.use_tool(src, user, 40, volume=50)) to_chat(user, "You unsecure the flasher frame.") deconstruct(TRUE) else diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 08ace173738..78cc38a8036 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -725,7 +725,7 @@ GLOBAL_LIST_EMPTY(allCasters) if(istype(I, /obj/item/wrench)) to_chat(user, "You start [anchored ? "un" : ""]securing [name]...") playsound(loc, I.usesound, 50, 1) - if(do_after(user, 60*I.toolspeed, target = src)) + if(I.use_tool(src, user, 60)) playsound(loc, 'sound/items/deconstruct.ogg', 50, 1) if(stat & BROKEN) to_chat(user, "The broken remains of [src] fall on the ground.") @@ -737,21 +737,21 @@ GLOBAL_LIST_EMPTY(allCasters) new /obj/item/wallframe/newscaster(loc) qdel(src) else if(istype(I, /obj/item/weldingtool) && 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() + if(!I.tool_start_check(user, amount=0)) + return + user.visible_message("[user] is repairing [src].", \ + "You begin repairing [src]...", \ + "You hear welding.") + playsound(loc, I.usesound, 40, 1) + if(I.use_tool(src, user, 40)) + if(!(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.") else diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index f3d39334288..f6e1e2549df 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -64,35 +64,15 @@ to_chat(usr, "You put [W] back into [src].") qdel(W) return - else if (istype(W, /obj/item/wrench)) - if (!anchored && !isinspace()) - playsound(src, W.usesound, 50, 1) - to_chat(user, "You begin to fasten \the [src] to the floor...") - if (do_after(user, 40*W.toolspeed, target = src)) - add_fingerprint(user) - user.visible_message( \ - "[user] fastens \the [src].", \ - "You fasten \the [src]. Now it can dispense pipes.", \ - "You hear ratchet.") - anchored = TRUE - stat &= MAINT - if (usr.machine==src) - usr << browse(null, "window=pipedispenser") - else if(anchored) - playsound(src, W.usesound, 50, 1) - to_chat(user, "You begin to unfasten \the [src] from the floor...") - if (do_after(user, 20*W.toolspeed, target = src)) - add_fingerprint(user) - user.visible_message( \ - "[user] unfastens \the [src].", \ - "You unfasten \the [src]. Now it can be pulled somewhere else.", \ - "You hear ratchet.") - anchored = FALSE - stat |= ~MAINT - power_change() else return ..() +/obj/machinery/pipedispenser/wrench_act(mob/living/user, obj/item/I) + if(default_unfasten_wrench(user, I, 40)) + user << browse(null, "window=pipedispenser") + + return TRUE + /obj/machinery/pipedispenser/disposal name = "disposal pipe dispenser" diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 99b951c32c8..95cac4f7b87 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -232,7 +232,7 @@ //If the turret is destroyed, you can remove it with a crowbar to //try and salvage its components to_chat(user, "You begin prying the metal coverings off...") - if(do_after(user, 20*I.toolspeed, target = src)) + if(I.use_tool(src, user, 20)) if(prob(70)) if(stored_gun) stored_gun.forceMove(loc) diff --git a/code/game/machinery/porta_turret/portable_turret_construct.dm b/code/game/machinery/porta_turret/portable_turret_construct.dm index ab16ee67ede..c10c00ce82b 100644 --- a/code/game/machinery/porta_turret/portable_turret_construct.dm +++ b/code/game/machinery/porta_turret/portable_turret_construct.dm @@ -63,21 +63,15 @@ 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!") + if(!I.tool_start_check(user, amount=5)) //uses up 5 fuel return - playsound(loc, WT.usesound, 50, 1) to_chat(user, "You start to remove the turret's interior metal armor...") - if(do_after(user, 20*I.toolspeed, target = src)) - if(!WT.isOn() || !WT.remove_fuel(5, user)) - return + + if(I.use_tool(src, user, 20, volume=50, amount=5)) //uses up 5 fuel build_step = PTURRET_BOLTED to_chat(user, "You remove the turret's interior metal armor.") - new /obj/item/stack/sheet/metal( loc, 2) + new /obj/item/stack/sheet/metal(drop_location(), 2) return @@ -133,17 +127,11 @@ if(PTURRET_START_EXTERNAL_ARMOUR) if(istype(I, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = I - if(!WT.isOn()) + if(!I.tool_start_check(user, amount=5)) return - if(WT.get_fuel() < 5) - to_chat(user, "You need more fuel to complete this task!") - playsound(loc, WT.usesound, 50, 1) to_chat(user, "You begin to weld the turret's armor down...") - if(do_after(user, 30*I.toolspeed, target = src)) - if(!WT.isOn() || !WT.remove_fuel(5, user)) - return + if(I.use_tool(src, user, 30, volume=50, amount=5)) build_step = PTURRET_EXTERNAL_ARMOUR_ON to_chat(user, "You weld the turret's armor down.") diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 6b86c48071d..1a9e4093af9 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -159,18 +159,12 @@ else if(istype(I, /obj/item/weldingtool)) if(payload || !wires.is_all_cut() || !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!") + + if(!I.tool_start_check(user, amount=5)) //uses up 5 fuel return - playsound(loc, WT.usesound, 50, 1) to_chat(user, "You start to cut [src] apart...") - if(do_after(user, 20*I.toolspeed, target = src)) - if(!WT.isOn() || !WT.remove_fuel(5, user)) - return + if(I.use_tool(src, user, 20, volume=50, amount=5)) //uses up 5 fuel to_chat(user, "You cut [src] apart.") new /obj/item/stack/sheet/plasteel( loc, 5) qdel(src) diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index fe01877cfda..f691586a1b5 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -2,77 +2,34 @@ ///// Construction datums ////// //////////////////////////////// -/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)) +/datum/construction/mecha/custom_action(step, obj/item/I, mob/user) + if(I.tool_behaviour == TOOL_WELDER) + if(I.use_tool(holder, user, 0)) playsound(holder, 'sound/items/welder2.ogg', 50, 1) else return FALSE - else if(istype(used_atom, /obj/item/wrench)) - var/obj/item/W = used_atom - playsound(holder, W.usesound, 50, 1) - else if(istype(used_atom, /obj/item/screwdriver)) - var/obj/item/W = used_atom - playsound(holder, W.usesound, 50, 1) + else if(I.tool_behaviour) + return I.use_tool(holder, user, 0, volume=50) - else if(istype(used_atom, /obj/item/wirecutters)) - var/obj/item/W = used_atom - playsound(holder, W.usesound, 50, 1) + else if(istype(I, /obj/item/stack)) + return I.use_tool(holder, user, 0, volume=50, amount=5) - else if(istype(used_atom, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = used_atom - if(C.use(4)) - playsound(holder, 'sound/items/deconstruct.ogg', 50, 1) - else - to_chat(user, ("There's not enough cable to finish the task!")) - return FALSE - else if(istype(used_atom, /obj/item/stack/ore/bluespace_crystal)) - var/obj/item/stack/ore/bluespace_crystal/BSC = used_atom - BSC.use(1) - else if(istype(used_atom, /obj/item/stack)) - var/obj/item/stack/S = used_atom - if(S.get_amount() < 5) - to_chat(user, ("There's not enough material in this stack!")) - return FALSE - else - S.use(5) return TRUE -/datum/construction/reversible/mecha/custom_action(index as num, diff as num, 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)) +/datum/construction/reversible/mecha/custom_action(index as num, diff as num, obj/item/I, mob/user) + if(I.tool_behaviour == TOOL_WELDER) + if(I.use_tool(holder, user, 0)) playsound(holder, 'sound/items/welder2.ogg', 50, 1) else return FALSE - else if(istype(used_atom, /obj/item/wrench)) - var/obj/item/W = used_atom - playsound(holder, W.usesound, 50, 1) - else if(istype(used_atom, /obj/item/screwdriver)) - var/obj/item/W = used_atom - playsound(holder, W.usesound, 50, 1) + else if(I.tool_behaviour) + return I.use_tool(holder, user, 0, volume=50) - else if(istype(used_atom, /obj/item/wirecutters)) - var/obj/item/W = used_atom - playsound(holder, W.usesound, 50, 1) + else if(istype(I, /obj/item/stack)) + return I.use_tool(holder, user, 0, volume=50, amount=5) - else if(istype(used_atom, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = used_atom - if (C.use(4)) - playsound(holder, 'sound/items/deconstruct.ogg', 50, 1) - else - to_chat(user, ("There's not enough cable to finish the task!")) - return FALSE - else if(istype(used_atom, /obj/item/stack)) - var/obj/item/stack/S = used_atom - if(S.get_amount() < 5) - to_chat(user, ("There's not enough material in this stack!")) - return FALSE - else - S.use(5) return TRUE diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index 065415cba94..bb0eb3c2e76 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -240,9 +240,8 @@ else if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) user.changeNext_move(CLICK_CD_MELEE) - var/obj/item/weldingtool/WT = W - if(obj_integrityYou repair the damaged gas tank.") @@ -251,9 +250,7 @@ obj_integrity += min(10, max_integrity-obj_integrity) if(obj_integrity == max_integrity) to_chat(user, "It looks to be fully repaired now.") - else - to_chat(user, "[WT] needs to be on for this task!") - return 1 + return 1 else to_chat(user, "The [name] is at full integrity!") return 1 diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index 21323855ebc..dc909d90d19 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -36,23 +36,24 @@ /obj/structure/mecha_wreckage/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weldingtool)) - if(salvage_num <= 0) + 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 - if(welder_salvage && welder_salvage.len && WT.remove_fuel(0, user)) - var/type = prob(70) ? pick(welder_salvage) : null - if(type) - 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/mecha_parts/part)) - welder_salvage -= type - salvage_num-- - else - to_chat(user, "You fail to salvage anything valuable from [src]!") - else + + if(!I.use_tool(src, user, 0, volume=50)) return + var/type = prob(70) ? pick(welder_salvage) : null + if(type) + 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/mecha_parts/part)) + welder_salvage -= type + salvage_num-- + else + to_chat(user, "You fail to salvage anything valuable from [src]!") + return + else if(istype(I, /obj/item/wirecutters)) if(salvage_num <= 0) to_chat(user, "You don't see anything that can be cut with [I]!") diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 6e71f4de300..625d41d040f 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -742,3 +742,67 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) /obj/item/MouseExited() deltimer(tip_timer)//delete any in-progress timer if the mouse is moved off the item before it finishes closeToolTip(usr) + + +// 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. + if(!delay && !tool_start_check(user, amount)) + 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, 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 + +// 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 + +// Plays item's usesound, if any. +/obj/item/proc/play_tool_sound(atom/target, volume) + if(target && usesound && volume) + playsound(target, usesound, 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, amount, datum/callback/extra_checks) + return tool_use_check(user, amount) && (!extra_checks || extra_checks.Invoke()) diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index 6c2c8e58b4e..36d2c068c63 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -11,6 +11,7 @@ flags_1 = CONDUCT_1 | NOBLUDGEON_1 slot_flags = SLOT_BELT + usesound = 'sound/effects/spray2.ogg' var/obj/item/device/toner/ink = null @@ -20,7 +21,7 @@ //This proc doesn't just check if the painter can be used, but also uses it. //Only call this if you are certain that the painter will be used right after this check! -/obj/item/airlock_painter/proc/use(mob/user) +/obj/item/airlock_painter/proc/use_paint(mob/user) if(can_use(user)) ink.charges-- playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1) diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index 64d710be253..c8e9bc22840 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -170,7 +170,7 @@ return 0 user.visible_message("[user] unscrews [src]'s maintenance panel and begins fiddling with its innards...", "You begin resetting [src]...") playsound(user, I.usesound, 50, 1) - if(!do_after(user, 40*I.toolspeed, target = user)) + if(!I.use_tool(src, user, 40)) return 0 user.visible_message("[user] refastens [src]'s maintenance panel!", "You reset [src] to its factory settings!") playsound(user, 'sound/items/screwdriver2.ogg', 50, 1) diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 77d1795b6b7..aa798ff617a 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -57,37 +57,32 @@ /obj/item/device/radio/intercom/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/screwdriver)) - var/obj/item/screwdriver/S = I if(unfastened) user.visible_message("[user] starts tightening [src]'s screws...", "You start screwing in [src]...") - playsound(src, S.usesound, 50, 1) - if(!do_after(user, 30 * S.toolspeed, target = src)) - return - user.visible_message("[user] tightens [src]'s screws!", "You tighten [src]'s screws.") - playsound(src, 'sound/items/screwdriver2.ogg', 50, 1) - unfastened = FALSE + playsound(src, I.usesound, 50, 1) + if(I.use_tool(src, user, 30)) + user.visible_message("[user] tightens [src]'s screws!", "You tighten [src]'s screws.") + playsound(src, 'sound/items/screwdriver2.ogg', 50, 1) + unfastened = FALSE else user.visible_message("[user] starts loosening [src]'s screws...", "You start unscrewing [src]...") - playsound(src, S.usesound, 50, 1) - if(!do_after(user, 60 * S.toolspeed, target = src)) - return - user.visible_message("[user] loosens [src]'s screws!", "You unscrew [src], loosening it from the wall.") - playsound(src, 'sound/items/screwdriver2.ogg', 50, 1) - unfastened = TRUE + playsound(src, I.usesound, 50, 1) + if(I.use_tool(src, user, 40)) + user.visible_message("[user] loosens [src]'s screws!", "You unscrew [src], loosening it from the wall.") + playsound(src, 'sound/items/screwdriver2.ogg', 50, 1) + unfastened = TRUE return else if(istype(I, /obj/item/wrench)) if(!unfastened) to_chat(user, "You need to unscrew [src] from the wall first!") return - var/obj/item/wrench/W = I user.visible_message("[user] starts unsecuring [src]...", "You start unsecuring [src]...") - playsound(src, W.usesound, 50, 1) - if(!do_after(user, 80 * W.toolspeed, target = src)) - return - user.visible_message("[user] unsecures [src]!", "You detach [src] from the wall.") - playsound(src, 'sound/items/deconstruct.ogg', 50, 1) - new/obj/item/wallframe/intercom(get_turf(src)) - qdel(src) + playsound(src, I.usesound, 50, 1) + if(I.use_tool(src, user, 80)) + user.visible_message("[user] unsecures [src]!", "You detach [src] from the wall.") + playsound(src, 'sound/items/deconstruct.ogg', 50, 1) + new/obj/item/wallframe/intercom(get_turf(src)) + qdel(src) return return ..() diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 69b6e54841a..45782f0ee84 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -276,17 +276,11 @@ /obj/item/device/tape/attackby(obj/item/I, mob/user, params) - if(ruined) - var/delay = -1 - if (istype(I, /obj/item/screwdriver)) - delay = 120*I.toolspeed - else if(istype(I, /obj/item/pen)) - delay = 120*1.5 - if (delay != -1) - to_chat(user, "You start winding the tape back in...") - if(do_after(user, delay, target = src)) - to_chat(user, "You wound the tape back in.") - fix() + if(ruined && istype(I, /obj/item/screwdriver) || istype(I, /obj/item/pen)) + to_chat(user, "You start winding the tape back in...") + if(I.use_tool(src, user, 120)) + to_chat(user, "You wound the tape back in.") + fix() //Random colour tapes /obj/item/device/tape/random diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index c0500f5d21e..fa7d14d2369 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -25,14 +25,11 @@ if(pinnedLoc) pinnedLoc.forceMove(loc) -/obj/item/target/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)) - removeOverlays() - to_chat(user, "You slice off [src]'s uneven chunks of aluminium and scorch marks.") - else - return ..() +/obj/item/target/welder_act(mob/living/user, obj/item/I) + if(I.use_tool(src, user, 0, volume=40)) + removeOverlays() + to_chat(user, "You slice off [src]'s uneven chunks of aluminium and scorch marks.") + return TRUE /obj/item/target/attack_hand(mob/user) if(pinnedLoc) diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 75e9d1e9741..7d2e0c0b43f 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -40,17 +40,15 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ 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(istype(W, /obj/item/weldingtool)) if(get_amount() < 2) to_chat(user, "You need at least two rods to do this!") return - if(WT.remove_fuel(0,user)) + if(W.use_tool(src, user, 0, volume=40)) var/obj/item/stack/sheet/metal/new_item = new(usr.loc) - user.visible_message("[user.name] shaped [src] into metal with the welding tool.", \ - "You shape [src] into metal with the welding tool.", \ + user.visible_message("[user.name] shaped [src] into metal with [W].", \ + "You shape [src] into metal with [W].", \ "You hear welding.") var/obj/item/stack/rods/R = src src = null diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 5a672c212ec..367861bbba2 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -244,21 +244,22 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ /obj/item/shard/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/device/lightreplacer)) I.attackby(src, user) - else if(istype(I, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = I - if(WT.remove_fuel(0, user)) - var/obj/item/stack/sheet/glass/NG = new (user.loc) - for(var/obj/item/stack/sheet/glass/G in user.loc) - 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) else return ..() +/obj/item/shard/welder_act(mob/living/user, obj/item/I) + if(I.use_tool(src, user, 0, volume=50)) + var/obj/item/stack/sheet/glass/NG = new (user.loc) + for(var/obj/item/stack/sheet/glass/G in user.loc) + 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 TRUE + /obj/item/shard/Crossed(mob/living/L) if(istype(L) && has_gravity(loc)) playsound(loc, 'sound/effects/glass_step.ogg', 50, 1) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index ccf4cfa8603..82ac5272456 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -25,7 +25,7 @@ /obj/item/stack/on_grind() for(var/i in 1 to grind_results.len) //This should only call if it's ground, so no need to check if grind_results exists - grind_results[grind_results[i]] *= amount //Gets the key at position i, then the reagent amount of that key, then multiplies it by stack size + grind_results[grind_results[i]] *= get_amount() //Gets the key at position i, then the reagent amount of that key, then multiplies it by stack size /obj/item/stack/grind_requirements() if(is_cyborg) @@ -247,7 +247,7 @@ return 0 return 1 -/obj/item/stack/proc/use(used, transfer = FALSE) // return 0 = borked; return 1 = had enough +/obj/item/stack/use(used, transfer = FALSE) // return 0 = borked; return 1 = had enough if(zero_amount()) return 0 if (is_cyborg) @@ -260,6 +260,20 @@ update_weight() return 1 +/obj/item/stack/tool_use_check(mob/living/user, amount) + if(get_amount() < amount) + if(singular_name) + if(amount > 1) + to_chat(user, "You need at least [amount] [singular_name]\s to do this!") + else + to_chat(user, "You need at least [amount] [singular_name] to do this!") + else + to_chat(user, "You need at least [amount] to do this!") + + return FALSE + + return TRUE + /obj/item/stack/proc/zero_amount() if(is_cyborg) return source.energy < cost diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index d51e01ffcbb..4e15cea273e 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -21,18 +21,15 @@ /obj/item/stack/tile/attackby(obj/item/W, mob/user, params) if (istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(get_amount() < 4) to_chat(user, "You need at least four tiles to do this!") return - if(WT.is_hot() && !mineralType) + if(!mineralType) to_chat(user, "You can not reform this!") return - if(WT.remove_fuel(0,user)) - + if(W.use_tool(src, user, 0, volume=40)) if(mineralType == "plasma") atmos_spawn_air("plasma=5;TEMP=1000") user.visible_message("[user.name] sets the plasma tiles on fire!", \ diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index 0f7bdd616cf..bc92c609353 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -34,7 +34,7 @@ /obj/item/storage/secure/attackby(obj/item/W, mob/user, params) if(locked) if (istype(W, /obj/item/screwdriver)) - if (do_after(user, 20*W.toolspeed, target = user)) + if (W.use_tool(src, user, 20)) open =! open to_chat(user, "You [open ? "open" : "close"] the service panel.") return @@ -44,7 +44,7 @@ if(src.open == 1) to_chat(user, "Now attempting to reset internal memory, please hold.") src.l_hacking = 1 - if (do_after(usr, 400*W.toolspeed, target = user)) + if (W.use_tool(src, user, 400)) to_chat(user, "Internal memory reset - lock has been disengaged.") src.l_set = 0 src.l_hacking = 0 diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 934ef0fbba3..94648cfd9f5 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -73,7 +73,7 @@ damtype = "fire" ++burned_fuel_for if(burned_fuel_for >= WELDER_FUEL_BURN_INTERVAL) - remove_fuel(1) + use(1) update_icon() //This is to start fires. process() is only called if the welder is on. @@ -107,10 +107,10 @@ var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected)) if(affecting && affecting.status == BODYPART_ROBOTIC && user.a_intent != INTENT_HARM) - if(src.remove_fuel(1)) - playsound(loc, usesound, 50, 1) + if(src.use_tool(H, user, 0, volume=50, amount=1)) if(user == H) - user.visible_message("[user] starts to fix some of the dents on [H]'s [affecting.name].", "You start fixing some of the dents on [H]'s [affecting.name].") + user.visible_message("[user] starts to fix some of the dents on [H]'s [affecting.name].", + "You start fixing some of the dents on [H]'s [affecting.name].") if(!do_mob(user, H, 50)) return item_heal_robotic(H, user, 15, 0) @@ -125,8 +125,8 @@ reagents.trans_to(O, reagents.total_volume) to_chat(user, "You empty [src]'s fuel tank into [O].") update_icon() - if(welding) - remove_fuel(1) + if(isOn()) + use(1) var/turf/location = get_turf(user) location.hotspot_expose(700, 50, 1) if(get_fuel() <= 0) @@ -150,26 +150,23 @@ update_icon() -//Returns the amount of fuel in the welder +// Returns the amount of fuel in the welder /obj/item/weldingtool/proc/get_fuel() return reagents.get_reagent_amount("welding_fuel") -//Removes fuel from the welding tool. If a mob is passed, it will try to flash the mob's eyes. This should probably be renamed to use() -/obj/item/weldingtool/proc/remove_fuel(amount = 1, mob/living/M = null) - if(!welding || !check_fuel()) - return 0 - if(amount) +// Uses fuel from the welding tool. +/obj/item/weldingtool/use(used = 0) + if(!isOn() || !check_fuel()) + return FALSE + + if(used) burned_fuel_for = 0 - if(get_fuel() >= amount) - reagents.remove_reagent("welding_fuel", amount) + if(get_fuel() >= used) + reagents.remove_reagent("welding_fuel", used) check_fuel() - if(M) - M.flash_act(light_intensity) return TRUE else - if(M) - to_chat(M, "You need more welding fuel to complete this task!") return FALSE @@ -231,6 +228,24 @@ /obj/item/weldingtool/proc/isOn() return welding +// 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_act(light_intensity) + +// If welding tool ran out of fuel during a construction task, construction fails. +/obj/item/weldingtool/tool_use_check(mob/living/user, amount) + if(!isOn() || !check_fuel()) + to_chat(user, "[src] has to be on to complete this task!") + return FALSE + + if(get_fuel() >= amount) + return TRUE + else + to_chat(user, "You need more welding fuel to complete this task!") + return FALSE + /obj/item/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user) if(welding) @@ -260,10 +275,10 @@ to_chat(user, "You need one rod to start building a flamethrower!") /obj/item/weldingtool/ignition_effect(atom/A, mob/user) - if(welding && remove_fuel(1, user)) - . = "[user] casually lights [A] with [src], what a badass." + if(use_tool(A, user, 0, amount=1)) + return "[user] casually lights [A] with [src], what a badass." else - . = "" + return "" /obj/item/weldingtool/largetank name = "industrial welding tool" diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index 5424724d321..6218c635628 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -32,13 +32,12 @@ if(state != EMPTY_CORE) to_chat(user, "The core must be empty to deconstruct it!") return - var/obj/item/weldingtool/WT = P - if(!WT.isOn()) - to_chat(user, "The welder must be on for this task!") + + if(!P.tool_start_check(user, amount=0)) 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)) + if(P.use_tool(src, user, 20, volume=50) && state == EMPTY_CORE) to_chat(user, "You deconstruct the frame.") deconstruct(TRUE) return diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index de833f2bb1a..171d5fcdff0 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -29,7 +29,6 @@ var/cutting_tool = /obj/item/weldingtool var/open_sound = 'sound/machines/click.ogg' var/close_sound = 'sound/machines/click.ogg' - var/cutting_sound = 'sound/items/welder.ogg' var/material_drop = /obj/item/stack/sheet/metal var/material_drop_amount = 2 var/delivery_icon = "deliverycloset" //which icon to use when packagewrapped. null to be unwrappable. @@ -216,19 +215,18 @@ if(opened) if(istype(W, cutting_tool)) if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0, user)) - to_chat(user, "You begin cutting \the [src] apart...") - playsound(loc, cutting_sound, 40, 1) - if(do_after(user, 40*WT.toolspeed, 1, target = src)) - if(!opened || !WT.isOn()) - return - playsound(loc, cutting_sound, 50, 1) - user.visible_message("[user] slices apart \the [src].", - "You cut \the [src] apart with \the [WT].", - "You hear welding.") - deconstruct(TRUE) + if(!W.tool_start_check(user, amount=0)) return + + to_chat(user, "You begin cutting \the [src] apart...") + if(W.use_tool(src, user, 40, volume=50)) + if(!opened) + return + user.visible_message("[user] slices apart \the [src].", + "You cut \the [src] apart with \the [W].", + "You hear welding.") + deconstruct(TRUE) + return else // for example cardboard box is cut with wirecutters user.visible_message("[user] cut apart \the [src].", \ "You cut \the [src] apart with \the [W].") @@ -237,18 +235,16 @@ if(user.transferItemToLoc(W, drop_location())) // so we put in unlit welder too return else if(istype(W, /obj/item/weldingtool) && can_weld_shut) - var/obj/item/weldingtool/WT = W - if(!WT.remove_fuel(0, user)) + if(!W.tool_start_check(user, amount=0)) return + to_chat(user, "You begin [welded ? "unwelding":"welding"] \the [src]...") - playsound(loc, 'sound/items/welder2.ogg', 40, 1) - if(do_after(user, 40*WT.toolspeed, 1, target = src)) - if(opened || !WT.isOn()) + if(W.use_tool(src, user, 40, volume=50)) + if(opened) return - playsound(loc, WT.usesound, 50, 1) welded = !welded user.visible_message("[user] [welded ? "welds shut" : "unweldeds"] \the [src].", - "You [welded ? "weld" : "unwelded"] \the [src] with \the [WT].", + "You [welded ? "weld" : "unwelded"] \the [src] with \the [W].", "You hear welding.") update_icon() else if(istype(W, /obj/item/wrench) && anchorable) diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm index 2eff5fe25a4..a22ea805ea7 100644 --- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm +++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm @@ -10,7 +10,6 @@ can_weld_shut = 0 cutting_tool = /obj/item/wirecutters open_sound = "rustle" - cutting_sound = 'sound/items/poster_ripped.ogg' material_drop = /obj/item/stack/sheet/cardboard delivery_icon = "deliverybox" anchorable = FALSE @@ -68,6 +67,5 @@ move_speed_multiplier = 2 cutting_tool = /obj/item/weldingtool open_sound = 'sound/machines/click.ogg' - cutting_sound = 'sound/items/welder.ogg' material_drop = /obj/item/stack/sheet/plasteel #undef SNAKE_SPAM_TICKS diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 5a506ace064..72cf478c42f 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -96,11 +96,13 @@ else to_chat(user, "Access denied.") else if(istype(W, /obj/item/weldingtool) && user.a_intent == INTENT_HELP && !broken) - var/obj/item/weldingtool/WT = W - if(obj_integrity < max_integrity && WT.remove_fuel(5, user)) + if(obj_integrity < max_integrity) + if(!W.tool_start_check(user, amount=5)) + return + to_chat(user, "You begin repairing [src].") - playsound(loc, WT.usesound, 40, 1) - if(do_after(user, 40*W.toolspeed, target = src)) + playsound(loc, W.usesound, 40, 1) + if(W.use_tool(src, user, 40, amount=5)) obj_integrity = max_integrity playsound(loc, 'sound/items/welder2.ogg', 50, 1) update_icon() @@ -117,7 +119,7 @@ qdel(src) else to_chat(user, "You start to [open ? "close":"open"] [src].") - if(do_after(user, 20*W.toolspeed, target = src)) + if(W.use_tool(src, user, 20)) to_chat(user, "You [open ? "close":"open"] [src].") toggle_lock(user) else if(open && !showpiece) @@ -178,7 +180,7 @@ if(istype(I, /obj/item/wrench)) //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)) + if(I.use_tool(src, user, 30)) playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) new /obj/item/stack/sheet/mineral/wood(get_turf(src), 5) qdel(src) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 22d00d6cab0..4d4d53867ef 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -59,40 +59,35 @@ created_name = t else if(istype(W, /obj/item/weldingtool) && (mineral || glass || !anchored )) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0,user)) - playsound(src, 'sound/items/welder2.ogg', 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) + if(!W.tool_start_check(user, amount=0)) + return - 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 = 0 - else - new /obj/item/stack/sheet/glass(get_turf(src)) - glass = 0 - else if(!anchored) - user.visible_message("[user] disassembles the airlock assembly.", \ - "You start to disassemble the airlock assembly...") - if(do_after(user, 40*W.toolspeed, target = src)) - if(!WT.isOn()) - return - to_chat(user, "You disassemble the airlock assembly.") - deconstruct(TRUE) + playsound(src, 'sound/items/welder2.ogg', 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(W.use_tool(src, user, 40)) + 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(W.use_tool(src, user, 40)) + 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 = 0 + else + new /obj/item/stack/sheet/glass(get_turf(src)) + glass = 0 + else if(!anchored) + user.visible_message("[user] disassembles the airlock assembly.", \ + "You start to disassemble the airlock assembly...") + if(W.use_tool(src, user, 40)) + to_chat(user, "You disassemble the airlock assembly.") + deconstruct(TRUE) else if(istype(W, /obj/item/wrench)) if(!anchored ) @@ -103,12 +98,11 @@ break if(door_check) - playsound(src, W.usesound, 100, 1) user.visible_message("[user] secures the airlock assembly to the floor.", \ "You start to secure the airlock assembly to the floor...", \ "You hear wrenching.") - if(do_after(user, 40*W.toolspeed, target = src)) + if(W.use_tool(src, user, 40, volume=100)) if(anchored) return to_chat(user, "You secure the airlock assembly.") @@ -118,38 +112,34 @@ to_chat(user, "There is another door here!") else - playsound(src, W.usesound, 100, 1) user.visible_message("[user] unsecures the airlock assembly from the floor.", \ "You start to unsecure the airlock assembly from the floor...", \ "You hear wrenching.") - if(do_after(user, 40*W.toolspeed, target = src)) - if(!anchored ) + if(W.use_tool(src, user, 40, volume=100)) + if(!anchored) return to_chat(user, "You unsecure the airlock assembly.") name = "airlock assembly" anchored = FALSE else if(istype(W, /obj/item/stack/cable_coil) && state == AIRLOCK_ASSEMBLY_NEEDS_WIRES && anchored ) - var/obj/item/stack/cable_coil/C = W - if (C.get_amount() < 1) - to_chat(user, "You need one length of cable to wire the airlock assembly!") + if(!W.tool_start_check(user, amount=1)) return + user.visible_message("[user] wires the airlock assembly.", \ "You start to wire the airlock assembly...") - if(do_after(user, 40, target = src)) - if(C.get_amount() < 1 || state != AIRLOCK_ASSEMBLY_NEEDS_WIRES) + if(W.use_tool(src, user, 40, amount=1)) + if(state != AIRLOCK_ASSEMBLY_NEEDS_WIRES) return - C.use(1) state = AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS to_chat(user, "You wire the airlock assembly.") name = "wired airlock assembly" else if(istype(W, /obj/item/wirecutters) && state == AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS ) - playsound(src, W.usesound, 100, 1) user.visible_message("[user] cuts the wires from the airlock assembly.", \ "You start to cut the wires from the airlock assembly...") - if(do_after(user, 40*W.toolspeed, target = src)) + if(W.use_tool(src, user, 40, volume=100)) if(state != AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS) return to_chat(user, "You cut the wires from the airlock assembly.") @@ -174,11 +164,10 @@ else if(istype(W, /obj/item/crowbar) && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER ) - playsound(src, 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(W.use_tool(src, user, 40, volume=100)) if(state != AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER) return to_chat(user, "You remove the airlock electronics.") @@ -237,11 +226,10 @@ to_chat(user, "You cannot add [G] to [src]!") else if(istype(W, /obj/item/screwdriver) && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER ) - playsound(src, 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(W.use_tool(src, user, 40, volume=100)) if(loc && state == AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER) to_chat(user, "You finish the airlock.") var/obj/machinery/door/airlock/door diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 0a3574b1a66..4c1ed97038e 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -44,7 +44,7 @@ if(istype(I, /obj/item/wrench) && !stored_extinguisher) to_chat(user, "You start unsecuring [name]...") playsound(loc, I.usesound, 50, 1) - if(do_after(user, 60*I.toolspeed, target = src)) + if(I.use_tool(src, user, 60)) playsound(loc, 'sound/items/deconstruct.ogg', 50, 1) to_chat(user, "You unsecure [name].") deconstruct(TRUE) diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 2f17926a9bd..8621d538afc 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -109,12 +109,9 @@ else to_chat(user, "You can't reach, close it first!") - else if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0,user)) + else if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + if(W.use_tool(src, user, 0, volume=50)) dismantle(user, TRUE) - else if(istype(W, /obj/item/gun/energy/plasmacutter)) - dismantle(user, TRUE) else if(istype(W, /obj/item/pickaxe/drill/jackhammer)) var/obj/item/pickaxe/drill/jackhammer/D = W D.playDigSound() diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index afcd855caf0..de0f279a407 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -25,11 +25,13 @@ if(iscyborg(user) || istype(I, /obj/item/device/multitool)) toggle_lock(user) else if(istype(I, /obj/item/weldingtool) && user.a_intent == INTENT_HELP && !broken) - var/obj/item/weldingtool/WT = I - if(obj_integrity < max_integrity && WT.remove_fuel(2, user)) + if(obj_integrity < max_integrity) + if(!I.tool_start_check(user, amount=2)) + return + to_chat(user, "You begin repairing [src].") - playsound(loc, WT.usesound, 40, 1) - if(do_after(user, 40*I.toolspeed, target = src)) + playsound(loc, I.usesound, 40, 1) + if(I.use_tool(src, user, 40, amount=2)) obj_integrity = max_integrity playsound(loc, 'sound/items/welder2.ogg', 50, 1) update_icon() diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 84a6cc1b9ee..4812372237c 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -34,8 +34,7 @@ if(istype(W, /obj/item/gun/energy/plasmacutter)) to_chat(user, "You start slicing apart the girder...") - playsound(src, 'sound/items/welder.ogg', 100, 1) - if(do_after(user, 40*W.toolspeed, target = src)) + if(W.use_tool(src, user, 40, volume=100)) to_chat(user, "You slice apart the girder.") var/obj/item/stack/sheet/metal/M = new (loc, 2) M.add_fingerprint(user) @@ -68,7 +67,7 @@ return to_chat(user, "You start building a reinforced false wall...") if(do_after(user, 20, target = src)) - if(!src.loc || !S || S.get_amount() < 2) + if(S.get_amount() < 2) return S.use(2) to_chat(user, "You create a false wall. Push on it to open or close the passage.") @@ -80,8 +79,8 @@ to_chat(user, "You need at least five rods to add plating!") return to_chat(user, "You start adding plating...") - if (do_after(user, 40, target = src)) - if(!src.loc || !S || S.get_amount() < 5) + if(do_after(user, 40, target = src)) + if(S.get_amount() < 5) return S.use(5) to_chat(user, "You add the plating.") @@ -102,7 +101,7 @@ return to_chat(user, "You start building a false wall...") if(do_after(user, 20, target = src)) - if(!src.loc || !S || S.get_amount() < 2) + if(S.get_amount() < 2) return S.use(2) to_chat(user, "You create a false wall. Push on it to open or close the passage.") @@ -115,7 +114,7 @@ return to_chat(user, "You start adding plating...") if (do_after(user, 40, target = src)) - if(loc == null || S.get_amount() < 2) + if(S.get_amount() < 2) return S.use(2) to_chat(user, "You add the plating.") @@ -132,7 +131,7 @@ return to_chat(user, "You start building a reinforced false wall...") if(do_after(user, 20, target = src)) - if(!src.loc || !S || S.get_amount() < 2) + if(S.get_amount() < 2) return S.use(2) to_chat(user, "You create a reinforced false wall. Push on it to open or close the passage.") @@ -145,7 +144,7 @@ return to_chat(user, "You start finalizing the reinforced wall...") if(do_after(user, 50, target = src)) - if(!src.loc || !S || S.get_amount() < 1) + if(S.get_amount() < 1) return S.use(1) to_chat(user, "You fully reinforce the wall.") @@ -158,8 +157,8 @@ if(S.get_amount() < 1) return to_chat(user, "You start reinforcing the girder...") - if (do_after(user, 60, target = src)) - if(!src.loc || !S || S.get_amount() < 1) + if(do_after(user, 60, target = src)) + if(S.get_amount() < 1) return S.use(1) to_chat(user, "You reinforce the girder.") @@ -175,7 +174,7 @@ to_chat(user, "You need at least two sheets to create a false wall!") return if(do_after(user, 20, target = src)) - if(!src.loc || !S || S.get_amount() < 2) + if(S.get_amount() < 2) return S.use(2) to_chat(user, "You create a false wall. Push on it to open or close the passage.") @@ -189,7 +188,7 @@ return to_chat(user, "You start adding plating...") if (do_after(user, 40, target = src)) - if(!src.loc || !S || S.get_amount() < 2) + if(S.get_amount() < 2) return S.use(2) to_chat(user, "You add the plating.") @@ -214,11 +213,10 @@ /obj/structure/girder/screwdriver_act(mob/user, obj/item/tool) . = FALSE if(state == GIRDER_DISPLACED) - playsound(src, tool.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 * tool.toolspeed, target = src)) + if(tool.use_tool(src, user, 40, volume=100)) if(state != GIRDER_DISPLACED) return state = GIRDER_DISASSEMBLED @@ -226,65 +224,60 @@ var/obj/item/stack/sheet/metal/M = new (loc, 2) M.add_fingerprint(user) qdel(src) - return TRUE + return TRUE else if(state == GIRDER_REINF) - playsound(src, tool.usesound, 100, 1) to_chat(user, "You start unsecuring support struts...") - if(do_after(user, 40 * tool.toolspeed, target = src)) + if(tool.use_tool(src, user, 40, volume=100)) if(state != GIRDER_REINF) return to_chat(user, "You unsecure the support struts.") state = GIRDER_REINF_STRUTS - return TRUE + return TRUE else if(state == GIRDER_REINF_STRUTS) - playsound(src, tool.usesound, 100, 1) to_chat(user, "You start securing support struts...") - if(do_after(user, 40 * tool.toolspeed, target = src)) + if(tool.use_tool(src, user, 40, volume=100)) if(state != GIRDER_REINF_STRUTS) return to_chat(user, "You secure the support struts.") state = GIRDER_REINF - return TRUE + return TRUE // Wirecutter behavior for girders /obj/structure/girder/wirecutter_act(mob/user, obj/item/tool) . = FALSE if(state == GIRDER_REINF_STRUTS) - playsound(src.loc, tool.usesound, 100, 1) to_chat(user, "You start removing the inner grille...") - if(do_after(user, 40 * tool.toolspeed, target = src)) + if(tool.use_tool(src, user, 40, volume=100)) 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) - return TRUE + return TRUE /obj/structure/girder/wrench_act(mob/user, obj/item/tool) . = FALSE if(state == GIRDER_DISPLACED) if(!isfloorturf(loc)) to_chat(user, "A floor must be present to secure the girder!") - return - playsound(src, tool.usesound, 100, 1) + to_chat(user, "You start securing the girder...") - if(do_after(user, 40 * tool.toolspeed, target = src)) + if(tool.use_tool(src, user, 40, volume=100)) to_chat(user, "You secure the girder.") var/obj/structure/girder/G = new (loc) transfer_fingerprints_to(G) qdel(src) - return TRUE + return TRUE else if(state == GIRDER_NORMAL && can_displace) - playsound(src, tool.usesound, 100, 1) to_chat(user, "You start unsecuring the girder...") - if(do_after(user, 40 * tool.toolspeed, target = src)) + if(tool.use_tool(src, user, 40, volume=100)) to_chat(user, "You unsecure the girder.") var/obj/structure/girder/displaced/D = new (loc) transfer_fingerprints_to(D) qdel(src) - return TRUE + return TRUE /obj/structure/girder/CanPass(atom/movable/mover, turf/target) if(istype(mover) && (mover.pass_flags & PASSGRILLE)) @@ -348,39 +341,24 @@ add_fingerprint(user) if(istype(W, /obj/item/melee/cultblade/dagger) && iscultist(user)) //Cultists can demolish cult girders instantly with their tomes user.visible_message("[user] strikes [src] with [W]!", "You demolish [src].") - var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src)) - R.amount = 1 + new /obj/item/stack/sheet/runed_metal(drop_location(), 1) qdel(src) - else if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0,user)) - playsound(src.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/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + if(!W.tool_start_check(user, amount=0)) + return - else if(istype(W, /obj/item/gun/energy/plasmacutter)) to_chat(user, "You start slicing apart the girder...") - playsound(src, 'sound/items/welder.ogg', 100, 1) - if(do_after(user, 40*W.toolspeed, target = src)) + if(W.use_tool(src, user, 40, volume=50)) to_chat(user, "You slice apart the girder.") - var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src)) - R.amount = 1 + var/obj/item/stack/sheet/runed_metal/R = new(drop_location(), 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!") - var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src)) - R.amount = 2 + var/obj/item/stack/sheet/runed_metal/R = new(drop_location(), 2) transfer_fingerprints_to(R) D.playDigSound() qdel(src) @@ -392,7 +370,7 @@ return 0 user.visible_message("[user] begins laying runed metal on [src]...", "You begin constructing a runed wall...") if(do_after(user, 50, target = src)) - if(R.get_amount() < 1 || !R) + if(R.get_amount() < 1) return user.visible_message("[user] plates [src] with runed metal.", "You construct a runed wall.") R.use(1) diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 0f12f847d72..a6f9ecb68f7 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -82,7 +82,7 @@ mybag.attackby(I, user) else if(istype(I, /obj/item/crowbar)) user.visible_message("[user] begins to empty the contents of [src].", "You begin to empty the contents of [src]...") - if(do_after(user, 30*I.toolspeed, target = src)) + if(I.use_tool(src, user, 30)) to_chat(usr, "You empty the contents of [src]'s bucket onto the floor.") reagents.reaction(src.loc) src.reagents.clear_reagents() diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 415024d2e0a..0639ce26abc 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -23,18 +23,13 @@ transfer_fingerprints_to(F) qdel(src) else if(istype(I, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = I - if(!WT.remove_fuel(0, user)) + if(!I.tool_start_check(user, amount=0)) return to_chat(user, "You begin cutting \the [src] apart...") - playsound(src.loc, WT.usesound, 40, 1) - if(do_after(user, 40*WT.toolspeed, 1, target = src)) - if(!WT.isOn()) - return - playsound(src.loc, WT.usesound, 50, 1) + if(I.use_tool(src, user, 50, volume=50)) visible_message("[user] slices apart \the [src].", - "You cut \the [src] apart with \the [WT].", - "You hear welding.") + "You cut \the [src] apart with \the [I].", + "You hear welding.") new /obj/item/stack/sheet/metal(src.loc, 4) qdel(src) return @@ -56,18 +51,15 @@ /obj/structure/kitchenspike/attack_paw(mob/user) return src.attack_hand(usr) +/obj/structure/kitchenspike/crowbar_act(mob/living/user, obj/item/I) + if(has_buckled_mobs()) + to_chat(user, "You can't do that while something's on the spike!") + return TRUE -/obj/structure/kitchenspike/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/crowbar)) - if(!has_buckled_mobs()) - playsound(loc, I.usesound, 100, 1) - if(do_after(user, 20*I.toolspeed, target = src)) - to_chat(user, "You pry the spikes out of the frame.") - deconstruct(TRUE) - else - to_chat(user, "You can't do that while something's on the spike!") - else - return ..() + if(I.use_tool(src, user, 20, volume=100)) + to_chat(user, "You pry the spikes out of the frame.") + deconstruct(TRUE) + return TRUE /obj/structure/kitchenspike/attack_hand(mob/user) if(VIABLE_MOB_CHECK(user.pulling) && user.a_intent == INTENT_GRAB && !has_buckled_mobs()) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index b88ee9049fc..4ebf840463f 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -59,23 +59,24 @@ new /obj/item/shard( src.loc ) qdel(src) -/obj/structure/mirror/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) - var/obj/item/weldingtool/WT = I - if(broken) - user.changeNext_move(CLICK_CD_MELEE) - if(WT.remove_fuel(0, user)) - to_chat(user, "You begin repairing [src]...") - playsound(src, 'sound/items/welder.ogg', 100, 1) - if(do_after(user, 10*I.toolspeed, target = src)) - if(!user || !WT || !WT.isOn()) - return - to_chat(user, "You repair [src].") - broken = 0 - icon_state = initial(icon_state) - desc = initial(desc) - else - return ..() +/obj/structure/mirror/welder_act(mob/living/user, obj/item/I) + if(user.a_intent == INTENT_HARM) + return FALSE + + if(!broken) + return TRUE + + if(!I.tool_start_check(user, amount=0)) + return TRUE + + to_chat(user, "You begin repairing [src]...") + if(I.use_tool(src, user, 10, volume=50)) + to_chat(user, "You repair [src].") + broken = 0 + icon_state = initial(icon_state) + desc = initial(desc) + + return TRUE /obj/structure/mirror/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index a73824ca2bc..b3b3d553810 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -370,25 +370,6 @@ user.set_machine(src) song.interact(user) -/obj/structure/piano/attackby(obj/item/O, mob/user, params) - if (istype(O, /obj/item/wrench)) - if (!anchored && !isinspace()) - playsound(src, 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 tighten \the [src]'s casters. Now it can be played again.", \ - "You hear ratchet.") - anchored = TRUE - else if(anchored) - playsound(src, 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 loosen \the [src]. Now it can be pulled somewhere else.", \ - "You hear ratchet.") - anchored = FALSE - else - return ..() +/obj/structure/piano/wrench_act(mob/living/user, obj/item/I) + default_unfasten_wrench(user, I, 40) + return TRUE diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index d0d8989e046..99903901bd8 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -21,18 +21,16 @@ add_fingerprint(user) if(istype(W, /obj/item/screwdriver)) if(state == PLASTIC_FLAPS_NORMAL) - playsound(src.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, 100*W.toolspeed, target = src)) + if(W.use_tool(src, user, 100, volume=100)) 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(src.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(W.use_tool(src, user, 40, volume=100)) if(state != PLASTIC_FLAPS_DETACHED) return state = PLASTIC_FLAPS_NORMAL @@ -40,9 +38,8 @@ to_chat(user, "You screw [src] from the floor.") else if(istype(W, /obj/item/wirecutters)) if(state == PLASTIC_FLAPS_DETACHED) - playsound(src.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(W.use_tool(src, user, 50, volume=100)) if(state != PLASTIC_FLAPS_DETACHED) return to_chat(user, "You cut apart [src].") diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index a8ca42bff52..5124b3697b1 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -89,47 +89,46 @@ to_chat(user, "Unweld [src] from the floor first!") return user.visible_message("[user] starts to dismantle [src].", "You start to dismantle [src]...") - if(do_after(user, 80*W.toolspeed, target = src)) - playsound(src, W.usesound, 50, 1) + if(W.use_tool(src, user, 80, volume=50)) to_chat(user, "You dismantle [src].") new framebuildstacktype(drop_location(), framebuildstackamount) if(buildstackamount) new buildstacktype(drop_location(), buildstackamount) qdel(src) else if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(obj_integrity < max_integrity) - if(WT.remove_fuel(0,user)) - user.visible_message("[user] starts to repair [src].", - "You begin repairing [src]...", - "You hear welding.") - playsound(src, W.usesound, 40, 1) - if(do_after(user,40*WT.toolspeed, target = src)) - obj_integrity = max_integrity - user.visible_message("[user] has repaired [src].", \ - "You finish repairing [src].") + if(!W.tool_start_check(user, amount=0)) + return + + user.visible_message("[user] starts to repair [src].", + "You begin repairing [src]...", + "You hear welding.") + if(W.use_tool(src, user, 40, volume=40)) + obj_integrity = max_integrity + user.visible_message("[user] has repaired [src].", \ + "You finish repairing [src].") else if(!anchored) - if (WT.remove_fuel(0,user)) - playsound(src, W.usesound, 50, 1) - user.visible_message("[user] starts to weld [src] to the floor.", - "You start to weld [src] to the floor...", - "You hear welding.") - if (do_after(user,20*W.toolspeed, target = src)) - if(!WT.isOn()) - return - anchored = TRUE - to_chat(user, "You weld [src] to the floor.") + if(!W.tool_start_check(user, amount=0)) + return + + user.visible_message("[user] starts to weld [src] to the floor.", + "You start to weld [src] to the floor...", + "You hear welding.") + if (W.use_tool(src, user, 20, volume=50)) + anchored = TRUE + to_chat(user, "You weld [src] to the floor.") else - if (WT.remove_fuel(0,user)) - playsound(src, W.usesound, 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*W.toolspeed, target = src)) - if(!WT.isOn()) - return - anchored = FALSE - to_chat(user, "You cut [src] free from the floor.") + if(!W.tool_start_check(user, amount=0)) + return + + 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 (W.use_tool(src, user, 20, volume=50)) + anchored = FALSE + to_chat(user, "You cut [src] free from the floor.") + //Finishing the frame else if(istype(W, /obj/item/stack/sheet)) if(finished) diff --git a/code/game/objects/structures/showcase.dm b/code/game/objects/structures/showcase.dm index 0aa447ca58c..2c5125eae46 100644 --- a/code/game/objects/structures/showcase.dm +++ b/code/game/objects/structures/showcase.dm @@ -120,10 +120,9 @@ deconstruction_state = SHOWCASE_SCREWDRIVERED if(istype(W, /obj/item/crowbar) && deconstruction_state == SHOWCASE_SCREWDRIVERED) - if(do_after(user, 20*W.toolspeed, target = src)) - playsound(loc, W.usesound, 100, 1) + if(W.use_tool(src, user, 20, volume=100)) to_chat(user, "You start to crowbar the showcase apart...") - new /obj/item/stack/sheet/metal (get_turf(src), 4) + new /obj/item/stack/sheet/metal(drop_location(), 4) qdel(src) if(deconstruction_state == SHOWCASE_CONSTRUCTED && default_unfasten_wrench(user, W)) diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm index 382858dd534..e5c57c14686 100644 --- a/code/game/objects/structures/signs/_signs.dm +++ b/code/game/objects/structures/signs/_signs.dm @@ -27,21 +27,21 @@ if(BURN) playsound(loc, 'sound/items/welder.ogg', 80, 1) -/obj/structure/sign/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/wrench) && buildable_sign) +/obj/structure/sign/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/wrench) && buildable_sign) user.visible_message("[user] starts removing [src]...", \ "You start unfastening [src].") - playsound(src, O.usesound, 50, 1) - if(!do_after(user, 30*O.toolspeed, target = src)) - return - playsound(src, 'sound/items/deconstruct.ogg', 50, 1) - user.visible_message("[user] unfastens [src].", \ - "You unfasten [src].") - var/obj/item/sign_backing/SB = new (get_turf(user)) - SB.icon_state = icon_state - SB.sign_path = type - qdel(src) - else if(istype(O, /obj/item/pen) && buildable_sign) + playsound(src, I.usesound, 50, 1) + if(I.use_tool(src, user, 40)) + playsound(src, 'sound/items/deconstruct.ogg', 50, 1) + user.visible_message("[user] unfastens [src].", \ + "You unfasten [src].") + var/obj/item/sign_backing/SB = new (get_turf(user)) + SB.icon_state = icon_state + SB.sign_path = type + qdel(src) + return + else if(istype(I, /obj/item/pen) && buildable_sign) var/list/sign_types = list("Secure Area", "Biohazard", "High Voltage", "Radiation", "Hard Vacuum Ahead", "Disposal: Leads To Space", "Danger: Fire", "No Smoking", "Medbay", "Science", "Chemistry", \ "Hydroponics", "Xenobiology") var/obj/structure/sign/sign_type diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index 67b42c128ca..efdeaf65a3b 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -18,11 +18,10 @@ user.changeNext_move(CLICK_CD_MELEE) if(istype(W, /obj/item/wrench)) if(anchored) - playsound(src.loc, W.usesound, 100, 1) user.visible_message("[user] is loosening the [name]'s bolts.", \ "You are loosening the [name]'s bolts...") - if(do_after(user,40*W.toolspeed, target = src)) - if(!src.loc || !anchored) + if(W.use_tool(src, user, 40, volume=100)) + if(!anchored) return user.visible_message("[user] loosened the [name]'s bolts!", \ "You loosen the [name]'s bolts!") @@ -31,27 +30,15 @@ if(!isfloorturf(src.loc)) user.visible_message("A floor must be present to secure the [name]!") return - playsound(src.loc, W.usesound, 100, 1) user.visible_message("[user] is securing the [name]'s bolts...", \ "You are securing the [name]'s bolts...") - if(do_after(user, 40*W.toolspeed, target = src)) - if(!src.loc || anchored) + if(W.use_tool(src, user, 40, volume=100)) + if(anchored) return user.visible_message("[user] has secured the [name]'s bolts.", \ "You have secured the [name]'s bolts.") anchored = TRUE - else if(istype(W, /obj/item/gun/energy/plasmacutter)) - playsound(src, 'sound/items/welder.ogg', 100, 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(!src.loc) - return - user.visible_message("[user] slices apart the [name].", \ - "You slice apart the [name].") - deconstruct(TRUE) - else if(istype(W, /obj/item/pickaxe/drill/jackhammer)) var/obj/item/pickaxe/drill/jackhammer/D = W if(!src.loc) @@ -61,13 +48,14 @@ D.playDigSound() qdel(src) - else if(istype(W, /obj/item/weldingtool) && !anchored) + else if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + if(!W.tool_start_check(user, amount=0)) + return FALSE + 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(!src.loc) - return + if(W.use_tool(src, user, 40)) playsound(loc, 'sound/items/welder2.ogg', 50, 1) user.visible_message("[user] slices apart the [name].", \ "You slice apart the [name]!") diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm index 268c30b88d0..eea3e94352e 100644 --- a/code/game/objects/structures/table_frames.dm +++ b/code/game/objects/structures/table_frames.dm @@ -25,7 +25,7 @@ if(istype(I, /obj/item/wrench)) to_chat(user, "You start disassembling [src]...") playsound(src.loc, I.usesound, 50, 1) - if(do_after(user, 30*I.toolspeed, target = src)) + if(I.use_tool(src, user, 30)) playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) deconstruct(TRUE) else if(istype(I, /obj/item/stack/sheet/plasteel)) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index ec9c5b1209b..6f5b31e5fa0 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -101,15 +101,13 @@ if(!(flags_1 & NODECONSTRUCT_1)) if(istype(I, /obj/item/screwdriver) && deconstruction_ready) to_chat(user, "You start disassembling [src]...") - playsound(src.loc, I.usesound, 50, 1) - if(do_after(user, 20*I.toolspeed, target = src)) + if(I.use_tool(src, user, 20, volume=50)) deconstruct(TRUE) return if(istype(I, /obj/item/wrench) && deconstruction_ready) to_chat(user, "You start deconstructing [src]...") - playsound(src.loc, I.usesound, 50, 1) - if(do_after(user, 40*I.toolspeed, target = src)) + if(I.use_tool(src, user, 40, volume=50)) playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) deconstruct(TRUE, 1) return @@ -307,23 +305,19 @@ /obj/structure/table/reinforced/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)) - playsound(src.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 = 0 - 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 = 1 + if(!W.tool_start_check(user, amount=0)) + return + + if(deconstruction_ready) + to_chat(user, "You start strengthening the reinforced table...") + if (W.use_tool(src, user, 50, volume=50)) + to_chat(user, "You strengthen the table.") + deconstruction_ready = 0 + else + to_chat(user, "You start weakening the reinforced table...") + if (W.use_tool(src, user, 50, volume=50)) + to_chat(user, "You weaken the table.") + deconstruction_ready = 1 else . = ..() diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index f701d92360e..a958cc2fb63 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -42,8 +42,7 @@ to_chat(user, "Remove the pod first!") return user.visible_message("[user] starts to deattach \the [src].", "You start to deattach the [name]...") - playsound(src.loc, W.usesound, 50, 1) - if(do_after(user, 35*W.toolspeed, target = src)) + if(W.use_tool(src, user, 40, volume=50)) to_chat(user, "You deattach the [name].") var/obj/structure/c_transit_tube/R = new tube_construction(loc) R.setDir(dir) diff --git a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm index 7df9e104a43..883cd8e4bb2 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -28,22 +28,17 @@ build_type = flipped_build_type else build_type = initial(build_type) - icon_state = "[base_icon][flipped]" + icon_state = "[base_icon][flipped]" -/obj/structure/c_transit_tube/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wrench)) - to_chat(user, "You start attaching the [name]...") - add_fingerprint(user) - playsound(src.loc, I.usesound, 50, 1) - if(do_after(user, 40*I.toolspeed, target = src)) - if(QDELETED(src)) - return - to_chat(user, "You attach the [name].") - var/obj/structure/transit_tube/R = new build_type(loc, dir) - transfer_fingerprints_to(R) - qdel(src) - else - return ..() +/obj/structure/c_transit_tube/wrench_act(mob/living/user, obj/item/I) + to_chat(user, "You start attaching the [name]...") + add_fingerprint(user) + if(I.use_tool(src, user, 40, volume=50)) + to_chat(user, "You attach the [name].") + var/obj/structure/transit_tube/R = new build_type(loc, dir) + transfer_fingerprints_to(R) + qdel(src) + return TRUE // transit tube station /obj/structure/c_transit_tube/station diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index c9d17aa1731..aa2247aa949 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -75,7 +75,7 @@ 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)) + if(I.use_tool(src, user, 30)) 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() @@ -159,13 +159,7 @@ ..() /obj/structure/urinal/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/screwdriver)) - to_chat(user, "You start to [exposed ? "screw the cap back into place" : "unscrew the cap to the drain protector"]...") - playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1) - if(do_after(user, 20*I.toolspeed, target = src)) - user.visible_message("[user] [exposed ? "screws the cap back into place" : "unscrew the cap to the drain protector"]!", "You [exposed ? "screw the cap back into place" : "unscrew the cap on the drain"]!", "You hear metal and squishing noises.") - exposed = !exposed - else if(exposed) + if(exposed) if (hiddenitem) to_chat(user, "There is already something in the drain enclosure.") return @@ -177,6 +171,18 @@ return hiddenitem = I to_chat(user, "You place [I] into the drain enclosure.") + else + return ..() + +/obj/structure/urinal/screwdriver_act(mob/living/user, obj/item/I) + to_chat(user, "You start to [exposed ? "screw the cap back into place" : "unscrew the cap to the drain protector"]...") + playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1) + if(I.use_tool(src, user, 20)) + user.visible_message("[user] [exposed ? "screws the cap back into place" : "unscrew the cap to the drain protector"]!", + "You [exposed ? "screw the cap back into place" : "unscrew the cap on the drain"]!", + "You hear metal and squishing noises.") + exposed = !exposed + return TRUE /obj/item/reagent_containers/food/urinalcake @@ -242,19 +248,23 @@ /obj/machinery/shower/attackby(obj/item/I, mob/user, params) if(I.type == /obj/item/device/analyzer) to_chat(user, "The water temperature seems to be [watertemp].") - if(istype(I, /obj/item/wrench)) - 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] to [watertemp] temperature.") - log_game("[key_name(user)] has wrenched a shower to [watertemp] at ([x],[y],[z])") - add_hiddenprint(user) + else + return ..() + +/obj/machinery/shower/wrench_act(mob/living/user, obj/item/I) + to_chat(user, "You begin to adjust the temperature valve with \the [I]...") + if(I.use_tool(src, user, 50)) + 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] to [watertemp] temperature.") + log_game("[key_name(user)] has wrenched a shower to [watertemp] at ([x],[y],[z])") + add_hiddenprint(user) + return TRUE /obj/machinery/shower/update_icon() //this is terribly unreadable, but basically it makes the shower mist up @@ -606,34 +616,24 @@ /obj/structure/curtain/attackby(obj/item/W, mob/user) if (istype(W, /obj/item/toy/crayon)) color = input(user,"","Choose Color",color) as color - else if(istype(W, /obj/item/screwdriver)) - if(anchored) - playsound(src.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(src.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(src.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() else - . = ..() + return ..() + +/obj/structure/curtain/wrench_act(mob/living/user, obj/item/I) + default_unfasten_wrench(user, I, 50) + return TRUE + +/obj/structure/curtain/wirecutter_act(mob/living/user, obj/item/I) + if(anchored) + return TRUE + + user.visible_message("[user] cuts apart [src].", + "You start to cut apart [src].", "You hear cutting.") + if(I.use_tool(src, user, 50, volume=100) && !anchored) + to_chat(user, "You cut apart [src].") + deconstruct() + + return TRUE /obj/structure/curtain/attack_hand(mob/user) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 23a1113665a..7fa2ee12b88 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -87,36 +87,35 @@ add_fingerprint(user) switch(state) if("01") - if(istype(W, /obj/item/weldingtool) && !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*W.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) - else + if(istype(W, /obj/item/weldingtool) && !anchored) + if(!W.tool_start_check(user, amount=0)) return + user.visible_message("[user] disassembles the windoor assembly.", + "You start to disassemble the windoor assembly...") + playsound(loc, 'sound/items/welder2.ogg', 50, 1) + + if(W.use_tool(src, user, 40)) + 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(istype(W, /obj/item/wrench) && !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...") + 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) + if(W.use_tool(src, user, 40, volume=100)) + if(anchored) return for(var/obj/machinery/door/window/WD in loc) if(WD.dir == dir) @@ -131,11 +130,11 @@ //Unwrenching an unsecure assembly un-anchors it. Step 4 undone else if(istype(W, /obj/item/wrench) && anchored) - playsound(loc, W.usesound, 100, 1) - user.visible_message("[user] unsecures the windoor assembly to the floor.", "You start to unsecure the windoor assembly to the floor...") + user.visible_message("[user] unsecures the windoor assembly to the floor.", + "You start to unsecure the windoor assembly to the floor...") - if(do_after(user, 40*W.toolspeed, target = src)) - if(!src || !anchored) + if(W.use_tool(src, user, 40, volume=100)) + if(!anchored) return to_chat(user, "You unsecure the windoor assembly.") anchored = FALSE @@ -188,11 +187,10 @@ //Removing wire from the assembly. Step 5 undone. if(istype(W, /obj/item/wirecutters)) - 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") + if(W.use_tool(src, user, 40, volume=100)) + if(state != "02") return to_chat(user, "You cut the windoor wires.") @@ -208,7 +206,8 @@ if(!user.transferItemToLoc(W, src)) return 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.visible_message("[user] installs the electronics into the airlock assembly.", + "You start to install electronics into the airlock assembly...") if(do_after(user, 40, target = src)) if(!src || electronics) @@ -225,12 +224,10 @@ 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...") + 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 + if(W.use_tool(src, user, 40, volume=100) && electronics) to_chat(user, "You remove the airlock electronics.") name = "wired windoor assembly" var/obj/item/electronics/airlock/ae @@ -254,58 +251,56 @@ 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...") + 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(do_after(user, 40*W.toolspeed, target = src)) - - if(loc && electronics) - - density = TRUE //Shouldn't matter but just incase - to_chat(user, "You finish the windoor.") - - if(secure) - var/obj/machinery/door/window/brigdoor/windoor = new /obj/machinery/door/window/brigdoor(loc) - if(facing == "l") - windoor.icon_state = "leftsecureopen" - windoor.base_state = "leftsecure" - else - windoor.icon_state = "rightsecureopen" - windoor.base_state = "rightsecure" - windoor.setDir(dir) - windoor.density = FALSE - - if(electronics.one_access) - windoor.req_one_access = electronics.accesses - else - windoor.req_access = electronics.accesses - windoor.electronics = electronics - electronics.forceMove(windoor) - if(created_name) - windoor.name = created_name - qdel(src) - windoor.close() + if(W.use_tool(src, user, 40, volume=100) && electronics) + density = TRUE //Shouldn't matter but just incase + to_chat(user, "You finish the windoor.") + if(secure) + var/obj/machinery/door/window/brigdoor/windoor = new /obj/machinery/door/window/brigdoor(loc) + if(facing == "l") + windoor.icon_state = "leftsecureopen" + windoor.base_state = "leftsecure" else - var/obj/machinery/door/window/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 + windoor.icon_state = "rightsecureopen" + windoor.base_state = "rightsecure" + windoor.setDir(dir) + windoor.density = FALSE + if(electronics.one_access) + windoor.req_one_access = electronics.accesses + else windoor.req_access = electronics.accesses - windoor.electronics = electronics - electronics.loc = windoor - if(created_name) - windoor.name = created_name - qdel(src) - windoor.close() + windoor.electronics = electronics + electronics.forceMove(windoor) + if(created_name) + windoor.name = created_name + qdel(src) + windoor.close() + + + else + var/obj/machinery/door/window/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 + + windoor.req_access = electronics.accesses + windoor.electronics = electronics + electronics.loc = windoor + if(created_name) + windoor.name = created_name + qdel(src) + windoor.close() else @@ -318,7 +313,13 @@ /obj/structure/windoor_assembly/ComponentInitialize() . = ..() - AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS,null,CALLBACK(src, .proc/can_be_rotated),CALLBACK(src,.proc/after_rotation)) + AddComponent( + /datum/component/simple_rotation, + ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, + null, + CALLBACK(src, .proc/can_be_rotated), + CALLBACK(src,.proc/after_rotation) + ) /obj/structure/windoor_assembly/proc/can_be_rotated(mob/user,rotation_type) if(anchored) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index add789c0b8e..6d2d7abcd1f 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -178,17 +178,19 @@ return 1 //skip the afterattack add_fingerprint(user) + if(istype(I, /obj/item/weldingtool) && 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].") + if(!I.tool_start_check(user, amount=0)) + return + + to_chat(user, "You begin repairing [src]...") + playsound(src, I.usesound, 40, 1) + if(I.use_tool(src, user, 40)) + 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 @@ -199,18 +201,18 @@ 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))) + if(I.use_tool(src, user, decon_speed, 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))) + if(I.use_tool(src, user, decon_speed, 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))) + if(I.use_tool(src, user, decon_speed, extra_checks = CALLBACK(src, .proc/check_anchored, anchored))) anchored = !anchored air_update_turf(TRUE) update_nearby_icons() @@ -221,7 +223,7 @@ else if (istype(I, /obj/item/crowbar) && 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))) + if(I.use_tool(src, user, decon_speed, 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 @@ -229,7 +231,7 @@ else if(istype(I, /obj/item/wrench) && !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))) + if(I.use_tool(src, user, decon_speed, 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) diff --git a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm index 80329f20a18..257ae07a551 100644 --- a/code/game/shuttle_engines.dm +++ b/code/game/shuttle_engines.dm @@ -39,30 +39,34 @@ if(default_unfasten_wrench(user, I)) return else if(istype(I, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = I switch(state) if(ENGINE_UNWRENCHED) to_chat(user, "The [src.name] needs to be wrenched to the floor!") if(EM_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,ENGINE_WELDTIME*WT.toolspeed, target = src) && WT.isOn()) - state = ENGINE_WELDED - to_chat(user, "You weld \the [src] to the floor.") - alter_engine_power(engine_power) + if(!I.tool_start_check(user, amount=0)) + return + + 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(I.use_tool(src, user, ENGINE_WELDTIME, volume=50)) + state = ENGINE_WELDED + to_chat(user, "You weld \the [src] to the floor.") + alter_engine_power(engine_power) + if(EM_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,ENGINE_WELDTIME*WT.toolspeed, target = src) && WT.isOn()) - state = ENGINE_WRENCHED - to_chat(user, "You cut \the [src] free from the floor.") - alter_engine_power(-engine_power) + if(!I.tool_start_check(user, amount=0)) + return + + 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(I.use_tool(src, user, ENGINE_WELDTIME, volume=50)) + state = ENGINE_WRENCHED + to_chat(user, "You cut \the [src] free from the floor.") + alter_engine_power(-engine_power) return else return ..() diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index c6a2984fedf..721cb12e9d2 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -196,19 +196,14 @@ flick_overlay(I, viewing, 8) L.adjustToxLoss(-3, TRUE, TRUE) -/turf/open/floor/clockwork/attackby(obj/item/I, mob/living/user, params) +/turf/open/floor/clockwork/crowbar_act(mob/living/user, obj/item/I) if(baseturfs == type) - return - if(istype(I, /obj/item/crowbar)) - 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 + return TRUE + user.visible_message("[user] begins slowly prying up [src]...", "You begin painstakingly prying up [src]...") + if(I.use_tool(src, user, 70, volume=80)) user.visible_message("[user] pries up [src]!", "You pry up [src]!") - playsound(src, I.usesound, 80, 1) make_plating() - return 1 - return ..() + return TRUE /turf/open/floor/clockwork/make_plating() new /obj/item/stack/tile/brass(src) diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index e26d2701a84..be55db54086 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -78,15 +78,15 @@ playsound(src, 'sound/weapons/genhit.ogg', 50, 1) else to_chat(user, "This section is too damaged to support a tile! Use a welder to fix the damage.") - else if(istype(C, /obj/item/weldingtool)) - var/obj/item/weldingtool/welder = C - if( welder.isOn() && (broken || burnt) ) - if(welder.remove_fuel(0,user)) - to_chat(user, "You fix some dents on the broken plating.") - playsound(src, welder.usesound, 80, 1) - icon_state = icon_plating - burnt = 0 - broken = 0 + +/turf/open/floor/plating/welder_act(mob/living/user, obj/item/I) + if((broken || burnt) && I.use_tool(src, user, 0, volume=80)) + to_chat(user, "You fix some dents on the broken plating.") + icon_state = icon_plating + burnt = FALSE + broken = FALSE + + return TRUE /turf/open/floor/plating/foam name = "metal foam plating" diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm index 60382b90526..0bd4572b35c 100644 --- a/code/game/turfs/simulated/floor/reinf_floor.dm +++ b/code/game/turfs/simulated/floor/reinf_floor.dm @@ -25,18 +25,14 @@ ..() return //unplateable -/turf/open/floor/engine/attackby(obj/item/C, mob/user, params) - if(!C || !user) - return - if(istype(C, /obj/item/wrench)) - to_chat(user, "You begin removing rods...") - playsound(src, C.usesound, 80, 1) - if(do_after(user, 30*C.toolspeed, target = src)) - if(!istype(src, /turf/open/floor/engine)) - return - new /obj/item/stack/rods(src, 2) - ChangeTurf(/turf/open/floor/plating) - return +/turf/open/floor/engine/wrench_act(mob/living/user, obj/item/I) + to_chat(user, "You begin removing rods...") + if(I.use_tool(src, user, 30, volume=80)) + if(!istype(src, /turf/open/floor/engine)) + return TRUE + new /obj/item/stack/rods(src, 2) + ChangeTurf(/turf/open/floor/plating) + return TRUE /turf/open/floor/engine/acid_act(acidpwr, acid_volume) acidpwr = min(acidpwr, 50) //we reduce the power so reinf floor never get melted. diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm index 4211c83d372..db8db31ac72 100644 --- a/code/game/turfs/simulated/wall/reinf_walls.dm +++ b/code/game/turfs/simulated/wall/reinf_walls.dm @@ -77,9 +77,8 @@ if(SUPPORT_LINES) if(istype(W, /obj/item/screwdriver)) to_chat(user, "You begin unsecuring the support lines...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 40*W.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !W || d_state != SUPPORT_LINES) + if(W.use_tool(src, user, 40, volume=100)) + if(!istype(src, /turf/closed/wall/r_wall) || d_state != SUPPORT_LINES) return 1 d_state = COVER update_icon() @@ -94,24 +93,12 @@ return 1 if(COVER) - if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0,user)) - to_chat(user, "You begin slicing through the metal cover...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 60*W.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !WT || !WT.isOn() || d_state != COVER) - return 1 - d_state = CUT_COVER - update_icon() - to_chat(user, "You press firmly on the cover, dislodging it.") - return 1 - - if(istype(W, /obj/item/gun/energy/plasmacutter)) + if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + if(!W.tool_start_check(user, amount=0)) + return to_chat(user, "You begin slicing through the metal cover...") - playsound(src, 'sound/items/welder.ogg', 100, 1) - if(do_after(user, 60*W.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !W || d_state != COVER) + if(W.use_tool(src, user, 60, volume=100)) + if(!istype(src, /turf/closed/wall/r_wall) || d_state != COVER) return 1 d_state = CUT_COVER update_icon() @@ -120,9 +107,8 @@ if(istype(W, /obj/item/screwdriver)) to_chat(user, "You begin securing the support lines...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 40*W.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !W || d_state != COVER) + if(W.use_tool(src, user, 40, volume=100)) + if(!istype(src, /turf/closed/wall/r_wall) || d_state != COVER) return 1 d_state = SUPPORT_LINES update_icon() @@ -132,9 +118,8 @@ if(CUT_COVER) if(istype(W, /obj/item/crowbar)) to_chat(user, "You struggle to pry off the cover...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 100*W.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !W || d_state != CUT_COVER) + if(W.use_tool(src, user, 100, volume=100)) + if(!istype(src, /turf/closed/wall/r_wall) || d_state != CUT_COVER) return 1 d_state = BOLTS update_icon() @@ -142,24 +127,22 @@ return 1 if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0,user)) - 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/closed/wall/r_wall) || !WT || !WT.isOn() || d_state != CUT_COVER) - return 1 - d_state = COVER - update_icon() - to_chat(user, "The metal cover has been welded securely to the frame.") + if(!W.tool_start_check(user, amount=0)) + return + to_chat(user, "You begin welding the metal cover back to the frame...") + if(W.use_tool(src, user, 60, volume=100)) + if(!istype(src, /turf/closed/wall/r_wall) || d_state != CUT_COVER) + return TRUE + d_state = COVER + update_icon() + to_chat(user, "The metal cover has been welded securely to the frame.") return 1 if(BOLTS) if(istype(W, /obj/item/wrench)) to_chat(user, "You start loosening the anchoring bolts which secure the support rods to their frame...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 40*W.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !W || d_state != BOLTS) + if(W.use_tool(src, user, 40, volume=100)) + if(!istype(src, /turf/closed/wall/r_wall) || d_state != BOLTS) return 1 d_state = SUPPORT_RODS update_icon() @@ -168,9 +151,8 @@ if(istype(W, /obj/item/crowbar)) to_chat(user, "You start to pry the cover back into place...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 20*W.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !W || d_state != BOLTS) + if(W.use_tool(src, user, 20, volume=100)) + if(!istype(src, /turf/closed/wall/r_wall) || d_state != BOLTS) return 1 d_state = CUT_COVER update_icon() @@ -178,24 +160,12 @@ return 1 if(SUPPORT_RODS) - if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0,user)) - to_chat(user, "You begin slicing through the support rods...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 100*W.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !WT || !WT.isOn() || d_state != SUPPORT_RODS) - return 1 - d_state = SHEATH - update_icon() - to_chat(user, "You slice through the support rods.") - return 1 - - if(istype(W, /obj/item/gun/energy/plasmacutter)) + if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + if(!W.tool_start_check(user, amount=0)) + return to_chat(user, "You begin slicing through the support rods...") - playsound(src, 'sound/items/welder.ogg', 100, 1) - if(do_after(user, 100*W.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !W || d_state != SUPPORT_RODS) + if(W.use_tool(src, user, 100, volume=100)) + if(!istype(src, /turf/closed/wall/r_wall) || d_state != SUPPORT_RODS) return 1 d_state = SHEATH update_icon() @@ -205,8 +175,8 @@ if(istype(W, /obj/item/wrench)) to_chat(user, "You start tightening the bolts which secure the support rods to their frame...") playsound(src, W.usesound, 100, 1) - if(do_after(user, 40*W.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !W || d_state != SUPPORT_RODS) + if(W.use_tool(src, user, 40)) + if(!istype(src, /turf/closed/wall/r_wall) || d_state != SUPPORT_RODS) return 1 d_state = BOLTS update_icon() @@ -216,26 +186,24 @@ if(SHEATH) if(istype(W, /obj/item/crowbar)) to_chat(user, "You struggle to pry off the outer sheath...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, 100*W.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !W || d_state != SHEATH) + if(W.use_tool(src, user, 100, volume=100)) + if(!istype(src, /turf/closed/wall/r_wall) || d_state != SHEATH) return 1 to_chat(user, "You pry off the outer sheath.") dismantle_wall() return 1 if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0,user)) - to_chat(user, "You begin welding the support rods back together...") - playsound(src, WT.usesound, 100, 1) - if(do_after(user, 100*WT.toolspeed, target = src)) - if(!istype(src, /turf/closed/wall/r_wall) || !WT || !WT.isOn() || d_state != SHEATH) - return 1 - d_state = SUPPORT_RODS - update_icon() - to_chat(user, "You weld the support rods back together.") - return 1 + if(!W.tool_start_check(user, amount=0)) + return + to_chat(user, "You begin welding the support rods back together...") + if(W.use_tool(src, user, 100, volume=100)) + if(!istype(src, /turf/closed/wall/r_wall) || d_state != SHEATH) + return TRUE + d_state = SUPPORT_RODS + update_icon() + to_chat(user, "You weld the support rods back together.") + return 1 return 0 /turf/closed/wall/r_wall/proc/update_icon() diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index e95ea32046e..fde7c5c8045 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -190,18 +190,21 @@ return ..() /turf/closed/wall/proc/try_clean(obj/item/W, mob/user, turf/T) - if((user.a_intent != INTENT_HELP) || !LAZYLEN(dent_decals) || !istype(W, /obj/item/weldingtool)) + if((user.a_intent != INTENT_HELP) || !LAZYLEN(dent_decals)) return FALSE - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0, user)) + + if(istype(W, /obj/item/weldingtool)) + if(!W.tool_start_check(user, amount=0)) + return FALSE + to_chat(user, "You begin fixing dents on the wall...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, slicing_duration * W.toolspeed * 0.1, target = src)) - if(iswallturf(src) && user && !QDELETED(WT) && WT.isOn() && !QDELETED(T) && (user.loc == T) && (user.get_active_held_item() == WT) && LAZYLEN(dent_decals)) + if(W.use_tool(src, user, slicing_duration, volume=100)) + if(iswallturf(src) && LAZYLEN(dent_decals)) to_chat(user, "You fix some dents on the wall.") cut_overlay(dent_decals) LAZYCLEARLIST(dent_decals) return TRUE + return FALSE /turf/closed/wall/proc/try_wallmount(obj/item/W, mob/user, turf/T) @@ -219,27 +222,17 @@ return FALSE /turf/closed/wall/proc/try_decon(obj/item/W, mob/user, turf/T) - if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0, user)) - to_chat(user, "You begin slicing through the outer plating...") - playsound(src, W.usesound, 100, 1) - if(do_after(user, slicing_duration * W.toolspeed, target = src)) - if(iswallturf(src) && user && !QDELETED(WT) && WT.isOn() && !QDELETED(T) && (user.loc == T) && (user.get_active_held_item() == WT)) - to_chat(user, "You remove the outer plating.") - dismantle_wall() - return TRUE - else if(istype(W, /obj/item/gun/energy/plasmacutter)) + if(istype(W, /obj/item/weldingtool) || istype(W, /obj/item/gun/energy/plasmacutter)) + if(!W.tool_start_check(user, amount=0)) + return FALSE + to_chat(user, "You begin slicing through the outer plating...") - playsound(src, 'sound/items/welder.ogg', 100, 1) - if(do_after(user, slicing_duration * W.toolspeed, target = src)) - if(!iswallturf(src) || !user || QDELETED(W) || QDELETED(T)) - return TRUE - if((user.loc == T) && (user.get_active_held_item() == W)) + if(W.use_tool(src, user, slicing_duration, volume=100)) + if(iswallturf(src)) to_chat(user, "You remove the outer plating.") dismantle_wall() - visible_message("The wall was sliced apart by [user]!", "You hear metal being sliced apart.") - return TRUE + return TRUE + return FALSE diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 0bcb6f967e5..e584a63275a 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -683,7 +683,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} if(istype(I, /obj/item/wrench)) to_chat(user, "You start disassembling [src]...") playsound(src.loc, I.usesound, 50, 1) - if(do_after(user, 30*I.toolspeed, target = src)) + if(I.use_tool(src, user, 30)) playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) for(var/i = 1, i <= framestackamount, i++) new framestack(get_turf(src)) diff --git a/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm b/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm index b1734b3aefc..fb8397eed70 100644 --- a/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm +++ b/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm @@ -31,9 +31,8 @@ if(anchored) to_chat(user, "[src] needs to be unsecured to disassemble it!") else - playsound(src, I.usesound, 100, 1) user.visible_message("[user] starts to disassemble [src].", "You start to disassemble [src]...") - if(do_after(user, 30*I.toolspeed, target = src) && !anchored) + if(I.use_tool(src, user, 30, volume=100) && !anchored) to_chat(user, "You disassemble [src].") deconstruct(TRUE) return 1 diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index b32a8f69e85..910caa7fca6 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -115,9 +115,8 @@ switch(deconstruction_state) if(NUKESTATE_INTACT) if(istype(I, /obj/item/screwdriver/nuke)) - playsound(loc, I.usesound, 100, 1) to_chat(user, "You start removing [src]'s front panel's screws...") - if(do_after(user, 60*I.toolspeed,target=src)) + if(I.use_tool(src, user, 60, volume=100)) deconstruction_state = NUKESTATE_UNSCREWED to_chat(user, "You remove the screws from [src]'s front panel.") update_icon() @@ -125,14 +124,13 @@ if(NUKESTATE_PANEL_REMOVED) if(istype(I, /obj/item/weldingtool)) - var/obj/item/weldingtool/welder = I - playsound(loc, I.usesound, 100, 1) + if(!I.tool_start_check(user, amount=1)) + return to_chat(user, "You start cutting [src]'s inner plate...") - if(welder.remove_fuel(1,user)) - if(do_after(user,80*I.toolspeed,target=src)) - to_chat(user, "You cut [src]'s inner plate.") - deconstruction_state = NUKESTATE_WELDED - update_icon() + if(I.use_tool(src, user, 80, volume=100, amount=1)) + to_chat(user, "You cut [src]'s inner plate.") + deconstruction_state = NUKESTATE_WELDED + update_icon() return if(NUKESTATE_CORE_EXPOSED) if(istype(I, /obj/item/nuke_core_container)) @@ -148,19 +146,15 @@ to_chat(user, "You fail to load the plutonium core into [core_box]. [core_box] has already been used!") return if(istype(I, /obj/item/stack/sheet/metal)) - var/obj/item/stack/sheet/metal/M = I - if(M.amount >= 20) - to_chat(user, "You begin repairing [src]'s inner metal plate...") - if(do_after(user, 100, target=src)) - if(M.use(20)) - to_chat(user, "You repair [src]'s inner metal plate. The radiation is contained.") - deconstruction_state = NUKESTATE_PANEL_REMOVED - STOP_PROCESSING(SSobj, core) - update_icon() - else - to_chat(user, "You need more metal to do that!") - else - to_chat(user, "You need more metal to do that!") + if(!I.tool_start_check(user, amount=20)) + return + + to_chat(user, "You begin repairing [src]'s inner metal plate...") + if(I.use_tool(src, user, 100, amount=20)) + to_chat(user, "You repair [src]'s inner metal plate. The radiation is contained.") + deconstruction_state = NUKESTATE_PANEL_REMOVED + STOP_PROCESSING(SSobj, core) + update_icon() return . = ..() @@ -169,16 +163,14 @@ switch(deconstruction_state) if(NUKESTATE_UNSCREWED) to_chat(user, "You start removing [src]'s front panel...") - playsound(loc, tool.usesound, 100, 1) - if(do_after(user, 30 * tool.toolspeed, target = src)) + if(tool.use_tool(src, user, 30, volume=100)) to_chat(user, "You remove [src]'s front panel.") deconstruction_state = NUKESTATE_PANEL_REMOVED update_icon() return TRUE if(NUKESTATE_WELDED) to_chat(user, "You start prying off [src]'s inner plate...") - playsound(loc, tool.usesound, 100, 1) - if(do_after(user, 50 * tool.toolspeed, target = src)) + if(tool.use_tool(src, user, 30, volume=100)) to_chat(user, "You pry off [src]'s inner plate. You can see the core's green glow!") deconstruction_state = NUKESTATE_CORE_EXPOSED update_icon() diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 9880d0ba46b..1d1af24fcaf 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -675,7 +675,7 @@ user.visible_message("[user.name] removes the electronics from [src.name].",\ "You start prying out the circuit...") playsound(src.loc, W.usesound, 50, 1) - if (do_after(user, 20*W.toolspeed, target = src)) + if (W.use_tool(src, user, 20)) if (buildstage == 1) to_chat(user, "You remove the air alarm electronics.") new /obj/item/electronics/airalarm( src.loc ) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 024c246747f..0f57bd85e96 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -183,39 +183,44 @@ Pipelines + Other Objects -> Pipe network if(user.dropItemToGround(pipe)) pipe.setPipingLayer(piping_layer) //align it with us return TRUE - if(istype(W, /obj/item/wrench)) - if(can_unwrench(user)) - var/turf/T = get_turf(src) - if (level==1 && isturf(T) && T.intact) - to_chat(user, "You must remove the plating first!") - return TRUE - var/datum/gas_mixture/int_air = return_air() - var/datum/gas_mixture/env_air = loc.return_air() - add_fingerprint(user) - - var/unsafe_wrenching = FALSE - var/internal_pressure = int_air.return_pressure()-env_air.return_pressure() - - playsound(src, W.usesound, 50, 1) - to_chat(user, "You begin to unfasten \the [src]...") - if (internal_pressure > 2*ONE_ATMOSPHERE) - to_chat(user, "As you begin unwrenching \the [src] a gush of air blows in your face... maybe you should reconsider?") - unsafe_wrenching = TRUE //Oh dear oh dear - - if (do_after(user, 20*W.toolspeed, target = src) && !QDELETED(src)) - user.visible_message( \ - "[user] unfastens \the [src].", \ - "You unfasten \the [src].", \ - "You hear ratchet.") - investigate_log("was REMOVED by [key_name(usr)]", INVESTIGATE_ATMOS) - - //You unwrenched a pipe full of pressure? Let's splat you into the wall, silly. - if(unsafe_wrenching) - unsafe_pressure_release(user, internal_pressure) - deconstruct(TRUE) else return ..() +/obj/machinery/atmospherics/wrench_act(mob/living/user, obj/item/I) + if(!can_unwrench(user)) + return TRUE + + var/turf/T = get_turf(src) + if (level==1 && isturf(T) && T.intact) + to_chat(user, "You must remove the plating first!") + return TRUE + + var/datum/gas_mixture/int_air = return_air() + var/datum/gas_mixture/env_air = loc.return_air() + add_fingerprint(user) + + var/unsafe_wrenching = FALSE + var/internal_pressure = int_air.return_pressure()-env_air.return_pressure() + + to_chat(user, "You begin to unfasten \the [src]...") + + if (internal_pressure > 2*ONE_ATMOSPHERE) + to_chat(user, "As you begin unwrenching \the [src] a gush of air blows in your face... maybe you should reconsider?") + unsafe_wrenching = TRUE //Oh dear oh dear + + if(I.use_tool(src, user, 20, volume=50)) + user.visible_message( \ + "[user] unfastens \the [src].", \ + "You unfasten \the [src].", \ + "You hear ratchet.") + investigate_log("was REMOVED by [key_name(usr)]", INVESTIGATE_ATMOS) + + //You unwrenched a pipe full of pressure? Let's splat you into the wall, silly. + if(unsafe_wrenching) + unsafe_pressure_release(user, internal_pressure) + deconstruct(TRUE) + return TRUE + /obj/machinery/atmospherics/proc/can_unwrench(mob/user) return can_unwrench @@ -326,7 +331,7 @@ Pipelines + Other Objects -> Pipe network else if(is_type_in_typecache(src, GLOB.ventcrawl_machinery) && can_crawl_through()) //if we move in a way the pipe can connect, but doesn't - or we're in a vent user.forceMove(loc) user.visible_message("You hear something squeezing through the ducts...","You climb out the ventilation system.") - + user.canmove = FALSE addtimer(VARSET_CALLBACK(user, canmove, TRUE), 1) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 3acc12114fe..08497f12f72 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -269,28 +269,23 @@ broadcast_status() update_icon() -/obj/machinery/atmospherics/components/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)) - playsound(loc, WT.usesound, 40, 1) - to_chat(user, "You begin welding the vent...") - if(do_after(user, W.toolspeed * 20, target = src)) - if(!src || !WT.isOn()) - return - playsound(src.loc, 'sound/items/welder2.ogg', 50, 1) - if(!welded) - user.visible_message("[user] welds the vent shut.", "You weld the vent shut.", "You hear welding.") - welded = TRUE - else - user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.") - welded = FALSE - update_icon() - pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) - pipe_vision_img.plane = ABOVE_HUD_PLANE - return 0 - else - return ..() +/obj/machinery/atmospherics/components/unary/vent_pump/welder_act(mob/living/user, obj/item/I) + if(!I.tool_start_check(user, amount=0)) + return TRUE + playsound(loc, I.usesound, 40, 1) + to_chat(user, "You begin welding the vent...") + if(I.use_tool(src, user, 20)) + playsound(src.loc, 'sound/items/welder2.ogg', 50, 1) + if(!welded) + user.visible_message("[user] welds the vent shut.", "You weld the vent shut.", "You hear welding.") + welded = TRUE + else + user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.") + welded = FALSE + update_icon() + pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) + pipe_vision_img.plane = ABOVE_HUD_PLANE + return TRUE /obj/machinery/atmospherics/components/unary/vent_pump/can_unwrench(mob/user) . = ..() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 2437b85dde5..93c5ec3d8f2 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -263,28 +263,23 @@ ..() update_icon_nopipes() -/obj/machinery/atmospherics/components/unary/vent_scrubber/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)) - playsound(loc, WT.usesound, 40, 1) - to_chat(user, "Now welding the scrubber.") - if(do_after(user, 20*W.toolspeed, target = src)) - if(!src || !WT.isOn()) - return - playsound(src.loc, 'sound/items/welder2.ogg', 50, 1) - if(!welded) - user.visible_message("[user] welds the scrubber shut.","You weld the scrubber shut.", "You hear welding.") - welded = TRUE - else - user.visible_message("[user] unwelds the scrubber.", "You unweld the scrubber.", "You hear welding.") - welded = FALSE - update_icon() - pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) - pipe_vision_img.plane = ABOVE_HUD_PLANE - return 0 - else - return ..() +/obj/machinery/atmospherics/components/unary/vent_scrubber/welder_act(mob/living/user, obj/item/I) + if(!I.tool_start_check(user, amount=0)) + return TRUE + playsound(loc, I.usesound, 40, 1) + to_chat(user, "Now welding the scrubber.") + if(I.use_tool(src, user, 20)) + playsound(src.loc, 'sound/items/welder2.ogg', 50, 1) + if(!welded) + user.visible_message("[user] welds the scrubber shut.","You weld the scrubber shut.", "You hear welding.") + welded = TRUE + else + user.visible_message("[user] unwelds the scrubber.", "You unweld the scrubber.", "You hear welding.") + welded = FALSE + update_icon() + pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) + pipe_vision_img.plane = ABOVE_HUD_PLANE + return TRUE /obj/machinery/atmospherics/components/unary/vent_scrubber/can_unwrench(mob/user) . = ..() diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index ccddc8f8ac3..6582dad6df9 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -100,19 +100,20 @@ to_chat(user, status()) -/obj/machinery/meter/attackby(obj/item/W, mob/user, params) - if (istype(W, /obj/item/wrench)) - playsound(src, W.usesound, 50, 1) - to_chat(user, "You begin to unfasten \the [src]...") - if (do_after(user, 40*W.toolspeed, target = src)) - user.visible_message( \ - "[user] unfastens \the [src].", \ - "You unfasten \the [src].", \ - "You hear ratchet.") - new /obj/item/pipe_meter(loc) - qdel(src) - else - return ..() +/obj/machinery/meter/wrench_act(mob/user, obj/item/I) + to_chat(user, "You begin to unfasten \the [src]...") + if (I.use_tool(src, user, 40, volume=50)) + user.visible_message( + "[user] unfastens \the [src].", + "You unfasten \the [src].", + "You hear ratchet.") + deconstruct() + return TRUE + +/obj/machinery/meter/deconstruct(disassembled = TRUE) + if(!(flags_1 & NODECONSTRUCT_1)) + new /obj/item/pipe_meter(loc) + qdel(src) /obj/machinery/meter/attack_ai(mob/user) return attack_hand(user) @@ -131,8 +132,7 @@ /obj/machinery/meter/singularity_pull(S, current_size) ..() if(current_size >= STAGE_FIVE) - new /obj/item/pipe_meter(loc) - qdel(src) + deconstruct() // TURF METER - REPORTS A TILE'S AIR CONTENTS // why are you yelling? diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 13bef3ba1bf..13649a742ab 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -278,21 +278,20 @@ new /obj/item/stack/sheet/metal (loc, 5) qdel(src) -/obj/machinery/portable_atmospherics/canister/attackby(obj/item/W, mob/user, params) - if(user.a_intent != INTENT_HARM && istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - 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 1 +/obj/machinery/portable_atmospherics/canister/welder_act(mob/living/user, obj/item/I) + if(user.a_intent == INTENT_HARM) + return FALSE + + if(stat & BROKEN) + if(!I.tool_start_check(user, amount=0)) + return TRUE + to_chat(user, "You begin cutting [src] apart...") + if(I.use_tool(src, user, 30, volume=50)) + deconstruct(TRUE) else - return ..() + to_chat(user, "You cannot slice [src] apart when it isn't broken.") + + return TRUE /obj/machinery/portable_atmospherics/canister/obj_break(damage_flag) if((stat & BROKEN) || (flags_1 & NODECONSTRUCT_1)) diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index b38712b3757..185d53ad1f9 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -62,7 +62,7 @@ "[user] starts to fix part of the microwave.", \ "You start to fix part of the microwave..." \ ) - if (do_after(user,20*O.toolspeed, target = src)) + if (O.use_tool(src, user, 20)) user.visible_message( \ "[user] fixes part of the microwave.", \ "You fix part of the microwave." \ @@ -73,7 +73,7 @@ "[user] starts to fix part of the microwave.", \ "You start to fix part of the microwave..." \ ) - if (do_after(user,20*O.toolspeed, target = src)) + if (O.use_tool(src, user, 20)) user.visible_message( \ "[user] fixes the microwave.", \ "You fix the microwave." \ diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 8fc5c43bcc0..b2a47db2d30 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -801,8 +801,7 @@ 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 (O.use_tool(src, user, 20, volume=50)) if(anchored) return anchored = TRUE @@ -811,8 +810,7 @@ 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 (O.use_tool(src, user, 20, volume=50)) if(!anchored) return anchored = FALSE diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index b7673a96409..50bb56dd36b 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -57,14 +57,12 @@ switch(state) if(0) if(istype(I, /obj/item/wrench)) - playsound(loc, I.usesound, 100, 1) - if(do_after(user, 20*I.toolspeed, target = src)) + if(I.use_tool(src, user, 20, volume=50)) to_chat(user, "You wrench the frame into place.") anchored = TRUE state = 1 if(istype(I, /obj/item/crowbar)) - playsound(loc, I.usesound, 100, 1) - if(do_after(user, 20*I.toolspeed, target = src)) + if(I.use_tool(src, user, 20, volume=50)) to_chat(user, "You pry the frame apart.") deconstruct(TRUE) @@ -99,7 +97,7 @@ if(!newname) return else - name = ("bookcase ([sanitize(newname)])") + name = "bookcase ([sanitize(newname)])" else if(istype(I, /obj/item/crowbar)) if(contents.len) to_chat(user, "You need to remove the books first!") diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 573c3dab71c..66faa7cb2c4 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -138,16 +138,16 @@ density = TRUE pixel_y = -32 -/obj/item/device/gps/computer/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench) && !(flags_1&NODECONSTRUCT_1)) - playsound(src.loc, W.usesound, 50, 1) - user.visible_message("[user] disassembles the gps.", \ - "You start to disassemble the gps...", "You hear clanking and banging noises.") - if(do_after(user, 20*W.toolspeed, target = src)) - new /obj/item/device/gps(loc) - qdel(src) - return - return ..() +/obj/item/device/gps/computer/wrench_act(mob/living/user, obj/item/I) + if(flags_1 & NODECONSTRUCT_1) + return TRUE + + user.visible_message("[user] disassembles [src].", + "You start to disassemble [src]...", "You hear clanking and banging noises.") + if(I.use_tool(src, user, 20, volume=50)) + new /obj/item/device/gps(loc) + qdel(src) + return TRUE /obj/item/device/gps/computer/attack_hand(mob/user) attack_self(user) @@ -214,14 +214,15 @@ new buildstacktype(loc,buildstackamount) qdel(src) -/obj/structure/fans/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench) && !(flags_1&NODECONSTRUCT_1)) - playsound(src.loc, W.usesound, 50, 1) - user.visible_message("[user] disassembles the fan.", \ - "You start to disassemble the fan...", "You hear clanking and banging noises.") - if(do_after(user, 20*W.toolspeed, target = src)) - deconstruct() - return ..() +/obj/structure/fans/wrench_act(mob/living/user, obj/item/I) + if(flags_1 & NODECONSTRUCT_1) + return TRUE + + user.visible_message("[user] disassembles [src].", + "You start to disassemble [src]...", "You hear clanking and banging noises.") + if(I.use_tool(src, user, 20, volume=50)) + deconstruct() + return TRUE /obj/structure/fans/tiny name = "tiny fan" diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index a74f2283a33..0344708c81f 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -64,18 +64,21 @@ /mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weldingtool)) - 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(maxHealth == health) - to_chat(user, "[src] is at full integrity.") - else - if(W.remove_fuel(0, user)) - adjustBruteLoss(-10) - to_chat(user, "You repair some of the armor on [src].") + if(stat) return + if(AIStatus != AI_OFF && AIStatus != AI_IDLE) + to_chat(user, "[src] is moving around too much to repair!") + return + + if(maxHealth == health) + to_chat(user, "[src] is at full integrity.") + return + + if(I.use_tool(src, user, 0, volume=40)) + adjustBruteLoss(-10) + to_chat(user, "You repair some of the armor on [src].") + return + if(istype(I, /obj/item/device/mining_scanner) || istype(I, /obj/item/device/t_scanner/adv_mining_scanner)) to_chat(user, "You instruct [src] to drop any collected ore.") DropOre() diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 163e590ea92..56020b5407e 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -39,15 +39,15 @@ . = ..() add_overlay(stack_overlays) -/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)) - qdel(src) - else if(W.isOn()) - to_chat(user, "Not enough fuel to smelt [src].") - ..() +/obj/item/stack/ore/welder_act(mob/living/user, obj/item/I) + if(!refined_type) + return TRUE + + if(I.use_tool(src, user, 0, volume=50, amount=15)) + new refined_type(drop_location()) + use(1) + + return TRUE /obj/item/stack/ore/uranium name = "uranium ore" @@ -114,13 +114,9 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/plasma -/obj/item/stack/ore/plasma/attackby(obj/item/I, mob/user, 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/plasma/welder_act(mob/living/user, obj/item/I) + to_chat(user, "You can't hit a high enough temperature to smelt [src] properly!") + return TRUE /obj/item/stack/ore/silver @@ -423,21 +419,19 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ else to_chat(user, "You need one length of cable to attach a string to the coin!") return - - else if(istype(W, /obj/item/wirecutters)) - if(!string_attached) - ..() - return - - var/obj/item/stack/cable_coil/CC = new/obj/item/stack/cable_coil(user.loc) - CC.amount = 1 - CC.update_icon() - overlays = list() - string_attached = null - to_chat(user, "You detach the string from the coin.") else ..() +/obj/item/coin/wirecutter_act(mob/living/user, obj/item/I) + if(!string_attached) + return TRUE + + new /obj/item/stack/cable_coil(drop_location(), 1) + overlays = list() + string_attached = null + to_chat(user, "You detach the string from the coin.") + return TRUE + /obj/item/coin/attack_self(mob/user) if(cooldown < world.time) if(string_attached) //does the coin have a wire attached diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index 6c62b5a3657..a9c660e5548 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -9,23 +9,25 @@ density = TRUE pressure_resistance = 5*ONE_ATMOSPHERE -/obj/structure/ore_box/attackby(obj/item/W, mob/user, params) - if (istype(W, /obj/item/stack/ore)) - user.transferItemToLoc(W, src) - else if (istype(W, /obj/item/storage)) - var/obj/item/storage/S = W +/obj/structure/ore_box/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/ore)) + user.transferItemToLoc(I, src) + else if(istype(I, /obj/item/storage)) + var/obj/item/storage/S = I for(var/obj/item/stack/ore/O in S.contents) S.remove_from_storage(O, src) //This will move the item to this item's contents to_chat(user, "You empty the ore in [S] into \the [src].") - else if(istype(W, /obj/item/crowbar)) - playsound(src, W.usesound, 50, 1) - var/obj/item/crowbar/C = W - if(do_after(user, 50*C.toolspeed, target = src)) - user.visible_message("[user] pries \the [src] apart.", "You pry apart \the [src].", "You hear splitting wood.") - deconstruct(TRUE, user) else return ..() +/obj/structure/ore_box/crowbar_act(mob/living/user, obj/item/I) + if(I.use_tool(src, user, 50, volume=50)) + user.visible_message("[user] pries \the [src] apart.", + "You pry apart \the [src].", + "You hear splitting wood.") + deconstruct(TRUE, user) + return TRUE + /obj/structure/ore_box/examine(mob/living/user) if(Adjacent(user) && istype(user)) show_contents(user) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index e0dd4266355..496fd2c4b3b 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -353,24 +353,21 @@ /mob/living/silicon/robot/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/weldingtool) && (user.a_intent != INTENT_HARM || user == src)) user.changeNext_move(CLICK_CD_MELEE) - var/obj/item/weldingtool/WT = W if (!getBruteLoss()) to_chat(user, "[src] is already in good condition!") return - if (WT.remove_fuel(0, user)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away. - if(src == user) - to_chat(user, "You start fixing yourself...") - if(!do_after(user, 50, target = src)) - return + if (!W.tool_start_check(user, amount=0)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away. + return + if(src == user) + to_chat(user, "You start fixing yourself...") + if(!W.use_tool(src, user, 50)) + return - adjustBruteLoss(-30) - updatehealth() - add_fingerprint(user) - visible_message("[user] has fixed some of the dents on [src].") - return - else - to_chat(user, "The welder must be on for this task!") - return + adjustBruteLoss(-30) + updatehealth() + add_fingerprint(user) + visible_message("[user] has fixed some of the dents on [src].") + return else if(istype(W, /obj/item/stack/cable_coil) && wiresexposed) user.changeNext_move(CLICK_CD_MELEE) @@ -442,9 +439,8 @@ spark_system.start() return else - playsound(src, W.usesound, 50, 1) to_chat(user, "You start to unfasten [src]'s securing bolts...") - if(do_after(user, 50*W.toolspeed, target = src) && !cell) + if(W.use_tool(src, user, 50, volume=50) && !cell) user.visible_message("[user] deconstructs [src]!", "You unfasten the securing bolts, and [src] falls to pieces!") deconstruct() diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 07499b0a1fc..ac48f9e6d52 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -303,12 +303,10 @@ 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)) + + if(W.use_tool(src, user, 0, volume=40)) adjustHealth(-10) 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, TRUE, src) diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index f2333ef7133..c766c56e620 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -101,8 +101,7 @@ if(ASSEMBLY_FOURTH_STEP) if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0,user)) + if(W.use_tool(src, user, 0, volume=40)) name = "shielded frame assembly" to_chat(user, "You weld the vest to [src].") build_step++ @@ -185,7 +184,7 @@ if(istype(W, /obj/item/screwdriver)) playsound(loc, W.usesound, 100, 1) to_chat(user, "You start attaching the gun to the frame...") - if(do_after(user, 40*W.toolspeed, 0, src, 1)) + if(W.use_tool(src, user, 40)) name = "armed [name]" to_chat(user, "Taser gun attached.") build_step++ @@ -391,8 +390,7 @@ switch(build_step) if(ASSEMBLY_FIRST_STEP) if(istype(I, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = I - if(WT.remove_fuel(0, user)) + if(I.use_tool(src, user, 0, volume=40)) add_overlay("hs_hole") to_chat(user, "You weld a hole in [src]!") build_step++ @@ -414,8 +412,7 @@ build_step++ else if(istype(I, /obj/item/weldingtool)) //deconstruct - var/obj/item/weldingtool/WT = I - if(WT.remove_fuel(0, user)) + if(I.use_tool(src, user, 0, volume=40)) cut_overlay("hs_hole") to_chat(user, "You weld the hole in [src] shut!") build_step-- diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm index 1ec3d204c1d..2ee268014bc 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -80,7 +80,7 @@ if(istype(I, /obj/item/screwdriver) && stat != DEAD) if(health < maxHealth) to_chat(user, "You start to tighten loose screws on [src]...") - if(do_after(user,80*I.toolspeed,target=user)) + if(I.use_tool(src, user, 80)) adjustBruteLoss(-getBruteLoss()) visible_message("[user] tightens [src == user ? "[user.p_their()]" : "[src]'s"] loose screws!", "You tighten [src == user ? "your" : "[src]'s"] loose screws.") else @@ -91,12 +91,10 @@ else if(istype(I, /obj/item/wrench) && user != src) //They aren't required to be hacked, because laws can change in other ways (i.e. admins) user.visible_message("[user] starts resetting [src]...", \ "You press down on [src]'s factory reset control...") - playsound(src, I.usesound, 50, 1) - if(!do_after(user, 50*I.toolspeed, target = src)) - return - user.visible_message("[user] resets [src]!", \ - "You reset [src]'s directives to factory defaults!") - update_drone_hack(FALSE) + if(I.use_tool(src, user, 50, volume=50)) + user.visible_message("[user] resets [src]!", \ + "You reset [src]'s directives to factory defaults!") + update_drone_hack(FALSE) return else ..() diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 03e57c5ec6a..e1cc2f3cb6d 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -393,18 +393,15 @@ 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 + if(!W.tool_start_check(user, amount=1)) + 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)) + if(W.use_tool(src, user, 20, volume=50, amount=1)) obj_integrity = max_integrity to_chat(user, "You repair \the [src].") return diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 78dba1b3a74..f1f6fd4e354 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -42,9 +42,9 @@ /obj/item/photo/suicide_act(mob/living/carbon/user) user.visible_message("[user] is taking one last look at \the [src]! It looks like [user.p_theyre()] giving in to death!")//when you wanna look at photo of waifu one last time before you die... - if (user.gender == MALE) + if (user.gender == MALE) playsound(user, 'sound/voice/human/manlaugh1.ogg', 50, 1)//EVERY TIME I DO IT MAKES ME LAUGH - else if (user.gender == FEMALE) + else if (user.gender == FEMALE) playsound(user, 'sound/voice/human/womanlaugh.ogg', 50, 1) return OXYLOSS @@ -581,11 +581,10 @@ /obj/structure/sign/picture_frame/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/screwdriver) || istype(I, /obj/item/wrench)) to_chat(user, "You start unsecuring [name]...") - playsound(loc, I.usesound, 50, 1) - if(do_after(user, 30*I.toolspeed, target = src)) + if(I.use_tool(src, user, 30, volume=50)) playsound(loc, 'sound/items/deconstruct.ogg', 50, 1) to_chat(user, "You unsecure [name].") - deconstruct() + deconstruct() return else if(istype(I, /obj/item/photo)) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index a17497fc22c..eec58a6d047 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -385,7 +385,7 @@ 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(W.use_tool(src, user, 50)) if (has_electronics==1) has_electronics = 0 if (stat & BROKEN) @@ -418,12 +418,11 @@ user.visible_message("[user] starts prying [integration_cog] from [src]...", \ "You painstakingly start tearing [integration_cog] out of [src]'s guts...") playsound(src, W.usesound, 50, TRUE) - if(!do_after(user, 100 * W.toolspeed, target = src)) - return - user.visible_message("[user] destroys [integration_cog] in [src]!", \ - "[integration_cog] comes free with a clank and snaps in two as the machinery returns to normal!") - playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) - QDEL_NULL(integration_cog) + if(W.use_tool(src, user, 100)) + user.visible_message("[user] destroys [integration_cog] in [src]!", \ + "[integration_cog] comes free with a clank and snaps in two as the machinery returns to normal!") + playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) + QDEL_NULL(integration_cog) return else if (opened!=2) //cover isn't removed opened = 0 @@ -578,17 +577,12 @@ return 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!") + if(!W.tool_start_check(user, amount=3)) 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(W.use_tool(src, user, 50, volume=50, amount=3)) if ((stat & BROKEN) || opened==2) new /obj/item/stack/sheet/metal(loc) user.visible_message(\ diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 883df8a6c9b..289c78b7121 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -471,6 +471,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai singular_name = "cable piece" full_w_class = WEIGHT_CLASS_SMALL grind_results = list("copper" = 2) //2 copper per cable in the coil + usesound = 'sound/items/deconstruct.ogg' /obj/item/stack/cable_coil/cyborg is_cyborg = 1 diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 608a63ce8f9..2e3567588df 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -70,7 +70,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/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 1c4ce4a5c1e..9ebebe9b9ad 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -194,14 +194,11 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne return if(GRAV_NEEDS_WELDING) if(istype(I, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = I - if(WT.remove_fuel(1, user)) + if(I.use_tool(src, user, 0, amount=1)) to_chat(user, "You mend the damaged framework.") - playsound(src.loc, 'sound/items/welder2.ogg', 50, 1) + playsound(src, 'sound/items/welder2.ogg', 50, 1) broken_state++ update_icon() - else if(WT.isOn()) - to_chat(user, "You don't have enough fuel to mend the damaged framework!") return if(GRAV_NEEDS_PLASTEEL) if(istype(I, /obj/item/stack/sheet/plasteel)) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 5b6c55e0a14..749926c674f 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -109,25 +109,19 @@ switch(stage) if(1) if(istype(W, /obj/item/wrench)) - playsound(src.loc, W.usesound, 75, 1) to_chat(usr, "You begin deconstructing [src]...") - if (!do_after(usr, 30*W.toolspeed, target = src)) - return - new /obj/item/stack/sheet/metal( get_turf(src.loc), sheets_refunded ) - user.visible_message("[user.name] deconstructs [src].", \ - "You deconstruct [src].", "You hear a ratchet.") - playsound(src.loc, 'sound/items/deconstruct.ogg', 75, 1) - qdel(src) + if (W.use_tool(src, user, 30, volume=50)) + new /obj/item/stack/sheet/metal(drop_location(), sheets_refunded) + user.visible_message("[user.name] deconstructs [src].", \ + "You deconstruct [src].", "You hear a ratchet.") + playsound(src.loc, 'sound/items/deconstruct.ogg', 75, 1) + qdel(src) return if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/coil = W if(coil.use(1)) - switch(fixture_type) - if ("tube") - icon_state = "tube-construct-stage2" - if("bulb") - icon_state = "bulb-construct-stage2" + icon_state = "[fixture_type]-construct-stage2" stage = 2 user.visible_message("[user.name] adds wires to [src].", \ "You add wires to [src].") @@ -141,12 +135,8 @@ if(istype(W, /obj/item/wirecutters)) stage = 1 - switch(fixture_type) - if ("tube") - icon_state = "tube-construct-stage1" - if("bulb") - icon_state = "bulb-construct-stage1" - new /obj/item/stack/cable_coil(get_turf(loc), 1, "red") + icon_state = "[fixture_type]-construct-stage1" + new /obj/item/stack/cable_coil(drop_location(), 1, "red") user.visible_message("[user.name] removes the wiring from [src].", \ "You remove the wiring from [src].", "You hear clicking.") playsound(loc, W.usesound, 100, 1) @@ -159,7 +149,7 @@ switch(fixture_type) if("tube") newlight = new /obj/machinery/light/built(loc) - if ("bulb") + if("bulb") newlight = new /obj/machinery/light/small/built(loc) newlight.setDir(dir) transfer_fingerprints_to(newlight) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index c7a026dd831..507fdcaa665 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -207,10 +207,16 @@ return P /obj/machinery/power/emitter/can_be_unfasten_wrench(mob/user, silent) - if(state == EM_WELDED) + if(active) + if(!silent) + to_chat(user, "Turn \the [src] off first!") + return FAILED_UNFASTEN + + else if(state == EM_WELDED) if(!silent) to_chat(user, "[src] is welded to the floor!") return FAILED_UNFASTEN + return ..() /obj/machinery/power/emitter/default_unfasten_wrench(mob/user, obj/item/wrench/W, time = 20) @@ -221,45 +227,52 @@ else state = EM_UNSECURED -/obj/machinery/power/emitter/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench)) - if(active) - to_chat(user, "Turn \the [src] off first!") - return - default_unfasten_wrench(user, W, 0) - return +/obj/machinery/power/emitter/wrench_act(mob/living/user, obj/item/I) + default_unfasten_wrench(user, I, 0) + return TRUE - if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - if(active) - to_chat(user, "Turn \the [src] off first.") - return - switch(state) - if(EM_UNSECURED) - to_chat(user, "The [src.name] needs to be wrenched to the floor!") - if(EM_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*W.toolspeed, target = src) && WT.isOn()) - state = EM_WELDED - to_chat(user, "You weld \the [src] to the floor.") - connect_to_network() - if(EM_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*W.toolspeed, target = src) && WT.isOn()) - state = EM_SECURED - to_chat(user, "You cut \the [src] free from the floor.") - disconnect_from_network() - return +/obj/machinery/power/emitter/welder_act(mob/living/user, obj/item/I) + if(active) + to_chat(user, "Turn \the [src] off first.") + return TRUE - if(W.GetID()) + switch(state) + if(EM_UNSECURED) + to_chat(user, "The [src.name] needs to be wrenched to the floor!") + if(EM_SECURED) + if(!I.tool_start_check(user, amount=0)) + return TRUE + 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(I.use_tool(src, user, 20, volume=50)) + state = EM_WELDED + to_chat(user, "You weld \the [src] to the floor.") + connect_to_network() + if(EM_WELDED) + if(!I.tool_start_check(user, amount=0)) + return TRUE + 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(I.use_tool(src, user, 20, volume=50)) + state = EM_SECURED + to_chat(user, "You cut \the [src] free from the floor.") + disconnect_from_network() + + return TRUE + +/obj/machinery/power/emitter/crowbar_act(mob/living/user, obj/item/I) + default_deconstruction_crowbar(I) + return TRUE + +/obj/machinery/power/emitter/screwdriver_act(mob/living/user, obj/item/I) + default_deconstruction_screwdriver(user, "emitter_open", "emitter", I) + return TRUE + + +/obj/machinery/power/emitter/attackby(obj/item/I, mob/user, params) + if(I.GetID()) if(obj_flags & EMAGGED) to_chat(user, "The lock seems to be broken!") return @@ -273,20 +286,11 @@ to_chat(user, "Access denied.") return - if(is_wire_tool(W) && panel_open) + else if(is_wire_tool(I) && panel_open) wires.interact(user) return - if(default_deconstruction_screwdriver(user, "emitter_open", "emitter", W)) - return - - if(exchange_parts(user, W)) - return - - if(default_pry_open(W)) - return - - if(default_deconstruction_crowbar(W)) + else if(exchange_parts(user, I)) return return ..() diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index cdfbb35b348..4f39d349546 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -77,10 +77,16 @@ field_generator power level display to_chat(user, "[src] needs to be firmly secured to the floor first!") /obj/machinery/field/generator/can_be_unfasten_wrench(mob/user, silent) - if(state == FG_WELDED) + if(active) + if(!silent) + to_chat(user, "Turn \the [src] off first!") + return FAILED_UNFASTEN + + else if(state == FG_WELDED) if(!silent) to_chat(user, "[src] is welded to the floor!") return FAILED_UNFASTEN + return ..() /obj/machinery/field/generator/default_unfasten_wrench(mob/user, obj/item/wrench/W, time = 20) @@ -91,41 +97,41 @@ field_generator power level display else state = FG_UNSECURED -/obj/machinery/field/generator/attackby(obj/item/W, mob/user, params) +/obj/machinery/field/generator/wrench_act(mob/living/user, obj/item/I) + default_unfasten_wrench(user, I, 0) + return TRUE + +/obj/machinery/field/generator/welder_act(mob/living/user, obj/item/I) if(active) to_chat(user, "[src] needs to be off!") - return - else if(istype(W, /obj/item/wrench)) - default_unfasten_wrench(user, W, 0) + return TRUE - else if(istype(W, /obj/item/weldingtool)) - var/obj/item/weldingtool/WT = W - switch(state) - if(FG_UNSECURED) - to_chat(user, "[src] needs to be wrenched to the floor!") + switch(state) + if(FG_UNSECURED) + to_chat(user, "[src] 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] starts to weld [src] to the floor.", \ - "You start to weld \the [src] to the floor...", \ - "You hear welding.") - if(do_after(user,20*W.toolspeed, target = src) && state == FG_SECURED && WT.isOn()) - state = FG_WELDED - to_chat(user, "You weld the field generator to the floor.") + if(FG_SECURED) + if(!I.tool_start_check(user, amount=0)) + return TRUE + user.visible_message("[user] starts to weld [src] to the floor.", \ + "You start to weld \the [src] to the floor...", \ + "You hear welding.") + if(I.use_tool(src, user, 20, volume=50) && state == FG_SECURED) + 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] starts to cut [src] free from the floor.", \ - "You start to cut \the [src] free from the floor...", \ - "You hear welding.") - if(do_after(user,20*W.toolspeed, target = src) && state == FG_WELDED && WT.isOn()) - state = FG_SECURED - to_chat(user, "You cut \the [src] free from the floor.") + if(FG_WELDED) + if(!I.tool_start_check(user, amount=0)) + return TRUE + user.visible_message("[user] starts to cut [src] free from the floor.", \ + "You start to cut \the [src] free from the floor...", \ + "You hear welding.") + if(I.use_tool(src, user, 20, volume=50) && state == FG_WELDED) + state = FG_SECURED + to_chat(user, "You cut \the [src] free from the floor.") + + return TRUE - else - return ..() /obj/machinery/field/generator/attack_animal(mob/living/simple_animal/M) if(M.environment_smash & ENVIRONMENT_SMASH_RWALLS && active == FG_OFFLINE && state != FG_UNSECURED) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 5701ae0ed60..448e00de6c9 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -56,16 +56,14 @@ obj_integrity = max_integrity update_icon() -/obj/machinery/power/solar/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/crowbar)) - 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, 'sound/items/deconstruct.ogg', 50, 1) - user.visible_message("[user] takes the glass off the solar panel.", "You take the glass off the solar panel.") - deconstruct(TRUE) - else - return ..() +/obj/machinery/power/solar/crowbar_act(mob/user, obj/item/I) + playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + user.visible_message("[user] begins to take the glass off [src].", "You begin to take the glass off [src]...") + if(I.use_tool(src, user, 50)) + playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) + user.visible_message("[user] takes the glass off [src].", "You take the glass off [src].") + deconstruct(TRUE) + return TRUE /obj/machinery/power/solar/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) @@ -407,8 +405,7 @@ /obj/machinery/power/solar_control/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/screwdriver)) - playsound(src.loc, I.usesound, 50, 1) - if(do_after(user, 20*I.toolspeed, target = src)) + if(I.use_tool(src, user, 20, volume=50)) if (src.stat & BROKEN) to_chat(user, "The broken glass falls out.") var/obj/structure/frame/computer/A = new /obj/structure/frame/computer( src.loc ) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 20b5480da88..efb34739aaf 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -538,19 +538,11 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard) if(!istype(W) || (W.flags_1 & ABSTRACT_1) || !istype(user)) return if(istype(W, /obj/item/scalpel/supermatter)) - var/obj/item/scalpel/supermatter/scalpel = W - playsound(src, W.usesound, 100, 1) - to_chat(user, "You carefully begin to scrape [src] with [W]...") - if(do_after(user, 60 * W.toolspeed, TRUE, src)) - if (scalpel.usesLeft) - to_chat(user, "You extract a sliver from [src]. [src] begins to react violently!") - new /obj/item/nuke_core/supermatter_sliver(drop_location()) - matter_power += 200 - scalpel.usesLeft-- - if (!scalpel.usesLeft) - to_chat(user, "A tiny piece of [W] falls off, rendering it useless!") - else - to_chat(user, "You fail to extract a sliver from [src]. [W] isn't sharp enough anymore!") + to_chat(user, "You carefully begin to scrape \the [src] with \the [W]...") + if(W.use_tool(src, user, 60, volume=100)) + to_chat(user, "You extract a sliver from \the [src]. \The [src] begins to react violently!") + new /obj/item/nuke_core/supermatter_sliver(drop_location()) + matter_power += 200 else if(user.dropItemToGround(W)) user.visible_message("As [user] touches \the [src] with \a [W], silence fills the room...",\ "You touch \the [src] with \the [W], and everything suddenly goes silent.\n\The [W] flashes into dust as you flinch away from \the [src].",\ diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index b6d086f739f..837a2b15c75 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -48,26 +48,31 @@ . = 1 -/obj/machinery/power/terminal/proc/dismantle(mob/living/user, obj/item/W) +/obj/machinery/power/terminal/proc/dismantle(mob/living/user, obj/item/I) if(isturf(loc)) var/turf/T = loc if(T.intact) to_chat(user, "You must first expose the power terminal!") return - if(!master || master.can_terminal_dismantle()) - user.visible_message("[user.name] dismantles the power terminal from [master].", \ - "You begin to cut the cables...") + if(master && !master.can_terminal_dismantle()) + return - playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) - if(do_after(user, 50*W.toolspeed, target = src)) - if(!master || master.can_terminal_dismantle()) - if(prob(50) && electrocute_mob(user, powernet, src, 1, TRUE)) - do_sparks(5, TRUE, master) - return - new /obj/item/stack/cable_coil(loc, 10) - to_chat(user, "You cut the cables and dismantle the power terminal.") - qdel(src) + user.visible_message("[user.name] dismantles the power terminal from [master].", + "You begin to cut the cables...") + + playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) + if(I.use_tool(src, user, 50)) + if(master && !master.can_terminal_dismantle()) + return + + if(prob(50) && electrocute_mob(user, powernet, src, 1, TRUE)) + do_sparks(5, TRUE, master) + return + + new /obj/item/stack/cable_coil(drop_location(), 10) + to_chat(user, "You cut the cables and dismantle the power terminal.") + qdel(src) /obj/machinery/power/terminal/attackby(obj/item/W, mob/living/user, params) diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index 3163a72313e..c999554d87d 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -60,17 +60,14 @@ if(powernet && (powernet == control.powernet)) //update if we're still in the same powernet control.currentdir = angle -/obj/machinery/power/tracker/attackby(obj/item/W, mob/user, params) - - if(istype(W, /obj/item/crowbar)) - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - user.visible_message("[user] begins to take the glass off the solar tracker.", "You begin to take the glass off the solar tracker...") - if(do_after(user, 50*W.toolspeed, target = src)) - playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) - user.visible_message("[user] takes the glass off the tracker.", "You take the glass off the tracker.") - deconstruct(TRUE) - else - return ..() +/obj/machinery/power/tracker/crowbar_act(mob/user, obj/item/I) + playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + user.visible_message("[user] begins to take the glass off [src].", "You begin to take the glass off [src]...") + if(I.use_tool(src, user, 50)) + playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) + user.visible_message("[user] takes the glass off [src].", "You take the glass off [src].") + deconstruct(TRUE) + return TRUE /obj/machinery/power/tracker/obj_break(damage_flag) if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1)) diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 692d9b47330..14e529ba233 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -107,35 +107,34 @@ return 0 ..() -/obj/item/gun/ballistic/revolver/detective/attackby(obj/item/A, mob/user, params) - ..() - if(istype(A, /obj/item/screwdriver)) - if(magazine.caliber == "38") - to_chat(user, "You begin to reinforce the barrel of [src]...") +/obj/item/gun/ballistic/revolver/detective/screwdriver_act(mob/living/user, obj/item/I) + if(magazine.caliber == "38") + to_chat(user, "You begin to reinforce the barrel of [src]...") + if(magazine.ammo_count()) + afterattack(user, user) //you know the drill + user.visible_message("[src] goes off!", "[src] goes off in your face!") + return TRUE + if(I.use_tool(src, user, 30)) if(magazine.ammo_count()) - afterattack(user, user) //you know the drill - user.visible_message("[src] goes off!", "[src] goes off in your face!") - return - if(do_after(user, 30*A.toolspeed, target = src)) - if(magazine.ammo_count()) - to_chat(user, "You can't modify it!") - return - magazine.caliber = "357" - desc = "The barrel and chamber assembly seems to have been modified." - to_chat(user, "You reinforce the barrel of [src]. Now it will fire .357 rounds.") - else - to_chat(user, "You begin to revert the modifications to [src]...") + to_chat(user, "You can't modify it!") + return TRUE + magazine.caliber = "357" + desc = "The barrel and chamber assembly seems to have been modified." + to_chat(user, "You reinforce the barrel of [src]. Now it will fire .357 rounds.") + else + to_chat(user, "You begin to revert the modifications to [src]...") + if(magazine.ammo_count()) + afterattack(user, user) //and again + user.visible_message("[src] goes off!", "[src] goes off in your face!") + return TRUE + if(I.use_tool(src, user, 30)) if(magazine.ammo_count()) - afterattack(user, user) //and again - user.visible_message("[src] goes off!", "[src] goes off in your face!") + to_chat(user, "You can't modify it!") return - if(do_after(user, 30*A.toolspeed, target = src)) - if(magazine.ammo_count()) - to_chat(user, "You can't modify it!") - return - magazine.caliber = "38" - desc = initial(desc) - to_chat(user, "You remove the modifications on [src]. Now it will fire .38 rounds.") + magazine.caliber = "38" + desc = initial(desc) + to_chat(user, "You remove the modifications on [src]. Now it will fire .38 rounds.") + return TRUE /obj/item/gun/ballistic/revolver/mateba diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index b79ed02d869..19ca04b6bad 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -136,20 +136,29 @@ if(cell) to_chat(user, "[src] is [round(cell.percent())]% charged.") -/obj/item/gun/energy/plasmacutter/attackby(obj/item/A, mob/user) - if(istype(A, /obj/item/stack/sheet/mineral/plasma)) - var/obj/item/stack/sheet/S = A - S.use(1) +/obj/item/gun/energy/plasmacutter/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/stack/sheet/mineral/plasma)) + I.use(1) cell.give(1000) - to_chat(user, "You insert [A] in [src], recharging it.") - else if(istype(A, /obj/item/stack/ore/plasma)) - var/obj/item/stack/ore/S = A - S.use(1) + to_chat(user, "You insert [I] in [src], recharging it.") + else if(istype(I, /obj/item/stack/ore/plasma)) + I.use(1) cell.give(500) - to_chat(user, "You insert [A] in [src], recharging it.") + to_chat(user, "You insert [I] in [src], recharging it.") else ..() +// Tool procs, in case plasma cutter is used as welder +/obj/item/gun/energy/plasmacutter/tool_use_check(mob/living/user, amount) + if(cell.charge >= amount * 100) + return TRUE + + to_chat(user, "You need more charge to complete this task!") + return FALSE + +/obj/item/gun/energy/plasmacutter/use(amount) + return cell.use(amount * 100) + /obj/item/gun/energy/plasmacutter/update_icon() return diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index c8a7b9744f1..97fc35c3652 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -118,9 +118,7 @@ if(istype(I, /obj/item/crowbar)) user.visible_message("[user] struggles to pry up \the [src] with \the [I].", \ "You struggle to pry up \the [src] with \the [I].") - if(do_after(user, 40*I.toolspeed, target = src)) - if(QDELETED(src)) - return //prevent multiple decontructs + if(I.use_tool(src, user, 40, volume=40)) if(!(stat & BROKEN)) var/obj/item/conveyor_construct/C = new/obj/item/conveyor_construct(src.loc) C.id = id diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 2af691679c7..91a74762713 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -86,15 +86,14 @@ to_chat(user, "You [panel_open ? "remove":"attach"] the screws around the power connection.") return else if(istype(I, /obj/item/weldingtool) && panel_open) - var/obj/item/weldingtool/W = I - if(W.remove_fuel(0,user)) - playsound(src.loc, 'sound/items/welder2.ogg', 100, 1) - to_chat(user, "You start slicing the floorweld off \the [src]...") - if(do_after(user,20*I.toolspeed, target = src) && panel_open) - if(!W.isOn()) - return - to_chat(user, "You slice the floorweld off \the [src].") - deconstruct() + if(!I.tool_start_check(user, amount=0)) + return + + playsound(src.loc, 'sound/items/welder2.ogg', 100, 1) + to_chat(user, "You start slicing the floorweld off \the [src]...") + if(I.use_tool(src, user, 20) && panel_open) + to_chat(user, "You slice the floorweld off \the [src].") + deconstruct() return if(user.a_intent != INTENT_HARM) diff --git a/code/modules/recycling/disposal/construction.dm b/code/modules/recycling/disposal/construction.dm index 783e4da7147..020f89c5876 100644 --- a/code/modules/recycling/disposal/construction.dm +++ b/code/modules/recycling/disposal/construction.dm @@ -160,19 +160,16 @@ else if(istype(I, /obj/item/weldingtool)) if(anchored) - var/obj/item/weldingtool/W = I - if(W.remove_fuel(0,user)) - playsound(src, I.usesound, 50, 1) - to_chat(user, "You start welding the [pipename] in place...") - if(do_after(user, 8*I.toolspeed, target = src)) - if(!loc || !W.isOn()) - return - to_chat(user, "The [pipename] has been welded in place.") + if(!I.tool_start_check(user, amount=0)) + return - var/obj/O = new pipe_type(loc, src) - transfer_fingerprints_to(O) + to_chat(user, "You start welding the [pipename] in place...") + if(I.use_tool(src, user, 8, volume=50)) + to_chat(user, "The [pipename] has been welded in place.") + var/obj/O = new pipe_type(loc, src) + transfer_fingerprints_to(O) - return + return else to_chat(user, "You need to attach it to the plating first!") return diff --git a/code/modules/recycling/disposal/outlet.dm b/code/modules/recycling/disposal/outlet.dm index 0ef17179698..d7a2d5f820a 100644 --- a/code/modules/recycling/disposal/outlet.dm +++ b/code/modules/recycling/disposal/outlet.dm @@ -69,21 +69,16 @@ H.vent_gas(T) qdel(H) +/obj/structure/disposaloutlet/welder_act(mob/living/user, obj/item/I) + if(!I.tool_start_check(user, amount=0)) + return TRUE -/obj/structure/disposaloutlet/attackby(obj/item/I, mob/user, params) - add_fingerprint(user) - if(istype(I, /obj/item/weldingtool)) - var/obj/item/weldingtool/W = I - if(W.remove_fuel(0,user)) - playsound(src, 'sound/items/welder2.ogg', 100, 1) - to_chat(user, "You start slicing the floorweld off [src]...") - if(do_after(user, 20*I.toolspeed, target = src)) - if(!W.isOn()) - return - to_chat(user, "You slice the floorweld off [src].") - stored.forceMove(loc) - transfer_fingerprints_to(stored) - stored = null - qdel(src) - else - return ..() + playsound(src, 'sound/items/welder2.ogg', 100, 1) + to_chat(user, "You start slicing the floorweld off [src]...") + if(I.use_tool(src, user, 20)) + to_chat(user, "You slice the floorweld off [src].") + stored.forceMove(loc) + transfer_fingerprints_to(stored) + stored = null + qdel(src) + return TRUE diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index 02ca211cb8d..ba089f6fb20 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -141,26 +141,19 @@ return ..() -//attack by item -//weldingtool: unfasten and convert to obj/disposalconstruct -/obj/structure/disposalpipe/attackby(obj/item/I, mob/user, params) - add_fingerprint(user) - if(istype(I, /obj/item/weldingtool)) - if(!can_be_deconstructed(user)) - return +//welding tool: unfasten and convert to obj/disposalconstruct +/obj/structure/disposalpipe/welder_act(mob/living/user, obj/item/I) + if(!can_be_deconstructed(user)) + return TRUE - var/obj/item/weldingtool/W = I - if(W.remove_fuel(0, user)) - playsound(src, I.usesound, 50, 1) - to_chat(user, "You start slicing [src]...") - // check if anything changed over 2 seconds - if(do_after(user, 30*I.toolspeed, target = src)) - if(!W.isOn()) - return - deconstruct() - to_chat(user, "You slice [src].") - else - return ..() + if(!I.tool_start_check(user, amount=0)) + return TRUE + + to_chat(user, "You start slicing [src]...") + if(I.use_tool(src, user, 30, volume=50)) + deconstruct() + to_chat(user, "You slice [src].") + return TRUE //checks if something is blocking the deconstruction (e.g. trunk with a bin still linked to it) /obj/structure/disposalpipe/proc/can_be_deconstructed() diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index 66ae84f559b..6d1b1b0d2ab 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -12,10 +12,9 @@ /obj/vehicle/ridden/scooter/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/wrench)) to_chat(user, "You begin to remove the handlebars...") - playsound(get_turf(user), 'sound/items/ratchet.ogg', 50, 1) - if(do_after(user, 40*I.toolspeed, target = src)) - var/obj/vehicle/ridden/scooter/skateboard/S = new(loc) - new /obj/item/stack/rods(get_turf(src),2) + if(I.use_tool(src, user, 40, volume=50)) + var/obj/vehicle/ridden/scooter/skateboard/S = new(drop_location()) + new /obj/item/stack/rods(drop_location(), 2) to_chat(user, "You remove the handlebars from [src].") if(has_buckled_mobs()) var/mob/living/carbon/H = buckled_mobs[1]