diff --git a/code/WorkInProgress/computer2/buildandrepair.dm b/code/WorkInProgress/computer2/buildandrepair.dm
index c722bb5c61c..85790260f62 100644
--- a/code/WorkInProgress/computer2/buildandrepair.dm
+++ b/code/WorkInProgress/computer2/buildandrepair.dm
@@ -20,7 +20,7 @@
var/list/peripherals = list()
var/created_icon_state = "aiupload"
-/obj/computer2frame/attackby(obj/item/weapon/P as obj, mob/user as mob)
+/obj/computer2frame/attackby(obj/item/P as obj, mob/user as mob)
switch(state)
if(0)
if(istype(P, /obj/item/weapon/wrench))
@@ -33,8 +33,7 @@
playsound(src.loc, 'Welder.ogg', 50, 1)
if(do_after(user, 20))
user << "\blue You deconstruct the frame."
- var/obj/item/weapon/sheet/metal/A = new /obj/item/weapon/sheet/metal( src.loc )
- A.amount = 5
+ new /obj/item/stack/sheet/metal( src.loc, 5 )
del(src)
if(1)
if(istype(P, /obj/item/weapon/wrench))
@@ -118,12 +117,11 @@
src.hd.loc = src.loc
src.hd = null
- if(istype(P, /obj/item/weapon/sheet/glass))
+ if(istype(P, /obj/item/stack/sheet/glass))
if(P:amount >= 2)
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
if(do_after(user, 20))
- P:amount -= 2
- if(!P:amount) del(P)
+ P:use(2)
user << "\blue You put in the glass panel."
src.state = 4
src.icon_state = "4"
@@ -133,8 +131,7 @@
user << "\blue You remove the glass panel."
src.state = 3
src.icon_state = "3"
- var/obj/item/weapon/sheet/glass/A = new /obj/item/weapon/sheet/glass( src.loc )
- A.amount = 2
+ new /obj/item/stack/sheet/glass( src.loc, 2 )
if(istype(P, /obj/item/weapon/screwdriver))
playsound(src.loc, 'Screwdriver.ogg', 50, 1)
user << "\blue You connect the monitor."
diff --git a/code/WorkInProgress/recycling/disposal.dm b/code/WorkInProgress/recycling/disposal.dm
index 7563f1d3bdf..00876122760 100644
--- a/code/WorkInProgress/recycling/disposal.dm
+++ b/code/WorkInProgress/recycling/disposal.dm
@@ -577,7 +577,7 @@
F.burnt = 1
F.intact = 0
F.levelupdate()
- new /obj/item/weapon/tile(H) // add to holder so it will be thrown with other stuff
+ new /obj/item/stack/tile(H) // add to holder so it will be thrown with other stuff
F.icon_state = "Floor[F.burnt ? "1" : ""]"
if(direction) // direction is specified
diff --git a/code/defines/obj.dm b/code/defines/obj.dm
index 9ba386b94db..8292d17bab8 100644
--- a/code/defines/obj.dm
+++ b/code/defines/obj.dm
@@ -816,3 +816,90 @@ obj/item/brain
density = 1
opacity = 1
anchored = 1
+
+/obj/item/stack
+ var/singular_name
+ var/amount = 1.0
+ var/max_amount //also see stack recipes initialisation, param "max_res_amount" must be equal to this max_amount
+
+/obj/item/stack/rods
+ name = "metal rods"
+ singular_name = "metal rod"
+ icon_state = "rods"
+ flags = FPRINT | TABLEPASS| CONDUCT
+ w_class = 3.0
+ force = 9.0
+ throwforce = 15.0
+ throw_speed = 5
+ throw_range = 20
+ m_amt = 1875
+ max_amount = 60
+
+/obj/item/stack/sheet
+ name = "sheet"
+// var/const/length = 2.5 //2.5*1.5*0.01*100000 == 3750 == m_amt
+// var/const/width = 1.5
+// var/const/height = 0.01
+ flags = FPRINT | TABLEPASS
+ w_class = 3.0
+ max_amount = 50
+
+/obj/item/stack/sheet/glass
+ name = "glass"
+ singular_name = "glass sheet"
+ icon_state = "sheet-glass"
+ force = 5.0
+ g_amt = 3750
+ throwforce = 5
+ throw_speed = 3
+ throw_range = 3
+
+/obj/item/stack/sheet/rglass
+ name = "reinforced glass"
+ singular_name = "reinforced glass sheet"
+ icon_state = "sheet-rglass"
+ force = 6.0
+ g_amt = 3750
+ m_amt = 1875
+ throwforce = 5
+ throw_speed = 3
+ throw_range = 3
+
+/obj/item/stack/sheet/metal
+ name = "metal"
+ singular_name = "metal sheet"
+ desc = "A heavy sheet of metal."
+ icon_state = "sheet-metal"
+ force = 5.0
+ m_amt = 3750
+ throwforce = 14.0
+ throw_speed = 1
+ throw_range = 4
+ flags = FPRINT | TABLEPASS | CONDUCT
+
+/obj/item/stack/sheet/r_metal
+ name = "reinforced metal"
+ singular_name = "reinforced metal sheet"
+ desc = "A very heavy sheet of metal."
+ icon_state = "sheet-r_metal"
+ item_state = "sheet-metal"
+ force = 5.0
+ m_amt = 7500
+ throwforce = 15.0
+ throw_speed = 1
+ throw_range = 4
+ flags = FPRINT | TABLEPASS | CONDUCT
+
+/obj/item/stack/tile
+ name = "steel floor tile"
+ singular_name = "steel floor tile"
+ desc = "Those could work as a pretty decent throwing weapon"
+ icon_state = "tile"
+ w_class = 3.0
+ force = 6.0
+ m_amt = 937.5
+ throwforce = 15.0
+ throw_speed = 5
+ throw_range = 20
+ flags = FPRINT | TABLEPASS | CONDUCT
+ max_amount = 10
\ No newline at end of file
diff --git a/code/defines/obj/assemblies.dm b/code/defines/obj/assemblies.dm
index 4f7967c3a7c..52fcee23789 100644
--- a/code/defines/obj/assemblies.dm
+++ b/code/defines/obj/assemblies.dm
@@ -127,7 +127,7 @@
icon_state = "welder-rods"
item_state = "welder"
var/obj/item/weapon/weldingtool/part1 = null
- var/obj/item/weapon/rods/part2 = null
+ var/obj/item/stack/rods/part2 = null
status = null
flags = FPRINT | TABLEPASS| CONDUCT
force = 3.0
@@ -142,7 +142,7 @@
icon_state = "welder-rods-igniter"
item_state = "welder"
var/obj/item/weapon/weldingtool/part1 = null
- var/obj/item/weapon/rods/part2 = null
+ var/obj/item/stack/rods/part2 = null
var/obj/item/device/igniter/part3 = null
status = null
flags = FPRINT | TABLEPASS| CONDUCT
diff --git a/code/defines/obj/radio.dm b/code/defines/obj/radio.dm
index 00211b92873..a469a6420c9 100644
--- a/code/defines/obj/radio.dm
+++ b/code/defines/obj/radio.dm
@@ -52,9 +52,10 @@
icon_state = "headset"
item_state = "headset"
var/protective_temperature = 0
+ var/bintran = 0
/obj/item/device/radio/headset/traitor
-// No variables, as everything else it does is handled in human's life.dm
+ bintran = 1
/obj/item/device/radio/headset/headset_sec // -- TLE
name = "Security Radio Headset"
diff --git a/code/defines/obj/supplypacks.dm b/code/defines/obj/supplypacks.dm
index a7c066ea4dc..4f196cb5f78 100644
--- a/code/defines/obj/supplypacks.dm
+++ b/code/defines/obj/supplypacks.dm
@@ -27,7 +27,7 @@
/datum/supply_packs/metal50
name = "50 Metal Sheets"
- contains = list("/obj/item/weapon/sheet/metal")
+ contains = list("/obj/item/stack/sheet/metal")
amount = 50
cost = 15
containertype = "/obj/crate"
@@ -35,7 +35,7 @@
/datum/supply_packs/glass50
name = "50 Glass Sheets"
- contains = list("/obj/item/weapon/sheet/glass")
+ contains = list("/obj/item/stack/sheet/glass")
amount = 50
cost = 15
containertype = "/obj/crate"
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index cac781c5040..6ecad7eeed7 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -135,9 +135,10 @@
w_class = 2.0
flags = FPRINT | TABLEPASS| CONDUCT
throwforce = 5
- w_class = 2.0
throw_speed = 4
throw_range = 20
+ m_amt = 30
+ g_amt = 20
/obj/item/weapon/axe
@@ -922,7 +923,7 @@ Total SMES charging rate should not exceed total power generation rate, or an ov
w_class = 1.0
throw_speed = 7
throw_range = 15
- m_amt = 60
+ m_amt = 10
/obj/item/weapon/pen/sleepypen
desc = "It's a normal black ink pen with a sharp point."
@@ -933,19 +934,7 @@ Total SMES charging rate should not exceed total power generation rate, or an ov
icon = 'items.dmi'
icon_state = "rack_parts"
flags = FPRINT | TABLEPASS| CONDUCT
-
-/obj/item/weapon/rods
- name = "rods"
- icon = 'items.dmi'
- icon_state = "rods"
- var/amount = 1.0
- flags = FPRINT | TABLEPASS| CONDUCT
- w_class = 3.0
- force = 9.0
- throwforce = 15.0
- throw_speed = 5
- throw_range = 20
- m_amt = 1875
+ m_amt = 3750
/obj/item/weapon/rubber_chicken
name = "Rubber Chicken"
@@ -975,68 +964,7 @@ Total SMES charging rate should not exceed total power generation rate, or an ov
force = 5.0
throwforce = 15.0
item_state = "shard-glass"
-
-/obj/item/weapon/sheet
- name = "sheet"
- icon = 'items.dmi'
- var/amount = 1.0
- var/length = 2.5
- var/width = 1.5
- var/height = 0.01
- flags = FPRINT | TABLEPASS
- throwforce = 5.0
- throw_speed = 1
- throw_range = 4
- w_class = 4.0
-
-/obj/item/weapon/sheet/glass
- name = "glass"
- icon_state = "sheet-glass"
- force = 5.0
g_amt = 3750
- throwforce = 5
- w_class = 3.0
- throw_speed = 3
- throw_range = 3
-
-/obj/item/weapon/sheet/rglass
- name = "reinforced glass"
- icon_state = "sheet-rglass"
- item_state = "sheet-rglass"
- force = 6.0
- g_amt = 3750
- m_amt = 1875
- throwforce = 5
- w_class = 3.0
- throw_speed = 3
- throw_range = 3
-
-/obj/item/weapon/sheet/metal
- name = "metal"
- icon_state = "sheet-metal"
- desc = "A heavy sheet of metal."
- throwforce = 14.0
- m_amt = 3750
- throwforce = 10.0
- throw_speed = 1
- throw_range = 4
- w_class = 3.0
- flags = FPRINT | TABLEPASS | CONDUCT
-
-/obj/item/weapon/sheet/r_metal
- name = "reinforced metal"
- desc = "A very heavy sheet of metal."
- icon_state = "sheet-r_metal"
- force = 5.0
- throwforce = 14.0
- item_state = "sheet-metal"
- m_amt = 7500
- throwforce = 15.0
- throw_speed = 1
- throw_range = 4
- w_class = 3.0
- flags = FPRINT | TABLEPASS | CONDUCT
-
/obj/item/weapon/syndicate_uplink
name = "station bounced radio"
@@ -1101,12 +1029,14 @@ Total SMES charging rate should not exceed total power generation rate, or an ov
name = "table parts"
icon = 'items.dmi'
icon_state = "table_parts"
+ m_amt = 3750
flags = FPRINT | TABLEPASS| CONDUCT
/obj/item/weapon/table_parts/reinforced
name = "table parts"
icon = 'items.dmi'
icon_state = "reinf_tableparts"
+ m_amt = 7500
flags = FPRINT | TABLEPASS| CONDUCT
/obj/item/weapon/tank
@@ -1155,19 +1085,6 @@ Total SMES charging rate should not exceed total power generation rate, or an ov
w_class = 2.5
force = 4.0
-/obj/item/weapon/tile
- name = "steel floor tile"
- desc = "... Those could work as a pretty decent throwing weapon"
- icon = 'items.dmi'
- icon_state = "tile"
- var/amount = 1.0
- w_class = 3.0
- throw_speed = 5
- throw_range = 20
- force = 6.0
- throwforce = 15.0
-
-
/obj/item/weapon/teleportation_scroll
name = "Teleportation Scroll"
icon = 'items.dmi'
@@ -1183,7 +1100,7 @@ Total SMES charging rate should not exceed total power generation rate, or an ov
name = "weldingtool"
icon = 'items.dmi'
icon_state = "welder"
- var/welding = 0.0
+ var/welding = 0
var/status = 0 //flamethrower construction :shobon:
flags = FPRINT | TABLEPASS| CONDUCT
force = 3.0
@@ -1191,7 +1108,7 @@ Total SMES charging rate should not exceed total power generation rate, or an ov
throw_speed = 1
throw_range = 5
w_class = 2.0
- m_amt = 30
+ m_amt = 70
g_amt = 30
/obj/item/weapon/wire
@@ -1247,6 +1164,7 @@ Total SMES charging rate should not exceed total power generation rate, or an ov
var/charge = 0 // note %age conveted to actual charge in New
var/maxcharge = 1000
m_amt = 700
+ g_amt = 50
var/rigged = 0 // true if rigged to explode
/obj/item/weapon/cell/robotcrate
diff --git a/code/game/asteroid/turf.dm b/code/game/asteroid/turf.dm
index 3aae72bf291..ddbc8462013 100644
--- a/code/game/asteroid/turf.dm
+++ b/code/game/asteroid/turf.dm
@@ -13,13 +13,13 @@
/turf/simulated/wall/asteroid/iron
icon_state = "asteroid_i"
- contains = /obj/item/weapon/sheet/metal
+ contains = /obj/item/stack/sheet/metal
max_amount = 3
min_amount = 1
/turf/simulated/wall/asteroid/silicon
icon_state = "asteroid_i"
- contains = /obj/item/weapon/sheet/glass
+ contains = /obj/item/stack/sheet/glass
max_amount = 3
min_amount = 1
diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm
index efb9afedda3..d3209d848cc 100644
--- a/code/game/atom_procs.dm
+++ b/code/game/atom_procs.dm
@@ -156,8 +156,8 @@
if (istype (src, /mob/living/carbon))
var/obj/item/source2 = src
source2.blood_DNA = null
- var/icon/I = new /icon(source2.icon_old, source2.icon_state)
- source2.icon = I
+ //var/icon/I = new /icon(source2.icon_old, source2.icon_state) //doesnt have icon_old
+ //source2.icon = I
if (istype (src, /obj/item))
var/obj/item/source2 = src
source2.blood_DNA = null
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index de6440089f7..dc21e2d730a 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -398,7 +398,7 @@
/////////////////////////////
/datum/game_mode/revolution/proc/check_heads_victory()
for(var/datum/mind/rev_mind in head_revolutionaries)
- if(rev_mind.current.stat != 2)
+ if(rev_mind && rev_mind.current && rev_mind.current.stat != 2)
return 0
return 1
diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm
index 83a0e3d0f7b..94b9166e67a 100644
--- a/code/game/gamemodes/sandbox/h_sandbox.dm
+++ b/code/game/gamemodes/sandbox/h_sandbox.dm
@@ -88,11 +88,11 @@ datum/hSB
P.back.layer = 20
P.internal = P.back
if("hsbmetal")
- var/obj/item/weapon/sheet/hsb = new/obj/item/weapon/sheet/metal
+ var/obj/item/stack/sheet/hsb = new/obj/item/stack/sheet/metal
hsb.amount = 50
hsb.loc = usr.loc
if("hsbglass")
- var/obj/item/weapon/sheet/hsb = new/obj/item/weapon/sheet/glass
+ var/obj/item/stack/sheet/hsb = new/obj/item/stack/sheet/glass
hsb.amount = 50
hsb.loc = usr.loc
if("hsbairlock")
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index d7c4d8ac090..f82205af0c4 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -1,6 +1,7 @@
/obj/machinery/portable_atmospherics/canister
name = "canister"
icon = 'atmos.dmi'
+ icon_state = "yellow"
density = 1
var/health = 100.0
flags = FPRINT | CONDUCT
@@ -8,7 +9,8 @@
var/valve_open = 0
var/release_pressure = ONE_ATMOSPHERE
- var/color = "blue"
+ var/color = "yellow"
+ var/labeled = 0
var/filled = 0.5
pressure_resistance = 7*ONE_ATMOSPHERE
var/temperature_resistance = 1000 + T0C
@@ -18,10 +20,12 @@
name = "Canister: \[N2O\]"
icon_state = "redws"
color = "redws"
+ labeled = 1
/obj/machinery/portable_atmospherics/canister/nitrogen
name = "Canister: \[N2\]"
icon_state = "red"
color = "red"
+ labeled = 1
/obj/machinery/portable_atmospherics/canister/oxygen
name = "Canister: \[O2\]"
icon_state = "blue"
@@ -29,14 +33,17 @@
name = "Canister \[Toxin (Bio)\]"
icon_state = "orange"
color = "orange"
+ labeled = 1
/obj/machinery/portable_atmospherics/canister/carbon_dioxide
name = "Canister \[CO2\]"
icon_state = "black"
color = "black"
+ labeled = 1
/obj/machinery/portable_atmospherics/canister/air
name = "Canister \[Air\]"
icon_state = "grey"
color = "grey"
+ labeled = 1
/obj/machinery/portable_atmospherics/canister/update_icon()
src.overlays = 0
@@ -158,7 +165,7 @@
holding_text = {"
Tank Pressure: [holding.air_contents.return_pressure()] KPa
Remove Tank
"}
- var/output_text = {"[name]
+ var/output_text = {"[name][!labeled?" relabel":""]
Pressure: [air_contents.return_pressure()] KPa
Port Status: [(connected_port)?("Connected"):("Disconnected")]
[holding_text]
@@ -195,6 +202,23 @@ Release Pressure: - - max_m_amount)
+ user << "\red The autolathe is full. Please remove metal from the autolathe in order to insert more."
+ return 1
+ if (src.g_amount + O.g_amt > max_g_amount)
+ user << "\red The autolathe is full. Please remove glass from the autolathe in order to insert more."
+ return 1
+ if (O.m_amt == 0 && O.g_amt == 0)
+ user << "\red This object does not contain significant amounts of metal or glass, or cannot be accepted by the autolathe due to size or hazardous materials."
+ return 1
/*
if (istype(O, /obj/item/weapon/grab) && src.hacked)
var/obj/item/weapon/grab/G = O
@@ -18,79 +39,95 @@
m_amount += 50000
return
*/
- if (istype(O, /obj/item/weapon/sheet/metal))
- if (src.m_amount < 150000.0)
- spawn(16) {
- if (O)
- flick("autolathe_c",src)
- src.m_amount += O:height * O:width * O:length * 100000.0
- O:amount--
- if (O:amount < 1)
- del(O)
- }
- else
- user << "The autolathe is full. Please remove metal from the autolathe in order to insert more."
- else if (istype(O, /obj/item/weapon/sheet/glass) || istype(O, /obj/item/weapon/sheet/rglass))
- if (src.g_amount < 75000.0)
- spawn(16) {
- flick("autolathe_c",src)
- src.g_amount += O:height * O:width * O:length * 100000.0
- O:amount--
- if (O:amount < 1)
- del(O)
- }
- else
- user << "The autolathe is full. Please remove glass from the autolathe in order to insert more."
- else if (O.g_amt || O.m_amt)
- spawn(16) {
- flick("autolathe_c",src)
- if(O)
- if(O.g_amt) // Added null checks to avoid runtime errors when an item doesn't have an expected variable -- TLE
- src.g_amount += O.g_amt
- if(O.m_amt)
- src.m_amount += O.m_amt
- del O
- }
+ var/amount = 1
+ var/obj/item/stack/stack
+ var/m_amt = O.m_amt
+ var/g_amt = O.g_amt
+ if (istype(O, /obj/item/stack))
+ stack = O
+ amount = stack.amount
+ if (m_amt)
+ amount = min(amount, round((max_m_amount-src.m_amount)/m_amt))
+ if (g_amt)
+ amount = min(amount, round((max_g_amount-src.g_amount)/g_amt))
+ stack.use(amount)
else
- user << "This object does not contain significant amounts of metal or glass, or cannot be accepted by the autolathe due to size or hazardous materials."
+ usr.before_take_item(O)
+ O.loc = src
+ icon_state = "autolathe1"
+ flick("autolathe_c",src)
+ busy = 1
+ use_power(max(1000, (m_amt+g_amt)*amount/10))
+ spawn(16)
+ icon_state = "autolathe"
+ flick("autolathe_o",src)
+ src.m_amount += m_amt * amount
+ src.g_amount += g_amt * amount
+ if (O && O.loc == src)
+ del(O)
+ busy = 0
+ src.updateUsrDialog()
-/obj/machinery/autolathe/attack_paw(user as mob)
+/obj/machinery/autolathe/attack_paw(mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/autolathe/attack_hand(user as mob)
- var/dat
+/obj/machinery/autolathe/attack_hand(mob/user as mob)
+ user.machine = src
+ interact(user)
+
+/obj/machinery/autolathe/proc/wires_win(mob/user as mob)
+ var/dat as text
+ dat += "Autolathe Wires:
"
+ for(var/wire in src.wires)
+ dat += text("[wire] Wire: [src.wires[wire] ? "Mend" : "Cut"] Pulse
")
+
+ dat += text("The red light is [src.disabled ? "off" : "on"].
")
+ dat += text("The green light is [src.shocked ? "off" : "on"].
")
+ dat += text("The blue light is [src.hacked ? "off" : "on"].
")
+ user << browse("Autolathe Hacking[dat]","window=autolathe_hack")
+ onclose(user, "autolathe_hack")
+
+/obj/machinery/autolathe/proc/regular_win(mob/user as mob)
+ var/dat as text
+ dat = text("Metal Amount: [src.m_amount] cm3 (MAX: [max_m_amount])
\nGlass Amount: [src.g_amount] cm3 (MAX: [max_g_amount])
")
+ var/list/objs = list()
+ objs += src.L
+ if (src.hacked)
+ objs += src.LL
+ for(var/obj/t in objs)
+ var/title = "[t.name] ([t.m_amt] m /[t.g_amt] g)"
+ if (m_amount"
+ continue
+ dat += "[title]"
+ if (istype(t, /obj/item/stack))
+ var/obj/item/stack/S = t
+ var/max_multiplier = min(S.max_amount, S.m_amt?round(m_amount/S.m_amt):INFINITY, S.g_amt?round(g_amount/S.g_amt):INFINITY)
+ if (max_multiplier>1)
+ dat += " |"
+ if (max_multiplier>10)
+ dat += " x[10]"
+ if (max_multiplier>25)
+ dat += " x[25]"
+ if (max_multiplier>1)
+ dat += " x[max_multiplier]"
+ dat += "
"
+ user << browse("Autolathe Control Panel[dat]", "window=autolathe_regular")
+ onclose(user, "autolathe_regular")
+
+/obj/machinery/autolathe/proc/interact(mob/user as mob)
if(..())
return
if (src.shocked)
src.shock(user)
if (src.opened)
- dat += "Autolathe Wires:
"
- var/wire
- for(wire in src.wires)
- dat += text("[wire] Wire: [src.wires[wire] ? "Mend" : "Cut"] Pulse
")
-
- dat += text("The red light is [src.disabled ? "off" : "on"].
")
- dat += text("The green light is [src.shocked ? "off" : "on"].
")
- dat += text("The blue light is [src.hacked ? "off" : "on"].
")
- user << browse("Autolathe Hacking[dat]","window=autolathe_hack")
- onclose(user, "autolathe_hack")
+ wires_win(user)
return
if (src.disabled)
- user << "You press the button, but nothing happens."
+ user << "\red You press the button, but nothing happens."
return
- if (src.temp)
- dat = text("[]
Clear Screen", src.temp, src)
- else
- dat = text("Metal Amount: [src.m_amount] cm3 (MAX: 150,000)
\nGlass Amount: [src.g_amount] cm3 (MAX: 75,000)
")
- var/list/objs = list()
- objs += src.L
- if (src.hacked)
- objs += src.LL
- for(var/obj/t in objs)
- dat += text("[t.name] ([t.m_amt] cc metal/[t.g_amt] cc glass)
")
- user << browse("Autolathe Control Panel[dat]", "window=autolathe_regular")
- onclose(user, "autolathe_regular")
+ regular_win(user)
return
/obj/machinery/autolathe/Topic(href, href_list)
@@ -98,99 +135,117 @@
return
usr.machine = src
src.add_fingerprint(usr)
- if(href_list["make"])
- var/obj/template = locate(href_list["make"])
- if(src.m_amount >= template.m_amt && src.g_amount >= template.g_amt)
- spawn(16)
+ if (!busy)
+ if(href_list["make"])
+ var/turf/T = get_step(src.loc, get_dir(src,usr))
+ var/obj/template = locate(href_list["make"])
+ var/multiplier = text2num(href_list["multiplier"])
+ if (!multiplier) multiplier = 1
+ var/power = max(2000, (template.m_amt+template.g_amt)*multiplier/5)
+ if(src.m_amount >= template.m_amt*multiplier && src.g_amount >= template.g_amt*multiplier)
+ busy = 1
+ use_power(power)
+ icon_state = "autolathe1"
flick("autolathe_c",src)
spawn(16)
- flick("autolathe_o",src)
+ use_power(power)
spawn(16)
- src.m_amount -= template.m_amt
- src.g_amount -= template.g_amt
- if(src.m_amount < 0)
- src.m_amount = 0
- if(src.g_amount < 0)
- src.g_amount = 0
- new template.type(usr.loc)
- if(href_list["act"])
- if(href_list["act"] == "pulse")
- if (!istype(usr.equipped(), /obj/item/device/multitool))
- usr << "You need a multitool!"
- else
- if(src.wires[href_list["wire"]])
- usr << "You can't pulse a cut wire."
+ icon_state = "autolathe"
+ flick("autolathe_o",src)
+ use_power(power)
+ spawn(16)
+ src.m_amount -= template.m_amt*multiplier
+ src.g_amount -= template.g_amt*multiplier
+ if(src.m_amount < 0)
+ src.m_amount = 0
+ if(src.g_amount < 0)
+ src.g_amount = 0
+ var/obj/new_item = new template.type(T)
+ if (multiplier>1)
+ var/obj/item/stack/S = new_item
+ S.amount = multiplier
+ busy = 0
+ src.updateUsrDialog()
+ if(href_list["act"])
+ if(href_list["act"] == "pulse")
+ if (!istype(usr.equipped(), /obj/item/device/multitool))
+ usr << "You need a multitool!"
+ else
+ if(src.wires[href_list["wire"]])
+ usr << "You can't pulse a cut wire."
+ else
+ if(src.hack_wire == href_list["wire"])
+ src.hacked = !src.hacked
+ spawn(100) src.hacked = !src.hacked
+ if(src.disable_wire == href_list["wire"])
+ src.disabled = !src.disabled
+ src.shock(usr)
+ spawn(100) src.disabled = !src.disabled
+ if(src.shock_wire == href_list["wire"])
+ src.shocked = !src.shocked
+ src.shock(usr)
+ spawn(100) src.shocked = !src.shocked
+ if(href_list["act"] == "wire")
+ if (!istype(usr.equipped(), /obj/item/weapon/wirecutters))
+ usr << "You need wirecutters!"
else
if(src.hack_wire == href_list["wire"])
src.hacked = !src.hacked
- spawn(100) src.hacked = !src.hacked
if(src.disable_wire == href_list["wire"])
src.disabled = !src.disabled
src.shock(usr)
- spawn(100) src.disabled = !src.disabled
if(src.shock_wire == href_list["wire"])
src.shocked = !src.shocked
src.shock(usr)
- spawn(100) src.shocked = !src.shocked
- if(href_list["act"] == "wire")
- if (!istype(usr.equipped(), /obj/item/weapon/wirecutters))
- usr << "You need wirecutters!"
- else
- if(src.hack_wire == href_list["wire"])
- src.hacked = !src.hacked
- if(src.disable_wire == href_list["wire"])
- src.disabled = !src.disabled
- src.shock(usr)
- if(src.shock_wire == href_list["wire"])
- src.shocked = !src.shocked
- src.shock(usr)
-
- if (href_list["temp"])
- src.temp = null
-
- for(var/mob/M in viewers(1, src))
- if ((M.client && M.machine == src))
- src.attack_hand(M)
+ else
+ usr << "\red The autolathe is busy. Please wait for completion of previous operation."
src.updateUsrDialog()
return
+var/global/list/autolathe_recipes = list( \
+ /* screwdriver removed*/ \
+ new /obj/item/weapon/wirecutters(), \
+ new /obj/item/weapon/wrench(), \
+ new /obj/item/weapon/crowbar(), \
+ new /obj/item/weapon/weldingtool(), \
+ new /obj/item/clothing/head/helmet/welding(), \
+ new /obj/item/device/multitool(), \
+ new /obj/item/weapon/airlock_electronics(), \
+ new /obj/item/device/flashlight(), \
+ new /obj/item/weapon/extinguisher(), \
+ new /obj/item/stack/sheet/metal(), \
+ new /obj/item/stack/sheet/glass(), \
+ new /obj/item/stack/sheet/r_metal(), \
+ new /obj/item/stack/sheet/rglass(), \
+ new /obj/item/stack/rods(), \
+ new /obj/item/weapon/rcd_ammo(), \
+ new /obj/item/weapon/scalpel(), \
+ new /obj/item/weapon/circular_saw(), \
+ new /obj/item/device/t_scanner(), \
+ new /obj/item/weapon/reagent_containers/glass/bucket(), \
+ new /obj/item/weapon/ammo/shell/blank(), \
+ new /obj/item/device/taperecorder(), \
+ )
+
+var/global/list/autolathe_recipes_hidden = list( \
+ new /obj/item/weapon/flamethrower(), \
+ new /obj/item/device/igniter(), \
+ new /obj/item/device/timer(), \
+ new /obj/item/weapon/rcd(), \
+ new /obj/item/device/infra(), \
+ new /obj/item/device/infra_sensor(), \
+ new /obj/item/weapon/handcuffs(), \
+ new /obj/item/weapon/ammo/a357(), \
+ new /obj/item/weapon/ammo/shell/gauge(), \
+ new /obj/item/weapon/ammo/a38(), \
+ new /obj/item/weapon/ammo/shell/beanbag(), \
+ new /obj/item/weapon/ammo/shell/dart(), \
+ /* new /obj/item/weapon/shield/riot(), */ \
+ )
/obj/machinery/autolathe/New()
..()
- // screwdriver removed
- src.L += new /obj/item/weapon/wirecutters(src)
- src.L += new /obj/item/weapon/wrench(src)
- src.L += new /obj/item/weapon/crowbar(src)
- src.L += new /obj/item/weapon/weldingtool(src)
- src.L += new /obj/item/clothing/head/helmet/welding(src)
- src.L += new /obj/item/device/multitool(src)
- src.L += new /obj/item/weapon/airlock_electronics(src)
- src.L += new /obj/item/device/flashlight(src)
- src.L += new /obj/item/weapon/extinguisher(src)
- src.L += new /obj/item/weapon/sheet/metal(src)
- src.L += new /obj/item/weapon/sheet/glass(src)
- src.L += new /obj/item/weapon/sheet/r_metal(src)
- src.L += new /obj/item/weapon/sheet/rglass(src)
- src.L += new /obj/item/weapon/rods(src)
- src.L += new /obj/item/weapon/rcd_ammo(src)
- src.L += new /obj/item/weapon/scalpel(src)
- src.L += new /obj/item/weapon/circular_saw(src)
- src.L += new /obj/item/device/t_scanner(src)
- src.L += new /obj/item/weapon/reagent_containers/glass/bucket(src)
- src.L += new /obj/item/weapon/ammo/shell/blank(src)
- src.L += new /obj/item/device/taperecorder(src)
- src.LL += new /obj/item/weapon/flamethrower(src)
- src.LL += new /obj/item/device/igniter(src)
- src.LL += new /obj/item/device/timer(src)
- src.LL += new /obj/item/weapon/rcd(src)
- src.LL += new /obj/item/device/infra(src)
- src.LL += new /obj/item/device/infra_sensor(src)
- src.LL += new /obj/item/weapon/handcuffs(src)
- src.LL += new /obj/item/weapon/ammo/a357(src)
- src.LL += new /obj/item/weapon/ammo/shell/gauge(src)
- src.LL += new /obj/item/weapon/ammo/a38(src)
- src.LL += new /obj/item/weapon/ammo/shell/beanbag(src)
- src.LL += new /obj/item/weapon/ammo/shell/dart(src)
-// src.LL += new /obj/item/weapon/shield/riot(src)
+ src.L = autolathe_recipes
+ src.LL = autolathe_recipes_hidden
src.wires["Light Red"] = 0
src.wires["Dark Red"] = 0
src.wires["Blue"] = 0
diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm
index ea63dd196ed..e67805f0f6e 100644
--- a/code/game/machinery/bots/floorbot.dm
+++ b/code/game/machinery/bots/floorbot.dm
@@ -74,21 +74,14 @@
return
-/obj/machinery/bot/floorbot/attackby(var/obj/item/weapon/W , mob/user as mob)
- if(istype(W, /obj/item/weapon/tile))
- var/obj/item/weapon/tile/T = W
+/obj/machinery/bot/floorbot/attackby(var/obj/item/W , mob/user as mob)
+ if(istype(W, /obj/item/stack/tile))
+ var/obj/item/stack/tile/T = W
if(src.amount >= 50)
return
- var/loaded = 0
- if(src.amount + T.amount > 50)
- var/i = 50 - src.amount
- src.amount += i
- T.amount -= i
- loaded = i
- else
- src.amount += T.amount
- loaded = T.amount
- del(T)
+ var/loaded = min(50-src.amount, T.amount)
+ T.use(loaded)
+ src.amount += loaded
user << "\red You load [loaded] tiles into the floorbot. He now contains [src.amount] tiles!"
src.updateicon()
if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
@@ -162,7 +155,7 @@
floorbottargets += bot.target
if(src.amount <= 0 && ((src.target == null) || !src.target))
if(src.eattiles)
- for(var/obj/item/weapon/tile/T in view(7, src))
+ for(var/obj/item/stack/tile/T in view(7, src))
if(T != src.oldtarget && !(target in floorbottargets))
src.oldtarget = T
src.target = T
@@ -170,7 +163,7 @@
if(src.target == null || !src.target)
if(src.maketiles)
if(src.target == null || !src.target)
- for(var/obj/item/weapon/sheet/metal/M in view(7, src))
+ for(var/obj/item/stack/sheet/metal/M in view(7, src))
if(!(M in floorbottargets) && M != src.oldtarget && M.amount == 1 && !(istype(M.loc, /turf/simulated/wall)))
src.oldtarget = M
src.target = M
@@ -208,7 +201,7 @@
src.target = F
break
if((!src.target || src.target == null) && src.eattiles)
- for(var/obj/item/weapon/tile/T in view(7, src))
+ for(var/obj/item/stack/tile/T in view(7, src))
if(!(T in floorbottargets) && T != src.oldtarget)
src.oldtarget = T
src.target = T
@@ -238,9 +231,9 @@
src.path = new()
if(src.loc == src.target || src.loc == src.target.loc)
- if(istype(src.target, /obj/item/weapon/tile))
+ if(istype(src.target, /obj/item/stack/tile))
src.eattile(src.target)
- else if(istype(src.target, /obj/item/weapon/sheet/metal))
+ else if(istype(src.target, /obj/item/stack/sheet/metal))
src.maketile(src.target)
else if(istype(src.target, /turf/))
repair(src.target)
@@ -263,7 +256,7 @@
if(istype(target, /turf/space/))
for(var/mob/O in viewers(src, null))
O.show_message(text("\red [src] begins to repair the hole"), 1)
- var/obj/item/weapon/tile/T = new /obj/item/weapon/tile
+ var/obj/item/stack/tile/T = new /obj/item/stack/tile
src.repairing = 1
spawn(50)
T.build(src.loc)
@@ -284,8 +277,8 @@
src.anchored = 0
src.target = null
-/obj/machinery/bot/floorbot/proc/eattile(var/obj/item/weapon/tile/T)
- if(!istype(T, /obj/item/weapon/tile))
+/obj/machinery/bot/floorbot/proc/eattile(var/obj/item/stack/tile/T)
+ if(!istype(T, /obj/item/stack/tile))
return
for(var/mob/O in viewers(src, null))
O.show_message(text("\red [src] begins to collect tiles."), 1)
@@ -306,8 +299,8 @@
src.target = null
src.repairing = 0
-/obj/machinery/bot/floorbot/proc/maketile(var/obj/item/weapon/sheet/metal/M)
- if(!istype(M, /obj/item/weapon/sheet/metal))
+/obj/machinery/bot/floorbot/proc/maketile(var/obj/item/stack/sheet/metal/M)
+ if(!istype(M, /obj/item/stack/sheet/metal))
return
if(M.amount > 1)
return
@@ -319,7 +312,7 @@
src.target = null
src.repairing = 0
return
- var/obj/item/weapon/tile/T = new /obj/item/weapon/tile
+ var/obj/item/stack/tile/T = new /obj/item/stack/tile
T.amount = 4
T.loc = M.loc
del(M)
@@ -334,8 +327,8 @@
-/obj/item/weapon/storage/toolbox/mechanical/attackby(var/obj/item/weapon/tile/T, mob/user as mob)
- if(!istype(T, /obj/item/weapon/tile))
+/obj/item/weapon/storage/toolbox/mechanical/attackby(var/obj/item/stack/tile/T, mob/user as mob)
+ if(!istype(T, /obj/item/stack/tile))
..()
return
if(src.contents.len >= 1)
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index 921b9c3ec7a..ecd07debf4e 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -38,13 +38,7 @@
return
if(charging)
- charging.loc = usr
- charging.layer = 20
- if (user.hand )
- user.l_hand = charging
- else
- user.r_hand = charging
-
+ usr.put_in_hand(charging)
charging.add_fingerprint(user)
charging.updateicon()
@@ -53,6 +47,9 @@
chargelevel = -1
updateicon()
+/obj/machinery/cell_charger/attack_ai(mob/user)
+ return
+
/obj/machinery/cell_charger/process()
//world << "ccpt [charging] [stat]"
if(!charging || (stat & (BROKEN|NOPOWER)) )
diff --git a/code/game/machinery/computer/AIcore.dm b/code/game/machinery/computer/AIcore.dm
index 1351175728b..950b46c9226 100644
--- a/code/game/machinery/computer/AIcore.dm
+++ b/code/game/machinery/computer/AIcore.dm
@@ -10,7 +10,7 @@
var/obj/item/brain/brain = null
-/obj/AIcore/attackby(obj/item/weapon/P as obj, mob/user as mob)
+/obj/AIcore/attackby(obj/item/P as obj, mob/user as mob)
switch(state)
if(0)
if(istype(P, /obj/item/weapon/wrench))
@@ -23,8 +23,7 @@
playsound(src.loc, 'Welder.ogg', 50, 1)
if(do_after(user, 20))
user << "\blue You deconstruct the frame."
- var/obj/item/weapon/sheet/r_metal/A = new /obj/item/weapon/sheet/r_metal( src.loc )
- A.amount = 4
+ new /obj/item/stack/sheet/r_metal( src.loc, 4)
del(src)
if(1)
if(istype(P, /obj/item/weapon/wrench))
@@ -79,7 +78,7 @@
var/obj/item/weapon/cable_coil/A = new /obj/item/weapon/cable_coil( src.loc )
A.amount = 5
- if(istype(P, /obj/item/weapon/sheet/rglass))
+ if(istype(P, /obj/item/stack/sheet/rglass))
if(P:amount >= 2)
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
if(do_after(user, 20))
@@ -129,8 +128,7 @@
src.icon_state = "3b"
else
src.icon_state = "3"
- var/obj/item/weapon/sheet/rglass/A = new /obj/item/weapon/sheet/rglass( src.loc )
- A.amount = 2
+ new /obj/item/stack/sheet/rglass( src.loc, 2 )
if(istype(P, /obj/item/weapon/screwdriver))
playsound(src.loc, 'Screwdriver.ogg', 50, 1)
user << "\blue You connect the monitor."
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index a1ad3975be5..b95d71d5977 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -105,7 +105,7 @@
-/obj/computerframe/attackby(obj/item/weapon/P as obj, mob/user as mob)
+/obj/computerframe/attackby(obj/item/P as obj, mob/user as mob)
switch(state)
if(0)
if(istype(P, /obj/item/weapon/wrench))
@@ -118,8 +118,7 @@
playsound(src.loc, 'Welder.ogg', 50, 1)
if(do_after(user, 20))
user << "\blue You deconstruct the frame."
- var/obj/item/weapon/sheet/metal/A = new /obj/item/weapon/sheet/metal( src.loc )
- A.amount = 5
+ new /obj/item/stack/sheet/metal( src.loc, 5 )
del(src)
if(1)
if(istype(P, /obj/item/weapon/wrench))
@@ -171,24 +170,21 @@
var/obj/item/weapon/cable_coil/A = new /obj/item/weapon/cable_coil( src.loc )
A.amount = 5
- if(istype(P, /obj/item/weapon/sheet/glass))
+ if(istype(P, /obj/item/stack/sheet/glass))
if(P:amount >= 2)
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
if(do_after(user, 20))
- if(P)
- P:amount -= 2
- if(!P:amount) del(P)
- user << "\blue You put in the glass panel."
- src.state = 4
- src.icon_state = "4"
+ P:use(2)
+ user << "\blue You put in the glass panel."
+ src.state = 4
+ src.icon_state = "4"
if(4)
if(istype(P, /obj/item/weapon/crowbar))
playsound(src.loc, 'Crowbar.ogg', 50, 1)
user << "\blue You remove the glass panel."
src.state = 3
src.icon_state = "3"
- var/obj/item/weapon/sheet/glass/A = new /obj/item/weapon/sheet/glass( src.loc )
- A.amount = 2
+ new /obj/item/stack/sheet/glass( src.loc, 2 )
if(istype(P, /obj/item/weapon/screwdriver))
playsound(src.loc, 'Screwdriver.ogg', 50, 1)
user << "\blue You connect the monitor."
diff --git a/code/game/machinery/microwave.dm b/code/game/machinery/microwave.dm
index 48704c6bd29..ea98faceb6b 100644
--- a/code/game/machinery/microwave.dm
+++ b/code/game/machinery/microwave.dm
@@ -172,12 +172,12 @@
/datum/recipe/humankabob
humanmeat_amount = 2
- extra_item = /obj/item/weapon/rods
+ extra_item = /obj/item/stack/rods
creates = "/obj/item/weapon/reagent_containers/food/snacks/humankabob"
/datum/recipe/monkeykabob
monkeymeat_amount = 2
- extra_item = /obj/item/weapon/rods
+ extra_item = /obj/item/stack/rods
creates = "/obj/item/weapon/reagent_containers/food/snacks/monkeykabob"
/datum/recipe/tofubread
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index f29eef676bd..4f7d511e41e 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -92,7 +92,7 @@
if(istype(O,/obj/item/weapon/rcd))
if(O:matter < 30)
O:matter += 1
- if(istype(O,/obj/item/weapon/sheet/metal) || istype(O,/obj/item/weapon/sheet/rglass) || istype(O,/obj/item/weapon/cable_coil))
+ if(istype(O,/obj/item/stack/sheet/metal) || istype(O,/obj/item/stack/sheet/rglass) || istype(O,/obj/item/weapon/cable_coil))
if(O:amount < 50)
O:amount += 1
// Security
diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm
index 6b9f7c36a27..7f13c07d54e 100644
--- a/code/game/machinery/robot_fabricator.dm
+++ b/code/game/machinery/robot_fabricator.dm
@@ -8,8 +8,8 @@
var/operating = 0
var/obj/item/robot_parts/being_built = null
-/obj/machinery/robotic_fabricator/attackby(var/obj/item/weapon/O as obj, var/mob/user as mob)
- if (istype(O, /obj/item/weapon/sheet/metal))
+/obj/machinery/robotic_fabricator/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if (istype(O, /obj/item/stack/sheet/metal))
if (src.metal_amount < 150000.0)
var/count = 0
spawn(15)
@@ -17,7 +17,7 @@
if(!O:amount)
return
while(metal_amount < 150000 && O:amount)
- src.metal_amount += O:height * O:width * O:length * 100000.0
+ src.metal_amount += O:m_amt /*O:height * O:width * O:length * 100000.0*/
O:amount--
count++
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index 81b80fb8fd3..d926253250e 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -216,7 +216,6 @@
if(src.active >= 1)
src.active = 0
icon_state = "Shield_Gen"
- user << "You "
user.visible_message("[user] turned the shield generator off.", \
"You turn off the shield generator.", \
diff --git a/code/game/machinery/singularity.dm b/code/game/machinery/singularity.dm
index 25297b5e833..e2bd4caecd7 100644
--- a/code/game/machinery/singularity.dm
+++ b/code/game/machinery/singularity.dm
@@ -32,13 +32,14 @@ However people seem to like it for some reason.
anchored = !anchored
playsound(src.loc, 'Ratchet.ogg', 75, 1)
if(anchored)
- user.visible_message("[user.name] secure [src.name] to the floor.", \
+ user.visible_message("[user.name] secures [src.name] to the floor.", \
"You secure the [src.name] to the floor.", \
"You hear ratchet")
else
- user.visible_message("[user.name] unsecure [src.name] from the floor.", \
- "You unsecure the [src.name] to the floor.", \
+ user.visible_message("[user.name] unsecures [src.name] from the floor.", \
+ "You unsecure the [src.name] from the floor.", \
"You hear ratchet")
+ return
return ..()
/proc/singularity_is_surrounded(turf/T)
@@ -139,7 +140,7 @@ However people seem to like it for some reason.
/obj/machinery/the_singularity/proc/notify_collector_controller()
var/oldsrc = src
- src = 0 //for spawn() working even after Del(), see byond documentation about sleep() -rastaf0
+ src = null //for spawn() working even after Del(), see byond documentation about sleep() -rastaf0
for(var/obj/machinery/power/collector_control/myCC in orange(collector_control_range,oldsrc))
spawn() myCC.updatecons()
@@ -212,9 +213,6 @@ However people seem to like it for some reason.
gain = 2
else if(isturf(A))
- if(istype(A, /turf/space))
- world << "DEBUG: the_singularity tryes to eat space!!!11"
- return
/*if(!active)
if(isturf(A,/turf/simulated/floor/engine)) //here was a bug. But now it's a feature. -rasta0
return*/
@@ -299,19 +297,13 @@ However people seem to like it for some reason.
if (istype(X,/turf/simulated/floor) && !istype(X,/turf/simulated/floor/plating))
if(!X:broken)
if(prob(80))
- new/obj/item/weapon/tile (X)
+ new/obj/item/stack/tile (X)
X:break_tile_to_plating()
else
X:break_tile()
else if(istype(X,/turf/simulated/wall))
- if (istype(X,/turf/simulated/wall/r_wall))
- new /obj/structure/girder/reinforced( X )
- new /obj/item/weapon/sheet/r_metal( X )
- else
- new /obj/structure/girder( X )
- new /obj/item/weapon/sheet/metal( X )
- X:ReplaceWithFloor()
+ X:dismantle_wall()
else
X:ReplaceWithFloor()
@@ -662,16 +654,16 @@ However people seem to like it for some reason.
else if(state == 0)
state = 1
playsound(src.loc, 'Ratchet.ogg', 75, 1)
- user.visible_message("[user.name] secure [src.name] to the floor.", \
- "You secure the external reinforcing bolts to the floor.", \
+ user.visible_message("[user.name] secures [src.name] to the floor.", \
+ "You secure the external reinforcing bolts.", \
"You hear ratchet")
src.anchored = 1
else if(state == 1)
state = 0
playsound(src.loc, 'Ratchet.ogg', 75, 1)
- user.visible_message("[user.name] unsecure [src.name] to the floor.", \
- "You undo the external reinforcing bolts to the floor.", \
+ user.visible_message("[user.name] unsecures [src.name] to the floor.", \
+ "You undo the external reinforcing bolts.", \
"You hear ratchet")
src.anchored = 0
else
@@ -691,7 +683,7 @@ However people seem to like it for some reason.
playsound(src.loc, 'Welder2.ogg', 50, 1)
if(state == 1)
- user.visible_message("[user.name] start to weld [src.name] to the floor.", \
+ user.visible_message("[user.name] starts to weld [src.name] to the floor.", \
"You start to weld the [src] to the floor.", \
"You hear welding")
if (do_after(user,20))
@@ -701,7 +693,7 @@ However people seem to like it for some reason.
return 1
else if(state == 3)
- user.visible_message("[user.name] start to cut [src.name] to the floor.", \
+ user.visible_message("[user.name] starts to cut [src.name] from the floor.", \
"You start to cut the [src] free from the floor.", \
"You hear welding")
if (do_after(user,20))
@@ -818,11 +810,11 @@ However people seem to like it for some reason.
src.active = !src.active
if(src.active)
updateicon_on()
- user.visible_message("[user.name] turn on the collector array.", \
+ user.visible_message("[user.name] turns on the collector array.", \
"You turn on the collector array.")
else
updateicon_off()
- user.visible_message("[user.name] turn off the collector array.", \
+ user.visible_message("[user.name] turns off the collector array.", \
"You turn off the collector array.")
CU.updatecons()
@@ -858,11 +850,11 @@ However people seem to like it for some reason.
playsound(src.loc, 'Ratchet.ogg', 75, 1)
src.anchored = !src.anchored
if(src.anchored == 1)
- user.visible_message("[user.name] secure [src.name] reinforcing bolts to the floor.", \
- "You secure the collector reinforcing bolts to the floor.", \
+ user.visible_message("[user.name] secures [src.name] reinforcing bolts to the floor.", \
+ "You secure the collector reinforcing bolts.", \
"You hear ratchet")
else
- user.visible_message("[user.name] unsecure [src.name] reinforcing bolts to the floor.", \
+ user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \
"You undo the external reinforcing bolts.", \
"You hear ratchet")
for(var/obj/machinery/power/collector_control/myCC in orange(1,src))
@@ -1042,12 +1034,12 @@ However people seem to like it for some reason.
playsound(src.loc, 'Ratchet.ogg', 75, 1)
src.anchored = !src.anchored
if(src.anchored == 1)
- user.visible_message("[user.name] secure [src.name] to the floor.", \
+ user.visible_message("[user.name] secures [src.name] to the floor.", \
"You secure the [src.name] to the floor.", \
"You hear ratchet")
connect_to_network()
else
- user.visible_message("[user.name] unsecure [src.name] to the floor.", \
+ user.visible_message("[user.name] unsecures [src.name] to the floor.", \
"You undo the [src] securing bolts.", \
"You hear ratchet")
disconnect_from_network()
@@ -1122,11 +1114,11 @@ However people seem to like it for some reason.
if(src.active >= 1)
// src.active = 0
// icon_state = "Field_Gen"
- user << "You are unable to turn off the [src]r, wait till it powers down."
+ user << "You are unable to turn off the [src], wait till it powers down."
// src.cleanup()
return 1
else
- user.visible_message("[user.name] turn on [src.name]", \
+ user.visible_message("[user.name] turns on [src.name]", \
"You turn on the [src].", \
"You hear heavy droning")
turn_on()
@@ -1221,7 +1213,7 @@ However people seem to like it for some reason.
if(state == 0)
state = 1
playsound(src.loc, 'Ratchet.ogg', 75, 1)
- user.visible_message("[user.name] secure [src.name] to the floor.", \
+ user.visible_message("[user.name] secures [src.name] to the floor.", \
"You secure the external reinforcing bolts to the floor.", \
"You hear ratchet")
src.anchored = 1
@@ -1229,7 +1221,7 @@ However people seem to like it for some reason.
else if(state == 1)
state = 0
playsound(src.loc, 'Ratchet.ogg', 75, 1)
- user.visible_message("[user.name] unsecure [src.name] reinforcing bolts to the floor.", \
+ user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \
"You undo the external reinforcing bolts.", \
"You hear ratchet")
src.anchored = 0
@@ -1246,7 +1238,7 @@ However people seem to like it for some reason.
playsound(src.loc, 'Welder2.ogg', 50, 1)
if(state == 1)
- user.visible_message("[user.name] start to weld [src.name] to the floor.", \
+ user.visible_message("[user.name] starts to weld [src.name] to the floor.", \
"You start to weld the [src] to the floor.", \
"You hear welding")
if (do_after(user,20))
@@ -1256,7 +1248,7 @@ However people seem to like it for some reason.
return 1
else if(state == 3)
- user.visible_message("[user.name] start to cut [src.name] free from the floor.", \
+ user.visible_message("[user.name] starts to cut [src.name] free from the floor.", \
"You start to cut the [src] free from the floor.", \
"You hear welding")
if (do_after(user,20))
diff --git a/code/game/objects/closets.dm b/code/game/objects/closets.dm
index 74c52637e8d..aaa50687ca1 100644
--- a/code/game/objects/closets.dm
+++ b/code/game/objects/closets.dm
@@ -144,7 +144,7 @@
user << "\blue You need more welding fuel to complete this task."
return
W:use_fuel(1)
- new /obj/item/weapon/sheet/metal(src.loc)
+ new /obj/item/stack/sheet/metal(src.loc)
for (var/mob/M in viewers(src))
M.show_message("\red [src] has been cut apart by [user.name] with the weldingtool.", 3, "\red You hear welding.", 2)
del(src)
diff --git a/code/game/objects/door_assembly.dm b/code/game/objects/door_assembly.dm
index c86cec4c11e..05fc3b0a661 100644
--- a/code/game/objects/door_assembly.dm
+++ b/code/game/objects/door_assembly.dm
@@ -82,7 +82,7 @@ obj/door_assembly
state = 1
glass = 1
-/obj/door_assembly/attackby(obj/item/weapon/W as obj, mob/user as mob)
+/obj/door_assembly/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/weldingtool) && W:welding && !anchored )
if (W:get_fuel() < 1)
user << "\blue You need more welding fuel to dissassemble the airlock assembly."
@@ -94,12 +94,9 @@ obj/door_assembly
sleep(40)
if(get_turf(user) == T)
user << "\blue You dissasembled the airlock assembly!"
- new /obj/item/weapon/sheet/metal(get_turf(src))
- new /obj/item/weapon/sheet/metal(get_turf(src))
- new /obj/item/weapon/sheet/metal(get_turf(src))
- new /obj/item/weapon/sheet/metal(get_turf(src))
+ new /obj/item/stack/sheet/metal(get_turf(src), 4)
if(src.glass==1)
- new /obj/item/weapon/sheet/rglass(get_turf(src))
+ new /obj/item/stack/sheet/rglass(get_turf(src))
del(src)
else if(istype(W, /obj/item/weapon/wrench) && !anchored )
playsound(src.loc, 'Ratchet.ogg', 100, 1)
@@ -207,7 +204,7 @@ obj/door_assembly
ae = electronics
electronics = null
ae.loc = src.loc
- else if(istype(W, /obj/item/weapon/sheet/rglass) && glass == 0)
+ else if(istype(W, /obj/item/stack/sheet/rglass) && glass == 0)
playsound(src.loc, 'Crowbar.ogg', 100, 1)
var/turf/T = get_turf(user)
user.visible_message("[user] adds reinforced glass windows to the airlock assembly.", "You start to install reinforced glass windows into the airlock assembly.")
diff --git a/code/game/objects/grille.dm b/code/game/objects/grille.dm
index 68767b7c3ba..0a1422b39e2 100644
--- a/code/game/objects/grille.dm
+++ b/code/game/objects/grille.dm
@@ -131,11 +131,11 @@
src.icon_state = "brokengrille"
src.density = 0
src.destroyed = 1
- new /obj/item/weapon/rods( src.loc )
+ new /obj/item/stack/rods( src.loc )
else
if (src.health <= -10.0)
- new /obj/item/weapon/rods( src.loc )
+ new /obj/item/stack/rods( src.loc )
//SN src = null
del(src)
return
diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm
index 189c28a47ab..bcca62b2ea0 100644
--- a/code/game/objects/items/apc_frame.dm
+++ b/code/game/objects/items/apc_frame.dm
@@ -2,8 +2,7 @@
/obj/item/apc_frame/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/wrench))
- var/obj/item/weapon/sheet/metal/M = new /obj/item/weapon/sheet/metal( src.loc )
- M.amount = 2
+ new /obj/item/stack/sheet/metal( src.loc, 2 )
del(src)
/obj/item/apc_frame/proc/try_build(turf/on_wall)
diff --git a/code/game/objects/items/robot_parts.dm b/code/game/objects/items/robot_parts.dm
index ee6ff8bfe21..fccb083004f 100644
--- a/code/game/objects/items/robot_parts.dm
+++ b/code/game/objects/items/robot_parts.dm
@@ -71,18 +71,13 @@
return 0
/obj/item/robot_parts/robot_suit/attackby(obj/item/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/sheet/metal))
+ if(istype(W, /obj/item/stack/sheet/metal))
var/obj/item/weapon/ed209_assembly/B = new /obj/item/weapon/ed209_assembly
- B.loc = user
- if (user.r_hand == W)
- user.u_equip(W)
- user.r_hand = B
- else
- user.u_equip(W)
- user.l_hand = B
- B.layer = 20
user << "You armed the robot frame"
- del(W)
+ W:use(1)
+ if (user.get_inactive_hand()==src)
+ user.before_take_item(src)
+ user.put_in_inactive_hand(B)
del(src)
if(istype(W, /obj/item/robot_parts/l_leg))
user.drop_item()
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index b6ceec3f9d9..c1d05ce36f3 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -21,7 +21,7 @@ GETLINEEEEEEEEEEEEEEEEEEEEE
var/lit = 0 //on or off
var/turf/previousturf = null
var/obj/item/weapon/weldingtool/part1 = null
- var/obj/item/weapon/rods/part2 = null
+ var/obj/item/stack/rods/part2 = null
var/obj/item/device/igniter/part3 = null
var/obj/item/weapon/tank/plasma/part4 = null
m_amt = 500
@@ -155,7 +155,7 @@ GETLINEEEEEEEEEEEEEEEEEEEEE
if(isturf(location)) //start a fire if possible
location.hotspot_expose(700, 2)
-/obj/item/weapon/flamethrower/attackby(obj/item/weapon/tank/plasma/W as obj, mob/user as mob)
+/obj/item/weapon/flamethrower/attackby(obj/item/W as obj, mob/user as mob)
if(user.stat || user.restrained() || user.lying)
return
if (istype(W,/obj/item/weapon/tank/plasma))
diff --git a/code/game/objects/items/weapons/glass.dm b/code/game/objects/items/weapons/glass.dm
deleted file mode 100644
index d344ec0f907..00000000000
--- a/code/game/objects/items/weapons/glass.dm
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
-CONTAINS:
-GLASS SHEET
-REINFORCED GLASS SHEET
-SHARDS
-
-*/
-
-/obj/item/weapon/sheet/glass/attack_hand(mob/user as mob)
- if ((user.r_hand == src || user.l_hand == src))
- src.add_fingerprint(user)
- var/obj/item/weapon/sheet/glass/F = new /obj/item/weapon/sheet/glass( user )
- F.amount = 1
- src.amount--
- if (user.hand)
- user.l_hand = F
- else
- user.r_hand = F
- F.layer = 20
- F.add_fingerprint(user)
- if (src.amount < 1)
- //SN src = null
- del(src)
- return
- else
- ..()
- src.force = 5
- return
-
-/obj/item/weapon/sheet/glass/attackby(obj/item/weapon/W, mob/user)
- if ( istype(W, /obj/item/weapon/sheet/glass) )
- var/obj/item/weapon/sheet/glass/G = W
- if (G.amount >= MAX_STACK_AMOUNT_GLASS)
- return
- if (G.amount + src.amount > MAX_STACK_AMOUNT_GLASS)
- src.amount = G.amount + src.amount - MAX_STACK_AMOUNT_GLASS
- G.amount = MAX_STACK_AMOUNT_GLASS
- else
- G.amount += src.amount
- //SN src = null
- del(src)
- return
- return
- else if( istype(W, /obj/item/weapon/rods) )
-
- var/obj/item/weapon/rods/V = W
- var/obj/item/weapon/sheet/rglass/R = new /obj/item/weapon/sheet/rglass(user.loc)
- R.loc = user.loc
- R.add_fingerprint(user)
-
-
- if(V.amount == 1)
-
- if(user.client)
- user.client.screen -= V
-
- user.u_equip(W)
- del(W)
- else
- V.amount--
-
-
- if(src.amount == 1)
-
- if(user.client)
- user.client.screen -= src
-
- user.u_equip(src)
- del(src)
- else
- src.amount--
- return
-
-
-
-/obj/item/weapon/sheet/glass/examine()
- set src in view(1)
-
- ..()
- usr << text("There are [] glass sheet\s on the stack.", src.amount)
- return
-
-/obj/item/weapon/sheet/glass/attack_self(mob/user as mob)
-
- if (!( istype(usr.loc, /turf/simulated) ))
- return
- if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
- usr << "\red You don't have the dexterity to do this!"
- return
- switch(alert("Sheet-Glass", "Would you like full tile glass or one direction?", "one direct", "full (2 sheets)", "cancel", null))
- if("one direct")
- var/go = 1
- for (var/obj/window/win in usr.loc)
- if(win.ini_dir == NORTHWEST || win.ini_dir == NORTHEAST || win.ini_dir == SOUTHWEST || win.ini_dir == SOUTHEAST)
- go = 0
- if(go)
- var/obj/window/W = new /obj/window( usr.loc )
- W.anchored = 0
- if (src.amount < 1)
- return
- src.amount--
- else usr << "Can't let you do that."
- if("full (2 sheets)")
- var/go = 1
- for (var/obj/window/win in usr.loc)
- if(win)
- go = 0
- if (go)
- if (src.amount < 2)
- return
- src.amount -= 2
- var/obj/window/W = new /obj/window( usr.loc )
- W.dir = SOUTHWEST
- W.ini_dir = SOUTHWEST
- W.anchored = 0
- else usr << "Can't let you do that."
- else
- if (src.amount <= 0)
- user.u_equip(src)
- del(src)
- return
- return
-
-
-
-
-
-
-// REINFORCED GLASS
-
-/obj/item/weapon/sheet/rglass/attack_hand(mob/user as mob)
- if ((user.r_hand == src || user.l_hand == src))
- src.add_fingerprint(user)
- var/obj/item/weapon/sheet/rglass/F = new /obj/item/weapon/sheet/rglass( user )
- F.amount = 1
- src.amount--
- if (user.hand)
- user.l_hand = F
- else
- user.r_hand = F
- F.layer = 20
- F.add_fingerprint(user)
- if (src.amount < 1)
- //SN src = null
- del(src)
- return
- else
- ..()
- src.force = 5
- return
-
-/obj/item/weapon/sheet/rglass/attackby(obj/item/weapon/sheet/rglass/W as obj, mob/user as mob)
- if (!( istype(W, /obj/item/weapon/sheet/rglass) ))
- return
- if (W.amount >= MAX_STACK_AMOUNT_GLASS)
- return
- if (W.amount + src.amount > MAX_STACK_AMOUNT_GLASS)
- src.amount = W.amount + src.amount - MAX_STACK_AMOUNT_GLASS
- W.amount = MAX_STACK_AMOUNT_GLASS
- else
- W.amount += src.amount
- del(src)
- return
- return
-
-/obj/item/weapon/sheet/rglass/examine()
- set src in view(1)
-
- ..()
- usr << text("There are [] reinforced glass sheet\s on the stack.", src.amount)
- return
-
-/obj/item/weapon/sheet/rglass/attack_self(mob/user as mob)
- if (!istype(usr.loc, /turf/simulated))
- return
- if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
- usr << "\red You don't have the dexterity to do this!"
- return
- switch(alert("Sheet Reinf. Glass", "Would you like full tile glass or one direction?", "one direct", "full (2 sheets)", "cancel", null))
- if("one direct")
- var/go = 1
- for (var/obj/window/win in usr.loc)
- if(win.ini_dir == NORTHWEST || win.ini_dir == NORTHEAST || win.ini_dir == SOUTHWEST || win.ini_dir == SOUTHEAST)
- go = 0
- if(go)
- var/obj/window/W = new /obj/window( usr.loc, 1 )
- W.anchored = 0
- W.state = 0
- if (src.amount < 1)
- return
- src.amount--
- else usr << "Can't let you do that."
- if("full (2 sheets)")
- var/go = 1
- for (var/obj/window/win in usr.loc)
- if(win)
- go = 0
- if(go)
- if (src.amount < 2)
- return
- src.amount -= 2
- var/obj/window/W = new /obj/window( usr.loc, 1 )
- W.dir = SOUTHWEST
- W.ini_dir = SOUTHWEST
- W.anchored = 0
- W.state = 0
- else usr << "Can't let you do that."
- else
- if (src.amount <= 0)
- user.u_equip(src)
- //SN src = null
- del(src)
- return
- return
-
-
-
-
-
-
-
-
-// SHARDS
-
-/obj/item/weapon/shard/Bump()
-
- spawn( 0 )
- if (prob(20))
- src.force = 15
- else
- src.force = 4
- ..()
- return
- return
-
-/obj/item/weapon/shard/New()
-
- //****RM
- //world<<"New shard at [x],[y],[z]"
-
- src.icon_state = pick("large", "medium", "small")
- switch(src.icon_state)
- if("small")
- src.pixel_x = rand(1, 18)
- src.pixel_y = rand(1, 18)
- if("medium")
- src.pixel_x = rand(1, 16)
- src.pixel_y = rand(1, 16)
- if("large")
- src.pixel_x = rand(1, 10)
- src.pixel_y = rand(1, 5)
- else
- return
-
-/obj/item/weapon/shard/attackby(obj/item/weapon/W as obj, mob/user as mob)
- ..()
- if (!( istype(W, /obj/item/weapon/weldingtool) && W:welding ))
- return
- W:eyecheck(user)
- new /obj/item/weapon/sheet/glass( user.loc )
- //SN src = null
- del(src)
- return
-
-/obj/item/weapon/shard/HasEntered(AM as mob|obj)
- if(ismob(AM))
- var/mob/M = AM
- M << "\red You step in the broken glass!"
- playsound(src.loc, 'glass_step.ogg', 50, 1)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(!H.shoes)
- var/datum/organ/external/affecting = H.organs[pick("l_foot", "r_foot")]
- H.weakened = max(3, H.weakened)
- affecting.take_damage(5, 0)
- H.UpdateDamageIcon()
- H.updatehealth()
- ..()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/metals_rods.dm b/code/game/objects/items/weapons/metals_rods.dm
deleted file mode 100644
index 64f67d438fd..00000000000
--- a/code/game/objects/items/weapons/metals_rods.dm
+++ /dev/null
@@ -1,466 +0,0 @@
-/*
-CONTAINS:
-RODS
-METAL
-REINFORCED METAL
-LATTICE
-
-*/
-
-
-
-// RODS
-
-/obj/item/weapon/rods/examine()
- set src in view(1)
-
- ..()
- usr << text("There are [] rod\s left on the stack.", src.amount)
- return
-
-/obj/item/weapon/rods/attack_hand(mob/user as mob)
- if ((user.r_hand == src || user.l_hand == src))
- src.add_fingerprint(user)
- var/obj/item/weapon/rods/F = new /obj/item/weapon/rods( user )
- F.amount = 1
- src.amount--
- if (user.hand)
- user.l_hand = F
- else
- user.r_hand = F
- F.layer = 20
- F.add_fingerprint(user)
- if (src.amount < 1)
- //SN src = null
- del(src)
- return
- else
- ..()
- return
-
-/obj/item/weapon/rods/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/weldingtool) && W:welding)
- if(amount < 2)
- user << "\blue You need at least two rods to do this."
- return
- if (W:get_fuel() < 2)
- user << "\blue You need more welding fuel to complete this task."
- return
- W:eyecheck(user)
- W:use_fuel(2)
- new /obj/item/weapon/sheet/metal(usr.loc)
- for (var/mob/M in viewers(src))
- M.show_message("\red [src] is shaped into metal by [user.name] with the weldingtool.", 3, "\red You hear welding.", 2)
-
- amount -= 2
- if(amount == 0)
- del(src)
- return
- if (istype(W, /obj/item/weapon/rods))
- if (W:amount == MAX_STACK_AMOUNT_RODS)
- return
- if (W:amount + src:amount > MAX_STACK_AMOUNT_RODS)
- src.amount = W:amount + src:amount - MAX_STACK_AMOUNT_RODS
- W:amount = MAX_STACK_AMOUNT_RODS
- else
- W:amount += src:amount
- //SN src = null
- del(src)
- return
- return
-
-/obj/item/weapon/rods/attack_self(mob/user as mob)
- if (locate(/obj/grille, usr.loc))
- for(var/obj/grille/G in usr.loc)
- if (G.destroyed)
- G.health = 10
- G.density = 1
- G.destroyed = 0
- G.icon_state = "grille"
- src.amount--
- else
- else
- if (src.amount < 2)
- return
- src.amount -= 2
- new /obj/grille( usr.loc )
- if (src.amount < 1)
- del(src)
- return
- src.add_fingerprint(user)
- return
-
-
-
-
-// METAL SHEET
-
-/obj/item/weapon/sheet/metal/examine()
- set src in view(1)
-
- ..()
- usr << text("There are [] metal sheet\s on the stack.", src.amount)
- return
-
-/obj/item/weapon/sheet/metal/attack_hand(mob/user as mob)
- if ((user.r_hand == src || user.l_hand == src))
- src.add_fingerprint(user)
- var/obj/item/weapon/sheet/metal/F = new /obj/item/weapon/sheet/metal( user )
- F.amount = 1
- src.amount--
- if (user.hand)
- user.l_hand = F
- else
- user.r_hand = F
- F.layer = 20
- F.add_fingerprint(user)
- if (src.amount < 1)
- del(src)
- return
- else
- ..()
- src.force = 5
- return
-
-/obj/item/weapon/sheet/metal/attackby(obj/item/weapon/sheet/metal/W as obj, mob/user as mob)
- if (!( istype(W, /obj/item/weapon/sheet/metal) ))
- return
- if (W.amount >= MAX_STACK_AMOUNT_METAL)
- return
- if (W.amount + src.amount > MAX_STACK_AMOUNT_METAL)
- src.amount = W.amount + src.amount - MAX_STACK_AMOUNT_METAL
- W.amount = MAX_STACK_AMOUNT_METAL
- else
- W.amount += src.amount
- //SN src = null
- del(src)
- return
- return
-
-
-
-/obj/item/weapon/sheet/metal/attack_self(mob/user as mob)
- var/t1 = text("Amount Left: []
", src.amount)
- var/list/L = list( )
- L["stool"] = "stool"
- L["chair"] = "chair"
- L["bed"] = "bed (2 metal)
"
- L["table"] = "table parts (2 metal)"
- L["rack"] = "rack parts
"
- L["aircan"] = "air canister (2 metal)"
- L["o2can"] = "oxygen canister (2 metal)"
- L["carboncan"] = "co2 canister (2 metal)"
- L["plcan"] = "plasma canister (2 metal)"
- L["n2can"] = "n2 canister (2 metal)"
- L["n2ocan"] = "n2o canister (2 metal)"
- L["closet"] = "closet (2 metal)
"
- L["fl_tiles"] = "4x floor tiles"
- L["rods"] = "2x metal rods"
- L["casing"] = "grenade casing (1 metal)"
- L["reinforced"] = "reinforced sheet (2 metal)
"
- L["computer"] = "computer frame (5 metal)
"
- L["construct"] = "construct wall girders (2 metal)"
- L["airlock"] = "construct airlock assembly (4 metal)"
- L["apc_frame"] = "construct apc frame (2 metal)"
-
- for(var/t in L)
- t1 += text("[] ", src, t, L[t])
- t1 += "
"
- t1 += ""
- user << browse(t1, "window=met_sheet")
- onclose(user, "met_sheet")
- return
-
-/obj/item/weapon/sheet/metal/Topic(href, href_list)
- ..()
- if ((usr.restrained() || usr.stat || usr.equipped() != src))
- return
- if (href_list["make"])
- if (src.amount < 1)
- //SN src = null
- del(src)
- return
- switch(href_list["make"])
- if("rods")
- src.amount--
- var/obj/item/weapon/rods/R = new /obj/item/weapon/rods( usr.loc )
- R.amount = 2
- if("table")
- if (src.amount < 2)
- usr << text("\red You haven't got enough metal to build the table parts!")
- return
- src.amount -= 2
- new /obj/item/weapon/table_parts( usr.loc )
- if("stool")
- src.amount--
- new /obj/stool( usr.loc )
- if("chair")
- src.amount--
- var/obj/stool/chair/C = new /obj/stool/chair( usr.loc )
- C.dir = usr.dir
- if (C.dir == NORTH)
- C.layer = 5
- if("rack")
- src.amount--
- new /obj/item/weapon/rack_parts( usr.loc )
-
- if("aircan")
- if (src.amount < 2)
- usr << text("\red You haven't got enough metal to build the canister!")
- return
- src.amount -= 2
- var/obj/machinery/portable_atmospherics/canister/C = new /obj/machinery/portable_atmospherics/canister(usr.loc)
- C.color = "grey"
- C.icon_state = "grey"
-
- if("o2can")
- if (src.amount < 2)
- usr << text("\red You haven't got enough metal to build the canister!")
- return
- src.amount -= 2
-
- var/obj/machinery/portable_atmospherics/canister/C = new /obj/machinery/portable_atmospherics/canister(usr.loc)
- C.color = "blue"
- C.icon_state = "blue"
-
- if("carboncan")
- if (src.amount < 2)
- usr << text("\red You haven't got enough metal to build the canister!")
- return
- src.amount -= 2
-
- var/obj/machinery/portable_atmospherics/canister/C = new /obj/machinery/portable_atmospherics/canister(usr.loc)
- C.color = "black"
- C.icon_state = "black"
-
- if("plcan")
- if (src.amount < 2)
- usr << text("\red You haven't got enough metal to build the canister!")
- return
- src.amount -= 2
-
- var/obj/machinery/portable_atmospherics/canister/C = new /obj/machinery/portable_atmospherics/canister(usr.loc)
- C.color = "orange"
- C.icon_state = "orange"
-
- if("n2can")
- if (src.amount < 2)
- usr << text("\red You haven't got enough metal to build the canister!")
- return
- src.amount -= 2
- var/obj/machinery/portable_atmospherics/canister/C = new /obj/machinery/portable_atmospherics/canister(usr.loc)
- C.color = "red"
- C.icon_state = "red"
- if("n2ocan")
- if (src.amount < 2)
- usr << text("\red You haven't got enough metal to build the canister!")
- return
- src.amount -= 2
- var/obj/machinery/portable_atmospherics/canister/C = new /obj/machinery/portable_atmospherics/canister(usr.loc)
- C.color = "redws"
- C.icon_state = "redws"
-
- if("reinforced")
- if (src.amount < 2)
- usr << text("\red You haven't got enough metal to build the reinforced sheet!")
- return
- src.amount -= 2
- var/obj/item/weapon/sheet/r_metal/C = new /obj/item/weapon/sheet/r_metal( usr.loc )
- C.amount = 1
-
- if("casing")
- if (src.amount < 1) //Not possible!
- usr << text("\red You haven't got enough metal to create the grenade casing!")
- return
- src.amount--
- new /obj/item/weapon/chem_grenade( usr.loc )
-
- if("closet")
- if (src.amount < 2)
- usr << text("\red You haven't got enough metal to build the reinforced closet!")
- return
- src.amount -= 2
- new /obj/closet( usr.loc )
- if("fl_tiles")
- src.amount--
- var/obj/item/weapon/tile/R = new /obj/item/weapon/tile( usr.loc )
- R.amount = 4
- if("bed")
- if (src.amount < 2)
- usr << text("\red You haven't got enough metal to build the bed!")
- return
- src.amount -= 2
- new /obj/stool/bed( usr.loc )
- if("computer")
- if(src.amount < 5)
- usr << text("\red You haven't got enough metal to build the computer frame!")
- return
- src.amount -= 5
- new /obj/computerframe( usr.loc )
- if("construct")
- if (src.amount < 2)
- usr << text("\red You haven't got enough metal to construct the wall girders!")
- return
- usr << "\blue Building wall girders ..."
- var/turf/location = usr.loc
- sleep(50)
- if ((usr.loc == location))
- if (!istype(location, /turf/simulated/floor))
- return
-
- src.amount -= 2
- new /obj/structure/girder(location)
- if("airlock")
- if (src.amount < 4)
- usr << text("\red You haven't got enough metal to construct the airlock assembly!")
- return
- usr << "\blue Building airlock assembly ..."
- var/turf/location = usr.loc
- sleep(50)
- if ((usr.loc == location))
- if (!istype(location, /turf/simulated/floor))
- return
- src.amount -= 4
- new /obj/door_assembly(location)
- if("apc_frame")
- if (src.amount < 2)
- usr << text("\red You haven't got enough metal to build the APC frame!")
- return
- src.amount -= 2
- new /obj/item/apc_frame(usr.loc)
-
- if (src.amount <= 0)
- usr << browse(null, "window=met_sheet")
- onclose(usr, "met_sheet")
- usr.u_equip(src)
- del(src)
-
-
- return
- spawn( 0 )
- src.attack_self(usr)
- return
- return
-
-
-
-
-
-// REINFORCED METAL SHEET
-
-/obj/item/weapon/sheet/r_metal/attackby(obj/item/weapon/sheet/r_metal/W as obj, mob/user as mob)
- if (!( istype(W, /obj/item/weapon/sheet/r_metal) ))
- return
- if (W.amount >= MAX_STACK_AMOUNT_METAL)
- return
- if (W.amount + src.amount > MAX_STACK_AMOUNT_METAL)
- src.amount = W.amount + src.amount - MAX_STACK_AMOUNT_METAL
- W.amount = MAX_STACK_AMOUNT_METAL
- else
- W.amount += src.amount
- //SN src = null
- del(src)
- return
- return
-
-/obj/item/weapon/sheet/r_metal/attack_self(mob/user as mob)
- var/t1 = text("Amount Left: []
", src.amount)
- var/list/L = list( )
- L["table"] = "table parts (2 metal)"
- L["metal"] = "2x metal sheet (1 metal)
"
- L["core"] = "AI core (4 metal)"
- for(var/t in L)
- t1 += text("[] ", src, t, L[t])
- t1 += "
"
- t1 += ""
- user << browse(t1, "window=met_sheet")
- onclose(user, "met_sheet")
- return
-
-/obj/item/weapon/sheet/r_metal/Topic(href, href_list)
- ..()
- if ((usr.restrained() || usr.stat || usr.equipped() != src))
- return
- if (href_list["make"])
- if (src.amount < 1)
- //SN src = null
- del(src)
- return
- switch(href_list["make"])
- if("table")
- if (src.amount < 2)
- usr << text("\red You haven't got enough metal to build the reinforced table parts!")
- return
- src.amount -= 2
- new /obj/item/weapon/table_parts/reinforced( usr.loc )
- if("metal")
- if (src.amount < 1)
- usr << text("\red You haven't got enough metal to build the metal sheets!")
- return
- src.amount -= 1
- var/obj/item/weapon/sheet/metal/C = new /obj/item/weapon/sheet/metal( usr.loc )
- C.amount = 2
- if("core")
- if (src.amount < 4)
- usr << text("\red You haven't got enough metal to build the metal sheets!")
- return
- src.amount -= 4
- new /obj/AIcore( usr.loc )
-
-
- if (src.amount <= 0)
- usr << browse(null, "window=met_sheet")
- onclose(usr, "met_sheet")
- usr.u_equip(src)
- del(src)
-
-
- return
- spawn( 0 )
- src.attack_self(usr)
- return
- return
-
-
-
-// LATTICE????
-
-
-/obj/lattice/blob_act()
- del(src)
- return
-
-/obj/lattice/ex_act(severity)
- switch(severity)
- if(1.0)
- del(src)
- return
- if(2.0)
- del(src)
- return
- if(3.0)
- return
- else
- return
-
-/obj/lattice/attackby(obj/item/weapon/C as obj, mob/user as mob)
-
- if (istype(C, /obj/item/weapon/tile))
-
- C:build(get_turf(src))
- C:amount--
- playsound(src.loc, 'Genhit.ogg', 50, 1)
- C.add_fingerprint(user)
-
- if (C:amount < 1)
- user.u_equip(C)
- del(C)
- del(src)
- return
- if (istype(C, /obj/item/weapon/weldingtool) && C:welding)
- user << "\blue Slicing lattice joints ..."
- C:eyecheck(user)
- new /obj/item/weapon/rods(src.loc)
- del(src)
-
- return
diff --git a/code/game/objects/items/weapons/table_rack_parts.dm b/code/game/objects/items/weapons/table_rack_parts.dm
index a996cc6045a..b62560af40c 100644
--- a/code/game/objects/items/weapons/table_rack_parts.dm
+++ b/code/game/objects/items/weapons/table_rack_parts.dm
@@ -11,7 +11,7 @@ RACK PARTS
/obj/item/weapon/table_parts/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/wrench))
- new /obj/item/weapon/sheet/metal( src.loc )
+ new /obj/item/stack/sheet/metal( src.loc )
//SN src = null
del(src)
@@ -40,7 +40,7 @@ RACK PARTS
// REINFORCED TABLE PARTS
/obj/item/weapon/table_parts/reinforced/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/wrench))
- new /obj/item/weapon/sheet/r_metal( src.loc )
+ new /obj/item/stack/sheet/r_metal( src.loc )
//SN src = null
del(src)
@@ -70,7 +70,7 @@ RACK PARTS
// RACK PARTS
/obj/item/weapon/rack_parts/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/wrench))
- new /obj/item/weapon/sheet/metal( src.loc )
+ new /obj/item/stack/sheet/metal( src.loc )
del(src)
return
return
diff --git a/code/game/objects/items/weapons/tiles_wires.dm b/code/game/objects/items/weapons/tiles_wires.dm
index 53cafbe9ad7..59e96b89ef2 100644
--- a/code/game/objects/items/weapons/tiles_wires.dm
+++ b/code/game/objects/items/weapons/tiles_wires.dm
@@ -26,86 +26,3 @@ TILES
return
-
-// TILES
-
-/obj/item/weapon/tile/New()
-
- src.pixel_x = rand(1, 14)
- src.pixel_y = rand(1, 14)
- return
-
-/obj/item/weapon/tile/examine()
- set src in view(1)
-
- ..()
- usr << text("There are [] tile\s left on the stack.", src.amount)
- return
-
-/obj/item/weapon/tile/attack_hand(mob/user as mob)
-
- if ((user.r_hand == src || user.l_hand == src))
- src.add_fingerprint(user)
- var/obj/item/weapon/tile/F = new /obj/item/weapon/tile( user )
- F.amount = 1
- src.amount--
- if (user.hand)
- user.l_hand = F
- else
- user.r_hand = F
- F.layer = 20
- F.add_fingerprint(user)
- if (src.amount < 1)
- //SN src = null
- del(src)
- return
- else
- ..()
- return
-
-/obj/item/weapon/tile/attack_self(mob/user as mob)
-
- if (usr.stat)
- return
- var/T = user.loc
- if (!( istype(T, /turf) ))
- user << "\blue You must be on the ground!"
- return
- else
- var/S = T
- if (!( istype(S, /turf/space) ))
- user << "You cannot build on or repair this turf!"
- return
- else
- src.build(S)
- src.amount--
- if (src.amount < 1)
- user.u_equip(src)
- //SN src = null
- del(src)
- return
- src.add_fingerprint(user)
- return
-
-/obj/item/weapon/tile/attackby(obj/item/weapon/tile/W as obj, mob/user as mob)
-
- if (!( istype(W, /obj/item/weapon/tile) ))
- return
- if (W.amount == 10)
- return
- W.add_fingerprint(user)
- if (W.amount + src.amount > 10)
- src.amount = W.amount + src.amount - 10
- W.amount = 10
- else
- W.amount += src.amount
- //SN src = null
- del(src)
- return
- return
-
-/obj/item/weapon/tile/proc/build(turf/S as turf)
-
- var/turf/simulated/floor/W = S.ReplaceWithFloor()
- W.to_plating()
- return
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 27a69d59c18..8cacdf6d98d 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -88,15 +88,17 @@ WELDINGTOOOL
usr << text("\icon[] [] contains [] units of fuel left!", src, src.name, get_fuel() )
return
-/obj/item/weapon/weldingtool/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (status == 0 && istype(W,/obj/item/weapon/screwdriver))
- status = 1
- user << "\blue The welder can now be attached and modified."
- else if (status == 1 && istype(W,/obj/item/weapon/rods))
- var/obj/item/weapon/rods/R = W
- R.amount = R.amount - 1
- if (R.amount == 0)
- del(R)
+/obj/item/weapon/weldingtool/attackby(obj/item/W as obj, mob/user as mob)
+ if (istype(W,/obj/item/weapon/screwdriver))
+ status = !status
+ if (status)
+ user << "\blue You resecure the welder."
+ else
+ user << "\blue The welder can now be attached and modified."
+ src.add_fingerprint(user)
+ else if (status == 1 && istype(W,/obj/item/stack/rods))
+ var/obj/item/stack/rods/R = W
+ R.use(1)
var/obj/item/assembly/weld_rod/F = new /obj/item/assembly/weld_rod( user )
src.loc = F
F.part1 = src
@@ -120,10 +122,8 @@ WELDINGTOOOL
R.layer = 20
F.loc = user
src.add_fingerprint(user)
- else if (status == 1 && istype(W,/obj/item/weapon/screwdriver))
- status = 0
- user << "\blue You resecure the welder."
- return
+ else
+ ..()
// helper functions for weldingtool fuel use
diff --git a/code/game/objects/stacks/glass.dm b/code/game/objects/stacks/glass.dm
new file mode 100644
index 00000000000..b33cfe079a7
--- /dev/null
+++ b/code/game/objects/stacks/glass.dm
@@ -0,0 +1,137 @@
+/*
+CONTAINS:
+GLASS SHEET
+REINFORCED GLASS SHEET
+SHARDS
+
+*/
+
+/proc/construct_window(mob/usr as mob, obj/item/stack/sheet/src as obj)
+ if (!( istype(usr.loc, /turf/simulated) ))
+ return
+ if ( ! (istype(usr, /mob/living/carbon/human) || \
+ istype(usr, /mob/living/silicon) || \
+ istype(usr, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") )
+ usr << "\red You don't have the dexterity to do this!"
+ return 1
+ var/reinf = istype(src, /obj/item/stack/sheet/rglass)
+ var/title = reinf?"Sheet Reinf. Glass":"Sheet-Glass"
+ title += " ([src.amount] sheet\s left)"
+ switch(alert(title, "Would you like full tile glass or one direction?", "one direct", "full (2 sheets)", "cancel", null))
+ if("one direct")
+ if (src.amount < 1)
+ return 1
+ var/list/directions = new/list(cardinal)
+ for (var/obj/window/win in usr.loc)
+ directions-=win.dir
+ if(!(win.ini_dir in cardinal))
+ usr << "\red Can't let you do that."
+ return 1
+ var/obj/window/W = new /obj/window( usr.loc, reinf )
+ if (directions.len)
+ W.dir = directions[1]
+ W.ini_dir = W.dir
+ W.anchored = 0
+ src.use(1)
+ if("full (2 sheets)")
+ if (src.amount < 2)
+ return 1
+ if (locate(/obj/window) in usr.loc)
+ usr << "\red Can't let you do that."
+ return 1
+ var/obj/window/W = new /obj/window( usr.loc, reinf )
+ W.dir = SOUTHWEST
+ W.ini_dir = SOUTHWEST
+ W.anchored = 0
+ src.use(2)
+ else
+ //do nothing
+ return
+
+// GLASS
+
+/obj/item/stack/sheet/glass/attack_self(mob/user as mob)
+ construct_window(usr, src)
+
+/obj/item/stack/sheet/glass/attackby(obj/item/W, mob/user)
+ if( istype(W, /obj/item/stack/rods) )
+ var/obj/item/stack/rods/V = W
+ var/obj/item/stack/sheet/rglass/RG = new (user.loc)
+ RG.add_fingerprint(user)
+ RG.add_to_stacks(user)
+ V.use(1)
+ var/obj/item/stack/sheet/glass/G = src
+ src = null
+ var/replace = (user.get_inactive_hand()==G)
+ G.use(1)
+ if (!G && !RG && replace)
+ user.put_in_hand(RG)
+ else
+ return ..()
+
+
+// REINFORCED GLASS
+
+/obj/item/stack/sheet/rglass/attack_self(mob/user as mob)
+ construct_window(usr, src)
+
+
+
+
+
+
+// SHARDS
+
+/obj/item/weapon/shard/Bump()
+
+ spawn( 0 )
+ if (prob(20))
+ src.force = 15
+ else
+ src.force = 4
+ ..()
+ return
+ return
+
+/obj/item/weapon/shard/New()
+
+ //****RM
+ //world<<"New shard at [x],[y],[z]"
+
+ src.icon_state = pick("large", "medium", "small")
+ switch(src.icon_state)
+ if("small")
+ src.pixel_x = rand(1, 18)
+ src.pixel_y = rand(1, 18)
+ if("medium")
+ src.pixel_x = rand(1, 16)
+ src.pixel_y = rand(1, 16)
+ if("large")
+ src.pixel_x = rand(1, 10)
+ src.pixel_y = rand(1, 5)
+ else
+ return
+
+/obj/item/weapon/shard/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if ( istype(W, /obj/item/weapon/weldingtool) && W:welding )
+ W:eyecheck(user)
+ new /obj/item/stack/sheet/glass( user.loc )
+ //SN src = null
+ del(src)
+ return
+ return ..()
+
+/obj/item/weapon/shard/HasEntered(AM as mob|obj)
+ if(ismob(AM))
+ var/mob/M = AM
+ M << "\red You step in the broken glass!"
+ playsound(src.loc, 'glass_step.ogg', 50, 1)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(!H.shoes)
+ var/datum/organ/external/affecting = H.organs[pick("l_foot", "r_foot")]
+ H.weakened = max(3, H.weakened)
+ affecting.take_damage(5, 0)
+ H.UpdateDamageIcon()
+ H.updatehealth()
+ ..()
\ No newline at end of file
diff --git a/code/game/objects/stacks/metal.dm b/code/game/objects/stacks/metal.dm
new file mode 100644
index 00000000000..b179f63dede
--- /dev/null
+++ b/code/game/objects/stacks/metal.dm
@@ -0,0 +1,130 @@
+/*
+CONTAINS:
+RODS
+METAL
+REINFORCED METAL
+FLOOR TILES
+*/
+
+
+
+// RODS
+
+/obj/item/stack/rods/attackby(obj/item/W as obj, mob/user as mob)
+ if (istype(W, /obj/item/weapon/weldingtool) && W:welding)
+ if(amount < 2)
+ user << "\red You need at least two rods to do this."
+ return
+ if (W:get_fuel() < 3)
+ user << "\red You need more welding fuel to complete this task."
+ return
+ W:eyecheck(user)
+ W:use_fuel(2)
+ var/obj/item/stack/sheet/metal/new_item = new(usr.loc)
+ new_item.add_to_stacks(usr)
+ for (var/mob/M in viewers(src))
+ M.show_message("\red [src] is shaped into metal by [user.name] with the weldingtool.", 3, "\red You hear welding.", 2)
+ var/obj/item/stack/rods/R = src
+ src = null
+ var/replace = (user.get_inactive_hand()==R)
+ R.use(2)
+ if (!R && replace)
+ user.put_in_hand(new_item)
+ return
+ ..()
+
+
+/obj/item/stack/rods/attack_self(mob/user as mob)
+ src.add_fingerprint(user)
+ if (locate(/obj/grille, usr.loc))
+ for(var/obj/grille/G in usr.loc)
+ if (G.destroyed)
+ G.health = 10
+ G.density = 1
+ G.destroyed = 0
+ G.icon_state = "grille"
+ use(1)
+ else
+ return 1
+ else
+ if(amount < 2)
+ user << "\blue You need at least two rods to do this."
+ return
+ new /obj/grille( usr.loc )
+ use(2)
+ return
+
+
+
+// METAL SHEET
+
+// /datum/stack_recipe/New(title, result_type, req_amount, res_amount, max_res_amount, time, one_per_turf, on_floor = 0)
+var/global/list/datum/stack_recipe/metal_recipes = list ( \
+ new/datum/stack_recipe("stool", /obj/stool), \
+ new/datum/stack_recipe("chair", /obj/stool/chair, one_per_turf = 1), \
+ new/datum/stack_recipe("bed", /obj/stool/bed, 2, one_per_turf = 1), \
+ new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts, 2), \
+ new/datum/stack_recipe("rack parts", /obj/item/weapon/rack_parts), \
+ new/datum/stack_recipe("closet", /obj/closet, 2, one_per_turf = 1), \
+ null, \
+ new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 2, one_per_turf = 1), \
+ null, \
+ new/datum/stack_recipe("floor tile", /obj/item/stack/tile, 1, 4, 10), \
+ new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60), \
+ new/datum/stack_recipe("reinforced sheet", /obj/item/stack/sheet/r_metal, 2, 1, 50), \
+ null, \
+ new/datum/stack_recipe("computer frame", /obj/computerframe, 5, one_per_turf = 1), \
+ new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("airlock assembly", /obj/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ null, \
+ new/datum/stack_recipe("apc frame", /obj/item/apc_frame, 2), \
+ new/datum/stack_recipe("grenade casing", /obj/item/weapon/chem_grenade), \
+ )
+
+/obj/item/stack/sheet/metal
+ New(var/loc, var/amount=null)
+ recipes = metal_recipes
+ return ..()
+
+// REINFORCED METAL SHEET
+
+// /datum/stack_recipe/New(title, result_type, req_amount, res_amount, max_res_amount, time, one_per_turf, on_floor = 0)
+var/global/list/datum/stack_recipe/r_metal_recipes = list ( \
+ new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts/reinforced, 2), \
+ new/datum/stack_recipe("metal sheet", /obj/item/stack/sheet/metal, 1, 2, 50), \
+ new/datum/stack_recipe("AI core", /obj/AIcore, 4, one_per_turf = 1), \
+ )
+
+/obj/item/stack/sheet/r_metal
+ New(var/loc, var/amount=null)
+ recipes = r_metal_recipes
+ return ..()
+
+
+
+// TILES
+
+/obj/item/stack/tile/New()
+ src.pixel_x = rand(1, 14)
+ src.pixel_y = rand(1, 14)
+ return
+
+/obj/item/stack/tile/attack_self(mob/user as mob)
+ if (usr.stat)
+ return
+ var/T = user.loc
+ if (!( istype(T, /turf) ))
+ user << "\red You must be on the ground!"
+ return
+ if (!( istype(T, /turf/space) ))
+ user << "\red You cannot build on or repair this turf!"
+ return
+ src.build(T)
+ src.add_fingerprint(user)
+ use(1)
+ return
+
+/obj/item/stack/tile/proc/build(turf/S as turf)
+ var/turf/simulated/floor/W = S.ReplaceWithFloor()
+ W.to_plating()
+ return
\ No newline at end of file
diff --git a/code/game/objects/stacks/stack.dm b/code/game/objects/stacks/stack.dm
new file mode 100644
index 00000000000..4a81fe9a3a1
--- /dev/null
+++ b/code/game/objects/stacks/stack.dm
@@ -0,0 +1,203 @@
+/*
+ Base object for stackable items.
+ Stackable items are:
+ metal
+ rmetal
+ glass
+ rglass
+ floor tiles
+ metal rods
+*/
+
+/obj/item/stack/New(var/loc, var/amount=null)
+ ..()
+ if (amount)
+ src.amount=amount
+
+ return
+
+/obj/item/stack/examine()
+ set src in view(1)
+ ..()
+ usr << text("There are [] []\s left on the stack.", src.amount, src.singular_name)
+ return
+
+/obj/item/stack/proc/use(var/amount)
+ src.amount-=amount
+ if (src.amount<=0)
+ var/oldsrc = src
+ src = null //dont kill proc after del()
+ usr.before_take_item(oldsrc)
+ del(oldsrc)
+ return
+
+/obj/item/stack/proc/add_to_stacks(mob/usr as mob)
+ var/obj/item/stack/oldsrc = src
+ src = null
+ for (var/obj/item/stack/item in usr.loc)
+ if (item==oldsrc)
+ continue
+ if (!istype(item, oldsrc.type))
+ continue
+ if (item.amount>=item.max_amount)
+ continue
+ oldsrc.attackby(item, usr)
+ usr << "You add new [item.singular_name] to the stack. It now contains [item.amount] [item.singular_name]\s."
+ if(!oldsrc)
+ break
+
+/obj/item/stack/attack_hand(mob/user as mob)
+ if (user.get_inactive_hand() == src)
+ var/obj/item/stack/F = new src.type( user, amount=1)
+ F.copy_evidences(src)
+ user.put_in_hand(F)
+ src.add_fingerprint(user)
+ F.add_fingerprint(user)
+ use(1)
+ if (src && usr.machine==src)
+ spawn(0) src.interact(usr)
+ else
+ ..()
+ return
+
+/obj/item/stack/attackby(obj/item/W as obj, mob/user as mob)
+ if (istype(W, src.type))
+ var/obj/item/stack/S = W
+ if (S.amount >= max_amount)
+ return 1
+ var/to_transfer as num
+ if (user.get_inactive_hand()==src)
+ to_transfer = 1
+ else
+ to_transfer = min(src.amount, S.max_amount-S.amount)
+ S.amount+=to_transfer
+ src.use(to_transfer)
+ if (src && usr.machine==src)
+ spawn(0) src.interact(usr)
+ if (S && usr.machine==S)
+ spawn(0) S.interact(usr)
+ else return ..()
+
+/obj/item/stack/proc/copy_evidences(obj/item/stack/from as obj)
+ src.blood_DNA = from.blood_DNA
+ src.blood_type = from.blood_type
+ src.fingerprints = from.fingerprints
+ src.fingerprintshidden = from.fingerprintshidden
+ src.fingerprintslast = from.fingerprintslast
+
+/datum/stack_recipe
+ var/title = "ERROR"
+ var/result_type
+ var/req_amount = 1
+ var/res_amount = 1
+ var/max_res_amount = 1
+ var/time = 0
+ var/one_per_turf = 0
+ var/on_floor = 0
+ New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0)
+ src.title = title
+ src.result_type = result_type
+ src.req_amount = req_amount
+ src.res_amount = res_amount
+ src.max_res_amount = max_res_amount
+ src.time = time
+ src.one_per_turf = one_per_turf
+ src.on_floor = on_floor
+
+/obj/item/stack
+ var/list/datum/stack_recipe/recipes
+
+/obj/item/stack/attack_self(mob/user as mob)
+ interact(user)
+
+/obj/item/stack/proc/interact(mob/user as mob)
+ if (!recipes)
+ return
+ if (!src || amount<=0)
+ user << browse(null, "window=stack")
+ user.machine = src //for correct work of onclose
+ var/t1 = text("Constructions from []Amount Left: []", src, src.amount)
+ for(var/i=1;i<=recipes.len,i++)
+ var/datum/stack_recipe/R = recipes[i]
+ if (isnull(R))
+ t1 += "
"
+ continue
+ if (i>1 && !isnull(recipes[i-1]))
+ t1+="
"
+ var/max_multiplier = round(src.amount / R.req_amount)
+ var/title as text
+ var/can_build = 1
+ can_build = can_build && (max_multiplier>0)
+ if (R.one_per_turf)
+ can_build = can_build && !(locate(R.result_type) in usr.loc)
+ if (R.on_floor)
+ can_build = can_build && istype(usr.loc, /turf/simulated/floor)
+ if (R.res_amount>1)
+ title+= "[R.res_amount]x [R.title]\s"
+ else
+ title+= "[R.title]"
+ title+= " ([R.req_amount] [src.singular_name]\s)"
+ if (can_build)
+ t1 += text("[] ", src, i, title)
+ else
+ t1 += text("[]", title)
+ continue
+ if (R.max_res_amount>1 && max_multiplier>1)
+ var/multiplier = min(max_multiplier, round(R.max_res_amount/R.res_amount))
+ t1 += text(" | []x ", src, i, multiplier, multiplier*R.res_amount)
+ t1 += ""
+ user << browse(t1, "window=stack")
+ onclose(user, "stack")
+ return
+
+/obj/item/stack/Topic(href, href_list)
+ ..()
+ if ((usr.restrained() || usr.stat || usr.equipped() != src))
+ return
+ if (href_list["make"])
+ if (src.amount < 1) del(src) //Never should happen
+
+ var/datum/stack_recipe/R = recipes[text2num(href_list["make"])]
+ var/multiplier = text2num(href_list["multiplier"])
+ if (!multiplier) multiplier = 1
+ if (src.amount < R.req_amount*multiplier)
+ if (R.req_amount*multiplier>1)
+ usr << "\red You haven't got enough [src] to build \the [R.req_amount*multiplier] [R.title]\s!"
+ else
+ usr << "\red You haven't got enough [src] to build \the [R.title]!"
+ return
+ if (R.one_per_turf && (locate(R.result_type) in usr.loc))
+ usr << "\red There is another [R.title] here!"
+ return
+ if (R.on_floor && !istype(usr.loc, /turf/simulated/floor))
+ usr << "\red \The [R.title] must be constructed on the floor!"
+ return
+ if (R.time)
+ usr << "\blue Building [R.title] ..."
+ if (!do_after(usr, R.time))
+ return
+ if (src.amount < R.req_amount*multiplier)
+ return
+ var/O = new R.result_type( usr.loc )
+ if (R.max_res_amount>1)
+ var/obj/item/stack/new_item = O
+ new_item.amount = R.res_amount*multiplier
+ //new_item.add_to_stacks(usr)
+ src.amount-=R.req_amount*multiplier
+ if (src.amount<=0)
+ var/oldsrc = src
+ src = null //dont kill proc after del()
+ usr.before_take_item(oldsrc)
+ del(oldsrc)
+ if (istype(O,/obj/item))
+ usr.put_in_hand(O)
+ if (src && usr.machine==src) //do not reopen closed window
+ spawn( 0 )
+ src.interact(usr)
+ return
+ return
+
+/obj/item/stack/Del()
+ if (src && usr && usr.machine==src)
+ usr << browse(null, "window=stack")
+ ..()
diff --git a/code/game/objects/stool.dm b/code/game/objects/stool.dm
index f2963585303..f58030afbb6 100644
--- a/code/game/objects/stool.dm
+++ b/code/game/objects/stool.dm
@@ -20,13 +20,13 @@
/obj/stool/blob_act()
if(prob(75))
- new /obj/item/weapon/sheet/metal( src.loc )
+ new /obj/item/stack/sheet/metal( src.loc )
del(src)
/obj/stool/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/wrench))
playsound(src.loc, 'Ratchet.ogg', 50, 1)
- new /obj/item/weapon/sheet/metal( src.loc )
+ new /obj/item/stack/sheet/metal( src.loc )
//SN src = null
del(src)
return
@@ -36,7 +36,7 @@
..()
if (istype(W, /obj/item/weapon/wrench))
playsound(src.loc, 'Ratchet.ogg', 50, 1)
- new /obj/item/weapon/sheet/metal( src.loc )
+ new /obj/item/stack/sheet/metal( src.loc )
del(src)
return
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index cf4494b7a95..05cf90cdf0e 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -15,114 +15,128 @@ obj/structure
icon_state = "reinforced"
state = 2
-/obj/structure/girder/attackby(obj/item/weapon/W as obj, mob/user as mob)
+/obj/structure/girder/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/wrench) && state == 0 && anchored && !istype(src,/obj/structure/girder/displaced))
playsound(src.loc, 'Ratchet.ogg', 100, 1)
- var/turf/T = get_turf(user)
user << "\blue Now disassembling the girder"
- sleep(40)
- if(get_turf(user) == T)
+ if(do_after(user,40))
user << "\blue You dissasembled the girder!"
- new /obj/item/weapon/sheet/metal(get_turf(src))
+ new /obj/item/stack/sheet/metal(get_turf(src))
del(src)
- else if((istype(W, /obj/item/weapon/sheet/metal)) && (W:amount >= 2) && istype(src,/obj/structure/girder/displaced))
- W:amount -= 2
- if(W:amount <= 0)
- del(W)
+ else if((istype(W, /obj/item/stack/sheet/metal)) && (W:amount >= 2) && istype(src,/obj/structure/girder/displaced))
+ W:use(2)
user << "\blue You create a false wall! Push on it to open or close the passage."
new /obj/falsewall (src.loc)
del(src)
- else if(istype(W, /obj/item/weapon/sheet/r_metal) && istype(src,/obj/structure/girder/displaced))
- W:amount -= 1
- if(W:amount <= 0)
- del(W)
+ else if(istype(W, /obj/item/stack/sheet/r_metal) && istype(src,/obj/structure/girder/displaced))
+ W:use(2)
user << "\blue You create a false r wall! Push on it to open or close the passage."
new /obj/falserwall (src.loc)
del(src)
else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 && istype(src,/obj/structure/girder/reinforced))
playsound(src.loc, 'Screwdriver.ogg', 100, 1)
- var/turf/T = get_turf(user)
user << "\blue Now unsecuring support struts"
- sleep(40)
- if(get_turf(user) == T)
+ if(do_after(user,40))
user << "\blue You unsecured the support struts!"
state = 1
else if(istype(W, /obj/item/weapon/wirecutters) && istype(src,/obj/structure/girder/reinforced) && state == 1)
playsound(src.loc, 'Wirecutter.ogg', 100, 1)
- var/turf/T = get_turf(user)
user << "\blue Now removing support struts"
- sleep(40)
- if(get_turf(user) == T)
+ if(do_after(user,40))
user << "\blue You removed the support struts!"
new/obj/structure/girder( src.loc )
del(src)
else if(istype(W, /obj/item/weapon/crowbar) && state == 0 && anchored )
playsound(src.loc, 'Crowbar.ogg', 100, 1)
- var/turf/T = get_turf(user)
user << "\blue Now dislodging the girder"
- sleep(40)
- if(get_turf(user) == T)
+ if(do_after(user, 40))
user << "\blue You dislodged the girder!"
new/obj/structure/girder/displaced( src.loc )
del(src)
else if(istype(W, /obj/item/weapon/wrench) && state == 0 && !anchored )
playsound(src.loc, 'Ratchet.ogg', 100, 1)
- var/turf/T = get_turf(user)
user << "\blue Now securing the girder"
- sleep(40)
- if(get_turf(user) == T)
+ if(get_turf(user, 40))
user << "\blue You secured the girder!"
new/obj/structure/girder( src.loc )
del(src)
- else if((istype(W, /obj/item/weapon/sheet/metal)) && (W:amount >= 2))
- var/turf/T = get_turf(user)
+ else if((istype(W, /obj/item/stack/sheet/metal)) && (W:amount >= 2))
user << "\blue Now adding plating..."
- sleep(40)
- if (get_turf(user) == T)
+ if (do_after(user,40))
user << "\blue You added the plating!"
var/turf/Tsrc = get_turf(src)
Tsrc.ReplaceWithWall()
- W:amount -= 2
- if(W:amount <= 0)
- del(W)
+ W:use(2)
del(src)
return
- else if (istype(W, /obj/item/weapon/sheet/r_metal))
- var/turf/T = get_turf(user)
+ else if (istype(W, /obj/item/stack/sheet/r_metal))
if (src.icon_state == "reinforced") //Time to finalize!
user << "\blue Now finalising reinforced wall."
- sleep(50)
- if(W)
- if(get_turf(user) == T)
- user << "\blue Wall fully reinforced!"
- var/turf/Tsrc = get_turf(src)
- Tsrc.ReplaceWithRWall()
- W:amount--
- if (W:amount <= 0)
- del(W)
- del(src)
- return
+ if(do_after(user, 50))
+ user << "\blue Wall fully reinforced!"
+ var/turf/Tsrc = get_turf(src)
+ Tsrc.ReplaceWithRWall()
+ W:use(1)
+ del(src)
+ return
else
user << "\blue Now reinforcing girders"
- sleep(60)
- user << "\blue Girders reinforced!"
- W:amount--
- if (W:amount <= 0)
- del(W)
- new/obj/structure/girder/reinforced( src.loc )
- del(src)
- return
+ if (do_after(user,60))
+ user << "\blue Girders reinforced!"
+ W:use(1)
+ new/obj/structure/girder/reinforced( src.loc )
+ del(src)
+ return
else
..()
/obj/structure/girder/blob_act()
if(prob(40))
- del(src)
\ No newline at end of file
+ del(src)
+
+
+// LATTICE
+
+
+/obj/lattice/blob_act()
+ del(src)
+ return
+
+/obj/lattice/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ del(src)
+ return
+ if(2.0)
+ del(src)
+ return
+ if(3.0)
+ return
+ else
+ return
+
+/obj/lattice/attackby(obj/item/C as obj, mob/user as mob)
+
+ if (istype(C, /obj/item/stack/tile))
+
+ C:build(get_turf(src))
+ C:use(1)
+ playsound(src.loc, 'Genhit.ogg', 50, 1)
+ C.add_fingerprint(user)
+ del(src)
+ return
+ if (istype(C, /obj/item/weapon/weldingtool) && C:welding)
+ user << "\blue Slicing lattice joints ..."
+ C:eyecheck(user)
+ new /obj/item/stack/rods(src.loc)
+ del(src)
+
+ return
diff --git a/code/game/objects/window.dm b/code/game/objects/window.dm
index aecd3cc9784..b87f91f77b2 100644
--- a/code/game/objects/window.dm
+++ b/code/game/objects/window.dm
@@ -10,7 +10,7 @@
health -= 35
if(health <=0)
new /obj/item/weapon/shard( src.loc )
- new /obj/item/weapon/rods( src.loc )
+ new /obj/item/stack/rods( src.loc )
src.density = 0
del(src)
@@ -24,21 +24,21 @@
return
if(2.0)
new /obj/item/weapon/shard( src.loc )
- if(reinf) new /obj/item/weapon/rods( src.loc)
+ if(reinf) new /obj/item/stack/rods( src.loc)
//SN src = null
del(src)
return
if(3.0)
if (prob(50))
new /obj/item/weapon/shard( src.loc )
- if(reinf) new /obj/item/weapon/rods( src.loc)
+ if(reinf) new /obj/item/stack/rods( src.loc)
del(src)
return
return
/obj/window/blob_act()
- if(reinf) new /obj/item/weapon/rods( src.loc)
+ if(reinf) new /obj/item/stack/rods( src.loc)
density = 0
del(src)
@@ -66,7 +66,7 @@
//world << "glass at [x],[y],[z] Mhit"
src.health = 0
new /obj/item/weapon/shard( src.loc )
- if(reinf) new /obj/item/weapon/rods( src.loc)
+ if(reinf) new /obj/item/stack/rods( src.loc)
src.density = 0
@@ -92,7 +92,7 @@
step(src, get_dir(AM, src))
if (src.health <= 0)
new /obj/item/weapon/shard( src.loc )
- if(reinf) new /obj/item/weapon/rods( src.loc)
+ if(reinf) new /obj/item/stack/rods( src.loc)
src.density = 0
del(src)
return
@@ -107,7 +107,7 @@
O << text("\red [] smashes through the window!", usr)
src.health = 0
new /obj/item/weapon/shard( src.loc )
- if(reinf) new /obj/item/weapon/rods( src.loc)
+ if(reinf) new /obj/item/stack/rods( src.loc)
src.density = 0
del(src)
return
@@ -120,7 +120,7 @@
O << text("\red [] smashes through the window!", usr)
src.health = 0
new /obj/item/weapon/shard( src.loc )
- if(reinf) new /obj/item/weapon/rods( src.loc)
+ if(reinf) new /obj/item/stack/rods( src.loc)
src.density = 0
del(src)
return
@@ -142,7 +142,7 @@
src.health = 0
new /obj/item/weapon/shard(src.loc)
if(reinf)
- new /obj/item/weapon/rods(src.loc)
+ new /obj/item/stack/rods(src.loc)
src.density = 0
del(src)
return
@@ -183,11 +183,11 @@
index = 0
while(index < 2)
new /obj/item/weapon/shard( src.loc )
- if(reinf) new /obj/item/weapon/rods( src.loc)
+ if(reinf) new /obj/item/stack/rods( src.loc)
index++
else
new /obj/item/weapon/shard( src.loc )
- if(reinf) new /obj/item/weapon/rods( src.loc)
+ if(reinf) new /obj/item/stack/rods( src.loc)
src.density = 0
del(src)
return
diff --git a/code/game/turf.dm b/code/game/turf.dm
index 03e5203177d..9b8fc08aecd 100644
--- a/code/game/turf.dm
+++ b/code/game/turf.dm
@@ -227,21 +227,21 @@
if(!devastated)
playsound(src.loc, 'Welder.ogg', 100, 1)
new /obj/structure/girder/reinforced(src)
- new /obj/item/weapon/sheet/r_metal( src )
+ new /obj/item/stack/sheet/r_metal( src )
else
- new /obj/item/weapon/sheet/metal( src )
- new /obj/item/weapon/sheet/metal( src )
- new /obj/item/weapon/sheet/r_metal( src )
+ new /obj/item/stack/sheet/metal( src )
+ new /obj/item/stack/sheet/metal( src )
+ new /obj/item/stack/sheet/r_metal( src )
else
if(!devastated)
playsound(src.loc, 'Welder.ogg', 100, 1)
new /obj/structure/girder(src)
- new /obj/item/weapon/sheet/metal( src )
- new /obj/item/weapon/sheet/metal( src )
+ new /obj/item/stack/sheet/metal( src )
+ new /obj/item/stack/sheet/metal( src )
else
- new /obj/item/weapon/sheet/metal( src )
- new /obj/item/weapon/sheet/metal( src )
- new /obj/item/weapon/sheet/metal( src )
+ new /obj/item/stack/sheet/metal( src )
+ new /obj/item/stack/sheet/metal( src )
+ new /obj/item/stack/sheet/metal( src )
ReplaceWithFloor()
@@ -355,7 +355,7 @@
return
-/turf/simulated/wall/r_wall/attackby(obj/item/weapon/W as obj, mob/user as mob)
+/turf/simulated/wall/r_wall/attackby(obj/item/W as obj, mob/user as mob)
if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
usr << "\red You don't have the dexterity to do this!"
@@ -397,7 +397,7 @@
sleep(100)
if ((user.loc == T && user.equipped() == W))
src.d_state = 6
- new /obj/item/weapon/rods( src )
+ new /obj/item/stack/rods( src )
user << "\blue You removed the support rods."
else if (istype(W, /obj/item/weapon/wrench))
@@ -414,7 +414,7 @@
if (src.d_state == 0)
playsound(src.loc, 'Wirecutter.ogg', 100, 1)
src.d_state = 1
- new /obj/item/weapon/rods( src )
+ new /obj/item/stack/rods( src )
else if (istype(W, /obj/item/weapon/screwdriver))
if (src.d_state == 1)
@@ -447,7 +447,7 @@
dismantle_wall()
return
- else if ((istype(W, /obj/item/weapon/sheet/metal)) && (src.d_state))
+ else if ((istype(W, /obj/item/stack/sheet/metal)) && (src.d_state))
var/turf/T = user.loc
user << "\blue Repairing wall."
sleep(100)
@@ -491,7 +491,7 @@
switch(pick(1,2;75,3))
if (1)
src.ReplaceWithLattice()
- if(prob(33)) new /obj/item/weapon/sheet/metal(src)
+ if(prob(33)) new /obj/item/stack/sheet/metal(src)
if(2)
src.ReplaceWithSpace()
if(3)
@@ -500,7 +500,7 @@
else
src.break_tile()
src.hotspot_expose(1000,CELL_VOLUME)
- if(prob(33)) new /obj/item/weapon/sheet/metal(src)
+ if(prob(33)) new /obj/item/stack/sheet/metal(src)
if(3.0)
if (prob(50))
src.break_tile()
@@ -543,8 +543,7 @@ turf/simulated/floor/proc/update_icon()
user << "\blue Removing rods..."
playsound(src.loc, 'Ratchet.ogg', 80, 1)
if(do_after(user, 30))
- new /obj/item/weapon/rods(src)
- new /obj/item/weapon/rods(src)
+ new /obj/item/stack/rods(src, 2)
ReplaceWithFloor()
var/turf/simulated/floor/F = src
F.to_plating()
@@ -596,7 +595,7 @@ turf/simulated/floor/proc/update_icon()
icon_state = "floor"
levelupdate()
-/turf/simulated/floor/attackby(obj/item/weapon/C as obj, mob/user as mob)
+/turf/simulated/floor/attackby(obj/item/C as obj, mob/user as mob)
if(!C || !user)
return 0
@@ -605,36 +604,33 @@ turf/simulated/floor/proc/update_icon()
if(broken || burnt)
user << "\red You remove the broken plating."
else
- new /obj/item/weapon/tile(src)
+ new /obj/item/stack/tile(src)
to_plating()
playsound(src.loc, 'Crowbar.ogg', 80, 1)
return
- if(istype(C, /obj/item/weapon/rods))
+ if(istype(C, /obj/item/stack/rods))
if (!src.intact)
if (C:amount >= 2)
user << "\blue Reinforcing the floor..."
if(do_after(user, 30))
- if (C)
- ReplaceWithEngineFloor()
- C:amount -= 2
- if (C:amount <= 0) del(C) //wtf
- playsound(src.loc, 'Deconstruct.ogg', 80, 1)
+ ReplaceWithEngineFloor()
+ playsound(src.loc, 'Deconstruct.ogg', 80, 1)
+ C:use(2)
+ return
else
user << "\red You need more rods."
else
user << "\red You must remove the plating first."
return
- if(istype(C, /obj/item/weapon/tile) && !intact)
+ if(istype(C, /obj/item/stack/tile) && !intact)
restore_tile()
- var/obj/item/weapon/tile/T = C
+ var/obj/item/stack/tile/T = C
playsound(src.loc, 'Genhit.ogg', 50, 1)
- if(--T.amount < 1)
- del(T)
- return
+ T.use(1)
if(istype(C, /obj/item/weapon/cable_coil))
if(!intact)
@@ -685,32 +681,22 @@ turf/simulated/floor/proc/update_icon()
step(user.pulling, get_dir(user.pulling.loc, src))
return
-/turf/space/attackby(obj/item/weapon/C as obj, mob/user as mob)
+/turf/space/attackby(obj/item/C as obj, mob/user as mob)
- if (istype(C, /obj/item/weapon/rods))
+ if (istype(C, /obj/item/stack/rods))
user << "\blue Constructing support lattice ..."
playsound(src.loc, 'Genhit.ogg', 50, 1)
ReplaceWithLattice()
- C:amount--
-
- if (C:amount < 1)
- user.u_equip(C)
- del(C)
- return
+ C:use(1)
return
- if (istype(C, /obj/item/weapon/tile))
- if(locate(/obj/lattice, src))
- var/obj/lattice/L = locate(/obj/lattice, src)
+ if (istype(C, /obj/item/stack/tile))
+ var/obj/lattice/L = locate(/obj/lattice, src)
+ if(L)
del(L)
playsound(src.loc, 'Genhit.ogg', 50, 1)
C:build(src)
- C:amount--
-
- if (C:amount < 1)
- user.u_equip(C)
- del(C)
- return
+ C:use(1)
return
else
user << "\red The plating is going to need some support."
diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm
index 26b02db09f5..ed55ef1f76b 100644
--- a/code/modules/admin/verbs/deadsay.dm
+++ b/code/modules/admin/verbs/deadsay.dm
@@ -17,8 +17,8 @@
if (!msg)
return
- var/rendered = "DEAD: ADMIN([src.stealth ? pick("BADMIN", "ViktoriaSA", "Drunkwaffel", "Android Datuhh") : src.key]) says, \"[msg]\""
-
+ var/rendered = "DEAD: ADMIN([src.stealth ? src.fakekey : src.key]) says, \"[msg]\""
+ //pick("BADMIN", "ViktoriaSA", "Drunkwaffel", "Android Datuhh")
for (var/mob/M in world)
if(M.stat == 2 || (M.client && M.client.holder))
M.show_message(rendered, 2)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 0906546b5d4..425042f29c0 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -678,10 +678,9 @@
handle_regular_hud_updates()
- if (istype(src.ears, /obj/item/device/radio/headset/traitor))
- src.robot_talk_understand = 1
- else
- src.robot_talk_understand = 0
+ if (istype(src.ears, /obj/item/device/radio/headset))
+ var/obj/item/device/radio/headset/H = src.ears
+ src.robot_talk_understand = H.bintran
if (src.stat == 2 || src.mutations & 4)
src.sight |= SEE_TURFS
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index d48365a4e31..ccb635d4036 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -68,7 +68,7 @@
message_mode = "left hand"
message = copytext(message, 3)
- else if (copytext(message, 1, 3) == ":h")
+ else if (copytext(message, 1, 3) == ":h" || (copytext(message, 1, 3) == ":ð" ))
if (ishuman(src))
message_mode = "secure headset"
message = copytext(message, 3)
@@ -81,14 +81,17 @@
message_mode = "intercom"
message = copytext(message, 3)
- else if (copytext(message, 1, 3) == ":s" && src.robot_talk_understand)
+ else if ((copytext(message, 1, 3) == ":s" || (copytext(message, 1, 3) == ":û" )) && src.robot_talk_understand)
message = copytext(message, 3)
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
src.robot_talk(message)
return
- //
- message = trim(message)
+ else if ((copytext(message, 1, 3) == ":a" || (copytext(message, 1, 3) == ":ô")) && src.alien_talk_understand)
+ message = copytext(message, 3)
+ message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
+ src.alien_talk(message)
+ return
if (!message)
return
diff --git a/code/modules/mob/living/silicon/hivebot/hive_modules.dm b/code/modules/mob/living/silicon/hivebot/hive_modules.dm
index 56d34b7d3d8..4416dc2df81 100644
--- a/code/modules/mob/living/silicon/hivebot/hive_modules.dm
+++ b/code/modules/mob/living/silicon/hivebot/hive_modules.dm
@@ -44,11 +44,11 @@
src.modules += new /obj/item/weapon/wirecutters(src)
src.modules += new /obj/item/device/multitool(src)
- var/obj/item/weapon/sheet/metal/M = new /obj/item/weapon/sheet/metal(src)
+ var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(src)
M.amount = 50
src.modules += M
- var/obj/item/weapon/sheet/rglass/G = new /obj/item/weapon/sheet/rglass(src)
+ var/obj/item/stack/sheet/rglass/G = new /obj/item/stack/sheet/rglass(src)
G.amount = 50
src.modules += G
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index c19e9abb7ba..cf96280f1b7 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -59,11 +59,11 @@
src.modules += new /obj/item/weapon/wirecutters(src)
src.modules += new /obj/item/device/multitool(src)
- var/obj/item/weapon/sheet/metal/M = new /obj/item/weapon/sheet/metal(src)
+ var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(src)
M.amount = 50
src.modules += M
- var/obj/item/weapon/sheet/rglass/G = new /obj/item/weapon/sheet/rglass(src)
+ var/obj/item/stack/sheet/rglass/G = new /obj/item/stack/sheet/rglass(src)
G.amount = 50
src.modules += G
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 3438f010417..34fb176fa95 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1095,6 +1095,43 @@
T.Entered(W)
return
+/mob/proc/before_take_item(var/obj/item/item)
+ u_equip(item)
+ if (src.client)
+ src.client.screen -= item
+ src.update_clothing()
+ return
+
+/mob/proc/get_active_hand()
+ if (src.hand)
+ return src.l_hand
+ else
+ return src.r_hand
+
+/mob/proc/get_inactive_hand()
+ if ( ! src.hand)
+ return src.l_hand
+ else
+ return src.r_hand
+
+/mob/proc/put_in_hand(var/obj/item/I)
+ I.loc = src
+ if (src.hand)
+ src.l_hand = I
+ else
+ src.r_hand = I
+ I.layer = 20
+ src.update_clothing()
+
+/mob/proc/put_in_inactive_hand(var/obj/item/I)
+ I.loc = src
+ if (!src.hand)
+ src.l_hand = I
+ else
+ src.r_hand = I
+ I.layer = 20
+ src.update_clothing()
+
/mob/proc/reset_view(atom/A)
if (src.client)
if (istype(A, /atom/movable))
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 4199fbafaa3..4103aadf820 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -217,7 +217,7 @@
/obj/machinery/power/apc/attackby(obj/item/W, mob/user)
- if (istype(user, /mob/living/silicon))
+ if (istype(user, /mob/living/silicon) && get_dist(src,user)>1)
return src.attack_hand(user)
if (istype(W, /obj/item/weapon/crowbar) && opened)
if (has_electronics==1)
@@ -270,20 +270,20 @@
if (cell)
user << "\red Close the APC first." //Less hints more mystery!
return
- else if (!has_electronics || !terminal)
- user << "\red There is nothing to secure."
- return
else
if (has_electronics==1)
has_electronics = 2
stat &= ~MAINT
playsound(src.loc, 'Screwdriver.ogg', 50, 1)
user << "You screw the circuit electronics into place."
- else /*(has_electronics==2)*/
+ else if (has_electronics==2)
has_electronics = 1
stat |= MAINT
playsound(src.loc, 'Screwdriver.ogg', 50, 1)
user << "You unfasten the electronics."
+ else /* has_electronics==0 */
+ user << "\red There is nothing to secure."
+ return
updateicon()
else if(emagged || malfhack)
user << "The interface is broken"
@@ -377,7 +377,7 @@
playsound(src.loc, 'Welder.ogg', 50, 1)
if(do_after(user, 50))
if (emagged || malfhack || (stat & BROKEN) || opened==2)
- new /obj/item/weapon/sheet/metal(loc)
+ new /obj/item/stack/sheet/metal(loc)
user.visible_message(\
"\red [src] has been cut apart by [user.name] with the weldingtool.",\
"You disassembled brocken APC frame.",\
@@ -419,14 +419,15 @@
&& !opened \
&& W.force >= 5 \
&& W.w_class >= 3.0 \
- && !istype(W, /obj/item/weapon/gun) \
- && prob(10) )
+ && prob(20) )
opened = 2
user.visible_message("\red The APC cover was knocked down with the [W.name] by [user.name]!", \
"\red You knock down the APC cover with your [W.name]!", \
"You hear bang")
updateicon()
else
+ if (istype(user, /mob/living/silicon))
+ return src.attack_hand(user)
user.visible_message("\red The [src.name] has been hit with the [W.name] by [user.name]!", \
"\red You hit the [src.name] with your [W.name]!", \
"You hear bang")
@@ -478,7 +479,7 @@
return
if(wiresexposed && (!istype(user, /mob/living/silicon)))
user.machine = src
- var/t1 = text("Access Panel
\n")
+ var/t1 = text("[area.name] APC wiresAccess Panel
\n")
var/list/apcwires = list(
"Orange" = 1,
"Dark red" = 2,
@@ -495,7 +496,7 @@
t1 += "Pulse "
t1 += "
"
t1 += text("
\n[(src.locked ? "The APC is locked." : "The APC is unlocked.")]
\n[(src.shorted ? "The APCs power has been shorted." : "The APC is working properly!")]
\n[(src.aidisabled ? "The 'AI control allowed' light is off." : "The 'AI control allowed' light is on.")]")
- t1 += text("Close
\n")
+ t1 += text("Close
")
user << browse(t1, "window=apcwires")
onclose(user, "apcwires")
@@ -868,6 +869,7 @@
if (src.z == 1)
ticker.mode:apcs++
src.malfai = usr
+ src.locked = 1
if (src.cell)
if (src.cell.charge > 0)
src.cell.charge = 0
diff --git a/icons/obj/atmos.dmi b/icons/obj/atmos.dmi
index 808a6ef3135..3410ed93c89 100644
Binary files a/icons/obj/atmos.dmi and b/icons/obj/atmos.dmi differ
diff --git a/maps/tgstation.1.3.1.dmm b/maps/tgstation.1.3.1.dmm
index e6f3aefc8f1..d6c2ed3af3f 100644
--- a/maps/tgstation.1.3.1.dmm
+++ b/maps/tgstation.1.3.1.dmm
@@ -792,7 +792,7 @@
"apl" = (/turf/simulated/wall/r_wall,/area/maintenance/auxsolarstarboard)
"apm" = (/turf/simulated/wall/r_wall,/area/maintenance/fpmaint2)
"apn" = (/obj/securearea{tag = "icon-space"; name = "EXTERNAL AIRLOCK"; desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"},/turf/simulated/wall/r_wall,/area/maintenance/fpmaint2)
-"apo" = (/obj/item/weapon/tile,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"apo" = (/obj/item/stack/tile,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"app" = (/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"apq" = (/obj/machinery/light/small{dir = 1},/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"apr" = (/obj/grille,/obj/window/reinforced/north,/obj/window/reinforced/west,/obj/window/reinforced/east,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
@@ -1134,7 +1134,7 @@
"avP" = (/obj/table{icon_state = "tabledir"; dir = 2},/obj/item/device/radio/signaler,/obj/item/device/radio/signaler,/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor,/area/storage/primary)
"avQ" = (/obj/table{icon_state = "tabledir"; dir = 2},/obj/item/device/multitool,/obj/machinery/cell_charger,/obj/item/weapon/cell{charge = 100; maxcharge = 15000},/turf/simulated/floor,/area/storage/primary)
"avR" = (/obj/table{icon_state = "tabledir"; dir = 6},/obj/item/weapon/storage/toolbox/mechanical,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/storage/primary)
-"avS" = (/obj/machinery/power/apc{dir = 1; name = "Storage APC"; pixel_x = -1; pixel_y = 26},/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/sheet/metal{amount = 50},/obj/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor,/area/storage/primary)
+"avS" = (/obj/machinery/power/apc{dir = 1; name = "Storage APC"; pixel_x = -1; pixel_y = 26},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor,/area/storage/primary)
"avT" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor,/area/storage/primary)
"avU" = (/obj/item/weapon/cell,/turf/simulated/floor/plating,/area/storage/tech)
"avV" = (/obj/rack{dir = 4},/obj/item/weapon/circuitboard/card,/turf/simulated/floor/plating,/area/storage/tech)
@@ -1149,8 +1149,8 @@
"awe" = (/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0; tag = "icon-off (WEST)"},/turf/simulated/floor{tag = "icon-freezerfloor"; icon_state = "freezerfloor"},/area/crew_quarters/sleep_male/toilet_male)
"awf" = (/obj/machinery/door/airlock{name = "Unit 3"},/turf/simulated/floor{tag = "icon-freezerfloor"; icon_state = "freezerfloor"},/area/crew_quarters/sleep_male/toilet_male)
"awg" = (/obj/machinery/atmospherics/pipe/simple,/obj/disposalpipe/junction,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"awh" = (/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/crowbar,/turf/simulated/floor,/area/ai_monitored/storage/eva)
-"awi" = (/obj/table{icon_state = "tabledir"; dir = 9},/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/extinguisher,/turf/simulated/floor,/area/ai_monitored/storage/eva)
+"awh" = (/obj/machinery/alarm{pixel_y = 23},/obj/item/stack/sheet/metal{amount = 50},/obj/item/weapon/crowbar,/turf/simulated/floor,/area/ai_monitored/storage/eva)
+"awi" = (/obj/table{icon_state = "tabledir"; dir = 9},/obj/item/stack/sheet/metal{amount = 50},/obj/item/weapon/extinguisher,/turf/simulated/floor,/area/ai_monitored/storage/eva)
"awj" = (/obj/machinery/light/small{dir = 8},/obj/landmark{name = "blobstart"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"awk" = (/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/turf/simulated/floor{tag = "icon-freezerfloor"; icon_state = "freezerfloor"},/area/crew_quarters/sleep_female/toilet_female)
"awl" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor{tag = "icon-freezerfloor"; icon_state = "freezerfloor"},/area/crew_quarters/sleep_female/toilet_female)
@@ -1196,8 +1196,8 @@
"awZ" = (/obj/landmark/start{name = "Assistant"},/obj/cable{icon_state = "2-8"; d1 = 2; d2 = 8},/turf/simulated/floor,/area/storage/primary)
"axa" = (/obj/landmark/start{name = "Assistant"},/turf/simulated/floor,/area/storage/primary)
"axb" = (/obj/stool{pixel_y = 8},/obj/landmark/start{name = "Assistant"},/turf/simulated/floor,/area/storage/primary)
-"axc" = (/obj/item/weapon/rods{amount = 50},/obj/landmark/start{name = "Assistant"},/turf/simulated/floor,/area/storage/primary)
-"axd" = (/obj/item/weapon/sheet/glass{amount = 50},/obj/landmark/start{name = "Assistant"},/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/turf/simulated/floor,/area/storage/primary)
+"axc" = (/obj/item/stack/rods{amount = 50},/obj/landmark/start{name = "Assistant"},/turf/simulated/floor,/area/storage/primary)
+"axd" = (/obj/item/stack/sheet/glass{amount = 50},/obj/landmark/start{name = "Assistant"},/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/turf/simulated/floor,/area/storage/primary)
"axe" = (/turf/simulated/floor,/area/storage/primary)
"axf" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/item/weapon/storage/lightbox/tubes,/turf/simulated/floor/plating,/area/storage/tech)
"axg" = (/obj/rack{dir = 4},/obj/item/weapon/circuitboard/communications,/turf/simulated/floor/plating,/area/storage/tech)
@@ -1215,7 +1215,7 @@
"axs" = (/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 30},/turf/simulated/floor,/area/ai_monitored/storage/eva)
"axt" = (/obj/machinery/light{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore)
"axu" = (/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor,/area/ai_monitored/storage/eva)
-"axv" = (/obj/table{icon_state = "tabledir"; dir = 8},/obj/item/weapon/sheet/glass{amount = 50},/obj/machinery/light{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/ai_monitored/storage/eva)
+"axv" = (/obj/table{icon_state = "tabledir"; dir = 8},/obj/item/stack/sheet/glass{amount = 50},/obj/machinery/light{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/floor,/area/ai_monitored/storage/eva)
"axw" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"axx" = (/obj/machinery/door/airlock{name = "Unit 2"},/obj/disposalpipe/segment{dir = 4},/turf/simulated/floor{tag = "icon-freezerfloor"; icon_state = "freezerfloor"},/area/crew_quarters/sleep_female/toilet_female)
"axy" = (/obj/disposalpipe/junction{dir = 4; icon_state = "pipe-j2"},/turf/simulated/wall,/area/crew_quarters/sleep_female/toilet_female)
@@ -1264,7 +1264,7 @@
"ayp" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; initialize_directions = 12; layer = 3},/obj/rack{dir = 1},/obj/item/clothing/mask/gas/emergency,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"ayq" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; initialize_directions = 12; layer = 3},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"ayr" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; initialize_directions = 12; layer = 3},/obj/machinery/atmospherics/pipe/simple,/turf/simulated/wall/r_wall,/area/maintenance/fpmaint)
-"ays" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; initialize_directions = 12; layer = 3},/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/obj/item/weapon/tile,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"ays" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; initialize_directions = 12; layer = 3},/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/obj/item/stack/tile,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"ayt" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; initialize_directions = 12; layer = 3},/obj/machinery/atmospherics/pipe/simple,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"ayu" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; initialize_directions = 12; layer = 3},/obj/machinery/atmospherics/pipe/simple,/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"ayv" = (/obj/machinery/atmospherics/pipe/simple{dir = 9; icon_state = "intact-f"; layer = 3},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
@@ -1278,8 +1278,8 @@
"ayD" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/fore)
"ayE" = (/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/ai_monitored/storage/eva)
"ayF" = (/obj/crate/rcd,/obj/machinery/camera{c_tag = "EVA South-East"; dir = 1},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/ai_monitored/storage/eva)
-"ayG" = (/obj/item/weapon/rods{amount = 50},/turf/simulated/floor,/area/ai_monitored/storage/eva)
-"ayH" = (/obj/table{icon_state = "tabledir"; dir = 10},/obj/item/weapon/sheet/rglass{amount = 50},/turf/simulated/floor,/area/ai_monitored/storage/eva)
+"ayG" = (/obj/item/stack/rods{amount = 50},/turf/simulated/floor,/area/ai_monitored/storage/eva)
+"ayH" = (/obj/table{icon_state = "tabledir"; dir = 10},/obj/item/stack/sheet/rglass{amount = 50},/turf/simulated/floor,/area/ai_monitored/storage/eva)
"ayI" = (/obj/machinery/door/airlock/maintenance{name = "Bathroom Maintenance"; req_access_txt = "12"},/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"ayJ" = (/obj/disposalpipe/segment,/turf/simulated/wall,/area/maintenance/fsmaint)
"ayK" = (/obj/grille,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
@@ -2016,7 +2016,7 @@
"aMN" = (/obj/machinery/robotic_fabricator,/obj/cable{icon_state = "0-4"; d2 = 4},/obj/cable,/turf/simulated/floor,/area/medical/robotics)
"aMO" = (/obj/machinery/robotic_fabricator,/obj/cable{icon_state = "0-4"; d2 = 4},/obj/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/medical/robotics)
"aMP" = (/obj/machinery/robotic_fabricator,/obj/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/medical/robotics)
-"aMQ" = (/obj/crate,/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/cell{charge = 100; maxcharge = 15000},/obj/item/weapon/cell{charge = 100; maxcharge = 15000},/obj/item/weapon/cable_coil,/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/sheet/metal{amount = 50},/turf/simulated/floor,/area/medical/robotics)
+"aMQ" = (/obj/crate,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/weapon/cell{charge = 100; maxcharge = 15000},/obj/item/weapon/cell{charge = 100; maxcharge = 15000},/obj/item/weapon/cable_coil,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/turf/simulated/floor,/area/medical/robotics)
"aMR" = (/obj/machinery/atmospherics/pipe/simple,/turf/simulated/wall,/area/medical/robotics)
"aMS" = (/obj/stool/chair{dir = 4},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor{dir = 8; icon_state = "escape"; tag = "icon-escape (WEST)"},/area/hallway/secondary/exit)
"aMT" = (/obj/machinery/atmospherics/pipe/simple,/obj/grille,/obj/window/reinforced{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/window/reinforced{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/window/reinforced{tag = "icon-rwindow (NORTH)"; icon_state = "rwindow"; dir = 1},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
@@ -2417,7 +2417,7 @@
"aUy" = (/obj/item/weapon/storage/mousetraps,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/kitchen)
"aUz" = (/obj/table,/obj/item/weapon/reagent_containers/food/condiment/enzyme,/obj/item/weapon/reagent_containers/food/condiment/oliveoil,/obj/item/weapon/reagent_containers/glass/beaker,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/kitchen)
"aUA" = (/obj/crate,/turf/simulated/floor/plating,/area/maintenance/maintcentral)
-"aUB" = (/obj/machinery/atmospherics/pipe/simple,/obj/item/weapon/tile,/turf/simulated/floor/plating,/area/maintenance/maintcentral)
+"aUB" = (/obj/machinery/atmospherics/pipe/simple,/obj/item/stack/tile,/turf/simulated/floor/plating,/area/maintenance/maintcentral)
"aUC" = (/obj/disposalpipe/segment,/obj/landmark{name = "blobstart"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/maintcentral)
"aUD" = (/obj/grille,/obj/window/reinforced{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/window/reinforced{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/turf/simulated/floor/plating,/area/medical/research)
"aUE" = (/obj/stool/chair{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/research)
@@ -2433,7 +2433,7 @@
"aUO" = (/obj/disposalpipe/junction{dir = 4; icon_state = "pipe-j2"},/turf/simulated/floor{tag = "icon-freezerfloor"; icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
"aUP" = (/obj/disposalpipe/segment{dir = 4},/turf/simulated/floor{tag = "icon-freezerfloor"; icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
"aUQ" = (/obj/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall,/area/maintenance/port)
-"aUR" = (/obj/machinery/atmospherics/pipe/simple{dir = 6; icon_state = "intact-f"; layer = 3},/obj/item/weapon/sheet/rglass,/turf/simulated/floor/plating,/area/maintenance/port)
+"aUR" = (/obj/machinery/atmospherics/pipe/simple{dir = 6; icon_state = "intact-f"; layer = 3},/obj/item/stack/sheet/rglass,/turf/simulated/floor/plating,/area/maintenance/port)
"aUS" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; layer = 3},/obj/item/weapon/screwdriver,/turf/simulated/floor/plating,/area/maintenance/port)
"aUT" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; layer = 3},/obj/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
"aUU" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; layer = 3},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/port)
@@ -2772,7 +2772,7 @@
"bbp" = (/obj/landmark/start{name = "Cargo Technician"},/turf/simulated/floor,/area/quartermaster/storage)
"bbq" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; location = "QM #2"},/obj/machinery/bot/mulebot{home_destination = "QM #2"},/turf/simulated/floor{icon_state = "bot"},/area/quartermaster/storage)
"bbr" = (/obj/grille,/obj/window/reinforced/east,/obj/window/reinforced/west,/obj/disposalpipe/segment,/turf/simulated/floor/plating,/area/quartermaster/storage)
-"bbs" = (/obj/table{icon_state = "tabledir"; dir = 4},/obj/item/weapon/rods{amount = 50},/turf/simulated/floor,/area/quartermaster/office)
+"bbs" = (/obj/table{icon_state = "tabledir"; dir = 4},/obj/item/stack/rods{amount = 50},/turf/simulated/floor,/area/quartermaster/office)
"bbt" = (/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/turf/simulated/floor,/area/quartermaster)
"bbu" = (/obj/stool/chair{dir = 8},/obj/machinery/light{dir = 4; icon_state = "tube1"; tag = "icon-tube1 (EAST)"},/turf/simulated/floor,/area/quartermaster)
"bbv" = (/obj/grille,/obj/window/reinforced/west,/obj/window/reinforced/east,/obj/window/reinforced,/turf/simulated/floor/plating,/area/quartermaster)
@@ -4504,7 +4504,7 @@
"bIF" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0; tag = "icon-off (WEST)"},/turf/simulated/floor,/area/engine/engine_hallway)
"bIG" = (/obj/machinery/atmospherics/pipe/simple{dir = 5; icon_state = "intact-f"; layer = 3},/turf/simulated/floor,/area/engine/engine_hallway)
"bIH" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; initialize_directions = 12; layer = 3},/turf/simulated/floor,/area/engine/engine_hallway)
-"bII" = (/obj/item/weapon/sheet/glass{amount = 50},/obj/item/weapon/sheet/glass{amount = 50},/obj/item/weapon/sheet/glass{amount = 50},/obj/machinery/atmospherics/pipe/simple{dir = 10; icon_state = "intact-f"; layer = 3},/turf/simulated/floor,/area/engine/engine_hallway)
+"bII" = (/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/machinery/atmospherics/pipe/simple{dir = 10; icon_state = "intact-f"; layer = 3},/turf/simulated/floor,/area/engine/engine_hallway)
"bIJ" = (/obj/table{icon_state = "tabledir"; dir = 9},/obj/machinery/light/small{dir = 4},/obj/item/device/analyzer,/obj/item/weapon/storage/utilitybelt,/obj/item/weapon/storage/utilitybelt,/obj/item/weapon/storage/utilitybelt,/turf/simulated/floor,/area/engine/engine_hallway)
"bIK" = (/obj/machinery/atmospherics/pipe/simple,/obj/grille,/turf/simulated/wall/r_wall,/area/atmos)
"bIL" = (/obj/cable{icon_state = "2-4"; d1 = 2; d2 = 4},/turf/simulated/floor/plating/airless,/area)
@@ -4536,7 +4536,7 @@
"bJl" = (/turf/simulated/floor,/area/engine/engine_hallway)
"bJm" = (/obj/item/weapon/pen,/turf/simulated/floor,/area/engine/engine_hallway)
"bJn" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor,/area/engine/engine_hallway)
-"bJo" = (/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/sheet/metal{amount = 50},/obj/machinery/atmospherics/pipe/manifold{dir = 4; initialize_directions = 11},/turf/simulated/floor,/area/engine/engine_hallway)
+"bJo" = (/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/machinery/atmospherics/pipe/manifold{dir = 4; initialize_directions = 11},/turf/simulated/floor,/area/engine/engine_hallway)
"bJp" = (/obj/table{icon_state = "tabledir"; dir = 10},/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/turf/simulated/floor,/area/engine/engine_hallway)
"bJq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id = "n2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
"bJr" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2_sensor"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
@@ -4702,7 +4702,7 @@
"bMv" = (/turf/simulated/floor/engine,/area/engine/engine_control)
"bMw" = (/obj/item/clothing/head/helmet/hardhat,/turf/simulated/floor/engine,/area/engine/engine_control)
"bMx" = (/obj/item/weapon/weldingtool,/turf/simulated/floor/engine,/area/engine/engine_control)
-"bMy" = (/obj/item/weapon/rods,/turf/simulated/floor/engine,/area/engine/engine_control)
+"bMy" = (/obj/item/stack/rods,/turf/simulated/floor/engine,/area/engine/engine_control)
"bMz" = (/obj/item/weapon/caution{desc = "Caution! Construction Zone!"; name = "caution sign"},/turf/simulated/floor/engine,/area/engine/engine_control)
"bMA" = (/obj/machinery/atmospherics/pipe/simple{dir = 5; icon_state = "intact-f"; initialize_directions = 5; layer = 3},/obj/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engine/engine_hallway)
"bMB" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; layer = 3},/obj/cable{icon_state = "2-8"; d1 = 2; d2 = 8},/turf/simulated/floor,/area/engine/engine_hallway)
@@ -5067,8 +5067,8 @@
"bTw" = (/obj/table/reinforced{tag = "icon-reinf_tabledir"; icon_state = "reinf_tabledir"},/obj/item/weapon/cigpacket,/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; initialize_directions = 12; layer = 3},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/shuttle)
"bTx" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; initialize_directions = 12; layer = 3},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/shuttle)
"bTy" = (/obj/machinery/door/airlock/glass,/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; initialize_directions = 12; layer = 3},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/shuttle)
-"bTz" = (/obj/item/weapon/sheet/glass{amount = 5000},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/shuttle)
-"bTA" = (/obj/item/weapon/sheet/metal{amount = 5000},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/shuttle)
+"bTz" = (/obj/item/stack/sheet/glass{amount = 5000},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/shuttle)
+"bTA" = (/obj/item/stack/sheet/metal{amount = 5000},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/shuttle)
"bTB" = (/obj/machinery/door/poddoor{id = "thunderdomehea"; name = "Heavy Supply"},/turf/simulated/floor/plating,/area/tdome)
"bTC" = (/obj/machinery/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion_l"; dir = 4; pixel_y = -1},/turf/space,/area/centcom/shuttle)
"bTD" = (/obj/machinery/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/obj/window/reinforced/west{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/turf/simulated/floor/plating,/area/centcom/shuttle)
@@ -5853,7 +5853,7 @@
"ciC" = (/obj/window{icon_state = "rwindow"; reinf = 1},/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/turf/simulated/floor,/area/derelict/bridge/access)
"ciD" = (/obj/window{icon_state = "rwindow"; dir = 10; reinf = 1},/turf/simulated/floor,/area/derelict/bridge/access)
"ciE" = (/obj/window{icon_state = "rwindow"; dir = 4; invisibility = 0; reinf = 1},/turf/simulated/floor,/area/derelict/bridge)
-"ciF" = (/obj/item/weapon/rods,/turf/simulated/floor/plating/airless,/area)
+"ciF" = (/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area)
"ciG" = (/obj/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/wall,/area/derelict/bridge/access)
"ciH" = (/obj/cable{d2 = 8; icon_state = "0-8"},/obj/cable{icon_state = "0-4"; d2 = 4},/obj/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor,/area/derelict/bridge/access)
"ciI" = (/obj/cable{icon_state = "4-8"; d1 = 4; d2 = 8},/turf/simulated/floor,/area/derelict/bridge/access)
@@ -5873,7 +5873,7 @@
"ciW" = (/obj/stool/chair,/turf/simulated/floor,/area/derelict/bridge)
"ciX" = (/obj/table{icon_state = "tabledir"; dir = 9},/obj/item/weapon/screwdriver,/turf/simulated/floor,/area/derelict/bridge)
"ciY" = (/obj/table{dir = 5; icon_state = "tabledir"},/obj/window{icon_state = "rwindow"; dir = 4; invisibility = 0; reinf = 1},/obj/item/weapon/reagent_containers/food/drinks/beer,/turf/simulated/floor,/area/derelict/bridge)
-"ciZ" = (/obj/item/weapon/rods,/turf/space,/area)
+"ciZ" = (/obj/item/stack/rods,/turf/space,/area)
"cja" = (/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/obj/machinery/door/firedoor/border_only{dir = 1},/turf/simulated/floor,/area/derelict/bridge/access)
"cjb" = (/obj/table{icon_state = "tabledir"; dir = 10},/obj/item/weapon/rack_parts,/turf/simulated/floor,/area/derelict/bridge)
"cjc" = (/obj/table{icon_state = "tabledir"; dir = 6},/obj/window/basic,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor,/area/derelict/bridge)
@@ -6339,14 +6339,14 @@
"crU" = (/obj/window/basic{tag = "icon-window (NORTH)"; icon_state = "window"; dir = 1},/obj/cable{icon_state = "2-8"; d1 = 2; d2 = 8},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"crV" = (/obj/grille,/obj/item/weapon/shard,/obj/item/weapon/shard{tag = "icon-medium"; icon_state = "medium"},/turf/simulated/floor/plating/airless,/area)
"crW" = (/obj/grille,/obj/window{icon_state = "rwindow"; dir = 10; reinf = 1},/turf/simulated/floor/plating/airless,/area/derelict/arrival)
-"crX" = (/obj/structure/girder,/obj/item/weapon/rods,/turf/simulated/floor/plating/airless,/area/derelict/crew_quarters)
-"crY" = (/obj/item/weapon/rods,/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/turf/simulated/floor/airless,/area/derelict/hallway/secondary)
+"crX" = (/obj/structure/girder,/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/derelict/crew_quarters)
+"crY" = (/obj/item/stack/rods,/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/turf/simulated/floor/airless,/area/derelict/hallway/secondary)
"crZ" = (/obj/item/weapon/shard{tag = "icon-small"; icon_state = "small"},/turf/space,/area)
"csa" = (/turf/simulated/floor/plating/airless,/area/derelict/crew_quarters)
"csb" = (/turf/simulated/floor/airless{tag = "icon-damaged4"; icon_state = "damaged4"},/area/derelict/crew_quarters)
"csc" = (/turf/simulated/floor/airless{tag = "icon-damaged2"; icon_state = "damaged2"},/area/derelict/crew_quarters)
"csd" = (/turf/simulated/floor/airless{tag = "icon-damaged5"; icon_state = "damaged5"},/area/derelict/crew_quarters)
-"cse" = (/obj/lattice,/obj/item/weapon/rods,/turf/space,/area)
+"cse" = (/obj/lattice,/obj/item/stack/rods,/turf/space,/area)
"csf" = (/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/obj/item/weapon/wirecutters,/turf/simulated/floor/airless,/area/derelict/hallway/secondary)
"csg" = (/obj/grille,/obj/window{icon_state = "rwindow"; dir = 4; invisibility = 0; reinf = 1},/obj/window{icon_state = "rwindow"; dir = 8; reinf = 1},/turf/simulated/floor,/area/derelict/hallway/secondary)
"csh" = (/turf/simulated/floor/airless{tag = "icon-damaged3"; icon_state = "damaged3"},/area/derelict/crew_quarters)
@@ -6435,7 +6435,7 @@
"ctM" = (/obj/cable,/obj/machinery/power/apc{dir = 8; environ = 0; equipment = 0; lighting = 0; locked = 0; name = "Worn-out APC"; pixel_x = -24; pixel_y = 0},/turf/simulated/floor/plating/airless,/area/derelict/bridge/ai_upload)
"ctN" = (/turf/simulated/floor/airless{tag = "icon-damaged2"; icon_state = "damaged2"},/area/derelict/bridge/ai_upload)
"ctO" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/airless,/area/derelict/bridge/ai_upload)
-"ctP" = (/obj/item/weapon/rods,/turf/simulated/floor/plating/airless,/area/derelict/hallway/secondary)
+"ctP" = (/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/derelict/hallway/secondary)
"ctQ" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"},/turf/simulated/floor/airless,/area)
"ctR" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"},/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/obj/machinery/light/small,/turf/simulated/floor/airless,/area/derelict/bridge/ai_upload)
"ctS" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"},/turf/simulated/floor/airless,/area/derelict/bridge/ai_upload)
diff --git a/maps/tgstation.2.0.0.dmm b/maps/tgstation.2.0.0.dmm
index 77c6de3a1de..cfce5965fe2 100644
--- a/maps/tgstation.2.0.0.dmm
+++ b/maps/tgstation.2.0.0.dmm
@@ -838,7 +838,7 @@
"aqf" = (/obj/stool{pixel_y = 8},/turf/simulated/floor,/area/crew_quarters/fitness)
"aqg" = (/turf/simulated/wall/r_wall,/area/maintenance/fpmaint2)
"aqh" = (/obj/securearea{tag = "icon-space"; name = "EXTERNAL AIRLOCK"; desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"},/turf/simulated/wall/r_wall,/area/maintenance/fpmaint2)
-"aqi" = (/obj/item/weapon/tile,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"aqi" = (/obj/item/stack/tile,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aqj" = (/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aqk" = (/obj/machinery/light/small{dir = 1},/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"aql" = (/obj/grille,/obj/window/reinforced/north,/obj/window/reinforced/west,/obj/window/reinforced/east,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
@@ -990,7 +990,7 @@
"atb" = (/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/ai_monitored/storage/eva)
"atc" = (/obj/reagent_dispensers/fueltank,/turf/simulated/floor,/area/ai_monitored/storage/eva)
"atd" = (/obj/reagent_dispensers/watertank,/obj/machinery/camera{c_tag = "EVA North-East"; dir = 2},/turf/simulated/floor,/area/ai_monitored/storage/eva)
-"ate" = (/obj/table{icon_state = "tabledir"; dir = 8},/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/crowbar,/turf/simulated/floor,/area/ai_monitored/storage/eva)
+"ate" = (/obj/table{icon_state = "tabledir"; dir = 8},/obj/item/stack/sheet/metal{amount = 50},/obj/item/weapon/crowbar,/turf/simulated/floor,/area/ai_monitored/storage/eva)
"atf" = (/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore)
"atg" = (/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/fore)
"ath" = (/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/obj/machinery/camera{c_tag = "Dormitory"; c_tag_order = 999; dir = 4},/turf/simulated/floor{tag = "icon-neutral (WEST)"; icon_state = "neutral"; dir = 8},/area/crew_quarters)
@@ -1022,7 +1022,7 @@
"atH" = (/obj/machinery/atmospherics/pipe/simple,/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva)
"atI" = (/obj/machinery/embedded_controller/radio/airlock_controller{airpump_tag = "EVA_airlock_pump"; exterior_door_tag = "EVA_airlock_exterior"; id_tag = "EVA_airlock_control"; interior_door_tag = "EVA_airlock_interior"; pixel_x = -24; pixel_y = 0; sensor_tag = "EVA_airlock_sensor"},/turf/simulated/floor,/area/ai_monitored/storage/eva)
"atJ" = (/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor,/area/ai_monitored/storage/eva)
-"atK" = (/obj/table{icon_state = "tabledir"; dir = 8},/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/extinguisher,/turf/simulated/floor,/area/ai_monitored/storage/eva)
+"atK" = (/obj/table{icon_state = "tabledir"; dir = 8},/obj/item/stack/sheet/metal{amount = 50},/obj/item/weapon/extinguisher,/turf/simulated/floor,/area/ai_monitored/storage/eva)
"atL" = (/obj/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; tag = "icon-shock"},/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva)
"atM" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "bluecorner"},/area/hallway/primary/fore)
"atN" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{tag = "icon-carpet (NORTHWEST)"; icon_state = "carpet"; dir = 9},/area/crew_quarters)
@@ -1071,7 +1071,7 @@
"auE" = (/obj/rack{dir = 8},/obj/item/weapon/tank/jetpack,/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva)
"auF" = (/obj/rack{dir = 4},/obj/item/clothing/suit/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/mask/medical,/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva)
"auG" = (/obj/rack{dir = 4},/obj/item/clothing/shoes/magboots,/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"auH" = (/obj/table{icon_state = "tabledir"; dir = 8},/obj/item/weapon/sheet/glass{amount = 50},/obj/item/weapon/rods{amount = 50},/turf/simulated/floor,/area/ai_monitored/storage/eva)
+"auH" = (/obj/table{icon_state = "tabledir"; dir = 8},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/rods{amount = 50},/turf/simulated/floor,/area/ai_monitored/storage/eva)
"auI" = (/obj/grille,/obj/window/reinforced{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/window/reinforced{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/window/reinforced{tag = "icon-rwindow (NORTH)"; icon_state = "rwindow"; dir = 1},/obj/cable{d2 = 8; icon_state = "0-8"},/obj/cable{icon_state = "0-4"; d2 = 4},/obj/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva)
"auJ" = (/obj/cable{icon_state = "4-8"; d1 = 4; d2 = 8},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/fore)
"auK" = (/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/obj/cable{icon_state = "2-8"; d1 = 2; d2 = 8},/turf/simulated/floor,/area/hallway/primary/fore)
@@ -1110,7 +1110,7 @@
"avr" = (/obj/rack{dir = 8},/obj/landmark{name = "ExplorationPack"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva)
"avs" = (/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva)
"avt" = (/obj/rack{dir = 4},/obj/landmark{name = "ExplorationPack"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"avu" = (/obj/table{dir = 10; icon_state = "tabledir"},/obj/item/weapon/sheet/rglass{amount = 50},/turf/simulated/floor,/area/ai_monitored/storage/eva)
+"avu" = (/obj/table{dir = 10; icon_state = "tabledir"},/obj/item/stack/sheet/rglass{amount = 50},/turf/simulated/floor,/area/ai_monitored/storage/eva)
"avv" = (/obj/grille,/obj/window/reinforced{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/window/reinforced{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/window/reinforced,/obj/cable,/turf/simulated/floor/plating,/area/ai_monitored/storage/eva)
"avw" = (/obj/machinery/sink{icon_state = "sink"; dir = 8; pixel_x = -11; pixel_y = 10},/turf/simulated/floor{tag = "icon-freezerfloor"; icon_state = "freezerfloor"},/area/crew_quarters/toilet)
"avx" = (/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/turf/simulated/floor{tag = "icon-freezerfloor"; icon_state = "freezerfloor"},/area/crew_quarters/toilet)
@@ -1149,7 +1149,7 @@
"awe" = (/obj/table{icon_state = "tabledir"; dir = 2},/obj/item/device/radio/signaler,/obj/item/device/radio/signaler,/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor,/area/storage/primary)
"awf" = (/obj/table{icon_state = "tabledir"; dir = 2},/obj/item/device/multitool,/obj/machinery/cell_charger,/obj/item/weapon/cell{charge = 100; maxcharge = 15000},/turf/simulated/floor,/area/storage/primary)
"awg" = (/obj/table{icon_state = "tabledir"; dir = 6},/obj/item/weapon/storage/toolbox/mechanical,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/storage/primary)
-"awh" = (/obj/machinery/power/apc{dir = 1; name = "Storage APC"; pixel_x = -1; pixel_y = 26},/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/sheet/metal{amount = 50},/obj/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor,/area/storage/primary)
+"awh" = (/obj/machinery/power/apc{dir = 1; name = "Storage APC"; pixel_x = -1; pixel_y = 26},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor,/area/storage/primary)
"awi" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/requests_console{department = "Assistant Storage"; departmentType = 1; pixel_y = 30},/turf/simulated/floor,/area/storage/primary)
"awj" = (/obj/item/weapon/cell,/turf/simulated/floor/plating,/area/storage/tech)
"awk" = (/obj/rack{dir = 4},/obj/item/weapon/circuitboard/card,/turf/simulated/floor/plating,/area/storage/tech)
@@ -1191,8 +1191,8 @@
"awU" = (/obj/landmark/start{name = "Assistant"},/obj/cable{icon_state = "2-8"; d1 = 2; d2 = 8},/turf/simulated/floor,/area/storage/primary)
"awV" = (/obj/landmark/start{name = "Assistant"},/turf/simulated/floor,/area/storage/primary)
"awW" = (/obj/stool{pixel_y = 8},/obj/landmark/start{name = "Assistant"},/turf/simulated/floor,/area/storage/primary)
-"awX" = (/obj/item/weapon/rods{amount = 50},/obj/landmark/start{name = "Assistant"},/turf/simulated/floor,/area/storage/primary)
-"awY" = (/obj/item/weapon/sheet/glass{amount = 50},/obj/landmark/start{name = "Assistant"},/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/turf/simulated/floor,/area/storage/primary)
+"awX" = (/obj/item/stack/rods{amount = 50},/obj/landmark/start{name = "Assistant"},/turf/simulated/floor,/area/storage/primary)
+"awY" = (/obj/item/stack/sheet/glass{amount = 50},/obj/landmark/start{name = "Assistant"},/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/turf/simulated/floor,/area/storage/primary)
"awZ" = (/turf/simulated/floor,/area/storage/primary)
"axa" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"axb" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/item/weapon/storage/lightbox/tubes,/turf/simulated/floor/plating,/area/storage/tech)
@@ -1257,7 +1257,7 @@
"ayi" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; initialize_directions = 12; layer = 3},/turf/simulated/wall/r_wall,/area/maintenance/fpmaint)
"ayj" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; initialize_directions = 12; layer = 3},/obj/rack{dir = 1},/obj/item/clothing/mask/gas/emergency,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"ayk" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; initialize_directions = 12; layer = 3},/obj/machinery/atmospherics/pipe/simple,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
-"ayl" = (/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/obj/item/weapon/tile,/obj/machinery/atmospherics/pipe/manifold,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"ayl" = (/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/obj/item/stack/tile,/obj/machinery/atmospherics/pipe/manifold,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aym" = (/obj/machinery/atmospherics/pipe/simple,/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; initialize_directions = 12; layer = 3},/turf/simulated/wall/r_wall,/area/ai_monitored/storage/eva)
"ayn" = (/obj/table{dir = 9; icon_state = "tabledir"},/obj/item/weapon/cable_coil,/obj/item/weapon/cell,/obj/machinery/cell_charger,/turf/simulated/floor,/area/ai_monitored/storage/eva)
"ayo" = (/obj/table{dir = 5; icon_state = "tabledir"},/obj/item/weapon/storage/toolbox/electrical,/obj/item/weapon/screwdriver{pixel_y = 16},/obj/item/weapon/hand_labeler,/turf/simulated/floor,/area/ai_monitored/storage/eva)
@@ -2005,7 +2005,7 @@
"aMC" = (/obj/machinery/robotic_fabricator,/obj/cable{icon_state = "0-4"; d2 = 4},/obj/cable,/turf/simulated/floor,/area/medical/robotics)
"aMD" = (/obj/machinery/robotic_fabricator,/obj/cable{icon_state = "0-4"; d2 = 4},/obj/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/medical/robotics)
"aME" = (/obj/machinery/robotic_fabricator,/obj/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/medical/robotics)
-"aMF" = (/obj/crate,/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/cell{charge = 100; maxcharge = 15000},/obj/item/weapon/cell{charge = 100; maxcharge = 15000},/obj/item/weapon/cable_coil,/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/sheet/metal{amount = 50},/turf/simulated/floor,/area/medical/robotics)
+"aMF" = (/obj/crate,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/weapon/cell{charge = 100; maxcharge = 15000},/obj/item/weapon/cell{charge = 100; maxcharge = 15000},/obj/item/weapon/cable_coil,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/turf/simulated/floor,/area/medical/robotics)
"aMG" = (/obj/machinery/atmospherics/pipe/simple,/turf/simulated/wall/r_wall,/area/medical/robotics)
"aMH" = (/obj/stool/chair{dir = 4},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor{dir = 8; icon_state = "escape"; tag = "icon-escape (WEST)"},/area/hallway/secondary/exit)
"aMI" = (/obj/machinery/atmospherics/pipe/simple,/obj/grille,/obj/window/reinforced{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/window/reinforced{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/obj/window/reinforced{tag = "icon-rwindow (NORTH)"; icon_state = "rwindow"; dir = 1},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
@@ -2421,7 +2421,7 @@
"aUC" = (/obj/disposalpipe/junction{dir = 4; icon_state = "pipe-j2"},/turf/simulated/floor{tag = "icon-freezerfloor"; icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
"aUD" = (/obj/disposalpipe/segment{dir = 4},/turf/simulated/floor{tag = "icon-freezerfloor"; icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
"aUE" = (/obj/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall,/area/maintenance/port)
-"aUF" = (/obj/machinery/atmospherics/pipe/simple{dir = 6; icon_state = "intact-f"; layer = 3},/obj/item/weapon/sheet/rglass,/turf/simulated/floor/plating,/area/maintenance/port)
+"aUF" = (/obj/machinery/atmospherics/pipe/simple{dir = 6; icon_state = "intact-f"; layer = 3},/obj/item/stack/sheet/rglass,/turf/simulated/floor/plating,/area/maintenance/port)
"aUG" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; layer = 3},/obj/item/weapon/screwdriver,/turf/simulated/floor/plating,/area/maintenance/port)
"aUH" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; layer = 3},/obj/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/port)
"aUI" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; layer = 3},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/port)
@@ -2777,7 +2777,7 @@
"bbu" = (/obj/landmark/start{name = "Cargo Technician"},/turf/simulated/floor,/area/quartermaster/storage)
"bbv" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; location = "QM #2"},/obj/machinery/bot/mulebot{home_destination = "QM #2"; suffix = "#2"},/turf/simulated/floor{icon_state = "bot"},/area/quartermaster/storage)
"bbw" = (/obj/grille,/obj/window/reinforced/east,/obj/window/reinforced/west,/obj/disposalpipe/segment,/turf/simulated/floor/plating,/area/quartermaster/storage)
-"bbx" = (/obj/table{icon_state = "tabledir"; dir = 4},/obj/item/weapon/rods{amount = 50},/turf/simulated/floor,/area/quartermaster/office)
+"bbx" = (/obj/table{icon_state = "tabledir"; dir = 4},/obj/item/stack/rods{amount = 50},/turf/simulated/floor,/area/quartermaster/office)
"bby" = (/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/turf/simulated/floor,/area/quartermaster)
"bbz" = (/obj/stool/chair{dir = 8},/obj/machinery/light{dir = 4; icon_state = "tube1"; tag = "icon-tube1 (EAST)"},/turf/simulated/floor,/area/quartermaster)
"bbA" = (/obj/grille,/obj/window/reinforced/west,/obj/window/reinforced/east,/obj/window/reinforced,/turf/simulated/floor/plating,/area/quartermaster)
@@ -4512,7 +4512,7 @@
"bIN" = (/obj/machinery/atmospherics/pipe/simple{dir = 5; icon_state = "intact-f"; layer = 3},/turf/simulated/floor,/area/engine/engine_hallway)
"bIO" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; initialize_directions = 12; layer = 3},/turf/simulated/floor,/area/engine/engine_hallway)
"bIP" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; initialize_directions = 12; layer = 3},/obj/item/weapon/paper,/turf/simulated/floor,/area/engine/engine_hallway)
-"bIQ" = (/obj/item/weapon/sheet/glass{amount = 50},/obj/item/weapon/sheet/glass{amount = 50},/obj/item/weapon/sheet/glass{amount = 50},/obj/machinery/atmospherics/pipe/simple{dir = 10; icon_state = "intact-f"; layer = 3},/turf/simulated/floor,/area/engine/engine_hallway)
+"bIQ" = (/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/machinery/atmospherics/pipe/simple{dir = 10; icon_state = "intact-f"; layer = 3},/turf/simulated/floor,/area/engine/engine_hallway)
"bIR" = (/obj/table{icon_state = "tabledir"; dir = 9},/obj/machinery/light/small{dir = 4},/obj/item/device/analyzer,/obj/item/weapon/storage/utilitybelt,/obj/item/weapon/storage/utilitybelt,/obj/item/weapon/storage/utilitybelt,/turf/simulated/floor,/area/engine/engine_hallway)
"bIS" = (/obj/machinery/atmospherics/pipe/simple,/obj/grille,/turf/simulated/wall/r_wall,/area/atmos)
"bIT" = (/obj/cable{icon_state = "2-4"; d1 = 2; d2 = 4},/turf/simulated/floor/plating/airless,/area)
@@ -4544,7 +4544,7 @@
"bJt" = (/turf/simulated/floor,/area/engine/engine_hallway)
"bJu" = (/obj/item/weapon/storage/pill_bottle/kelotane,/turf/simulated/floor,/area/engine/engine_hallway)
"bJv" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor,/area/engine/engine_hallway)
-"bJw" = (/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/sheet/metal{amount = 50},/obj/machinery/atmospherics/pipe/manifold{dir = 4; initialize_directions = 11},/turf/simulated/floor,/area/engine/engine_hallway)
+"bJw" = (/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/machinery/atmospherics/pipe/manifold{dir = 4; initialize_directions = 11},/turf/simulated/floor,/area/engine/engine_hallway)
"bJx" = (/obj/table{icon_state = "tabledir"; dir = 10},/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/module/power_control,/obj/item/weapon/module/power_control,/obj/item/weapon/module/power_control,/turf/simulated/floor,/area/engine/engine_hallway)
"bJy" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id = "n2_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
"bJz" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2_sensor"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos)
@@ -4714,7 +4714,7 @@
"bMH" = (/turf/simulated/floor/engine,/area/engine/engine_control)
"bMI" = (/obj/item/clothing/head/helmet/hardhat,/turf/simulated/floor/engine,/area/engine/engine_control)
"bMJ" = (/obj/item/weapon/weldingtool,/turf/simulated/floor/engine,/area/engine/engine_control)
-"bMK" = (/obj/item/weapon/rods,/turf/simulated/floor/engine,/area/engine/engine_control)
+"bMK" = (/obj/item/stack/rods,/turf/simulated/floor/engine,/area/engine/engine_control)
"bML" = (/obj/item/weapon/caution{desc = "Caution! Construction Zone!"; name = "caution sign"},/turf/simulated/floor/engine,/area/engine/engine_control)
"bMM" = (/obj/machinery/atmospherics/pipe/simple{dir = 5; icon_state = "intact-f"; initialize_directions = 5; layer = 3},/obj/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engine/engine_hallway)
"bMN" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; layer = 3},/obj/cable{icon_state = "2-8"; d1 = 2; d2 = 8},/turf/simulated/floor,/area/engine/engine_hallway)
@@ -4926,8 +4926,8 @@
"bQL" = (/obj/table/reinforced{tag = "icon-reinf_tabledir"; icon_state = "reinf_tabledir"},/obj/item/weapon/cigpacket,/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; initialize_directions = 12; layer = 3},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/shuttle)
"bQM" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; initialize_directions = 12; layer = 3},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/shuttle)
"bQN" = (/obj/machinery/door/airlock/glass,/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact-f"; initialize_directions = 12; layer = 3},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/shuttle)
-"bQO" = (/obj/item/weapon/sheet/glass{amount = 5000},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/shuttle)
-"bQP" = (/obj/item/weapon/sheet/metal{amount = 5000},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/shuttle)
+"bQO" = (/obj/item/stack/sheet/glass{amount = 5000},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/shuttle)
+"bQP" = (/obj/item/stack/sheet/metal{amount = 5000},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/centcom/shuttle)
"bQQ" = (/obj/machinery/door/airlock/centcom{opacity = 1; req_access_txt = "20"},/turf/unsimulated/floor{tag = "icon-bar"; icon_state = "bar"; dir = 2},/area/centcom/living)
"bQR" = (/turf/unsimulated/wall,/area/centcom/suppy)
"bQS" = (/obj/machinery/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion_l"; dir = 4; pixel_y = -1},/turf/space,/area/centcom/shuttle)
@@ -5285,8 +5285,8 @@
"bXG" = (/obj/machinery/door/airlock/external,/obj/machinery/door/poddoor{icon_state = "pdoor1"; id = "NTrasen"; name = "Outer Airlock"; p_open = 0},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom)
"bXH" = (/obj/rack,/obj/item/weapon/storage/handcuff_kit,/turf/unsimulated/floor{tag = "icon-grimy"; icon_state = "grimy"},/area/centcom/creed)
"bXI" = (/obj/machinery/door/poddoor{id = "CentComPort"; name = "Security Doors"},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/centcom)
-"bXJ" = (/obj/item/weapon/sheet/glass{amount = 50},/obj/item/weapon/sheet/glass{amount = 50},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/centcom)
-"bXK" = (/obj/item/weapon/sheet/metal{amount = 50},/obj/item/weapon/sheet/metal{amount = 50},/turf/unsimulated/floor{tag = "icon-green (EAST)"; icon_state = "green"; dir = 4},/area/centcom)
+"bXJ" = (/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/centcom)
+"bXK" = (/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/turf/unsimulated/floor{tag = "icon-green (EAST)"; icon_state = "green"; dir = 4},/area/centcom)
"bXL" = (/obj/stool/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom)
"bXM" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/specops/centcom)
"bXN" = (/obj/window/reinforced/east{dir = 5},/turf/unsimulated/floor{tag = "icon-grimy"; icon_state = "grimy"},/area/centcom/creed)
@@ -6013,7 +6013,7 @@
"clG" = (/obj/window{icon_state = "rwindow"; reinf = 1},/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/turf/simulated/floor,/area/derelict/bridge/access)
"clH" = (/obj/window{icon_state = "rwindow"; dir = 10; reinf = 1},/turf/simulated/floor,/area/derelict/bridge/access)
"clI" = (/obj/window{icon_state = "rwindow"; dir = 4; invisibility = 0; reinf = 1},/turf/simulated/floor,/area/derelict/bridge)
-"clJ" = (/obj/item/weapon/rods,/turf/simulated/floor/plating/airless,/area)
+"clJ" = (/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area)
"clK" = (/obj/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/wall,/area/derelict/bridge/access)
"clL" = (/obj/cable{d2 = 8; icon_state = "0-8"},/obj/cable{icon_state = "0-4"; d2 = 4},/obj/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor,/area/derelict/bridge/access)
"clM" = (/obj/cable{icon_state = "4-8"; d1 = 4; d2 = 8},/turf/simulated/floor,/area/derelict/bridge/access)
@@ -6033,7 +6033,7 @@
"cma" = (/obj/stool/chair,/turf/simulated/floor,/area/derelict/bridge)
"cmb" = (/obj/table{icon_state = "tabledir"; dir = 9},/obj/item/weapon/screwdriver,/turf/simulated/floor,/area/derelict/bridge)
"cmc" = (/obj/table{dir = 5; icon_state = "tabledir"},/obj/window{icon_state = "rwindow"; dir = 4; invisibility = 0; reinf = 1},/obj/item/weapon/reagent_containers/food/drinks/beer,/turf/simulated/floor,/area/derelict/bridge)
-"cmd" = (/obj/item/weapon/rods,/turf/space,/area)
+"cmd" = (/obj/item/stack/rods,/turf/space,/area)
"cme" = (/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/obj/machinery/door/firedoor/border_only{dir = 1},/turf/simulated/floor,/area/derelict/bridge/access)
"cmf" = (/obj/table{icon_state = "tabledir"; dir = 10},/obj/item/weapon/rack_parts,/turf/simulated/floor,/area/derelict/bridge)
"cmg" = (/obj/table{icon_state = "tabledir"; dir = 6},/obj/window/basic,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor,/area/derelict/bridge)
@@ -6368,14 +6368,14 @@
"csx" = (/obj/window/basic{tag = "icon-window (NORTH)"; icon_state = "window"; dir = 1},/obj/cable{icon_state = "2-8"; d1 = 2; d2 = 8},/turf/simulated/floor/plating,/area/derelict/hallway/secondary)
"csy" = (/obj/grille,/obj/item/weapon/shard,/obj/item/weapon/shard{tag = "icon-medium"; icon_state = "medium"},/turf/simulated/floor/plating/airless,/area)
"csz" = (/obj/grille,/obj/window{icon_state = "rwindow"; dir = 10; reinf = 1},/turf/simulated/floor/plating/airless,/area/derelict/arrival)
-"csA" = (/obj/structure/girder,/obj/item/weapon/rods,/turf/simulated/floor/plating/airless,/area/derelict/crew_quarters)
-"csB" = (/obj/item/weapon/rods,/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/turf/simulated/floor/airless,/area/derelict/hallway/secondary)
+"csA" = (/obj/structure/girder,/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/derelict/crew_quarters)
+"csB" = (/obj/item/stack/rods,/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/turf/simulated/floor/airless,/area/derelict/hallway/secondary)
"csC" = (/obj/item/weapon/shard{tag = "icon-small"; icon_state = "small"},/turf/space,/area)
"csD" = (/turf/simulated/floor/plating/airless,/area/derelict/crew_quarters)
"csE" = (/turf/simulated/floor/airless{tag = "icon-damaged4"; icon_state = "damaged4"},/area/derelict/crew_quarters)
"csF" = (/turf/simulated/floor/airless{tag = "icon-damaged2"; icon_state = "damaged2"},/area/derelict/crew_quarters)
"csG" = (/turf/simulated/floor/airless{tag = "icon-damaged5"; icon_state = "damaged5"},/area/derelict/crew_quarters)
-"csH" = (/obj/lattice,/obj/item/weapon/rods,/turf/space,/area)
+"csH" = (/obj/lattice,/obj/item/stack/rods,/turf/space,/area)
"csI" = (/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/obj/item/weapon/wirecutters,/turf/simulated/floor/airless,/area/derelict/hallway/secondary)
"csJ" = (/obj/grille,/obj/window{icon_state = "rwindow"; dir = 4; invisibility = 0; reinf = 1},/obj/window{icon_state = "rwindow"; dir = 8; reinf = 1},/turf/simulated/floor,/area/derelict/hallway/secondary)
"csK" = (/turf/simulated/floor/airless{tag = "icon-damaged3"; icon_state = "damaged3"},/area/derelict/crew_quarters)
@@ -6465,7 +6465,7 @@
"cuq" = (/obj/cable,/obj/machinery/power/apc{dir = 8; environ = 0; equipment = 0; lighting = 0; locked = 0; name = "Worn-out APC"; pixel_x = -24; pixel_y = 0},/turf/simulated/floor/plating/airless,/area/derelict/bridge/ai_upload)
"cur" = (/turf/simulated/floor/airless{tag = "icon-damaged2"; icon_state = "damaged2"},/area/derelict/bridge/ai_upload)
"cus" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/airless,/area/derelict/bridge/ai_upload)
-"cut" = (/obj/item/weapon/rods,/turf/simulated/floor/plating/airless,/area/derelict/hallway/secondary)
+"cut" = (/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/derelict/hallway/secondary)
"cuu" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"},/turf/simulated/floor/airless,/area)
"cuv" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"},/obj/cable{icon_state = "1-2"; d1 = 1; d2 = 2},/obj/machinery/light/small,/turf/simulated/floor/airless,/area/derelict/bridge/ai_upload)
"cuw" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"},/turf/simulated/floor/airless,/area/derelict/bridge/ai_upload)
diff --git a/tgstation.dme b/tgstation.dme
index 9886e8aba87..c87ff857601 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -70,6 +70,7 @@
#define FILE_DIR "code/game/objects/radio"
#define FILE_DIR "code/game/objects/secstorage"
#define FILE_DIR "code/game/objects/spawners"
+#define FILE_DIR "code/game/objects/stacks"
#define FILE_DIR "code/game/objects/storage"
#define FILE_DIR "code/game/spacecraft"
#define FILE_DIR "code/game/verbs"
@@ -516,14 +517,12 @@
#include "code\game\objects\items\weapons\clown_items.dm"
#include "code\game\objects\items\weapons\explosives.dm"
#include "code\game\objects\items\weapons\flamethrower.dm"
-#include "code\game\objects\items\weapons\glass.dm"
#include "code\game\objects\items\weapons\grenades.dm"
#include "code\game\objects\items\weapons\guns_ammo.dm"
#include "code\game\objects\items\weapons\hydroponics.dm"
#include "code\game\objects\items\weapons\implants.dm"
#include "code\game\objects\items\weapons\kitchen.dm"
#include "code\game\objects\items\weapons\medical.dm"
-#include "code\game\objects\items\weapons\metals_rods.dm"
#include "code\game\objects\items\weapons\misc.dm"
#include "code\game\objects\items\weapons\mops_cleaners.dm"
#include "code\game\objects\items\weapons\papers_bins.dm"
@@ -545,6 +544,9 @@
#include "code\game\objects\secstorage\secstorage.dm"
#include "code\game\objects\secstorage\ssafe.dm"
#include "code\game\objects\spawners\bomb.dm"
+#include "code\game\objects\stacks\glass.dm"
+#include "code\game\objects\stacks\metal.dm"
+#include "code\game\objects\stacks\stack.dm"
#include "code\game\objects\storage\backpack.dm"
#include "code\game\objects\storage\bible.dm"
#include "code\game\objects\storage\briefcase.dm"