diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index b1d21095a10..ed851d21bbd 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -53,20 +53,23 @@ GLOBAL_LIST_EMPTY(announcement_systems) GLOB.announcement_systems -= src //"OH GOD WHY ARE THERE 100,000 LISTED ANNOUNCEMENT SYSTEMS?!!" return ..() -/obj/machinery/announcement_system/attackby(obj/item/P, mob/user, params) - if(P.tool_behaviour == TOOL_SCREWDRIVER) - P.play_tool_sound(src) - panel_open = !panel_open - to_chat(user, span_notice("You [panel_open ? "open" : "close"] the maintenance hatch of [src].")) - update_appearance() - else if(default_deconstruction_crowbar(P)) - return - else if(P.tool_behaviour == TOOL_MULTITOOL && panel_open && (machine_stat & BROKEN)) - to_chat(user, span_notice("You reset [src]'s firmware.")) - set_machine_stat(machine_stat & ~BROKEN) - update_appearance() - else - return ..() +/obj/machinery/announcement_system/screwdriver_act(mob/living/user, obj/item/tool) + tool.play_tool_sound(src) + panel_open = !panel_open + to_chat(user, span_notice("You [panel_open ? "open" : "close"] the maintenance hatch of [src].")) + update_appearance() + return TRUE + +/obj/machinery/announcement_system/crowbar_act(mob/living/user, obj/item/tool) + if(default_deconstruction_crowbar(tool)) + return TRUE + +/obj/machinery/announcement_system/multitool_act(mob/living/user, obj/item/tool) + if(!panel_open || !(machine_stat & BROKEN)) + return FALSE + to_chat(user, span_notice("You reset [src]'s firmware.")) + set_machine_stat(machine_stat & ~BROKEN) + update_appearance() /obj/machinery/announcement_system/proc/CompileText(str, user, rank) //replaces user-given variables with actual thingies. str = replacetext(str, "%PERSON", "[user]") diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index d3457721875..3e77e6c0123 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -59,16 +59,17 @@ if(board) . += "button-board" -/obj/machinery/button/attackby(obj/item/W, mob/living/user, params) - if(W.tool_behaviour == TOOL_SCREWDRIVER) - if(panel_open || allowed(user)) - default_deconstruction_screwdriver(user, "button-open", "[skin]",W) - update_appearance() - else - to_chat(user, span_alert("Maintenance Access Denied.")) - flick("[skin]-denied", src) - return +/obj/machinery/button/screwdriver_act(mob/living/user, obj/item/tool) + if(panel_open || allowed(user)) + default_deconstruction_screwdriver(user, "button-open", "[skin]", tool) + update_appearance() + else + to_chat(user, span_alert("Maintenance Access Denied.")) + flick("[skin]-denied", src) + return TRUE + +/obj/machinery/button/attackby(obj/item/W, mob/living/user, params) if(panel_open) if(!device && istype(W, /obj/item/assembly)) if(!user.transferItemToLoc(W, src)) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 1e331e82566..0af334d4bf9 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -762,6 +762,30 @@ else updateDialog() +/obj/machinery/door/airlock/screwdriver_act(mob/living/user, obj/item/tool) + . = TRUE + if(panel_open && detonated) + to_chat(user, span_warning("[src] has no maintenance panel!")) + return + panel_open = !panel_open + to_chat(user, span_notice("You [panel_open ? "open":"close"] the maintenance panel of the airlock.")) + tool.play_tool_sound(src) + update_appearance() + +/obj/machinery/door/airlock/wirecutter_act(mob/living/user, obj/item/tool) + if(note) + if(user.CanReach(src)) + user.visible_message(span_notice("[user] cuts down [note] from [src]."), span_notice("You remove [note] from [src].")) + else //telekinesis + visible_message(span_notice("[tool] cuts down [note] from [src].")) + tool.play_tool_sound(src) + note.forceMove(tool.drop_location()) + note = null + update_appearance() + return TRUE + else + return FALSE + /obj/machinery/door/airlock/attackby(obj/item/C, mob/user, params) if(!issilicon(user) && !isAdminGhostAI(user)) @@ -885,23 +909,6 @@ span_notice("You cut through \the [src]'s outer grille.")) security_level = AIRLOCK_SECURITY_PLASTEEL_O return - if(C.tool_behaviour == TOOL_SCREWDRIVER) - if(panel_open && detonated) - to_chat(user, span_warning("[src] has no maintenance panel!")) - return - panel_open = !panel_open - to_chat(user, span_notice("You [panel_open ? "open":"close"] the maintenance panel of the airlock.")) - C.play_tool_sound(src) - update_appearance() - else if((C.tool_behaviour == TOOL_WIRECUTTER) && note) - if(user.CanReach(src)) - user.visible_message(span_notice("[user] cuts down [note] from [src]."), span_notice("You remove [note] from [src].")) - else //telekinesis - visible_message(span_notice("[C] cuts down [note] from [src].")) - C.play_tool_sound(src) - note.forceMove(C.drop_location()) - note = null - update_appearance() else if(is_wire_tool(C) && panel_open) attempt_wire_interaction(user) return diff --git a/code/game/machinery/electrolyzer.dm b/code/game/machinery/electrolyzer.dm index c8660d72cb0..5c821e519fd 100644 --- a/code/game/machinery/electrolyzer.dm +++ b/code/game/machinery/electrolyzer.dm @@ -117,6 +117,16 @@ efficiency = (cap + 1) * 0.5 //used in the amount of charge in power cell uses +/obj/machinery/electrolyzer/screwdriver_act(mob/living/user, obj/item/tool) + tool.play_tool_sound(src, 50) + panel_open = !panel_open + user.visible_message(span_notice("\The [user] [panel_open ? "opens" : "closes"] the hatch on \the [src]."), span_notice("You [panel_open ? "open" : "close"] the hatch on \the [src].")) + update_appearance() + return TRUE + +/obj/machinery/electrolyzer/crowbar_act(mob/living/user, obj/item/tool) + return default_deconstruction_crowbar(tool) + /obj/machinery/electrolyzer/attackby(obj/item/I, mob/user, params) add_fingerprint(user) if(default_unfasten_wrench(user, I)) @@ -136,13 +146,6 @@ user.visible_message(span_notice("\The [user] inserts a power cell into \the [src]."), span_notice("You insert the power cell into \the [src].")) SStgui.update_uis(src) - return - if(I.tool_behaviour == TOOL_SCREWDRIVER) - panel_open = !panel_open - user.visible_message(span_notice("\The [user] [panel_open ? "opens" : "closes"] the hatch on \the [src]."), span_notice("You [panel_open ? "open" : "close"] the hatch on \the [src].")) - update_appearance() - return - if(default_deconstruction_crowbar(I)) return return ..() diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 7fef56fea05..01612da120d 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -96,17 +96,16 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/sparker, 26) return FALSE return ..() -/obj/machinery/sparker/attackby(obj/item/W, mob/user, params) - if (W.tool_behaviour == TOOL_SCREWDRIVER) - add_fingerprint(user) - disable = !disable - if (disable) - user.visible_message(span_notice("[user] disables \the [src]!"), span_notice("You disable the connection to \the [src].")) - if (!disable) - user.visible_message(span_notice("[user] reconnects \the [src]!"), span_notice("You fix the connection to \the [src].")) - update_appearance() - else - return ..() +/obj/machinery/sparker/screwdriver_act(mob/living/user, obj/item/tool) + add_fingerprint(user) + tool.play_tool_sound(src, 50) + disable = !disable + if (disable) + user.visible_message(span_notice("[user] disables \the [src]!"), span_notice("You disable the connection to \the [src].")) + if (!disable) + user.visible_message(span_notice("[user] reconnects \the [src]!"), span_notice("You fix the connection to \the [src].")) + update_appearance() + return TRUE /obj/machinery/sparker/attack_ai() if (anchored) diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index e04ef94505b..7a1fe630df0 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -96,18 +96,19 @@ icon_state = "[base_icon_state][open]" return ..() +/obj/machinery/navbeacon/screwdriver_act(mob/living/user, obj/item/tool) + add_fingerprint(user) + open = !open + user.visible_message(span_notice("[user] [open ? "opens" : "closes"] the beacon's cover."), span_notice("You [open ? "open" : "close"] the beacon's cover.")) + update_appearance() + tool.play_tool_sound(src, 50) + return TRUE + /obj/machinery/navbeacon/attackby(obj/item/I, mob/user, params) var/turf/T = loc if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) return // prevent intraction when T-scanner revealed - if(I.tool_behaviour == TOOL_SCREWDRIVER) - open = !open - - user.visible_message(span_notice("[user] [open ? "opens" : "closes"] the beacon's cover."), span_notice("You [open ? "open" : "close"] the beacon's cover.")) - - update_appearance() - else if (istype(I, /obj/item/card/id)||istype(I, /obj/item/pda)) if(open) if (src.allowed(user)) diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 59531d4a45e..e9e87c41424 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -409,28 +409,32 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/requests_console, 30) Radio.set_frequency(radio_freq) Radio.talk_into(src, "[alert]: [message]", radio_freq) -/obj/machinery/requests_console/attackby(obj/item/O, mob/user, params) - if(O.tool_behaviour == TOOL_CROWBAR) - if(open) - to_chat(user, span_notice("You close the maintenance panel.")) - open = FALSE - else - to_chat(user, span_notice("You open the maintenance panel.")) - open = TRUE - update_appearance() - return - if(O.tool_behaviour == TOOL_SCREWDRIVER) - if(open) - hackState = !hackState - if(hackState) - to_chat(user, span_notice("You modify the wiring.")) - else - to_chat(user, span_notice("You reset the wiring.")) - update_appearance() - else - to_chat(user, span_warning("You must open the maintenance panel first!")) - return +/obj/machinery/requests_console/crowbar_act(mob/living/user, obj/item/tool) + tool.play_tool_sound(src, 50) + if(open) + to_chat(user, span_notice("You close the maintenance panel.")) + open = FALSE + else + to_chat(user, span_notice("You open the maintenance panel.")) + open = TRUE + update_appearance() + return TRUE + +/obj/machinery/requests_console/screwdriver_act(mob/living/user, obj/item/tool) + if(open) + hackState = !hackState + if(hackState) + to_chat(user, span_notice("You modify the wiring.")) + else + to_chat(user, span_notice("You reset the wiring.")) + update_appearance() + tool.play_tool_sound(src, 50) + else + to_chat(user, span_warning("You must open the maintenance panel first!")) + return TRUE + +/obj/machinery/requests_console/attackby(obj/item/O, mob/user, params) var/obj/item/card/id/ID = O.GetID() if(ID) if(screen == REQ_SCREEN_AUTHENTICATE) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 07b0de29550..3cc6d0e24ac 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -184,15 +184,35 @@ to_chat(user, span_warning("The device must first be secured to the floor!")) return +/obj/machinery/shieldgen/screwdriver_act(mob/living/user, obj/item/tool) + tool.play_tool_sound(src, 100) + panel_open = !panel_open + if(panel_open) + to_chat(user, span_notice("You open the panel and expose the wiring.")) + else + to_chat(user, span_notice("You close the panel.")) + return TRUE + +/obj/machinery/shieldgen/wrench_act(mob/living/user, obj/item/tool) + . = TRUE + if(locked) + to_chat(user, span_warning("The bolts are covered! Unlocking this would retract the covers.")) + return + if(!anchored && !isinspace()) + tool.play_tool_sound(src, 100) + to_chat(user, span_notice("You secure \the [src] to the floor!")) + set_anchored(TRUE) + else if(anchored) + tool.play_tool_sound(src, 100) + to_chat(user, span_notice("You unsecure \the [src] from the floor!")) + if(active) + to_chat(user, span_notice("\The [src] shuts off!")) + shields_down() + set_anchored(FALSE) + + /obj/machinery/shieldgen/attackby(obj/item/W, mob/user, params) - if(W.tool_behaviour == TOOL_SCREWDRIVER) - W.play_tool_sound(src, 100) - panel_open = !panel_open - if(panel_open) - to_chat(user, span_notice("You open the panel and expose the wiring.")) - else - to_chat(user, span_notice("You close the panel.")) - else if(istype(W, /obj/item/stack/cable_coil) && (machine_stat & BROKEN) && panel_open) + if(istype(W, /obj/item/stack/cable_coil) && (machine_stat & BROKEN) && panel_open) var/obj/item/stack/cable_coil/coil = W if (coil.get_amount() < 1) to_chat(user, span_warning("You need one length of cable to repair [src]!")) @@ -207,22 +227,6 @@ to_chat(user, span_notice("You repair \the [src].")) update_appearance() - else if(W.tool_behaviour == TOOL_WRENCH) - if(locked) - to_chat(user, span_warning("The bolts are covered! Unlocking this would retract the covers.")) - return - if(!anchored && !isinspace()) - W.play_tool_sound(src, 100) - to_chat(user, span_notice("You secure \the [src] to the floor!")) - set_anchored(TRUE) - else if(anchored) - W.play_tool_sound(src, 100) - to_chat(user, span_notice("You unsecure \the [src] from the floor!")) - if(active) - to_chat(user, span_notice("\The [src] shuts off!")) - shields_down() - set_anchored(FALSE) - else if(W.GetID()) if(allowed(user) && !(obj_flags & EMAGGED)) locked = !locked diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index a8e229495b9..1d9386935cf 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -57,30 +57,32 @@ else to_chat(user, span_warning("You need to screw \the [src] to the floor first!")) -/obj/machinery/power/singularity_beacon/attackby(obj/item/W, mob/user, params) - if(W.tool_behaviour == TOOL_WRENCH) - if(active) - to_chat(user, span_warning("You need to deactivate \the [src] first!")) - return +/obj/machinery/power/singularity_beacon/wrench_act(mob/living/user, obj/item/tool) + . = TRUE + if(active) + to_chat(user, span_warning("You need to deactivate \the [src] first!")) + return - if(anchored) - set_anchored(FALSE) - to_chat(user, span_notice("You unbolt \the [src] from the floor and detach it from the cable.")) - disconnect_from_network() + if(anchored) + tool.play_tool_sound(src, 50) + set_anchored(FALSE) + to_chat(user, span_notice("You unbolt \the [src] from the floor and detach it from the cable.")) + disconnect_from_network() + return + else + if(!connect_to_network()) + to_chat(user, span_warning("\The [src] must be placed over an exposed, powered cable node!")) return - else - if(!connect_to_network()) - to_chat(user, span_warning("\The [src] must be placed over an exposed, powered cable node!")) - return - set_anchored(TRUE) - to_chat(user, span_notice("You bolt \the [src] to the floor and attach it to the cable.")) - return - else if(W.tool_behaviour == TOOL_SCREWDRIVER) - user.visible_message( \ + tool.play_tool_sound(src, 50) + set_anchored(TRUE) + to_chat(user, span_notice("You bolt \the [src] to the floor and attach it to the cable.")) + return + +/obj/machinery/power/singularity_beacon/screwdriver_act(mob/living/user, obj/item/tool) + user.visible_message( \ "[user] messes with \the [src] for a bit.", \ span_notice("You can't fit the screwdriver into \the [src]'s bolts! Try using a wrench.")) - else - return ..() + return TRUE /obj/machinery/power/singularity_beacon/Destroy() if(active) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index ab6f55205a4..4c250e2ec67 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -110,45 +110,70 @@ else . = timer_set -/obj/machinery/syndicatebomb/attackby(obj/item/I, mob/user, params) - if(I.tool_behaviour == TOOL_WRENCH && can_unanchor) - if(!anchored) - if(!isturf(loc) || isspaceturf(loc)) - to_chat(user, span_notice("The bomb must be placed on solid ground to attach it.")) - else - to_chat(user, span_notice("You firmly wrench the bomb to the floor.")) - I.play_tool_sound(src) - set_anchored(TRUE) - if(active) - to_chat(user, span_notice("The bolts lock in place.")) +/obj/machinery/syndicatebomb/wrench_act(mob/living/user, obj/item/tool) + if(!can_unanchor) + return FALSE + if(!anchored) + if(!isturf(loc) || isspaceturf(loc)) + to_chat(user, span_notice("The bomb must be placed on solid ground to attach it.")) else - if(!active) - to_chat(user, span_notice("You wrench the bomb from the floor.")) - I.play_tool_sound(src) - set_anchored(FALSE) - else - to_chat(user, span_warning("The bolts are locked down!")) + to_chat(user, span_notice("You firmly wrench the bomb to the floor.")) + tool.play_tool_sound(src) + set_anchored(TRUE) + if(active) + to_chat(user, span_notice("The bolts lock in place.")) + else + if(!active) + to_chat(user, span_notice("You wrench the bomb from the floor.")) + tool.play_tool_sound(src) + set_anchored(FALSE) + else + to_chat(user, span_warning("The bolts are locked down!")) - else if(I.tool_behaviour == TOOL_SCREWDRIVER) - open_panel = !open_panel - update_appearance() - to_chat(user, span_notice("You [open_panel ? "open" : "close"] the wire panel.")) + return TRUE - else if(is_wire_tool(I) && open_panel) +/obj/machinery/syndicatebomb/screwdriver_act(mob/living/user, obj/item/tool) + tool.play_tool_sound(src, 50) + open_panel = !open_panel + update_appearance() + to_chat(user, span_notice("You [open_panel ? "open" : "close"] the wire panel.")) + return TRUE + +/obj/machinery/syndicatebomb/crowbar_act(mob/living/user, obj/item/tool) + . = TRUE + if(open_panel && wires.is_all_cut()) + if(payload) + tool.play_tool_sound(src, 25) // sshhh + to_chat(user, span_notice("You carefully pry out [payload].")) + payload.forceMove(drop_location()) + payload = null + else + to_chat(user, span_warning("There isn't anything in here to remove!")) + else if (open_panel) + to_chat(user, span_warning("The wires connecting the shell to the explosives are holding it down!")) + else + to_chat(user, span_warning("The cover is screwed on, it won't pry off!")) + +/obj/machinery/syndicatebomb/welder_act(mob/living/user, obj/item/tool) + if(payload || !wires.is_all_cut() || !open_panel) + return FALSE + + if(!tool.tool_start_check(user, amount=5)) //uses up 5 fuel + return TRUE + + to_chat(user, span_notice("You start to cut [src] apart...")) + if(tool.use_tool(src, user, 20, volume=50, amount=5)) // uses up 5 fuel + to_chat(user, span_notice("You cut [src] apart.")) + new /obj/item/stack/sheet/plasteel(loc, 5) + qdel(src) + return TRUE + + +/obj/machinery/syndicatebomb/attackby(obj/item/I, mob/user, params) + + if(is_wire_tool(I) && open_panel) wires.interact(user) - else if(I.tool_behaviour == TOOL_CROWBAR) - if(open_panel && wires.is_all_cut()) - if(payload) - to_chat(user, span_notice("You carefully pry out [payload].")) - payload.forceMove(drop_location()) - payload = null - else - to_chat(user, span_warning("There isn't anything in here to remove!")) - else if (open_panel) - to_chat(user, span_warning("The wires connecting the shell to the explosives are holding it down!")) - else - to_chat(user, span_warning("The cover is screwed on, it won't pry off!")) else if(istype(I, /obj/item/bombcore)) if(!payload) if(!user.transferItemToLoc(I, src)) @@ -157,22 +182,10 @@ to_chat(user, span_notice("You place [payload] into [src].")) else to_chat(user, span_warning("[payload] is already loaded into [src]! You'll have to remove it first.")) - else if(I.tool_behaviour == TOOL_WELDER) - if(payload || !wires.is_all_cut() || !open_panel) - return - - if(!I.tool_start_check(user, amount=5)) //uses up 5 fuel - return - - to_chat(user, span_notice("You start to cut [src] apart...")) - if(I.use_tool(src, user, 20, volume=50, amount=5)) //uses up 5 fuel - to_chat(user, span_notice("You cut [src] apart.")) - new /obj/item/stack/sheet/plasteel( loc, 5) - qdel(src) else var/old_integ = atom_integrity . = ..() - if((old_integ > atom_integrity) && active && (payload in src)) + if((old_integ > atom_integrity) && active && (payload in src)) to_chat(user, span_warning("That seems like a really bad idea...")) /obj/machinery/syndicatebomb/interact(mob/user) diff --git a/code/game/machinery/telecomms/computers/message.dm b/code/game/machinery/telecomms/computers/message.dm index c73b3bbeb29..96ce880a8ae 100644 --- a/code/game/machinery/telecomms/computers/message.dm +++ b/code/game/machinery/telecomms/computers/message.dm @@ -39,13 +39,12 @@ var/customjob = "Admin" var/custommessage = "This is a test, please ignore." - -/obj/machinery/computer/message_monitor/attackby(obj/item/O, mob/living/user, params) - if(O.tool_behaviour == TOOL_SCREWDRIVER && (obj_flags & EMAGGED)) +/obj/machinery/computer/message_monitor/screwdriver_act(mob/living/user, obj/item/I) + if(obj_flags & EMAGGED) //Stops people from just unscrewing the monitor and putting it back to get the console working again. to_chat(user, span_warning("It is too hot to mess with!")) - else - return ..() + return TRUE + return ..() /obj/machinery/computer/message_monitor/emag_act(mob/user) if(obj_flags & EMAGGED) diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm index 3ef31145916..53aec1775d2 100644 --- a/code/game/objects/items/RCL.dm +++ b/code/game/objects/items/RCL.dm @@ -45,6 +45,40 @@ active = FALSE +/obj/item/rcl/screwdriver_act(mob/living/user, obj/item/tool) + if(!loaded) + return FALSE + . = TRUE + if(ghetto && prob(10)) //Is it a ghetto RCL? If so, give it a 10% chance to fall apart + to_chat(user, span_warning("You attempt to loosen the securing screws on the side, but it falls apart!")) + while(loaded.amount > 30) //There are only two kinds of situations: "nodiff" (60,90), or "diff" (31-59, 61-89) + var/diff = loaded.amount % 30 + if(diff) + loaded.use(diff) + new /obj/item/stack/pipe_cleaner_coil(get_turf(user), diff) + else + loaded.use(30) + new /obj/item/stack/pipe_cleaner_coil(get_turf(user), 30) + qdel(src) + return + + tool.play_tool_sound(src) + to_chat(user, span_notice("You loosen the securing screws on the side, allowing you to lower the guiding edge and retrieve the wires.")) + while(loaded.amount > 30) //There are only two kinds of situations: "nodiff" (60,90), or "diff" (31-59, 61-89) + var/diff = loaded.amount % 30 + if(diff) + loaded.use(diff) + new /obj/item/stack/pipe_cleaner_coil(get_turf(user), diff) + else + loaded.use(30) + new /obj/item/stack/pipe_cleaner_coil(get_turf(user), 30) + loaded.max_amount = initial(loaded.max_amount) + if(!user.put_in_hands(loaded)) + loaded.forceMove(get_turf(user)) + + loaded = null + update_appearance() + /obj/item/rcl/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/stack/pipe_cleaner_coil)) var/obj/item/stack/pipe_cleaner_coil/C = W @@ -66,37 +100,6 @@ return update_appearance() to_chat(user, span_notice("You add the pipe cleaners to [src]. It now contains [loaded.amount].")) - else if(W.tool_behaviour == TOOL_SCREWDRIVER) - if(!loaded) - return - if(ghetto && prob(10)) //Is it a ghetto RCL? If so, give it a 10% chance to fall apart - to_chat(user, span_warning("You attempt to loosen the securing screws on the side, but it falls apart!")) - while(loaded.amount > 30) //There are only two kinds of situations: "nodiff" (60,90), or "diff" (31-59, 61-89) - var/diff = loaded.amount % 30 - if(diff) - loaded.use(diff) - new /obj/item/stack/pipe_cleaner_coil(get_turf(user), diff) - else - loaded.use(30) - new /obj/item/stack/pipe_cleaner_coil(get_turf(user), 30) - qdel(src) - return - - to_chat(user, span_notice("You loosen the securing screws on the side, allowing you to lower the guiding edge and retrieve the wires.")) - while(loaded.amount > 30) //There are only two kinds of situations: "nodiff" (60,90), or "diff" (31-59, 61-89) - var/diff = loaded.amount % 30 - if(diff) - loaded.use(diff) - new /obj/item/stack/pipe_cleaner_coil(get_turf(user), diff) - else - loaded.use(30) - new /obj/item/stack/pipe_cleaner_coil(get_turf(user), 30) - loaded.max_amount = initial(loaded.max_amount) - if(!user.put_in_hands(loaded)) - loaded.forceMove(get_turf(user)) - - loaded = null - update_appearance() else ..() diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 806eac80826..c9a63559ae6 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -926,42 +926,39 @@ CIGARETTE PACKETS ARE IN FANCY.DM user.visible_message(span_suicide("[user] is puffin hard on dat vape, [user.p_they()] trying to join the vape life on a whole notha plane!"))//it doesn't give you cancer, it is cancer return (TOXLOSS|OXYLOSS) -/obj/item/clothing/mask/vape/attackby(obj/item/O, mob/user, params) - if(O.tool_behaviour == TOOL_SCREWDRIVER) - if(!screw) - screw = TRUE - to_chat(user, span_notice("You open the cap on [src].")) - reagents.flags |= OPENCONTAINER - if(obj_flags & EMAGGED) - add_overlay("vapeopen_high") - else if(super) - add_overlay("vapeopen_med") - else - add_overlay("vapeopen_low") +/obj/item/clothing/mask/vape/screwdriver_act(mob/living/user, obj/item/tool) + if(!screw) + screw = TRUE + to_chat(user, span_notice("You open the cap on [src].")) + reagents.flags |= OPENCONTAINER + if(obj_flags & EMAGGED) + add_overlay("vapeopen_high") + else if(super) + add_overlay("vapeopen_med") else - screw = FALSE - to_chat(user, span_notice("You close the cap on [src].")) - reagents.flags &= ~(OPENCONTAINER) + add_overlay("vapeopen_low") + else + screw = FALSE + to_chat(user, span_notice("You close the cap on [src].")) + reagents.flags &= ~(OPENCONTAINER) + cut_overlays() + +/obj/item/clothing/mask/vape/multitool_act(mob/living/user, obj/item/tool) + . = TRUE + if(screw && !(obj_flags & EMAGGED))//also kinky + if(!super) cut_overlays() - - if(O.tool_behaviour == TOOL_MULTITOOL) - if(screw && !(obj_flags & EMAGGED))//also kinky - if(!super) - cut_overlays() - super = TRUE - to_chat(user, span_notice("You increase the voltage of [src].")) - add_overlay("vapeopen_med") - else - cut_overlays() - super = FALSE - to_chat(user, span_notice("You decrease the voltage of [src].")) - add_overlay("vapeopen_low") - - if(screw && (obj_flags & EMAGGED)) - to_chat(user, span_warning("[src] can't be modified!")) + super = TRUE + to_chat(user, span_notice("You increase the voltage of [src].")) + add_overlay("vapeopen_med") else - ..() + cut_overlays() + super = FALSE + to_chat(user, span_notice("You decrease the voltage of [src].")) + add_overlay("vapeopen_low") + if(screw && (obj_flags & EMAGGED)) + to_chat(user, span_warning("[src] can't be modified!")) /obj/item/clothing/mask/vape/emag_act(mob/user)// I WON'T REGRET WRITTING THIS, SURLY. if(screw) diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index bd275a2861e..a8a83a905d0 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -132,6 +132,15 @@ var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) +/obj/item/defibrillator/screwdriver_act(mob/living/user, obj/item/tool) + if(cell) + cell.update_appearance() + cell.forceMove(get_turf(src)) + cell = null + tool.play_tool_sound(src, 50) + to_chat(user, span_notice("You remove the cell from [src].")) + update_power() + /obj/item/defibrillator/attackby(obj/item/W, mob/user, params) if(W == paddles) toggle_paddles() @@ -148,13 +157,6 @@ cell = W to_chat(user, span_notice("You install a cell in [src].")) update_power() - else if(W.tool_behaviour == TOOL_SCREWDRIVER) - if(cell) - cell.update_appearance() - cell.forceMove(get_turf(src)) - cell = null - to_chat(user, span_notice("You remove the cell from [src].")) - update_power() else return ..() diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 27f661dc5b6..9cc01dbc0e2 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -39,6 +39,14 @@ . = ..() diode = new /obj/item/stock_parts/micro_laser/ultra +/obj/item/laser_pointer/screwdriver_act(mob/living/user, obj/item/tool) + if(diode) + tool.play_tool_sound(src) + to_chat(user, span_notice("You remove the [diode.name] from \the [src].")) + diode.forceMove(drop_location()) + diode = null + return TRUE + /obj/item/laser_pointer/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stock_parts/micro_laser)) if(!diode) @@ -48,12 +56,6 @@ to_chat(user, span_notice("You install a [diode.name] in [src].")) else to_chat(user, span_warning("[src] already has a diode installed!")) - - else if(W.tool_behaviour == TOOL_SCREWDRIVER) - if(diode) - to_chat(user, span_notice("You remove the [diode.name] from \the [src].")) - diode.forceMove(drop_location()) - diode = null else return ..() diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index eaf2e7d478b..905e7fdecab 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -74,35 +74,34 @@ update_appearance() set_light(0) -/obj/item/powersink/attackby(obj/item/I, mob/user, params) - if(I.tool_behaviour == TOOL_WRENCH) - if(mode == DISCONNECTED) - var/turf/T = loc - if(isturf(T) && T.underfloor_accessibility >= UNDERFLOOR_INTERACTABLE) - attached = locate() in T - if(!attached) - to_chat(user, span_warning("\The [src] must be placed over an exposed, powered cable node!")) - else - set_mode(CLAMPED_OFF) - user.visible_message( \ - "[user] attaches \the [src] to the cable.", \ - span_notice("You bolt \the [src] into the floor and connect it to the cable."), - span_hear("You hear some wires being connected to something.")) - else +/obj/item/powersink/wrench_act(mob/living/user, obj/item/tool) + . = TRUE + if(mode == DISCONNECTED) + var/turf/T = loc + if(isturf(T) && T.underfloor_accessibility >= UNDERFLOOR_INTERACTABLE) + attached = locate() in T + if(!attached) to_chat(user, span_warning("\The [src] must be placed over an exposed, powered cable node!")) + else + set_mode(CLAMPED_OFF) + user.visible_message( \ + "[user] attaches \the [src] to the cable.", \ + span_notice("You bolt \the [src] into the floor and connect it to the cable."), + span_hear("You hear some wires being connected to something.")) else - set_mode(DISCONNECTED) - user.visible_message( \ - "[user] detaches \the [src] from the cable.", \ - span_notice("You unbolt \the [src] from the floor and detach it from the cable."), - span_hear("You hear some wires being disconnected from something.")) - - else if(I.tool_behaviour == TOOL_SCREWDRIVER) - user.visible_message( \ - "[user] messes with \the [src] for a bit.", \ - span_notice("You can't fit the screwdriver into \the [src]'s bolts! Try using a wrench.")) + to_chat(user, span_warning("\The [src] must be placed over an exposed, powered cable node!")) else - return ..() + set_mode(DISCONNECTED) + user.visible_message( \ + "[user] detaches \the [src] from the cable.", \ + span_notice("You unbolt \the [src] from the floor and detach it from the cable."), + span_hear("You hear some wires being disconnected from something.")) + +/obj/item/powersink/screwdriver_act(mob/living/user, obj/item/tool) + user.visible_message( \ + "[user] messes with \the [src] for a bit.", \ + span_notice("You can't fit the screwdriver into \the [src]'s bolts! Try using a wrench.")) + return TRUE /obj/item/powersink/attack_paw(mob/user, list/modifiers) return diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index b12b28e0204..30b32aba9b7 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -286,29 +286,32 @@ GLOBAL_LIST_INIT(channel_tokens, list( keyslot2 = new /obj/item/encryptionkey/ai command = TRUE +/obj/item/radio/headset/screwdriver_act(mob/living/user, obj/item/tool) + user.set_machine(src) + if(keyslot || keyslot2) + for(var/ch_name in channels) + SSradio.remove_object(src, GLOB.radiochannels[ch_name]) + secure_radio_connections[ch_name] = null + + if(keyslot) + user.put_in_hands(keyslot) + keyslot = null + if(keyslot2) + user.put_in_hands(keyslot2) + keyslot2 = null + + recalculateChannels() + to_chat(user, span_notice("You pop out the encryption keys in the headset.")) + + else + to_chat(user, span_warning("This headset doesn't have any unique encryption keys! How useless...")) + tool.play_tool_sound(src, 10) + return TRUE + /obj/item/radio/headset/attackby(obj/item/W, mob/user, params) user.set_machine(src) - if(W.tool_behaviour == TOOL_SCREWDRIVER) - if(keyslot || keyslot2) - for(var/ch_name in channels) - SSradio.remove_object(src, GLOB.radiochannels[ch_name]) - secure_radio_connections[ch_name] = null - - if(keyslot) - user.put_in_hands(keyslot) - keyslot = null - if(keyslot2) - user.put_in_hands(keyslot2) - keyslot2 = null - - recalculateChannels() - to_chat(user, span_notice("You pop out the encryption keys in the headset.")) - - else - to_chat(user, span_warning("This headset doesn't have any unique encryption keys! How useless...")) - - else if(istype(W, /obj/item/encryptionkey)) + if(istype(W, /obj/item/encryptionkey)) if(keyslot && keyslot2) to_chat(user, span_warning("The headset can't hold another key!")) return diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 3df550dc64d..131562f9fd2 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -31,32 +31,31 @@ else . += span_notice("It's unscrewed from the wall, and can be detached.") -/obj/item/radio/intercom/attackby(obj/item/I, mob/living/user, params) - if(I.tool_behaviour == TOOL_SCREWDRIVER) - if(unscrewed) - user.visible_message(span_notice("[user] starts tightening [src]'s screws..."), span_notice("You start screwing in [src]...")) - if(I.use_tool(src, user, 30, volume=50)) - user.visible_message(span_notice("[user] tightens [src]'s screws!"), span_notice("You tighten [src]'s screws.")) - unscrewed = FALSE - else - user.visible_message(span_notice("[user] starts loosening [src]'s screws..."), span_notice("You start unscrewing [src]...")) - if(I.use_tool(src, user, 40, volume=50)) - user.visible_message(span_notice("[user] loosens [src]'s screws!"), span_notice("You unscrew [src], loosening it from the wall.")) - unscrewed = TRUE +/obj/item/radio/intercom/screwdriver_act(mob/living/user, obj/item/tool) + if(unscrewed) + user.visible_message(span_notice("[user] starts tightening [src]'s screws..."), span_notice("You start screwing in [src]...")) + if(tool.use_tool(src, user, 30, volume=50)) + user.visible_message(span_notice("[user] tightens [src]'s screws!"), span_notice("You tighten [src]'s screws.")) + unscrewed = FALSE + else + user.visible_message(span_notice("[user] starts loosening [src]'s screws..."), span_notice("You start unscrewing [src]...")) + if(tool.use_tool(src, user, 40, volume=50)) + user.visible_message(span_notice("[user] loosens [src]'s screws!"), span_notice("You unscrew [src], loosening it from the wall.")) + unscrewed = TRUE + return TRUE + +/obj/item/radio/intercom/wrench_act(mob/living/user, obj/item/tool) + . = TRUE + if(!unscrewed) + to_chat(user, span_warning("You need to unscrew [src] from the wall first!")) return - else if(I.tool_behaviour == TOOL_WRENCH) - if(!unscrewed) - to_chat(user, span_warning("You need to unscrew [src] from the wall first!")) - return - user.visible_message(span_notice("[user] starts unsecuring [src]..."), span_notice("You start unsecuring [src]...")) - I.play_tool_sound(src) - if(I.use_tool(src, user, 80)) - user.visible_message(span_notice("[user] unsecures [src]!"), span_notice("You detach [src] from the wall.")) - playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) - new/obj/item/wallframe/intercom(get_turf(src)) - qdel(src) - return - return ..() + user.visible_message(span_notice("[user] starts unsecuring [src]..."), span_notice("You start unsecuring [src]...")) + tool.play_tool_sound(src) + if(tool.use_tool(src, user, 80)) + user.visible_message(span_notice("[user] unsecures [src]!"), span_notice("You detach [src] from the wall.")) + playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) + new/obj/item/wallframe/intercom(get_turf(src)) + qdel(src) /** * Override attack_tk_grab instead of attack_tk because we actually want attack_tk's diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 956adecd59d..5fce6a12f3e 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -422,12 +422,13 @@ else if(icon_state == "[initial_icon_state]_reverse") //so flipping doesn't overwrite an unexpected icon_state (e.g. an admin's) icon_state = initial_icon_state -/obj/item/tape/attackby(obj/item/I, mob/user, params) - if(unspooled && (I.tool_behaviour == TOOL_SCREWDRIVER)) - to_chat(user, span_notice("You start winding the tape back in...")) - if(I.use_tool(src, user, 120)) - to_chat(user, span_notice("You wind the tape back in.")) - respool() +/obj/item/tape/screwdriver_act(mob/living/user, obj/item/tool) + if(!unspooled) + return FALSE + to_chat(user, span_notice("You start winding the tape back in...")) + if(tool.use_tool(src, user, 120)) + to_chat(user, span_notice("You wind the tape back in.")) + respool() //Random colour tapes /obj/item/tape/random diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index 4789abc60e1..730df0413be 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -87,29 +87,34 @@ log_combat(user, target, "flamethrowered", src) flame_turf(turflist) -/obj/item/flamethrower/attackby(obj/item/W, mob/user, params) - if(W.tool_behaviour == TOOL_WRENCH && !status)//Taking this apart - var/turf/T = get_turf(src) - if(weldtool) - weldtool.forceMove(T) - weldtool = null - if(igniter) - igniter.forceMove(T) - igniter = null - if(ptank) - ptank.forceMove(T) - ptank = null - new /obj/item/stack/rods(T) - qdel(src) - return +/obj/item/flamethrower/wrench_act(mob/living/user, obj/item/tool) + . = TRUE + if(status) + return FALSE + tool.play_tool_sound(src) + var/turf/T = get_turf(src) + if(weldtool) + weldtool.forceMove(T) + weldtool = null + if(igniter) + igniter.forceMove(T) + igniter = null + if(ptank) + ptank.forceMove(T) + ptank = null + new /obj/item/stack/rods(T) + qdel(src) - else if(W.tool_behaviour == TOOL_SCREWDRIVER && igniter && !lit) +/obj/item/flamethrower/screwdriver_act(mob/living/user, obj/item/tool) + if(igniter && !lit) + tool.play_tool_sound(src) status = !status to_chat(user, span_notice("[igniter] is now [status ? "secured" : "unsecured"]!")) update_appearance() - return + return TRUE - else if(isigniter(W)) +/obj/item/flamethrower/attackby(obj/item/W, mob/user, params) + if(isigniter(W)) var/obj/item/assembly/igniter/I = W if(I.secured) return diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index bc202213fd8..31bbb290781 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -99,26 +99,56 @@ if(stage == GRENADE_WIRED) wires.interact(user) +/obj/item/grenade/chem_grenade/screwdriver_act(mob/living/user, obj/item/tool) + . = TRUE + if(stage == GRENADE_WIRED) + if(beakers.len) + stage_change(GRENADE_READY) + to_chat(user, span_notice("You lock the [initial(name)] assembly.")) + tool.play_tool_sound(src, 25) + else + to_chat(user, span_warning("You need to add at least one beaker before locking the [initial(name)] assembly!")) + else if(stage == GRENADE_READY) + det_time = det_time == 50 ? 30 : 50 //toggle between 30 and 50 + if(landminemode) + landminemode.time = det_time * 0.1 //overwrites the proxy sensor activation timer + + tool.play_tool_sound(src, 25) + to_chat(user, span_notice("You modify the time delay. It's set for [DisplayTimeText(det_time)].")) + else + to_chat(user, span_warning("You need to add a wire!")) + + return TRUE + +/obj/item/grenade/chem_grenade/wirecutter_act(mob/living/user, obj/item/tool) + if(stage == GRENADE_READY && !active) + tool.play_tool_sound(src) + stage_change(GRENADE_WIRED) + to_chat(user, span_notice("You unlock the [initial(name)] assembly.")) + return TRUE + +/obj/item/grenade/chem_grenade/wrench_act(mob/living/user, obj/item/tool) + if(stage != GRENADE_WIRED) + return FALSE + if(beakers.len) + for(var/obj/beaker in beakers) + beaker.forceMove(drop_location()) + if(!beaker.reagents) + continue + var/reagent_list = pretty_string_from_reagent_list(beaker.reagents) + user.log_message("removed [beaker] ([reagent_list]) from [src]", LOG_GAME) + beakers = list() + to_chat(user, span_notice("You open the [initial(name)] assembly and remove the payload.")) + return + tool.play_tool_sound(src) + wires.detach_assembly(wires.get_wire(1)) + new /obj/item/stack/cable_coil(get_turf(src), 1) + stage_change(GRENADE_EMPTY) + to_chat(user, span_notice("You remove the activation mechanism from the [initial(name)] assembly.")) + /obj/item/grenade/chem_grenade/attackby(obj/item/item, mob/user, params) if(istype(item, /obj/item/assembly) && stage == GRENADE_WIRED) wires.interact(user) - if(item.tool_behaviour == TOOL_SCREWDRIVER) - if(stage == GRENADE_WIRED) - if(beakers.len) - stage_change(GRENADE_READY) - to_chat(user, span_notice("You lock the [initial(name)] assembly.")) - item.play_tool_sound(src, 25) - else - to_chat(user, span_warning("You need to add at least one beaker before locking the [initial(name)] assembly!")) - else if(stage == GRENADE_READY) - det_time = det_time == 50 ? 30 : 50 //toggle between 30 and 50 - if(landminemode) - landminemode.time = det_time * 0.1 //overwrites the proxy sensor activation timer - - to_chat(user, span_notice("You modify the time delay. It's set for [DisplayTimeText(det_time)].")) - else - to_chat(user, span_warning("You need to add a wire!")) - return else if(stage == GRENADE_WIRED && is_type_in_list(item, allowed_containers)) . = TRUE //no afterattack if(is_type_in_list(item, banned_containers)) @@ -147,26 +177,6 @@ else to_chat(user, span_warning("You need one length of coil to wire the assembly!")) return - - else if(stage == GRENADE_READY && item.tool_behaviour == TOOL_WIRECUTTER && !active) - stage_change(GRENADE_WIRED) - to_chat(user, span_notice("You unlock the [initial(name)] assembly.")) - - else if(stage == GRENADE_WIRED && item.tool_behaviour == TOOL_WRENCH) - if(beakers.len) - for(var/obj/beaker in beakers) - beaker.forceMove(drop_location()) - if(!beaker.reagents) - continue - var/reagent_list = pretty_string_from_reagent_list(beaker.reagents) - user.log_message("removed [beaker] ([reagent_list]) from [src]", LOG_GAME) - beakers = list() - to_chat(user, span_notice("You open the [initial(name)] assembly and remove the payload.")) - return - wires.detach_assembly(wires.get_wire(1)) - new /obj/item/stack/cable_coil(get_turf(src), 1) - stage_change(GRENADE_EMPTY) - to_chat(user, span_notice("You remove the activation mechanism from the [initial(name)] assembly.")) else return ..() diff --git a/code/game/objects/items/grenades/grenade.dm b/code/game/objects/items/grenades/grenade.dm index 23312d097ab..df9e1d0dc1e 100644 --- a/code/game/objects/items/grenades/grenade.dm +++ b/code/game/objects/items/grenades/grenade.dm @@ -144,26 +144,32 @@ var/mob/mob = loc mob.dropItemToGround(src) -/obj/item/grenade/attackby(obj/item/weapon, mob/user, params) +/obj/item/grenade/screwdriver_act(mob/living/user, obj/item/tool) if(active) - return ..() + return FALSE + if(change_det_time()) + tool.play_tool_sound(src) + to_chat(user, span_notice("You modify the time delay. It's set for [DisplayTimeText(det_time)].")) + return TRUE - if(weapon.tool_behaviour == TOOL_MULTITOOL) - var/newtime = tgui_input_list(user, "Please enter a new detonation time", "Detonation Timer", list("Instant", 3, 4, 5)) - if (isnull(newtime)) - return - if(!user.canUseTopic(src, BE_CLOSE)) - return - if(newtime == "Instant" && change_det_time(0)) - to_chat(user, span_notice("You modify the time delay. It's set to be instantaneous.")) - return - newtime = round(newtime) - if(change_det_time(newtime)) - to_chat(user, span_notice("You modify the time delay. It's set for [DisplayTimeText(det_time)].")) +/obj/item/grenade/multitool_act(mob/living/user, obj/item/tool) + . = ..() + if(active) + return FALSE + + . = TRUE + + var/newtime = tgui_input_list(user, "Please enter a new detonation time", "Detonation Timer", list("Instant", 3, 4, 5)) + if (isnull(newtime)) return - else if(weapon.tool_behaviour == TOOL_SCREWDRIVER) - if(change_det_time()) - to_chat(user, span_notice("You modify the time delay. It's set for [DisplayTimeText(det_time)].")) + if(!user.canUseTopic(src, BE_CLOSE)) + return + if(newtime == "Instant" && change_det_time(0)) + to_chat(user, span_notice("You modify the time delay. It's set to be instantaneous.")) + return + newtime = round(newtime) + if(change_det_time(newtime)) + to_chat(user, span_notice("You modify the time delay. It's set for [DisplayTimeText(det_time)].")) /obj/item/grenade/proc/change_det_time(time) //Time uses real time. . = TRUE diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index 39f6159177b..51f54846271 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -34,10 +34,12 @@ target = null return ..() +/obj/item/grenade/c4/screwdriver_act(mob/living/user, obj/item/tool) + to_chat(user, span_notice("The wire panel can be accessed without a screwdriver.")) + return TRUE + /obj/item/grenade/c4/attackby(obj/item/item, mob/user, params) - if(item.tool_behaviour == TOOL_SCREWDRIVER) - to_chat(user, span_notice("The wire panel can be accessed without a screwdriver.")) - else if(is_wire_tool(item)) + if(is_wire_tool(item)) wires.interact(user) else return ..() diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm index db12f6f7263..8423ba4bf84 100644 --- a/code/game/objects/items/inducer.dm +++ b/code/game/objects/items/inducer.dm @@ -59,20 +59,21 @@ return TRUE return FALSE +/obj/item/inducer/screwdriver_act(mob/living/user, obj/item/tool) + . = TRUE + tool.play_tool_sound(src) + if(!opened) + to_chat(user, span_notice("You unscrew the battery compartment.")) + opened = TRUE + update_appearance() + return + else + to_chat(user, span_notice("You close the battery compartment.")) + opened = FALSE + update_appearance() + return /obj/item/inducer/attackby(obj/item/W, mob/user) - if(W.tool_behaviour == TOOL_SCREWDRIVER) - W.play_tool_sound(src) - if(!opened) - to_chat(user, span_notice("You unscrew the battery compartment.")) - opened = TRUE - update_appearance() - return - else - to_chat(user, span_notice("You close the battery compartment.")) - opened = FALSE - update_appearance() - return if(istype(W, /obj/item/stock_parts/cell)) if(opened) if(!cell) diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index bb0bb18083d..db5bd5f58d5 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -427,6 +427,11 @@ else . += span_warning("\The [src] does not have a power source installed.") +/obj/item/melee/baton/security/screwdriver_act(mob/living/user, obj/item/tool) + if(tryremovecell(user)) + tool.play_tool_sound(src) + return TRUE + /obj/item/melee/baton/security/attackby(obj/item/item, mob/user, params) if(istype(item, /obj/item/stock_parts/cell)) var/obj/item/stock_parts/cell/active_cell = item @@ -441,9 +446,6 @@ cell = item to_chat(user, span_notice("You install a cell in [src].")) update_appearance() - - else if(item.tool_behaviour == TOOL_SCREWDRIVER) - tryremovecell(user) else return ..() @@ -451,6 +453,8 @@ if(cell && can_remove_cell) cell.forceMove(drop_location()) to_chat(user, span_notice("You remove the cell from [src].")) + return TRUE + return FALSE /obj/item/melee/baton/security/attack_self(mob/user) if(cell?.charge >= cell_hit_cost) diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index c848d5d7a1e..6754d8c78b7 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -70,6 +70,24 @@ out += span_notice("[icon2html(tank, user)] It has \a [tank] mounted onto it.") . += out.Join("\n") +/obj/item/pneumatic_cannon/screwdriver_act(mob/living/user, obj/item/tool) + if(tank) + tool.play_tool_sound(src) + updateTank(tank, 1, user) + return TRUE + +/obj/item/pneumatic_cannon/wrench_act(mob/living/user, obj/item/tool) + playsound(src, 'sound/items/ratchet.ogg', 50, TRUE) + switch(pressureSetting) + if(1) + pressureSetting = 2 + if(2) + pressureSetting = 3 + if(3) + pressureSetting = 1 + to_chat(user, span_notice("You tweak \the [src]'s pressure output to [pressureSetting].")) + return TRUE + /obj/item/pneumatic_cannon/attackby(obj/item/W, mob/living/user, params) if(user.combat_mode) return ..() @@ -92,9 +110,6 @@ if(3) pressureSetting = 1 to_chat(user, span_notice("You tweak \the [src]'s pressure output to [pressureSetting].")) - else if(W.tool_behaviour == TOOL_SCREWDRIVER) - if(tank) - updateTank(tank, 1, user) else if(loadedWeightClass >= maxWeightClass) to_chat(user, span_warning("\The [src] can't hold any more items!")) else if(isitem(W)) diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm index 30ad35f9a14..e4bb53e9841 100644 --- a/code/game/objects/items/powerfist.dm +++ b/code/game/objects/items/powerfist.dm @@ -28,6 +28,22 @@ if(tank) . += span_notice("[icon2html(tank, user)] It has \a [tank] mounted onto it.") +/obj/item/melee/powerfist/wrench_act(mob/living/user, obj/item/tool) + switch(fisto_setting) + if(1) + fisto_setting = 2 + if(2) + fisto_setting = 3 + if(3) + fisto_setting = 1 + tool.play_tool_sound(src) + to_chat(user, span_notice("You tweak \the [src]'s piston valve to [fisto_setting].")) + return TRUE + +/obj/item/melee/powerfist/screwdriver_act(mob/living/user, obj/item/tool) + if(tank) + updateTank(tank, 1, user) + return TRUE /obj/item/melee/powerfist/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/tank/internals)) @@ -37,19 +53,6 @@ to_chat(user, span_warning("\The [IT] is too small for \the [src].")) return updateTank(W, 0, user) - else if(W.tool_behaviour == TOOL_WRENCH) - switch(fisto_setting) - if(1) - fisto_setting = 2 - if(2) - fisto_setting = 3 - if(3) - fisto_setting = 1 - W.play_tool_sound(src) - to_chat(user, span_notice("You tweak \the [src]'s piston valve to [fisto_setting].")) - else if(W.tool_behaviour == TOOL_SCREWDRIVER) - if(tank) - updateTank(tank, 1, user) /obj/item/melee/powerfist/proc/updateTank(obj/item/tank/internals/thetank, removing = 0, mob/living/carbon/human/user) if(removing) diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index 4a9bba6ea12..6bb17213b82 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -44,35 +44,38 @@ if(can_hack_open) . += "The service panel is currently [panel_open ? "unscrewed" : "screwed shut"]." -/obj/item/storage/secure/attackby(obj/item/weapon, mob/user, params) +/obj/item/storage/secure/tool_act(mob/living/user, obj/item/tool) if(can_hack_open && SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED)) - if (weapon.tool_behaviour == TOOL_SCREWDRIVER) - if (weapon.use_tool(src, user, 20)) - panel_open = !panel_open - to_chat(user, span_notice("You [panel_open ? "open" : "close"] the service panel.")) - return - if (weapon.tool_behaviour == TOOL_WIRECUTTER) - to_chat(user, span_danger("[src] is protected from this sort of tampering, yet it appears the internal memory wires can still be pulsed.")) - return - if (weapon.tool_behaviour == TOOL_MULTITOOL) - if(lock_hacking) - to_chat(user, span_danger("This safe is already being hacked.")) - return - if(panel_open == TRUE) - to_chat(user, span_danger("Now attempting to reset internal memory, please hold.")) - lock_hacking = TRUE - if (weapon.use_tool(src, user, 400)) - to_chat(user, span_danger("Internal memory reset - lock has been disengaged.")) - lock_set = FALSE + return ..() + else + return FALSE - lock_hacking = FALSE - return +/obj/item/storage/secure/wirecutter_act(mob/living/user, obj/item/tool) + to_chat(user, span_danger("[src] is protected from this sort of tampering, yet it appears the internal memory wires can still be pulsed.")) + return - to_chat(user, span_warning("You must unscrew the service panel before you can pulse the wiring!")) - return +/obj/item/storage/secure/screwdriver_act(mob/living/user, obj/item/tool) + if(tool.use_tool(src, user, 20)) + panel_open = !panel_open + to_chat(user, span_notice("You [panel_open ? "open" : "close"] the service panel.")) + return TRUE - // -> storage/attackby() what with handle insertion, etc - return ..() +/obj/item/storage/secure/multitool_act(mob/living/user, obj/item/tool) + . = TRUE + if(lock_hacking) + to_chat(user, span_danger("This safe is already being hacked.")) + return + if(panel_open == TRUE) + to_chat(user, span_danger("Now attempting to reset internal memory, please hold.")) + lock_hacking = TRUE + if (tool.use_tool(src, user, 400)) + to_chat(user, span_danger("Internal memory reset - lock has been disengaged.")) + lock_set = FALSE + + lock_hacking = FALSE + return + + to_chat(user, span_warning("You must unscrew the service panel before you can pulse the wiring!")) /obj/item/storage/secure/attack_self(mob/user) var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED) diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 73adba88e67..911aeaeeec9 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -5,23 +5,6 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real ))) /mob/living/silicon/robot/attackby(obj/item/W, mob/living/user, params) - if(W.tool_behaviour == TOOL_WELDER && (!user.combat_mode || user == src)) - user.changeNext_move(CLICK_CD_MELEE) - if (!getBruteLoss()) - to_chat(user, span_warning("[src] is already in good condition!")) - 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, span_notice("You start fixing yourself...")) - if(!W.use_tool(src, user, 50)) - return - - adjustBruteLoss(-30) - add_fingerprint(user) - visible_message(span_notice("[user] fixes some of the dents on [src].")) - return - if(istype(W, /obj/item/stack/cable_coil) && wiresexposed) user.changeNext_move(CLICK_CD_MELEE) var/obj/item/stack/cable_coil/coil = W @@ -39,20 +22,6 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real to_chat(user, span_warning("The wires seem fine, there's no need to fix them.")) return - if(W.tool_behaviour == TOOL_CROWBAR) // crowbar means open or close the cover - if(opened) - to_chat(user, span_notice("You close the cover.")) - opened = FALSE - update_icons() - else - if(locked) - to_chat(user, span_warning("The cover is locked and cannot be opened!")) - else - to_chat(user, span_notice("You open the cover.")) - opened = TRUE - update_icons() - return - if(istype(W, /obj/item/stock_parts/cell) && opened) // trying to put a cell inside if(wiresexposed) to_chat(user, span_warning("Close the cover first!")) @@ -74,31 +43,6 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real to_chat(user, span_warning("You can't reach the wiring!")) return - if(W.tool_behaviour == TOOL_SCREWDRIVER && opened) // wire hacking or radio management - if(!cell) //haxing - wiresexposed = !wiresexposed - to_chat(user, span_notice("The wires have been [wiresexposed ? "exposed" : "unexposed"].")) - else //radio - if(shell) - to_chat(user, span_warning("You cannot seem to open the radio compartment!")) //Prevent AI radio key theft - else if(radio) - radio.screwdriver_act(user, W)//Push it to the radio to let it handle everything - else - to_chat(user, span_warning("Unable to locate a radio!")) - update_icons() - return - - if(W.tool_behaviour == TOOL_WRENCH && opened && !cell) //Deconstruction. The flashes break from the fall, to prevent this from being a ghetto reset module. - if(!lockcharge) - to_chat(user, span_warning("[src]'s bolts spark! Maybe you should lock them down first!")) - spark_system.start() - return - to_chat(user, span_notice("You start to unfasten [src]'s securing bolts...")) - if(W.use_tool(src, user, 50, volume=50) && !cell) - user.visible_message(span_notice("[user] deconstructs [src]!"), span_notice("You unfasten the securing bolts, and [src] falls to pieces!")) - deconstruct() - return - if(W.slot_flags & ITEM_SLOT_HEAD && hat_offset != INFINITY && !user.combat_mode && !is_type_in_typecache(W, GLOB.blacklisted_borg_hats)) if(user == src) to_chat(user, span_notice("You can't seem to manage to place [W] on your head by yourself!") ) @@ -112,6 +56,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real if (user.temporarilyRemoveItemFromInventory(W, TRUE)) place_on_head(W) return + if(istype(W, /obj/item/defibrillator) && !user.combat_mode) if(!opened) to_chat(user, span_warning("You must access the cyborg's internals!")) @@ -183,7 +128,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real to_chat(user, span_danger("Access denied.")) return - if(istype(W, /obj/item/borg/upgrade/)) + if(istype(W, /obj/item/borg/upgrade)) var/obj/item/borg/upgrade/U = W if(!opened) to_chat(user, span_warning("You must access the cyborg's internals!")) @@ -300,6 +245,71 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real step_away(src, user, 15) addtimer(CALLBACK(GLOBAL_PROC, .proc/_step_away, src, get_turf(user), 15), 3) +/mob/living/silicon/robot/welder_act(mob/living/user, obj/item/tool) + if(user.combat_mode && usr != src) + return FALSE + . = TRUE + user.changeNext_move(CLICK_CD_MELEE) + if (!getBruteLoss()) + to_chat(user, span_warning("[src] is already in good condition!")) + return + if (!tool.tool_start_check(user, amount=1)) //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, span_notice("You start fixing yourself...")) + if(!tool.use_tool(src, user, 50)) + return + + adjustBruteLoss(-30) + add_fingerprint(user) + visible_message(span_notice("[user] fixes some of the dents on [src].")) + +/mob/living/silicon/robot/crowbar_act(mob/living/user, obj/item/tool) + . = TRUE + if(opened) + to_chat(user, span_notice("You close the cover.")) + opened = FALSE + update_icons() + else + if(locked) + to_chat(user, span_warning("The cover is locked and cannot be opened!")) + else + to_chat(user, span_notice("You open the cover.")) + opened = TRUE + update_icons() + + return TRUE + +/mob/living/silicon/robot/screwdriver_act(mob/living/user, obj/item/tool) + if(!opened) + return FALSE + . = TRUE + if(!cell) // haxing + wiresexposed = !wiresexposed + to_chat(user, span_notice("The wires have been [wiresexposed ? "exposed" : "unexposed"].")) + else // radio + if(shell) + to_chat(user, span_warning("You cannot seem to open the radio compartment!")) //Prevent AI radio key theft + else if(radio) + radio.screwdriver_act(user, tool) // Push it to the radio to let it handle everything + else + to_chat(user, span_warning("Unable to locate a radio!")) + update_icons() + +/mob/living/silicon/robot/wrench_act(mob/living/user, obj/item/tool) + if(!(opened && !cell)) // Deconstruction. The flashes break from the fall, to prevent this from being a ghetto reset module. + return FALSE + . = TRUE + if(!lockcharge) + to_chat(user, span_warning("[src]'s bolts spark! Maybe you should lock them down first!")) + spark_system.start() + return + to_chat(user, span_notice("You start to unfasten [src]'s securing bolts...")) + if(tool.use_tool(src, user, 50, volume=50) && !cell) + user.visible_message(span_notice("[user] deconstructs [src]!"), span_notice("You unfasten the securing bolts, and [src] falls to pieces!")) + deconstruct() + return + /mob/living/silicon/robot/fire_act() if(!on_fire) //Silicons don't gain stacks from hotspots, but hotspots can ignite them IgniteMob()