diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index 51369836e2f..43f6b033d39 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -21,6 +21,44 @@ var/const/AIRLOCK_WIRE_SAFETY = 512 var/const/AIRLOCK_WIRE_SPEED = 1024 var/const/AIRLOCK_WIRE_LIGHT = 2048 +/datum/wires/airlock/GetWireName(index) + switch(index) + if(AIRLOCK_WIRE_IDSCAN) + return "ID Scan" + + if(AIRLOCK_WIRE_MAIN_POWER1) + return "Primary Power" + + if(AIRLOCK_WIRE_MAIN_POWER2) + return "Secondary Power" + + if(AIRLOCK_WIRE_DOOR_BOLTS) + return "Door Bolts" + + if(AIRLOCK_WIRE_BACKUP_POWER1) + return "Primary Backup Power" + + if(AIRLOCK_WIRE_BACKUP_POWER2) + return "Secondary Backup Power" + + if(AIRLOCK_WIRE_OPEN_DOOR) + return "Door State" + + if(AIRLOCK_WIRE_AI_CONTROL) + return "AI Control" + + if(AIRLOCK_WIRE_ELECTRIFY) + return "Electrification" + + if(AIRLOCK_WIRE_ELECTRIFY) + return "Door Safeties" + + if(AIRLOCK_WIRE_ELECTRIFY) + return "Door Timing" + + if(AIRLOCK_WIRE_ELECTRIFY) + return "Bolt Lights" + /datum/wires/airlock/CanUse(mob/living/L) var/obj/machinery/door/airlock/A = holder if(!issilicon(L)) diff --git a/code/datums/wires/alarm.dm b/code/datums/wires/alarm.dm index 46f7c6cc885..c37381f47ca 100644 --- a/code/datums/wires/alarm.dm +++ b/code/datums/wires/alarm.dm @@ -9,6 +9,22 @@ var/const/AALARM_WIRE_SYPHON = 4 var/const/AALARM_WIRE_AI_CONTROL = 8 var/const/AALARM_WIRE_AALARM = 16 +/datum/wires/alarm/GetWireName(index) + switch(index) + if(AALARM_WIRE_IDSCAN) + return "ID Scan" + + if(AALARM_WIRE_POWER) + return "Power" + + if(AALARM_WIRE_SYPHON) + return "Panic Syphon" + + if(AALARM_WIRE_AI_CONTROL) + return "AI Control" + + if(AALARM_WIRE_AALARM) + return "Atmospherics Alarm" /datum/wires/alarm/CanUse(mob/living/L) var/obj/machinery/alarm/A = holder diff --git a/code/datums/wires/apc.dm b/code/datums/wires/apc.dm index 26f8dd61f59..a1ef61513fb 100644 --- a/code/datums/wires/apc.dm +++ b/code/datums/wires/apc.dm @@ -7,6 +7,20 @@ var/const/APC_WIRE_MAIN_POWER1 = 2 var/const/APC_WIRE_MAIN_POWER2 = 4 var/const/APC_WIRE_AI_CONTROL = 8 +/datum/wires/apc/GetWireName(index) + switch(index) + if(APC_WIRE_IDSCAN) + return "ID Scan" + + if(APC_WIRE_MAIN_POWER1) + return "Primary Power" + + if(APC_WIRE_MAIN_POWER2) + return "Secondary Power" + + if(APC_WIRE_AI_CONTROL) + return "AI Control" + /datum/wires/apc/get_status() . = ..() var/obj/machinery/power/apc/A = holder diff --git a/code/datums/wires/autolathe.dm b/code/datums/wires/autolathe.dm index 29013f73e5e..644a472acf3 100644 --- a/code/datums/wires/autolathe.dm +++ b/code/datums/wires/autolathe.dm @@ -6,6 +6,17 @@ var/const/AUTOLATHE_HACK_WIRE = 1 var/const/AUTOLATHE_SHOCK_WIRE = 2 var/const/AUTOLATHE_DISABLE_WIRE = 4 +/datum/wires/autolathe/GetWireName(index) + switch(index) + if(AUTOLATHE_HACK_WIRE) + return "Hack" + + if(AUTOLATHE_SHOCK_WIRE) + return "Shock" + + if(AUTOLATHE_DISABLE_WIRE) + return "Disable" + /datum/wires/autolathe/get_status() . = ..() var/obj/machinery/autolathe/A = holder diff --git a/code/datums/wires/camera.dm b/code/datums/wires/camera.dm index 0eb7e7ec577..ee25f8c3898 100644 --- a/code/datums/wires/camera.dm +++ b/code/datums/wires/camera.dm @@ -26,6 +26,26 @@ var/const/CAMERA_WIRE_ALARM = 8 var/const/CAMERA_WIRE_NOTHING1 = 16 var/const/CAMERA_WIRE_NOTHING2 = 32 +/datum/wires/camera/GetWireName(index) + switch(index) + if(CAMERA_WIRE_FOCUS) + return "Focus" + + if(CAMERA_WIRE_POWER) + return "Power" + + if(CAMERA_WIRE_LIGHT) + return "Light" + + if(CAMERA_WIRE_ALARM) + return "Alarm" + + if(CAMERA_WIRE_NOTHING1) + return "Nothing" + + if(CAMERA_WIRE_NOTHING2) + return "Nothing" + /datum/wires/camera/UpdateCut(index, mended) var/obj/machinery/camera/C = holder diff --git a/code/datums/wires/explosive.dm b/code/datums/wires/explosive.dm index f6cce8e223a..2c0692f51a8 100644 --- a/code/datums/wires/explosive.dm +++ b/code/datums/wires/explosive.dm @@ -3,6 +3,11 @@ var/const/WIRE_EXPLODE = 1 +/datum/wires/apc/GetWireName(index) + switch(index) + if(WIRE_EXPLODE) + return "Explode" + /datum/wires/explosive/proc/explode() return diff --git a/code/datums/wires/mulebot.dm b/code/datums/wires/mulebot.dm index 777a3ca05dc..ec083c47f48 100644 --- a/code/datums/wires/mulebot.dm +++ b/code/datums/wires/mulebot.dm @@ -2,6 +2,7 @@ random = 1 holder_type = /mob/living/simple_animal/bot/mulebot wire_count = 10 + window_x = 410 var/const/WIRE_POWER1 = 1 // power connections var/const/WIRE_POWER2 = 2 @@ -13,6 +14,35 @@ var/const/WIRE_REMOTE_RX = 64 // remote recv functions var/const/WIRE_REMOTE_TX = 128 // remote trans status var/const/WIRE_BEACON_RX = 256 // beacon ping recv +/datum/wires/mulebot/GetWireName(index) + switch(index) + if(WIRE_POWER1) + return "Primary Power" + + if(WIRE_POWER2) + return "Secondary Power" + + if(WIRE_AVOIDANCE) + return "Mob Avoidance" + + if(WIRE_LOADCHECK) + return "Load Checking" + + if(WIRE_MOTOR1) + return "Primary Motor" + + if(WIRE_MOTOR2) + return "Secondary Motor" + + if(WIRE_REMOTE_RX) + return "Remote Signal Receiver" + + if(WIRE_REMOTE_TX) + return "Remote Signal Sender" + + if(WIRE_BEACON_RX) + return "Navigation Beacon Receiver" + /datum/wires/mulebot/CanUse(mob/living/L) var/mob/living/simple_animal/bot/mulebot/M = holder if(M.open) diff --git a/code/datums/wires/nuclearbomb.dm b/code/datums/wires/nuclearbomb.dm index fcf28b96130..5743872acf5 100644 --- a/code/datums/wires/nuclearbomb.dm +++ b/code/datums/wires/nuclearbomb.dm @@ -7,6 +7,17 @@ var/const/NUCLEARBOMB_WIRE_LIGHT = 1 var/const/NUCLEARBOMB_WIRE_TIMING = 2 var/const/NUCLEARBOMB_WIRE_SAFETY = 4 +/datum/wires/nuclearbomb/GetWireName(index) + switch(index) + if(NUCLEARBOMB_WIRE_LIGHT) + return "Bomb Light" + + if(NUCLEARBOMB_WIRE_TIMING) + return "Bomb Timing" + + if(NUCLEARBOMB_WIRE_SAFETY) + return "Bomb Safety" + /datum/wires/nuclearbomb/CanUse(mob/living/L) var/obj/machinery/nuclearbomb/N = holder if(N.panel_open) diff --git a/code/datums/wires/particle_accelerator.dm b/code/datums/wires/particle_accelerator.dm index 463f6883c4a..d1e78dc2755 100644 --- a/code/datums/wires/particle_accelerator.dm +++ b/code/datums/wires/particle_accelerator.dm @@ -6,7 +6,20 @@ var/const/PARTICLE_TOGGLE_WIRE = 1 // Toggles whether the PA is on or not. var/const/PARTICLE_STRENGTH_WIRE = 2 // Determines the strength of the PA. var/const/PARTICLE_INTERFACE_WIRE = 4 // Determines the interface showing up. var/const/PARTICLE_LIMIT_POWER_WIRE = 8 // Determines how strong the PA can be. -//var/const/PARTICLE_NOTHING_WIRE = 16 // Blank wire + +/datum/wires/particle_acc/control_box/GetWireName(index) + switch(index) + if(PARTICLE_TOGGLE_WIRE) + return "Power Toggle" + + if(PARTICLE_STRENGTH_WIRE) + return "Strength" + + if(PARTICLE_INTERFACE_WIRE) + return "Interfact" + + if(PARTICLE_LIMIT_POWER_WIRE) + return "Maximum Power" /datum/wires/particle_acc/control_box/CanUse(mob/living/L) var/obj/machinery/particle_accelerator/control_box/C = holder diff --git a/code/datums/wires/radio.dm b/code/datums/wires/radio.dm index f947a9d84cc..ffbff381060 100644 --- a/code/datums/wires/radio.dm +++ b/code/datums/wires/radio.dm @@ -6,6 +6,17 @@ var/const/WIRE_SIGNAL = 1 var/const/WIRE_RECEIVE = 2 var/const/WIRE_TRANSMIT = 4 +/datum/wires/radio/GetWireName(index) + switch(index) + if(WIRE_SIGNAL) + return "Signal" + + if(WIRE_RECEIVE) + return "Receiver" + + if(WIRE_TRANSMIT) + return "Transmitter" + /datum/wires/radio/CanUse(mob/living/L) var/obj/item/device/radio/R = holder if(R.b_stat) diff --git a/code/datums/wires/robot.dm b/code/datums/wires/robot.dm index 468589dce93..bc03e80c327 100644 --- a/code/datums/wires/robot.dm +++ b/code/datums/wires/robot.dm @@ -19,6 +19,23 @@ var/const/BORG_WIRE_CAMERA = 4 var/const/BORG_WIRE_AI_CONTROL = 8 // Not used on MoMMIs var/const/BORG_WIRE_LAWCHECK = 16 // Not used on MoMMIs +/datum/wires/robot/GetWireName(index) + switch(index) + if(BORG_WIRE_MAIN_POWER) + return "Main Power" + + if(BORG_WIRE_LOCKED_DOWN) + return "Lockdown" + + if(BORG_WIRE_CAMERA) + return "Camera" + + if(BORG_WIRE_AI_CONTROL) + return "AI Control" + + if(BORG_WIRE_LAWCHECK) + return "Law Check" + /datum/wires/robot/get_status() . = ..() var/mob/living/silicon/robot/R = holder diff --git a/code/datums/wires/smartfridge.dm b/code/datums/wires/smartfridge.dm index 51ae8e95bf8..53b33e0fd72 100644 --- a/code/datums/wires/smartfridge.dm +++ b/code/datums/wires/smartfridge.dm @@ -10,6 +10,17 @@ var/const/SMARTFRIDGE_WIRE_ELECTRIFY = 1 var/const/SMARTFRIDGE_WIRE_THROW = 2 var/const/SMARTFRIDGE_WIRE_IDSCAN = 4 +/datum/wires/smartfridge/GetWireName(index) + switch(index) + if(SMARTFRIDGE_WIRE_ELECTRIFY) + return "Electrification" + + if(SMARTFRIDGE_WIRE_THROW) + return "Item Throw" + + if(SMARTFRIDGE_WIRE_IDSCAN) + return "ID Scan" + /datum/wires/smartfridge/CanUse(mob/living/L) var/obj/machinery/smartfridge/S = holder if(!issilicon(L)) diff --git a/code/datums/wires/syndicatebomb.dm b/code/datums/wires/syndicatebomb.dm index 51f460ff29e..d1fe6217058 100644 --- a/code/datums/wires/syndicatebomb.dm +++ b/code/datums/wires/syndicatebomb.dm @@ -9,6 +9,22 @@ var/const/WIRE_DELAY = 4 // Raises the timer on pulse, does nothing on cut var/const/WIRE_PROCEED = 8 // Lowers the timer, explodes if cut while the bomb is active var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if pulsed while already active, will stop a timer a bomb on cut +/datum/wires/syndicatebomb/GetWireName(index) + switch(index) + if(WIRE_BOOM) + return "Explode" + + if(WIRE_UNBOLT) + return "Unbolt" + + if(WIRE_DELAY) + return "Delay" + + if(WIRE_PROCEED) + return "Proceed" + + if(WIRE_ACTIVATE) + return "Activate" /datum/wires/syndicatebomb/CanUse(mob/living/L) var/obj/machinery/syndicatebomb/P = holder diff --git a/code/datums/wires/vending.dm b/code/datums/wires/vending.dm index 98efe4136e2..286ac454efc 100644 --- a/code/datums/wires/vending.dm +++ b/code/datums/wires/vending.dm @@ -9,6 +9,20 @@ var/const/VENDING_WIRE_CONTRABAND = 2 var/const/VENDING_WIRE_ELECTRIFY = 4 var/const/VENDING_WIRE_IDSCAN = 8 +/datum/wires/vending/GetWireName(index) + switch(index) + if(VENDING_WIRE_THROW) + return "Item Throw" + + if(VENDING_WIRE_CONTRABAND) + return "Contraband" + + if(VENDING_WIRE_ELECTRIFY) + return "Electrification" + + if(VENDING_WIRE_IDSCAN) + return "ID Scan" + /datum/wires/vending/CanUse(mob/living/L) var/obj/machinery/vending/V = holder if(!istype(L, /mob/living/silicon)) diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index 9cc386a7975..59a1fba5113 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -71,7 +71,7 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown", /datum/wires/proc/get_status() return list() -/datum/wires/proc/Interact(mob/living/user) +/datum/wires/proc/Interact(mob/user) if(user && istype(user) && holder && CanUse(user)) ui_interact(user) @@ -81,12 +81,12 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown", ui = new(user, src, ui_key, "wires.tmpl", holder.name, window_x, window_y) ui.open() -/datum/wires/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) +/datum/wires/ui_data(mob/user, ui_key = "main", datum/topic_state/state = physical_state) var/data[0] var/list/W[0] for(var/colour in wires) - W[++W.len] = list("colour" = capitalize(colour), "cut" = IsColourCut(colour), "attached" = IsAttached(colour)) + W[++W.len] = list("colour" = capitalize(colour), "cut" = IsColourCut(colour), "index" = can_see_wire_index(user) ? GetWireName(GetIndex(colour)) : null, "attached" = IsAttached(colour)) if(W.len > 0) data["wires"] = W @@ -99,44 +99,52 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown", /datum/wires/nano_host() return holder + +/datum/wires/proc/can_see_wire_index(mob/user) + if(user.can_admin_interact()) + return TRUE + else if(istype(user.get_active_hand(), /obj/item/device/multitool)) + var/obj/item/device/multitool/M = user.get_active_hand() + if(M.shows_wire_information) + return TRUE + + return FALSE /datum/wires/Topic(href, href_list) if(..()) return 1 - if(in_range(holder, usr) && isliving(usr)) - - var/mob/living/L = usr - if(CanUse(L) && href_list["action"]) - var/obj/item/I = L.get_active_hand() - var/colour = lowertext(href_list["wire"]) - holder.add_hiddenprint(L) - switch(href_list["action"]) - if("cut") // Toggles the cut/mend status - if(istype(I, /obj/item/weapon/wirecutters)) - playsound(holder, 'sound/items/Wirecutter.ogg', 20, 1) - CutWireColour(colour) - else - to_chat(L, "You need wirecutters!") - if("pulse") - if(istype(I, /obj/item/device/multitool)) - playsound(holder, 'sound/weapons/empty.ogg', 20, 1) - PulseColour(colour) - else - to_chat(L, "You need a multitool!") - if("attach") - if(IsAttached(colour)) - var/obj/item/O = Detach(colour) - if(O) - L.put_in_hands(O) - else - if(istype(I, /obj/item/device/assembly/signaler)) - if(L.drop_item()) - Attach(colour, I) - else - to_chat(L, "[L.get_active_hand()] is stuck to your hand!") + var/mob/L = usr + if(CanUse(L) && href_list["action"]) + var/obj/item/I = L.get_active_hand() + var/colour = lowertext(href_list["wire"]) + holder.add_hiddenprint(L) + switch(href_list["action"]) + if("cut") // Toggles the cut/mend status + if(istype(I, /obj/item/weapon/wirecutters) || L.can_admin_interact()) + playsound(holder, 'sound/items/Wirecutter.ogg', 20, 1) + CutWireColour(colour) + else + to_chat(L, "You need wirecutters!") + if("pulse") + if(istype(I, /obj/item/device/multitool) || L.can_admin_interact()) + playsound(holder, 'sound/weapons/empty.ogg', 20, 1) + PulseColour(colour) + else + to_chat(L, "You need a multitool!") + if("attach") + if(IsAttached(colour)) + var/obj/item/O = Detach(colour) + if(O) + L.put_in_hands(O) + else + if(istype(I, /obj/item/device/assembly/signaler)) + if(L.drop_item()) + Attach(colour, I) else - to_chat(L, "You need a remote signaller!") + to_chat(L, "[L.get_active_hand()] is stuck to your hand!") + else + to_chat(L, "You need a remote signaller!") nanomanager.update_uis(src) return 1 @@ -155,7 +163,7 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown", if(holder) nanomanager.update_uis(holder) -/datum/wires/proc/CanUse(mob/living/L) +/datum/wires/proc/CanUse(mob/L) return 1 /datum/wires/CanUseTopic(mob/user, datum/topic_state/state) @@ -203,6 +211,9 @@ var/const/POWER = 8 return index else CRASH("[colour] is not a key in wires.") + +/datum/wires/proc/GetWireName(index) + return // // Is Index/Colour Cut procs diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index db86c482f03..6ac4c84217f 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -250,6 +250,7 @@ agent.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/decloner/alien(agent), slot_belt) agent.equip_to_slot_or_del(new /obj/item/device/abductor/silencer(agent), slot_in_backpack) agent.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/abductor(agent), slot_head) + agent.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/military/abductor/full(agent), slot_belt) agent.update_icons() diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index 29f217b44bc..5237fda9ab2 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -547,31 +547,37 @@ Congratulations! You are now trained for xenobiology research!"} name = "alien scalpel" icon = 'icons/obj/abductor.dmi' origin_tech = "materials=2;biotech=2;abductor=2" + toolspeed = 0.25 /obj/item/weapon/hemostat/alien name = "alien hemostat" icon = 'icons/obj/abductor.dmi' origin_tech = "materials=2;biotech=2;abductor=2" + toolspeed = 0.25 /obj/item/weapon/retractor/alien name = "alien retractor" icon = 'icons/obj/abductor.dmi' origin_tech = "materials=2;biotech=2;abductor=2" + toolspeed = 0.25 /obj/item/weapon/circular_saw/alien name = "alien saw" icon = 'icons/obj/abductor.dmi' origin_tech = "materials=2;biotech=2;abductor=2" + toolspeed = 0.25 /obj/item/weapon/surgicaldrill/alien name = "alien drill" icon = 'icons/obj/abductor.dmi' origin_tech = "materials=2;biotech=2;abductor=2" + toolspeed = 0.25 /obj/item/weapon/cautery/alien name = "alien cautery" icon = 'icons/obj/abductor.dmi' origin_tech = "materials=2;biotech=2;abductor=2" + toolspeed = 0.25 /obj/item/clothing/head/helmet/abductor name = "agent headgear" @@ -605,7 +611,7 @@ Congratulations! You are now trained for xenobiology research!"} /obj/structure/abductor_tableframe/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/wrench)) to_chat(user, "You start disassembling [src]...") - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + playsound(src.loc, I.usesound, 50, 1) if(do_after(user, 30, target = src)) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) new /obj/item/stack/sheet/mineral/abductor(get_turf(src)) diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index 1cdff2ec775..cd0450e5426 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -26,7 +26,7 @@ jobtype = /datum/job/chief_engineer uniform = /obj/item/clothing/under/rank/chief_engineer - belt = /obj/item/weapon/storage/belt/utility/full + belt = /obj/item/weapon/storage/belt/utility/chief gloves = /obj/item/clothing/gloves/color/black/ce shoes = /obj/item/clothing/shoes/brown head = /obj/item/clothing/head/hardhat/white diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 632177d7358..1fbd0496397 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -581,9 +581,7 @@ return ui_interact(user) /obj/machinery/alarm/attack_ghost(user as mob) - if(stat & (BROKEN|MAINT)) - return - return ui_interact(user) + return interact(user) /obj/machinery/alarm/attack_hand(mob/user) . = ..() @@ -595,7 +593,7 @@ if(buildstage != 2) return - if(wiresexposed && !istype(user, /mob/living/silicon/ai)) + if(wiresexposed) wires.Interact(user) if(!shorted) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index db616620244..e91ff779665 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -107,8 +107,12 @@ /obj/machinery/camera/blob_act() qdel(src) return + +/obj/machinery/camera/attack_ghost(mob/user) + if(panel_open) + wires.Interact(user) -/obj/machinery/camera/attack_alien(mob/living/carbon/alien/humanoid/user as mob) +/obj/machinery/camera/attack_alien(mob/living/carbon/alien/humanoid/user) if(!istype(user)) return user.do_attack_animation(src) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 0b62f7faf80..1bc514a1df4 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -560,6 +560,8 @@ About the new airlock wires panel: return /obj/machinery/door/airlock/attack_ghost(mob/user) + if(p_open) + wires.Interact(user) ui_interact(user) /obj/machinery/door/airlock/attack_ai(mob/user) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index f9355a98d37..736d1cf9ba7 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -102,38 +102,51 @@ to_chat(user, "[payload] is already loaded into [src], you'll have to remove it first.") else ..() + +/obj/machinery/syndicatebomb/attack_ghost(mob/user) + interact(user) -/obj/machinery/syndicatebomb/attack_hand(var/mob/user) +/obj/machinery/syndicatebomb/attack_hand(mob/user) interact(user) /obj/machinery/syndicatebomb/attack_ai() return -/obj/machinery/syndicatebomb/interact(var/mob/user) +/obj/machinery/syndicatebomb/interact(mob/user) if(wires && open_panel) wires.Interact(user) - if(!open_panel) + if(!open_panel && can_interact(user)) if(!active) spawn() settings(user) return else if(anchored) to_chat(user, "The bomb is bolted to the floor!") - return + +/obj/machinery/syndicatebomb/proc/can_interact(mob/user) + if(user.can_advanced_admin_interact()) + return TRUE + if(!isliving(user)) + return FALSE + if(user.incapacitated()) + return FALSE + if(!Adjacent(user)) + return FALSE + return TRUE -/obj/machinery/syndicatebomb/proc/settings(var/mob/user) +/obj/machinery/syndicatebomb/proc/settings(mob/user) var/newtime = input(user, "Please set the timer.", "Timer", "[timer]") as num newtime = Clamp(newtime, 120, 60000) - if(in_range(src, user) && isliving(user)) //No running off and setting bombs from across the station + if(can_interact(user)) //No running off and setting bombs from across the station timer = newtime - src.loc.visible_message("[bicon(src)] timer set for [timer] seconds.") - if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && in_range(src, user) && isliving(user)) + loc.visible_message("[bicon(src)] timer set for [timer] seconds.") + if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && can_interact(user)) if(defused || active) if(defused) - src.loc.visible_message("[bicon(src)] Device error: User intervention required.") + loc.visible_message("[bicon(src)] Device error: User intervention required.") return else - src.loc.visible_message("[bicon(src)] [timer] seconds until detonation, please clear the area.") + loc.visible_message("[bicon(src)] [timer] seconds until detonation, please clear the area.") playsound(loc, 'sound/machines/click.ogg', 30, 1) active = 1 update_icon() @@ -143,8 +156,8 @@ var/area/A = get_area(bombturf) if(payload && !istype(payload, /obj/item/weapon/bombcore/training)) msg_admin_attack("[key_name_admin(user)] has primed a [name] ([payload]) for detonation at [A.name] (JMP).") - log_game("[key_name(user)] has primed a [name] ([payload]) for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])") - payload.adminlog = "The [src.name] that [key_name(user)] had primed detonated!" + log_game("[key_name(user)] has primed a [name] ([payload]) for detonation at [A.name] ([bombturf.x], [bombturf.y], [bombturf.z])") + payload.adminlog = "\The [src] that [key_name(user)] had primed detonated!" /obj/machinery/syndicatebomb/proc/isWireCut(var/index) return wires.IsIndexCut(index) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index f45daee2af5..ada0269abf1 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -908,7 +908,7 @@ /obj/item/weapon/reagent_containers/glass/bottle/toxin = 4,/obj/item/weapon/reagent_containers/syringe/antiviral = 6,/obj/item/weapon/reagent_containers/syringe/insulin = 4, /obj/item/weapon/reagent_containers/syringe = 12,/obj/item/device/healthanalyzer = 5,/obj/item/device/healthupgrade = 5,/obj/item/weapon/reagent_containers/glass/beaker = 4, /obj/item/weapon/reagent_containers/dropper = 2,/obj/item/stack/medical/bruise_pack/advanced = 3, /obj/item/stack/medical/ointment/advanced = 3, - /obj/item/stack/medical/bruise_pack = 3,/obj/item/stack/medical/splint = 4, /obj/item/device/sensor_device = 2, /obj/item/weapon/reagent_containers/hypospray/autoinjector = 4) + /obj/item/stack/medical/bruise_pack = 3,/obj/item/stack/medical/splint = 4, /obj/item/device/sensor_device = 2, /obj/item/weapon/reagent_containers/hypospray/autoinjector = 4, /obj/item/weapon/wrench/medical = 1) contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/pancuronium = 1,/obj/item/weapon/reagent_containers/glass/bottle/sulfonal = 1) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index b34cc09ca89..6c9f7fe1feb 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -19,6 +19,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d var/r_speed = 1.0 var/health = null var/hitsound = null + var/usesound = null var/w_class = 3 var/slot_flags = 0 //This is used to determine on which slots an item can fit. pass_flags = PASSTABLE @@ -60,6 +61,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d var/block_chance = 0 var/hit_reaction_chance = 0 //If you want to have something unrelated to blocking/armour piercing etc. Maybe not needed, but trying to think ahead/allow more freedom + var/toolspeed = 1 // If this item is a tool, the speed multiplier + /* Species-specific sprites, concept stolen from Paradise//vg/. ex: sprite_sheets = list( diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 742afb83c81..e734f22b97f 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -1,3 +1,7 @@ +#define PROXIMITY_NONE "" +#define PROXIMITY_ON_SCREEN "_red" +#define PROXIMITY_NEAR "_yellow" + /** * Multitool -- A multitool is used for hacking electronic devices. * TO-DO -- Using it as a power measurement tool for cables etc. Nannek. @@ -10,13 +14,15 @@ icon_state = "multitool" flags = CONDUCT force = 5.0 - w_class = 2 - throwforce = 5.0 - throw_range = 15 + w_class = WEIGHT_CLASS_SMALL + throwforce = 0 + throw_range = 7 throw_speed = 3 - desc = "You can use this on airlocks or APCs to try to hack them without cutting wires." materials = list(MAT_METAL=50, MAT_GLASS=20) - origin_tech = "magnets=1;engineering=1" + origin_tech = "magnets=1;engineering=2" + toolspeed = 1 + hitsound = 'sound/weapons/tap.ogg' + var/shows_wire_information = FALSE // shows what a wire does if set to TRUE var/obj/machinery/buffer // simple machine buffer for device linkage /obj/item/device/multitool/proc/IsBufferA(var/typepath) @@ -28,38 +34,74 @@ /obj/item/device/multitool/ai_detect - var/track_delay = 0 + var/track_cooldown = 0 + var/track_delay = 10 //How often it checks for proximity + var/detect_state = PROXIMITY_NONE + var/rangealert = 8 //Glows red when inside + var/rangewarning = 20 //Glows yellow when inside + origin_tech = "magnets=1;engineering=2;syndicate=1" /obj/item/device/multitool/ai_detect/New() ..() processing_objects += src - /obj/item/device/multitool/ai_detect/Destroy() processing_objects -= src return ..() /obj/item/device/multitool/ai_detect/process() - - if(track_delay > world.time) + if(track_cooldown > world.time) return - - var/found_eye = 0 - - for(var/mob/camera/aiEye/A in living_mob_list) - - var/turf/our_turf = get_turf(src) - var/turf/eye_turf = get_turf(A) - - if(get_dist(our_turf, eye_turf) < 9) - found_eye = 1 + detect_state = PROXIMITY_NONE + multitool_detect() + icon_state = "[initial(icon_state)][detect_state]" + track_cooldown = world.time + track_delay + +/obj/item/device/multitool/ai_detect/proc/multitool_detect() + var/turf/our_turf = get_turf(src) + for(var/mob/living/silicon/ai/AI in ai_list) + if(AI.cameraFollow == src) + detect_state = PROXIMITY_ON_SCREEN break - if(found_eye) - icon_state = "[initial(icon_state)]_red" - else - icon_state = initial(icon_state) + if(!detect_state && cameranet.chunkGenerated(our_turf.x, our_turf.y, our_turf.z)) + var/datum/camerachunk/chunk = cameranet.getCameraChunk(our_turf.x, our_turf.y, our_turf.z) + if(chunk) + if(chunk.seenby.len) + for(var/mob/camera/aiEye/A in chunk.seenby) + var/turf/detect_turf = get_turf(A) + if(get_dist(our_turf, detect_turf) < rangealert) + detect_state = PROXIMITY_ON_SCREEN + break + if(get_dist(our_turf, detect_turf) < rangewarning) + detect_state = PROXIMITY_NEAR + break + +/obj/item/device/multitool/ai_detect/admin + desc = "Used for pulsing wires to test which to cut. Not recommended by doctors. Has a strange tag that says 'Grief in Safety'" //What else should I say for a meme item? + track_delay = 5 + shows_wire_information = TRUE - track_delay = world.time + 10 // 1 second - return +/obj/item/device/multitool/ai_detect/admin/multitool_detect() + var/turf/our_turf = get_turf(src) + for(var/mob/J in urange(rangewarning,our_turf)) + if(check_rights(R_ADMIN, 0, J)) + detect_state = PROXIMITY_NEAR + var/turf/detect_turf = get_turf(J) + if(get_dist(our_turf, detect_turf) < rangealert) + detect_state = PROXIMITY_ON_SCREEN + break +/obj/item/device/multitool/cyborg + name = "multitool" + desc = "Optimised and stripped-down version of a regular multitool." + toolspeed = 0.5 + +/obj/item/device/multitool/abductor + name = "alien multitool" + desc = "An omni-technological interface." + icon = 'icons/obj/abductor.dmi' + icon_state = "multitool" + toolspeed = 0.1 + origin_tech = "magnets=5;engineering=5;abductor=3" + shows_wire_information = TRUE diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index ff1389067bd..8703926c13c 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -94,7 +94,7 @@ var/global/list/default_medbay_channels = list( secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT) /obj/item/device/radio/attack_ghost(mob/user) - return ui_interact(user) + return interact(user) /obj/item/device/radio/attack_self(mob/user as mob) user.set_machine(src) diff --git a/code/game/objects/items/weapons/stock_parts.dm b/code/game/objects/items/weapons/stock_parts.dm index e6e58196108..15a67bb2193 100644 --- a/code/game/objects/items/weapons/stock_parts.dm +++ b/code/game/objects/items/weapons/stock_parts.dm @@ -6,7 +6,7 @@ icon_state = "RPED" item_state = "RPED" w_class = 5 - can_hold = list("/obj/item/weapon/stock_parts") + can_hold = list(/obj/item/weapon/stock_parts) storage_slots = 50 use_to_pickup = 1 allow_quick_gather = 1 diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 49ba664619f..abfd54135c5 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -37,7 +37,7 @@ max_w_class = 2 storage_slots = 30 can_hold = list() // any - cant_hold = list("/obj/item/weapon/disk/nuclear") + cant_hold = list(/obj/item/weapon/disk/nuclear) /obj/item/weapon/storage/bag/trash/suicide_act(mob/user) user.visible_message("[user] puts the [src.name] over their head and starts chomping at the insides! Disgusting!") @@ -93,7 +93,7 @@ storage_slots = 7 display_contents_with_number = 0 //or else this will lead to stupid behavior. can_hold = list() // any - cant_hold = list("/obj/item/weapon/disk/nuclear") + cant_hold = list(/obj/item/weapon/disk/nuclear) /obj/item/weapon/storage/bag/plasticbag/mob_can_equip(M as mob, slot) @@ -136,7 +136,7 @@ storage_slots = 50 max_combined_w_class = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * ore.w_class max_w_class = 3 - can_hold = list("/obj/item/weapon/ore") + can_hold = list(/obj/item/weapon/ore) /obj/item/weapon/storage/bag/ore/cyborg name = "cyborg mining satchel" @@ -166,7 +166,7 @@ max_combined_w_class = 100 //Doesn't matter what this is, so long as it's more or equal to storage_slots * plants.w_class max_w_class = 3 w_class = 1 - can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/grown","/obj/item/seeds","/obj/item/weapon/grown","/obj/item/weapon/reagent_containers/food/snacks/ash_flora") + can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/weapon/grown,/obj/item/weapon/reagent_containers/food/snacks/ash_flora) burn_state = FLAMMABLE /obj/item/weapon/storage/bag/plants/portaseeder @@ -346,7 +346,7 @@ max_w_class = 3 w_class = 1 - can_hold = list("/obj/item/weapon/coin","/obj/item/weapon/spacecash") + can_hold = list(/obj/item/weapon/coin,/obj/item/weapon/spacecash) // ----------------------------- // Book bag @@ -362,7 +362,7 @@ max_combined_w_class = 21 max_w_class = 3 w_class = 4 //Bigger than a book because physics - can_hold = list("/obj/item/weapon/book", "/obj/item/weapon/storage/bible", "/obj/item/weapon/tome", "/obj/item/weapon/spellbook") + can_hold = list(/obj/item/weapon/book, /obj/item/weapon/storage/bible, /obj/item/weapon/tome, /obj/item/weapon/spellbook) burn_state = FLAMMABLE /* @@ -471,7 +471,7 @@ storage_slots = 50 max_combined_w_class = 200 w_class = 1 - can_hold = list("/obj/item/weapon/reagent_containers/food/pill","/obj/item/weapon/reagent_containers/glass/beaker","/obj/item/weapon/reagent_containers/glass/bottle") + can_hold = list(/obj/item/weapon/reagent_containers/food/pill,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/glass/bottle) burn_state = FLAMMABLE /* * Biowaste bag (mostly for xenobiologists) @@ -485,5 +485,5 @@ storage_slots = 25 max_combined_w_class = 200 w_class = 1 - can_hold = list("/obj/item/slime_extract","/obj/item/weapon/reagent_containers/food/snacks/monkeycube","/obj/item/weapon/reagent_containers/syringe","/obj/item/weapon/reagent_containers/glass/beaker","/obj/item/weapon/reagent_containers/glass/bottle","/obj/item/weapon/reagent_containers/blood","/obj/item/weapon/reagent_containers/hypospray/autoinjector") + can_hold = list(/obj/item/slime_extract,/obj/item/weapon/reagent_containers/food/snacks/monkeycube,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/reagent_containers/blood,/obj/item/weapon/reagent_containers/hypospray/autoinjector) burn_state = FLAMMABLE diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index fe29ba5c23a..3c6f4be5a2c 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -48,19 +48,18 @@ item_state = "utility" use_item_overlays = 1 can_hold = list( - "/obj/item/weapon/crowbar", - "/obj/item/weapon/screwdriver", - "/obj/item/weapon/weldingtool", - "/obj/item/weapon/wirecutters", - "/obj/item/weapon/wrench", - "/obj/item/device/multitool", - "/obj/item/device/flashlight", - "/obj/item/stack/cable_coil", - "/obj/item/device/t_scanner", - "/obj/item/device/analyzer", - "/obj/item/taperoll/engineering", - "/obj/item/weapon/extinguisher/mini") - + /obj/item/weapon/crowbar, + /obj/item/weapon/screwdriver, + /obj/item/weapon/weldingtool, + /obj/item/weapon/wirecutters, + /obj/item/weapon/wrench, + /obj/item/device/multitool, + /obj/item/device/flashlight, + /obj/item/stack/cable_coil, + /obj/item/device/t_scanner, + /obj/item/device/analyzer, + /obj/item/taperoll/engineering, + /obj/item/weapon/extinguisher/mini) /obj/item/weapon/storage/belt/utility/full/New() ..() @@ -69,7 +68,7 @@ new /obj/item/weapon/weldingtool(src) new /obj/item/weapon/crowbar(src) new /obj/item/weapon/wirecutters(src) - new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange")) + new /obj/item/stack/cable_coil(src, 30, pick("red","yellow","orange")) update_icon() /obj/item/weapon/storage/belt/utility/full/multitool/New() @@ -88,7 +87,23 @@ new /obj/item/weapon/extinguisher/mini(src) update_icon() +/obj/item/weapon/storage/belt/utility/chief + name = "Chief Engineer's toolbelt" + desc = "Holds tools, looks snazzy" + icon_state = "utilitybelt_ce" + item_state = "utility_ce" +/obj/item/weapon/storage/belt/utility/chief/New() + ..() + new /obj/item/weapon/screwdriver/power(src) + new /obj/item/weapon/crowbar/power(src) + new /obj/item/weapon/weldingtool/experimental(src)//This can be changed if this is too much + new /obj/item/device/multitool(src) + new /obj/item/stack/cable_coil(src, 30, pick("red","yellow","orange")) + new /obj/item/weapon/extinguisher/mini(src) + new /obj/item/device/analyzer(src) + update_icon() + //much roomier now that we've managed to remove two tools /obj/item/weapon/storage/belt/medical use_to_pickup = 1 //Allow medical belt to pick up medicine @@ -98,24 +113,24 @@ item_state = "medical" use_item_overlays = 1 can_hold = list( - "/obj/item/device/healthanalyzer", - "/obj/item/weapon/dnainjector", - "/obj/item/weapon/reagent_containers/dropper", - "/obj/item/weapon/reagent_containers/glass/beaker", - "/obj/item/weapon/reagent_containers/glass/bottle", - "/obj/item/weapon/reagent_containers/food/pill", - "/obj/item/weapon/reagent_containers/syringe", - "/obj/item/weapon/reagent_containers/glass/dispenser", - "/obj/item/weapon/lighter/zippo", - "/obj/item/weapon/storage/fancy/cigarettes", - "/obj/item/weapon/storage/pill_bottle", - "/obj/item/stack/medical", - "/obj/item/device/flashlight/pen", - "/obj/item/clothing/mask/surgical", - "/obj/item/clothing/gloves/color/latex", - "/obj/item/weapon/reagent_containers/hypospray/autoinjector", - "/obj/item/device/rad_laser", - "/obj/item/device/sensor_device" + /obj/item/device/healthanalyzer, + /obj/item/weapon/dnainjector, + /obj/item/weapon/reagent_containers/dropper, + /obj/item/weapon/reagent_containers/glass/beaker, + /obj/item/weapon/reagent_containers/glass/bottle, + /obj/item/weapon/reagent_containers/food/pill, + /obj/item/weapon/reagent_containers/syringe, + /obj/item/weapon/lighter/zippo, + /obj/item/weapon/storage/fancy/cigarettes, + /obj/item/weapon/storage/pill_bottle, + /obj/item/stack/medical, + /obj/item/device/flashlight/pen, + /obj/item/clothing/mask/surgical, + /obj/item/clothing/gloves/color/latex, + /obj/item/weapon/reagent_containers/hypospray/autoinjector, + /obj/item/device/rad_laser, + /obj/item/device/sensor_device, + /obj/item/weapon/wrench/medical, ) /obj/item/weapon/storage/belt/medical/response_team @@ -139,22 +154,19 @@ item_state = "botany" use_item_overlays = 1 can_hold = list( - "/obj/item/device/plant_analyzer", - "/obj/item/weapon/cultivator", - "/obj/item/weapon/hatchet", - "/obj/item/weapon/reagent_containers/glass/bottle", - "/obj/item/weapon/plantspray", -// "/obj/item/weapon/reagent_containers/syringe", -// "/obj/item/weapon/reagent_containers/glass/beaker", - "/obj/item/weapon/lighter/zippo", - "/obj/item/weapon/storage/fancy/cigarettes", - "obj/item/weapon/rollingpaperpack", - "/obj/item/weapon/shovel/spade", - "/obj/item/device/flashlight/pen", - "/obj/item/seeds", - "/obj/item/weapon/wirecutters", - "/obj/item/weapon/wrench", - "/obj/item/weapon/disk/botany", + /obj/item/device/plant_analyzer, + /obj/item/weapon/cultivator, + /obj/item/weapon/hatchet, + /obj/item/weapon/reagent_containers/glass/bottle, +// /obj/item/weapon/reagent_containers/syringe, +// /obj/item/weapon/reagent_containers/glass/beaker, + /obj/item/weapon/lighter/zippo, + /obj/item/weapon/storage/fancy/cigarettes, + /obj/item/weapon/shovel/spade, + /obj/item/device/flashlight/pen, + /obj/item/seeds, + /obj/item/weapon/wirecutters, + /obj/item/weapon/wrench, ) @@ -167,22 +179,22 @@ max_w_class = 3 use_item_overlays = 1 can_hold = list( - "/obj/item/weapon/grenade/flashbang", - "/obj/item/weapon/grenade/chem_grenade/teargas", - "/obj/item/weapon/reagent_containers/spray/pepper", - "/obj/item/weapon/restraints/handcuffs", - "/obj/item/device/flash", - "/obj/item/clothing/glasses", - "/obj/item/ammo_casing/shotgun", - "/obj/item/ammo_box", - "/obj/item/weapon/reagent_containers/food/snacks/donut", - "/obj/item/weapon/kitchen/knife/combat", - "/obj/item/weapon/melee/baton", - "/obj/item/weapon/melee/classic_baton", - "/obj/item/device/flashlight/seclite", - "/obj/item/taperoll/police", - "/obj/item/weapon/melee/classic_baton/telescopic", - "/obj/item/weapon/restraints/legcuffs/bola") + /obj/item/weapon/grenade/flashbang, + /obj/item/weapon/grenade/chem_grenade/teargas, + /obj/item/weapon/reagent_containers/spray/pepper, + /obj/item/weapon/restraints/handcuffs, + /obj/item/device/flash, + /obj/item/clothing/glasses, + /obj/item/ammo_casing/shotgun, + /obj/item/ammo_box, + /obj/item/weapon/reagent_containers/food/snacks/donut, + /obj/item/weapon/kitchen/knife/combat, + /obj/item/weapon/melee/baton, + /obj/item/weapon/melee/classic_baton, + /obj/item/device/flashlight/seclite, + /obj/item/taperoll/police, + /obj/item/weapon/melee/classic_baton/telescopic, + /obj/item/weapon/restraints/legcuffs/bola) /obj/item/weapon/storage/belt/security/sec/New() ..() @@ -236,6 +248,24 @@ desc = "A syndicate belt designed to be used by boarding parties. Its style is modelled after the hardsuits they wear." icon_state = "militarybelt" item_state = "military" + max_w_class = WEIGHT_CLASS_SMALL + +/obj/item/weapon/storage/belt/military/abductor + name = "agent belt" + desc = "A belt used by abductor agents." + icon = 'icons/obj/abductor.dmi' + icon_state = "belt" + item_state = "security" + +/obj/item/weapon/storage/belt/military/abductor/full/New() + ..() + new /obj/item/weapon/screwdriver/abductor(src) + new /obj/item/weapon/wrench/abductor(src) + new /obj/item/weapon/weldingtool/abductor(src) + new /obj/item/weapon/crowbar/abductor(src) + new /obj/item/weapon/wirecutters/abductor(src) + new /obj/item/device/multitool/abductor(src) + new /obj/item/stack/cable_coil(src, 30, "white") /obj/item/weapon/storage/belt/military/assault name = "assault belt" @@ -253,12 +283,12 @@ max_w_class = 4 // Set to this so the light replacer can fit. use_item_overlays = 1 can_hold = list( - "/obj/item/weapon/grenade/chem_grenade/cleaner", - "/obj/item/device/lightreplacer", - "/obj/item/device/flashlight", - "/obj/item/weapon/reagent_containers/spray", - "/obj/item/weapon/soap", - "/obj/item/weapon/holosign_creator" + /obj/item/weapon/grenade/chem_grenade/cleaner, + /obj/item/device/lightreplacer, + /obj/item/device/flashlight, + /obj/item/weapon/reagent_containers/spray, + /obj/item/weapon/soap, + /obj/item/weapon/holosign_creator ) /obj/item/weapon/storage/belt/janitor/full/New() @@ -280,7 +310,7 @@ max_w_class = 1 max_combined_w_class = 6 storage_slots = 6 - can_hold = list("/obj/item/device/mobcapsule") + can_hold = list(/obj/item/device/mobcapsule) /obj/item/weapon/storage/belt/lazarus/New() ..() @@ -309,7 +339,7 @@ item_state = "bandolier" storage_slots = 8 can_hold = list( - "/obj/item/ammo_casing/shotgun" + /obj/item/ammo_casing/shotgun ) /obj/item/weapon/storage/belt/bandolier/New() @@ -351,8 +381,8 @@ storage_slots = 1 max_w_class = 3 can_hold = list( - "/obj/item/weapon/gun/projectile/automatic/pistol", - "/obj/item/weapon/gun/projectile/revolver/detective" + /obj/item/weapon/gun/projectile/automatic/pistol, + /obj/item/weapon/gun/projectile/revolver/detective ) /obj/item/weapon/storage/belt/wands @@ -363,7 +393,7 @@ storage_slots = 6 use_item_overlays = 1 can_hold = list( - "/obj/item/weapon/gun/magic/wand" + /obj/item/weapon/gun/magic/wand ) /obj/item/weapon/storage/belt/wands/full/New() @@ -447,7 +477,7 @@ storage_slots = 1 w_class = 4 max_w_class = 4 - can_hold = list("/obj/item/weapon/melee/rapier") + can_hold = list(/obj/item/weapon/melee/rapier) /obj/item/weapon/storage/belt/rapier/update_icon() icon_state = "[initial(icon_state)]" @@ -505,8 +535,8 @@ origin_tech = "bluespace=4;syndicate=2" allow_quick_empty = 1 can_hold = list( - "/obj/item/weapon/grenade/smokebomb", - "/obj/item/weapon/restraints/legcuffs/bola" + /obj/item/weapon/grenade/smokebomb, + /obj/item/weapon/restraints/legcuffs/bola ) flags = NODROP @@ -554,48 +584,6 @@ if(H.s_active && H.s_active == src) H.s_active.show_to(H) - -/* DEPRECATED DUE TO SUPERHERO CODE AND NODROP - // As a last resort, the belt can be used as a plastic explosive with a fixed timer (15 seconds). Naturally, you'll lose all your gear... - // Of course, it could be worse. It could spawn a singularity! -/obj/item/weapon/storage/belt/bluespace/owlman/afterattack(atom/target as obj|turf, mob/user as mob, flag) - if(!flag) - return - if(istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle) || istype(target, /obj/item/weapon/storage) || istype(target, /obj/structure/table) || istype(target, /obj/structure/closet)) - return - to_chat(user, "Planting explosives...") - user.visible_message("[user.name] is fiddling with their toolbelt.") - if(ismob(target)) - user.create_attack_log(" [user.real_name] tried planting [name] on [target:real_name] ([target:ckey])") - log_attack(" [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])") - user.visible_message("\red [user.name] is trying to strap a belt to [target.name]!") - - - if(do_after(user, 50, target = target) && in_range(user, target)) - user.drop_item() - target = target - loc = null - var/location - if(isturf(target)) location = target - if(ismob(target)) - target:create_attack_log(" Had the [name] planted on them by [user.real_name] ([user.ckey])") - user.visible_message("\red [user.name] finished planting an explosive on [target.name]!") - target.overlays += image('icons/obj/assemblies.dmi', "plastic-explosive2") - to_chat(user, "You sacrifice your belt for the sake of justice. Timer counting down from 15.") - spawn(150) - if(target) - if(ismob(target) || isobj(target)) - location = target.loc // These things can move - explosion(location, -1, -1, 2, 3) - if(istype(target, /turf/simulated/wall)) target:dismantle_wall(1) - else target.ex_act(1) - if(isobj(target)) - if(target) - qdel(target) - if(src) - qdel(src) -*/ - /obj/item/weapon/storage/belt/bluespace/attack(mob/M as mob, mob/user as mob, def_zone) return diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 88820290a48..793e5761b26 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -390,7 +390,7 @@ icon = 'icons/obj/food/food.dmi' icon_state = "monkeycubebox" storage_slots = 7 - can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/monkeycube") + can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/monkeycube) var/monkey_cube_type = /obj/item/weapon/reagent_containers/food/snacks/monkeycube /obj/item/weapon/storage/box/monkeycubes/New() @@ -561,7 +561,7 @@ icon = 'icons/obj/toy.dmi' icon_state = "spbox" storage_slots = 8 - can_hold = list("/obj/item/toy/snappop") + can_hold = list(/obj/item/toy/snappop) New() ..() for(var/i=1; i <= storage_slots; i++) @@ -621,7 +621,7 @@ item_state = "syringe_kit" foldable = /obj/item/stack/sheet/cardboard //BubbleWrap storage_slots=21 - can_hold = list("/obj/item/weapon/light/tube", "/obj/item/weapon/light/bulb") + can_hold = list(/obj/item/weapon/light/tube, /obj/item/weapon/light/bulb) max_combined_w_class = 21 use_to_pickup = 1 // for picking up broken bulbs, not that most people will try diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 168196f0480..c20cec521c6 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -48,7 +48,7 @@ icon_type = "donut" name = "donut box" storage_slots = 6 - can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/donut") + can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/donut) /obj/item/weapon/storage/fancy/donut_box/New() @@ -66,7 +66,7 @@ icon_type = "egg" name = "egg box" storage_slots = 12 - can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/egg") + can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/egg) /obj/item/weapon/storage/fancy/egg_box/New() ..() @@ -119,7 +119,7 @@ storage_slots = 6 icon_type = "crayon" can_hold = list( - "/obj/item/toy/crayon" + /obj/item/toy/crayon ) /obj/item/weapon/storage/fancy/crayons/New() @@ -163,12 +163,12 @@ slot_flags = SLOT_BELT storage_slots = 6 max_combined_w_class = 6 - can_hold = list("/obj/item/clothing/mask/cigarette", - "/obj/item/weapon/lighter", - "/obj/item/weapon/match") - cant_hold = list("/obj/item/clothing/mask/cigarette/cigar", - "/obj/item/clothing/mask/cigarette/pipe", - "/obj/item/weapon/lighter/zippo") + can_hold = list(/obj/item/clothing/mask/cigarette, + /obj/item/weapon/lighter, + /obj/item/weapon/match) + cant_hold = list(/obj/item/clothing/mask/cigarette/cigar, + /obj/item/clothing/mask/cigarette/pipe, + /obj/item/weapon/lighter/zippo) icon_type = "cigarette" var/list/unlaced_cigarettes = list() // Cigarettes that haven't received reagents yet var/default_reagents = list("nicotine" = 15) // List of reagents to pre-generate for each cigarette @@ -323,7 +323,7 @@ icon_state = "cig_paper_pack" storage_slots = 10 icon_type = "rolling paper" - can_hold = list("/obj/item/weapon/rollingpaper") + can_hold = list(/obj/item/weapon/rollingpaper) /obj/item/weapon/storage/fancy/rollingpapers/New() ..() @@ -345,7 +345,7 @@ icon_type = "vial" name = "vial storage box" storage_slots = 6 - can_hold = list("/obj/item/weapon/reagent_containers/glass/beaker/vial") + can_hold = list(/obj/item/weapon/reagent_containers/glass/beaker/vial) /obj/item/weapon/storage/fancy/vials/New() @@ -361,7 +361,7 @@ icon_state = "vialbox0" item_state = "syringe_kit" max_w_class = 3 - can_hold = list("/obj/item/weapon/reagent_containers/glass/beaker/vial") + can_hold = list(/obj/item/weapon/reagent_containers/glass/beaker/vial) max_combined_w_class = 14 //The sum of the w_classes of all the items in this storage item. storage_slots = 6 req_access = list(access_virology) diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 67d44c53b2d..5ab8713a49a 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -184,8 +184,8 @@ max_w_class = 4 max_combined_w_class = 21 storage_slots = 10 - can_hold = list("/obj/item/roller","/obj/item/weapon/bonesetter","/obj/item/weapon/bonegel", "/obj/item/weapon/scalpel", "/obj/item/weapon/hemostat", - "/obj/item/weapon/cautery", "/obj/item/weapon/retractor", "/obj/item/weapon/FixOVein", "/obj/item/weapon/surgicaldrill", "/obj/item/weapon/circular_saw") + can_hold = list(/obj/item/roller,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel, /obj/item/weapon/scalpel, /obj/item/weapon/hemostat, + /obj/item/weapon/cautery, /obj/item/weapon/retractor, /obj/item/weapon/FixOVein, /obj/item/weapon/surgicaldrill, /obj/item/weapon/circular_saw) /obj/item/weapon/storage/firstaid/surgery/New() ..() @@ -210,7 +210,7 @@ icon = 'icons/obj/chemical.dmi' item_state = "contsolid" w_class = 2 - can_hold = list("/obj/item/weapon/reagent_containers/food/pill","/obj/item/weapon/dice","/obj/item/weapon/paper") + can_hold = list(/obj/item/weapon/reagent_containers/food/pill, /obj/item/weapon/dice, /obj/item/weapon/paper) allow_quick_gather = 1 use_to_pickup = 1 storage_slots = 14 diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index e848eec1aca..9ae4020c84d 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -232,7 +232,7 @@ max_w_class = 8 anchored = 1 density = 0 - cant_hold = list("/obj/item/weapon/storage/secure/briefcase") + cant_hold = list(/obj/item/weapon/storage/secure/briefcase) /obj/item/weapon/storage/secure/safe/New() ..() diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index cdf123f2982..c212fcc476e 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -242,23 +242,15 @@ return 0 //Storage item is full if(can_hold.len) - var/ok = 0 - for(var/A in can_hold) - if(istype(W, text2path(A) )) - ok = 1 - break - if(!ok) + if(!is_type_in_typecache(W, can_hold)) if(!stop_messages) - if(istype(W, /obj/item/weapon/hand_labeler)) - return 0 to_chat(usr, "[src] cannot hold [W].") return 0 - for(var/A in cant_hold) //Check for specific items which this container can't hold. - if(istype(W, text2path(A) )) - if(!stop_messages) - to_chat(usr, "[src] cannot hold [W].") - return 0 + if(is_type_in_typecache(W, cant_hold)) //Check for specific items which this container can't hold. + if(!stop_messages) + to_chat(usr, "[src] cannot hold [W].") + return 0 if(W.w_class > max_w_class) if(!stop_messages) @@ -432,6 +424,8 @@ remove_from_storage(I, T) /obj/item/weapon/storage/New() + can_hold = typecacheof(can_hold) + cant_hold = typecacheof(cant_hold) if(allow_quick_empty) verbs += /obj/item/weapon/storage/verb/quick_empty @@ -455,7 +449,6 @@ src.closer.layer = 20 src.closer.plane = HUD_PLANE orient2hud() - return /obj/item/weapon/storage/Destroy() for(var/obj/O in contents) diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index 74d4093beb5..cfdbe4d24fd 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -15,41 +15,35 @@ attack_verb = list("robusted") hitsound = 'sound/weapons/smash.ogg' - New() - ..() - if(src.type == /obj/item/weapon/storage/toolbox) - to_chat(world, "BAD: [src] ([src.type]) spawned at [src.x] [src.y] [src.z]") - qdel(src) - /obj/item/weapon/storage/toolbox/emergency name = "emergency toolbox" icon_state = "red" item_state = "toolbox_red" - New() - ..() - new /obj/item/weapon/crowbar/red(src) - new /obj/item/weapon/weldingtool/mini(src) - new /obj/item/weapon/extinguisher/mini(src) - if(prob(50)) - new /obj/item/device/flashlight(src) - else - new /obj/item/device/flashlight/flare(src) - new /obj/item/device/radio(src) +/obj/item/weapon/storage/toolbox/emergency/New() + ..() + new /obj/item/weapon/crowbar/red(src) + new /obj/item/weapon/weldingtool/mini(src) + new /obj/item/weapon/extinguisher/mini(src) + if(prob(50)) + new /obj/item/device/flashlight(src) + else + new /obj/item/device/flashlight/flare(src) + new /obj/item/device/radio(src) /obj/item/weapon/storage/toolbox/mechanical name = "mechanical toolbox" icon_state = "blue" item_state = "toolbox_blue" - New() - ..() - new /obj/item/weapon/screwdriver(src) - new /obj/item/weapon/wrench(src) - new /obj/item/weapon/weldingtool(src) - new /obj/item/weapon/crowbar(src) - new /obj/item/device/analyzer(src) - new /obj/item/weapon/wirecutters(src) +/obj/item/weapon/storage/toolbox/mechanical/New() + ..() + new /obj/item/weapon/screwdriver(src) + new /obj/item/weapon/wrench(src) + new /obj/item/weapon/weldingtool(src) + new /obj/item/weapon/crowbar(src) + new /obj/item/device/analyzer(src) + new /obj/item/weapon/wirecutters(src) /obj/item/weapon/storage/toolbox/mechanical/greytide flags = NODROP @@ -59,19 +53,19 @@ icon_state = "yellow" item_state = "toolbox_yellow" - New() - ..() - var/color = pick("red","yellow","green","blue","pink","orange","cyan","white") - new /obj/item/weapon/screwdriver(src) - new /obj/item/weapon/wirecutters(src) - new /obj/item/device/t_scanner(src) - new /obj/item/weapon/crowbar(src) - new /obj/item/stack/cable_coil(src,30,color) - new /obj/item/stack/cable_coil(src,30,color) - if(prob(5)) - new /obj/item/clothing/gloves/color/yellow(src) - else - new /obj/item/stack/cable_coil(src,30,color) +/obj/item/weapon/storage/toolbox/electrical/New() + ..() + var/pickedcolor = pick("red","yellow","green","blue","pink","orange","cyan","white") + new /obj/item/weapon/screwdriver(src) + new /obj/item/weapon/wirecutters(src) + new /obj/item/device/t_scanner(src) + new /obj/item/weapon/crowbar(src) + new /obj/item/stack/cable_coil(src, 30, pickedcolor) + new /obj/item/stack/cable_coil(src, 30, pickedcolor) + if(prob(5)) + new /obj/item/clothing/gloves/color/yellow(src) + else + new /obj/item/stack/cable_coil(src, 30, pickedcolor) /obj/item/weapon/storage/toolbox/syndicate name = "suspicious looking toolbox" @@ -82,12 +76,47 @@ force = 15.0 throwforce = 18.0 - New() - ..() - new /obj/item/weapon/screwdriver(src, "red") - new /obj/item/weapon/wrench(src) - new /obj/item/weapon/weldingtool/largetank(src) - new /obj/item/weapon/crowbar/red(src) - new /obj/item/weapon/wirecutters(src, "red") - new /obj/item/device/multitool(src) - new /obj/item/clothing/gloves/combat(src) \ No newline at end of file +/obj/item/weapon/storage/toolbox/syndicate/New() + ..() + new /obj/item/weapon/screwdriver(src, "red") + new /obj/item/weapon/wrench(src) + new /obj/item/weapon/weldingtool/largetank(src) + new /obj/item/weapon/crowbar/red(src) + new /obj/item/weapon/wirecutters(src, "red") + new /obj/item/device/multitool(src) + new /obj/item/clothing/gloves/combat(src) + +/obj/item/weapon/storage/toolbox/drone + name = "mechanical toolbox" + icon_state = "blue" + item_state = "toolbox_blue" + +/obj/item/weapon/storage/toolbox/drone/New() + ..() + var/pickedcolor = pick("red","yellow","green","blue","pink","orange","cyan","white") + new /obj/item/weapon/screwdriver(src) + new /obj/item/weapon/wrench(src) + new /obj/item/weapon/weldingtool(src) + new /obj/item/weapon/crowbar(src) + new /obj/item/stack/cable_coil(src, 30, pickedcolor) + new /obj/item/weapon/wirecutters(src) + new /obj/item/device/multitool(src) + +/obj/item/weapon/storage/toolbox/brass + name = "brass box" + desc = "A huge brass box with several indentations in its surface." + icon_state = "brassbox" + item_state = null + w_class = WEIGHT_CLASS_HUGE + max_w_class = WEIGHT_CLASS_NORMAL + max_combined_w_class = 28 + storage_slots = 28 + attack_verb = list("robusted", "crushed", "smashed") + +/obj/item/weapon/storage/toolbox/brass/prefilled/New() + ..() + new /obj/item/weapon/screwdriver/brass(src) + new /obj/item/weapon/wirecutters/brass(src) + new /obj/item/weapon/wrench/brass(src) + new /obj/item/weapon/crowbar/brass(src) + new /obj/item/weapon/weldingtool/experimental/brass(src) \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index e3f21a93d30..125d97f132b 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -88,7 +88,7 @@ /obj/item/weapon/storage/box/syndie_kit/space name = "Boxed Space Suit and Helmet" - can_hold = list("/obj/item/clothing/suit/space/syndicate/black/red", "/obj/item/clothing/head/helmet/space/syndicate/black/red") + can_hold = list(/obj/item/clothing/suit/space/syndicate/black/red, /obj/item/clothing/head/helmet/space/syndicate/black/red) max_w_class = 3 /obj/item/weapon/storage/box/syndie_kit/space/New() @@ -99,7 +99,7 @@ /obj/item/weapon/storage/box/syndie_kit/hardsuit name = "Boxed Blood Red Suit and Helmet" - can_hold = list("/obj/item/clothing/suit/space/rig/syndi", "/obj/item/clothing/head/helmet/space/rig/syndi") + can_hold = list(/obj/item/clothing/suit/space/rig/syndi, /obj/item/clothing/head/helmet/space/rig/syndi) max_w_class = 3 /obj/item/weapon/storage/box/syndie_kit/hardsuit/New() @@ -110,7 +110,7 @@ /obj/item/weapon/storage/box/syndie_kit/elite_hardsuit name = "Boxed Elite Syndicate Hardsuit and Helmet" - can_hold = list("/obj/item/clothing/suit/space/rig/syndi/elite", "/obj/item/clothing/head/helmet/space/rig/syndi/elite") + can_hold = list(/obj/item/clothing/suit/space/rig/syndi/elite, /obj/item/clothing/head/helmet/space/rig/syndi/elite) max_w_class = 3 /obj/item/weapon/storage/box/syndie_kit/elite_hardsuit/New() @@ -120,7 +120,7 @@ /obj/item/weapon/storage/box/syndie_kit/shielded_hardsuit name = "Boxed Shielded Syndicate Hardsuit and Helmet" - can_hold = list("/obj/item/clothing/suit/space/rig/shielded/syndi", "/obj/item/clothing/head/helmet/space/rig/shielded/syndi") + can_hold = list(/obj/item/clothing/suit/space/rig/shielded/syndi, /obj/item/clothing/head/helmet/space/rig/shielded/syndi) max_w_class = 4 /obj/item/weapon/storage/box/syndie_kit/shielded_hardsuit/New() diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index 5bc1ae65e84..ad022a9e2c4 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -7,25 +7,25 @@ w_class = 2 burn_state = FLAMMABLE can_hold = list( - "/obj/item/weapon/spacecash", - "/obj/item/weapon/card", - "/obj/item/clothing/mask/cigarette", - "/obj/item/device/flashlight/pen", - "/obj/item/seeds", - "/obj/item/stack/medical", - "/obj/item/toy/crayon", - "/obj/item/weapon/coin", - "/obj/item/weapon/dice", - "/obj/item/weapon/disk", - "/obj/item/weapon/implanter", - "/obj/item/weapon/lighter", - "/obj/item/weapon/match", - "/obj/item/weapon/paper", - "/obj/item/weapon/pen", - "/obj/item/weapon/photo", - "/obj/item/weapon/reagent_containers/dropper", - "/obj/item/weapon/screwdriver", - "/obj/item/weapon/stamp") + /obj/item/weapon/spacecash, + /obj/item/weapon/card, + /obj/item/clothing/mask/cigarette, + /obj/item/device/flashlight/pen, + /obj/item/seeds, + /obj/item/stack/medical, + /obj/item/toy/crayon, + /obj/item/weapon/coin, + /obj/item/weapon/dice, + /obj/item/weapon/disk, + /obj/item/weapon/implanter, + /obj/item/weapon/lighter, + /obj/item/weapon/match, + /obj/item/weapon/paper, + /obj/item/weapon/pen, + /obj/item/weapon/photo, + /obj/item/weapon/reagent_containers/dropper, + /obj/item/weapon/screwdriver, + /obj/item/weapon/stamp) slot_flags = SLOT_ID var/obj/item/weapon/card/id/front_id = null diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 7e0c7296fc9..1816e6287e6 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -22,60 +22,137 @@ slot_flags = SLOT_BELT force = 5 throwforce = 7 - w_class = 2 + usesound = 'sound/items/Ratchet.ogg' + w_class = WEIGHT_CLASS_SMALL materials = list(MAT_METAL=150) origin_tech = "materials=1;engineering=1" attack_verb = list("bashed", "battered", "bludgeoned", "whacked") + toolspeed = 1 + +/obj/item/weapon/wrench/suicide_act(mob/user) + user.visible_message("[user] is beating themself to death with [src]! It looks like they're trying to commit suicide!") + playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1) + return (BRUTELOSS) + +/obj/item/weapon/wrench/cyborg + name = "automatic wrench" + desc = "An advanced robotic wrench. Can be found in construction cyborgs." + toolspeed = 0.5 + +/obj/item/weapon/wrench/brass + name = "brass wrench" + desc = "A brass wrench. It's faintly warm to the touch." + icon_state = "wrench_brass" + toolspeed = 0.5 + +/obj/item/weapon/wrench/abductor + name = "alien wrench" + desc = "A polarized wrench. It causes anything placed between the jaws to turn." + icon = 'icons/obj/abductor.dmi' + icon_state = "wrench" + usesound = 'sound/effects/EMPulse.ogg' + toolspeed = 0.1 + origin_tech = "materials=5;engineering=5;abductor=3" + +/obj/item/weapon/wrench/power + name = "Hand Drill" + desc = "A simple powered drill with a bolt bit" + icon_state = "drill_bolt" + item_state = "drill" + usesound = 'sound/items/drill_use.ogg' + materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25) + origin_tech = "materials=2;engineering=2" //done for balance reasons, making them high value for research, but harder to get + force = 8 //might or might not be too high, subject to change + throwforce = 8 + attack_verb = list("drilled", "screwed", "jabbed") + toolspeed = 0.25 + +/obj/item/weapon/wrench/power/attack_self(mob/user) + playsound(get_turf(user),'sound/items/change_drill.ogg', 50, 1) + var/obj/item/weapon/wirecutters/power/s_drill = new /obj/item/weapon/screwdriver/power + to_chat(user, "You attach the screw driver bit to [src].") + qdel(src) + user.put_in_active_hand(s_drill) + +/obj/item/weapon/wrench/power/suicide_act(mob/user) + user.visible_message("[user] is pressing [src] against their head! It looks like they're trying to commit suicide!") + return (BRUTELOSS) + +/obj/item/weapon/wrench/medical + name = "medical wrench" + desc = "A medical wrench with common (medical?) uses. Can be found in your hand." + icon_state = "wrench_medical" + force = 2 //MEDICAL + throwforce = 4 + origin_tech = "materials=1;engineering=1;biotech=3" + attack_verb = list("wrenched", "medicaled", "tapped", "jabbed", "whacked") + +/obj/item/weapon/wrench/medical/suicide_act(mob/user) + user.visible_message("[user] is praying to the medical wrench to take their soul. It looks like they're trying to commit suicide!") + // TODO Make them glow with the power of the M E D I C A L W R E N C H + // during their ascension + + // Stun stops them from wandering off + user.Stun(5) + playsound(loc, 'sound/effects/pray.ogg', 50, 1, -1) + + // Let the sound effect finish playing + sleep(20) + + if(!user) + return + + for(var/obj/item/W in user) + user.unEquip(W) + + var/obj/item/weapon/wrench/medical/W = new /obj/item/weapon/wrench/medical(loc) + W.add_fingerprint(user) + W.desc += " For some reason, it reminds you of [user.name]." + + if(!user) + return + + user.dust() + return OXYLOSS //Screwdriver /obj/item/weapon/screwdriver name = "screwdriver" desc = "You can be totally screwy with this." icon = 'icons/obj/tools.dmi' - icon_state = "screwdriver" + icon_state = null flags = CONDUCT slot_flags = SLOT_BELT force = 5 - w_class = 1 + w_class = WEIGHT_CLASS_TINY throwforce = 5 throw_speed = 3 throw_range = 5 materials = list(MAT_METAL=75) attack_verb = list("stabbed") hitsound = 'sound/weapons/bladeslice.ogg' + usesound = 'sound/items/Screwdriver.ogg' + toolspeed = 1 + +/obj/item/weapon/screwdriver/nuke + name = "screwdriver" + desc = "A screwdriver with an ultra thin tip." + icon_state = "screwdriver_nuke" + toolspeed = 0.5 /obj/item/weapon/screwdriver/suicide_act(mob/user) - to_chat(viewers(user), pick("[user] is stabbing the [name] into \his temple! It looks like \he's trying to commit suicide.", \ - "[user] is stabbing the [name] into \his heart! It looks like \he's trying to commit suicide.")) + user.visible_message("[user] is stabbing [src] into their [pick("temple", "heart")]! It looks like they're trying to commit suicide!") return(BRUTELOSS) -/obj/item/weapon/screwdriver/New() - switch(pick("red","blue","purple","brown","green","cyan","yellow")) - if("red") - icon_state = "screwdriver2" - item_state = "screwdriver" - if("blue") - icon_state = "screwdriver" - item_state = "screwdriver_blue" - if("purple") - icon_state = "screwdriver3" - item_state = "screwdriver_purple" - if("brown") - icon_state = "screwdriver4" - item_state = "screwdriver_brown" - if("green") - icon_state = "screwdriver5" - item_state = "screwdriver_green" - if("cyan") - icon_state = "screwdriver6" - item_state = "screwdriver_cyan" - if("yellow") - icon_state = "screwdriver7" - item_state = "screwdriver_yellow" +/obj/item/weapon/screwdriver/New(loc, var/param_color = null) + ..() + if(!icon_state) + if(!param_color) + param_color = pick("red","blue","pink","brown","green","cyan","yellow") + icon_state = "screwdriver_[param_color]" - if(prob(75)) + if (prob(75)) src.pixel_y = rand(0, 16) - return /obj/item/weapon/screwdriver/attack(mob/living/carbon/M, mob/living/carbon/user) if(!istype(M) || user.a_intent == I_HELP) @@ -85,49 +162,150 @@ if((CLUMSY in user.mutations) && prob(50)) M = user return eyestab(M,user) + +/obj/item/weapon/screwdriver/brass + name = "brass screwdriver" + desc = "A screwdriver made of brass. The handle feels freezing cold." + icon_state = "screwdriver_brass" + toolspeed = 0.5 + +/obj/item/weapon/screwdriver/abductor + name = "alien screwdriver" + desc = "An ultrasonic screwdriver." + icon = 'icons/obj/abductor.dmi' + icon_state = "screwdriver" + usesound = 'sound/items/PSHOOM.ogg' + toolspeed = 0.1 + +/obj/item/weapon/screwdriver/power + name = "Hand Drill" + desc = "A simple hand drill with a screwdriver bit attached." + icon_state = "drill_screw" + item_state = "drill" + materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25) + origin_tech = "materials=2;engineering=2" //done for balance reasons, making them high value for research, but harder to get + force = 8 //might or might not be too high, subject to change + throwforce = 8 + throw_speed = 2 + throw_range = 3//it's heavier than a screw driver/wrench, so it does more damage, but can't be thrown as far + attack_verb = list("drilled", "screwed", "jabbed","whacked") + hitsound = 'sound/items/drill_hit.ogg' + usesound = 'sound/items/drill_use.ogg' + toolspeed = 0.25 + +/obj/item/weapon/screwdriver/power/suicide_act(mob/user) + user.visible_message("[user] is putting [src] to their temple. It looks like they're trying to commit suicide!") + return(BRUTELOSS) + +/obj/item/weapon/screwdriver/power/attack_self(mob/user) + playsound(get_turf(user), 'sound/items/change_drill.ogg', 50, 1) + var/obj/item/weapon/wrench/power/b_drill = new /obj/item/weapon/wrench/power + user << "You attach the bolt driver bit to [src]." + qdel(src) + user.put_in_active_hand(b_drill) + +/obj/item/weapon/screwdriver/cyborg + name = "powered screwdriver" + desc = "An electrical screwdriver, designed to be both precise and quick." + usesound = 'sound/items/drill_use.ogg' + toolspeed = 0.5 //Wirecutters /obj/item/weapon/wirecutters name = "wirecutters" desc = "This cuts wires." icon = 'icons/obj/tools.dmi' - icon_state = "cutters" + icon_state = null flags = CONDUCT slot_flags = SLOT_BELT force = 6 throw_speed = 3 throw_range = 7 - w_class = 2 + w_class = WEIGHT_CLASS_SMALL materials = list(MAT_METAL=80) origin_tech = "materials=1;engineering=1" attack_verb = list("pinched", "nipped") hitsound = 'sound/items/Wirecutter.ogg' + usesound = 'sound/items/Wirecutter.ogg' sharp = 1 edge = 1 + toolspeed = 1 /obj/item/weapon/wirecutters/New(loc, param_color = null) ..() - if((!param_color && prob(50)) || param_color == "yellow") - icon_state = "cutters-y" - item_state = "cutters_yellow" + if(!icon_state) + if(!param_color) + param_color = pick("yellow", "red") + icon_state = "cutters_[param_color]" -/obj/item/weapon/wirecutters/attack(mob/living/carbon/human/H, mob/user) - if(istype(H) && H.handcuffed) - if(istype(H.handcuffed, /obj/item/weapon/restraints/handcuffs/cable)) - usr.visible_message("\The [usr] cuts \the [H]'s restraints with \the [src]!",\ - "You cut \the [H]'s restraints with \the [src]!",\ - "You hear cable being cut.") - H.handcuffed = null - if(H.buckled && H.buckled.buckle_requires_restraints) - H.buckled.unbuckle_mob() - H.update_handcuffed() - return +/obj/item/weapon/wirecutters/attack(mob/living/carbon/C, mob/user) + if(istype(C) && C.handcuffed && istype(C.handcuffed, /obj/item/weapon/restraints/handcuffs/cable)) + user.visible_message("[user] cuts [C]'s restraints with [src]!") + qdel(C.handcuffed) + C.handcuffed = null + if(C.buckled && C.buckled.buckle_requires_restraints) + C.buckled.unbuckle_mob(C) + C.update_handcuffed() + return else ..() + +/obj/item/weapon/wirecutters/suicide_act(mob/user) + user.visible_message("[user] is cutting at their arteries with [src]! It looks like they're trying to commit suicide!") + playsound(loc, usesound, 50, 1, -1) + return (BRUTELOSS) + +/obj/item/weapon/wirecutters/brass + name = "brass wirecutters" + desc = "A pair of wirecutters made of brass. The handle feels freezing cold to the touch." + icon_state = "cutters_brass" + toolspeed = 0.5 + +/obj/item/weapon/wirecutters/abductor + name = "alien wirecutters" + desc = "Extremely sharp wirecutters, made out of a silvery-green metal." + icon = 'icons/obj/abductor.dmi' + icon_state = "cutters" + toolspeed = 0.1 + origin_tech = "materials=5;engineering=4;abductor=3" + +/obj/item/weapon/wirecutters/cyborg + name = "wirecutters" + desc = "This cuts wires." + toolspeed = 0.5 + +/obj/item/weapon/wirecutters/power + name = "Jaws of Life" + desc = "A set of jaws of life, the magic of science has managed to fit it down into a device small enough to fit in a tool belt. It's fitted with a cutting head." + icon_state = "jaws_cutter" + item_state = "jawsoflife" + origin_tech = "materials=2;engineering=2" + materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25) + usesound = 'sound/items/jaws_cut.ogg' + toolspeed = 0.25 + +/obj/item/weapon/wirecutters/power/suicide_act(mob/user) + user.visible_message("[user] is wrapping \the [src] around their neck. It looks like they're trying to rip their head off!") + playsound(loc, 'sound/items/jaws_cut.ogg', 50, 1, -1) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + var/obj/item/organ/external/head/head = H.organs_by_name["head"] + if(head) + head.droplimb(0, DROPLIMB_BLUNT, FALSE, TRUE) + playsound(loc,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1) + return (BRUTELOSS) + +/obj/item/weapon/wirecutters/power/attack_self(mob/user) + playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1) + var/obj/item/weapon/crowbar/power/pryjaws = new /obj/item/weapon/crowbar/power + to_chat(user, "You attach the pry jaws to [src].") + qdel(src) + user.put_in_active_hand(pryjaws) //Welding Tool /obj/item/weapon/weldingtool name = "welding tool" + desc = "A standard edition welder provided by Nanotrasen." icon = 'icons/obj/tools.dmi' icon_state = "welder" item_state = "welder" @@ -137,15 +315,21 @@ throwforce = 5 throw_speed = 3 throw_range = 5 - w_class = 2 + hitsound = "swing_hit" + usesound = 'sound/items/Welder.ogg' + var/acti_sound = 'sound/items/WelderActivate.ogg' + var/deac_sound = 'sound/items/WelderDeactivate.ogg' + w_class = WEIGHT_CLASS_SMALL materials = list(MAT_METAL=70, MAT_GLASS=30) - origin_tech = "engineering=1" + origin_tech = "engineering=1;plasmatech=1" + toolspeed = 1 var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2) var/status = 1 //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower) var/max_fuel = 20 //The max amount of fuel the welder can hold var/change_icons = 1 var/can_off_process = 0 var/light_intensity = 2 //how powerful the emitted light is when used. + var/nextrefueltick = 0 /obj/item/weapon/weldingtool/New() ..() @@ -158,7 +342,7 @@ to_chat(user, "It contains [get_fuel()] unit\s of fuel out of [max_fuel].") /obj/item/weapon/weldingtool/suicide_act(mob/user) - user.visible_message("[user] welds \his every orifice closed! It looks like \he's trying to commit suicide..") + user.visible_message("[user] welds their every orifice closed! It looks like they're trying to commit suicide!") return (FIRELOSS) /obj/item/weapon/weldingtool/proc/update_torch() @@ -179,13 +363,6 @@ icon_state = "[initial(icon_state)][ratio]" update_torch() -/obj/item/weapon/weldingtool/attackby(obj/item/I, mob/user, params) - if(isscrewdriver(I)) - flamethrower_screwdriver(I, user) - if(istype(I, /obj/item/stack/rods)) - flamethrower_rods(I, user) - ..() - /obj/item/weapon/weldingtool/process() switch(welding) if(0) @@ -211,6 +388,14 @@ location = get_turf(M) if(isturf(location)) location.hotspot_expose(700, 5) + +/obj/item/weapon/weldingtool/attackby(obj/item/I, mob/user, params) + if(isscrewdriver(I)) + flamethrower_screwdriver(I, user) + else if(istype(I, /obj/item/stack/rods)) + flamethrower_rods(I, user) + else + ..() /obj/item/weapon/weldingtool/attack(mob/M, mob/user) if(ishuman(M)) @@ -233,7 +418,7 @@ if(!do_mob(user, H, 10)) return 1 if(remove_fuel(1,null)) - playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) + playsound(src.loc, usesound, 50, 1) S.heal_damage(15,0,0,1) user.visible_message("\The [user] patches some dents on \the [M]'s [S.name] with \the [src].") else if(S.open != 2) @@ -250,10 +435,13 @@ /obj/item/weapon/weldingtool/afterattack(atom/O, mob/user, proximity) if(!proximity) return + if(welding) remove_fuel(1) var/turf/location = get_turf(user) location.hotspot_expose(700, 50, 1) + if(get_fuel() <= 0) + set_light(0) if(isliving(O)) var/mob/living/L = O @@ -262,7 +450,10 @@ log_game("[key_name(user)] set [key_name(L)] on fire") /obj/item/weapon/weldingtool/attack_self(mob/user) - toggle(user) + switched_on(user) + if(welding) + set_light(light_intensity) + update_icon() //Returns the amount of fuel in the welder @@ -272,17 +463,17 @@ //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/weapon/weldingtool/proc/remove_fuel(amount = 1, mob/living/M = null) if(!welding || !check_fuel()) - return 0 + return FALSE if(get_fuel() >= amount) reagents.remove_reagent("fuel", amount) check_fuel() if(M) M.flash_eyes(light_intensity) - return 1 + return TRUE else if(M) to_chat(M, "\blue You need more welding fuel to complete this task.") - return 0 + return FALSE //Returns whether or not the welding tool is currently on. /obj/item/weapon/weldingtool/proc/isOn() @@ -291,43 +482,48 @@ //Turns off the welder if there is no more fuel (does this really need to be its own proc?) /obj/item/weapon/weldingtool/proc/check_fuel(mob/user) if(get_fuel() <= 0 && welding) - toggle(user, 1) + switched_on(user) update_icon() //mob icon update if(ismob(loc)) var/mob/M = loc M.update_inv_r_hand(0) M.update_inv_l_hand(0) - return 0 return 1 -//Toggles the welder off and on -/obj/item/weapon/weldingtool/proc/toggle(mob/user, message = 0) +//Switches the welder on +/obj/item/weapon/weldingtool/proc/switched_on(mob/user) if(!status) - to_chat(user, "[src] can't be turned on while unsecured!") + to_chat(user, "span class='warning'>[src] can't be turned on while unsecured!") return welding = !welding if(welding) if(get_fuel() >= 1) to_chat(user, "You switch [src] on.") + playsound(loc, acti_sound, 50, 1) force = 15 damtype = "fire" hitsound = 'sound/items/welder.ogg' update_icon() - processing_objects |= src + processing_objects.Add(src) else to_chat(user, "You need more fuel!") - welding = 0 + switched_off(user) else - if(!message) - to_chat(user, "You switch [src] off.") - else - visible_message("[src] shuts off!") - force = 3 - damtype = "brute" - hitsound = "swing_hit" - update_icon() + to_chat(user, "You switch [src] off.") + playsound(loc, deac_sound, 50, 1) + switched_off(user) + +//Switches the welder off +/obj/item/weapon/weldingtool/proc/switched_off(mob/user) + welding = 0 + set_light(0) + + force = 3 + damtype = "brute" + hitsound = "swing_hit" + update_icon() /obj/item/weapon/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user) if(welding) @@ -354,7 +550,6 @@ user.put_in_hands(F) else to_chat(user, "You need one rod to start building a flamethrower!") - return /obj/item/weapon/weldingtool/largetank name = "Industrial Welding Tool" @@ -362,9 +557,12 @@ icon_state = "indwelder" max_fuel = 40 materials = list(MAT_METAL=70, MAT_GLASS=60) - origin_tech = "engineering=2" + origin_tech = "engineering=2;plasmatech=2" /obj/item/weapon/weldingtool/largetank/cyborg + name = "integrated welding tool" + desc = "An advanced welder designed to be used in robotic systems." + toolspeed = 0.5 /obj/item/weapon/weldingtool/largetank/flamethrower_screwdriver() return @@ -374,12 +572,27 @@ desc = "A miniature welder used during emergencies." icon_state = "miniwelder" max_fuel = 10 - w_class = 1 + w_class = WEIGHT_CLASS_TINY materials = list(MAT_METAL=30, MAT_GLASS=10) change_icons = 0 /obj/item/weapon/weldingtool/mini/flamethrower_screwdriver() return + +/obj/item/weapon/weldingtool/abductor + name = "alien welding tool" + desc = "An alien welding tool. Whatever fuel it uses, it never runs out." + icon = 'icons/obj/abductor.dmi' + icon_state = "welder" + toolspeed = 0.1 + light_intensity = 0 + change_icons = 0 + origin_tech = "plasmatech=5;engineering=5;abductor=3" + +/obj/item/weapon/weldingtool/abductor/process() + if(get_fuel() <= max_fuel) + reagents.add_reagent("welding_fuel", 1) + ..() /obj/item/weapon/weldingtool/hugetank name = "Upgraded Welding Tool" @@ -387,9 +600,8 @@ icon_state = "upindwelder" item_state = "upindwelder" max_fuel = 80 - w_class = 3 materials = list(MAT_METAL=70, MAT_GLASS=120) - origin_tech = "engineering=3" + origin_tech = "engineering=3;plasmatech=2" /obj/item/weapon/weldingtool/experimental name = "Experimental Welding Tool" @@ -397,25 +609,25 @@ icon_state = "exwelder" item_state = "exwelder" max_fuel = 40 - w_class = 3 materials = list(MAT_METAL=70, MAT_GLASS=120) - origin_tech = "engineering=4;plasmatech=3" + origin_tech = "materials=4;engineering=4;bluespace=3;plasmatech=4" change_icons = 0 can_off_process = 1 light_intensity = 1 + toolspeed = 0.5 var/last_gen = 0 + +/obj/item/weapon/weldingtool/experimental/brass + name = "brass welding tool" + desc = "A brass welder that seems to constantly refuel itself. It is faintly warm to the touch." + icon_state = "brasswelder" + item_state = "brasswelder" -/obj/item/weapon/weldingtool/experimental/proc/fuel_gen() - if(!welding && !last_gen) - last_gen = 1 - reagents.add_reagent("fuel",1) - spawn(10) - last_gen = 0 - -/obj/item/weapon/weldingtool/experimental/process() +obj/item/weapon/weldingtool/experimental/process() ..() - if(reagents.total_volume < max_fuel) - fuel_gen() + if(get_fuel() < max_fuel && nextrefueltick < world.time) + nextrefueltick = world.time + 10 + reagents.add_reagent("fuel", 1) //Crowbar /obj/item/weapon/crowbar @@ -423,37 +635,87 @@ desc = "A small crowbar. This handy tool is useful for lots of things, such as prying floor tiles or opening unpowered doors." icon = 'icons/obj/tools.dmi' icon_state = "crowbar" + item_state = "crowbar" + usesound = 'sound/items/Crowbar.ogg' flags = CONDUCT slot_flags = SLOT_BELT force = 5 throwforce = 7 item_state = "crowbar" - w_class = 2 materials = list(MAT_METAL=50) - origin_tech = "engineering=1" + origin_tech = "engineering=1;combat=1" attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked") + toolspeed = 1 /obj/item/weapon/crowbar/red - icon_state = "red_crowbar" - item_state = "crowbar_red" + icon_state = "crowbar_red" + force = 8 + +/obj/item/weapon/crowbar/brass + name = "brass crowbar" + desc = "A brass crowbar. It feels faintly warm to the touch." + icon_state = "crowbar_brass" + toolspeed = 0.5 + +/obj/item/weapon/crowbar/abductor + name = "alien crowbar" + desc = "A hard-light crowbar. It appears to pry by itself, without any effort required." + icon = 'icons/obj/abductor.dmi' + usesound = 'sound/weapons/sonic_jackhammer.ogg' + icon_state = "crowbar" + toolspeed = 0.1 + origin_tech = "combat=4;engineering=4;abductor=3" /obj/item/weapon/crowbar/large name = "crowbar" desc = "It's a big crowbar. It doesn't fit in your pockets, because it's big." force = 12 - w_class = 3 + w_class = WEIGHT_CLASS_NORMAL throw_speed = 3 throw_range = 3 materials = list(MAT_METAL=70) icon_state = "crowbar_large" + item_state = "crowbar" + toolspeed = 0.5 + +/obj/item/weapon/crowbar/cyborg + name = "hydraulic crowbar" + desc = "A hydraulic prying tool, compact but powerful. Designed to replace crowbar in construction cyborgs." + usesound = 'sound/items/jaws_pry.ogg' + force = 10 + toolspeed = 0.5 +/obj/item/weapon/crowbar/power + name = "Jaws of Life" + desc = "A set of jaws of life, the magic of science has managed to fit it down into a device small enough to fit in a tool belt. It's fitted with a prying head" + icon_state = "jaws_pry" + item_state = "jawsoflife" + materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25) + origin_tech = "materials=2;engineering=2" + usesound = 'sound/items/jaws_pry.ogg' + force = 15 + toolspeed = 0.25 + +/obj/item/weapon/crowbar/power/suicide_act(mob/user) + user.visible_message("[user] is putting their head in [src], it looks like they're trying to commit suicide!") + playsound(loc, 'sound/items/jaws_pry.ogg', 50, 1, -1) + return (BRUTELOSS) + +/obj/item/weapon/crowbar/power/attack_self(mob/user) + playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1) + var/obj/item/weapon/wirecutters/power/cutjaws = new /obj/item/weapon/wirecutters/power + to_chat(user, "You attach the cutting jaws to [src].") + qdel(src) + user.put_in_active_hand(cutjaws) + +// Conversion kit /obj/item/weapon/conversion_kit name = "\improper Revolver Conversion Kit" desc = "A professional conversion kit used to convert any knock off revolver into the real deal capable of shooting lethal .357 rounds without the possibility of catastrophic failure" icon = 'icons/obj/weapons.dmi' icon_state = "kit" flags = CONDUCT - w_class = 2 + w_class = WEIGHT_CLASS_SMALL origin_tech = "combat=2" var/open = 0 @@ -466,5 +728,5 @@ /obj/item/weapon/conversion_kit/attack_self(mob/user) open = !open - to_chat(user, "\blue You [open?"open" : "close"] the conversion kit.") + to_chat(user, "You [open ? "open" : "close"] the conversion kit.") update_icon() diff --git a/code/modules/arcade/mob_hunt/mob_cards.dm b/code/modules/arcade/mob_hunt/mob_cards.dm index 16aea7ba55f..0479644ad85 100644 --- a/code/modules/arcade/mob_hunt/mob_cards.dm +++ b/code/modules/arcade/mob_hunt/mob_cards.dm @@ -35,7 +35,7 @@ /obj/item/weapon/storage/box/nanomob_booster_pack name = "Nano-Mob Hunter Trading Card Booster Pack" desc = "Contains 6 random Nano-Mob Hunter Trading Cards. May contain a holographic card!" - can_hold = list("/obj/item/weapon/nanomob_card") + can_hold = list(/obj/item/weapon/nanomob_card) /obj/item/weapon/storage/box/nanomob_booster_pack/New() ..() diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index aea6cf139f3..72fbdbc9b92 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -103,8 +103,7 @@ /obj/item/clothing/accessory/storage/knifeharness/New() ..() hold.max_combined_w_class = 4 - hold.can_hold = list("/obj/item/weapon/hatchet/unathiknife",\ - "/obj/item/weapon/kitchen/knife") + hold.can_hold = list(/obj/item/weapon/hatchet/unathiknife, /obj/item/weapon/kitchen/knife) new /obj/item/weapon/hatchet/unathiknife(hold) new /obj/item/weapon/hatchet/unathiknife(hold) \ No newline at end of file diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index c9365c57da4..7ac5d86a9d3 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -720,7 +720,7 @@ icon_state = "implant" max_w_class = 3 storage_slots = 2 - can_hold = list("/obj/item/weapon/mining_drone_cube","/obj/item/weapon/weldingtool/hugetank") + can_hold = list(/obj/item/weapon/mining_drone_cube, /obj/item/weapon/weldingtool/hugetank) /obj/item/weapon/storage/box/drone_kit/New() ..() diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm index 9e4d268281c..2b671317b64 100644 --- a/code/modules/mining/ore.dm +++ b/code/modules/mining/ore.dm @@ -192,8 +192,12 @@ quality = 1 return ..() + +/obj/item/weapon/twohanded/required/gibtonite/attack_ghost(mob/user) + if(wires) + wires.Interact(user) -/obj/item/weapon/twohanded/required/gibtonite/attack_self(user) +/obj/item/weapon/twohanded/required/gibtonite/attack_self(mob/user) if(wires) wires.Interact(user) else diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 3df660dc117..84664abb465 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -44,6 +44,10 @@ // /obj/item/weapon/paper_bundle, /obj/item/weapon/card/id ) + +/obj/item/weapon/gripper/New() + ..() + can_hold = typecacheof(can_hold) /obj/item/weapon/gripper/attack_self(mob/user as mob) if(wrapped) @@ -118,10 +122,9 @@ //Check if the item is blacklisted. var/grab = 0 - for(var/typepath in can_hold) - if(istype(I,typepath)) + if(can_hold.len) + if(is_type_in_typecache(I, can_hold)) grab = 1 - break //We can grab the item, finally. if(grab) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index d3aaaaea909..6c555e0f511 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -945,9 +945,11 @@ var/list/robot_verbs_default = list( adjustStaminaLoss(damage) updatehealth() +/mob/living/silicon/robot/attack_ghost(mob/user) + if(wiresexposed) + wires.Interact(user) /mob/living/silicon/robot/attack_hand(mob/user) - add_fingerprint(user) if(opened && !wiresexposed && (!istype(user, /mob/living/silicon))) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index ef0be0f4568..871c8694725 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -311,7 +311,7 @@ else dat += "Removed
" - wires.ui_interact(user) + wires.Interact(user) else dat += "
The bot is in maintenance mode and cannot be controlled.

" diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index c24dec2413f..afca7fcd953 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -109,7 +109,7 @@ icon = 'icons/obj/items.dmi' icon_state = "album" item_state = "briefcase" - can_hold = list("/obj/item/weapon/photo") + can_hold = list(/obj/item/weapon/photo) burn_state = FLAMMABLE /obj/item/weapon/storage/photo_album/MouseDrop(obj/over_object as obj) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 56da9cf9b07..b44673b4966 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -745,16 +745,16 @@ beenhit += 1 return -/obj/machinery/power/apc/attack_ghost(user as mob) - if(stat & (BROKEN|MAINT)) - return +/obj/machinery/power/apc/attack_ghost(mob/user) + if(wiresexposed) + wires.Interact(user) return ui_interact(user) /obj/machinery/power/apc/interact(mob/user) if(!user) return - if(wiresexposed /*&& (!istype(user, /mob/living/silicon))*/) //Commented out the typecheck to allow engiborgs to repair damaged apcs. + if(wiresexposed) wires.Interact(user) return ui_interact(user) diff --git a/code/modules/research/designs/equipment_designs.dm b/code/modules/research/designs/equipment_designs.dm index 0f23b2a6532..b0e895c3edb 100644 --- a/code/modules/research/designs/equipment_designs.dm +++ b/code/modules/research/designs/equipment_designs.dm @@ -189,4 +189,85 @@ build_type = PROTOLATHE materials = list("$metal" = 200, "$glass" = 200, "$uranium" = 1000, "$plasma" = 200) build_path = /obj/item/clothing/glasses/hud/hydroponic/night + category = list("Equipment") + + +/datum/design/handdrill + name = "Hand Drill" + desc = "A small electric hand drill with an interchangable screwdriver and bolt bit" + id = "handdrill" + req_tech = list("materials" = 4, "engineering" = 6) + build_type = PROTOLATHE + materials = list(MAT_METAL = 3500, MAT_SILVER = 1500, MAT_TITANIUM = 2500) + build_path = /obj/item/weapon/screwdriver/power + category = list("Equipment") + +/datum/design/jawsoflife + name = "Jaws of Life" + desc = "A small, compact Jaws of Life with an interchangable pry jaws and cutting jaws" + id = "jawsoflife" + req_tech = list("materials" = 4, "engineering" = 6, "magnets" = 6) // added one more requirment since the Jaws of Life are a bit OP + build_path = /obj/item/weapon/crowbar/power + build_type = PROTOLATHE + materials = list(MAT_METAL = 4500, MAT_SILVER = 2500, MAT_TITANIUM = 3500) + category = list("Equipment") + +/datum/design/alienwrench + name = "Alien Wrench" + desc = "An advanced wrench obtained through Abductor technology." + id = "alien_wrench" + req_tech = list("engineering" = 5, "materials" = 5, "abductor" = 4) + build_path = /obj/item/weapon/wrench/abductor + build_type = PROTOLATHE + materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_DIAMOND = 2000) + category = list("Equipment") + +/datum/design/alienwirecutters + name = "Alien Wirecutters" + desc = "Advanced wirecutters obtained through Abductor technology." + id = "alien_wirecutters" + req_tech = list("engineering" = 5, "materials" = 5, "abductor" = 4) + build_path = /obj/item/weapon/wirecutters/abductor + build_type = PROTOLATHE + materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_DIAMOND = 2000) + category = list("Equipment") + +/datum/design/alienscrewdriver + name = "Alien Screwdriver" + desc = "An advanced screwdriver obtained through Abductor technology." + id = "alien_screwdriver" + req_tech = list("engineering" = 5, "materials" = 5, "abductor" = 4) + build_path = /obj/item/weapon/screwdriver/abductor + build_type = PROTOLATHE + materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_DIAMOND = 2000) + category = list("Equipment") + +/datum/design/aliencrowbar + name = "Alien Crowbar" + desc = "An advanced crowbar obtained through Abductor technology." + id = "alien_crowbar" + req_tech = list("engineering" = 5, "materials" = 5, "abductor" = 4) + build_path = /obj/item/weapon/crowbar/abductor + build_type = PROTOLATHE + materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_DIAMOND = 2000) + category = list("Equipment") + +/datum/design/alienwelder + name = "Alien Welding Tool" + desc = "An advanced welding tool obtained through Abductor technology." + id = "alien_welder" + req_tech = list("engineering" = 5, "plasmatech" = 5, "abductor" = 4) + build_path = /obj/item/weapon/weldingtool/abductor + build_type = PROTOLATHE + materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 5000, MAT_DIAMOND = 2000) + category = list("Equipment") + +/datum/design/alienmultitool + name = "Alien Multitool" + desc = "An advanced multitool obtained through Abductor technology." + id = "alien_multitool" + req_tech = list("engineering" = 5, "programming" = 5, "abductor" = 4) + build_path = /obj/item/device/multitool/abductor + build_type = PROTOLATHE + materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 5000, MAT_DIAMOND = 2000) category = list("Equipment") \ No newline at end of file diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 7bcc42e4979..2e18a71cc0a 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -197,7 +197,67 @@ materials = list (MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 1000, MAT_GOLD = 1000, MAT_DIAMOND = 1000) build_path = /obj/item/weapon/scalpel/manager category = list("Medical") + +/datum/design/alienscalpel + name = "Alien Scalpel" + desc = "An advanced scalpel obtained through Abductor technology." + id = "alien_scalpel" + req_tech = list("bio" = 4, "materials" = 4, "abductor" = 3) + build_path = /obj/item/weapon/scalpel/alien + build_type = PROTOLATHE + materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500) + category = list("Medical Designs") + +/datum/design/alienhemostat + name = "Alien Hemostat" + desc = "An advanced hemostat obtained through Abductor technology." + id = "alien_hemostat" + req_tech = list("bio" = 4, "materials" = 4, "abductor" = 3) + build_path = /obj/item/weapon/hemostat/alien + build_type = PROTOLATHE + materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500) + category = list("Medical Designs") + +/datum/design/alienretractor + name = "Alien Retractor" + desc = "An advanced retractor obtained through Abductor technology." + id = "alien_retractor" + req_tech = list("bio" = 4, "materials" = 4, "abductor" = 3) + build_path = /obj/item/weapon/retractor/alien + build_type = PROTOLATHE + materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500) + category = list("Medical Designs") + +/datum/design/aliensaw + name = "Alien Circular Saw" + desc = "An advanced surgical saw obtained through Abductor technology." + id = "alien_saw" + req_tech = list("bio" = 4, "materials" = 4, "abductor" = 3) + build_path = /obj/item/weapon/circular_saw/alien + build_type = PROTOLATHE + materials = list(MAT_METAL = 10000, MAT_SILVER = 2500, MAT_PLASMA = 1000) + category = list("Medical Designs") + +/datum/design/aliendrill + name = "Alien Drill" + desc = "An advanced drill obtained through Abductor technology." + id = "alien_drill" + req_tech = list("bio" = 4, "materials" = 4, "abductor" = 3) + build_path = /obj/item/weapon/surgicaldrill/alien + build_type = PROTOLATHE + materials = list(MAT_METAL = 10000, MAT_SILVER = 2500, MAT_PLASMA = 1000) + category = list("Medical Designs") + +/datum/design/aliencautery + name = "Alien Cautery" + desc = "An advanced cautery obtained through Abductor technology." + id = "alien_cautery" + req_tech = list("bio" = 4, "materials" = 4, "abductor" = 3) + build_path = /obj/item/weapon/cautery/alien + build_type = PROTOLATHE + materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500) + category = list("Medical Designs") ///////////////////////////////////////// //////////Cybernetic Implants//////////// diff --git a/code/modules/research/xenoarchaeology/tools/gearbelt.dm b/code/modules/research/xenoarchaeology/tools/gearbelt.dm index e2d4839d2b4..8912e9248c8 100644 --- a/code/modules/research/xenoarchaeology/tools/gearbelt.dm +++ b/code/modules/research/xenoarchaeology/tools/gearbelt.dm @@ -5,24 +5,24 @@ icon_state = "gearbelt" item_state = "utility" can_hold = list( - "/obj/item/weapon/storage/box/samplebags", - "/obj/item/device/core_sampler", - "/obj/item/device/beacon_locator", - "/obj/item/device/radio/beacon", - "/obj/item/device/gps", - "/obj/item/device/measuring_tape", - "/obj/item/device/flashlight", - "/obj/item/weapon/pickaxe", - "/obj/item/device/depth_scanner", - "/obj/item/device/camera", - "/obj/item/weapon/paper", - "/obj/item/weapon/photo", - "/obj/item/weapon/folder", - "/obj/item/weapon/pen", - "/obj/item/weapon/folder", - "/obj/item/weapon/clipboard", - "/obj/item/weapon/anodevice", - "/obj/item/clothing/glasses", - "/obj/item/weapon/wrench", - "/obj/item/weapon/storage/box/excavation", - "/obj/item/weapon/anobattery") + /obj/item/weapon/storage/box/samplebags, + /obj/item/device/core_sampler, + /obj/item/device/beacon_locator, + /obj/item/device/radio/beacon, + /obj/item/device/gps, + /obj/item/device/measuring_tape, + /obj/item/device/flashlight, + /obj/item/weapon/pickaxe, + /obj/item/device/depth_scanner, + /obj/item/device/camera, + /obj/item/weapon/paper, + /obj/item/weapon/photo, + /obj/item/weapon/folder, + /obj/item/weapon/pen, + /obj/item/weapon/folder, + /obj/item/weapon/clipboard, + /obj/item/weapon/anodevice, + /obj/item/clothing/glasses, + /obj/item/weapon/wrench, + /obj/item/weapon/storage/box/excavation, + /obj/item/weapon/anobattery) diff --git a/code/modules/research/xenoarchaeology/tools/tools.dm b/code/modules/research/xenoarchaeology/tools/tools.dm index 39dc6738f4f..6ac7aee6a2b 100644 --- a/code/modules/research/xenoarchaeology/tools/tools.dm +++ b/code/modules/research/xenoarchaeology/tools/tools.dm @@ -21,4 +21,4 @@ storage_slots = 50 max_combined_w_class = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * ore.w_class max_w_class = 3 - can_hold = list("/obj/item/weapon/fossil") + can_hold = list(/obj/item/weapon/fossil) diff --git a/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm b/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm index 1dd6b769390..4e6e48b49b5 100644 --- a/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm +++ b/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm @@ -126,13 +126,13 @@ foldable = /obj/item/stack/sheet/cardboard //BubbleWrap storage_slots = 7 w_class = 2 - can_hold = list("/obj/item/weapon/pickaxe/brush",\ - "/obj/item/weapon/pickaxe/one_pick",\ - "/obj/item/weapon/pickaxe/two_pick",\ - "/obj/item/weapon/pickaxe/three_pick",\ - "/obj/item/weapon/pickaxe/four_pick",\ - "/obj/item/weapon/pickaxe/five_pick",\ - "/obj/item/weapon/pickaxe/six_pick") + can_hold = list(/obj/item/weapon/pickaxe/brush,\ + /obj/item/weapon/pickaxe/one_pick,\ + /obj/item/weapon/pickaxe/two_pick,\ + /obj/item/weapon/pickaxe/three_pick,\ + /obj/item/weapon/pickaxe/four_pick,\ + /obj/item/weapon/pickaxe/five_pick,\ + /obj/item/weapon/pickaxe/six_pick) max_combined_w_class = 17 max_w_class = 4 use_to_pickup = 1 // for picking up broken bulbs, not that most people will try diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index 89a58d7cc9e..a2f3a047dae 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -312,7 +312,7 @@ ui.open() ui.set_auto_update(1) -/obj/machinery/computer/bsa_control/ui_data(mob/user, ui_key = "main", datum/topic_state/state = physical_state) +/obj/machinery/computer/bsa_control/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) var/list/data = list() data["connected"] = cannon data["notice"] = notice diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index 26d00e6360d..03f119d62c4 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -211,7 +211,7 @@ var/list/non_simple_animals = typecacheof(list(/mob/living/carbon/human/monkey,/ L += pick_n_take(possible_powers) power_lottery[user] = L -/obj/machinery/dna_vault/ui_data(mob/user, ui_key = "main", datum/topic_state/state = physical_state) //TODO Make it % bars maybe +/obj/machinery/dna_vault/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) //TODO Make it % bars maybe var/list/data = list() data["plants"] = plants.len data["plants_max"] = plants_max diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm index 36f8c868cf6..8a7484626be 100644 --- a/code/modules/station_goals/shield.dm +++ b/code/modules/station_goals/shield.dm @@ -71,7 +71,7 @@ if(S.id == id && atoms_share_level(src, S)) S.toggle() -/obj/machinery/computer/sat_control/ui_data(mob/user, ui_key = "main", datum/topic_state/state = physical_state) +/obj/machinery/computer/sat_control/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) var/list/data = list() data["satellites"] = list() diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index b6089236f2a..93630adce9a 100644 Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi index 9a171b97645..7bcd0607116 100644 Binary files a/icons/obj/abductor.dmi and b/icons/obj/abductor.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index ae8fa296794..cfcfec6e283 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 6e749fc11ec..afa4f586504 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 6c3fdcf2bee..d021f5d02b1 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi index 332afbbdb71..d1aca5822c3 100644 Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ diff --git a/nano/templates/wires.tmpl b/nano/templates/wires.tmpl index cce49b84f95..a661fa3e851 100644 --- a/nano/templates/wires.tmpl +++ b/nano/templates/wires.tmpl @@ -2,7 +2,7 @@ {{for data.wires}} -
{{:value.colour}} + {{:value.colour}} {{if value.index}}({{:value.index}}){{/if}} {{:helper.link(value.cut ? 'Mend' : 'Cut', null, {'action' : 'cut', 'wire' : value.colour})}} {{:helper.link('Pulse', null, {'action' : 'pulse', 'wire' : value.colour})}} diff --git a/sound/effects/pray.ogg b/sound/effects/pray.ogg new file mode 100644 index 00000000000..beadd3916f1 Binary files /dev/null and b/sound/effects/pray.ogg differ diff --git a/sound/items/WelderActivate.ogg b/sound/items/WelderActivate.ogg new file mode 100644 index 00000000000..5218f2ab1cf Binary files /dev/null and b/sound/items/WelderActivate.ogg differ diff --git a/sound/items/WelderDeactivate.ogg b/sound/items/WelderDeactivate.ogg new file mode 100644 index 00000000000..22ac4f445cb Binary files /dev/null and b/sound/items/WelderDeactivate.ogg differ diff --git a/sound/items/change_drill.ogg b/sound/items/change_drill.ogg new file mode 100644 index 00000000000..406027a5955 Binary files /dev/null and b/sound/items/change_drill.ogg differ diff --git a/sound/items/change_jaws.ogg b/sound/items/change_jaws.ogg new file mode 100644 index 00000000000..b6a41eca806 Binary files /dev/null and b/sound/items/change_jaws.ogg differ diff --git a/sound/items/drill_hit.ogg b/sound/items/drill_hit.ogg new file mode 100644 index 00000000000..0f8fa631aa1 Binary files /dev/null and b/sound/items/drill_hit.ogg differ diff --git a/sound/items/drill_use.ogg b/sound/items/drill_use.ogg new file mode 100644 index 00000000000..82f37cd35bb Binary files /dev/null and b/sound/items/drill_use.ogg differ diff --git a/sound/items/jaws_cut.ogg b/sound/items/jaws_cut.ogg new file mode 100644 index 00000000000..a0bfd855029 Binary files /dev/null and b/sound/items/jaws_cut.ogg differ diff --git a/sound/items/jaws_pry.ogg b/sound/items/jaws_pry.ogg new file mode 100644 index 00000000000..05178bd4663 Binary files /dev/null and b/sound/items/jaws_pry.ogg differ