From a860e61356b4efa840c655cd9e9410ad4431eb79 Mon Sep 17 00:00:00 2001
From: Penelope Haze <out.of.p.haze@proton.me>
Date: Thu, 30 Jan 2025 00:43:08 -0500
Subject: [PATCH 01/13] Move scent extension and decls into a module

---
 code/game/objects/effects/decals/Cleanable/humans.dm      | 2 +-
 code/game/objects/effects/decals/cleanable.dm             | 2 +-
 code/modules/materials/_materials.dm                      | 2 +-
 code/modules/reagents/chems/chems_cleaner.dm              | 2 +-
 code/modules/reagents/chems/chems_compounds.dm            | 6 +++---
 code/modules/reagents/chems/chems_fuel.dm                 | 2 +-
 code/{datums/extensions => modules}/scent/_scent.dm       | 8 ++++----
 code/{datums/extensions => modules}/scent/scent_candle.dm | 2 +-
 code/{datums/scents => modules/scent}/scent_decls.dm      | 0
 code/{datums/extensions => modules}/scent/scent_misc.dm   | 2 +-
 nebula.dme                                                | 8 ++++----
 11 files changed, 18 insertions(+), 18 deletions(-)
 rename code/{datums/extensions => modules}/scent/_scent.dm (94%)
 rename code/{datums/extensions => modules}/scent/scent_candle.dm (95%)
 rename code/{datums/scents => modules/scent}/scent_decls.dm (100%)
 rename code/{datums/extensions => modules}/scent/scent_misc.dm (76%)

diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 77bb9276f642..f2198e90718e 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -15,7 +15,7 @@
 	persistent = TRUE
 	appearance_flags = NO_CLIENT_COLOR
 	cleanable_scent = "blood"
-	scent_descriptor = SCENT_DESC_ODOR
+	scent_descriptor = "odour"
 
 	var/base_icon = 'icons/effects/blood.dmi'
 	var/basecolor=COLOR_BLOOD_HUMAN // Color when wet.
diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm
index 66319d3ee89b..d8cd0b321ec1 100644
--- a/code/game/objects/effects/decals/cleanable.dm
+++ b/code/game/objects/effects/decals/cleanable.dm
@@ -14,7 +14,7 @@
 	var/cleanable_scent
 	var/scent_type = /datum/extension/scent/custom
 	var/scent_intensity = /decl/scent_intensity/normal
-	var/scent_descriptor = SCENT_DESC_SMELL
+	var/scent_descriptor = "smell"
 	var/scent_range = 2
 
 /obj/effect/decal/cleanable/Initialize(var/ml, var/_age)
diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm
index 7842520622e1..b93db1019f16 100644
--- a/code/modules/materials/_materials.dm
+++ b/code/modules/materials/_materials.dm
@@ -305,7 +305,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay)
 
 	var/scent //refer to _scent.dm
 	var/scent_intensity = /decl/scent_intensity/normal
-	var/scent_descriptor = SCENT_DESC_SMELL
+	var/scent_descriptor = "smell"
 	var/scent_range = 1
 
 	var/list/neutron_interactions // Associative List of potential neutron interactions for the material to undergo, corresponding to the ideal
diff --git a/code/modules/reagents/chems/chems_cleaner.dm b/code/modules/reagents/chems/chems_cleaner.dm
index 6b9108b98ef4..d14189ec1813 100644
--- a/code/modules/reagents/chems/chems_cleaner.dm
+++ b/code/modules/reagents/chems/chems_cleaner.dm
@@ -19,7 +19,7 @@
 	touch_met = 5
 	toxicity = 5
 	scent = "clean linen"
-	scent_descriptor = SCENT_DESC_FRAGRANCE
+	scent_descriptor = "fragrance"
 	value = 0.25
 	dirtiness = DIRTINESS_DECONTAMINATE
 	decontamination_dose = 5
diff --git a/code/modules/reagents/chems/chems_compounds.dm b/code/modules/reagents/chems/chems_compounds.dm
index a1506fb403d5..45a828e3a60c 100644
--- a/code/modules/reagents/chems/chems_compounds.dm
+++ b/code/modules/reagents/chems/chems_compounds.dm
@@ -323,7 +323,7 @@
 	color = "#684b3c"
 	scannable = 1
 	scent = "cigarette smoke"
-	scent_descriptor = SCENT_DESC_ODOR
+	scent_descriptor = "odour"
 	scent_range = 4
 	hidden_from_codex = TRUE
 	uid = "chem_tobacco"
@@ -339,7 +339,7 @@
 	taste_description = "fine tobacco"
 	value = 1.5
 	scent = "fine tobacco smoke"
-	scent_descriptor = SCENT_DESC_FRAGRANCE
+	scent_descriptor = "fragrance"
 	uid = "chem_tobacco_fine"
 
 /decl/material/solid/tobacco/bad
@@ -348,7 +348,7 @@
 	value = 0.5
 	scent = "acrid tobacco smoke"
 	scent_intensity = /decl/scent_intensity/strong
-	scent_descriptor = SCENT_DESC_ODOR
+	scent_descriptor = "odour"
 	uid = "chem_tobacco_terrible"
 
 /decl/material/solid/tobacco/liquid
diff --git a/code/modules/reagents/chems/chems_fuel.dm b/code/modules/reagents/chems/chems_fuel.dm
index 0c532bd6711e..7853f2f5579a 100644
--- a/code/modules/reagents/chems/chems_fuel.dm
+++ b/code/modules/reagents/chems/chems_fuel.dm
@@ -38,7 +38,7 @@
 
 /decl/material/liquid/fuel/hydrazine
 	name = "hydrazine"
-	lore_text = "A toxic, colorless, flammable liquid with a strong ammonia-like odor, in hydrate form."
+	lore_text = "A toxic, colorless, flammable liquid with a strong ammonia-like odour, in hydrate form."
 	taste_description = "sweet tasting metal"
 	color = "#808080"
 	metabolism = REM * 0.2
