diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index 12c37607..1159bd44 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -1,345 +1,346 @@
-/* Glass stack types
- * Contains:
- * Glass sheets
- * Reinforced glass sheets
- * Glass shards - TODO: Move this into code/game/object/item/weapons
- */
-
-/*
- * Glass sheets
- */
-GLOBAL_LIST_INIT(glass_recipes, list ( \
- new/datum/stack_recipe("directional window", /obj/structure/window/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \
- new/datum/stack_recipe("fulltile window", /obj/structure/window/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \
-))
-
-/obj/item/stack/sheet/glass
- name = "glass"
- desc = "HOLY SHEET! That is a lot of glass."
- singular_name = "glass sheet"
- icon_state = "sheet-glass"
- item_state = "sheet-glass"
- materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 100)
- resistance_flags = ACID_PROOF
- merge_type = /obj/item/stack/sheet/glass
- grind_results = list(/datum/reagent/silicon = 20)
- point_value = 1
- tableVariant = /obj/structure/table/glass
-
-/obj/item/stack/sheet/glass/suicide_act(mob/living/carbon/user)
- user.visible_message("[user] begins to slice [user.p_their()] neck with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")
- return BRUTELOSS
-
-/obj/item/stack/sheet/glass/cyborg
- materials = list()
- is_cyborg = 1
- cost = 500
-
-/obj/item/stack/sheet/glass/fifty
- amount = 50
-
-/obj/item/stack/sheet/glass/five
- amount = 5
-
-/obj/item/stack/sheet/glass/Initialize(mapload, new_amount, merge = TRUE)
- recipes = GLOB.glass_recipes
- return ..()
-
-/obj/item/stack/sheet/glass/attackby(obj/item/W, mob/user, params)
- add_fingerprint(user)
- if(istype(W, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/CC = W
- if (get_amount() < 1 || CC.get_amount() < 5)
- to_chat(user, "You attach wire to the [name].")
- var/obj/item/stack/light_w/new_tile = new(user.loc)
- new_tile.add_fingerprint(user)
- else if(istype(W, /obj/item/stack/rods))
- var/obj/item/stack/rods/V = W
- if (V.get_amount() >= 1 && get_amount() >= 1)
- var/obj/item/stack/sheet/rglass/RG = new (get_turf(user))
- RG.add_fingerprint(user)
- var/replace = user.get_inactive_held_item()==src
- V.use(1)
- use(1)
- if(QDELETED(src) && replace)
- user.put_in_hands(RG)
- else
- to_chat(user, "You need one rod and one sheet of glass to make reinforced glass!")
- return
- else
- return ..()
-
-
-
-GLOBAL_LIST_INIT(pglass_recipes, list ( \
- new/datum/stack_recipe("directional window", /obj/structure/window/plasma/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \
- new/datum/stack_recipe("fulltile window", /obj/structure/window/plasma/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \
-))
-
-/obj/item/stack/sheet/plasmaglass
- name = "plasma glass"
- desc = "A glass sheet made out of a plasma-silicate alloy. It looks extremely tough and heavily fire resistant."
- singular_name = "plasma glass sheet"
- icon_state = "sheet-pglass"
- item_state = "sheet-pglass"
- materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 100)
- resistance_flags = ACID_PROOF
- merge_type = /obj/item/stack/sheet/plasmaglass
- grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10)
- tableVariant = /obj/structure/table/plasmaglass
-
-/obj/item/stack/sheet/plasmaglass/fifty
- amount = 50
-
-/obj/item/stack/sheet/plasmaglass/Initialize(mapload, new_amount, merge = TRUE)
- recipes = GLOB.pglass_recipes
- return ..()
-
-/obj/item/stack/sheet/plasmaglass/attackby(obj/item/W, mob/user, params)
- add_fingerprint(user)
-
- if(istype(W, /obj/item/stack/rods))
- var/obj/item/stack/rods/V = W
- if (V.get_amount() >= 1 && get_amount() >= 1)
- var/obj/item/stack/sheet/plasmarglass/RG = new (get_turf(user))
- RG.add_fingerprint(user)
- var/replace = user.get_inactive_held_item()==src
- V.use(1)
- use(1)
- if(QDELETED(src) && replace)
- user.put_in_hands(RG)
- else
- to_chat(user, "You need one rod and one sheet of plasma glass to make reinforced plasma glass!")
- return
- else
- return ..()
-
-
-
-/*
- * Reinforced glass sheets
- */
-GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \
- new/datum/stack_recipe("windoor frame", /obj/structure/windoor_assembly, 5, time = 0, on_floor = TRUE, window_checks = TRUE), \
- null, \
- new/datum/stack_recipe("directional reinforced window", /obj/structure/window/reinforced/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \
- new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/reinforced/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \
-))
-
-
-/obj/item/stack/sheet/rglass
- name = "reinforced glass"
- desc = "Glass which seems to have rods or something stuck in them."
- singular_name = "reinforced glass sheet"
- icon_state = "sheet-rglass"
- item_state = "sheet-rglass"
- materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 100)
- resistance_flags = ACID_PROOF
- merge_type = /obj/item/stack/sheet/rglass
- grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/iron = 10)
- point_value = 4
-
-/obj/item/stack/sheet/rglass/attackby(obj/item/W, mob/user, params)
- add_fingerprint(user)
- ..()
-
-/obj/item/stack/sheet/rglass/cyborg
- materials = list()
- var/datum/robot_energy_storage/glasource
- var/metcost = 250
- var/glacost = 500
-
-/obj/item/stack/sheet/rglass/cyborg/get_amount()
- return min(round(source.energy / metcost), round(glasource.energy / glacost))
-
-/obj/item/stack/sheet/rglass/cyborg/use(used, transfer = FALSE) // Requires special checks, because it uses two storages
- source.use_charge(used * metcost)
- glasource.use_charge(used * glacost)
-
-/obj/item/stack/sheet/rglass/cyborg/add(amount)
- source.add_charge(amount * metcost)
- glasource.add_charge(amount * glacost)
-
-/obj/item/stack/sheet/rglass/Initialize(mapload, new_amount, merge = TRUE)
- recipes = GLOB.reinforced_glass_recipes
- return ..()
-
-GLOBAL_LIST_INIT(prglass_recipes, list ( \
- new/datum/stack_recipe("directional reinforced window", /obj/structure/window/plasma/reinforced/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \
- new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/plasma/reinforced/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \
-))
-
-/obj/item/stack/sheet/plasmarglass
- name = "reinforced plasma glass"
- desc = "A glass sheet made out of a plasma-silicate alloy and a rod matrix. It looks hopelessly tough and nearly fire-proof!"
- singular_name = "reinforced plasma glass sheet"
- icon_state = "sheet-prglass"
- item_state = "sheet-prglass"
- materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT, MAT_METAL=MINERAL_MATERIAL_AMOUNT * 0.5,)
- armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
- resistance_flags = ACID_PROOF
- merge_type = /obj/item/stack/sheet/plasmarglass
- grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10, /datum/reagent/iron = 10)
- point_value = 23
-
-/obj/item/stack/sheet/plasmarglass/Initialize(mapload, new_amount, merge = TRUE)
- recipes = GLOB.prglass_recipes
- return ..()
-
-GLOBAL_LIST_INIT(titaniumglass_recipes, list(
- new/datum/stack_recipe("shuttle window", /obj/structure/window/shuttle/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE)
- ))
-
-/obj/item/stack/sheet/titaniumglass
- name = "titanium glass"
- desc = "A glass sheet made out of a titanium-silicate alloy."
- singular_name = "titanium glass sheet"
- icon_state = "sheet-titaniumglass"
- item_state = "sheet-titaniumglass"
- materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
- resistance_flags = ACID_PROOF
- merge_type = /obj/item/stack/sheet/titaniumglass
-
-/obj/item/stack/sheet/titaniumglass/Initialize(mapload, new_amount, merge = TRUE)
- recipes = GLOB.titaniumglass_recipes
- return ..()
-
-GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
- new/datum/stack_recipe("plastitanium window", /obj/structure/window/plastitanium/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE)
- ))
-
-/obj/item/stack/sheet/plastitaniumglass
- name = "plastitanium glass"
- desc = "A glass sheet made out of a plasma-titanium-silicate alloy."
- singular_name = "plastitanium glass sheet"
- icon_state = "sheet-plastitaniumglass"
- item_state = "sheet-plastitaniumglass"
- materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
- resistance_flags = ACID_PROOF
- merge_type = /obj/item/stack/sheet/plastitaniumglass
-
-/obj/item/stack/sheet/plastitaniumglass/Initialize(mapload, new_amount, merge = TRUE)
- recipes = GLOB.plastitaniumglass_recipes
- return ..()
-
-/obj/item/shard
- name = "shard"
- desc = "A nasty looking shard of glass."
- icon = 'icons/obj/shards.dmi'
- icon_state = "large"
- w_class = WEIGHT_CLASS_TINY
- force = 5
- throwforce = 10
- item_state = "shard-glass"
- lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
- materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
- attack_verb = list("stabbed", "slashed", "sliced", "cut")
- hitsound = 'sound/weapons/bladeslice.ogg'
- resistance_flags = ACID_PROOF
- armor = list("melee" = 100, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 100)
- max_integrity = 40
- sharpness = IS_SHARP
- var/icon_prefix
-
-
-/obj/item/shard/suicide_act(mob/user)
- user.visible_message("[user] is slitting [user.p_their()] [pick("wrists", "throat")] with the shard of glass! It looks like [user.p_theyre()] trying to commit suicide.")
- return (BRUTELOSS)
-
-
-/obj/item/shard/Initialize()
- . = ..()
- AddComponent(/datum/component/caltrop, force)
- AddComponent(/datum/component/butchering, 150, 65)
- icon_state = pick("large", "medium", "small")
- switch(icon_state)
- if("small")
- pixel_x = rand(-12, 12)
- pixel_y = rand(-12, 12)
- if("medium")
- pixel_x = rand(-8, 8)
- pixel_y = rand(-8, 8)
- if("large")
- pixel_x = rand(-5, 5)
- pixel_y = rand(-5, 5)
- if (icon_prefix)
- icon_state = "[icon_prefix][icon_state]"
-
- var/turf/T = get_turf(src)
- if(T && is_station_level(T.z))
- SSblackbox.record_feedback("tally", "station_mess_created", 1, name)
-
-/obj/item/shard/Destroy()
- . = ..()
-
- var/turf/T = get_turf(src)
- if(T && is_station_level(T.z))
- SSblackbox.record_feedback("tally", "station_mess_destroyed", 1, name)
-
-/obj/item/shard/afterattack(atom/A as mob|obj, mob/user, proximity)
- . = ..()
- if(!proximity || !(src in user))
- return
- if(isturf(A))
- return
- if(istype(A, /obj/item/storage))
- return
- var/hit_hand = ((user.active_hand_index % 2 == 0) ? "r_" : "l_") + "arm"
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- if(!H.gloves && !HAS_TRAIT(H, TRAIT_PIERCEIMMUNE)) // golems, etc
- to_chat(H, "[src] cuts into your hand!")
- H.apply_damage(force*0.5, BRUTE, hit_hand)
- else if(ismonkey(user))
- var/mob/living/carbon/monkey/M = user
- if(!HAS_TRAIT(M, TRAIT_PIERCEIMMUNE))
- to_chat(M, "[src] cuts into your hand!")
- M.apply_damage(force*0.5, BRUTE, hit_hand)
-
-
-/obj/item/shard/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/lightreplacer))
- I.attackby(src, user)
- else
- return ..()
-
-/obj/item/shard/welder_act(mob/living/user, obj/item/I)
- ..()
- if(I.use_tool(src, user, 0, volume=50))
- var/obj/item/stack/sheet/glass/NG = new (user.loc)
- for(var/obj/item/stack/sheet/glass/G in user.loc)
- if(G == NG)
- continue
- if(G.amount >= G.max_amount)
- continue
- G.attackby(NG, user)
- to_chat(user, "You add the newly-formed glass to the stack. It now contains [NG.amount] sheet\s.")
- qdel(src)
- return TRUE
-
-/obj/item/shard/Crossed(mob/living/L)
- if(istype(L) && has_gravity(loc))
- if(HAS_TRAIT(L, TRAIT_LIGHT_STEP))
- playsound(loc, 'sound/effects/glass_step.ogg', 30, 1)
- else
- playsound(loc, 'sound/effects/glass_step.ogg', 50, 1)
- return ..()
-
-/obj/item/shard/plasma
- name = "purple shard"
- desc = "A nasty looking shard of plasma glass."
- force = 6
- throwforce = 11
- icon_state = "plasmalarge"
- materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
- icon_prefix = "plasma"
+/* Glass stack types
+ * Contains:
+ * Glass sheets
+ * Reinforced glass sheets
+ * Glass shards - TODO: Move this into code/game/object/item/weapons
+ */
+
+/*
+ * Glass sheets
+ */
+GLOBAL_LIST_INIT(glass_recipes, list ( \
+ new/datum/stack_recipe("directional window", /obj/structure/window/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \
+ new/datum/stack_recipe("fulltile window", /obj/structure/window/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \
+))
+
+/obj/item/stack/sheet/glass
+ name = "glass"
+ desc = "HOLY SHEET! That is a lot of glass."
+ singular_name = "glass sheet"
+ icon_state = "sheet-glass"
+ item_state = "sheet-glass"
+ materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 100)
+ resistance_flags = ACID_PROOF
+ merge_type = /obj/item/stack/sheet/glass
+ grind_results = list(/datum/reagent/silicon = 20)
+ point_value = 1
+ tableVariant = /obj/structure/table/glass
+
+/obj/item/stack/sheet/glass/suicide_act(mob/living/carbon/user)
+ user.visible_message("[user] begins to slice [user.p_their()] neck with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")
+ return BRUTELOSS
+
+/obj/item/stack/sheet/glass/cyborg
+ materials = list()
+ is_cyborg = 1
+ cost = 500
+
+/obj/item/stack/sheet/glass/fifty
+ amount = 50
+
+/obj/item/stack/sheet/glass/five
+ amount = 5
+
+/obj/item/stack/sheet/glass/Initialize(mapload, new_amount, merge = TRUE)
+ recipes = GLOB.glass_recipes
+ return ..()
+
+/obj/item/stack/sheet/glass/attackby(obj/item/W, mob/user, params)
+ add_fingerprint(user)
+ if(istype(W, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/CC = W
+ if (get_amount() < 1 || CC.get_amount() < 5)
+ to_chat(user, "You attach wire to the [name].")
+ var/obj/item/stack/light_w/new_tile = new(user.loc)
+ new_tile.add_fingerprint(user)
+ else if(istype(W, /obj/item/stack/rods))
+ var/obj/item/stack/rods/V = W
+ if (V.get_amount() >= 1 && get_amount() >= 1)
+ var/obj/item/stack/sheet/rglass/RG = new (get_turf(user))
+ RG.add_fingerprint(user)
+ var/replace = user.get_inactive_held_item()==src
+ V.use(1)
+ use(1)
+ if(QDELETED(src) && replace)
+ user.put_in_hands(RG)
+ else
+ to_chat(user, "You need one rod and one sheet of glass to make reinforced glass!")
+ return
+ else
+ return ..()
+
+
+
+GLOBAL_LIST_INIT(pglass_recipes, list ( \
+ new/datum/stack_recipe("directional window", /obj/structure/window/plasma/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \
+ new/datum/stack_recipe("fulltile window", /obj/structure/window/plasma/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \
+))
+
+/obj/item/stack/sheet/plasmaglass
+ name = "plasma glass"
+ desc = "A glass sheet made out of a plasma-silicate alloy. It looks extremely tough and heavily fire resistant."
+ singular_name = "plasma glass sheet"
+ icon_state = "sheet-pglass"
+ item_state = "sheet-pglass"
+ materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 100)
+ resistance_flags = ACID_PROOF
+ merge_type = /obj/item/stack/sheet/plasmaglass
+ grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10)
+ tableVariant = /obj/structure/table/plasmaglass
+
+/obj/item/stack/sheet/plasmaglass/fifty
+ amount = 50
+
+/obj/item/stack/sheet/plasmaglass/Initialize(mapload, new_amount, merge = TRUE)
+ recipes = GLOB.pglass_recipes
+ return ..()
+
+/obj/item/stack/sheet/plasmaglass/attackby(obj/item/W, mob/user, params)
+ add_fingerprint(user)
+
+ if(istype(W, /obj/item/stack/rods))
+ var/obj/item/stack/rods/V = W
+ if (V.get_amount() >= 1 && get_amount() >= 1)
+ var/obj/item/stack/sheet/plasmarglass/RG = new (get_turf(user))
+ RG.add_fingerprint(user)
+ var/replace = user.get_inactive_held_item()==src
+ V.use(1)
+ use(1)
+ if(QDELETED(src) && replace)
+ user.put_in_hands(RG)
+ else
+ to_chat(user, "You need one rod and one sheet of plasma glass to make reinforced plasma glass!")
+ return
+ else
+ return ..()
+
+
+
+/*
+ * Reinforced glass sheets
+ */
+GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \
+ new/datum/stack_recipe("windoor frame", /obj/structure/windoor_assembly, 5, time = 0, on_floor = TRUE, window_checks = TRUE), \
+ null, \
+ new/datum/stack_recipe("directional reinforced window", /obj/structure/window/reinforced/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \
+ new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/reinforced/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \
+))
+
+
+/obj/item/stack/sheet/rglass
+ name = "reinforced glass"
+ desc = "Glass which seems to have rods or something stuck in them."
+ singular_name = "reinforced glass sheet"
+ icon_state = "sheet-rglass"
+ item_state = "sheet-rglass"
+ materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 100)
+ resistance_flags = ACID_PROOF
+ merge_type = /obj/item/stack/sheet/rglass
+ grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/iron = 10)
+ point_value = 4
+
+/obj/item/stack/sheet/rglass/attackby(obj/item/W, mob/user, params)
+ add_fingerprint(user)
+ ..()
+
+/obj/item/stack/sheet/rglass/cyborg
+ materials = list()
+ var/datum/robot_energy_storage/glasource
+ var/metcost = 250
+ var/glacost = 500
+
+/obj/item/stack/sheet/rglass/cyborg/get_amount()
+ return min(round(source.energy / metcost), round(glasource.energy / glacost))
+
+/obj/item/stack/sheet/rglass/cyborg/use(used, transfer = FALSE) // Requires special checks, because it uses two storages
+ source.use_charge(used * metcost)
+ glasource.use_charge(used * glacost)
+
+/obj/item/stack/sheet/rglass/cyborg/add(amount)
+ source.add_charge(amount * metcost)
+ glasource.add_charge(amount * glacost)
+
+/obj/item/stack/sheet/rglass/Initialize(mapload, new_amount, merge = TRUE)
+ recipes = GLOB.reinforced_glass_recipes
+ return ..()
+
+GLOBAL_LIST_INIT(prglass_recipes, list ( \
+ new/datum/stack_recipe("directional reinforced window", /obj/structure/window/plasma/reinforced/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \
+ new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/plasma/reinforced/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE) \
+))
+
+/obj/item/stack/sheet/plasmarglass
+ name = "reinforced plasma glass"
+ desc = "A glass sheet made out of a plasma-silicate alloy and a rod matrix. It looks hopelessly tough and nearly fire-proof!"
+ singular_name = "reinforced plasma glass sheet"
+ icon_state = "sheet-prglass"
+ item_state = "sheet-prglass"
+ materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT, MAT_METAL=MINERAL_MATERIAL_AMOUNT * 0.5,)
+ armor = list("melee" = 20, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
+ resistance_flags = ACID_PROOF
+ merge_type = /obj/item/stack/sheet/plasmarglass
+ grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10, /datum/reagent/iron = 10)
+ point_value = 23
+
+/obj/item/stack/sheet/plasmarglass/Initialize(mapload, new_amount, merge = TRUE)
+ recipes = GLOB.prglass_recipes
+ return ..()
+
+GLOBAL_LIST_INIT(titaniumglass_recipes, list(
+ new/datum/stack_recipe("shuttle window", /obj/structure/window/shuttle/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE)
+ ))
+
+/obj/item/stack/sheet/titaniumglass
+ name = "titanium glass"
+ desc = "A glass sheet made out of a titanium-silicate alloy."
+ singular_name = "titanium glass sheet"
+ icon_state = "sheet-titaniumglass"
+ item_state = "sheet-titaniumglass"
+ materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
+ resistance_flags = ACID_PROOF
+ merge_type = /obj/item/stack/sheet/titaniumglass
+
+/obj/item/stack/sheet/titaniumglass/Initialize(mapload, new_amount, merge = TRUE)
+ recipes = GLOB.titaniumglass_recipes
+ return ..()
+
+GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
+ new/datum/stack_recipe("plastitanium window", /obj/structure/window/plastitanium/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE)
+ ))
+
+/obj/item/stack/sheet/plastitaniumglass
+ name = "plastitanium glass"
+ desc = "A glass sheet made out of a plasma-titanium-silicate alloy."
+ singular_name = "plastitanium glass sheet"
+ icon_state = "sheet-plastitaniumglass"
+ item_state = "sheet-plastitaniumglass"
+ materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
+ resistance_flags = ACID_PROOF
+ merge_type = /obj/item/stack/sheet/plastitaniumglass
+
+/obj/item/stack/sheet/plastitaniumglass/Initialize(mapload, new_amount, merge = TRUE)
+ recipes = GLOB.plastitaniumglass_recipes
+ return ..()
+
+/obj/item/shard
+ name = "shard"
+ desc = "A nasty looking shard of glass."
+ icon = 'icons/obj/shards.dmi'
+ icon_state = "large"
+ w_class = WEIGHT_CLASS_TINY
+ force = 5
+ throwforce = 10
+ item_state = "shard-glass"
+ lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
+ materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ attack_verb = list("stabbed", "slashed", "sliced", "cut")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ resistance_flags = ACID_PROOF
+ armor = list("melee" = 100, "bullet" = 0, "laser" = 0, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 100)
+ max_integrity = 40
+ sharpness = IS_SHARP
+ var/icon_prefix
+
+
+/obj/item/shard/suicide_act(mob/user)
+ user.visible_message("[user] is slitting [user.p_their()] [pick("wrists", "throat")] with the shard of glass! It looks like [user.p_theyre()] trying to commit suicide.")
+ return (BRUTELOSS)
+
+
+/obj/item/shard/Initialize()
+ . = ..()
+ AddComponent(/datum/component/caltrop, force)
+ AddComponent(/datum/component/butchering, 150, 65)
+ icon_state = pick("large", "medium", "small")
+ switch(icon_state)
+ if("small")
+ pixel_x = rand(-12, 12)
+ pixel_y = rand(-12, 12)
+ if("medium")
+ pixel_x = rand(-8, 8)
+ pixel_y = rand(-8, 8)
+ if("large")
+ pixel_x = rand(-5, 5)
+ pixel_y = rand(-5, 5)
+ if (icon_prefix)
+ icon_state = "[icon_prefix][icon_state]"
+
+ var/turf/T = get_turf(src)
+ if(T && is_station_level(T.z))
+ SSblackbox.record_feedback("tally", "station_mess_created", 1, name)
+
+/obj/item/shard/Destroy()
+ . = ..()
+
+ var/turf/T = get_turf(src)
+ if(T && is_station_level(T.z))
+ SSblackbox.record_feedback("tally", "station_mess_destroyed", 1, name)
+
+/obj/item/shard/afterattack(atom/A as mob|obj, mob/user, proximity)
+ . = ..()
+ if(!proximity || !(src in user))
+ return
+ if(isturf(A))
+ return
+ if(istype(A, /obj/item/storage))
+ return
+ var/hit_hand = ((user.active_hand_index % 2 == 0) ? "r_" : "l_") + "arm"
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(!H.gloves && !HAS_TRAIT(H, TRAIT_PIERCEIMMUNE)) // golems, etc
+ to_chat(H, "[src] cuts into your hand!")
+ H.apply_damage(force*0.5, BRUTE, hit_hand)
+ else if(ismonkey(user))
+ var/mob/living/carbon/monkey/M = user
+ if(!HAS_TRAIT(M, TRAIT_PIERCEIMMUNE))
+ to_chat(M, "[src] cuts into your hand!")
+ M.apply_damage(force*0.5, BRUTE, hit_hand)
+
+
+/obj/item/shard/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/lightreplacer))
+ I.attackby(src, user)
+ else
+ return ..()
+
+/obj/item/shard/welder_act(mob/living/user, obj/item/I)
+ ..()
+ if(I.use_tool(src, user, 0, volume=50))
+ var/obj/item/stack/sheet/glass/NG = new (user.loc)
+ for(var/obj/item/stack/sheet/glass/G in user.loc)
+ if(G == NG)
+ continue
+ if(G.amount >= G.max_amount)
+ continue
+ G.attackby(NG, user)
+ to_chat(user, "You add the newly-formed glass to the stack. It now contains [NG.amount] sheet\s.")
+ qdel(src)
+ return TRUE
+
+/obj/item/shard/Crossed(mob/living/L)
+ if(istype(L) && has_gravity(loc))
+ if(HAS_TRAIT(L, TRAIT_LIGHT_STEP))
+ playsound(loc, 'sound/effects/glass_step.ogg', 30, 1)
+ else
+ playsound(loc, 'sound/effects/glass_step.ogg', 50, 1)
+ return ..()
+
+/obj/item/shard/plasma
+ name = "purple shard"
+ desc = "A nasty looking shard of plasma glass."
+ force = 6
+ throwforce = 11
+ icon_state = "plasmalarge"
+ materials = list(MAT_PLASMA=MINERAL_MATERIAL_AMOUNT * 0.5, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
+ icon_prefix = "plasma"
+
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 59710969..c2578322 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -1,651 +1,652 @@
-/* Tables and Racks
- * Contains:
- * Tables
- * Glass Tables
- * Wooden Tables
- * Reinforced Tables
- * Racks
- * Rack Parts
- */
-
-/*
- * Tables
- */
-
-/obj/structure/table
- name = "table"
- desc = "A square piece of metal standing on four metal legs. It can not move."
- icon = 'icons/obj/smooth_structures/table.dmi'
- icon_state = "table"
- density = TRUE
- anchored = TRUE
- layer = TABLE_LAYER
- climbable = TRUE
- obj_flags = CAN_BE_HIT|SHOVABLE_ONTO
- pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density.")
- var/frame = /obj/structure/table_frame
- var/framestack = /obj/item/stack/rods
- var/buildstack = /obj/item/stack/sheet/metal
- var/busy = FALSE
- var/buildstackamount = 1
- var/framestackamount = 2
- var/deconstruction_ready = 1
- max_integrity = 100
- integrity_failure = 30
- smooth = SMOOTH_TRUE
- canSmoothWith = list(/obj/structure/table, /obj/structure/table/reinforced)
-
-/obj/structure/table/examine(mob/user)
- . = ..()
- . += deconstruction_hints(user)
-
-/obj/structure/table/proc/deconstruction_hints(mob/user)
- return "The top is screwed on, but the main bolts are also visible."
-
-/obj/structure/table/update_icon()
- if(smooth)
- queue_smooth(src)
- queue_smooth_neighbors(src)
-
-/obj/structure/table/narsie_act()
- var/atom/A = loc
- qdel(src)
- new /obj/structure/table/wood(A)
-
-/obj/structure/table/ratvar_act()
- var/atom/A = loc
- qdel(src)
- new /obj/structure/table/reinforced/brass(A)
-
-/obj/structure/table/attack_paw(mob/user)
- return attack_hand(user)
-
-/obj/structure/table/attack_hand(mob/living/user)
- if(Adjacent(user) && user.pulling)
- if(isliving(user.pulling))
- var/mob/living/pushed_mob = user.pulling
- if(pushed_mob.buckled)
- to_chat(user, "[pushed_mob] is buckled to [pushed_mob.buckled]!")
- return
- if(user.a_intent == INTENT_GRAB)
- if(user.grab_state < GRAB_AGGRESSIVE)
- to_chat(user, "You need a better grip to do that!")
- return
- tablepush(user, pushed_mob)
- if(user.a_intent == INTENT_HELP)
- pushed_mob.visible_message("[user] begins to place [pushed_mob] onto [src]...", \
- "[user] begins to place [pushed_mob] onto [src]...")
- if(do_after(user, 35, target = pushed_mob))
- tableplace(user, pushed_mob)
- else
- return
- user.stop_pulling()
- else if(user.pulling.pass_flags & PASSTABLE)
- user.Move_Pulled(src)
- if (user.pulling.loc == loc)
- user.visible_message("[user] places [user.pulling] onto [src].",
- "You place [user.pulling] onto [src].")
- user.stop_pulling()
- return ..()
-
-/obj/structure/table/attack_tk()
- return FALSE
-
-/obj/structure/table/CanPass(atom/movable/mover, turf/target)
- if(istype(mover) && (mover.pass_flags & PASSTABLE))
- return 1
- if(mover.throwing)
- return 1
- if(locate(/obj/structure/table) in get_turf(mover))
- return 1
- else
- return !density
-
-/obj/structure/table/CanAStarPass(ID, dir, caller)
- . = !density
- if(ismovableatom(caller))
- var/atom/movable/mover = caller
- . = . || (mover.pass_flags & PASSTABLE)
-
-/obj/structure/table/proc/tableplace(mob/living/user, mob/living/pushed_mob)
- pushed_mob.forceMove(src.loc)
- pushed_mob.resting = TRUE
- pushed_mob.update_canmove()
- pushed_mob.visible_message("[user] places [pushed_mob] onto [src].", \
- "[user] places [pushed_mob] onto [src].")
- log_combat(user, pushed_mob, "placed")
-
-/obj/structure/table/proc/tablepush(mob/living/user, mob/living/pushed_mob)
- if(HAS_TRAIT(user, TRAIT_PACIFISM))
- to_chat(user, "Throwing [pushed_mob] onto the table might hurt them!")
- return
- var/added_passtable = FALSE
- if(!pushed_mob.pass_flags & PASSTABLE)
- added_passtable = TRUE
- pushed_mob.pass_flags |= PASSTABLE
- pushed_mob.Move(src.loc)
- if(added_passtable)
- pushed_mob.pass_flags &= ~PASSTABLE
- if(pushed_mob.loc != loc) //Something prevented the tabling
- return
- pushed_mob.Knockdown(40)
- pushed_mob.visible_message("[user] slams [pushed_mob] onto [src]!", \
- "[user] slams you onto [src]!")
- log_combat(user, pushed_mob, "tabled", null, "onto [src]")
- if(!ishuman(pushed_mob))
- return
- var/mob/living/carbon/human/H = pushed_mob
- SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table)
-
-/obj/structure/table/shove_act(mob/living/target, mob/living/user)
- if(!target.resting)
- target.Knockdown(SHOVE_KNOCKDOWN_TABLE)
- user.visible_message("[user.name] shoves [target.name] onto \the [src]!",
- "You shove [target.name] onto \the [src]!", null, COMBAT_MESSAGE_RANGE)
- target.forceMove(src.loc)
- log_combat(user, target, "shoved", "onto [src] (table)")
- return TRUE
-
-/obj/structure/table/attackby(obj/item/I, mob/user, params)
- if(!(flags_1 & NODECONSTRUCT_1))
- if(istype(I, /obj/item/screwdriver) && deconstruction_ready)
- to_chat(user, "You start disassembling [src]...")
- if(I.use_tool(src, user, 20, volume=50))
- deconstruct(TRUE)
- return
-
- if(istype(I, /obj/item/wrench) && deconstruction_ready)
- to_chat(user, "You start deconstructing [src]...")
- if(I.use_tool(src, user, 40, volume=50))
- playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
- deconstruct(TRUE, 1)
- return
-
- if(istype(I, /obj/item/storage/bag/tray))
- var/obj/item/storage/bag/tray/T = I
- if(T.contents.len > 0) // If the tray isn't empty
- SEND_SIGNAL(I, COMSIG_TRY_STORAGE_QUICK_EMPTY, drop_location())
- user.visible_message("[user] empties [I] on [src].")
- return
- // If the tray IS empty, continue on (tray will be placed on the table like other items)
-
- if(user.a_intent != INTENT_HARM && !(I.item_flags & ABSTRACT))
- if(user.transferItemToLoc(I, drop_location()))
- var/list/click_params = params2list(params)
- //Center the icon where the user clicked.
- if(!click_params || !click_params["icon-x"] || !click_params["icon-y"])
- return
- //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf)
- I.pixel_x = CLAMP(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2)
- I.pixel_y = CLAMP(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2)
- return 1
- else
- return ..()
-
-
-/obj/structure/table/deconstruct(disassembled = TRUE, wrench_disassembly = 0)
- if(!(flags_1 & NODECONSTRUCT_1))
- var/turf/T = get_turf(src)
- new buildstack(T, buildstackamount)
- if(!wrench_disassembly)
- new frame(T)
- else
- new framestack(T, framestackamount)
- qdel(src)
-
-
-/*
- * Glass tables
- */
-/obj/structure/table/glass
- name = "glass table"
- desc = "What did I say about leaning on the glass tables? Now you need surgery."
- icon = 'icons/obj/smooth_structures/glass_table.dmi'
- icon_state = "glass_table"
- buildstack = /obj/item/stack/sheet/glass
- canSmoothWith = null
- max_integrity = 70
- resistance_flags = ACID_PROOF
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
- var/list/debris = list()
-
-/obj/structure/table/glass/New()
- . = ..()
- debris += new frame
- debris += new /obj/item/shard
-
-/obj/structure/table/glass/Destroy()
- QDEL_LIST(debris)
- . = ..()
-
-/obj/structure/table/glass/Crossed(atom/movable/AM)
- . = ..()
- if(flags_1 & NODECONSTRUCT_1)
- return
- if(!isliving(AM))
- return
- // Don't break if they're just flying past
- if(AM.throwing)
- addtimer(CALLBACK(src, .proc/throw_check, AM), 5)
- else
- check_break(AM)
-
-/obj/structure/table/glass/proc/throw_check(mob/living/M)
- if(M.loc == get_turf(src))
- check_break(M)
-
-/obj/structure/table/glass/proc/check_break(mob/living/M)
- if(M.has_gravity() && M.mob_size > MOB_SIZE_SMALL && !(M.movement_type & FLYING))
- table_shatter(M)
-
-/obj/structure/table/glass/proc/table_shatter(mob/living/L)
- visible_message("[src] breaks!",
- "You hear breaking glass.")
- var/turf/T = get_turf(src)
- playsound(T, "shatter", 50, 1)
- for(var/I in debris)
- var/atom/movable/AM = I
- AM.forceMove(T)
- debris -= AM
- if(istype(AM, /obj/item/shard))
- AM.throw_impact(L)
- L.Knockdown(100)
- qdel(src)
-
-/obj/structure/table/glass/deconstruct(disassembled = TRUE, wrench_disassembly = 0)
- if(!(flags_1 & NODECONSTRUCT_1))
- if(disassembled)
- ..()
- return
- else
- var/turf/T = get_turf(src)
- playsound(T, "shatter", 50, 1)
- for(var/X in debris)
- var/atom/movable/AM = X
- AM.forceMove(T)
- debris -= AM
- qdel(src)
-
-/obj/structure/table/glass/narsie_act()
- color = NARSIE_WINDOW_COLOUR
- for(var/obj/item/shard/S in debris)
- S.color = NARSIE_WINDOW_COLOUR
-
-/*
- * Plasmaglass tables
- */
-/obj/structure/table/plasmaglass
- name = "plasmaglass table"
- desc = "A glasstable, but it's pink and more sturdy. What will Nanotrasen design next with plasma?"
- icon = 'icons/obj/smooth_structures/plasmaglass_table.dmi'
- icon_state = "plasmaglass_table"
- climbable = TRUE
- buildstack = /obj/item/stack/sheet/plasmaglass
- canSmoothWith = null
- max_integrity = 270
- resistance_flags = ACID_PROOF
- armor = list("melee" = 10, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
- var/list/debris = list()
-
-/obj/structure/table/plasmaglass/New()
- . = ..()
- debris += new frame
- debris += new /obj/item/shard/plasma
-
-/obj/structure/table/plasmaglass/Destroy()
- QDEL_LIST(debris)
- . = ..()
-
-/obj/structure/table/plasmaglass/proc/check_break(mob/living/M)
- return
-
-/obj/structure/table/plasmaglass/deconstruct(disassembled = TRUE, wrench_disassembly = 0)
- if(!(flags_1 & NODECONSTRUCT_1))
- if(disassembled)
- ..()
- return
- else
- var/turf/T = get_turf(src)
- playsound(T, "shatter", 50, 1)
- for(var/X in debris)
- var/atom/movable/AM = X
- AM.forceMove(T)
- debris -= AM
- qdel(src)
-
-/obj/structure/table/plasmaglass/narsie_act()
- color = NARSIE_WINDOW_COLOUR
- for(var/obj/item/shard/S in debris)
- S.color = NARSIE_WINDOW_COLOUR
-
-/*
- * Wooden tables
- */
-
-/obj/structure/table/wood
- name = "wooden table"
- desc = "Do not apply fire to this. Rumour says it burns easily."
- icon = 'icons/obj/smooth_structures/wood_table.dmi'
- icon_state = "wood_table"
- frame = /obj/structure/table_frame/wood
- framestack = /obj/item/stack/sheet/mineral/wood
- buildstack = /obj/item/stack/sheet/mineral/wood
- resistance_flags = FLAMMABLE
- max_integrity = 70
- canSmoothWith = list(/obj/structure/table/wood,
- /obj/structure/table/wood/poker,
- /obj/structure/table/wood/bar)
-
-/obj/structure/table/wood/narsie_act(total_override = TRUE)
- if(!total_override)
- ..()
-
-/obj/structure/table/wood/poker //No specialties, Just a mapping object.
- name = "gambling table"
- desc = "A seedy table for seedy dealings in seedy places."
- icon = 'icons/obj/smooth_structures/poker_table.dmi'
- icon_state = "poker_table"
- buildstack = /obj/item/stack/tile/carpet
-
-/obj/structure/table/wood/poker/narsie_act()
- ..(FALSE)
-
-/obj/structure/table/wood/fancy
- name = "fancy table"
- desc = "A standard metal table frame covered with an amazingly fancy, patterned cloth."
- icon = 'icons/obj/structures.dmi'
- icon_state = "fancy_table"
- frame = /obj/structure/table_frame
- framestack = /obj/item/stack/rods
- buildstack = /obj/item/stack/tile/carpet
- canSmoothWith = list(/obj/structure/table/wood/fancy, /obj/structure/table/wood/fancy/black, /obj/structure/table/wood/fancy/blackred, /obj/structure/table/wood/fancy/monochrome)
-
-/obj/structure/table/wood/fancy/New()
- // New() is used so that the /black subtype can override `icon` easily and
- // the correct value will be used by the smoothing subsystem.
- . = ..()
- // Needs to be set dynamically because table smooth sprites are 32x34,
- // which the editor treats as a two-tile-tall object. The sprites are that
- // size so that the north/south corners look nice - examine the detail on
- // the sprites in the editor to see why.
- icon = 'icons/obj/smooth_structures/fancy_table.dmi'
-
-/obj/structure/table/wood/fancy/black
- icon_state = "fancy_table_black"
- buildstack = /obj/item/stack/tile/carpet/black
-
-/obj/structure/table/wood/fancy/blackred
- icon = 'icons/obj/structures.dmi'
- icon_state = "fancy_table_blackred"
- buildstack = /obj/item/stack/tile/carpet/blackred
-
-/obj/structure/table/wood/fancy/blackred/New()
- . = ..()
- icon = 'icons/obj/smooth_structures/fancy_table_blackred.dmi'
-
-/obj/structure/table/wood/fancy/monochrome
- icon = 'icons/obj/structures.dmi'
- icon_state = "fancy_table_monochrome"
- buildstack = /obj/item/stack/tile/carpet/monochrome
-
-/obj/structure/table/wood/fancy/monochrome/New()
- . = ..()
- icon = 'icons/obj/smooth_structures/fancy_table_monochrome.dmi'
-
-/obj/structure/table/wood/fancy/black/New()
- . = ..()
- // Ditto above.
- icon = 'icons/obj/smooth_structures/fancy_table_black.dmi'
-/*
- * Reinforced tables
- */
-/obj/structure/table/reinforced
- name = "reinforced table"
- desc = "A reinforced version of the four legged table."
- icon = 'icons/obj/smooth_structures/reinforced_table.dmi'
- icon_state = "r_table"
- deconstruction_ready = 0
- buildstack = /obj/item/stack/sheet/plasteel
- canSmoothWith = list(/obj/structure/table/reinforced, /obj/structure/table)
- max_integrity = 200
- integrity_failure = 50
- armor = list("melee" = 10, "bullet" = 30, "laser" = 30, "energy" = 100, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70)
-
-/obj/structure/table/reinforced/deconstruction_hints(mob/user)
- if(deconstruction_ready)
- to_chat(user, "The top cover has been welded loose and the main frame's bolts are exposed.")
- else
- to_chat(user, "The top cover is firmly welded on.")
-
-/obj/structure/table/reinforced/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/weldingtool))
- if(!W.tool_start_check(user, amount=0))
- return
-
- if(deconstruction_ready)
- to_chat(user, "You start strengthening the reinforced table...")
- if (W.use_tool(src, user, 50, volume=50))
- to_chat(user, "You strengthen the table.")
- deconstruction_ready = 0
- else
- to_chat(user, "You start weakening the reinforced table...")
- if (W.use_tool(src, user, 50, volume=50))
- to_chat(user, "You weaken the table.")
- deconstruction_ready = 1
- else
- . = ..()
-
-/obj/structure/table/reinforced/brass
- name = "brass table"
- desc = "A solid, slightly beveled brass table."
- icon = 'icons/obj/smooth_structures/brass_table.dmi'
- icon_state = "brass_table"
- resistance_flags = FIRE_PROOF | ACID_PROOF
- frame = /obj/structure/table_frame/brass
- framestack = /obj/item/stack/tile/brass
- buildstack = /obj/item/stack/tile/brass
- framestackamount = 1
- buildstackamount = 1
- canSmoothWith = list(/obj/structure/table/reinforced/brass, /obj/structure/table/bronze)
-
-/obj/structure/table/reinforced/brass/New()
- change_construction_value(2)
- ..()
-
-/obj/structure/table/reinforced/brass/Destroy()
- change_construction_value(-2)
- return ..()
-
-/obj/structure/table/reinforced/brass/tablepush(mob/living/user, mob/living/pushed_mob)
- .= ..()
- playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', 50, TRUE)
-
-/obj/structure/table/reinforced/brass/narsie_act()
- take_damage(rand(15, 45), BRUTE)
- if(src) //do we still exist?
- var/previouscolor = color
- color = "#960000"
- animate(src, color = previouscolor, time = 8)
- addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8)
-
-/obj/structure/table/reinforced/brass/ratvar_act()
- obj_integrity = max_integrity
-
-/obj/structure/table/bronze
- name = "bronze table"
- desc = "A solid table made out of bronze."
- icon = 'icons/obj/smooth_structures/brass_table.dmi'
- icon_state = "brass_table"
- resistance_flags = FIRE_PROOF | ACID_PROOF
- buildstack = /obj/item/stack/tile/bronze
- canSmoothWith = list(/obj/structure/table/reinforced/brass, /obj/structure/table/bronze)
-
-/obj/structure/table/bronze/tablepush(mob/living/user, mob/living/pushed_mob)
- ..()
- playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', 50, TRUE)
-
-/*
- * Surgery Tables
- */
-
-/obj/structure/table/optable
- name = "operating table"
- desc = "Used for advanced medical procedures."
- icon = 'icons/obj/surgery.dmi'
- icon_state = "optable"
- buildstack = /obj/item/stack/sheet/mineral/silver
- smooth = SMOOTH_FALSE
- can_buckle = 1
- buckle_lying = 1
- buckle_requires_restraints = 1
- var/mob/living/carbon/human/patient = null
- var/obj/machinery/computer/operating/computer = null
-
-/obj/structure/table/optable/New()
- ..()
- for(var/direction in GLOB.cardinals)
- computer = locate(/obj/machinery/computer/operating, get_step(src, direction))
- if(computer)
- computer.table = src
- break
-
-/obj/structure/table/optable/tablepush(mob/living/user, mob/living/pushed_mob)
- pushed_mob.forceMove(src.loc)
- pushed_mob.resting = 1
- pushed_mob.update_canmove()
- visible_message("[user] has laid [pushed_mob] on [src].")
- check_patient()
-
-/obj/structure/table/optable/proc/check_patient()
- var/mob/M = locate(/mob/living/carbon/human, loc)
- if(M)
- if(M.resting)
- patient = M
- return 1
- else
- patient = null
- return 0
-
-
-
-/*
- * Racks
- */
-/obj/structure/rack
- name = "rack"
- desc = "Different from the Middle Ages version."
- icon = 'icons/obj/objects.dmi'
- icon_state = "rack"
- layer = TABLE_LAYER
- density = TRUE
- anchored = TRUE
- pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density.
- max_integrity = 20
-
-/obj/structure/rack/examine(mob/user)
- . = ..()
- . += "It's held together by a couple of bolts."
-
-/obj/structure/rack/CanPass(atom/movable/mover, turf/target)
- if(src.density == 0) //Because broken racks -Agouri |TODO: SPRITE!|
- return 1
- if(istype(mover) && (mover.pass_flags & PASSTABLE))
- return 1
- else
- return 0
-
-/obj/structure/rack/CanAStarPass(ID, dir, caller)
- . = !density
- if(ismovableatom(caller))
- var/atom/movable/mover = caller
- . = . || (mover.pass_flags & PASSTABLE)
-
-/obj/structure/rack/MouseDrop_T(obj/O, mob/user)
- . = ..()
- if ((!( istype(O, /obj/item) ) || user.get_active_held_item() != O))
- return
- if(!user.dropItemToGround(O))
- return
- if(O.loc != src.loc)
- step(O, get_dir(O, src))
-
-/obj/structure/rack/attackby(obj/item/W, mob/user, params)
- if (istype(W, /obj/item/wrench) && !(flags_1&NODECONSTRUCT_1))
- W.play_tool_sound(src)
- deconstruct(TRUE)
- return
- if(user.a_intent == INTENT_HARM)
- return ..()
- if(user.transferItemToLoc(W, drop_location()))
- return 1
-
-/obj/structure/rack/attack_paw(mob/living/user)
- attack_hand(user)
-
-/obj/structure/rack/attack_hand(mob/living/user)
- . = ..()
- if(.)
- return
- if(user.IsKnockdown() || user.resting || user.lying || user.get_num_legs() < 2)
- return
- user.changeNext_move(CLICK_CD_MELEE)
- user.do_attack_animation(src, ATTACK_EFFECT_KICK)
- user.visible_message("[user] kicks [src].", null, null, COMBAT_MESSAGE_RANGE)
- take_damage(rand(4,8), BRUTE, "melee", 1)
-
-/obj/structure/rack/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
- switch(damage_type)
- if(BRUTE)
- if(damage_amount)
- playsound(loc, 'sound/items/dodgeball.ogg', 80, 1)
- else
- playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
- if(BURN)
- playsound(loc, 'sound/items/welder.ogg', 40, 1)
-
-/*
- * Rack destruction
- */
-
-/obj/structure/rack/deconstruct(disassembled = TRUE)
- if(!(flags_1&NODECONSTRUCT_1))
- density = FALSE
- var/obj/item/rack_parts/newparts = new(loc)
- transfer_fingerprints_to(newparts)
- qdel(src)
-
-
-/*
- * Rack Parts
- */
-
-/obj/item/rack_parts
- name = "rack parts"
- desc = "Parts of a rack."
- icon = 'icons/obj/items_and_weapons.dmi'
- icon_state = "rack_parts"
- flags_1 = CONDUCT_1
- materials = list(MAT_METAL=2000)
- var/building = FALSE
-
-/obj/item/rack_parts/attackby(obj/item/W, mob/user, params)
- if (istype(W, /obj/item/wrench))
- new /obj/item/stack/sheet/metal(user.loc)
- qdel(src)
- else
- . = ..()
-
-/obj/item/rack_parts/attack_self(mob/user)
- if(building)
- return
- building = TRUE
- to_chat(user, "You start constructing a rack...")
- if(do_after(user, 50, target = user, progress=TRUE))
- if(!user.temporarilyRemoveItemFromInventory(src))
- return
- var/obj/structure/rack/R = new /obj/structure/rack(user.loc)
- user.visible_message("[user] assembles \a [R].\
- ", "You assemble \a [R].")
- R.add_fingerprint(user)
- qdel(src)
- building = FALSE
+/* Tables and Racks
+ * Contains:
+ * Tables
+ * Glass Tables
+ * Wooden Tables
+ * Reinforced Tables
+ * Racks
+ * Rack Parts
+ */
+
+/*
+ * Tables
+ */
+
+/obj/structure/table
+ name = "table"
+ desc = "A square piece of metal standing on four metal legs. It can not move."
+ icon = 'icons/obj/smooth_structures/table.dmi'
+ icon_state = "table"
+ density = TRUE
+ anchored = TRUE
+ layer = TABLE_LAYER
+ climbable = TRUE
+ obj_flags = CAN_BE_HIT|SHOVABLE_ONTO
+ pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density.")
+ var/frame = /obj/structure/table_frame
+ var/framestack = /obj/item/stack/rods
+ var/buildstack = /obj/item/stack/sheet/metal
+ var/busy = FALSE
+ var/buildstackamount = 1
+ var/framestackamount = 2
+ var/deconstruction_ready = 1
+ max_integrity = 100
+ integrity_failure = 30
+ smooth = SMOOTH_TRUE
+ canSmoothWith = list(/obj/structure/table, /obj/structure/table/reinforced)
+
+/obj/structure/table/examine(mob/user)
+ . = ..()
+ . += deconstruction_hints(user)
+
+/obj/structure/table/proc/deconstruction_hints(mob/user)
+ return "The top is screwed on, but the main bolts are also visible."
+
+/obj/structure/table/update_icon()
+ if(smooth)
+ queue_smooth(src)
+ queue_smooth_neighbors(src)
+
+/obj/structure/table/narsie_act()
+ var/atom/A = loc
+ qdel(src)
+ new /obj/structure/table/wood(A)
+
+/obj/structure/table/ratvar_act()
+ var/atom/A = loc
+ qdel(src)
+ new /obj/structure/table/reinforced/brass(A)
+
+/obj/structure/table/attack_paw(mob/user)
+ return attack_hand(user)
+
+/obj/structure/table/attack_hand(mob/living/user)
+ if(Adjacent(user) && user.pulling)
+ if(isliving(user.pulling))
+ var/mob/living/pushed_mob = user.pulling
+ if(pushed_mob.buckled)
+ to_chat(user, "[pushed_mob] is buckled to [pushed_mob.buckled]!")
+ return
+ if(user.a_intent == INTENT_GRAB)
+ if(user.grab_state < GRAB_AGGRESSIVE)
+ to_chat(user, "You need a better grip to do that!")
+ return
+ tablepush(user, pushed_mob)
+ if(user.a_intent == INTENT_HELP)
+ pushed_mob.visible_message("[user] begins to place [pushed_mob] onto [src]...", \
+ "[user] begins to place [pushed_mob] onto [src]...")
+ if(do_after(user, 35, target = pushed_mob))
+ tableplace(user, pushed_mob)
+ else
+ return
+ user.stop_pulling()
+ else if(user.pulling.pass_flags & PASSTABLE)
+ user.Move_Pulled(src)
+ if (user.pulling.loc == loc)
+ user.visible_message("[user] places [user.pulling] onto [src].",
+ "You place [user.pulling] onto [src].")
+ user.stop_pulling()
+ return ..()
+
+/obj/structure/table/attack_tk()
+ return FALSE
+
+/obj/structure/table/CanPass(atom/movable/mover, turf/target)
+ if(istype(mover) && (mover.pass_flags & PASSTABLE))
+ return 1
+ if(mover.throwing)
+ return 1
+ if(locate(/obj/structure/table) in get_turf(mover))
+ return 1
+ else
+ return !density
+
+/obj/structure/table/CanAStarPass(ID, dir, caller)
+ . = !density
+ if(ismovableatom(caller))
+ var/atom/movable/mover = caller
+ . = . || (mover.pass_flags & PASSTABLE)
+
+/obj/structure/table/proc/tableplace(mob/living/user, mob/living/pushed_mob)
+ pushed_mob.forceMove(src.loc)
+ pushed_mob.resting = TRUE
+ pushed_mob.update_canmove()
+ pushed_mob.visible_message("[user] places [pushed_mob] onto [src].", \
+ "[user] places [pushed_mob] onto [src].")
+ log_combat(user, pushed_mob, "placed")
+
+/obj/structure/table/proc/tablepush(mob/living/user, mob/living/pushed_mob)
+ if(HAS_TRAIT(user, TRAIT_PACIFISM))
+ to_chat(user, "Throwing [pushed_mob] onto the table might hurt them!")
+ return
+ var/added_passtable = FALSE
+ if(!pushed_mob.pass_flags & PASSTABLE)
+ added_passtable = TRUE
+ pushed_mob.pass_flags |= PASSTABLE
+ pushed_mob.Move(src.loc)
+ if(added_passtable)
+ pushed_mob.pass_flags &= ~PASSTABLE
+ if(pushed_mob.loc != loc) //Something prevented the tabling
+ return
+ pushed_mob.Knockdown(40)
+ pushed_mob.visible_message("[user] slams [pushed_mob] onto [src]!", \
+ "[user] slams you onto [src]!")
+ log_combat(user, pushed_mob, "tabled", null, "onto [src]")
+ if(!ishuman(pushed_mob))
+ return
+ var/mob/living/carbon/human/H = pushed_mob
+ SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table)
+
+/obj/structure/table/shove_act(mob/living/target, mob/living/user)
+ if(!target.resting)
+ target.Knockdown(SHOVE_KNOCKDOWN_TABLE)
+ user.visible_message("[user.name] shoves [target.name] onto \the [src]!",
+ "You shove [target.name] onto \the [src]!", null, COMBAT_MESSAGE_RANGE)
+ target.forceMove(src.loc)
+ log_combat(user, target, "shoved", "onto [src] (table)")
+ return TRUE
+
+/obj/structure/table/attackby(obj/item/I, mob/user, params)
+ if(!(flags_1 & NODECONSTRUCT_1))
+ if(istype(I, /obj/item/screwdriver) && deconstruction_ready)
+ to_chat(user, "You start disassembling [src]...")
+ if(I.use_tool(src, user, 20, volume=50))
+ deconstruct(TRUE)
+ return
+
+ if(istype(I, /obj/item/wrench) && deconstruction_ready)
+ to_chat(user, "You start deconstructing [src]...")
+ if(I.use_tool(src, user, 40, volume=50))
+ playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
+ deconstruct(TRUE, 1)
+ return
+
+ if(istype(I, /obj/item/storage/bag/tray))
+ var/obj/item/storage/bag/tray/T = I
+ if(T.contents.len > 0) // If the tray isn't empty
+ SEND_SIGNAL(I, COMSIG_TRY_STORAGE_QUICK_EMPTY, drop_location())
+ user.visible_message("[user] empties [I] on [src].")
+ return
+ // If the tray IS empty, continue on (tray will be placed on the table like other items)
+
+ if(user.a_intent != INTENT_HARM && !(I.item_flags & ABSTRACT))
+ if(user.transferItemToLoc(I, drop_location()))
+ var/list/click_params = params2list(params)
+ //Center the icon where the user clicked.
+ if(!click_params || !click_params["icon-x"] || !click_params["icon-y"])
+ return
+ //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf)
+ I.pixel_x = CLAMP(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2)
+ I.pixel_y = CLAMP(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2)
+ return 1
+ else
+ return ..()
+
+
+/obj/structure/table/deconstruct(disassembled = TRUE, wrench_disassembly = 0)
+ if(!(flags_1 & NODECONSTRUCT_1))
+ var/turf/T = get_turf(src)
+ new buildstack(T, buildstackamount)
+ if(!wrench_disassembly)
+ new frame(T)
+ else
+ new framestack(T, framestackamount)
+ qdel(src)
+
+
+/*
+ * Glass tables
+ */
+/obj/structure/table/glass
+ name = "glass table"
+ desc = "What did I say about leaning on the glass tables? Now you need surgery."
+ icon = 'icons/obj/smooth_structures/glass_table.dmi'
+ icon_state = "glass_table"
+ buildstack = /obj/item/stack/sheet/glass
+ canSmoothWith = null
+ max_integrity = 70
+ resistance_flags = ACID_PROOF
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
+ var/list/debris = list()
+
+/obj/structure/table/glass/New()
+ . = ..()
+ debris += new frame
+ debris += new /obj/item/shard
+
+/obj/structure/table/glass/Destroy()
+ QDEL_LIST(debris)
+ . = ..()
+
+/obj/structure/table/glass/Crossed(atom/movable/AM)
+ . = ..()
+ if(flags_1 & NODECONSTRUCT_1)
+ return
+ if(!isliving(AM))
+ return
+ // Don't break if they're just flying past
+ if(AM.throwing)
+ addtimer(CALLBACK(src, .proc/throw_check, AM), 5)
+ else
+ check_break(AM)
+
+/obj/structure/table/glass/proc/throw_check(mob/living/M)
+ if(M.loc == get_turf(src))
+ check_break(M)
+
+/obj/structure/table/glass/proc/check_break(mob/living/M)
+ if(M.has_gravity() && M.mob_size > MOB_SIZE_SMALL && !(M.movement_type & FLYING))
+ table_shatter(M)
+
+/obj/structure/table/glass/proc/table_shatter(mob/living/L)
+ visible_message("[src] breaks!",
+ "You hear breaking glass.")
+ var/turf/T = get_turf(src)
+ playsound(T, "shatter", 50, 1)
+ for(var/I in debris)
+ var/atom/movable/AM = I
+ AM.forceMove(T)
+ debris -= AM
+ if(istype(AM, /obj/item/shard))
+ AM.throw_impact(L)
+ L.Knockdown(100)
+ qdel(src)
+
+/obj/structure/table/glass/deconstruct(disassembled = TRUE, wrench_disassembly = 0)
+ if(!(flags_1 & NODECONSTRUCT_1))
+ if(disassembled)
+ ..()
+ return
+ else
+ var/turf/T = get_turf(src)
+ playsound(T, "shatter", 50, 1)
+ for(var/X in debris)
+ var/atom/movable/AM = X
+ AM.forceMove(T)
+ debris -= AM
+ qdel(src)
+
+/obj/structure/table/glass/narsie_act()
+ color = NARSIE_WINDOW_COLOUR
+ for(var/obj/item/shard/S in debris)
+ S.color = NARSIE_WINDOW_COLOUR
+
+/*
+ * Plasmaglass tables
+ */
+/obj/structure/table/plasmaglass
+ name = "plasmaglass table"
+ desc = "A glasstable, but it's pink and more sturdy. What will Nanotrasen design next with plasma?"
+ icon = 'icons/obj/smooth_structures/plasmaglass_table.dmi'
+ icon_state = "plasmaglass_table"
+ climbable = TRUE
+ buildstack = /obj/item/stack/sheet/plasmaglass
+ canSmoothWith = null
+ max_integrity = 270
+ resistance_flags = ACID_PROOF
+ armor = list("melee" = 10, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
+ var/list/debris = list()
+
+/obj/structure/table/plasmaglass/New()
+ . = ..()
+ debris += new frame
+ debris += new /obj/item/shard/plasma
+
+/obj/structure/table/plasmaglass/Destroy()
+ QDEL_LIST(debris)
+ . = ..()
+
+/obj/structure/table/plasmaglass/proc/check_break(mob/living/M)
+ return
+
+/obj/structure/table/plasmaglass/deconstruct(disassembled = TRUE, wrench_disassembly = 0)
+ if(!(flags_1 & NODECONSTRUCT_1))
+ if(disassembled)
+ ..()
+ return
+ else
+ var/turf/T = get_turf(src)
+ playsound(T, "shatter", 50, 1)
+ for(var/X in debris)
+ var/atom/movable/AM = X
+ AM.forceMove(T)
+ debris -= AM
+ qdel(src)
+
+/obj/structure/table/plasmaglass/narsie_act()
+ color = NARSIE_WINDOW_COLOUR
+ for(var/obj/item/shard/S in debris)
+ S.color = NARSIE_WINDOW_COLOUR
+
+/*
+ * Wooden tables
+ */
+
+/obj/structure/table/wood
+ name = "wooden table"
+ desc = "Do not apply fire to this. Rumour says it burns easily."
+ icon = 'icons/obj/smooth_structures/wood_table.dmi'
+ icon_state = "wood_table"
+ frame = /obj/structure/table_frame/wood
+ framestack = /obj/item/stack/sheet/mineral/wood
+ buildstack = /obj/item/stack/sheet/mineral/wood
+ resistance_flags = FLAMMABLE
+ max_integrity = 70
+ canSmoothWith = list(/obj/structure/table/wood,
+ /obj/structure/table/wood/poker,
+ /obj/structure/table/wood/bar)
+
+/obj/structure/table/wood/narsie_act(total_override = TRUE)
+ if(!total_override)
+ ..()
+
+/obj/structure/table/wood/poker //No specialties, Just a mapping object.
+ name = "gambling table"
+ desc = "A seedy table for seedy dealings in seedy places."
+ icon = 'icons/obj/smooth_structures/poker_table.dmi'
+ icon_state = "poker_table"
+ buildstack = /obj/item/stack/tile/carpet
+
+/obj/structure/table/wood/poker/narsie_act()
+ ..(FALSE)
+
+/obj/structure/table/wood/fancy
+ name = "fancy table"
+ desc = "A standard metal table frame covered with an amazingly fancy, patterned cloth."
+ icon = 'icons/obj/structures.dmi'
+ icon_state = "fancy_table"
+ frame = /obj/structure/table_frame
+ framestack = /obj/item/stack/rods
+ buildstack = /obj/item/stack/tile/carpet
+ canSmoothWith = list(/obj/structure/table/wood/fancy, /obj/structure/table/wood/fancy/black, /obj/structure/table/wood/fancy/blackred, /obj/structure/table/wood/fancy/monochrome)
+
+/obj/structure/table/wood/fancy/New()
+ // New() is used so that the /black subtype can override `icon` easily and
+ // the correct value will be used by the smoothing subsystem.
+ . = ..()
+ // Needs to be set dynamically because table smooth sprites are 32x34,
+ // which the editor treats as a two-tile-tall object. The sprites are that
+ // size so that the north/south corners look nice - examine the detail on
+ // the sprites in the editor to see why.
+ icon = 'icons/obj/smooth_structures/fancy_table.dmi'
+
+/obj/structure/table/wood/fancy/black
+ icon_state = "fancy_table_black"
+ buildstack = /obj/item/stack/tile/carpet/black
+
+/obj/structure/table/wood/fancy/blackred
+ icon = 'icons/obj/structures.dmi'
+ icon_state = "fancy_table_blackred"
+ buildstack = /obj/item/stack/tile/carpet/blackred
+
+/obj/structure/table/wood/fancy/blackred/New()
+ . = ..()
+ icon = 'icons/obj/smooth_structures/fancy_table_blackred.dmi'
+
+/obj/structure/table/wood/fancy/monochrome
+ icon = 'icons/obj/structures.dmi'
+ icon_state = "fancy_table_monochrome"
+ buildstack = /obj/item/stack/tile/carpet/monochrome
+
+/obj/structure/table/wood/fancy/monochrome/New()
+ . = ..()
+ icon = 'icons/obj/smooth_structures/fancy_table_monochrome.dmi'
+
+/obj/structure/table/wood/fancy/black/New()
+ . = ..()
+ // Ditto above.
+ icon = 'icons/obj/smooth_structures/fancy_table_black.dmi'
+/*
+ * Reinforced tables
+ */
+/obj/structure/table/reinforced
+ name = "reinforced table"
+ desc = "A reinforced version of the four legged table."
+ icon = 'icons/obj/smooth_structures/reinforced_table.dmi'
+ icon_state = "r_table"
+ deconstruction_ready = 0
+ buildstack = /obj/item/stack/sheet/plasteel
+ canSmoothWith = list(/obj/structure/table/reinforced, /obj/structure/table)
+ max_integrity = 200
+ integrity_failure = 50
+ armor = list("melee" = 10, "bullet" = 30, "laser" = 30, "energy" = 100, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70)
+
+/obj/structure/table/reinforced/deconstruction_hints(mob/user)
+ if(deconstruction_ready)
+ to_chat(user, "The top cover has been welded loose and the main frame's bolts are exposed.")
+ else
+ to_chat(user, "The top cover is firmly welded on.")
+
+/obj/structure/table/reinforced/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/weldingtool))
+ if(!W.tool_start_check(user, amount=0))
+ return
+
+ if(deconstruction_ready)
+ to_chat(user, "You start strengthening the reinforced table...")
+ if (W.use_tool(src, user, 50, volume=50))
+ to_chat(user, "You strengthen the table.")
+ deconstruction_ready = 0
+ else
+ to_chat(user, "You start weakening the reinforced table...")
+ if (W.use_tool(src, user, 50, volume=50))
+ to_chat(user, "You weaken the table.")
+ deconstruction_ready = 1
+ else
+ . = ..()
+
+/obj/structure/table/reinforced/brass
+ name = "brass table"
+ desc = "A solid, slightly beveled brass table."
+ icon = 'icons/obj/smooth_structures/brass_table.dmi'
+ icon_state = "brass_table"
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ frame = /obj/structure/table_frame/brass
+ framestack = /obj/item/stack/tile/brass
+ buildstack = /obj/item/stack/tile/brass
+ framestackamount = 1
+ buildstackamount = 1
+ canSmoothWith = list(/obj/structure/table/reinforced/brass, /obj/structure/table/bronze)
+
+/obj/structure/table/reinforced/brass/New()
+ change_construction_value(2)
+ ..()
+
+/obj/structure/table/reinforced/brass/Destroy()
+ change_construction_value(-2)
+ return ..()
+
+/obj/structure/table/reinforced/brass/tablepush(mob/living/user, mob/living/pushed_mob)
+ .= ..()
+ playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', 50, TRUE)
+
+/obj/structure/table/reinforced/brass/narsie_act()
+ take_damage(rand(15, 45), BRUTE)
+ if(src) //do we still exist?
+ var/previouscolor = color
+ color = "#960000"
+ animate(src, color = previouscolor, time = 8)
+ addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8)
+
+/obj/structure/table/reinforced/brass/ratvar_act()
+ obj_integrity = max_integrity
+
+/obj/structure/table/bronze
+ name = "bronze table"
+ desc = "A solid table made out of bronze."
+ icon = 'icons/obj/smooth_structures/brass_table.dmi'
+ icon_state = "brass_table"
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ buildstack = /obj/item/stack/tile/bronze
+ canSmoothWith = list(/obj/structure/table/reinforced/brass, /obj/structure/table/bronze)
+
+/obj/structure/table/bronze/tablepush(mob/living/user, mob/living/pushed_mob)
+ ..()
+ playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', 50, TRUE)
+
+/*
+ * Surgery Tables
+ */
+
+/obj/structure/table/optable
+ name = "operating table"
+ desc = "Used for advanced medical procedures."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "optable"
+ buildstack = /obj/item/stack/sheet/mineral/silver
+ smooth = SMOOTH_FALSE
+ can_buckle = 1
+ buckle_lying = 1
+ buckle_requires_restraints = 1
+ var/mob/living/carbon/human/patient = null
+ var/obj/machinery/computer/operating/computer = null
+
+/obj/structure/table/optable/New()
+ ..()
+ for(var/direction in GLOB.cardinals)
+ computer = locate(/obj/machinery/computer/operating, get_step(src, direction))
+ if(computer)
+ computer.table = src
+ break
+
+/obj/structure/table/optable/tablepush(mob/living/user, mob/living/pushed_mob)
+ pushed_mob.forceMove(src.loc)
+ pushed_mob.resting = 1
+ pushed_mob.update_canmove()
+ visible_message("[user] has laid [pushed_mob] on [src].")
+ check_patient()
+
+/obj/structure/table/optable/proc/check_patient()
+ var/mob/M = locate(/mob/living/carbon/human, loc)
+ if(M)
+ if(M.resting)
+ patient = M
+ return 1
+ else
+ patient = null
+ return 0
+
+
+
+/*
+ * Racks
+ */
+/obj/structure/rack
+ name = "rack"
+ desc = "Different from the Middle Ages version."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "rack"
+ layer = TABLE_LAYER
+ density = TRUE
+ anchored = TRUE
+ pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density.
+ max_integrity = 20
+
+/obj/structure/rack/examine(mob/user)
+ . = ..()
+ . += "It's held together by a couple of bolts."
+
+/obj/structure/rack/CanPass(atom/movable/mover, turf/target)
+ if(src.density == 0) //Because broken racks -Agouri |TODO: SPRITE!|
+ return 1
+ if(istype(mover) && (mover.pass_flags & PASSTABLE))
+ return 1
+ else
+ return 0
+
+/obj/structure/rack/CanAStarPass(ID, dir, caller)
+ . = !density
+ if(ismovableatom(caller))
+ var/atom/movable/mover = caller
+ . = . || (mover.pass_flags & PASSTABLE)
+
+/obj/structure/rack/MouseDrop_T(obj/O, mob/user)
+ . = ..()
+ if ((!( istype(O, /obj/item) ) || user.get_active_held_item() != O))
+ return
+ if(!user.dropItemToGround(O))
+ return
+ if(O.loc != src.loc)
+ step(O, get_dir(O, src))
+
+/obj/structure/rack/attackby(obj/item/W, mob/user, params)
+ if (istype(W, /obj/item/wrench) && !(flags_1&NODECONSTRUCT_1))
+ W.play_tool_sound(src)
+ deconstruct(TRUE)
+ return
+ if(user.a_intent == INTENT_HARM)
+ return ..()
+ if(user.transferItemToLoc(W, drop_location()))
+ return 1
+
+/obj/structure/rack/attack_paw(mob/living/user)
+ attack_hand(user)
+
+/obj/structure/rack/attack_hand(mob/living/user)
+ . = ..()
+ if(.)
+ return
+ if(user.IsKnockdown() || user.resting || user.lying || user.get_num_legs() < 2)
+ return
+ user.changeNext_move(CLICK_CD_MELEE)
+ user.do_attack_animation(src, ATTACK_EFFECT_KICK)
+ user.visible_message("[user] kicks [src].", null, null, COMBAT_MESSAGE_RANGE)
+ take_damage(rand(4,8), BRUTE, "melee", 1)
+
+/obj/structure/rack/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
+ switch(damage_type)
+ if(BRUTE)
+ if(damage_amount)
+ playsound(loc, 'sound/items/dodgeball.ogg', 80, 1)
+ else
+ playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
+ if(BURN)
+ playsound(loc, 'sound/items/welder.ogg', 40, 1)
+
+/*
+ * Rack destruction
+ */
+
+/obj/structure/rack/deconstruct(disassembled = TRUE)
+ if(!(flags_1&NODECONSTRUCT_1))
+ density = FALSE
+ var/obj/item/rack_parts/newparts = new(loc)
+ transfer_fingerprints_to(newparts)
+ qdel(src)
+
+
+/*
+ * Rack Parts
+ */
+
+/obj/item/rack_parts
+ name = "rack parts"
+ desc = "Parts of a rack."
+ icon = 'icons/obj/items_and_weapons.dmi'
+ icon_state = "rack_parts"
+ flags_1 = CONDUCT_1
+ materials = list(MAT_METAL=2000)
+ var/building = FALSE
+
+/obj/item/rack_parts/attackby(obj/item/W, mob/user, params)
+ if (istype(W, /obj/item/wrench))
+ new /obj/item/stack/sheet/metal(user.loc)
+ qdel(src)
+ else
+ . = ..()
+
+/obj/item/rack_parts/attack_self(mob/user)
+ if(building)
+ return
+ building = TRUE
+ to_chat(user, "You start constructing a rack...")
+ if(do_after(user, 50, target = user, progress=TRUE))
+ if(!user.temporarilyRemoveItemFromInventory(src))
+ return
+ var/obj/structure/rack/R = new /obj/structure/rack(user.loc)
+ user.visible_message("[user] assembles \a [R].\
+ ", "You assemble \a [R].")
+ R.add_fingerprint(user)
+ qdel(src)
+ building = FALSE
+