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 += "
| {{: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 |