diff --git a/code/datums/extensions/scent/_scent.dm b/code/modules/scent/_scent.dm
similarity index 94%
rename from code/datums/extensions/scent/_scent.dm
rename to code/modules/scent/_scent.dm
index cdf60ec83e0f..2298b57494d2 100644
--- a/code/datums/extensions/scent/_scent.dm
+++ b/code/modules/scent/_scent.dm
@@ -1,6 +1,6 @@
-#define SCENT_DESC_ODOR        "odour"
-#define SCENT_DESC_SMELL       "smell"
-#define SCENT_DESC_FRAGRANCE   "fragrance"
+var/global/const/SCENT_DESC_ODOR      = "odour"
+var/global/const/SCENT_DESC_SMELL     = "smell"
+var/global/const/SCENT_DESC_FRAGRANCE = "fragrance"
 
 /*****
 Scent intensity
@@ -43,7 +43,7 @@ Scent intensity
 
 	var/scent = "something"
 	var/decl/scent_intensity/intensity = /decl/scent_intensity
-	var/descriptor = SCENT_DESC_SMELL //unambiguous descriptor of smell; food is generally good, sewage is generally bad. how 'nice' the scent is
+	var/descriptor = "smell" //unambiguous descriptor of smell; food is generally good, sewage is generally bad. how 'nice' the scent is
 	var/range = 1 //range in tiles
 
 /datum/extension/scent/New()
diff --git a/code/datums/extensions/scent/scent_candle.dm b/code/modules/scent/scent_candle.dm
similarity index 95%
rename from code/datums/extensions/scent/scent_candle.dm
rename to code/modules/scent/scent_candle.dm
index b8821fbe4ef8..37830e311c08 100644
--- a/code/datums/extensions/scent/scent_candle.dm
+++ b/code/modules/scent/scent_candle.dm
@@ -1,6 +1,6 @@
 /datum/extension/scent/candle
 	intensity = /decl/scent_intensity/normal
-	descriptor = SCENT_DESC_FRAGRANCE
+	descriptor = "fragrance"
 	range = 4
 
 /datum/extension/scent/candle/rose
diff --git a/code/datums/scents/scent_decls.dm b/code/modules/scent/scent_decls.dm
similarity index 100%
rename from code/datums/scents/scent_decls.dm
rename to code/modules/scent/scent_decls.dm
diff --git a/code/datums/extensions/scent/scent_misc.dm b/code/modules/scent/scent_misc.dm
similarity index 76%
rename from code/datums/extensions/scent/scent_misc.dm
rename to code/modules/scent/scent_misc.dm
index 5e79b5552e89..ecad58d68fc8 100644
--- a/code/datums/extensions/scent/scent_misc.dm
+++ b/code/modules/scent/scent_misc.dm
@@ -1,5 +1,5 @@
 /datum/extension/scent/ashtray
 	scent = "an ashtray"
 	intensity = /decl/scent_intensity
-	descriptor = SCENT_DESC_ODOR
+	descriptor = "odour"
 	range = 2
\ No newline at end of file
diff --git a/nebula.dme b/nebula.dme
index fefac75fff8e..8a3d1fe848e0 100644
--- a/nebula.dme
+++ b/nebula.dme
@@ -1064,9 +1064,6 @@
 #include "code\datums\extensions\multitool\items\stock_parts_radio.dm"
 #include "code\datums\extensions\on_click\turf_hand.dm"
 #include "code\datums\extensions\resistable\resistable.dm"
-#include "code\datums\extensions\scent\_scent.dm"
-#include "code\datums\extensions\scent\scent_candle.dm"
-#include "code\datums\extensions\scent\scent_misc.dm"
 #include "code\datums\extensions\shearable\shearable.dm"
 #include "code\datums\genetics\genetic_conditions.dm"
 #include "code\datums\graph\graph.dm"
@@ -1216,7 +1213,6 @@
 #include "code\datums\repositories\crew\tracking.dm"
 #include "code\datums\repositories\crew\vital.dm"
 #include "code\datums\repositories\crew\~defines.dm"
-#include "code\datums\scents\scent_decls.dm"
 #include "code\datums\state_machine\paper_fortune_fsm.dm"
 #include "code\datums\state_machine\state.dm"
 #include "code\datums\state_machine\transition.dm"
@@ -4342,6 +4338,10 @@
 #include "code\modules\research\design_database.dm"
 #include "code\modules\research\design_database_analyzer.dm"
 #include "code\modules\research\research_fields.dm"
+#include "code\modules\scent\_scent.dm"
+#include "code\modules\scent\scent_candle.dm"
+#include "code\modules\scent\scent_decls.dm"
+#include "code\modules\scent\scent_misc.dm"
 #include "code\modules\sealant_gun\sealant.dm"
 #include "code\modules\sealant_gun\sealant_gun.dm"
 #include "code\modules\sealant_gun\sealant_injector.dm"

From 1e54f1051828de2816283ff3908ec337177a957a Mon Sep 17 00:00:00 2001
From: Penelope Haze <out.of.p.haze@proton.me>
Date: Thu, 30 Jan 2025 00:53:50 -0500
Subject: [PATCH 02/13] Rename whistle.dm to hailer.dm

---
 code/game/objects/items/devices/{whistle.dm => hailer.dm} | 0
 nebula.dme                                                | 2 +-
 2 files changed, 1 insertion(+), 1 deletion(-)
 rename code/game/objects/items/devices/{whistle.dm => hailer.dm} (100%)

diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/hailer.dm
similarity index 100%
rename from code/game/objects/items/devices/whistle.dm
rename to code/game/objects/items/devices/hailer.dm
diff --git a/nebula.dme b/nebula.dme
index 8a3d1fe848e0..beaba85a002a 100644
--- a/nebula.dme
+++ b/nebula.dme
@@ -1740,6 +1740,7 @@
 #include "code\game\objects\items\devices\geiger.dm"
 #include "code\game\objects\items\devices\gps.dm"
 #include "code\game\objects\items\devices\hacktool.dm"
+#include "code\game\objects\items\devices\hailer.dm"
 #include "code\game\objects\items\devices\holowarrant.dm"
 #include "code\game\objects\items\devices\inducer.dm"
 #include "code\game\objects\items\devices\lightreplacer.dm"
@@ -1762,7 +1763,6 @@
 #include "code\game\objects\items\devices\tvcamera.dm"
 #include "code\game\objects\items\devices\uplink.dm"
 #include "code\game\objects\items\devices\uplink_random_lists.dm"
-#include "code\game\objects\items\devices\whistle.dm"
 #include "code\game\objects\items\devices\radio\beacon.dm"
 #include "code\game\objects\items\devices\radio\encryptionkey.dm"
 #include "code\game\objects\items\devices\radio\headset.dm"

From 9fb7f552964fd32fae9213ec83436552a2c7a4d6 Mon Sep 17 00:00:00 2001
From: Penelope Haze <out.of.p.haze@proton.me>
Date: Thu, 30 Jan 2025 00:55:35 -0500
Subject: [PATCH 03/13] Move scanners into modules

---
 .../devices => modules}/scanners/_scanner.dm  |  0
 .../devices => modules}/scanners/breath.dm    |  0
 .../items/devices => modules}/scanners/gas.dm |  0
 .../devices => modules}/scanners/health.dm    |  0
 .../scanners/mass_spectrometer.dm             |  0
 .../devices => modules}/scanners/mining.dm    |  0
 .../devices => modules}/scanners/network.dm   |  0
 .../devices => modules}/scanners/plant.dm     |  0
 .../devices => modules}/scanners/price.dm     |  0
 .../devices => modules}/scanners/reagents.dm  |  0
 .../devices => modules}/scanners/xenobio.dm   |  0
 nebula.dme                                    | 22 +++++++++----------
 12 files changed, 11 insertions(+), 11 deletions(-)
 rename code/{game/objects/items/devices => modules}/scanners/_scanner.dm (100%)
 rename code/{game/objects/items/devices => modules}/scanners/breath.dm (100%)
 rename code/{game/objects/items/devices => modules}/scanners/gas.dm (100%)
 rename code/{game/objects/items/devices => modules}/scanners/health.dm (100%)
 rename code/{game/objects/items/devices => modules}/scanners/mass_spectrometer.dm (100%)
 rename code/{game/objects/items/devices => modules}/scanners/mining.dm (100%)
 rename code/{game/objects/items/devices => modules}/scanners/network.dm (100%)
 rename code/{game/objects/items/devices => modules}/scanners/plant.dm (100%)
 rename code/{game/objects/items/devices => modules}/scanners/price.dm (100%)
 rename code/{game/objects/items/devices => modules}/scanners/reagents.dm (100%)
 rename code/{game/objects/items/devices => modules}/scanners/xenobio.dm (100%)

diff --git a/code/game/objects/items/devices/scanners/_scanner.dm b/code/modules/scanners/_scanner.dm
similarity index 100%
rename from code/game/objects/items/devices/scanners/_scanner.dm
rename to code/modules/scanners/_scanner.dm
diff --git a/code/game/objects/items/devices/scanners/breath.dm b/code/modules/scanners/breath.dm
similarity index 100%
rename from code/game/objects/items/devices/scanners/breath.dm
rename to code/modules/scanners/breath.dm
diff --git a/code/game/objects/items/devices/scanners/gas.dm b/code/modules/scanners/gas.dm
similarity index 100%
rename from code/game/objects/items/devices/scanners/gas.dm
rename to code/modules/scanners/gas.dm
diff --git a/code/game/objects/items/devices/scanners/health.dm b/code/modules/scanners/health.dm
similarity index 100%
rename from code/game/objects/items/devices/scanners/health.dm
rename to code/modules/scanners/health.dm
diff --git a/code/game/objects/items/devices/scanners/mass_spectrometer.dm b/code/modules/scanners/mass_spectrometer.dm
similarity index 100%
rename from code/game/objects/items/devices/scanners/mass_spectrometer.dm
rename to code/modules/scanners/mass_spectrometer.dm
diff --git a/code/game/objects/items/devices/scanners/mining.dm b/code/modules/scanners/mining.dm
similarity index 100%
rename from code/game/objects/items/devices/scanners/mining.dm
rename to code/modules/scanners/mining.dm
diff --git a/code/game/objects/items/devices/scanners/network.dm b/code/modules/scanners/network.dm
similarity index 100%
rename from code/game/objects/items/devices/scanners/network.dm
rename to code/modules/scanners/network.dm
diff --git a/code/game/objects/items/devices/scanners/plant.dm b/code/modules/scanners/plant.dm
similarity index 100%
rename from code/game/objects/items/devices/scanners/plant.dm
rename to code/modules/scanners/plant.dm
diff --git a/code/game/objects/items/devices/scanners/price.dm b/code/modules/scanners/price.dm
similarity index 100%
rename from code/game/objects/items/devices/scanners/price.dm
rename to code/modules/scanners/price.dm
diff --git a/code/game/objects/items/devices/scanners/reagents.dm b/code/modules/scanners/reagents.dm
similarity index 100%
rename from code/game/objects/items/devices/scanners/reagents.dm
rename to code/modules/scanners/reagents.dm
diff --git a/code/game/objects/items/devices/scanners/xenobio.dm b/code/modules/scanners/xenobio.dm
similarity index 100%
rename from code/game/objects/items/devices/scanners/xenobio.dm
rename to code/modules/scanners/xenobio.dm
diff --git a/nebula.dme b/nebula.dme
index beaba85a002a..9afd8dd99821 100644
--- a/nebula.dme
+++ b/nebula.dme
@@ -1774,17 +1774,6 @@
 #include "code\game\objects\items\devices\radio\radio_borg.dm"
 #include "code\game\objects\items\devices\radio\radio_exosuit.dm"
 #include "code\game\objects\items\devices\radio\radio_misc.dm"
-#include "code\game\objects\items\devices\scanners\_scanner.dm"
-#include "code\game\objects\items\devices\scanners\breath.dm"
-#include "code\game\objects\items\devices\scanners\gas.dm"
-#include "code\game\objects\items\devices\scanners\health.dm"
-#include "code\game\objects\items\devices\scanners\mass_spectrometer.dm"
-#include "code\game\objects\items\devices\scanners\mining.dm"
-#include "code\game\objects\items\devices\scanners\network.dm"
-#include "code\game\objects\items\devices\scanners\plant.dm"
-#include "code\game\objects\items\devices\scanners\price.dm"
-#include "code\game\objects\items\devices\scanners\reagents.dm"
-#include "code\game\objects\items\devices\scanners\xenobio.dm"
 #include "code\game\objects\items\flame\_flame.dm"
 #include "code\game\objects\items\flame\flame_candle.dm"
 #include "code\game\objects\items\flame\flame_fuelled.dm"
@@ -4338,6 +4327,17 @@
 #include "code\modules\research\design_database.dm"
 #include "code\modules\research\design_database_analyzer.dm"
 #include "code\modules\research\research_fields.dm"
+#include "code\modules\scanners\_scanner.dm"
+#include "code\modules\scanners\breath.dm"
+#include "code\modules\scanners\gas.dm"
+#include "code\modules\scanners\health.dm"
+#include "code\modules\scanners\mass_spectrometer.dm"
+#include "code\modules\scanners\mining.dm"
+#include "code\modules\scanners\network.dm"
+#include "code\modules\scanners\plant.dm"
+#include "code\modules\scanners\price.dm"
+#include "code\modules\scanners\reagents.dm"
+#include "code\modules\scanners\xenobio.dm"
 #include "code\modules\scent\_scent.dm"
 #include "code\modules\scent\scent_candle.dm"
 #include "code\modules\scent\scent_decls.dm"

From 64edbb5d66dff92d91dcafb2de1bc7cf416d8473 Mon Sep 17 00:00:00 2001
From: Penelope Haze <out.of.p.haze@proton.me>
Date: Thu, 30 Jan 2025 00:58:51 -0500
Subject: [PATCH 04/13] Move implants into modules folder

---
 .../weapons => modules}/implants/implant.dm   |  0
 .../implants/implant_types}/adrenaline.dm     |  0
 .../implants/implant_types}/chem.dm           |  0
 .../implants/implant_types}/compressed.dm     |  0
 .../implants/implant_types}/death_alarm.dm    |  0
 .../implants/implant_types}/explosive.dm      |  0
 .../implants/implant_types}/freedom.dm        |  0
 .../implants/implant_types}/imprinting.dm     |  0
 .../implants/implant_types}/loyalty.dm        |  0
 .../implants/implant_types}/tracking.dm       |  0
 .../implants/implant_types}/translator.dm     |  0
 .../implants/implant_types}/uplink.dm         |  0
 .../implants/implantcase.dm                   |  0
 .../implants/implantchair.dm                  |  0
 .../weapons => modules}/implants/implanter.dm |  0
 .../implants/implantpad.dm                    |  0
 nebula.dme                                    | 32 +++++++++----------
 17 files changed, 16 insertions(+), 16 deletions(-)
 rename code/{game/objects/items/weapons => modules}/implants/implant.dm (100%)
 rename code/{game/objects/items/weapons/implants/implants => modules/implants/implant_types}/adrenaline.dm (100%)
 rename code/{game/objects/items/weapons/implants/implants => modules/implants/implant_types}/chem.dm (100%)
 rename code/{game/objects/items/weapons/implants/implants => modules/implants/implant_types}/compressed.dm (100%)
 rename code/{game/objects/items/weapons/implants/implants => modules/implants/implant_types}/death_alarm.dm (100%)
 rename code/{game/objects/items/weapons/implants/implants => modules/implants/implant_types}/explosive.dm (100%)
 rename code/{game/objects/items/weapons/implants/implants => modules/implants/implant_types}/freedom.dm (100%)
 rename code/{game/objects/items/weapons/implants/implants => modules/implants/implant_types}/imprinting.dm (100%)
 rename code/{game/objects/items/weapons/implants/implants => modules/implants/implant_types}/loyalty.dm (100%)
 rename code/{game/objects/items/weapons/implants/implants => modules/implants/implant_types}/tracking.dm (100%)
 rename code/{game/objects/items/weapons/implants/implants => modules/implants/implant_types}/translator.dm (100%)
 rename code/{game/objects/items/weapons/implants/implants => modules/implants/implant_types}/uplink.dm (100%)
 rename code/{game/objects/items/weapons => modules}/implants/implantcase.dm (100%)
 rename code/{game/objects/items/weapons => modules}/implants/implantchair.dm (100%)
 rename code/{game/objects/items/weapons => modules}/implants/implanter.dm (100%)
 rename code/{game/objects/items/weapons => modules}/implants/implantpad.dm (100%)

diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/modules/implants/implant.dm
similarity index 100%
rename from code/game/objects/items/weapons/implants/implant.dm
rename to code/modules/implants/implant.dm
diff --git a/code/game/objects/items/weapons/implants/implants/adrenaline.dm b/code/modules/implants/implant_types/adrenaline.dm
similarity index 100%
rename from code/game/objects/items/weapons/implants/implants/adrenaline.dm
rename to code/modules/implants/implant_types/adrenaline.dm
diff --git a/code/game/objects/items/weapons/implants/implants/chem.dm b/code/modules/implants/implant_types/chem.dm
similarity index 100%
rename from code/game/objects/items/weapons/implants/implants/chem.dm
rename to code/modules/implants/implant_types/chem.dm
diff --git a/code/game/objects/items/weapons/implants/implants/compressed.dm b/code/modules/implants/implant_types/compressed.dm
similarity index 100%
rename from code/game/objects/items/weapons/implants/implants/compressed.dm
rename to code/modules/implants/implant_types/compressed.dm
diff --git a/code/game/objects/items/weapons/implants/implants/death_alarm.dm b/code/modules/implants/implant_types/death_alarm.dm
similarity index 100%
rename from code/game/objects/items/weapons/implants/implants/death_alarm.dm
rename to code/modules/implants/implant_types/death_alarm.dm
diff --git a/code/game/objects/items/weapons/implants/implants/explosive.dm b/code/modules/implants/implant_types/explosive.dm
similarity index 100%
rename from code/game/objects/items/weapons/implants/implants/explosive.dm
rename to code/modules/implants/implant_types/explosive.dm
diff --git a/code/game/objects/items/weapons/implants/implants/freedom.dm b/code/modules/implants/implant_types/freedom.dm
similarity index 100%
rename from code/game/objects/items/weapons/implants/implants/freedom.dm
rename to code/modules/implants/implant_types/freedom.dm
diff --git a/code/game/objects/items/weapons/implants/implants/imprinting.dm b/code/modules/implants/implant_types/imprinting.dm
similarity index 100%
rename from code/game/objects/items/weapons/implants/implants/imprinting.dm
rename to code/modules/implants/implant_types/imprinting.dm
diff --git a/code/game/objects/items/weapons/implants/implants/loyalty.dm b/code/modules/implants/implant_types/loyalty.dm
similarity index 100%
rename from code/game/objects/items/weapons/implants/implants/loyalty.dm
rename to code/modules/implants/implant_types/loyalty.dm
diff --git a/code/game/objects/items/weapons/implants/implants/tracking.dm b/code/modules/implants/implant_types/tracking.dm
similarity index 100%
rename from code/game/objects/items/weapons/implants/implants/tracking.dm
rename to code/modules/implants/implant_types/tracking.dm
diff --git a/code/game/objects/items/weapons/implants/implants/translator.dm b/code/modules/implants/implant_types/translator.dm
similarity index 100%
rename from code/game/objects/items/weapons/implants/implants/translator.dm
rename to code/modules/implants/implant_types/translator.dm
diff --git a/code/game/objects/items/weapons/implants/implants/uplink.dm b/code/modules/implants/implant_types/uplink.dm
similarity index 100%
rename from code/game/objects/items/weapons/implants/implants/uplink.dm
rename to code/modules/implants/implant_types/uplink.dm
diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/modules/implants/implantcase.dm
similarity index 100%
rename from code/game/objects/items/weapons/implants/implantcase.dm
rename to code/modules/implants/implantcase.dm
diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/modules/implants/implantchair.dm
similarity index 100%
rename from code/game/objects/items/weapons/implants/implantchair.dm
rename to code/modules/implants/implantchair.dm
diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/modules/implants/implanter.dm
similarity index 100%
rename from code/game/objects/items/weapons/implants/implanter.dm
rename to code/modules/implants/implanter.dm
diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/modules/implants/implantpad.dm
similarity index 100%
rename from code/game/objects/items/weapons/implants/implantpad.dm
rename to code/modules/implants/implantpad.dm
diff --git a/nebula.dme b/nebula.dme
index 9afd8dd99821..d5ca27dab68a 100644
--- a/nebula.dme
+++ b/nebula.dme
@@ -1896,22 +1896,6 @@
 #include "code\game\objects\items\weapons\grenades\prank_grenades.dm"
 #include "code\game\objects\items\weapons\grenades\smokebomb.dm"
 #include "code\game\objects\items\weapons\grenades\spawnergrenade.dm"
-#include "code\game\objects\items\weapons\implants\implant.dm"
-#include "code\game\objects\items\weapons\implants\implantcase.dm"
-#include "code\game\objects\items\weapons\implants\implantchair.dm"
-#include "code\game\objects\items\weapons\implants\implanter.dm"
-#include "code\game\objects\items\weapons\implants\implantpad.dm"
-#include "code\game\objects\items\weapons\implants\implants\adrenaline.dm"
-#include "code\game\objects\items\weapons\implants\implants\chem.dm"
-#include "code\game\objects\items\weapons\implants\implants\compressed.dm"
-#include "code\game\objects\items\weapons\implants\implants\death_alarm.dm"
-#include "code\game\objects\items\weapons\implants\implants\explosive.dm"
-#include "code\game\objects\items\weapons\implants\implants\freedom.dm"
-#include "code\game\objects\items\weapons\implants\implants\imprinting.dm"
-#include "code\game\objects\items\weapons\implants\implants\loyalty.dm"
-#include "code\game\objects\items\weapons\implants\implants\tracking.dm"
-#include "code\game\objects\items\weapons\implants\implants\translator.dm"
-#include "code\game\objects\items\weapons\implants\implants\uplink.dm"
 #include "code\game\objects\items\weapons\material\ashtray.dm"
 #include "code\game\objects\items\weapons\material\bell.dm"
 #include "code\game\objects\items\weapons\material\coins.dm"
@@ -3191,6 +3175,22 @@
 #include "code\modules\hydroponics\trays\tray_soil.dm"
 #include "code\modules\hydroponics\trays\tray_tools.dm"
 #include "code\modules\hydroponics\trays\tray_update_icons.dm"
+#include "code\modules\implants\implant.dm"
+#include "code\modules\implants\implantcase.dm"
+#include "code\modules\implants\implantchair.dm"
+#include "code\modules\implants\implanter.dm"
+#include "code\modules\implants\implantpad.dm"
+#include "code\modules\implants\implant_types\adrenaline.dm"
+#include "code\modules\implants\implant_types\chem.dm"
+#include "code\modules\implants\implant_types\compressed.dm"
+#include "code\modules\implants\implant_types\death_alarm.dm"
+#include "code\modules\implants\implant_types\explosive.dm"
+#include "code\modules\implants\implant_types\freedom.dm"
+#include "code\modules\implants\implant_types\imprinting.dm"
+#include "code\modules\implants\implant_types\loyalty.dm"
+#include "code\modules\implants\implant_types\tracking.dm"
+#include "code\modules\implants\implant_types\translator.dm"
+#include "code\modules\implants\implant_types\uplink.dm"
 #include "code\modules\integrated_electronics\_defines.dm"
 #include "code\modules\integrated_electronics\core\_electronics.dm"
 #include "code\modules\integrated_electronics\core\analyzer.dm"

From ad76a83f5b486a62ea17c241c4213ca84af19b4a Mon Sep 17 00:00:00 2001
From: Penelope Haze <out.of.p.haze@proton.me>
Date: Thu, 30 Jan 2025 01:07:08 -0500
Subject: [PATCH 05/13] Move projectile effects into projectiles module

---
 .../projectiles/projectile/effects}/projectile_effects.dm | 0
 .../projectiles/projectile/effects}/projectile_impact.dm  | 0
 .../projectiles/projectile/effects}/projectile_muzzle.dm  | 0
 .../projectiles/projectile/effects}/projectile_tracer.dm  | 0
 nebula.dme                                                | 8 ++++----
 5 files changed, 4 insertions(+), 4 deletions(-)
 rename code/{game/objects/effects/projectile => modules/projectiles/projectile/effects}/projectile_effects.dm (100%)
 rename code/{game/objects/effects/projectile => modules/projectiles/projectile/effects}/projectile_impact.dm (100%)
 rename code/{game/objects/effects/projectile => modules/projectiles/projectile/effects}/projectile_muzzle.dm (100%)
 rename code/{game/objects/effects/projectile => modules/projectiles/projectile/effects}/projectile_tracer.dm (100%)

diff --git a/code/game/objects/effects/projectile/projectile_effects.dm b/code/modules/projectiles/projectile/effects/projectile_effects.dm
similarity index 100%
rename from code/game/objects/effects/projectile/projectile_effects.dm
rename to code/modules/projectiles/projectile/effects/projectile_effects.dm
diff --git a/code/game/objects/effects/projectile/projectile_impact.dm b/code/modules/projectiles/projectile/effects/projectile_impact.dm
similarity index 100%
rename from code/game/objects/effects/projectile/projectile_impact.dm
rename to code/modules/projectiles/projectile/effects/projectile_impact.dm
diff --git a/code/game/objects/effects/projectile/projectile_muzzle.dm b/code/modules/projectiles/projectile/effects/projectile_muzzle.dm
similarity index 100%
rename from code/game/objects/effects/projectile/projectile_muzzle.dm
rename to code/modules/projectiles/projectile/effects/projectile_muzzle.dm
diff --git a/code/game/objects/effects/projectile/projectile_tracer.dm b/code/modules/projectiles/projectile/effects/projectile_tracer.dm
similarity index 100%
rename from code/game/objects/effects/projectile/projectile_tracer.dm
rename to code/modules/projectiles/projectile/effects/projectile_tracer.dm
diff --git a/nebula.dme b/nebula.dme
index d5ca27dab68a..38ef170acdf1 100644
--- a/nebula.dme
+++ b/nebula.dme
@@ -1647,10 +1647,6 @@
 #include "code\game\objects\effects\decals\posters\_poster.dm"
 #include "code\game\objects\effects\decals\posters\_poster_design.dm"
 #include "code\game\objects\effects\decals\posters\bs12.dm"
-#include "code\game\objects\effects\projectile\projectile_effects.dm"
-#include "code\game\objects\effects\projectile\projectile_impact.dm"
-#include "code\game\objects\effects\projectile\projectile_muzzle.dm"
-#include "code\game\objects\effects\projectile\projectile_tracer.dm"
 #include "code\game\objects\effects\spawners\bombspawner.dm"
 #include "code\game\objects\effects\spawners\gibspawner.dm"
 #include "code\game\objects\items\__item.dm"
@@ -4135,6 +4131,10 @@
 #include "code\modules\projectiles\projectile\pellets.dm"
 #include "code\modules\projectiles\projectile\special.dm"
 #include "code\modules\projectiles\projectile\trace.dm"
+#include "code\modules\projectiles\projectile\effects\projectile_effects.dm"
+#include "code\modules\projectiles\projectile\effects\projectile_impact.dm"
+#include "code\modules\projectiles\projectile\effects\projectile_muzzle.dm"
+#include "code\modules\projectiles\projectile\effects\projectile_tracer.dm"
 #include "code\modules\projectiles\targeting\targeting_gun.dm"
 #include "code\modules\projectiles\targeting\targeting_mob.dm"
 #include "code\modules\projectiles\targeting\targeting_overlay.dm"

From 778ceda5248aa31214b8903eae72ad895d586761 Mon Sep 17 00:00:00 2001
From: Penelope Haze <out.of.p.haze@proton.me>
Date: Thu, 30 Jan 2025 01:07:18 -0500
Subject: [PATCH 06/13] Move posters into modules folder

---
 .../objects/effects/decals => modules}/posters/_poster.dm   | 0
 .../effects/decals => modules}/posters/_poster_design.dm    | 0
 .../objects/effects/decals => modules}/posters/bs12.dm      | 0
 nebula.dme                                                  | 6 +++---
 4 files changed, 3 insertions(+), 3 deletions(-)
 rename code/{game/objects/effects/decals => modules}/posters/_poster.dm (100%)
 rename code/{game/objects/effects/decals => modules}/posters/_poster_design.dm (100%)
 rename code/{game/objects/effects/decals => modules}/posters/bs12.dm (100%)

diff --git a/code/game/objects/effects/decals/posters/_poster.dm b/code/modules/posters/_poster.dm
similarity index 100%
rename from code/game/objects/effects/decals/posters/_poster.dm
rename to code/modules/posters/_poster.dm
diff --git a/code/game/objects/effects/decals/posters/_poster_design.dm b/code/modules/posters/_poster_design.dm
similarity index 100%
rename from code/game/objects/effects/decals/posters/_poster_design.dm
rename to code/modules/posters/_poster_design.dm
diff --git a/code/game/objects/effects/decals/posters/bs12.dm b/code/modules/posters/bs12.dm
similarity index 100%
rename from code/game/objects/effects/decals/posters/bs12.dm
rename to code/modules/posters/bs12.dm
diff --git a/nebula.dme b/nebula.dme
index 38ef170acdf1..d532825e8cac 100644
--- a/nebula.dme
+++ b/nebula.dme
@@ -1644,9 +1644,6 @@
 #include "code\game\objects\effects\decals\Cleanable\misc.dm"
 #include "code\game\objects\effects\decals\Cleanable\robots.dm"
 #include "code\game\objects\effects\decals\Cleanable\tracks.dm"
-#include "code\game\objects\effects\decals\posters\_poster.dm"
-#include "code\game\objects\effects\decals\posters\_poster_design.dm"
-#include "code\game\objects\effects\decals\posters\bs12.dm"
 #include "code\game\objects\effects\spawners\bombspawner.dm"
 #include "code\game\objects\effects\spawners\gibspawner.dm"
 #include "code\game\objects\items\__item.dm"
@@ -4005,6 +4002,9 @@
 #include "code\modules\persistence\persistence_datum_paper.dm"
 #include "code\modules\persistence\persistence_datum_paper_sticky.dm"
 #include "code\modules\pointdefense\pointdefense.dm"
+#include "code\modules\posters\_poster.dm"
+#include "code\modules\posters\_poster_design.dm"
+#include "code\modules\posters\bs12.dm"
 #include "code\modules\posture\_posture.dm"
 #include "code\modules\posture\posture_bodytype.dm"
 #include "code\modules\posture\posture_mob.dm"

From 0f76106606509bf217ae7a56092e9ab33f750ed3 Mon Sep 17 00:00:00 2001
From: Penelope Haze <out.of.p.haze@proton.me>
Date: Thu, 30 Jan 2025 01:27:13 -0500
Subject: [PATCH 07/13] Move filter stand into chemistry structure folder

---
 code/game/objects/structures/{ => chemistry}/filter_stand.dm  | 0
 .../objects/structures/chemistry/{_chemistry.dm => heater.dm} | 0
 nebula.dme                                                    | 4 ++--
 3 files changed, 2 insertions(+), 2 deletions(-)
 rename code/game/objects/structures/{ => chemistry}/filter_stand.dm (100%)
 rename code/game/objects/structures/chemistry/{_chemistry.dm => heater.dm} (100%)

diff --git a/code/game/objects/structures/filter_stand.dm b/code/game/objects/structures/chemistry/filter_stand.dm
similarity index 100%
rename from code/game/objects/structures/filter_stand.dm
rename to code/game/objects/structures/chemistry/filter_stand.dm
diff --git a/code/game/objects/structures/chemistry/_chemistry.dm b/code/game/objects/structures/chemistry/heater.dm
similarity index 100%
rename from code/game/objects/structures/chemistry/_chemistry.dm
rename to code/game/objects/structures/chemistry/heater.dm
diff --git a/nebula.dme b/nebula.dme
index d532825e8cac..2ecf656f1ff1 100644
--- a/nebula.dme
+++ b/nebula.dme
@@ -2008,7 +2008,6 @@
 #include "code\game\objects\structures\emergency_dispenser.dm"
 #include "code\game\objects\structures\extinguisher.dm"
 #include "code\game\objects\structures\fences.dm"
-#include "code\game\objects\structures\filter_stand.dm"
 #include "code\game\objects\structures\fireaxe_cabinet.dm"
 #include "code\game\objects\structures\fires.dm"
 #include "code\game\objects\structures\fishtanks.dm"
@@ -2065,7 +2064,8 @@
 #include "code\game\objects\structures\barrels\barrel.dm"
 #include "code\game\objects\structures\barrels\cask.dm"
 #include "code\game\objects\structures\barrels\cask_rack.dm"
-#include "code\game\objects\structures\chemistry\_chemistry.dm"
+#include "code\game\objects\structures\chemistry\filter_stand.dm"
+#include "code\game\objects\structures\chemistry\heater.dm"
 #include "code\game\objects\structures\crates_lockers\crates.dm"
 #include "code\game\objects\structures\crates_lockers\largecrate.dm"
 #include "code\game\objects\structures\crates_lockers\med_crate.dm"

From 70bf242a6be1b8688faa4228d0baf7b0061453f2 Mon Sep 17 00:00:00 2001
From: Penelope Haze <out.of.p.haze@proton.me>
Date: Thu, 30 Jan 2025 01:31:24 -0500
Subject: [PATCH 08/13] Break up the stool_bed_chair_nest_sofa folder

---
 .../stools.dm                                 |   0
 code/game/objects/structures/beds/bed.dm      | 160 ++++++++
 .../bedroll.dm                                |   0
 code/game/objects/structures/beds/mattress.dm |  15 +
 .../game/objects/structures/beds/rollerbed.dm | 153 ++++++++
 .../simple_bed.dm                             |   0
 code/game/objects/structures/beds/travois.dm  |  18 +
 .../pew.dm => benches/bench.dm}               |  41 +-
 .../game/objects/structures/benches/lounge.dm |  15 +
 code/game/objects/structures/benches/pew.dm   |  23 ++
 .../chairs.dm                                 |   0
 .../rustic_chairs.dm                          |   0
 .../wheelchair.dm                             |   0
 .../{stool_bed_chair_nest_sofa => }/sofa.dm   |   0
 .../stool_bed_chair_nest_sofa/bed.dm          | 350 ------------------
 nebula.dme                                    |  23 +-
 16 files changed, 399 insertions(+), 399 deletions(-)
 rename code/game/objects/{structures/stool_bed_chair_nest_sofa => items}/stools.dm (100%)
 create mode 100644 code/game/objects/structures/beds/bed.dm
 rename code/game/objects/structures/{stool_bed_chair_nest_sofa => beds}/bedroll.dm (100%)
 create mode 100644 code/game/objects/structures/beds/mattress.dm
 create mode 100644 code/game/objects/structures/beds/rollerbed.dm
 rename code/game/objects/structures/{stool_bed_chair_nest_sofa => beds}/simple_bed.dm (100%)
 create mode 100644 code/game/objects/structures/beds/travois.dm
 rename code/game/objects/structures/{stool_bed_chair_nest_sofa/pew.dm => benches/bench.dm} (68%)
 create mode 100644 code/game/objects/structures/benches/lounge.dm
 create mode 100644 code/game/objects/structures/benches/pew.dm
 rename code/game/objects/structures/{stool_bed_chair_nest_sofa => chairs}/chairs.dm (100%)
 rename code/game/objects/structures/{stool_bed_chair_nest_sofa => chairs}/rustic_chairs.dm (100%)
 rename code/game/objects/structures/{stool_bed_chair_nest_sofa => chairs}/wheelchair.dm (100%)
 rename code/game/objects/structures/{stool_bed_chair_nest_sofa => }/sofa.dm (100%)
 delete mode 100644 code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm

diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/stools.dm b/code/game/objects/items/stools.dm
similarity index 100%
rename from code/game/objects/structures/stool_bed_chair_nest_sofa/stools.dm
rename to code/game/objects/items/stools.dm
diff --git a/code/game/objects/structures/beds/bed.dm b/code/game/objects/structures/beds/bed.dm
new file mode 100644
index 000000000000..fdcdff9a143e
--- /dev/null
+++ b/code/game/objects/structures/beds/bed.dm
@@ -0,0 +1,160 @@
+// Beds... get your mind out of the gutter, they're for sleeping!
+// TODO by end of Q2 2025: Repath /obj/structure/bed/chair to just /obj/structure/chair.
+// Remaining steps:
+// - Move padding interactions and padding_color var onto an extension
+// - Allow /obj/structure/grab_attack to handle buckling
+/obj/structure/bed
+	name = "bed"
+	desc = "A raised, padded platform for sleeping on. This one has straps for ensuring restful snoozing in microgravity."
+	icon = 'icons/obj/furniture.dmi'
+	icon_state = "bed"
+	anchored = TRUE
+	can_buckle = TRUE
+	buckle_dir = SOUTH
+	buckle_lying = TRUE
+	buckle_sound = 'sound/effects/buckle.ogg'
+	material = DEFAULT_FURNITURE_MATERIAL
+	material_alteration = MAT_FLAG_ALTERATION_ALL
+	tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT
+	parts_amount = 2
+	parts_type = /obj/item/stack/material/rods
+	user_comfort = 1
+	obj_flags = OBJ_FLAG_SUPPORT_MOB
+	var/base_icon = "bed"
+	var/padding_color
+
+/obj/structure/bed/user_can_mousedrop_onto(mob/user, atom/being_dropped, incapacitation_flags, params)
+	if(user == being_dropped)
+		return user.Adjacent(src) && !user.incapacitated(INCAPACITATION_STUNNED|INCAPACITATION_KNOCKOUT)
+	return ..()
+
+/obj/structure/bed/get_base_value()
+	. = round(..() * 2.5) // Utility structures should be worth more than their matter (wheelchairs, rollers, etc).
+
+/obj/structure/bed/get_surgery_surface_quality(mob/living/victim, mob/living/user)
+	return OPERATE_PASSABLE
+
+/obj/structure/bed/get_surgery_success_modifier(delicate)
+	return delicate ? -5 : 0
+
+/obj/structure/bed/update_material_name()
+	if(reinf_material)
+		SetName("[reinf_material.adjective_name] [initial(name)]")
+	else if(material)
+		SetName("[material.adjective_name] [initial(name)]")
+	else
+		SetName(initial(name))
+
+/obj/structure/bed/update_material_desc()
+	if(reinf_material)
+		desc = "[initial(desc)] It's made of [material.use_name] and covered with [reinf_material.use_name]."
+	else
+		desc = "[initial(desc)] It's made of [material.use_name]."
+
+// Reuse the cache/code from stools, todo maybe unify.
+/obj/structure/bed/on_update_icon()
+	..()
+	icon_state = base_icon
+	if(istype(reinf_material))
+		if(material_alteration & MAT_FLAG_ALTERATION_COLOR)
+			add_overlay(overlay_image(icon, "[icon_state]_padding", padding_color || reinf_material.color, RESET_COLOR))
+		else
+			add_overlay(overlay_image(icon, "[icon_state]_padding"))
+
+/obj/structure/bed/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+	if(istype(mover) && mover.checkpass(PASS_FLAG_TABLE))
+		return 1
+	return ..()
+
+/obj/structure/bed/explosion_act(severity)
+	. = ..()
+	if(. && !QDELETED(src) && (severity == 1 || (severity == 2 && prob(50)) || (severity == 3 && prob(5))))
+		physically_destroyed()
+
+/obj/structure/bed/proc/can_apply_padding()
+	return TRUE
+
+/obj/structure/bed/attackby(obj/item/used_item, mob/user)
+
+	if((. = ..()))
+		return
+
+	if(istype(used_item, /obj/item/stack) && can_apply_padding())
+
+		if(reinf_material)
+			to_chat(user, SPAN_WARNING("\The [src] is already padded."))
+			return TRUE
+
+		var/obj/item/stack/cloth = used_item
+		if(cloth.get_amount() < 1)
+			to_chat(user, SPAN_WARNING("You need at least one unit of material to pad \the [src]."))
+			return TRUE
+
+		var/padding_type
+		var/new_padding_color
+		if(istype(used_item, /obj/item/stack/tile) || istype(used_item, /obj/item/stack/material/bolt))
+			padding_type = used_item.material?.type
+			new_padding_color = used_item.paint_color
+
+		if(padding_type)
+			var/decl/material/padding_mat = GET_DECL(padding_type)
+			if(!istype(padding_mat) || !(padding_mat.flags & MAT_FLAG_PADDING))
+				padding_type = null
+
+		if(!padding_type)
+			to_chat(user, SPAN_WARNING("You cannot pad \the [src] with that."))
+			return TRUE
+
+		cloth.use(1)
+		if(!isturf(src.loc))
+			src.forceMove(get_turf(src))
+		playsound(src.loc, 'sound/effects/rustle5.ogg', 50, 1)
+		to_chat(user, SPAN_NOTICE("You add padding to \the [src]."))
+		add_padding(padding_type, new_padding_color)
+		return TRUE
+
+	if(IS_WIRECUTTER(used_item))
+		if(!reinf_material)
+			to_chat(user, SPAN_WARNING("\The [src] has no padding to remove."))
+		else
+			to_chat(user, SPAN_NOTICE("You remove the padding from \the [src]."))
+			playsound(src, 'sound/items/Wirecutter.ogg', 100, 1)
+			remove_padding()
+		return TRUE
+
+/obj/structure/bed/grab_attack(obj/item/grab/grab, mob/user)
+	var/mob/living/victim = grab.get_affecting_mob()
+	if(istype(victim) && istype(user))
+		user.visible_message(SPAN_NOTICE("\The [user] attempts to put \the [victim] onto \the [src]!"))
+		if(do_after(user, 2 SECONDS, src) && !QDELETED(victim) && !QDELETED(user) && !QDELETED(grab) && user_buckle_mob(victim, user))
+			qdel(grab)
+		return TRUE
+	return ..()
+
+/obj/structure/bed/proc/add_padding(var/padding_type, var/new_padding_color)
+	reinf_material = GET_DECL(padding_type)
+	padding_color = new_padding_color
+	update_icon()
+
+/obj/structure/bed/proc/remove_padding()
+	if(reinf_material)
+		var/list/res = reinf_material.create_object(get_turf(src))
+		if(padding_color)
+			for(var/obj/item/thing in res)
+				thing.set_color(padding_color)
+	reinf_material = null
+	padding_color = null
+	update_icon()
+
+/obj/structure/bed/psych
+	name = "psychiatrist's couch"
+	desc = "For prime comfort during psychiatric evaluations."
+	icon_state = "psychbed"
+	material = /decl/material/solid/organic/wood/walnut
+
+/obj/structure/bed/psych/leather
+	reinf_material = /decl/material/solid/organic/leather
+
+/obj/structure/bed/padded
+	material = /decl/material/solid/metal/aluminium
+	reinf_material = /decl/material/solid/organic/cloth
diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/bedroll.dm b/code/game/objects/structures/beds/bedroll.dm
similarity index 100%
rename from code/game/objects/structures/stool_bed_chair_nest_sofa/bedroll.dm
rename to code/game/objects/structures/beds/bedroll.dm
diff --git a/code/game/objects/structures/beds/mattress.dm b/code/game/objects/structures/beds/mattress.dm
new file mode 100644
index 000000000000..8532a77a9e1a
--- /dev/null
+++ b/code/game/objects/structures/beds/mattress.dm
@@ -0,0 +1,15 @@
+/*
+ * Mattresses
+ */
+// TODO: These sprites are terrible. Replace?
+/obj/structure/mattress
+	name = "mattress"
+	icon = 'icons/obj/furniture.dmi'
+	icon_state = "mattress"
+	desc = "A bare mattress. It doesn't look very comfortable."
+	anchored = FALSE
+
+/obj/structure/mattress/dirty
+	name = "dirty mattress"
+	icon_state = "dirty_mattress"
+	desc = "A dirty, smelly mattress covered in body fluids. You wouldn't want to touch this."
diff --git a/code/game/objects/structures/beds/rollerbed.dm b/code/game/objects/structures/beds/rollerbed.dm
new file mode 100644
index 000000000000..4c0285d3b788
--- /dev/null
+++ b/code/game/objects/structures/beds/rollerbed.dm
@@ -0,0 +1,153 @@
+/*
+ * Roller beds
+ */
+/obj/structure/bed/roller
+	name = "roller bed"
+	icon = 'icons/obj/structures/rollerbed.dmi'
+	icon_state = "down"
+	anchored = FALSE
+	buckle_pixel_shift = list("x" = 0, "y" = 0, "z" = 6)
+	movable_flags = MOVABLE_FLAG_WHEELED
+	tool_interaction_flags = 0
+	var/item_form_type = /obj/item/roller	//The folded-up object path.
+	var/obj/item/chems/beaker
+	var/iv_attached = 0
+	var/iv_stand = TRUE
+
+/obj/structure/bed/roller/on_update_icon()
+	cut_overlays()
+	if(density)
+		icon_state = "up"
+	else
+		icon_state = "down"
+	if(beaker)
+		var/image/iv = image(icon, "iv[iv_attached]")
+		var/percentage = round((beaker.reagents.total_volume / beaker.volume) * 100, 25)
+		var/image/filling = image(icon, "iv_filling[percentage]")
+		filling.color = beaker.reagents.get_color()
+		iv.overlays += filling
+		if(percentage < 25)
+			iv.overlays += image(icon, "light_low")
+		if(density)
+			iv.pixel_y = 6
+		add_overlay(iv)
+
+/obj/structure/bed/roller/can_apply_padding()
+	return FALSE
+
+/obj/structure/bed/roller/attackby(obj/item/I, mob/user)
+	if(iv_stand && !beaker && istype(I, /obj/item/chems))
+		if(!user.try_unequip(I, src))
+			return TRUE
+		to_chat(user, "You attach \the [I] to \the [src].")
+		beaker = I
+		queue_icon_update()
+		return TRUE
+	return ..()
+
+/obj/structure/bed/roller/attack_hand(mob/user)
+	if(!beaker || buckled_mob || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE))
+		return ..()
+	remove_beaker(user)
+	return TRUE
+
+/obj/structure/bed/roller/proc/collapse(mob/user)
+	visible_message("[user] collapses [src].")
+	new item_form_type(get_turf(src))
+	qdel(src)
+
+/obj/structure/bed/roller/post_buckle_mob(mob/living/M)
+	. = ..()
+	if(M == buckled_mob)
+		set_density(1)
+		queue_icon_update()
+	else
+		set_density(0)
+		if(iv_attached)
+			detach_iv(M, usr)
+		queue_icon_update()
+
+/obj/structure/bed/roller/Process()
+	if(!iv_attached || !buckled_mob || !beaker)
+		return PROCESS_KILL
+
+	//SSObj fires twice as fast as SSMobs, so gotta slow down to not OD our victims.
+	if(SSobj.times_fired % 2)
+		return
+
+	if(beaker.volume > 0)
+		beaker.reagents.trans_to_mob(buckled_mob, beaker.amount_per_transfer_from_this, CHEM_INJECT)
+		queue_icon_update()
+
+/obj/structure/bed/roller/proc/remove_beaker(mob/user)
+	to_chat(user, "You detach \the [beaker] to \the [src].")
+	iv_attached = FALSE
+	beaker.dropInto(loc)
+	beaker = null
+	queue_icon_update()
+
+/obj/structure/bed/roller/proc/attach_iv(mob/living/human/target, mob/user)
+	if(!beaker)
+		return
+	if(do_IV_hookup(target, user, beaker))
+		iv_attached = TRUE
+		queue_icon_update()
+		START_PROCESSING(SSobj,src)
+
+/obj/structure/bed/roller/proc/detach_iv(mob/living/human/target, mob/user)
+	visible_message("\The [target] is taken off the IV on \the [src].")
+	iv_attached = FALSE
+	queue_icon_update()
+	STOP_PROCESSING(SSobj,src)
+
+/obj/structure/bed/roller/handle_mouse_drop(atom/over, mob/user, params)
+	if(ishuman(user) || isrobot(user))
+		if(over == buckled_mob && beaker)
+			if(iv_attached)
+				detach_iv(buckled_mob, user)
+			else
+				attach_iv(buckled_mob, user)
+			return TRUE
+	if(ishuman(over))
+		var/mob/M = over
+		if(loc == M.loc && user_buckle_mob(M, user))
+			attach_iv(buckled_mob, user)
+			return TRUE
+	if(beaker)
+		remove_beaker(user)
+		return TRUE
+	if(!buckled_mob)
+		collapse(user)
+		return TRUE
+	. = ..()
+
+/obj/item/roller
+	name = "roller bed"
+	desc = "A collapsed roller bed that can be carried around."
+	icon = 'icons/obj/items/rollerbed.dmi'
+	icon_state = ICON_STATE_WORLD
+	slot_flags = SLOT_BACK
+	w_class = ITEM_SIZE_LARGE
+	pickup_sound = 'sound/foley/pickup2.ogg'
+	material = /decl/material/solid/metal/steel
+	matter = list(
+		/decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY,
+		/decl/material/solid/organic/cloth = MATTER_AMOUNT_REINFORCEMENT,
+	)
+	var/structure_form_type = /obj/structure/bed/roller	//The deployed form path.
+
+/obj/item/roller/get_single_monetary_worth()
+	. = structure_form_type ? atom_info_repository.get_combined_worth_for(structure_form_type) : ..()
+
+/obj/item/roller/attack_self(mob/user)
+	var/obj/structure/bed/roller/R = new structure_form_type(user.loc)
+	R.add_fingerprint(user)
+	qdel(src)
+
+/obj/item/robot_rack/roller
+	name = "roller bed rack"
+	desc = "A rack for carrying collapsed roller beds. Can also be used for carrying ironing boards."
+	icon = 'icons/obj/items/rollerbed.dmi'
+	icon_state = ICON_STATE_WORLD
+	object_type = /obj/item/roller
+	interact_type = /obj/structure/bed/roller
\ No newline at end of file
diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/simple_bed.dm b/code/game/objects/structures/beds/simple_bed.dm
similarity index 100%
rename from code/game/objects/structures/stool_bed_chair_nest_sofa/simple_bed.dm
rename to code/game/objects/structures/beds/simple_bed.dm
diff --git a/code/game/objects/structures/beds/travois.dm b/code/game/objects/structures/beds/travois.dm
new file mode 100644
index 000000000000..b1ce37f85400
--- /dev/null
+++ b/code/game/objects/structures/beds/travois.dm
@@ -0,0 +1,18 @@
+/*
+ * Travois used to drag mobs in low-tech settings.
+ */
+// TODO: Should this really be a bed subtype?
+// Only really needs the base_icon and grab_attack handling from beds, doesn't it?
+/obj/structure/bed/travois
+	name = "travois"
+	anchored = FALSE
+	icon_state = ICON_STATE_WORLD
+	base_icon = ICON_STATE_WORLD
+	icon = 'icons/obj/structures/travois.dmi'
+	buckle_pixel_shift = list("x" = 0, "y" = 0, "z" = 6)
+	movable_flags = MOVABLE_FLAG_WHEELED
+	user_comfort = 0
+	material = /decl/material/solid/organic/wood/oak
+
+/obj/structure/bed/travois/can_apply_padding()
+	return FALSE
\ No newline at end of file
diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm b/code/game/objects/structures/benches/bench.dm
similarity index 68%
rename from code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm
rename to code/game/objects/structures/benches/bench.dm
index 59da1232a7c8..c2b6fb98c3bb 100644
--- a/code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm
+++ b/code/game/objects/structures/benches/bench.dm
@@ -1,3 +1,4 @@
+// These are benches with backs. For backless benches that can't be buckled to, check for /obj/structure/table/bench.
 /obj/structure/bed/chair/bench
 	name = "bench"
 	desc = "A simple slatted bench."
