diff --git a/code/game/objects/items/stacks/sheet_types.dm b/code/game/objects/items/stacks/sheet_types.dm
new file mode 100644
index 0000000000..be7e9ba77b
--- /dev/null
+++ b/code/game/objects/items/stacks/sheet_types.dm
@@ -0,0 +1,658 @@
+/* Diffrent misc types of sheets
+ * Contains:
+ * Metal
+ * Plasteel
+ * Wood
+ * Cloth
+ * Plastic
+ * Cardboard
+ * Paper Frames
+ * Runed Metal (cult)
+ * Brass (clockwork cult)
+ * Bronze (bake brass)
+ */
+
+/*
+ * Metal
+ */
+GLOBAL_LIST_INIT(metal_recipes, list ( \
+ new/datum/stack_recipe("stool", /obj/structure/chair/stool, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("bar stool", /obj/structure/chair/stool/bar, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("chair", /obj/structure/chair, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("bed", /obj/structure/bed, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ //CIT CHANGE - adds sofas to metal recipe list
+ new/datum/stack_recipe_list("sofas", list( \
+ new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa, one_per_turf = TRUE, on_floor = TRUE), \
+ new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/left, one_per_turf = TRUE, on_floor = TRUE), \
+ new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/right, one_per_turf = TRUE, on_floor = TRUE), \
+ new /datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corner, one_per_turf = TRUE, on_floor = TRUE), \
+ )), \
+ //END OF CIT CHANGES
+ null, \
+ new/datum/stack_recipe_list("office chairs", list( \
+ new/datum/stack_recipe("dark office chair", /obj/structure/chair/office/dark, 5, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("light office chair", /obj/structure/chair/office/light, 5, one_per_turf = TRUE, on_floor = TRUE), \
+ )), \
+ new/datum/stack_recipe_list("comfy chairs", list( \
+ new/datum/stack_recipe("beige comfy chair", /obj/structure/chair/comfy/beige, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("black comfy chair", /obj/structure/chair/comfy/black, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("brown comfy chair", /obj/structure/chair/comfy/brown, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("lime comfy chair", /obj/structure/chair/comfy/lime, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("teal comfy chair", /obj/structure/chair/comfy/teal, 2, one_per_turf = TRUE, on_floor = TRUE), \
+ )), \
+ null, \
+ new/datum/stack_recipe("rack parts", /obj/item/rack_parts), \
+ new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
+ null, \
+ new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
+ null, \
+ new/datum/stack_recipe("floor tile", /obj/item/stack/tile/plasteel, 1, 4, 20), \
+ new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60), \
+ null, \
+ new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 40, one_per_turf = TRUE, on_floor = TRUE), \
+ null, \
+ new/datum/stack_recipe("computer frame", /obj/structure/frame/computer, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("modular console", /obj/machinery/modular_computer/console/buildable/, 10, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("machine frame", /obj/structure/frame/machine, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
+ null, \
+ new /datum/stack_recipe_list("airlock assemblies", list( \
+ new /datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("public airlock assembly", /obj/structure/door_assembly/door_assembly_public, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("command airlock assembly", /obj/structure/door_assembly/door_assembly_com, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("security airlock assembly", /obj/structure/door_assembly/door_assembly_sec, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("engineering airlock assembly", /obj/structure/door_assembly/door_assembly_eng, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("mining airlock assembly", /obj/structure/door_assembly/door_assembly_min, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("atmospherics airlock assembly", /obj/structure/door_assembly/door_assembly_atmo, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("research airlock assembly", /obj/structure/door_assembly/door_assembly_research, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("freezer airlock assembly", /obj/structure/door_assembly/door_assembly_fre, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("science airlock assembly", /obj/structure/door_assembly/door_assembly_science, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("medical airlock assembly", /obj/structure/door_assembly/door_assembly_med, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("virology airlock assembly", /obj/structure/door_assembly/door_assembly_viro, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_mai, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("external airlock assembly", /obj/structure/door_assembly/door_assembly_ext, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("external maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_extmai, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new /datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ )), \
+ null, \
+ new/datum/stack_recipe("firelock frame", /obj/structure/firelock_frame, 3, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("meatspike frame", /obj/structure/kitchenspike_frame, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("reflector frame", /obj/structure/reflector, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \
+ null, \
+ new/datum/stack_recipe("grenade casing", /obj/item/grenade/chem_grenade), \
+ new/datum/stack_recipe("light fixture frame", /obj/item/wallframe/light_fixture, 2), \
+ new/datum/stack_recipe("small light fixture frame", /obj/item/wallframe/light_fixture/small, 1), \
+ null, \
+ new/datum/stack_recipe("apc frame", /obj/item/wallframe/apc, 2), \
+ new/datum/stack_recipe("air alarm frame", /obj/item/wallframe/airalarm, 2), \
+ new/datum/stack_recipe("fire alarm frame", /obj/item/wallframe/firealarm, 2), \
+ new/datum/stack_recipe("extinguisher cabinet frame", /obj/item/wallframe/extinguisher_cabinet, 2), \
+ new/datum/stack_recipe("button frame", /obj/item/wallframe/button, 1), \
+ null, \
+ new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("floodlight frame", /obj/structure/floodlight_frame, 5, one_per_turf = TRUE, on_floor = TRUE), \
+))
+
+/obj/item/stack/sheet/metal
+ name = "metal"
+ desc = "Sheets made out of metal."
+ singular_name = "metal sheet"
+ icon_state = "sheet-metal"
+ item_state = "sheet-metal"
+ materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT)
+ throwforce = 10
+ flags_1 = CONDUCT_1
+ resistance_flags = FIRE_PROOF
+ merge_type = /obj/item/stack/sheet/metal
+ grind_results = list("iron" = 20)
+ point_value = 2
+
+/obj/item/stack/sheet/metal/ratvar_act()
+ new /obj/item/stack/tile/brass(loc, amount)
+ qdel(src)
+
+/obj/item/stack/sheet/metal/narsie_act()
+ new /obj/item/stack/sheet/runed_metal(loc, amount)
+ qdel(src)
+
+/obj/item/stack/sheet/metal/fifty
+ amount = 50
+
+/obj/item/stack/sheet/metal/twenty
+ amount = 20
+
+/obj/item/stack/sheet/metal/ten
+ amount = 10
+
+/obj/item/stack/sheet/metal/five
+ amount = 5
+
+/obj/item/stack/sheet/metal/cyborg
+ materials = list()
+ is_cyborg = 1
+ cost = 500
+
+/obj/item/stack/sheet/metal/Initialize(mapload, new_amount, merge = TRUE)
+ recipes = GLOB.metal_recipes
+ return ..()
+
+/obj/item/stack/sheet/metal/suicide_act(mob/living/carbon/user)
+ user.visible_message("[user] begins whacking [user.p_them()]self over the head with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")
+ return BRUTELOSS
+
+/*
+ * Plasteel
+ */
+GLOBAL_LIST_INIT(plasteel_recipes, list ( \
+ new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = TRUE), \
+ new/datum/stack_recipe("bomb assembly", /obj/machinery/syndicatebomb/empty, 10, time = 50), \
+ null, \
+ new /datum/stack_recipe_list("airlock assemblies", list( \
+ new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 6, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("vault door assembly", /obj/structure/door_assembly/door_assembly_vault, 8, time = 50, one_per_turf = 1, on_floor = 1), \
+ )), \
+))
+
+/obj/item/stack/sheet/plasteel
+ name = "plasteel"
+ singular_name = "plasteel sheet"
+ desc = "This sheet is an alloy of iron and plasma."
+ icon_state = "sheet-plasteel"
+ item_state = "sheet-metal"
+ materials = list(MAT_METAL=2000, MAT_PLASMA=2000)
+ throwforce = 10
+ flags_1 = CONDUCT_1
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 80)
+ resistance_flags = FIRE_PROOF
+ merge_type = /obj/item/stack/sheet/plasteel
+ grind_results = list("iron" = 20, "plasma" = 20)
+ point_value = 23
+
+/obj/item/stack/sheet/plasteel/Initialize(mapload, new_amount, merge = TRUE)
+ recipes = GLOB.plasteel_recipes
+ return ..()
+
+/obj/item/stack/sheet/plasteel/twenty
+ amount = 20
+
+/obj/item/stack/sheet/plasteel/fifty
+ amount = 50
+
+/*
+ * Wood
+ */
+GLOBAL_LIST_INIT(wood_recipes, list ( \
+ new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1), \
+ new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20), \
+ new/datum/stack_recipe("wood table frame", /obj/structure/table_frame/wood, 2, time = 10), \
+ new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 40), \
+ new/datum/stack_recipe("rolling pin", /obj/item/kitchen/rollingpin, 2, time = 30), \
+ new/datum/stack_recipe("wooden chair", /obj/structure/chair/wood/, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("winged wooden chair", /obj/structure/chair/wood/wings, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("plywood chair", /obj/structure/chair/comfy/plywood, 4, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("rustic wooden door", /obj/structure/mineral_door/woodrustic, 10, time = 20, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("coffin", /obj/structure/closet/crate/coffin, 5, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("book case", /obj/structure/bookcase, 4, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("drying rack", /obj/machinery/smartfridge/drying_rack, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("dog bed", /obj/structure/bed/dogbed, 10, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("dresser", /obj/structure/dresser, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("picture frame", /obj/item/wallframe/picture, 1, time = 10),\
+ new/datum/stack_recipe("display case chassis", /obj/structure/displaycase_chassis, 5, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("loom", /obj/structure/loom, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \
+ new/datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),\
+ new/datum/stack_recipe("tiki mask", /obj/item/clothing/mask/gas/tiki_mask, 2), \
+ new/datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),\
+ new/datum/stack_recipe("ore box", /obj/structure/ore_box, 4, time = 50, one_per_turf = TRUE, on_floor = TRUE),\
+ new/datum/stack_recipe("wooden crate", /obj/structure/closet/crate/wooden, 6, time = 50, one_per_turf = TRUE, on_floor = TRUE),\
+ new/datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15),\
+ ))
+
+/obj/item/stack/sheet/mineral/wood
+ name = "wooden plank"
+ desc = "One can only guess that this is a bunch of wood."
+ singular_name = "wood plank"
+ icon_state = "sheet-wood"
+ item_state = "sheet-wood"
+ icon = 'icons/obj/stack_objects.dmi'
+ sheettype = "wood"
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0)
+ resistance_flags = FLAMMABLE
+ merge_type = /obj/item/stack/sheet/mineral/wood
+ novariants = TRUE
+ grind_results = list("carbon" = 20)
+
+/obj/item/stack/sheet/mineral/wood/Initialize(mapload, new_amount, merge = TRUE)
+ recipes = GLOB.wood_recipes
+ return ..()
+
+/obj/item/stack/sheet/mineral/wood/fifty
+ amount = 50
+
+/*
+ * Cloth
+ */
+GLOBAL_LIST_INIT(cloth_recipes, list ( \
+ new/datum/stack_recipe("grey jumpsuit", /obj/item/clothing/under/color/grey, 3), \
+ new/datum/stack_recipe("black shoes", /obj/item/clothing/shoes/sneakers/black, 2), \
+ null, \
+ new/datum/stack_recipe("backpack", /obj/item/storage/backpack, 4), \
+ new/datum/stack_recipe("duffel bag", /obj/item/storage/backpack/duffelbag, 6), \
+ null, \
+ new/datum/stack_recipe("plant bag", /obj/item/storage/bag/plants, 4), \
+ new/datum/stack_recipe("book bag", /obj/item/storage/bag/books, 4), \
+ new/datum/stack_recipe("mining satchel", /obj/item/storage/bag/ore, 4), \
+ new/datum/stack_recipe("chemistry bag", /obj/item/storage/bag/chemistry, 4), \
+ new/datum/stack_recipe("bio bag", /obj/item/storage/bag/bio, 4), \
+ null, \
+ new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/gauze/improvised, 1, 2, 6), \
+ new/datum/stack_recipe("rag", /obj/item/reagent_containers/rag, 1), \
+ new/datum/stack_recipe("towel", /obj/item/reagent_containers/rag/towel, 3), \
+ new/datum/stack_recipe("bedsheet", /obj/item/bedsheet, 3), \
+ new/datum/stack_recipe("empty sandbag", /obj/item/emptysandbag, 4), \
+ null, \
+ new/datum/stack_recipe("fingerless gloves", /obj/item/clothing/gloves/fingerless, 1),\
+ new/datum/stack_recipe("white gloves", /obj/item/clothing/gloves/color/white, 1),\
+ new/datum/stack_recipe("black gloves", /obj/item/clothing/gloves/color/black, 3), \
+ null, \
+ new/datum/stack_recipe("blindfold", /obj/item/clothing/glasses/sunglasses/blindfold, 2), \
+ ))
+
+/obj/item/stack/sheet/cloth
+ name = "cloth"
+ desc = "Is it cotton? Linen? Denim? Burlap? Canvas? You can't tell."
+ singular_name = "cloth roll"
+ icon_state = "sheet-cloth"
+ item_state = "sheet-cloth"
+ resistance_flags = FLAMMABLE
+ force = 0
+ throwforce = 0
+ merge_type = /obj/item/stack/sheet/cloth
+
+/obj/item/stack/sheet/cloth/Initialize(mapload, new_amount, merge = TRUE)
+ recipes = GLOB.cloth_recipes
+ return ..()
+
+/obj/item/stack/sheet/cloth/ten
+ amount = 10
+
+//Durathread fuck slash-asterisk comments
+ GLOBAL_LIST_INIT(durathread_recipes, list ( \
+ new/datum/stack_recipe("durathread jumpsuit", /obj/item/clothing/under/durathread, 4, time = 40),
+ new/datum/stack_recipe("durathread beret", /obj/item/clothing/head/beret/durathread, 2, time = 40), \
+ new/datum/stack_recipe("durathread beanie", /obj/item/clothing/head/beanie/durathread, 2, time = 40), \
+ new/datum/stack_recipe("durathread bandana", /obj/item/clothing/mask/bandana/durathread, 1, time = 25), \
+ new/datum/stack_recipe("durathread jumpskirt", /obj/item/clothing/under/duraskirt, 40, time = 40), \
+ ))
+
+/obj/item/stack/sheet/durathread
+ name = "durathread"
+ desc = "A fabric sown from incredibly durable threads, known for its usefulness in armor production."
+ singular_name = "durathread roll"
+ icon_state = "sheet-durathread"
+ item_state = "sheet-cloth"
+ resistance_flags = FLAMMABLE
+ force = 0
+ throwforce = 0
+ merge_type = /obj/item/stack/sheet/durathread
+
+/obj/item/stack/sheet/durathread/Initialize(mapload, new_amount, merge = TRUE)
+ recipes = GLOB.durathread_recipes
+ return ..()
+
+
+
+/*
+ * Cardboard
+ */
+GLOBAL_LIST_INIT(cardboard_recipes, list ( \
+ new/datum/stack_recipe("box", /obj/item/storage/box), \
+ new/datum/stack_recipe("sec box", /obj/item/storage/box/seclooking), \
+ new/datum/stack_recipe("light tubes", /obj/item/storage/box/lights/tubes), \
+ new/datum/stack_recipe("light bulbs", /obj/item/storage/box/lights/bulbs), \
+ new/datum/stack_recipe("mouse traps", /obj/item/storage/box/mousetraps), \
+ new/datum/stack_recipe("pizza box", /obj/item/pizzabox), \
+ new/datum/stack_recipe("power cell", /obj/item/storage/box/cells), \
+ new/datum/stack_recipe("02", /obj/item/storage/box/otwo), \
+ null, \
+ new/datum/stack_recipe("lethal ammo box", /obj/item/storage/box/lethalshot), \
+ new/datum/stack_recipe("rubber shot ammo box", /obj/item/storage/box/rubbershot), \
+ new/datum/stack_recipe("bean bag ammo box", /obj/item/storage/box/beanbag), \
+ new/datum/stack_recipe("12g ammo box", /obj/item/storage/box/lethalslugs), \
+ new/datum/stack_recipe("stun slug ammo box", /obj/item/storage/box/stunslug), \
+ new/datum/stack_recipe("tech shell ammo box", /obj/item/storage/box/techsslug), \
+ new/datum/stack_recipe("incendiary ammo box", /obj/item/storage/box/fireshot), \
+ new/datum/stack_recipe("firing pins", /obj/item/storage/box/firingpins), \
+ new/datum/stack_recipe("loose ammo", /obj/item/storage/box/ammoshells), \
+ null, \
+ new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3), \
+ new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg), \
+ new/datum/stack_recipe("folder", /obj/item/folder), \
+ new/datum/stack_recipe("large box", /obj/structure/closet/cardboard, 4), \
+ new/datum/stack_recipe("cardboard cutout", /obj/item/cardboard_cutout, 5), \
+ null, \
+ new/datum/stack_recipe("colored brown", /obj/item/storage/box/brown), \
+ new/datum/stack_recipe("colored green", /obj/item/storage/box/green), \
+ new/datum/stack_recipe("colored red", /obj/item/storage/box/blue), \
+ new/datum/stack_recipe("colored blue", /obj/item/storage/box/red), \
+ new/datum/stack_recipe("colored yellow", /obj/item/storage/box/yellow), \
+ new/datum/stack_recipe("colored pink", /obj/item/storage/box/pink), \
+ new/datum/stack_recipe("colored purple", /obj/item/storage/box/purple), \
+ ))
+
+/obj/item/stack/sheet/cardboard //BubbleWrap //it's cardboard you fuck
+ name = "cardboard"
+ desc = "Large sheets of card, like boxes folded flat."
+ singular_name = "cardboard sheet"
+ icon_state = "sheet-card"
+ item_state = "sheet-card"
+ resistance_flags = FLAMMABLE
+ force = 0
+ throwforce = 0
+ merge_type = /obj/item/stack/sheet/cardboard
+ novariants = TRUE
+
+/obj/item/stack/sheet/cardboard/Initialize(mapload, new_amount, merge = TRUE)
+ recipes = GLOB.cardboard_recipes
+ return ..()
+
+/obj/item/stack/sheet/cardboard/fifty
+ amount = 50
+
+/obj/item/stack/sheet/cardboard/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/stamp/clown) && !istype(loc, /obj/item/storage))
+ var/atom/droploc = drop_location()
+ if(use(1))
+ playsound(I, 'sound/items/bikehorn.ogg', 50, 1, -1)
+ to_chat(user, "You stamp the cardboard! Its a clown box! Honk!")
+ if (amount >= 0)
+ new/obj/item/storage/box/clown(droploc) //bugfix
+ else
+ . = ..()
+
+
+/*
+ * Runed Metal
+ */
+
+GLOBAL_LIST_INIT(runed_metal_recipes, list ( \
+ new/datum/stack_recipe("runed door", /obj/machinery/door/airlock/cult, 1, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("runed girder", /obj/structure/girder/cult, 1, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("pylon", /obj/structure/destructible/cult/pylon, 4, time = 40, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("forge", /obj/structure/destructible/cult/forge, 3, time = 40, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("archives", /obj/structure/destructible/cult/tome, 3, time = 40, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("altar", /obj/structure/destructible/cult/talisman, 3, time = 40, one_per_turf = TRUE, on_floor = TRUE), \
+ ))
+
+/obj/item/stack/sheet/runed_metal
+ name = "runed metal"
+ desc = "Sheets of cold metal with shifting inscriptions writ upon them."
+ singular_name = "runed metal sheet"
+ icon_state = "sheet-runed"
+ item_state = "sheet-runed"
+ icon = 'icons/obj/stack_objects.dmi'
+ sheettype = "runed"
+ merge_type = /obj/item/stack/sheet/runed_metal
+ novariants = TRUE
+ grind_results = list("iron" = 5, "blood" = 15)
+
+/obj/item/stack/sheet/runed_metal/ratvar_act()
+ new /obj/item/stack/tile/brass(loc, amount)
+ qdel(src)
+
+/obj/item/stack/sheet/runed_metal/attack_self(mob/living/user)
+ if(!iscultist(user))
+ to_chat(user, "Only one with forbidden knowledge could hope to work this metal...")
+ return
+ var/turf/T = get_turf(user) //we may have moved. adjust as needed...
+ var/area/A = get_area(user)
+ if((!is_station_level(T.z) && !is_mining_level(T.z)) || (A && !A.blob_allowed))
+ to_chat(user, "The veil is not weak enough here.")
+ return FALSE
+ return ..()
+
+/obj/item/stack/sheet/runed_metal/Initialize(mapload, new_amount, merge = TRUE)
+ recipes = GLOB.runed_metal_recipes
+ return ..()
+
+/obj/item/stack/sheet/runed_metal/fifty
+ amount = 50
+
+/obj/item/stack/sheet/runed_metal/ten
+ amount = 10
+
+/obj/item/stack/sheet/runed_metal/five
+ amount = 5
+
+/*
+ * Brass
+ */
+GLOBAL_LIST_INIT(brass_recipes, list ( \
+ new/datum/stack_recipe("wall gear", /obj/structure/destructible/clockwork/wall_gear, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
+ null,
+ new/datum/stack_recipe("brass pinion airlock", /obj/machinery/door/airlock/clockwork, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("brass pinion airlock - windowed", /obj/machinery/door/airlock/clockwork/brass, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("brass windoor", /obj/machinery/door/window/clockwork, 2, time = 30, on_floor = TRUE, window_checks = TRUE), \
+ null,
+ new/datum/stack_recipe("brass reflector", /obj/structure/destructible/clockwork/reflector, 10, time = 100, one_per_turf = TRUE, on_floor = TRUE, window_checks = TRUE), \
+ null,
+ new/datum/stack_recipe("brass window - directional", /obj/structure/window/reinforced/clockwork/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \
+ new/datum/stack_recipe("brass window - fulltile", /obj/structure/window/reinforced/clockwork/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \
+ new/datum/stack_recipe("brass chair", /obj/structure/chair/brass, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("brass bar stool", /obj/structure/chair/stool/bar/brass, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("brass stool", /obj/structure/chair/stool/brass, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("brass table frame", /obj/structure/table_frame/brass, 1, time = 5, one_per_turf = TRUE, on_floor = TRUE), \
+ null,
+ new/datum/stack_recipe("sender - pressure sensor", /obj/structure/destructible/clockwork/trap/trigger/pressure_sensor, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("sender - mech sensor", /obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("sender - lever", /obj/structure/destructible/clockwork/trap/trigger/lever, 1, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("sender - repeater", /obj/structure/destructible/clockwork/trap/trigger/repeater, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \
+ null,
+ new/datum/stack_recipe("receiver - brass skewer", /obj/structure/destructible/clockwork/trap/brass_skewer, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_ADJACENT), \
+ new/datum/stack_recipe("receiver - steam vent", /obj/structure/destructible/clockwork/trap/steam_vent, 3, time = 30, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_CARDINALS), \
+ new/datum/stack_recipe("receiver - power nullifier", /obj/structure/destructible/clockwork/trap/power_nullifier, 5, time = 20, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_CARDINALS), \
+ null,
+ new/datum/stack_recipe("brass flask", /obj/item/reagent_containers/food/drinks/bottle/holyoil/empty), \
+
+))
+
+/obj/item/stack/tile/brass
+ name = "brass"
+ desc = "Sheets made out of brass."
+ singular_name = "brass sheet"
+ icon_state = "sheet-brass"
+ item_state = "sheet-brass"
+ icon = 'icons/obj/stack_objects.dmi'
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ throwforce = 10
+ max_amount = 50
+ throw_speed = 1
+ throw_range = 3
+ turf_type = /turf/open/floor/clockwork
+ novariants = FALSE
+ grind_results = list("iron" = 5, "teslium" = 15, "holyoil" = 1)
+ merge_type = /obj/item/stack/tile/brass
+
+/obj/item/stack/tile/brass/narsie_act()
+ new /obj/item/stack/sheet/runed_metal(loc, amount)
+ qdel(src)
+
+/obj/item/stack/tile/brass/attack_self(mob/living/user)
+ if(!is_servant_of_ratvar(user))
+ to_chat(user, "[src] seems far too fragile and rigid to build with.") //haha that's because it's actually replicant alloy you DUMMY
+ return
+ ..()
+
+/obj/item/stack/tile/brass/Initialize(mapload, new_amount, merge = TRUE)
+ recipes = GLOB.brass_recipes
+ . = ..()
+ pixel_x = 0
+ pixel_y = 0
+
+/obj/item/stack/tile/brass/fifty
+ amount = 50
+
+/*
+ * Bronze
+ */
+
+GLOBAL_LIST_INIT(bronze_recipes, list ( \
+ new/datum/stack_recipe("wall gear", /obj/structure/girder/bronze, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \
+ null,
+ new/datum/stack_recipe("bronze hat", /obj/item/clothing/head/bronze), \
+ new/datum/stack_recipe("bronze suit", /obj/item/clothing/suit/bronze), \
+ new/datum/stack_recipe("bronze boots", /obj/item/clothing/shoes/bronze), \
+ null,
+ new/datum/stack_recipe("bronze chair", /obj/structure/chair/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("bronze bar stool", /obj/structure/chair/stool/bar/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \
+ new/datum/stack_recipe("bronze stool", /obj/structure/chair/stool/bronze, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \
+))
+
+/obj/item/stack/tile/bronze
+ name = "brass"
+ desc = "On closer inspection, what appears to be wholly-unsuitable-for-building brass is actually more structurally stable bronze."
+ singular_name = "bronze sheet"
+ icon_state = "sheet-brass"
+ item_state = "sheet-brass"
+ icon = 'icons/obj/stack_objects.dmi'
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ throwforce = 10
+ max_amount = 50
+ throw_speed = 1
+ throw_range = 3
+ turf_type = /turf/open/floor/bronze
+ novariants = FALSE
+ grind_results = list("iron" = 5, "copper" = 3) //we have no "tin" reagent so this is the closest thing
+ merge_type = /obj/item/stack/tile/bronze
+
+/obj/item/stack/tile/bronze/attack_self(mob/living/user)
+ if(is_servant_of_ratvar(user)) //still lets them build with it, just gives a message
+ to_chat(user, "Wha... what is this cheap imitation crap? This isn't brass at all!")
+ ..()
+
+/obj/item/stack/tile/bronze/Initialize(mapload, new_amount, merge = TRUE)
+ recipes = GLOB.bronze_recipes
+ . = ..()
+ pixel_x = 0
+ pixel_y = 0
+
+/obj/item/stack/tile/bronze/thirty
+ amount = 30
+
+/*
+ * Lesser and Greater gems - unused
+ */
+/obj/item/stack/sheet/lessergem
+ name = "lesser gems"
+ desc = "Rare kind of gems which are only gained by blood sacrifice to minor deities. They are needed in crafting powerful objects."
+ singular_name = "lesser gem"
+ icon_state = "sheet-lessergem"
+ item_state = "sheet-lessergem"
+ novariants = TRUE
+
+
+/obj/item/stack/sheet/greatergem
+ name = "greater gems"
+ desc = "Rare kind of gems which are only gained by blood sacrifice to minor deities. They are needed in crafting powerful objects."
+ singular_name = "greater gem"
+ icon_state = "sheet-greatergem"
+ item_state = "sheet-greatergem"
+ novariants = TRUE
+
+ /*
+ * Bones
+ */
+/obj/item/stack/sheet/bone
+ name = "bones"
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "bone"
+ item_state = "sheet-bone"
+ singular_name = "bone"
+ desc = "Someone's been drinking their milk."
+ force = 7
+ throwforce = 5
+ max_amount = 12
+ w_class = WEIGHT_CLASS_NORMAL
+ throw_speed = 1
+ throw_range = 3
+ grind_results = list("carbon" = 10)
+ merge_type = /obj/item/stack/sheet/bone
+
+GLOBAL_LIST_INIT(plastic_recipes, list(
+ new /datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 5, one_per_turf = TRUE, on_floor = TRUE, time = 40), \
+ new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/empty), \
+ new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty,3), \
+ new /datum/stack_recipe("wet floor sign", /obj/item/caution, 2)))
+
+/obj/item/stack/sheet/plastic
+ name = "plastic"
+ desc = "Compress dinosaur over millions of years, then refine, split and mold, and voila! You have plastic."
+ singular_name = "plastic sheet"
+ icon_state = "sheet-plastic"
+ item_state = "sheet-plastic"
+ materials = list(MAT_PLASTIC=MINERAL_MATERIAL_AMOUNT)
+ throwforce = 7
+ merge_type = /obj/item/stack/sheet/plastic
+
+/obj/item/stack/sheet/plastic/fifty
+ amount = 50
+
+/obj/item/stack/sheet/plastic/five
+ amount = 5
+
+/obj/item/stack/sheet/plastic/Initialize(mapload, new_amount, merge = TRUE)
+ recipes = GLOB.plastic_recipes
+ . = ..()
+
+GLOBAL_LIST_INIT(paperframe_recipes, list(
+new /datum/stack_recipe("paper frame separator", /obj/structure/window/paperframe, 2, one_per_turf = TRUE, on_floor = TRUE, time = 10), \
+new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperframe, 3, one_per_turf = TRUE, on_floor = TRUE, time = 10 )))
+
+/obj/item/stack/sheet/paperframes
+ name = "paper frames"
+ desc = "A thin wooden frame with paper attached."
+ singular_name = "paper frame"
+ icon_state = "sheet-paper"
+ item_state = "sheet-paper"
+ merge_type = /obj/item/stack/sheet/paperframes
+ resistance_flags = FLAMMABLE
+ merge_type = /obj/item/stack/sheet/paperframes
+
+/obj/item/stack/sheet/paperframes/Initialize()
+ recipes = GLOB.paperframe_recipes
+ . = ..()
+/obj/item/stack/sheet/paperframes/five
+ amount = 5
+/obj/item/stack/sheet/paperframes/twenty
+ amount = 20
+/obj/item/stack/sheet/paperframes/fifty
+ amount = 50
+
+
+//durathread and cotton raw
+/obj/item/stack/sheet/cotton
+ name = "raw cotton bundle"
+ desc = "A bundle of raw cotton ready to be spun on the loom."
+ singular_name = "raw cotton ball"
+ icon_state = "sheet-cotton"
+ is_fabric = TRUE
+ resistance_flags = FLAMMABLE
+ force = 0
+ throwforce = 0
+ merge_type = /obj/item/stack/sheet/cotton
+ pull_effort = 30
+ loom_result = /obj/item/stack/sheet/cloth
+
+/obj/item/stack/sheet/cotton/durathread
+ name = "raw durathread bundle"
+ desc = "A bundle of raw durathread ready to be spun on the loom."
+ singular_name = "raw durathread ball"
+ icon_state = "sheet-durathreadraw"
+ merge_type = /obj/item/stack/sheet/cotton/durathread
+ pull_effort = 70
+ loom_result = /obj/item/stack/sheet/durathread
+
+
diff --git a/code/game/objects/items/stacks/sheets.dm b/code/game/objects/items/stacks/sheets.dm
new file mode 100644
index 0000000000..908fc88383
--- /dev/null
+++ b/code/game/objects/items/stacks/sheets.dm
@@ -0,0 +1,18 @@
+/obj/item/stack/sheet
+ name = "sheet"
+ lefthand_file = 'icons/mob/inhands/misc/sheets_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/sheets_righthand.dmi'
+ full_w_class = WEIGHT_CLASS_NORMAL
+ force = 5
+ throwforce = 5
+ max_amount = 50
+ throw_speed = 1
+ throw_range = 3
+ attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed")
+ novariants = FALSE
+ var/perunit = MINERAL_MATERIAL_AMOUNT
+ var/sheettype = null //this is used for girders in the creation of walls/false walls
+ var/point_value = 0 //turn-in value for the gulag stacker - loosely relative to its rarity
+ var/is_fabric = FALSE //is this a valid material for the loom?
+ var/loom_result //result from pulling on the loom
+ var/pull_effort = 0 //amount of delay when pulling on the loom
\ No newline at end of file