@@ -112,43 +113,3 @@
 /obj/structure/bed/chair/bench/ebony
 	color = WOOD_COLOR_BLACK
 	material = /decl/material/solid/organic/wood/ebony
-
-/obj/structure/bed/chair/bench/pew
-	name = "pew"
-	desc = "A long bench with a backboard, commonly found in places of worship, courtrooms and so on. Not known for being particularly comfortable."
-	icon = 'icons/obj/structures/pews.dmi'
-	icon_state = "pew_standing"
-	base_icon = "pew"
-
-/obj/structure/bed/chair/bench/pew/get_material_icon()
-	return material?.pew_icon
-
-/obj/structure/bed/chair/bench/pew/single
-	name = "backed chair"
-	desc = "A tall chair with a sturdy back. Not very comfortable."
-	base_icon = "pew_standing"
-	connect_neighbors = FALSE
-
-/obj/structure/bed/chair/bench/pew/mahogany
-	color    = /decl/material/solid/organic/wood/mahogany::color
-	material = /decl/material/solid/organic/wood/mahogany
-
-/obj/structure/bed/chair/bench/pew/ebony
-	color    = /decl/material/solid/organic/wood/ebony::color
-	material = /decl/material/solid/organic/wood/ebony
-
-/obj/structure/bed/chair/bench/lounge
-	name       = "lounge"
-	desc       = "An elegant lounge, perfect for reclining on."
-	icon       = 'icons/obj/structures/lounge.dmi'
-	icon_state = "lounge_standing"
-	base_icon  = "lounge"
-
-/obj/structure/bed/chair/bench/lounge/get_material_icon()
-	return icon
-
-/obj/structure/bed/chair/bench/lounge/mapped
-	color          = /decl/material/solid/organic/wood/mahogany::color
-	material       = /decl/material/solid/organic/wood/mahogany
-	reinf_material = /decl/material/solid/organic/cloth
-	padding_color  = COLOR_RED_GRAY
diff --git a/code/game/objects/structures/benches/lounge.dm b/code/game/objects/structures/benches/lounge.dm
new file mode 100644
index 000000000000..046ccc3c034e
--- /dev/null
+++ b/code/game/objects/structures/benches/lounge.dm
@@ -0,0 +1,15 @@
+/obj/structure/bed/chair/bench/lounge
+	name       = "lounge"
+	desc       = "An elegant lounge, perfect for reclining on."
+	icon       = 'icons/obj/structures/lounge.dmi'
+	icon_state = "lounge_standing"
+	base_icon  = "lounge"
+
+/obj/structure/bed/chair/bench/lounge/get_material_icon()
+	return icon
+
+/obj/structure/bed/chair/bench/lounge/mapped
+	color          = /decl/material/solid/organic/wood/mahogany::color
+	material       = /decl/material/solid/organic/wood/mahogany
+	reinf_material = /decl/material/solid/organic/cloth
+	padding_color  = COLOR_RED_GRAY
diff --git a/code/game/objects/structures/benches/pew.dm b/code/game/objects/structures/benches/pew.dm
new file mode 100644
index 000000000000..272d62c51165
--- /dev/null
+++ b/code/game/objects/structures/benches/pew.dm
@@ -0,0 +1,23 @@
+/obj/structure/bed/chair/bench/pew
+	name = "pew"
+	desc = "A long bench with a backboard, commonly found in places of worship, courtrooms and so on. Not known for being particularly comfortable."
+	icon = 'icons/obj/structures/pews.dmi'
+	icon_state = "pew_standing"
+	base_icon = "pew"
+
+/obj/structure/bed/chair/bench/pew/get_material_icon()
+	return material?.pew_icon
+
+/obj/structure/bed/chair/bench/pew/single
+	name = "backed chair"
+	desc = "A tall chair with a sturdy back. Not very comfortable."
+	base_icon = "pew_standing"
+	connect_neighbors = FALSE
+
+/obj/structure/bed/chair/bench/pew/mahogany
+	color    = /decl/material/solid/organic/wood/mahogany::color
+	material = /decl/material/solid/organic/wood/mahogany
+
+/obj/structure/bed/chair/bench/pew/ebony
+	color    = /decl/material/solid/organic/wood/ebony::color
+	material = /decl/material/solid/organic/wood/ebony
diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/chairs.dm b/code/game/objects/structures/chairs/chairs.dm
similarity index 100%
rename from code/game/objects/structures/stool_bed_chair_nest_sofa/chairs.dm
rename to code/game/objects/structures/chairs/chairs.dm
diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/rustic_chairs.dm b/code/game/objects/structures/chairs/rustic_chairs.dm
similarity index 100%
rename from code/game/objects/structures/stool_bed_chair_nest_sofa/rustic_chairs.dm
rename to code/game/objects/structures/chairs/rustic_chairs.dm
diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/wheelchair.dm b/code/game/objects/structures/chairs/wheelchair.dm
similarity index 100%
rename from code/game/objects/structures/stool_bed_chair_nest_sofa/wheelchair.dm
rename to code/game/objects/structures/chairs/wheelchair.dm
diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/sofa.dm b/code/game/objects/structures/sofa.dm
similarity index 100%
rename from code/game/objects/structures/stool_bed_chair_nest_sofa/sofa.dm
rename to code/game/objects/structures/sofa.dm
diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm
deleted file mode 100644
index f1ec03d9f7cf..000000000000
--- a/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm
+++ /dev/null
@@ -1,350 +0,0 @@
-/* Beds... get your mind out of the gutter, they're for sleeping!
- * Contains:
- * 		Beds
- *		Roller beds
- *		Mattresses
- */
-
-/*
- * Beds
- */
-/obj/structure/bed
-	name = "bed"
-	desc = "A raised, padded platform for sleeping on. This one has straps for ensuring restful snoozing in microgravity."
-	icon = 'icons/obj/furniture.dmi'
-	icon_state = "bed"
-	anchored = TRUE
-	can_buckle = TRUE
-	buckle_dir = SOUTH
-	buckle_lying = TRUE
-	buckle_sound = 'sound/effects/buckle.ogg'
-	material = DEFAULT_FURNITURE_MATERIAL
-	material_alteration = MAT_FLAG_ALTERATION_ALL
-	tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT
-	parts_amount = 2
-	parts_type = /obj/item/stack/material/rods
-	user_comfort = 1
-	obj_flags = OBJ_FLAG_SUPPORT_MOB
-	var/base_icon = "bed"
-	var/padding_color
-
-/obj/structure/bed/user_can_mousedrop_onto(mob/user, atom/being_dropped, incapacitation_flags, params)
-	if(user == being_dropped)
-		return user.Adjacent(src) && !user.incapacitated(INCAPACITATION_STUNNED|INCAPACITATION_KNOCKOUT)
-	return ..()
-
-/obj/structure/bed/get_base_value()
-	. = round(..() * 2.5) // Utility structures should be worth more than their matter (wheelchairs, rollers, etc).
-
-/obj/structure/bed/get_surgery_surface_quality(mob/living/victim, mob/living/user)
-	return OPERATE_PASSABLE
-
-/obj/structure/bed/get_surgery_success_modifier(delicate)
-	return delicate ? -5 : 0
-
-/obj/structure/bed/update_material_name()
-	if(reinf_material)
-		SetName("[reinf_material.adjective_name] [initial(name)]")
-	else if(material)
-		SetName("[material.adjective_name] [initial(name)]")
-	else
-		SetName(initial(name))
-
-/obj/structure/bed/update_material_desc()
-	if(reinf_material)
-		desc = "[initial(desc)] It's made of [material.use_name] and covered with [reinf_material.use_name]."
-	else
-		desc = "[initial(desc)] It's made of [material.use_name]."
-
-// Reuse the cache/code from stools, todo maybe unify.
-/obj/structure/bed/on_update_icon()
-	..()
-	icon_state = base_icon
-	if(istype(reinf_material))
-		if(material_alteration & MAT_FLAG_ALTERATION_COLOR)
-			add_overlay(overlay_image(icon, "[icon_state]_padding", padding_color || reinf_material.color, RESET_COLOR))
-		else
-			add_overlay(overlay_image(icon, "[icon_state]_padding"))
-
-/obj/structure/bed/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
-	if(istype(mover) && mover.checkpass(PASS_FLAG_TABLE))
-		return 1
-	return ..()
-
-/obj/structure/bed/explosion_act(severity)
-	. = ..()
-	if(. && !QDELETED(src) && (severity == 1 || (severity == 2 && prob(50)) || (severity == 3 && prob(5))))
-		physically_destroyed()
-
-/obj/structure/bed/proc/can_apply_padding()
-	return TRUE
-
-/obj/structure/bed/attackby(obj/item/used_item, mob/user)
-
-	if((. = ..()))
-		return
-
-	if(istype(used_item, /obj/item/stack) && can_apply_padding())
-
-		if(reinf_material)
-			to_chat(user, SPAN_WARNING("\The [src] is already padded."))
-			return TRUE
-
-		var/obj/item/stack/cloth = used_item
-		if(cloth.get_amount() < 1)
-			to_chat(user, SPAN_WARNING("You need at least one unit of material to pad \the [src]."))
-			return TRUE
-
-		var/padding_type
-		var/new_padding_color
-		if(istype(used_item, /obj/item/stack/tile) || istype(used_item, /obj/item/stack/material/bolt))
-			padding_type = used_item.material?.type
-			new_padding_color = used_item.paint_color
-
-		if(padding_type)
-			var/decl/material/padding_mat = GET_DECL(padding_type)
-			if(!istype(padding_mat) || !(padding_mat.flags & MAT_FLAG_PADDING))
-				padding_type = null
-
-		if(!padding_type)
-			to_chat(user, SPAN_WARNING("You cannot pad \the [src] with that."))
-			return TRUE
-
-		cloth.use(1)
-		if(!isturf(src.loc))
-			src.forceMove(get_turf(src))
-		playsound(src.loc, 'sound/effects/rustle5.ogg', 50, 1)
-		to_chat(user, SPAN_NOTICE("You add padding to \the [src]."))
-		add_padding(padding_type, new_padding_color)
-		return TRUE
-
-	if(IS_WIRECUTTER(used_item))
-		if(!reinf_material)
-			to_chat(user, SPAN_WARNING("\The [src] has no padding to remove."))
-		else
-			to_chat(user, SPAN_NOTICE("You remove the padding from \the [src]."))
-			playsound(src, 'sound/items/Wirecutter.ogg', 100, 1)
-			remove_padding()
-		return TRUE
-
-/obj/structure/bed/grab_attack(obj/item/grab/grab, mob/user)
-	var/mob/living/victim = grab.get_affecting_mob()
-	if(istype(victim) && istype(user))
-		user.visible_message(SPAN_NOTICE("\The [user] attempts to put \the [victim] onto \the [src]!"))
-		if(do_after(user, 2 SECONDS, src) && !QDELETED(victim) && !QDELETED(user) && !QDELETED(grab) && user_buckle_mob(victim, user))
-			qdel(grab)
-		return TRUE
-	return ..()
-
-/obj/structure/bed/proc/add_padding(var/padding_type, var/new_padding_color)
-	reinf_material = GET_DECL(padding_type)
-	padding_color = new_padding_color
-	update_icon()
-
-/obj/structure/bed/proc/remove_padding()
-	if(reinf_material)
-		var/list/res = reinf_material.create_object(get_turf(src))
-		if(padding_color)
-			for(var/obj/item/thing in res)
-				thing.set_color(padding_color)
-	reinf_material = null
-	padding_color = null
-	update_icon()
-
-/obj/structure/bed/psych
-	name = "psychiatrist's couch"
-	desc = "For prime comfort during psychiatric evaluations."
-	icon_state = "psychbed"
-	material = /decl/material/solid/organic/wood/walnut
-
-/obj/structure/bed/psych/leather
-	reinf_material = /decl/material/solid/organic/leather
-
-/obj/structure/bed/padded
-	material = /decl/material/solid/metal/aluminium
-	reinf_material = /decl/material/solid/organic/cloth
-
-/*
- * Travois used to drag mobs in low-tech settings.
- */
-/obj/structure/bed/travois
-	name = "travois"
-	anchored = FALSE
-	icon_state = ICON_STATE_WORLD
-	base_icon = ICON_STATE_WORLD
-	icon = 'icons/obj/structures/travois.dmi'
-	buckle_pixel_shift = list("x" = 0, "y" = 0, "z" = 6)
-	movable_flags = MOVABLE_FLAG_WHEELED
-	user_comfort = 0
-	material = /decl/material/solid/organic/wood/oak
-
-/obj/structure/bed/travois/can_apply_padding()
-	return FALSE
-
-/*
- * Roller beds
- */
-/obj/structure/bed/roller
-	name = "roller bed"
-	icon = 'icons/obj/structures/rollerbed.dmi'
-	icon_state = "down"
-	anchored = FALSE
-	buckle_pixel_shift = list("x" = 0, "y" = 0, "z" = 6)
-	movable_flags = MOVABLE_FLAG_WHEELED
-	tool_interaction_flags = 0
-	var/item_form_type = /obj/item/roller	//The folded-up object path.
-	var/obj/item/chems/beaker
-	var/iv_attached = 0
-	var/iv_stand = TRUE
-
-/obj/structure/bed/roller/on_update_icon()
-	cut_overlays()
-	if(density)
-		icon_state = "up"
-	else
-		icon_state = "down"
-	if(beaker)
-		var/image/iv = image(icon, "iv[iv_attached]")
-		var/percentage = round((beaker.reagents.total_volume / beaker.volume) * 100, 25)
-		var/image/filling = image(icon, "iv_filling[percentage]")
-		filling.color = beaker.reagents.get_color()
-		iv.overlays += filling
-		if(percentage < 25)
-			iv.overlays += image(icon, "light_low")
-		if(density)
-			iv.pixel_y = 6
-		add_overlay(iv)
-
-/obj/structure/bed/roller/can_apply_padding()
-	return FALSE
-
-/obj/structure/bed/roller/attackby(obj/item/I, mob/user)
-	if(iv_stand && !beaker && istype(I, /obj/item/chems))
-		if(!user.try_unequip(I, src))
-			return TRUE
-		to_chat(user, "You attach \the [I] to \the [src].")
-		beaker = I
-		queue_icon_update()
-		return TRUE
-	return ..()
-
-/obj/structure/bed/roller/attack_hand(mob/user)
-	if(!beaker || buckled_mob || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE))
-		return ..()
-	remove_beaker(user)
-	return TRUE
-
-/obj/structure/bed/roller/proc/collapse(mob/user)
-	visible_message("[user] collapses [src].")
-	new item_form_type(get_turf(src))
-	qdel(src)
-
-/obj/structure/bed/roller/post_buckle_mob(mob/living/M)
-	. = ..()
-	if(M == buckled_mob)
-		set_density(1)
-		queue_icon_update()
-	else
-		set_density(0)
-		if(iv_attached)
-			detach_iv(M, usr)
-		queue_icon_update()
-
-/obj/structure/bed/roller/Process()
-	if(!iv_attached || !buckled_mob || !beaker)
-		return PROCESS_KILL
-
-	//SSObj fires twice as fast as SSMobs, so gotta slow down to not OD our victims.
-	if(SSobj.times_fired % 2)
-		return
-
-	if(beaker.volume > 0)
-		beaker.reagents.trans_to_mob(buckled_mob, beaker.amount_per_transfer_from_this, CHEM_INJECT)
-		queue_icon_update()
-
-/obj/structure/bed/roller/proc/remove_beaker(mob/user)
-	to_chat(user, "You detach \the [beaker] to \the [src].")
-	iv_attached = FALSE
-	beaker.dropInto(loc)
-	beaker = null
-	queue_icon_update()
-
-/obj/structure/bed/roller/proc/attach_iv(mob/living/human/target, mob/user)
-	if(!beaker)
-		return
-	if(do_IV_hookup(target, user, beaker))
-		iv_attached = TRUE
-		queue_icon_update()
-		START_PROCESSING(SSobj,src)
-
-/obj/structure/bed/roller/proc/detach_iv(mob/living/human/target, mob/user)
-	visible_message("\The [target] is taken off the IV on \the [src].")
-	iv_attached = FALSE
-	queue_icon_update()
-	STOP_PROCESSING(SSobj,src)
-
-/obj/structure/bed/roller/handle_mouse_drop(atom/over, mob/user, params)
-	if(ishuman(user) || isrobot(user))
-		if(over == buckled_mob && beaker)
-			if(iv_attached)
-				detach_iv(buckled_mob, user)
-			else
-				attach_iv(buckled_mob, user)
-			return TRUE
-	if(ishuman(over))
-		var/mob/M = over
-		if(loc == M.loc && user_buckle_mob(M, user))
-			attach_iv(buckled_mob, user)
-			return TRUE
-	if(beaker)
-		remove_beaker(user)
-		return TRUE
-	if(!buckled_mob)
-		collapse(user)
-		return TRUE
-	. = ..()
-
-/obj/item/roller
-	name = "roller bed"
-	desc = "A collapsed roller bed that can be carried around."
-	icon = 'icons/obj/items/rollerbed.dmi'
-	icon_state = ICON_STATE_WORLD
-	slot_flags = SLOT_BACK
-	w_class = ITEM_SIZE_LARGE
-	pickup_sound = 'sound/foley/pickup2.ogg'
-	material = /decl/material/solid/metal/steel
-	matter = list(
-		/decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY,
-		/decl/material/solid/organic/cloth = MATTER_AMOUNT_REINFORCEMENT,
-	)
-	var/structure_form_type = /obj/structure/bed/roller	//The deployed form path.
-
-/obj/item/roller/get_single_monetary_worth()
-	. = structure_form_type ? atom_info_repository.get_combined_worth_for(structure_form_type) : ..()
-
-/obj/item/roller/attack_self(mob/user)
-	var/obj/structure/bed/roller/R = new structure_form_type(user.loc)
-	R.add_fingerprint(user)
-	qdel(src)
-
-/obj/item/robot_rack/roller
-	name = "roller bed rack"
-	desc = "A rack for carrying collapsed roller beds. Can also be used for carrying ironing boards."
-	icon = 'icons/obj/items/rollerbed.dmi'
-	icon_state = ICON_STATE_WORLD
-	object_type = /obj/item/roller
-	interact_type = /obj/structure/bed/roller
-/*
- * Mattresses
- */
-/obj/structure/mattress
-	name = "mattress"
-	icon = 'icons/obj/furniture.dmi'
-	icon_state = "mattress"
-	desc = "A bare mattress. It doesn't look very comfortable."
-	anchored = FALSE
-
-/obj/structure/mattress/dirty
-	name = "dirty mattress"
-	icon_state = "dirty_mattress"
-	desc = "A dirty, smelly mattress covered in body fluids. You wouldn't want to touch this."
diff --git a/nebula.dme b/nebula.dme
index 2ecf656f1ff1..899bf604f4f3 100644
--- a/nebula.dme
+++ b/nebula.dme
@@ -1687,6 +1687,7 @@
 #include "code\game\objects\items\saddle.dm"
 #include "code\game\objects\items\silencer.dm"
 #include "code\game\objects\items\spirit_board.dm"
+#include "code\game\objects\items\stools.dm"
 #include "code\game\objects\items\toys.dm"
 #include "code\game\objects\items\training_dummy.dm"
 #include "code\game\objects\items\trash.dm"
@@ -2046,6 +2047,7 @@
 #include "code\game\objects\structures\signs.dm"
 #include "code\game\objects\structures\skele_stand.dm"
 #include "code\game\objects\structures\snowman.dm"
+#include "code\game\objects\structures\sofa.dm"
 #include "code\game\objects\structures\stasis_cage.dm"
 #include "code\game\objects\structures\tables.dm"
 #include "code\game\objects\structures\tank_dispenser.dm"
@@ -2064,6 +2066,18 @@
 #include "code\game\objects\structures\barrels\barrel.dm"
 #include "code\game\objects\structures\barrels\cask.dm"
 #include "code\game\objects\structures\barrels\cask_rack.dm"
+#include "code\game\objects\structures\beds\bed.dm"
+#include "code\game\objects\structures\beds\bedroll.dm"
+#include "code\game\objects\structures\beds\mattress.dm"
+#include "code\game\objects\structures\beds\rollerbed.dm"
+#include "code\game\objects\structures\beds\simple_bed.dm"
+#include "code\game\objects\structures\beds\travois.dm"
+#include "code\game\objects\structures\benches\bench.dm"
+#include "code\game\objects\structures\benches\lounge.dm"
+#include "code\game\objects\structures\benches\pew.dm"
+#include "code\game\objects\structures\chairs\chairs.dm"
+#include "code\game\objects\structures\chairs\rustic_chairs.dm"
+#include "code\game\objects\structures\chairs\wheelchair.dm"
 #include "code\game\objects\structures\chemistry\filter_stand.dm"
 #include "code\game\objects\structures\chemistry\heater.dm"
 #include "code\game\objects\structures\crates_lockers\crates.dm"
@@ -2114,15 +2128,6 @@
 #include "code\game\objects\structures\signs\paintings.dm"
 #include "code\game\objects\structures\signs\plaques.dm"
 #include "code\game\objects\structures\signs\warning_signs.dm"
-#include "code\game\objects\structures\stool_bed_chair_nest_sofa\bed.dm"
-#include "code\game\objects\structures\stool_bed_chair_nest_sofa\bedroll.dm"
-#include "code\game\objects\structures\stool_bed_chair_nest_sofa\chairs.dm"
-#include "code\game\objects\structures\stool_bed_chair_nest_sofa\pew.dm"
-#include "code\game\objects\structures\stool_bed_chair_nest_sofa\rustic_chairs.dm"
-#include "code\game\objects\structures\stool_bed_chair_nest_sofa\simple_bed.dm"
-#include "code\game\objects\structures\stool_bed_chair_nest_sofa\sofa.dm"
-#include "code\game\objects\structures\stool_bed_chair_nest_sofa\stools.dm"
-#include "code\game\objects\structures\stool_bed_chair_nest_sofa\wheelchair.dm"
 #include "code\game\turfs\turf.dm"
 #include "code\game\turfs\turf_ao.dm"
 #include "code\game\turfs\turf_buildmode.dm"

From 524a13786c17f8ad2a450cf6799657a421e5dff8 Mon Sep 17 00:00:00 2001
From: Penelope Haze <out.of.p.haze@proton.me>
Date: Thu, 30 Jan 2025 01:38:09 -0500
Subject: [PATCH 09/13] Move tools out of items\weapons folder

---
 .../objects/items/{weapons => }/tools/crowbar.dm     |  0
 .../objects/items/{weapons => }/tools/screwdriver.dm |  0
 .../game/objects/items/{weapons => }/tools/shears.dm |  0
 .../objects/items/{weapons => }/tools/weldingtool.dm |  0
 .../objects/items/{weapons => }/tools/wirecutter.dm  |  0
 .../game/objects/items/{weapons => }/tools/wrench.dm |  0
 nebula.dme                                           | 12 ++++++------
 7 files changed, 6 insertions(+), 6 deletions(-)
 rename code/game/objects/items/{weapons => }/tools/crowbar.dm (100%)
 rename code/game/objects/items/{weapons => }/tools/screwdriver.dm (100%)
 rename code/game/objects/items/{weapons => }/tools/shears.dm (100%)
 rename code/game/objects/items/{weapons => }/tools/weldingtool.dm (100%)
 rename code/game/objects/items/{weapons => }/tools/wirecutter.dm (100%)
 rename code/game/objects/items/{weapons => }/tools/wrench.dm (100%)

diff --git a/code/game/objects/items/weapons/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm
similarity index 100%
rename from code/game/objects/items/weapons/tools/crowbar.dm
rename to code/game/objects/items/tools/crowbar.dm
diff --git a/code/game/objects/items/weapons/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm
similarity index 100%
rename from code/game/objects/items/weapons/tools/screwdriver.dm
rename to code/game/objects/items/tools/screwdriver.dm
diff --git a/code/game/objects/items/weapons/tools/shears.dm b/code/game/objects/items/tools/shears.dm
similarity index 100%
rename from code/game/objects/items/weapons/tools/shears.dm
rename to code/game/objects/items/tools/shears.dm
diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm
similarity index 100%
rename from code/game/objects/items/weapons/tools/weldingtool.dm
rename to code/game/objects/items/tools/weldingtool.dm
diff --git a/code/game/objects/items/weapons/tools/wirecutter.dm b/code/game/objects/items/tools/wirecutter.dm
similarity index 100%
rename from code/game/objects/items/weapons/tools/wirecutter.dm
rename to code/game/objects/items/tools/wirecutter.dm
diff --git a/code/game/objects/items/weapons/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm
similarity index 100%
rename from code/game/objects/items/weapons/tools/wrench.dm
rename to code/game/objects/items/tools/wrench.dm
diff --git a/nebula.dme b/nebula.dme
index 899bf604f4f3..448ebc35650b 100644
--- a/nebula.dme
+++ b/nebula.dme
@@ -1802,6 +1802,12 @@
 #include "code\game\objects\items\stacks\medical\medical_splint.dm"
 #include "code\game\objects\items\stacks\tiles\tile_types.dm"
 #include "code\game\objects\items\stacks\tiles\tile_types_wooden.dm"
+#include "code\game\objects\items\tools\crowbar.dm"
+#include "code\game\objects\items\tools\screwdriver.dm"
+#include "code\game\objects\items\tools\shears.dm"
+#include "code\game\objects\items\tools\weldingtool.dm"
+#include "code\game\objects\items\tools\wirecutter.dm"
+#include "code\game\objects\items\tools\wrench.dm"
 #include "code\game\objects\items\weapons\AI_modules.dm"
 #include "code\game\objects\items\weapons\autopsy.dm"
 #include "code\game\objects\items\weapons\balls.dm"
@@ -1953,12 +1959,6 @@
 #include "code\game\objects\items\weapons\tanks\jetpack.dm"
 #include "code\game\objects\items\weapons\tanks\tank_types.dm"
 #include "code\game\objects\items\weapons\tanks\tanks.dm"
-#include "code\game\objects\items\weapons\tools\crowbar.dm"
-#include "code\game\objects\items\weapons\tools\screwdriver.dm"
-#include "code\game\objects\items\weapons\tools\shears.dm"
-#include "code\game\objects\items\weapons\tools\weldingtool.dm"
-#include "code\game\objects\items\weapons\tools\wirecutter.dm"
-#include "code\game\objects\items\weapons\tools\wrench.dm"
 #include "code\game\objects\random\_random.dm"
 #include "code\game\objects\random\date_based.dm"
 #include "code\game\objects\random\random.dm"

From bd22d09f2eeb5b4a1159367fe275b5aab26a157e Mon Sep 17 00:00:00 2001
From: Penelope Haze <out.of.p.haze@proton.me>
Date: Thu, 30 Jan 2025 01:39:49 -0500
Subject: [PATCH 10/13] Move circuitboards out of weapons folder

---
 .../{weapons => }/circuitboards/broken.dm     |  0
 .../circuitboards/circuitboard.dm             |  0
 .../circuitboards/computer/air_management.dm  |  0
 .../circuitboards/computer/computer.dm        |  0
 .../circuitboards/computer/holodeckcontrol.dm |  0
 .../circuitboards/computer/modular.dm         |  0
 .../circuitboards/computer/shuttle.dm         |  0
 .../circuitboards/computer/station_alert.dm   |  0
 .../circuitboards/machinery/biogenerator.dm   |  0
 .../circuitboards/machinery/chemistry.dm      |  0
 .../circuitboards/machinery/cloning.dm        |  0
 .../circuitboards/machinery/commsantenna.dm   |  0
 .../circuitboards/machinery/docking_beacon.dm |  0
 .../machinery/engineering_circuits.dm         |  0
 .../circuitboards/machinery/forensic.dm       |  0
 .../circuitboards/machinery/holomap.dm        |  0
 .../circuitboards/machinery/household.dm      |  0
 .../circuitboards/machinery/mech_recharger.dm |  0
 .../circuitboards/machinery/medical.dm        |  0
 .../circuitboards/machinery/mining.dm         |  0
 .../circuitboards/machinery/mining_drill.dm   |  0
 .../circuitboards/machinery/network.dm        |  0
 .../circuitboards/machinery/oxyregenerator.dm |  0
 .../circuitboards/machinery/pacman.dm         |  0
 .../machinery/portable_atmospherics.dm        |  0
 .../circuitboards/machinery/power.dm          |  0
 .../machinery/recharge_station.dm             |  0
 .../circuitboards/machinery/research.dm       |  0
 .../machinery/self_destruct_storage.dm        |  0
 .../circuitboards/machinery/shieldgen.dm      |  0
 .../circuitboards/machinery/shipsensors.dm    |  0
 .../circuitboards/machinery/telecomms.dm      |  0
 .../circuitboards/machinery/unary_atmos.dm    |  0
 .../{weapons => }/circuitboards/other.dm      |  0
 .../items/{weapons => }/circuitboards/wall.dm |  0
 nebula.dme                                    | 70 +++++++++----------
 36 files changed, 35 insertions(+), 35 deletions(-)
 rename code/game/objects/items/{weapons => }/circuitboards/broken.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/circuitboard.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/computer/air_management.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/computer/computer.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/computer/holodeckcontrol.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/computer/modular.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/computer/shuttle.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/computer/station_alert.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/biogenerator.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/chemistry.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/cloning.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/commsantenna.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/docking_beacon.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/engineering_circuits.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/forensic.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/holomap.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/household.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/mech_recharger.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/medical.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/mining.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/mining_drill.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/network.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/oxyregenerator.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/pacman.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/portable_atmospherics.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/power.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/recharge_station.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/research.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/self_destruct_storage.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/shieldgen.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/shipsensors.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/telecomms.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/machinery/unary_atmos.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/other.dm (100%)
 rename code/game/objects/items/{weapons => }/circuitboards/wall.dm (100%)

diff --git a/code/game/objects/items/weapons/circuitboards/broken.dm b/code/game/objects/items/circuitboards/broken.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/broken.dm
rename to code/game/objects/items/circuitboards/broken.dm
diff --git a/code/game/objects/items/weapons/circuitboards/circuitboard.dm b/code/game/objects/items/circuitboards/circuitboard.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/circuitboard.dm
rename to code/game/objects/items/circuitboards/circuitboard.dm
diff --git a/code/game/objects/items/weapons/circuitboards/computer/air_management.dm b/code/game/objects/items/circuitboards/computer/air_management.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/computer/air_management.dm
rename to code/game/objects/items/circuitboards/computer/air_management.dm
diff --git a/code/game/objects/items/weapons/circuitboards/computer/computer.dm b/code/game/objects/items/circuitboards/computer/computer.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/computer/computer.dm
rename to code/game/objects/items/circuitboards/computer/computer.dm
diff --git a/code/game/objects/items/weapons/circuitboards/computer/holodeckcontrol.dm b/code/game/objects/items/circuitboards/computer/holodeckcontrol.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/computer/holodeckcontrol.dm
rename to code/game/objects/items/circuitboards/computer/holodeckcontrol.dm
diff --git a/code/game/objects/items/weapons/circuitboards/computer/modular.dm b/code/game/objects/items/circuitboards/computer/modular.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/computer/modular.dm
rename to code/game/objects/items/circuitboards/computer/modular.dm
diff --git a/code/game/objects/items/weapons/circuitboards/computer/shuttle.dm b/code/game/objects/items/circuitboards/computer/shuttle.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/computer/shuttle.dm
rename to code/game/objects/items/circuitboards/computer/shuttle.dm
diff --git a/code/game/objects/items/weapons/circuitboards/computer/station_alert.dm b/code/game/objects/items/circuitboards/computer/station_alert.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/computer/station_alert.dm
rename to code/game/objects/items/circuitboards/computer/station_alert.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm b/code/game/objects/items/circuitboards/machinery/biogenerator.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm
rename to code/game/objects/items/circuitboards/machinery/biogenerator.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/chemistry.dm b/code/game/objects/items/circuitboards/machinery/chemistry.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/chemistry.dm
rename to code/game/objects/items/circuitboards/machinery/chemistry.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm b/code/game/objects/items/circuitboards/machinery/cloning.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/cloning.dm
rename to code/game/objects/items/circuitboards/machinery/cloning.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm b/code/game/objects/items/circuitboards/machinery/commsantenna.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm
rename to code/game/objects/items/circuitboards/machinery/commsantenna.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/docking_beacon.dm b/code/game/objects/items/circuitboards/machinery/docking_beacon.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/docking_beacon.dm
rename to code/game/objects/items/circuitboards/machinery/docking_beacon.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/engineering_circuits.dm b/code/game/objects/items/circuitboards/machinery/engineering_circuits.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/engineering_circuits.dm
rename to code/game/objects/items/circuitboards/machinery/engineering_circuits.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/forensic.dm b/code/game/objects/items/circuitboards/machinery/forensic.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/forensic.dm
rename to code/game/objects/items/circuitboards/machinery/forensic.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/holomap.dm b/code/game/objects/items/circuitboards/machinery/holomap.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/holomap.dm
rename to code/game/objects/items/circuitboards/machinery/holomap.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/household.dm b/code/game/objects/items/circuitboards/machinery/household.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/household.dm
rename to code/game/objects/items/circuitboards/machinery/household.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm b/code/game/objects/items/circuitboards/machinery/mech_recharger.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm
rename to code/game/objects/items/circuitboards/machinery/mech_recharger.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/medical.dm b/code/game/objects/items/circuitboards/machinery/medical.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/medical.dm
rename to code/game/objects/items/circuitboards/machinery/medical.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/mining.dm b/code/game/objects/items/circuitboards/machinery/mining.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/mining.dm
rename to code/game/objects/items/circuitboards/machinery/mining.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm b/code/game/objects/items/circuitboards/machinery/mining_drill.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm
rename to code/game/objects/items/circuitboards/machinery/mining_drill.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/network.dm b/code/game/objects/items/circuitboards/machinery/network.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/network.dm
rename to code/game/objects/items/circuitboards/machinery/network.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/oxyregenerator.dm b/code/game/objects/items/circuitboards/machinery/oxyregenerator.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/oxyregenerator.dm
rename to code/game/objects/items/circuitboards/machinery/oxyregenerator.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/pacman.dm b/code/game/objects/items/circuitboards/machinery/pacman.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/pacman.dm
rename to code/game/objects/items/circuitboards/machinery/pacman.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/portable_atmospherics.dm b/code/game/objects/items/circuitboards/machinery/portable_atmospherics.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/portable_atmospherics.dm
rename to code/game/objects/items/circuitboards/machinery/portable_atmospherics.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/power.dm b/code/game/objects/items/circuitboards/machinery/power.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/power.dm
rename to code/game/objects/items/circuitboards/machinery/power.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm b/code/game/objects/items/circuitboards/machinery/recharge_station.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm
rename to code/game/objects/items/circuitboards/machinery/recharge_station.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/research.dm b/code/game/objects/items/circuitboards/machinery/research.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/research.dm
rename to code/game/objects/items/circuitboards/machinery/research.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/self_destruct_storage.dm b/code/game/objects/items/circuitboards/machinery/self_destruct_storage.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/self_destruct_storage.dm
rename to code/game/objects/items/circuitboards/machinery/self_destruct_storage.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm b/code/game/objects/items/circuitboards/machinery/shieldgen.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm
rename to code/game/objects/items/circuitboards/machinery/shieldgen.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/shipsensors.dm b/code/game/objects/items/circuitboards/machinery/shipsensors.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/shipsensors.dm
rename to code/game/objects/items/circuitboards/machinery/shipsensors.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm b/code/game/objects/items/circuitboards/machinery/telecomms.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm
rename to code/game/objects/items/circuitboards/machinery/telecomms.dm
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm b/code/game/objects/items/circuitboards/machinery/unary_atmos.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm
rename to code/game/objects/items/circuitboards/machinery/unary_atmos.dm
diff --git a/code/game/objects/items/weapons/circuitboards/other.dm b/code/game/objects/items/circuitboards/other.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/other.dm
rename to code/game/objects/items/circuitboards/other.dm
diff --git a/code/game/objects/items/weapons/circuitboards/wall.dm b/code/game/objects/items/circuitboards/wall.dm
similarity index 100%
rename from code/game/objects/items/weapons/circuitboards/wall.dm
rename to code/game/objects/items/circuitboards/wall.dm
diff --git a/nebula.dme b/nebula.dme
index 448ebc35650b..5bd4f680377d 100644
--- a/nebula.dme
+++ b/nebula.dme
@@ -1723,6 +1723,41 @@
 #include "code\game\objects\items\books\skill\research.dm"
 #include "code\game\objects\items\books\skill\security.dm"
 #include "code\game\objects\items\books\skill\service.dm"
+#include "code\game\objects\items\circuitboards\broken.dm"
+#include "code\game\objects\items\circuitboards\circuitboard.dm"
+#include "code\game\objects\items\circuitboards\other.dm"
+#include "code\game\objects\items\circuitboards\wall.dm"
+#include "code\game\objects\items\circuitboards\computer\air_management.dm"
+#include "code\game\objects\items\circuitboards\computer\computer.dm"
+#include "code\game\objects\items\circuitboards\computer\holodeckcontrol.dm"
+#include "code\game\objects\items\circuitboards\computer\modular.dm"
+#include "code\game\objects\items\circuitboards\computer\shuttle.dm"
+#include "code\game\objects\items\circuitboards\computer\station_alert.dm"
+#include "code\game\objects\items\circuitboards\machinery\biogenerator.dm"
+#include "code\game\objects\items\circuitboards\machinery\chemistry.dm"
+#include "code\game\objects\items\circuitboards\machinery\cloning.dm"
+#include "code\game\objects\items\circuitboards\machinery\commsantenna.dm"
+#include "code\game\objects\items\circuitboards\machinery\docking_beacon.dm"
+#include "code\game\objects\items\circuitboards\machinery\engineering_circuits.dm"
+#include "code\game\objects\items\circuitboards\machinery\forensic.dm"
+#include "code\game\objects\items\circuitboards\machinery\holomap.dm"
+#include "code\game\objects\items\circuitboards\machinery\household.dm"
+#include "code\game\objects\items\circuitboards\machinery\mech_recharger.dm"
+#include "code\game\objects\items\circuitboards\machinery\medical.dm"
+#include "code\game\objects\items\circuitboards\machinery\mining.dm"
+#include "code\game\objects\items\circuitboards\machinery\mining_drill.dm"
+#include "code\game\objects\items\circuitboards\machinery\network.dm"
+#include "code\game\objects\items\circuitboards\machinery\oxyregenerator.dm"
+#include "code\game\objects\items\circuitboards\machinery\pacman.dm"
+#include "code\game\objects\items\circuitboards\machinery\portable_atmospherics.dm"
+#include "code\game\objects\items\circuitboards\machinery\power.dm"
+#include "code\game\objects\items\circuitboards\machinery\recharge_station.dm"
+#include "code\game\objects\items\circuitboards\machinery\research.dm"
+#include "code\game\objects\items\circuitboards\machinery\self_destruct_storage.dm"
+#include "code\game\objects\items\circuitboards\machinery\shieldgen.dm"
+#include "code\game\objects\items\circuitboards\machinery\shipsensors.dm"
+#include "code\game\objects\items\circuitboards\machinery\telecomms.dm"
+#include "code\game\objects\items\circuitboards\machinery\unary_atmos.dm"
 #include "code\game\objects\items\devices\aicard.dm"
 #include "code\game\objects\items\devices\auto_cpr.dm"
 #include "code\game\objects\items\devices\binoculars.dm"
@@ -1850,41 +1885,6 @@
 #include "code\game\objects\items\weapons\traps.dm"
 #include "code\game\objects\items\weapons\weaponry.dm"
 #include "code\game\objects\items\weapons\weldbackpack.dm"
-#include "code\game\objects\items\weapons\circuitboards\broken.dm"
-#include "code\game\objects\items\weapons\circuitboards\circuitboard.dm"
-#include "code\game\objects\items\weapons\circuitboards\other.dm"
-#include "code\game\objects\items\weapons\circuitboards\wall.dm"
-#include "code\game\objects\items\weapons\circuitboards\computer\air_management.dm"
-#include "code\game\objects\items\weapons\circuitboards\computer\computer.dm"
-#include "code\game\objects\items\weapons\circuitboards\computer\holodeckcontrol.dm"
-#include "code\game\objects\items\weapons\circuitboards\computer\modular.dm"
-#include "code\game\objects\items\weapons\circuitboards\computer\shuttle.dm"
-#include "code\game\objects\items\weapons\circuitboards\computer\station_alert.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\biogenerator.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\chemistry.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\cloning.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\commsantenna.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\docking_beacon.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\engineering_circuits.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\forensic.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\holomap.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\household.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\mech_recharger.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\medical.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\mining.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\mining_drill.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\network.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\oxyregenerator.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\pacman.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\portable_atmospherics.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\power.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\recharge_station.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\research.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\self_destruct_storage.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\shieldgen.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\shipsensors.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\telecomms.dm"
-#include "code\game\objects\items\weapons\circuitboards\machinery\unary_atmos.dm"
 #include "code\game\objects\items\weapons\grenades\anti_photon_grenade.dm"
 #include "code\game\objects\items\weapons\grenades\chem_grenade.dm"
 #include "code\game\objects\items\weapons\grenades\decompiler.dm"

From 61253f61462808356c0cda6d48a4e73194180736 Mon Sep 17 00:00:00 2001
From: Penelope Haze <out.of.p.haze@proton.me>
Date: Thu, 30 Jan 2025 02:09:22 -0500
Subject: [PATCH 11/13] Move welding content into one folder

---
 .../{weapons => welding}/electric_welder.dm   |   9 +-
 .../{weapons => welding}/weldbackpack.dm      |   0
 .../items/{tools => welding}/weldingtool.dm   | 144 ------------------
 .../objects/items/welding/weldingtool_tank.dm | 143 +++++++++++++++++
 nebula.dme                                    |   7 +-
 5 files changed, 152 insertions(+), 151 deletions(-)
 rename code/game/objects/items/{weapons => welding}/electric_welder.dm (86%)
 rename code/game/objects/items/{weapons => welding}/weldbackpack.dm (100%)
 rename code/game/objects/items/{tools => welding}/weldingtool.dm (72%)
 create mode 100644 code/game/objects/items/welding/weldingtool_tank.dm

diff --git a/code/game/objects/items/weapons/electric_welder.dm b/code/game/objects/items/welding/electric_welder.dm
similarity index 86%
rename from code/game/objects/items/weapons/electric_welder.dm
rename to code/game/objects/items/welding/electric_welder.dm
index cb949be907df..b3bd71761965 100644
--- a/code/game/objects/items/weapons/electric_welder.dm
+++ b/code/game/objects/items/welding/electric_welder.dm
@@ -42,10 +42,11 @@
 	var/obj/item/cell/cell = get_cell()
 	return cell ? cell.charge : 0
 
-/obj/item/weldingtool/electric/attackby(var/obj/item/W, var/mob/user)
-	if(istype(W,/obj/item/stack/material/rods) || istype(W, /obj/item/chems/welder_tank))
-		return FALSE // NO ELECTRIC FLAMETHROWER
-	return ..()
+/obj/item/weldingtool/electric/insert_tank(var/obj/item/chems/welder_tank/T, var/mob/user, var/no_updates = FALSE, var/quiet = FALSE)
+	return FALSE // No tanks!
+
+/obj/item/weldingtool/electric/attempt_modify(var/obj/item/W, var/mob/user)
+	return FALSE // NO ELECTRIC FLAMETHROWER
 
 /obj/item/weldingtool/electric/use_fuel(var/amount)
 	var/obj/item/cell/cell = get_cell()
diff --git a/code/game/objects/items/weapons/weldbackpack.dm b/code/game/objects/items/welding/weldbackpack.dm
similarity index 100%
rename from code/game/objects/items/weapons/weldbackpack.dm
rename to code/game/objects/items/welding/weldbackpack.dm
diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/welding/weldingtool.dm
similarity index 72%
rename from code/game/objects/items/tools/weldingtool.dm
rename to code/game/objects/items/welding/weldingtool.dm
index 615c00682916..6a2158acb84d 100644
--- a/code/game/objects/items/tools/weldingtool.dm
+++ b/code/game/objects/items/welding/weldingtool.dm
@@ -379,149 +379,5 @@
 	material = /decl/material/solid/metal/steel
 	matter   = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT)
 
-//////////////////////////////////////////////////////////////////
-// Welding tool tanks
-//////////////////////////////////////////////////////////////////
-/obj/item/chems/welder_tank
-	name               = "welding tank"
-	base_name          = "welding tank"
-	desc               = "An interchangeable fuel tank meant for a welding tool."
-	icon               = 'icons/obj/items/tool/welders/welder_tanks.dmi'
-	icon_state         = "tank_normal"
-	w_class            = ITEM_SIZE_SMALL
-	atom_flags         = ATOM_FLAG_OPEN_CONTAINER
-	obj_flags          = OBJ_FLAG_HOLLOW
-	volume             = 20
-	show_reagent_name  = TRUE
-	current_health     = 40
-	max_health         = 40
-	material           = /decl/material/solid/metal/steel
-	var/can_refuel     = TRUE
-	var/size_in_use    = ITEM_SIZE_NORMAL
-	var/unlit_force    = 7
-	var/lit_force      = 11
-
-/obj/item/chems/welder_tank/populate_reagents()
-	add_to_reagents(/decl/material/liquid/fuel, reagents.maximum_volume)
-
-/obj/item/chems/welder_tank/examine(mob/user, distance)
-	. = ..()
-	if(distance > 1)
-		return
-	if(reagents.total_volume <= 0)
-		to_chat(user, "It is empty.")
-	else
-		to_chat(user, "It contains [reagents.total_volume] units of liquid.")
-	to_chat(user, " It can hold up to [reagents.maximum_volume] units.")
-
-/obj/item/chems/welder_tank/afterattack(obj/O, mob/user, proximity, click_parameters)
-	if (!ATOM_IS_OPEN_CONTAINER(src) || !proximity)
-		return
-	if(standard_dispenser_refill(user, O))
-		return TRUE
-	if(standard_pour_into(user, O))
-		return TRUE
-	if(handle_eaten_by_mob(user, O) != EATEN_INVALID)
-		return TRUE
-	if(user.check_intent(I_FLAG_HARM))
-		if(standard_splash_mob(user, O))
-			return TRUE
-		if(reagents && reagents.total_volume)
-			to_chat(user, SPAN_DANGER("You splash the contents of \the [src] onto \the [O]."))
-			reagents.splash(O, reagents.total_volume)
-			return TRUE
-	return ..()
-
-/obj/item/chems/welder_tank/standard_dispenser_refill(mob/user, obj/structure/reagent_dispensers/target, skip_container_check = FALSE)
-	if(!can_refuel)
-		to_chat(user, SPAN_DANGER("\The [src] does not have a refuelling port."))
-		return FALSE
-	. = ..()
-	if(.)
-		playsound(src.loc, 'sound/effects/refill.ogg', 50, TRUE, -6)
-
-/obj/item/chems/welder_tank/standard_pour_into(mob/user, atom/target)
-	if(!can_refuel)
-		to_chat(user, SPAN_DANGER("\The [src] is sealed shut."))
-		return FALSE
-	. = ..()
-
-/obj/item/chems/welder_tank/standard_splash_mob(mob/user, mob/target)
-	if(!can_refuel)
-		to_chat(user, SPAN_DANGER("\The [src] is sealed shut."))
-		return FALSE
-	. = ..()
-
-/obj/item/chems/welder_tank/handle_eaten_by_mob(mob/user, mob/target)
-	if(!can_refuel)
-		to_chat(user, SPAN_DANGER("\The [src] is sealed shut."))
-		return EATEN_UNABLE
-	return ..()
-
-/obj/item/chems/welder_tank/get_alt_interactions(var/mob/user)
-	. = ..()
-	if(!can_refuel)
-		LAZYREMOVE(., /decl/interaction_handler/set_transfer/chems)
-
-/obj/item/chems/welder_tank/mini
-	name               = "small welding tank"
-	base_name          = "small welding tank"
-	icon_state         = "tank_small"
-	w_class            = ITEM_SIZE_TINY
-	volume             = 5
-	size_in_use        = ITEM_SIZE_SMALL
-	unlit_force        = 5
-	lit_force          = 7
-	_base_attack_force = 4
-
-/obj/item/chems/welder_tank/large
-	name               = "large welding tank"
-	base_name          = "large welding tank"
-	icon_state         = "tank_large"
-	w_class            = ITEM_SIZE_SMALL
-	volume             = 40
-	size_in_use        = ITEM_SIZE_NORMAL
-	_base_attack_force = 6
-
-/obj/item/chems/welder_tank/huge
-	name               = "huge welding tank"
-	base_name          = "huge welding tank"
-	icon_state         = "tank_huge"
-	w_class            = ITEM_SIZE_NORMAL
-	volume             = 80
-	size_in_use        = ITEM_SIZE_LARGE
-	unlit_force        = 9
-	lit_force          = 15
-	_base_attack_force = 8
-
-/obj/item/chems/welder_tank/experimental
-	name               = "experimental welding tank"
-	base_name          = "experimental welding tank"
-	icon_state         = "tank_experimental"
-	w_class            = ITEM_SIZE_NORMAL
-	volume             = 40
-	can_refuel         = FALSE
-	size_in_use        = ITEM_SIZE_LARGE
-	unlit_force        = 9
-	lit_force          = 15
-	show_reagent_name  = FALSE
-	_base_attack_force = 8
-	var/tmp/last_gen   = 0
-
-/obj/item/chems/welder_tank/experimental/Initialize(ml, material_key)
-	. = ..()
-	atom_flags &= ~ATOM_FLAG_OPEN_CONTAINER
-	START_PROCESSING(SSobj, src)
-
-/obj/item/chems/welder_tank/experimental/Destroy()
-	STOP_PROCESSING(SSobj, src)
-	return ..()
-
-/obj/item/chems/welder_tank/experimental/Process()
-	if(REAGENT_VOLUME(reagents, /decl/material/liquid/fuel) < reagents.maximum_volume)
-		var/gen_amount = ((world.time-last_gen)/25)
-		add_to_reagents(/decl/material/liquid/fuel, gen_amount)
-		last_gen = world.time
-
 #undef WELDING_TOOL_HOTSPOT_TEMP_ACTIVE
 #undef WELDING_TOOL_HOTSPOT_TEMP_IDLE
\ No newline at end of file
diff --git a/code/game/objects/items/welding/weldingtool_tank.dm b/code/game/objects/items/welding/weldingtool_tank.dm
new file mode 100644
index 000000000000..7b5b455663a0
--- /dev/null
+++ b/code/game/objects/items/welding/weldingtool_tank.dm
@@ -0,0 +1,143 @@
+//////////////////////////////////////////////////////////////////
+// Welding tool tanks
+//////////////////////////////////////////////////////////////////
+/obj/item/chems/welder_tank
+	name               = "welding tank"
+	base_name          = "welding tank"
+	desc               = "An interchangeable fuel tank meant for a welding tool."
+	icon               = 'icons/obj/items/tool/welders/welder_tanks.dmi'
+	icon_state         = "tank_normal"
+	w_class            = ITEM_SIZE_SMALL
+	atom_flags         = ATOM_FLAG_OPEN_CONTAINER
+	obj_flags          = OBJ_FLAG_HOLLOW
+	volume             = 20
+	show_reagent_name  = TRUE
+	current_health     = 40
+	max_health         = 40
+	material           = /decl/material/solid/metal/steel
+	var/can_refuel     = TRUE
+	var/size_in_use    = ITEM_SIZE_NORMAL
+	var/unlit_force    = 7
+	var/lit_force      = 11
+
+/obj/item/chems/welder_tank/populate_reagents()
+	add_to_reagents(/decl/material/liquid/fuel, reagents.maximum_volume)
+
+/obj/item/chems/welder_tank/examine(mob/user, distance)
+	. = ..()
+	if(distance > 1)
+		return
+	if(reagents.total_volume <= 0)
+		to_chat(user, "It is empty.")
+	else
+		to_chat(user, "It contains [reagents.total_volume] units of liquid.")
+	to_chat(user, " It can hold up to [reagents.maximum_volume] units.")
+
+/obj/item/chems/welder_tank/afterattack(obj/O, mob/user, proximity, click_parameters)
+	if (!ATOM_IS_OPEN_CONTAINER(src) || !proximity)
+		return
+	if(standard_dispenser_refill(user, O))
+		return TRUE
+	if(standard_pour_into(user, O))
+		return TRUE
+	if(handle_eaten_by_mob(user, O) != EATEN_INVALID)
+		return TRUE
+	if(user.check_intent(I_FLAG_HARM))
+		if(standard_splash_mob(user, O))
+			return TRUE
+		if(reagents && reagents.total_volume)
+			to_chat(user, SPAN_DANGER("You splash the contents of \the [src] onto \the [O]."))
+			reagents.splash(O, reagents.total_volume)
+			return TRUE
+	return ..()
+
+/obj/item/chems/welder_tank/standard_dispenser_refill(mob/user, obj/structure/reagent_dispensers/target, skip_container_check = FALSE)
+	if(!can_refuel)
+		to_chat(user, SPAN_DANGER("\The [src] does not have a refuelling port."))
+		return FALSE
+	. = ..()
+	if(.)
+		playsound(src.loc, 'sound/effects/refill.ogg', 50, TRUE, -6)
+
+/obj/item/chems/welder_tank/standard_pour_into(mob/user, atom/target)
+	if(!can_refuel)
+		to_chat(user, SPAN_DANGER("\The [src] is sealed shut."))
+		return FALSE
+	. = ..()
+
+/obj/item/chems/welder_tank/standard_splash_mob(mob/user, mob/target)
+	if(!can_refuel)
+		to_chat(user, SPAN_DANGER("\The [src] is sealed shut."))
+		return FALSE
+	. = ..()
+
+/obj/item/chems/welder_tank/handle_eaten_by_mob(mob/user, mob/target)
+	if(!can_refuel)
+		to_chat(user, SPAN_DANGER("\The [src] is sealed shut."))
+		return EATEN_UNABLE
+	return ..()
+
+/obj/item/chems/welder_tank/get_alt_interactions(var/mob/user)
+	. = ..()
+	if(!can_refuel)
+		LAZYREMOVE(., /decl/interaction_handler/set_transfer/chems)
+
+/obj/item/chems/welder_tank/mini
+	name               = "small welding tank"
+	base_name          = "small welding tank"
+	icon_state         = "tank_small"
+	w_class            = ITEM_SIZE_TINY
+	volume             = 5
+	size_in_use        = ITEM_SIZE_SMALL
+	unlit_force        = 5
+	lit_force          = 7
+	_base_attack_force = 4
+
+/obj/item/chems/welder_tank/large
+	name               = "large welding tank"
+	base_name          = "large welding tank"
+	icon_state         = "tank_large"
+	w_class            = ITEM_SIZE_SMALL
+	volume             = 40
+	size_in_use        = ITEM_SIZE_NORMAL
+	_base_attack_force = 6
+
+/obj/item/chems/welder_tank/huge
+	name               = "huge welding tank"
+	base_name          = "huge welding tank"
+	icon_state         = "tank_huge"
+	w_class            = ITEM_SIZE_NORMAL
+	volume             = 80
+	size_in_use        = ITEM_SIZE_LARGE
+	unlit_force        = 9
+	lit_force          = 15
+	_base_attack_force = 8
+
+/obj/item/chems/welder_tank/experimental
+	name               = "experimental welding tank"
+	base_name          = "experimental welding tank"
+	icon_state         = "tank_experimental"
+	w_class            = ITEM_SIZE_NORMAL
+	volume             = 40
+	can_refuel         = FALSE
+	size_in_use        = ITEM_SIZE_LARGE
+	unlit_force        = 9
+	lit_force          = 15
+	show_reagent_name  = FALSE
+	_base_attack_force = 8
+	var/tmp/last_gen   = 0
+
+/obj/item/chems/welder_tank/experimental/Initialize(ml, material_key)
+	. = ..()
+	atom_flags &= ~ATOM_FLAG_OPEN_CONTAINER
+	START_PROCESSING(SSobj, src)
+
+/obj/item/chems/welder_tank/experimental/Destroy()
+	STOP_PROCESSING(SSobj, src)
+	return ..()
+
+/obj/item/chems/welder_tank/experimental/Process()
+	if(REAGENT_VOLUME(reagents, /decl/material/liquid/fuel) < reagents.maximum_volume)
+		var/gen_amount = ((world.time-last_gen)/25)
+		add_to_reagents(/decl/material/liquid/fuel, gen_amount)
+		last_gen = world.time
\ No newline at end of file
diff --git a/nebula.dme b/nebula.dme
index 5bd4f680377d..0e7b6835974a 100644
--- a/nebula.dme
+++ b/nebula.dme
@@ -1840,7 +1840,6 @@
 #include "code\game\objects\items\tools\crowbar.dm"
 #include "code\game\objects\items\tools\screwdriver.dm"
 #include "code\game\objects\items\tools\shears.dm"
-#include "code\game\objects\items\tools\weldingtool.dm"
 #include "code\game\objects\items\tools\wirecutter.dm"
 #include "code\game\objects\items\tools\wrench.dm"
 #include "code\game\objects\items\weapons\AI_modules.dm"
@@ -1856,7 +1855,6 @@
 #include "code\game\objects\items\weapons\defib.dm"
 #include "code\game\objects\items\weapons\dice.dm"
 #include "code\game\objects\items\weapons\ecigs.dm"
-#include "code\game\objects\items\weapons\electric_welder.dm"
 #include "code\game\objects\items\weapons\explosives.dm"
 #include "code\game\objects\items\weapons\extinguisher.dm"
 #include "code\game\objects\items\weapons\flamethrower.dm"
@@ -1884,7 +1882,6 @@
 #include "code\game\objects\items\weapons\towels.dm"
 #include "code\game\objects\items\weapons\traps.dm"
 #include "code\game\objects\items\weapons\weaponry.dm"
-#include "code\game\objects\items\weapons\weldbackpack.dm"
 #include "code\game\objects\items\weapons\grenades\anti_photon_grenade.dm"
 #include "code\game\objects\items\weapons\grenades\chem_grenade.dm"
 #include "code\game\objects\items\weapons\grenades\decompiler.dm"
@@ -1959,6 +1956,10 @@
 #include "code\game\objects\items\weapons\tanks\jetpack.dm"
 #include "code\game\objects\items\weapons\tanks\tank_types.dm"
 #include "code\game\objects\items\weapons\tanks\tanks.dm"
+#include "code\game\objects\items\welding\electric_welder.dm"
+#include "code\game\objects\items\welding\weldbackpack.dm"
+#include "code\game\objects\items\welding\weldingtool.dm"
+#include "code\game\objects\items\welding\weldingtool_tank.dm"
 #include "code\game\objects\random\_random.dm"
 #include "code\game\objects\random\date_based.dm"
 #include "code\game\objects\random\random.dm"

From a09b11a33f0f1d2545cb93c5c10a37bd2df9ec71 Mon Sep 17 00:00:00 2001
From: Penelope Haze <out.of.p.haze@proton.me>
Date: Thu, 30 Jan 2025 02:12:49 -0500
Subject: [PATCH 12/13] Rename teleportation.dm to locator.dm

---
 .../items/weapons/{teleportation.dm => locator.dm}        | 8 +-------
 nebula.dme                                                | 2 +-
 2 files changed, 2 insertions(+), 8 deletions(-)
 rename code/game/objects/items/weapons/{teleportation.dm => locator.dm} (96%)

diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/locator.dm
similarity index 96%
rename from code/game/objects/items/weapons/teleportation.dm
rename to code/game/objects/items/weapons/locator.dm
index 3cb9f4a5dfcd..a6ad7b1def9d 100644
--- a/code/game/objects/items/weapons/teleportation.dm
+++ b/code/game/objects/items/weapons/locator.dm
@@ -1,15 +1,9 @@
-/* Teleportation devices.
- * Contains:
- *		Locator
- *		Hand-tele
- */
-
 /*
  * Locator
  */
 /obj/item/locator
 	name = "locator"
-	desc = "Used to track those with locater implants."
+	desc = "Used to track those with locator implants."
 	icon = 'icons/obj/items/device/locator.dmi'
 	icon_state = ICON_STATE_WORLD
 	var/temp = null
diff --git a/nebula.dme b/nebula.dme
index 0e7b6835974a..7e1477b0de2a 100644
--- a/nebula.dme
+++ b/nebula.dme
@@ -1862,6 +1862,7 @@
 #include "code\game\objects\items\weapons\handcuffs.dm"
 #include "code\game\objects\items\weapons\ironing_iron.dm"
 #include "code\game\objects\items\weapons\janitor_sign.dm"
+#include "code\game\objects\items\weapons\locator.dm"
 #include "code\game\objects\items\weapons\mop.dm"
 #include "code\game\objects\items\weapons\nuclear_cylinder.dm"
 #include "code\game\objects\items\weapons\paint.dm"
@@ -1878,7 +1879,6 @@
 #include "code\game\objects\items\weapons\swords_axes_etc.dm"
 #include "code\game\objects\items\weapons\tape.dm"
 #include "code\game\objects\items\weapons\tech_disks.dm"
-#include "code\game\objects\items\weapons\teleportation.dm"
 #include "code\game\objects\items\weapons\towels.dm"
 #include "code\game\objects\items\weapons\traps.dm"
 #include "code\game\objects\items\weapons\weaponry.dm"

From 030c5b66e2e598aaad76471c366d60c9d99cf585 Mon Sep 17 00:00:00 2001
From: Penelope Haze <out.of.p.haze@proton.me>
Date: Thu, 30 Jan 2025 02:20:07 -0500
Subject: [PATCH 13/13] Move barricade tape into modules

---
 code/game/objects/items/weapons/policetape.dm | 569 ------------------
 code/modules/barricade_tape/barricade_tape.dm | 252 ++++++++
 .../barricade_tape/barricade_tape_roll.dm     | 151 +++++
 .../barricade_tape/barricade_tape_subtypes.dm | 136 +++++
 .../barricade_tape/barricade_tape_template.dm |  26 +
 nebula.dme                                    |   5 +-
 6 files changed, 569 insertions(+), 570 deletions(-)
 delete mode 100644 code/game/objects/items/weapons/policetape.dm
 create mode 100644 code/modules/barricade_tape/barricade_tape.dm
 create mode 100644 code/modules/barricade_tape/barricade_tape_roll.dm
 create mode 100644 code/modules/barricade_tape/barricade_tape_subtypes.dm
 create mode 100644 code/modules/barricade_tape/barricade_tape_template.dm

diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm
deleted file mode 100644
index 81ae83daba05..000000000000
--- a/code/game/objects/items/weapons/policetape.dm
+++ /dev/null
@@ -1,569 +0,0 @@
-#define MAX_BARRICADE_TAPE_LENGTH 32                //Maximum length of a continuous line of tape someone can place down.
-#define TAPE_BARRICADE_V_NEIGHBORS (NORTH | SOUTH)
-#define TAPE_BARRICADE_H_NEIGHBORS (EAST  | WEST)
-#define TAPE_BARRICADE_IS_CORNER_NEIGHBORS(X) ((X ^ TAPE_BARRICADE_V_NEIGHBORS) && (X ^ TAPE_BARRICADE_H_NEIGHBORS))
-#define TAPE_BARRICADE_IS_V_NEIGHBORS(X) ((X & TAPE_BARRICADE_V_NEIGHBORS) == TAPE_BARRICADE_V_NEIGHBORS && !((X & TAPE_BARRICADE_H_NEIGHBORS) == TAPE_BARRICADE_H_NEIGHBORS)) //Check we have neighbors connection on the vertical plane
-#define TAPE_BARRICADE_IS_H_NEIGHBORS(X) ((X & TAPE_BARRICADE_H_NEIGHBORS) == TAPE_BARRICADE_H_NEIGHBORS && !((X & TAPE_BARRICADE_V_NEIGHBORS) == TAPE_BARRICADE_V_NEIGHBORS)) //Check we have neighbors connection on the horizontal plane
-#define TAPE_BARRICADE_IS_3W_V_NEIGHBORS(X) (TAPE_BARRICADE_IS_V_NEIGHBORS(X) && ((X & TAPE_BARRICADE_H_NEIGHBORS) > 0))
-#define TAPE_BARRICADE_IS_3W_H_NEIGHBORS(X) (TAPE_BARRICADE_IS_H_NEIGHBORS(X) && ((X & TAPE_BARRICADE_V_NEIGHBORS) > 0))
-#define TAPE_BARRICADE_IS_4W_NEIGHBORS(X) (((X & TAPE_BARRICADE_V_NEIGHBORS) == TAPE_BARRICADE_V_NEIGHBORS) && ((X & TAPE_BARRICADE_H_NEIGHBORS) == TAPE_BARRICADE_H_NEIGHBORS))
-#define CONNECTION_BITS_TO_TEXT(X) "[(X & WEST) > 0][(X & EAST) > 0][(X & SOUTH) > 0][(X & NORTH) > 0]"
-#define TAPE_BARRICADE_GET_NB_NEIGHBORS(X) (((X & NORTH) > 0) + ((X & SOUTH) > 0) + ((X & EAST) > 0) + ((X & WEST) > 0))
-
-var/global/list/image/hazard_overlays //Cached hazard floor overlays for the barricade tape
-
-////////////////////////////////////////////////////////////////////
-// Barricade Tape Template
-////////////////////////////////////////////////////////////////////
-//Singletons with data on the various templates of barricade tape
-/decl/barricade_tape_template
-	var/tape_kind         = "barricade"                   //Used as a prefix to the word "tape" when refering to the tape and roll
-	var/tape_desc         = "A tape barricade."           //Description for the tape barricade
-	var/roll_desc         = "A roll of barricade tape."   //Description for the tape roll
-	var/icon_file         = 'icons/policetape.dmi'        //Icon file used for both the tape and roll
-	var/base_icon_state   = "tape"                        //For the barricade. Icon state used to fetch the applied tape directional icons for various states
-	var/list/req_access                                   //Access required to automatically pass through tape barricades
-	var/tape_color                                        //Color of the tape
-	var/detail_overlay                                    //Overlay for the applied tape
-	var/detail_color                                      //Color for the detail overlay
-
-/decl/barricade_tape_template/proc/make_line_barricade(var/mob/user, var/turf/T, var/pdir)
-	var/obj/structure/tape_barricade/bar = new(T,,,src)
-	bar.add_fingerprint(user)
-	return bar
-
-/decl/barricade_tape_template/proc/make_door_barricade(var/mob/user, var/obj/door)
-	var/obj/structure/tape_barricade/door/bar = new(get_turf(door))
-	bar.set_tape_template(src)
-	bar.set_dir(door.dir)
-	bar.add_fingerprint(user)
-	return bar
-
-////////////////////////////////////////////////////////////////////
-// Barricade Tape Roll
-////////////////////////////////////////////////////////////////////
-/obj/item/stack/tape_roll/barricade_tape
-	name               = "barricade tape roll"
-	desc               = "A roll of high visibility, non-sticky barricade tape. Used to deter passersby from crossing it."
-	icon               = 'icons/policetape.dmi'
-	icon_state         = "tape"
-	w_class            = ITEM_SIZE_SMALL
-	var/tmp/turf/start                             //The turf we started unrolling from
-	var/tmp/weakref/unroller                       //The mob currently unrolling us
-	var/decl/barricade_tape_template/tape_template //Template containing details on how the tape roll will look and behave, along with what it will place down
-
-/obj/item/stack/tape_roll/barricade_tape/Initialize()
-	. = ..()
-	apply_template()
-
-/obj/item/stack/tape_roll/barricade_tape/Destroy()
-	stop_unrolling()
-	return ..()
-
-/**Update our appearence and data to match the specified tape template. */
-/obj/item/stack/tape_roll/barricade_tape/proc/apply_template()
-	if(ispath(tape_template))
-		tape_template = GET_DECL(tape_template)
-	if(!tape_template)
-		return
-
-	SetName("[tape_template.tape_kind] tape roll")
-	desc = tape_template.roll_desc
-	icon = tape_template.icon_file
-	set_color(tape_template.tape_color)
-	update_icon()
-
-/obj/item/stack/tape_roll/barricade_tape/on_update_icon()
-	. = ..()
-	if(ismob(loc))
-		add_overlay(overlay_image(icon, start? "stop" : "start", flags = RESET_COLOR))
-
-/obj/item/stack/tape_roll/barricade_tape/dropped(mob/user)
-	stop_unrolling()
-	update_icon()
-	return ..()
-
-/obj/item/stack/tape_roll/barricade_tape/on_picked_up(mob/user)
-	stop_unrolling()
-	update_icon()
-	return ..()
-
-/obj/item/stack/tape_roll/barricade_tape/attack_hand()
-	. = ..()
-	if(. && !QDELETED(src))
-		update_icon()
-
-/**Callback used when whoever holds us moved to a new turf. */
-/obj/item/stack/tape_roll/barricade_tape/proc/user_moved_unrolling(var/mob/M, var/atom/old_loc, var/atom/new_loc)
-	if(QDELETED(src))
-		return //Destructor will handle the rest
-	if(QDELETED(M) || !can_use(1) || M.incapacitated())
-		stop_unrolling()
-		return
-
-	if((old_loc.x != new_loc.x && old_loc.y != new_loc.y) || old_loc.z != new_loc.z)
-		to_chat(M, SPAN_WARNING("\The [src] can only be laid horizontally or vertically."))
-		stop_unrolling()
-		return
-	//Use a length of tape and place a barricade line
-	if(!place_line(M, new_loc, get_dir(old_loc, new_loc)))
-		stop_unrolling()
-		return
-	if(get_dist(start, new_loc) >= MAX_BARRICADE_TAPE_LENGTH)
-		to_chat(M, SPAN_WARNING("You've stretched this line of tape to the maximum!"))
-		stop_unrolling()
-		return
-
-/obj/item/stack/tape_roll/barricade_tape/proc/stop_unrolling()
-	if(!start && !unroller)
-		return
-	var/mob/_uroller = unroller.resolve()
-	if(_uroller)
-		events_repository.unregister(/decl/observ/moved, _uroller, src, PROC_REF(user_moved_unrolling))
-	unroller         = null
-	start            = null
-	slowdown_general = initial(slowdown_general)
-	if(_uroller)
-		to_chat(_uroller, SPAN_NOTICE("You stop unrolling \the [src]."))
-	if(!QDELETED(src))
-		update_icon()
-	return TRUE
-
-/obj/item/stack/tape_roll/barricade_tape/proc/start_unrolling(var/mob/user)
-	if(start && unroller)
-		return
-	start    = get_turf(src)
-	unroller = weakref(user)
-	slowdown_general = initial(slowdown_general) + 2 //While unrolling you're slightly slower
-	events_repository.unregister(/decl/observ/moved, user, src, PROC_REF(user_moved_unrolling))
-	events_repository.register(/decl/observ/moved, user, src, PROC_REF(user_moved_unrolling))
-	to_chat(user, SPAN_NOTICE("You start unrolling \the [src]."))
-	//Place the first one immediately
-	place_line(user, get_turf(user), user.dir)
-	update_icon()
-	return TRUE
-
-/**Place a tape line on the current turf. */
-/obj/item/stack/tape_roll/barricade_tape/proc/place_line(var/mob/user, var/turf/T, var/pdir)
-	if(!T || T.is_open() || T.is_wall())
-		to_chat(user, SPAN_WARNING("You can't place tape here!"))
-		return
-	if(locate(/obj/structure/tape_barricade) in T)
-		return //Can't place 2 on the same tile!
-
-	if(!can_use(1))
-		to_chat(user, SPAN_WARNING("You are out of [tape_template.tape_kind] tape!"))
-		return
-	use(1)
-	playsound(user, 'sound/effects/pageturn2.ogg', 50, TRUE)
-
-	var/obj/structure/tape_barricade/barricade = tape_template.make_line_barricade(user, T, pdir)
-	if(barricade)
-		barricade.matter = matter_per_piece?.Copy()
-		barricade.update_neighbors()
-	return barricade
-
-/obj/item/stack/tape_roll/barricade_tape/attack_self(mob/user)
-	if(start)
-		stop_unrolling()
-		return
-	if(!can_use(1))
-		return //This shouldn't happen, but if it does, don't let them exploit it
-
-	start_unrolling(user)
-
-/obj/item/stack/tape_roll/barricade_tape/afterattack(var/atom/A, mob/user, proximity)
-	if(!proximity)
-		return
-
-	if (istype(A, /obj/machinery/door/airlock))
-		if(!can_use(4))
-			to_chat(user, SPAN_WARNING("There isn't enough [plural_name] in \the [src] to barricade \the [A]. You need at least 4 [plural_name]."))
-			return
-
-		var/obj/structure/tape_barricade/door/bar = tape_template.make_door_barricade(user, A)
-		if(bar)
-			bar.matter = matter_per_piece?.Copy()
-			if(bar.matter)
-				for(var/mat in bar.matter)
-					bar.matter[mat] = round(bar.matter[mat] * 4)
-
-		to_chat(user, SPAN_NOTICE("You finish placing \the [src]."))
-		use(4)
-
-////////////////////////////////////////////////////////////////////
-// Tape Line Barricade
-////////////////////////////////////////////////////////////////////
-/obj/structure/tape_barricade
-	name             = "tape line"
-	desc             = "A line of barricade tape."
-	icon             = 'icons/policetape.dmi'
-	icon_state       = "tape_2w_0"
-	dir              = SOUTH                          //This structure will try to turn its icon depending on what neighbors it has
-	layer            = ABOVE_DOOR_LAYER
-	pass_flags       = PASS_FLAG_TABLE                //About the height of table
-	anchored         = TRUE
-	material         = /decl/material/solid/organic/plastic
-	current_health   = 5
-	var/neighbors    = 0                              //Contains all the direction flags of all the neighboring tape_barricades
-	var/is_lifted    = 0                              //Whether the tape is lifted and we're allowing everyone passage.
-	var/is_crumpled  = 0                              //Whether the tape was damaged
-	var/decl/barricade_tape_template/tape_template   //Details about the behavior and looks of the barricade
-
-/obj/structure/tape_barricade/Initialize(ml, _mat, _reinf_mat, var/decl/barricade_tape_template/_tape_template)
-	. = ..()
-	if(!hazard_overlays)
-		hazard_overlays = list()
-		hazard_overlays["[NORTH]"]	= new/image('icons/effects/warning_stripes.dmi', icon_state = "N")
-		hazard_overlays["[EAST]"]	= new/image('icons/effects/warning_stripes.dmi', icon_state = "E")
-		hazard_overlays["[SOUTH]"]	= new/image('icons/effects/warning_stripes.dmi', icon_state = "S")
-		hazard_overlays["[WEST]"]	= new/image('icons/effects/warning_stripes.dmi', icon_state = "W")
-	set_tape_template(_tape_template)
-
-/obj/structure/tape_barricade/LateInitialize()
-	. = ..()
-	build_connection_bits()
-	update_neighbors()
-
-/obj/structure/tape_barricade/Destroy()
-	var/turf/old_loc = get_turf(src)
-	. = ..()
-	if(istype(old_loc))
-		update_neighbors(old_loc)
-
-/obj/structure/tape_barricade/proc/set_tape_template(var/decl/barricade_tape_template/tmpl)
-	if(tmpl)
-		tape_template = tmpl
-	if(ispath(tape_template))
-		tape_template = GET_DECL(tape_template)
-	if(!tape_template)
-		return
-
-	SetName("[tape_template.tape_kind] tape line")
-	desc       = tape_template.tape_desc
-	icon       = tape_template.icon_file
-	req_access = tape_template.req_access
-	set_color(tape_template.tape_color)
-	update_icon()
-
-/**Cause neighbors to update their icon. */
-/obj/structure/tape_barricade/proc/update_neighbors(var/location = loc)
-	for (var/look_dir in global.cardinal)
-		var/obj/structure/tape_barricade/B = locate(/obj/structure/tape_barricade, get_step(location, look_dir))
-		if(!QDELETED(B))
-			B.update_icon()
-
-	if(!QDELETED(src))
-		update_icon()
-
-/**Updates our connection bits to keep track of the things we're connected to */
-/obj/structure/tape_barricade/proc/build_connection_bits()
-	neighbors = 0
-	for (var/look_dir in global.cardinal)
-		var/turf/target_turf = get_step(src, look_dir)
-		if(target_turf)
-			var/obj/structure/tape_barricade/B = locate(/obj/structure/tape_barricade) in target_turf
-			//We connect to walls and other tape_barricades
-			if((B && !QDELETED(B)) || (!B && target_turf.is_wall()))
-				neighbors |= look_dir
-
-/**Allow sutypes to override with their own forced icon state name.*/
-/obj/structure/tape_barricade/proc/icon_name_override()
-	return
-
-/obj/structure/tape_barricade/on_update_icon()
-	. = ..()
-	if(isnull(tape_template) || ispath(tape_template))
-		return
-	//Look up our neighbors
-	build_connection_bits()
-
-	var/icon_name = icon_name_override()
-	if(!icon_name)
-		//Build the icon state from whethere we've got a right angle with out neighbors or not
-		if(TAPE_BARRICADE_IS_4W_NEIGHBORS(neighbors))
-			set_dir(SOUTH)
-			icon_name = "4w"
-
-		//3 Ways
-		else if(TAPE_BARRICADE_IS_3W_H_NEIGHBORS(neighbors))
-			set_dir(neighbors & TAPE_BARRICADE_V_NEIGHBORS)
-			icon_name = "3w"
-		else if(TAPE_BARRICADE_IS_3W_V_NEIGHBORS(neighbors))
-			set_dir(neighbors & TAPE_BARRICADE_H_NEIGHBORS)
-			icon_name = "3w"
-
-		//Lines
-		else if(TAPE_BARRICADE_IS_H_NEIGHBORS(neighbors))
-			set_dir(EAST)
-			icon_name = "2w"
-		else if(TAPE_BARRICADE_IS_V_NEIGHBORS(neighbors))
-			set_dir(SOUTH)
-			icon_name = "2w"
-
-		//Endpoints/corners
-		else
-			if(neighbors > 0)
-				set_dir(neighbors) //Make sure if we have no connections we don't set a bad dir
-			icon_name = "dir"
-
-	icon_state = "[tape_template.base_icon_state]_[icon_name]_[is_crumpled]"
-
-	//Overlays
-	if(tape_template.detail_overlay)
-		var/image/ovr = overlay_image(icon, "[tape_template.base_icon_state]_[icon_name]_[tape_template.detail_overlay]", tape_template.detail_color, RESET_COLOR)
-		ovr.dir = dir
-		add_overlay(ovr)
-
-/obj/structure/tape_barricade/attack_hand(mob/user)
-
-	if(user.check_intent(I_FLAG_HARM))
-		user.visible_message(SPAN_DANGER("\The [user] tears \the [src]!"))
-		physically_destroyed()
-		return TRUE
-
-	if (!user.check_intent(I_FLAG_HELP) || !allowed(user) || !user.check_dexterity(DEXTERITY_SIMPLE_MACHINES, TRUE))
-		return ..()
-
-	if(TAPE_BARRICADE_IS_CORNER_NEIGHBORS(neighbors) || (TAPE_BARRICADE_GET_NB_NEIGHBORS(neighbors) > 2))
-		to_chat(user, SPAN_WARNING("You can't lift up the pole. Try lifting the line itself."))
-		return TRUE
-
-	if(!allowed(user))
-		user.visible_message(SPAN_NOTICE("\The [user] carelessly pulls \the [src] out of the way."))
-		crumple()
-	else
-		user.visible_message(SPAN_NOTICE("\The [user] lifts \the [src], officially allowing passage."))
-
-	for(var/obj/structure/tape_barricade/B in get_tape_line())
-		B.lift(10 SECONDS) //~10 seconds
-	return TRUE
-
-/obj/structure/tape_barricade/dismantle_structure(mob/user)
-	for (var/obj/structure/tape_barricade/B in get_tape_line())
-		if(B == src || QDELETED(B))
-			continue
-		if(B.neighbors & get_dir(B, src))
-			B.physically_destroyed()
-	. = ..()
-
-/obj/structure/tape_barricade/CanPass(atom/movable/mover, turf/target, height, air_group)
-	if(!is_lifted && ismob(mover))
-		var/mob/M = mover
-		if (!allowed(M) && M.check_intent(I_FLAG_HELP))
-			return FALSE
-	return ..()
-
-/obj/structure/tape_barricade/Crossed(atom/movable/AM)
-	. = ..()
-	if(is_lifted || !isliving(AM))
-		return
-	var/mob/living/M = AM
-	add_fingerprint(M)
-	shake_animation(2)
-	if (!allowed(M))	//only select few learn art of not crumpling the tape
-		to_chat(M, SPAN_NOTICE("You are not supposed to go past \the [src]..."))
-		if(!M.check_intent(I_FLAG_HELP))
-			crumple()
-
-/obj/structure/tape_barricade/proc/crumple()
-	if(!is_crumpled)
-		playsound(src, 'sound/effects/rip1.ogg', 60, TRUE)
-		take_damage(5)
-		is_crumpled = TRUE
-		update_icon()
-
-/**Temporarily lifts the tape line, allowing passage to anyone for the specified time, until the timer expires. */
-/obj/structure/tape_barricade/proc/lift(var/time)
-	if(!is_lifted)
-		is_lifted = TRUE
-		layer = ABOVE_HUMAN_LAYER
-		pass_flags = PASS_FLAG_MOB
-		pixel_y += 8
-		addtimer(CALLBACK(src, PROC_REF(on_unlift)), time, TIMER_UNIQUE)
-		playsound(src, 'sound/effects/pageturn2.ogg', 50, TRUE)
-
-/**Called by timer when the tape line falls back in place. */
-/obj/structure/tape_barricade/proc/on_unlift()
-	is_lifted = FALSE
-	pass_flags = initial(pass_flags)
-	reset_plane_and_layer()
-	pixel_y -= 8
-	playsound(src, 'sound/effects/pageturn2.ogg', 20, TRUE)
-
-// Returns a list of all tape objects connected to src, including itself.
-/obj/structure/tape_barricade/proc/get_tape_line(var/list/ignored, var/line_index = 0)
-	//Don't include more in the line than this
-	if(line_index >= MAX_BARRICADE_TAPE_LENGTH)
-		return list()
-
-	var/list/dirs = list()
-	if(neighbors & NORTH)
-		dirs += NORTH
-	if(neighbors & SOUTH)
-		dirs += SOUTH
-	if(neighbors & WEST)
-		dirs += WEST
-	if(neighbors & EAST)
-		dirs += EAST
-
-	//Grab all cached connected neighbors
-	LAZYDISTINCTADD(ignored, src)
-	var/list/obj/structure/tape_barricade/tapeline = list(src)
-	for(var/look_dir in dirs)
-		var/turf/T = get_step(src, look_dir)
-		var/obj/structure/tape_barricade/B = locate() in T
-		if(!QDELETED(B) && !(B in ignored))
-			if(TAPE_BARRICADE_IS_CORNER_NEIGHBORS(neighbors) || (TAPE_BARRICADE_GET_NB_NEIGHBORS(neighbors) > 2))
-				continue //We stop at intersections, and corners
-			tapeline += B.get_tape_line(ignored, line_index + 1) //Pass us to prevent infinite loops, and adding us to the resulting line
-	return tapeline
-
-////////////////////////////////////////////////////////////////////
-// Door Tape Barricade
-////////////////////////////////////////////////////////////////////
-
-//Barricade over a single door
-/obj/structure/tape_barricade/door
-	icon_state = "tape_door_0"
-	layer      = ABOVE_DOOR_LAYER
-
-/obj/structure/tape_barricade/door/update_neighbors()
-	//We completely ignore neighbors
-	neighbors = 0
-
-/obj/structure/tape_barricade/door/icon_name_override()
-	return "door" //Override the icon picking to pick this icon label instead
-
-////////////////////////////////////////////////////////////////////
-// Police Tape
-////////////////////////////////////////////////////////////////////
-/decl/barricade_tape_template/police
-	tape_kind  = "police"
-	tape_desc  = "A length of police tape.  Do not cross."
-	roll_desc  = "A roll of police tape used to block off crime scenes from the public."
-	tape_color = COLOR_RED
-	req_access = list(access_security)
-
-/obj/item/stack/tape_roll/barricade_tape/police
-	tape_template = /decl/barricade_tape_template/police
-
-//mapper type
-/obj/structure/tape_barricade/police
-	icon_state    = "tape_door_0"
-	color         = COLOR_RED
-	tape_template = /decl/barricade_tape_template/police
-
-////////////////////////////////////////////////////////////////////
-// Engineering Tape
-////////////////////////////////////////////////////////////////////
-/decl/barricade_tape_template/engineering
-	tape_kind  = "engineering"
-	tape_desc  = "A length of engineering tape. Better not cross it."
-	roll_desc  = "A roll of engineering tape used to block off working areas from the public."
-	tape_color = COLOR_ORANGE
-	req_access = list(list(access_engine,access_atmospherics))
-
-/obj/item/stack/tape_roll/barricade_tape/engineering
-	tape_template = /decl/barricade_tape_template/engineering
-
-//mapper type
-/obj/structure/tape_barricade/engineering
-	icon_state    = "stripetape_door_0"
-	color         = COLOR_ORANGE
-	tape_template = /decl/barricade_tape_template/engineering
-
-////////////////////////////////////////////////////////////////////
-// Atmospheric Tape
-////////////////////////////////////////////////////////////////////
-/decl/barricade_tape_template/atmos
-	tape_kind       = "atmospherics"
-	tape_desc       = "A length of atmospherics tape. Better not cross it."
-	roll_desc       = "A roll of atmospherics tape used to block off working areas from the public."
-	tape_color      = COLOR_BLUE_LIGHT
-	req_access      = list(list(access_engine,access_atmospherics))
-	base_icon_state = "stripetape"
-	detail_overlay  = "stripes"
-	detail_color    = COLOR_YELLOW
-
-/obj/item/stack/tape_roll/barricade_tape/atmos
-	tape_template = /decl/barricade_tape_template/atmos
-
-//mapper type
-/obj/structure/tape_barricade/atmos
-	icon_state    = "stripetape_h_0"
-	color         = COLOR_BLUE_LIGHT
-	tape_template = /decl/barricade_tape_template/atmos
-
-////////////////////////////////////////////////////////////////////
-// Research Tape
-////////////////////////////////////////////////////////////////////
-/decl/barricade_tape_template/research
-	tape_kind  = "research"
-	tape_desc  = "A length of research tape. Better not cross it."
-	roll_desc  = "A roll of research tape used to block off working areas from the public."
-	tape_color = COLOR_WHITE
-	req_access = list(access_research)
-
-/obj/item/stack/tape_roll/barricade_tape/research
-	tape_template = /decl/barricade_tape_template/research
-
-//mapper type
-/obj/structure/tape_barricade/research
-	color         = COLOR_WHITE
-	tape_template = /decl/barricade_tape_template/research
-
-////////////////////////////////////////////////////////////////////
-// Medical Tape
-////////////////////////////////////////////////////////////////////
-/decl/barricade_tape_template/medical
-	tape_kind       = "medical"
-	tape_desc       = "A length of medical tape. Better not cross it."
-	roll_desc       = "A roll of medical tape used to block off working areas from the public."
-	tape_color      = COLOR_PALE_BLUE_GRAY
-	req_access      = list(access_medical)
-	base_icon_state = "stripetape"
-	detail_overlay  = "stripes"
-	detail_color    = COLOR_PALE_BLUE_GRAY
-
-/obj/item/stack/tape_roll/barricade_tape/medical
-	tape_template = /decl/barricade_tape_template/medical
-
-//mapper type
-/obj/structure/tape_barricade/medical
-	icon_state    = "stripetape_h_0"
-	color         = COLOR_PALE_BLUE_GRAY
-	tape_template = /decl/barricade_tape_template/medical
-
-////////////////////////////////////////////////////////////////////
-// Bureacratic Tape
-////////////////////////////////////////////////////////////////////
-/decl/barricade_tape_template/bureaucracy
-	tape_kind       = "red"
-	tape_desc       = "A length of bureaucratic red tape. Safely ignored, but darn obstructive sometimes."
-	roll_desc       = "A roll of bureaucratic red tape used to block any meaningful work from being done."
-	tape_color      = COLOR_RED
-	base_icon_state = "stripetape"
-	detail_overlay  = "stripes"
-	detail_color    = COLOR_RED
-
-/obj/item/stack/tape_roll/barricade_tape/bureaucracy
-	tape_template = /decl/barricade_tape_template/bureaucracy
-
-//mapper type
-/obj/structure/tape_barricade/bureaucracy
-	icon_state    = "stripetape_h_0"
-	color         = COLOR_RED
-	tape_template = /decl/barricade_tape_template/bureaucracy
-
-#undef MAX_BARRICADE_TAPE_LENGTH
-#undef TAPE_BARRICADE_IS_CORNER_NEIGHBORS
-#undef TAPE_BARRICADE_V_NEIGHBORS
-#undef TAPE_BARRICADE_H_NEIGHBORS
-#undef TAPE_BARRICADE_IS_V_NEIGHBORS
-#undef TAPE_BARRICADE_IS_H_NEIGHBORS
-#undef TAPE_BARRICADE_IS_3W_V_NEIGHBORS
-#undef TAPE_BARRICADE_IS_3W_H_NEIGHBORS
-#undef TAPE_BARRICADE_IS_4W_NEIGHBORS
-#undef CONNECTION_BITS_TO_TEXT
-#undef TAPE_BARRICADE_GET_NB_NEIGHBORS
\ No newline at end of file
diff --git a/code/modules/barricade_tape/barricade_tape.dm b/code/modules/barricade_tape/barricade_tape.dm
new file mode 100644
index 000000000000..b0f81d840a3f
--- /dev/null
+++ b/code/modules/barricade_tape/barricade_tape.dm
@@ -0,0 +1,252 @@
+#define MAX_BARRICADE_TAPE_LENGTH 32 //Maximum length of a continuous line of tape someone can place down.
+#define TAPE_BARRICADE_V_NEIGHBORS (NORTH | SOUTH)
+#define TAPE_BARRICADE_H_NEIGHBORS (EAST  | WEST)
+#define TAPE_BARRICADE_IS_CORNER_NEIGHBORS(X) ((X ^ TAPE_BARRICADE_V_NEIGHBORS) && (X ^ TAPE_BARRICADE_H_NEIGHBORS))
+#define TAPE_BARRICADE_IS_V_NEIGHBORS(X) ((X & TAPE_BARRICADE_V_NEIGHBORS) == TAPE_BARRICADE_V_NEIGHBORS && !((X & TAPE_BARRICADE_H_NEIGHBORS) == TAPE_BARRICADE_H_NEIGHBORS)) //Check we have neighbors connection on the vertical plane
+#define TAPE_BARRICADE_IS_H_NEIGHBORS(X) ((X & TAPE_BARRICADE_H_NEIGHBORS) == TAPE_BARRICADE_H_NEIGHBORS && !((X & TAPE_BARRICADE_V_NEIGHBORS) == TAPE_BARRICADE_V_NEIGHBORS)) //Check we have neighbors connection on the horizontal plane
+#define TAPE_BARRICADE_IS_3W_V_NEIGHBORS(X) (TAPE_BARRICADE_IS_V_NEIGHBORS(X) && ((X & TAPE_BARRICADE_H_NEIGHBORS) > 0))
+#define TAPE_BARRICADE_IS_3W_H_NEIGHBORS(X) (TAPE_BARRICADE_IS_H_NEIGHBORS(X) && ((X & TAPE_BARRICADE_V_NEIGHBORS) > 0))
+#define TAPE_BARRICADE_IS_4W_NEIGHBORS(X) (((X & TAPE_BARRICADE_V_NEIGHBORS) == TAPE_BARRICADE_V_NEIGHBORS) && ((X & TAPE_BARRICADE_H_NEIGHBORS) == TAPE_BARRICADE_H_NEIGHBORS))
+#define CONNECTION_BITS_TO_TEXT(X) "[(X & WEST) > 0][(X & EAST) > 0][(X & SOUTH) > 0][(X & NORTH) > 0]"
+#define TAPE_BARRICADE_GET_NB_NEIGHBORS(X) (((X & NORTH) > 0) + ((X & SOUTH) > 0) + ((X & EAST) > 0) + ((X & WEST) > 0))
+
+var/global/list/image/hazard_overlays //Cached hazard floor overlays for the barricade tape
+
+////////////////////////////////////////////////////////////////////
+// Tape Line Barricade
+////////////////////////////////////////////////////////////////////
+/obj/structure/tape_barricade
+	name             = "tape line"
+	desc             = "A line of barricade tape."
+	icon             = 'icons/policetape.dmi'
+	icon_state       = "tape_2w_0"
+	dir              = SOUTH                          //This structure will try to turn its icon depending on what neighbors it has
+	layer            = ABOVE_DOOR_LAYER
+	pass_flags       = PASS_FLAG_TABLE                //About the height of table
+	anchored         = TRUE
+	material         = /decl/material/solid/organic/plastic
+	current_health   = 5
+	var/neighbors    = 0                              //Contains all the direction flags of all the neighboring tape_barricades
+	var/is_lifted    = 0                              //Whether the tape is lifted and we're allowing everyone passage.
+	var/is_crumpled  = 0                              //Whether the tape was damaged
+	var/decl/barricade_tape_template/tape_template   //Details about the behavior and looks of the barricade
+
+/obj/structure/tape_barricade/Initialize(ml, _mat, _reinf_mat, var/decl/barricade_tape_template/_tape_template)
+	. = ..()
+	if(!hazard_overlays)
+		hazard_overlays = list()
+		hazard_overlays["[NORTH]"]	= new/image('icons/effects/warning_stripes.dmi', icon_state = "N")
+		hazard_overlays["[EAST]"]	= new/image('icons/effects/warning_stripes.dmi', icon_state = "E")
+		hazard_overlays["[SOUTH]"]	= new/image('icons/effects/warning_stripes.dmi', icon_state = "S")
+		hazard_overlays["[WEST]"]	= new/image('icons/effects/warning_stripes.dmi', icon_state = "W")
+	set_tape_template(_tape_template)
+
+/obj/structure/tape_barricade/LateInitialize()
+	. = ..()
+	build_connection_bits()
+	update_neighbors()
+
+/obj/structure/tape_barricade/Destroy()
+	var/turf/old_loc = get_turf(src)
+	. = ..()
+	if(istype(old_loc))
+		update_neighbors(old_loc)
+
+/obj/structure/tape_barricade/proc/set_tape_template(var/decl/barricade_tape_template/tmpl)
+	if(tmpl)
+		tape_template = tmpl
+	if(ispath(tape_template))
+		tape_template = GET_DECL(tape_template)
+	if(!tape_template)
+		return
+
+	SetName("[tape_template.tape_kind] tape line")
+	desc       = tape_template.tape_desc
+	icon       = tape_template.icon_file
+	req_access = tape_template.req_access
+	set_color(tape_template.tape_color)
+	update_icon()
+
+/**Cause neighbors to update their icon. */
+/obj/structure/tape_barricade/proc/update_neighbors(var/location = loc)
+	for (var/look_dir in global.cardinal)
+		var/obj/structure/tape_barricade/B = locate(/obj/structure/tape_barricade, get_step(location, look_dir))
+		if(!QDELETED(B))
+			B.update_icon()
+
+	if(!QDELETED(src))
+		update_icon()
+
+/**Updates our connection bits to keep track of the things we're connected to */
+/obj/structure/tape_barricade/proc/build_connection_bits()
+	neighbors = 0
+	for (var/look_dir in global.cardinal)
+		var/turf/target_turf = get_step(src, look_dir)
+		if(target_turf)
+			var/obj/structure/tape_barricade/B = locate(/obj/structure/tape_barricade) in target_turf
+			//We connect to walls and other tape_barricades
+			if((B && !QDELETED(B)) || (!B && target_turf.is_wall()))
+				neighbors |= look_dir
+
+/**Allow sutypes to override with their own forced icon state name.*/
+/obj/structure/tape_barricade/proc/icon_name_override()
+	return
+
+/obj/structure/tape_barricade/on_update_icon()
+	. = ..()
+	if(isnull(tape_template) || ispath(tape_template))
+		return
+	//Look up our neighbors
+	build_connection_bits()
+
+	var/icon_name = icon_name_override()
+	if(!icon_name)
+		//Build the icon state from whethere we've got a right angle with out neighbors or not
+		if(TAPE_BARRICADE_IS_4W_NEIGHBORS(neighbors))
+			set_dir(SOUTH)
+			icon_name = "4w"
+
+		//3 Ways
+		else if(TAPE_BARRICADE_IS_3W_H_NEIGHBORS(neighbors))
+			set_dir(neighbors & TAPE_BARRICADE_V_NEIGHBORS)
+			icon_name = "3w"
+		else if(TAPE_BARRICADE_IS_3W_V_NEIGHBORS(neighbors))
+			set_dir(neighbors & TAPE_BARRICADE_H_NEIGHBORS)
+			icon_name = "3w"
+
+		//Lines
+		else if(TAPE_BARRICADE_IS_H_NEIGHBORS(neighbors))
+			set_dir(EAST)
+			icon_name = "2w"
+		else if(TAPE_BARRICADE_IS_V_NEIGHBORS(neighbors))
+			set_dir(SOUTH)
+			icon_name = "2w"
+
+		//Endpoints/corners
+		else
+			if(neighbors > 0)
+				set_dir(neighbors) //Make sure if we have no connections we don't set a bad dir
+			icon_name = "dir"
+
+	icon_state = "[tape_template.base_icon_state]_[icon_name]_[is_crumpled]"
+
+	//Overlays
+	if(tape_template.detail_overlay)
+		var/image/ovr = overlay_image(icon, "[tape_template.base_icon_state]_[icon_name]_[tape_template.detail_overlay]", tape_template.detail_color, RESET_COLOR)
+		ovr.dir = dir
+		add_overlay(ovr)
+
+/obj/structure/tape_barricade/attack_hand(mob/user)
+
+	if(user.check_intent(I_FLAG_HARM))
+		user.visible_message(SPAN_DANGER("\The [user] tears \the [src]!"))
+		physically_destroyed()
+		return TRUE
+
+	if (!user.check_intent(I_FLAG_HELP) || !allowed(user) || !user.check_dexterity(DEXTERITY_SIMPLE_MACHINES, TRUE))
+		return ..()
+
+	if(TAPE_BARRICADE_IS_CORNER_NEIGHBORS(neighbors) || (TAPE_BARRICADE_GET_NB_NEIGHBORS(neighbors) > 2))
+		to_chat(user, SPAN_WARNING("You can't lift up the pole. Try lifting the line itself."))
+		return TRUE
+
+	if(!allowed(user))
+		user.visible_message(SPAN_NOTICE("\The [user] carelessly pulls \the [src] out of the way."))
+		crumple()
+	else
+		user.visible_message(SPAN_NOTICE("\The [user] lifts \the [src], officially allowing passage."))
+
+	for(var/obj/structure/tape_barricade/B in get_tape_line())
+		B.lift(10 SECONDS) //~10 seconds
+	return TRUE
+
+/obj/structure/tape_barricade/dismantle_structure(mob/user)
+	for (var/obj/structure/tape_barricade/B in get_tape_line())
+		if(B == src || QDELETED(B))
+			continue
+		if(B.neighbors & get_dir(B, src))
+			B.physically_destroyed()
+	. = ..()
+
+/obj/structure/tape_barricade/CanPass(atom/movable/mover, turf/target, height, air_group)
+	if(!is_lifted && ismob(mover))
+		var/mob/M = mover
+		if (!allowed(M) && M.check_intent(I_FLAG_HELP))
+			return FALSE
+	return ..()
+
+/obj/structure/tape_barricade/Crossed(atom/movable/AM)
+	. = ..()
+	if(is_lifted || !isliving(AM))
+		return
+	var/mob/living/M = AM
+	add_fingerprint(M)
+	shake_animation(2)
+	if (!allowed(M))	//only select few learn art of not crumpling the tape
+		to_chat(M, SPAN_NOTICE("You are not supposed to go past \the [src]..."))
+		if(!M.check_intent(I_FLAG_HELP))
+			crumple()
+
+/obj/structure/tape_barricade/proc/crumple()
+	if(!is_crumpled)
+		playsound(src, 'sound/effects/rip1.ogg', 60, TRUE)
+		take_damage(5)
+		is_crumpled = TRUE
+		update_icon()
+
+/**Temporarily lifts the tape line, allowing passage to anyone for the specified time, until the timer expires. */
+/obj/structure/tape_barricade/proc/lift(var/time)
+	if(!is_lifted)
+		is_lifted = TRUE
+		layer = ABOVE_HUMAN_LAYER
+		pass_flags = PASS_FLAG_MOB
+		pixel_y += 8
+		addtimer(CALLBACK(src, PROC_REF(on_unlift)), time, TIMER_UNIQUE)
+		playsound(src, 'sound/effects/pageturn2.ogg', 50, TRUE)
+
+/**Called by timer when the tape line falls back in place. */
+/obj/structure/tape_barricade/proc/on_unlift()
+	is_lifted = FALSE
+	pass_flags = initial(pass_flags)
+	reset_plane_and_layer()
+	pixel_y -= 8
+	playsound(src, 'sound/effects/pageturn2.ogg', 20, TRUE)
+
+// Returns a list of all tape objects connected to src, including itself.
+/obj/structure/tape_barricade/proc/get_tape_line(var/list/ignored, var/line_index = 0)
+	//Don't include more in the line than this
+	if(line_index >= MAX_BARRICADE_TAPE_LENGTH)
+		return list()
+
+	var/list/dirs = list()
+	if(neighbors & NORTH)
+		dirs += NORTH
+	if(neighbors & SOUTH)
+		dirs += SOUTH
+	if(neighbors & WEST)
+		dirs += WEST
+	if(neighbors & EAST)
+		dirs += EAST
+
+	//Grab all cached connected neighbors
+	LAZYDISTINCTADD(ignored, src)
+	var/list/obj/structure/tape_barricade/tapeline = list(src)
+	for(var/look_dir in dirs)
+		var/turf/T = get_step(src, look_dir)
+		var/obj/structure/tape_barricade/B = locate() in T
+		if(!QDELETED(B) && !(B in ignored))
+			if(TAPE_BARRICADE_IS_CORNER_NEIGHBORS(neighbors) || (TAPE_BARRICADE_GET_NB_NEIGHBORS(neighbors) > 2))
+				continue //We stop at intersections, and corners
+			tapeline += B.get_tape_line(ignored, line_index + 1) //Pass us to prevent infinite loops, and adding us to the resulting line
+	return tapeline
+
+#undef TAPE_BARRICADE_IS_CORNER_NEIGHBORS
+#undef TAPE_BARRICADE_V_NEIGHBORS
+#undef TAPE_BARRICADE_H_NEIGHBORS
+#undef TAPE_BARRICADE_IS_V_NEIGHBORS
+#undef TAPE_BARRICADE_IS_H_NEIGHBORS
+#undef TAPE_BARRICADE_IS_3W_V_NEIGHBORS
+#undef TAPE_BARRICADE_IS_3W_H_NEIGHBORS
+#undef TAPE_BARRICADE_IS_4W_NEIGHBORS
+#undef CONNECTION_BITS_TO_TEXT
+#undef TAPE_BARRICADE_GET_NB_NEIGHBORS
\ No newline at end of file
diff --git a/code/modules/barricade_tape/barricade_tape_roll.dm b/code/modules/barricade_tape/barricade_tape_roll.dm
new file mode 100644
index 000000000000..6ebf3b5d5d6b
--- /dev/null
+++ b/code/modules/barricade_tape/barricade_tape_roll.dm
@@ -0,0 +1,151 @@
+////////////////////////////////////////////////////////////////////
+// Barricade Tape Roll
+////////////////////////////////////////////////////////////////////
+/obj/item/stack/tape_roll/barricade_tape
+	name               = "barricade tape roll"
+	desc               = "A roll of high visibility, non-sticky barricade tape. Used to deter passersby from crossing it."
+	icon               = 'icons/policetape.dmi'
+	icon_state         = "tape"
+	w_class            = ITEM_SIZE_SMALL
+	var/tmp/turf/start                             //The turf we started unrolling from
+	var/tmp/weakref/unroller                       //The mob currently unrolling us
+	var/decl/barricade_tape_template/tape_template //Template containing details on how the tape roll will look and behave, along with what it will place down
+
+/obj/item/stack/tape_roll/barricade_tape/Initialize()
+	. = ..()
+	apply_template()
+
+/obj/item/stack/tape_roll/barricade_tape/Destroy()
+	stop_unrolling()
+	return ..()
+
+/**Update our appearence and data to match the specified tape template. */
+/obj/item/stack/tape_roll/barricade_tape/proc/apply_template()
+	if(ispath(tape_template))
+		tape_template = GET_DECL(tape_template)
+	if(!tape_template)
+		return
+
+	SetName("[tape_template.tape_kind] tape roll")
+	desc = tape_template.roll_desc
+	icon = tape_template.icon_file
+	set_color(tape_template.tape_color)
+	update_icon()
+
+/obj/item/stack/tape_roll/barricade_tape/on_update_icon()
+	. = ..()
+	if(ismob(loc))
+		add_overlay(overlay_image(icon, start? "stop" : "start", flags = RESET_COLOR))
+
+/obj/item/stack/tape_roll/barricade_tape/dropped(mob/user)
+	stop_unrolling()
+	update_icon()
+	return ..()
+
+/obj/item/stack/tape_roll/barricade_tape/on_picked_up(mob/user)
+	stop_unrolling()
+	update_icon()
+	return ..()
+
+/obj/item/stack/tape_roll/barricade_tape/attack_hand()
+	. = ..()
+	if(. && !QDELETED(src))
+		update_icon()
+
+/**Callback used when whoever holds us moved to a new turf. */
+/obj/item/stack/tape_roll/barricade_tape/proc/user_moved_unrolling(var/mob/M, var/atom/old_loc, var/atom/new_loc)
+	if(QDELETED(src))
+		return //Destructor will handle the rest
+	if(QDELETED(M) || !can_use(1) || M.incapacitated())
+		stop_unrolling()
+		return
+
+	if((old_loc.x != new_loc.x && old_loc.y != new_loc.y) || old_loc.z != new_loc.z)
+		to_chat(M, SPAN_WARNING("\The [src] can only be laid horizontally or vertically."))
+		stop_unrolling()
+		return
+	//Use a length of tape and place a barricade line
+	if(!place_line(M, new_loc, get_dir(old_loc, new_loc)))
+		stop_unrolling()
+		return
+	if(get_dist(start, new_loc) >= MAX_BARRICADE_TAPE_LENGTH)
+		to_chat(M, SPAN_WARNING("You've stretched this line of tape to the maximum!"))
+		stop_unrolling()
+		return
+
+/obj/item/stack/tape_roll/barricade_tape/proc/stop_unrolling()
+	if(!start && !unroller)
+		return
+	var/mob/_uroller = unroller.resolve()
+	if(_uroller)
+		events_repository.unregister(/decl/observ/moved, _uroller, src, PROC_REF(user_moved_unrolling))
+	unroller         = null
+	start            = null
+	slowdown_general = initial(slowdown_general)
+	if(_uroller)
+		to_chat(_uroller, SPAN_NOTICE("You stop unrolling \the [src]."))
+	if(!QDELETED(src))
+		update_icon()
+	return TRUE
+
+/obj/item/stack/tape_roll/barricade_tape/proc/start_unrolling(var/mob/user)
+	if(start && unroller)
+		return
+	start    = get_turf(src)
+	unroller = weakref(user)
+	slowdown_general = initial(slowdown_general) + 2 //While unrolling you're slightly slower
+	events_repository.unregister(/decl/observ/moved, user, src, PROC_REF(user_moved_unrolling))
+	events_repository.register(/decl/observ/moved, user, src, PROC_REF(user_moved_unrolling))
+	to_chat(user, SPAN_NOTICE("You start unrolling \the [src]."))
+	//Place the first one immediately
+	place_line(user, get_turf(user), user.dir)
+	update_icon()
+	return TRUE
+
+/**Place a tape line on the current turf. */
+/obj/item/stack/tape_roll/barricade_tape/proc/place_line(var/mob/user, var/turf/T, var/pdir)
+	if(!T || T.is_open() || T.is_wall())
+		to_chat(user, SPAN_WARNING("You can't place tape here!"))
+		return
+	if(locate(/obj/structure/tape_barricade) in T)
+		return //Can't place 2 on the same tile!
+
+	if(!can_use(1))
+		to_chat(user, SPAN_WARNING("You are out of [tape_template.tape_kind] tape!"))
+		return
+	use(1)
+	playsound(user, 'sound/effects/pageturn2.ogg', 50, TRUE)
+
+	var/obj/structure/tape_barricade/barricade = tape_template.make_line_barricade(user, T, pdir)
+	if(barricade)
+		barricade.matter = matter_per_piece?.Copy()
+		barricade.update_neighbors()
+	return barricade
+
+/obj/item/stack/tape_roll/barricade_tape/attack_self(mob/user)
+	if(start)
+		stop_unrolling()
+		return
+	if(!can_use(1))
+		return //This shouldn't happen, but if it does, don't let them exploit it
+
+	start_unrolling(user)
+
+/obj/item/stack/tape_roll/barricade_tape/afterattack(var/atom/A, mob/user, proximity)
+	if(!proximity)
+		return
+
+	if (istype(A, /obj/machinery/door/airlock))
+		if(!can_use(4))
+			to_chat(user, SPAN_WARNING("There isn't enough [plural_name] in \the [src] to barricade \the [A]. You need at least 4 [plural_name]."))
+			return
+
+		var/obj/structure/tape_barricade/door/bar = tape_template.make_door_barricade(user, A)
+		if(bar)
+			bar.matter = matter_per_piece?.Copy()
+			if(bar.matter)
+				for(var/mat in bar.matter)
+					bar.matter[mat] = round(bar.matter[mat] * 4)
+
+		to_chat(user, SPAN_NOTICE("You finish placing \the [src]."))
+		use(4)
\ No newline at end of file
diff --git a/code/modules/barricade_tape/barricade_tape_subtypes.dm b/code/modules/barricade_tape/barricade_tape_subtypes.dm
new file mode 100644
index 000000000000..44cf66cef298
--- /dev/null
+++ b/code/modules/barricade_tape/barricade_tape_subtypes.dm
@@ -0,0 +1,136 @@
+////////////////////////////////////////////////////////////////////
+// Door Tape Barricade
+////////////////////////////////////////////////////////////////////
+
+//Barricade over a single door
+/obj/structure/tape_barricade/door
+	icon_state = "tape_door_0"
+	layer      = ABOVE_DOOR_LAYER
+
+/obj/structure/tape_barricade/door/update_neighbors()
+	//We completely ignore neighbors
+	neighbors = 0
+
+/obj/structure/tape_barricade/door/icon_name_override()
+	return "door" //Override the icon picking to pick this icon label instead
+
+////////////////////////////////////////////////////////////////////
+// Police Tape
+////////////////////////////////////////////////////////////////////
+/decl/barricade_tape_template/police
+	tape_kind  = "police"
+	tape_desc  = "A length of police tape.  Do not cross."
+	roll_desc  = "A roll of police tape used to block off crime scenes from the public."
+	tape_color = COLOR_RED
+	req_access = list(access_security)
+
+/obj/item/stack/tape_roll/barricade_tape/police
+	tape_template = /decl/barricade_tape_template/police
+
+//mapper type
+/obj/structure/tape_barricade/police
+	icon_state    = "tape_door_0"
+	color         = COLOR_RED
+	tape_template = /decl/barricade_tape_template/police
+
+////////////////////////////////////////////////////////////////////
+// Engineering Tape
+////////////////////////////////////////////////////////////////////
+/decl/barricade_tape_template/engineering
+	tape_kind  = "engineering"
+	tape_desc  = "A length of engineering tape. Better not cross it."
+	roll_desc  = "A roll of engineering tape used to block off working areas from the public."
+	tape_color = COLOR_ORANGE
+	req_access = list(list(access_engine,access_atmospherics))
+
+/obj/item/stack/tape_roll/barricade_tape/engineering
+	tape_template = /decl/barricade_tape_template/engineering
+
+//mapper type
+/obj/structure/tape_barricade/engineering
+	icon_state    = "stripetape_door_0"
+	color         = COLOR_ORANGE
+	tape_template = /decl/barricade_tape_template/engineering
+
+////////////////////////////////////////////////////////////////////
+// Atmospheric Tape
+////////////////////////////////////////////////////////////////////
+/decl/barricade_tape_template/atmos
+	tape_kind       = "atmospherics"
+	tape_desc       = "A length of atmospherics tape. Better not cross it."
+	roll_desc       = "A roll of atmospherics tape used to block off working areas from the public."
+	tape_color      = COLOR_BLUE_LIGHT
+	req_access      = list(list(access_engine,access_atmospherics))
+	base_icon_state = "stripetape"
+	detail_overlay  = "stripes"
+	detail_color    = COLOR_YELLOW
+
+/obj/item/stack/tape_roll/barricade_tape/atmos
+	tape_template = /decl/barricade_tape_template/atmos
+
+//mapper type
+/obj/structure/tape_barricade/atmos
+	icon_state    = "stripetape_h_0"
+	color         = COLOR_BLUE_LIGHT
+	tape_template = /decl/barricade_tape_template/atmos
+
+////////////////////////////////////////////////////////////////////
+// Research Tape
+////////////////////////////////////////////////////////////////////
+/decl/barricade_tape_template/research
+	tape_kind  = "research"
+	tape_desc  = "A length of research tape. Better not cross it."
+	roll_desc  = "A roll of research tape used to block off working areas from the public."
+	tape_color = COLOR_WHITE
+	req_access = list(access_research)
+
+/obj/item/stack/tape_roll/barricade_tape/research
+	tape_template = /decl/barricade_tape_template/research
+
+//mapper type
+/obj/structure/tape_barricade/research
+	color         = COLOR_WHITE
+	tape_template = /decl/barricade_tape_template/research
+
+////////////////////////////////////////////////////////////////////
+// Medical Tape
+////////////////////////////////////////////////////////////////////
+/decl/barricade_tape_template/medical
+	tape_kind       = "medical"
+	tape_desc       = "A length of medical tape. Better not cross it."
+	roll_desc       = "A roll of medical tape used to block off working areas from the public."
+	tape_color      = COLOR_PALE_BLUE_GRAY
+	req_access      = list(access_medical)
+	base_icon_state = "stripetape"
+	detail_overlay  = "stripes"
+	detail_color    = COLOR_PALE_BLUE_GRAY
+
+/obj/item/stack/tape_roll/barricade_tape/medical
+	tape_template = /decl/barricade_tape_template/medical
+
+//mapper type
+/obj/structure/tape_barricade/medical
+	icon_state    = "stripetape_h_0"
+	color         = COLOR_PALE_BLUE_GRAY
+	tape_template = /decl/barricade_tape_template/medical
+
+////////////////////////////////////////////////////////////////////
+// Bureacratic Tape
+////////////////////////////////////////////////////////////////////
+/decl/barricade_tape_template/bureaucracy
+	tape_kind       = "red"
+	tape_desc       = "A length of bureaucratic red tape. Safely ignored, but darn obstructive sometimes."
+	roll_desc       = "A roll of bureaucratic red tape used to block any meaningful work from being done."
+	tape_color      = COLOR_RED
+	base_icon_state = "stripetape"
+	detail_overlay  = "stripes"
+	detail_color    = COLOR_RED
+
+/obj/item/stack/tape_roll/barricade_tape/bureaucracy
+	tape_template = /decl/barricade_tape_template/bureaucracy
+
+//mapper type
+/obj/structure/tape_barricade/bureaucracy
+	icon_state    = "stripetape_h_0"
+	color         = COLOR_RED
+	tape_template = /decl/barricade_tape_template/bureaucracy
\ No newline at end of file
diff --git a/code/modules/barricade_tape/barricade_tape_template.dm b/code/modules/barricade_tape/barricade_tape_template.dm
new file mode 100644
index 000000000000..2b386b4dc4db
--- /dev/null
+++ b/code/modules/barricade_tape/barricade_tape_template.dm
@@ -0,0 +1,26 @@
+////////////////////////////////////////////////////////////////////
+// Barricade Tape Template
+////////////////////////////////////////////////////////////////////
+//Singletons with data on the various templates of barricade tape
+/decl/barricade_tape_template
+	var/tape_kind         = "barricade"                   //Used as a prefix to the word "tape" when refering to the tape and roll
+	var/tape_desc         = "A tape barricade."           //Description for the tape barricade
+	var/roll_desc         = "A roll of barricade tape."   //Description for the tape roll
+	var/icon_file         = 'icons/policetape.dmi'        //Icon file used for both the tape and roll
+	var/base_icon_state   = "tape"                        //For the barricade. Icon state used to fetch the applied tape directional icons for various states
+	var/list/req_access                                   //Access required to automatically pass through tape barricades
+	var/tape_color                                        //Color of the tape
+	var/detail_overlay                                    //Overlay for the applied tape
+	var/detail_color                                      //Color for the detail overlay
+
+/decl/barricade_tape_template/proc/make_line_barricade(var/mob/user, var/turf/T, var/pdir)
+	var/obj/structure/tape_barricade/bar = new(T,,,src)
+	bar.add_fingerprint(user)
+	return bar
+
+/decl/barricade_tape_template/proc/make_door_barricade(var/mob/user, var/obj/door)
+	var/obj/structure/tape_barricade/door/bar = new(get_turf(door))
+	bar.set_tape_template(src)
+	bar.set_dir(door.dir)
+	bar.add_fingerprint(user)
+	return bar
\ No newline at end of file
diff --git a/nebula.dme b/nebula.dme
index 7e1477b0de2a..8e417a178506 100644
--- a/nebula.dme
+++ b/nebula.dme
@@ -1866,7 +1866,6 @@
 #include "code\game\objects\items\weapons\mop.dm"
 #include "code\game\objects\items\weapons\nuclear_cylinder.dm"
 #include "code\game\objects\items\weapons\paint.dm"
-#include "code\game\objects\items\weapons\policetape.dm"
 #include "code\game\objects\items\weapons\RCD.dm"
 #include "code\game\objects\items\weapons\RPD.dm"
 #include "code\game\objects\items\weapons\RSF.dm"
@@ -2408,6 +2407,10 @@
 #include "code\modules\banners\banner_frame_definitions.dm"
 #include "code\modules\banners\sign.dm"
 #include "code\modules\banners\sign_post.dm"
+#include "code\modules\barricade_tape\barricade_tape.dm"
+#include "code\modules\barricade_tape\barricade_tape_roll.dm"
+#include "code\modules\barricade_tape\barricade_tape_subtypes.dm"
+#include "code\modules\barricade_tape\barricade_tape_template.dm"
 #include "code\modules\blob\blob.dm"
 #include "code\modules\blood\blood.dm"
 #include "code\modules\blood\blood_types.dm"