diff --git a/_maps/away_missions/140x140/snowfield.dmm b/_maps/away_missions/140x140/snowfield.dmm
index ec4428d6cd9..c46478ef288 100644
--- a/_maps/away_missions/140x140/snowfield.dmm
+++ b/_maps/away_missions/140x140/snowfield.dmm
@@ -795,7 +795,7 @@
/area/awaymission/snowfield/base)
"cg" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/obj/effect/floor_decal/corner/grey/diagonal{
dir = 4
},
diff --git a/_maps/away_missions/140x140/zoo.dmm b/_maps/away_missions/140x140/zoo.dmm
index 58a7db06961..e1df005de35 100644
--- a/_maps/away_missions/140x140/zoo.dmm
+++ b/_maps/away_missions/140x140/zoo.dmm
@@ -657,7 +657,7 @@
/area/awaymission/zoo/tradeship)
"cb" = (
/obj/structure/table/standard,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/turf/simulated/shuttle/floor/black,
/area/awaymission/zoo/tradeship)
"cc" = (
diff --git a/_maps/map_files/mini_test/citadel_minitest-1.dmm b/_maps/map_files/mini_test/citadel_minitest-1.dmm
index d67df5cfdae..23ef41ee456 100644
--- a/_maps/map_files/mini_test/citadel_minitest-1.dmm
+++ b/_maps/map_files/mini_test/citadel_minitest-1.dmm
@@ -1009,7 +1009,7 @@
},
/area/tcommsat/chamber)
"cp" = (
-/obj/machinery/pda_multicaster/prebuilt,
+/obj/machinery/pda_multicaster,
/turf/simulated/floor/tiled/dark{
initial_gas_mix = "n2=100;TEMP=80"
},
diff --git a/_maps/map_files/rift/rift-02-underground2.dmm b/_maps/map_files/rift/rift-02-underground2.dmm
index 75ed326b957..b6f4bad7f4f 100644
--- a/_maps/map_files/rift/rift-02-underground2.dmm
+++ b/_maps/map_files/rift/rift-02-underground2.dmm
@@ -10246,7 +10246,7 @@
/area/maintenance/lower/mining)
"Ld" = (
/obj/structure/table/reinforced,
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
dir = 1
},
/obj/effect/floor_decal/corner/white/diagonal,
diff --git a/_maps/map_files/rift/rift-03-underground1.dmm b/_maps/map_files/rift/rift-03-underground1.dmm
index a93642c4a25..ac4297dc4bd 100644
--- a/_maps/map_files/rift/rift-03-underground1.dmm
+++ b/_maps/map_files/rift/rift-03-underground1.dmm
@@ -9534,7 +9534,7 @@
/turf/simulated/floor/plating,
/area/maintenance/engineering)
"LE" = (
-/obj/machinery/pda_multicaster/prebuilt,
+/obj/machinery/pda_multicaster,
/turf/simulated/floor/tiled/dark,
/area/tcommsat/chamber)
"LF" = (
diff --git a/_maps/map_files/rift/rift-04-surface1.dmm b/_maps/map_files/rift/rift-04-surface1.dmm
index 238148dd19f..24b6894d7de 100644
--- a/_maps/map_files/rift/rift-04-surface1.dmm
+++ b/_maps/map_files/rift/rift-04-surface1.dmm
@@ -4335,7 +4335,7 @@
/obj/machinery/light/small{
dir = 1
},
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/obj/item/storage/box/glasses/meta{
pixel_x = -14
},
@@ -6836,7 +6836,7 @@
/turf/simulated/wall,
/area/maintenance/engineering/pumpstation)
"eFx" = (
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/obj/structure/table/woodentable,
/turf/simulated/floor/reinforced,
/area/maintenance/maint_bar)
@@ -20930,7 +20930,7 @@
/area/maintenance/security/lower)
"nzE" = (
/obj/structure/table/woodentable,
-/obj/machinery/chemical_dispenser/bar_coffee/full{
+/obj/machinery/chemical_dispenser/catering/bar_coffee{
dir = 4
},
/turf/simulated/floor/wood,
@@ -22650,7 +22650,7 @@
/turf/simulated/floor/tiled/monotile,
/area/hallway/primary/surfaceone)
"otX" = (
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/obj/structure/table/woodentable,
/obj/item/stack/rods,
/obj/item/stack/rods,
@@ -31521,7 +31521,7 @@
/area/rift/surfacebase/outside/outside1)
"ubH" = (
/obj/structure/table/hardwoodtable,
-/obj/machinery/chemical_dispenser/bar_coffee/full,
+/obj/machinery/chemical_dispenser/catering/bar_coffee,
/obj/machinery/light_construct/small{
dir = 1
},
@@ -33919,7 +33919,7 @@
/area/rnd/outpost/xenobiology/outpost_hallway)
"vBD" = (
/obj/structure/table/hardwoodtable,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/turf/simulated/floor/wood,
/area/maintenance/starboard)
"vBV" = (
@@ -35005,7 +35005,7 @@
/area/quartermaster/garage)
"wnB" = (
/obj/structure/table/hardwoodtable,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/turf/simulated/floor/plating,
/area/maintenance/starboard)
"wnK" = (
@@ -37254,7 +37254,7 @@
/turf/simulated/floor/tiled/white,
/area/rnd/outpost/xenobiology/outpost_decon)
"xKh" = (
-/obj/machinery/chemical_dispenser/bar_coffee/full,
+/obj/machinery/chemical_dispenser/catering/bar_coffee,
/obj/structure/table/woodentable,
/obj/structure/sign/poster{
pixel_y = 32
diff --git a/_maps/map_files/rift/rift-05-surface2.dmm b/_maps/map_files/rift/rift-05-surface2.dmm
index eb2f61501dd..d831b27ba83 100644
--- a/_maps/map_files/rift/rift-05-surface2.dmm
+++ b/_maps/map_files/rift/rift-05-surface2.dmm
@@ -16512,7 +16512,7 @@
/area/security/hallway)
"mfG" = (
/obj/structure/table/woodentable,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/turf/simulated/floor/wood,
/area/rift/station/public_garden/gantry)
"mfM" = (
@@ -21781,7 +21781,7 @@
/area/medical/sleeper)
"qjh" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_coffee/full,
+/obj/machinery/chemical_dispenser/catering/bar_coffee,
/obj/machinery/light{
dir = 1
},
diff --git a/_maps/map_files/rift/rift-06-surface3.dmm b/_maps/map_files/rift/rift-06-surface3.dmm
index af44ba44967..d7667d6bf8f 100644
--- a/_maps/map_files/rift/rift-06-surface3.dmm
+++ b/_maps/map_files/rift/rift-06-surface3.dmm
@@ -7437,7 +7437,7 @@
/area/bridge/office)
"aoC" = (
/obj/structure/table/wooden_reinforced,
-/obj/machinery/chemical_dispenser/bar_coffee/full{
+/obj/machinery/chemical_dispenser/catering/bar_coffee{
dir = 8
},
/turf/simulated/floor/tiled/dark,
@@ -15617,7 +15617,7 @@
"aFF" = (
/obj/effect/floor_decal/corner/grey/diagonal,
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
pixel_y = 4
},
/turf/simulated/floor/tiled/white,
@@ -24002,7 +24002,7 @@
/area/ai_upload_foyer)
"aXa" = (
/obj/structure/table/reinforced,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/obj/machinery/status_display{
pixel_y = 32
},
@@ -24370,7 +24370,7 @@
/area/maintenance/commandmaint)
"aXJ" = (
/obj/structure/table/reinforced,
-/obj/machinery/chemical_dispenser/bar_alc,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/turf/simulated/floor/tiled/steel_grid,
/area/bridge/bunker)
"aXK" = (
@@ -25640,7 +25640,7 @@
/area/crew_quarters/bar)
"fxA" = (
/obj/structure/table/hardwoodtable,
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
pixel_y = 7
},
/obj/effect/floor_decal/spline/plain,
@@ -26133,7 +26133,7 @@
/area/maintenance/bar/lower)
"qgY" = (
/obj/structure/table/hardwoodtable,
-/obj/machinery/chemical_dispenser/bar_coffee/full{
+/obj/machinery/chemical_dispenser/catering/bar_coffee{
pixel_y = 7
},
/obj/effect/floor_decal/spline/plain,
@@ -26226,7 +26226,7 @@
/area/rift/surfacebase/outside/outside3)
"tvp" = (
/obj/structure/table/hardwoodtable,
-/obj/machinery/chemical_dispenser/bar_alc/full{
+/obj/machinery/chemical_dispenser/catering/bar_alc{
pixel_y = 7
},
/obj/effect/floor_decal/spline/plain,
diff --git a/_maps/map_files/rift/rift-08-west_deep.dmm b/_maps/map_files/rift/rift-08-west_deep.dmm
index 19c0e5e9fc4..e39a56691cc 100644
--- a/_maps/map_files/rift/rift-08-west_deep.dmm
+++ b/_maps/map_files/rift/rift-08-west_deep.dmm
@@ -5228,7 +5228,7 @@
/obj/effect/floor_decal/spline/fancy/wood{
dir = 4
},
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
dir = 8
},
/turf/simulated/floor/wood,
diff --git a/_maps/map_files/rift/rift-11-orbital.dmm b/_maps/map_files/rift/rift-11-orbital.dmm
index c53869e23fb..e265d5d5993 100644
--- a/_maps/map_files/rift/rift-11-orbital.dmm
+++ b/_maps/map_files/rift/rift-11-orbital.dmm
@@ -5968,7 +5968,7 @@
/turf/simulated/floor/lino,
/area/centcom/simulated/bar)
"rT" = (
-/obj/machinery/chemical_dispenser/bar_coffee/full{
+/obj/machinery/chemical_dispenser/catering/bar_coffee{
dir = 8
},
/obj/structure/table/marble,
@@ -5986,7 +5986,7 @@
/obj/machinery/camera/network/crescent{
dir = 1
},
-/obj/machinery/chemical_dispenser/bar_alc/full{
+/obj/machinery/chemical_dispenser/catering/bar_alc{
dir = 1
},
/obj/structure/table/reinforced,
@@ -5994,7 +5994,7 @@
/area/centcom/simulated/bar)
"rX" = (
/obj/structure/table/reinforced,
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
dir = 1
},
/turf/simulated/floor/lino,
diff --git a/_maps/map_files/tether/tether-01-surface1.dmm b/_maps/map_files/tether/tether-01-surface1.dmm
index dfe782748d2..f639f790ee5 100644
--- a/_maps/map_files/tether/tether-01-surface1.dmm
+++ b/_maps/map_files/tether/tether-01-surface1.dmm
@@ -18675,7 +18675,7 @@
/area/crew_quarters/visitor_dining)
"aGy" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_coffee/full{
+/obj/machinery/chemical_dispenser/catering/bar_coffee{
dir = 8
},
/obj/machinery/floor_light/prebuilt{
diff --git a/_maps/map_files/tether/tether-02-surface2.dmm b/_maps/map_files/tether/tether-02-surface2.dmm
index 808fb8af927..cc5778a9861 100644
--- a/_maps/map_files/tether/tether-02-surface2.dmm
+++ b/_maps/map_files/tether/tether-02-surface2.dmm
@@ -18931,7 +18931,7 @@
/area/bridge/meeting_room)
"aIV" = (
/obj/structure/table/woodentable,
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
dir = 1
},
/turf/simulated/floor/wood,
@@ -22792,7 +22792,7 @@
/area/engineering/lower/breakroom)
"aQW" = (
/obj/structure/table/glass,
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
dir = 8
},
/turf/simulated/floor/tiled/dark,
@@ -31440,7 +31440,7 @@
},
/area/tcommsat/chamber)
"blc" = (
-/obj/machinery/pda_multicaster/prebuilt,
+/obj/machinery/pda_multicaster,
/turf/simulated/floor/tiled/dark{
initial_gas_mix = "n2=100;TEMP=80"
},
diff --git a/_maps/map_files/tether/tether-03-surface3.dmm b/_maps/map_files/tether/tether-03-surface3.dmm
index 42708c5af67..b5b1b1cc077 100644
--- a/_maps/map_files/tether/tether-03-surface3.dmm
+++ b/_maps/map_files/tether/tether-03-surface3.dmm
@@ -13710,7 +13710,7 @@
/area/vacant/vacant_shop)
"axY" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
dir = 8
},
/turf/simulated/floor/lino,
@@ -30023,7 +30023,7 @@
/area/crew_quarters/bar)
"bdu" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_alc/full{
+/obj/machinery/chemical_dispenser/catering/bar_alc{
dir = 8
},
/obj/machinery/light{
@@ -33083,7 +33083,7 @@
dir = 6
},
/obj/structure/table/standard,
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
dir = 1
},
/turf/simulated/floor/tiled/steel_grid,
@@ -34368,7 +34368,7 @@
name = "Kitchen Shutters"
},
/obj/machinery/door/firedoor/glass,
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
dir = 8
},
/obj/effect/floor_decal/spline/plain{
@@ -40490,7 +40490,7 @@
/area/tether/surfacebase/security/hos)
"sVw" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/turf/simulated/floor/wood,
/area/shuttle/tourbus/general)
"sWs" = (
@@ -41523,7 +41523,7 @@
/area/tether/surfacebase/security/upperhall)
"vrU" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/obj/machinery/light{
dir = 8
},
diff --git a/_maps/map_files/tether/tether-04-transit.dmm b/_maps/map_files/tether/tether-04-transit.dmm
index 2898a4f79b4..ca370b81351 100644
--- a/_maps/map_files/tether/tether-04-transit.dmm
+++ b/_maps/map_files/tether/tether-04-transit.dmm
@@ -129,7 +129,7 @@
/area/maintenance/tether_midpoint)
"nu" = (
/obj/structure/table/woodentable,
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
dir = 8
},
/turf/simulated/floor/wood,
@@ -626,7 +626,7 @@
/area/tether/elevator)
"Xi" = (
/obj/structure/table/woodentable,
-/obj/machinery/chemical_dispenser/bar_alc/full{
+/obj/machinery/chemical_dispenser/catering/bar_alc{
dir = 8
},
/turf/simulated/floor/wood,
diff --git a/_maps/map_files/tether/tether-05-station1.dmm b/_maps/map_files/tether/tether-05-station1.dmm
index c311c94e0ac..a2001739511 100644
--- a/_maps/map_files/tether/tether-05-station1.dmm
+++ b/_maps/map_files/tether/tether-05-station1.dmm
@@ -1648,7 +1648,7 @@
/obj/machinery/floor_light/prebuilt{
on = 1
},
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/turf/simulated/floor/wood,
/area/hallway/station/atrium)
"adN" = (
@@ -5825,7 +5825,7 @@
/obj/machinery/floor_light/prebuilt{
on = 1
},
-/obj/machinery/chemical_dispenser/bar_coffee/full,
+/obj/machinery/chemical_dispenser/catering/bar_coffee,
/turf/simulated/floor/wood,
/area/hallway/station/atrium)
"amH" = (
@@ -10048,7 +10048,7 @@
/area/engineering/break_room)
"avL" = (
/obj/structure/table/reinforced,
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
dir = 8
},
/obj/effect/floor_decal/corner/white/diagonal,
diff --git a/_maps/map_files/tether/tether-06-station2.dmm b/_maps/map_files/tether/tether-06-station2.dmm
index 1e02ad81108..2eb81d1388f 100644
--- a/_maps/map_files/tether/tether-06-station2.dmm
+++ b/_maps/map_files/tether/tether-06-station2.dmm
@@ -15056,7 +15056,7 @@
dir = 1
},
/obj/structure/table/wooden_reinforced,
-/obj/machinery/chemical_dispenser/bar_alc{
+/obj/machinery/chemical_dispenser/catering/bar_alc{
pixel_y = 10
},
/turf/simulated/floor/wood,
@@ -21067,7 +21067,7 @@
/area/quartermaster/qm)
"oYF" = (
/obj/structure/table/woodentable,
-/obj/machinery/chemical_dispenser/bar_coffee/full,
+/obj/machinery/chemical_dispenser/catering/bar_coffee,
/turf/simulated/floor/wood,
/area/tether/station/visitorhallway/office)
"oZR" = (
diff --git a/_maps/map_files/tether/tether_misc.dmm b/_maps/map_files/tether/tether_misc.dmm
index 08968daa0a6..e77e5e2ee71 100644
--- a/_maps/map_files/tether/tether_misc.dmm
+++ b/_maps/map_files/tether/tether_misc.dmm
@@ -2486,7 +2486,7 @@
/area/centcom/simulated/medical)
"mv" = (
/obj/structure/table/reinforced,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/turf/simulated/floor/lino,
/area/centcom/simulated/bar)
"mF" = (
@@ -2744,7 +2744,7 @@
/turf/space/internal_edge/bottomright,
/area/space)
"qT" = (
-/obj/machinery/chemical_dispenser/bar_coffee/full{
+/obj/machinery/chemical_dispenser/catering/bar_coffee{
dir = 8
},
/obj/structure/table/marble,
@@ -3670,7 +3670,7 @@
/area/centcom/simulated/restaurant)
"Da" = (
/obj/structure/table/reinforced,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/obj/machinery/camera/network/crescent{
dir = 1
},
diff --git a/_maps/map_files/triumph/triumph-01-deck1.dmm b/_maps/map_files/triumph/triumph-01-deck1.dmm
index e5c545545e8..b173b393bc7 100644
--- a/_maps/map_files/triumph/triumph-01-deck1.dmm
+++ b/_maps/map_files/triumph/triumph-01-deck1.dmm
@@ -8454,7 +8454,7 @@
/turf/simulated/floor/tiled/techmaint,
/area/engineering/storage)
"EV" = (
-/obj/machinery/pda_multicaster/prebuilt,
+/obj/machinery/pda_multicaster,
/turf/simulated/floor/tiled/dark{
initial_gas_mix = "n2=100;TEMP=80"
},
diff --git a/_maps/map_files/triumph/triumph-02-deck2.dmm b/_maps/map_files/triumph/triumph-02-deck2.dmm
index 77b302e5503..040dcefe640 100644
--- a/_maps/map_files/triumph/triumph-02-deck2.dmm
+++ b/_maps/map_files/triumph/triumph-02-deck2.dmm
@@ -1694,7 +1694,7 @@
/area/shuttle/belter)
"fn" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
dir = 4
},
/turf/simulated/floor/tiled/dark,
@@ -6934,7 +6934,7 @@
/obj/machinery/computer/security/telescreen{
pixel_x = 32
},
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
pixel_y = 8
},
/turf/simulated/floor/tiled/dark,
@@ -10233,7 +10233,7 @@
dir = 4
},
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_coffee/full,
+/obj/machinery/chemical_dispenser/catering/bar_coffee,
/obj/machinery/light{
dir = 1
},
@@ -14297,7 +14297,7 @@
dir = 4
},
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_coffee/full,
+/obj/machinery/chemical_dispenser/catering/bar_coffee,
/turf/simulated/floor/tiled/dark,
/area/crew_quarters/bar)
"RI" = (
@@ -14980,7 +14980,7 @@
pixel_y = 30
},
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/turf/simulated/floor/tiled/dark,
/area/crew_quarters/bar)
"TB" = (
diff --git a/_maps/map_files/triumph/triumph-03-deck3.dmm b/_maps/map_files/triumph/triumph-03-deck3.dmm
index 3c1162cb3a1..1f27a26a820 100644
--- a/_maps/map_files/triumph/triumph-03-deck3.dmm
+++ b/_maps/map_files/triumph/triumph-03-deck3.dmm
@@ -3319,7 +3319,7 @@
/area/medical/medbay4)
"cTd" = (
/obj/structure/table/reinforced,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/turf/simulated/floor/tiled/old_cargo/purple,
/area/assembly/robotics)
"cTv" = (
diff --git a/_maps/map_files/triumph/triumph-04-deck4.dmm b/_maps/map_files/triumph/triumph-04-deck4.dmm
index b3716394ce2..e63fb490955 100644
--- a/_maps/map_files/triumph/triumph-04-deck4.dmm
+++ b/_maps/map_files/triumph/triumph-04-deck4.dmm
@@ -3108,7 +3108,7 @@
/area/hallway/secondary/civilian_hallway_mid)
"ctm" = (
/obj/structure/table/woodentable,
-/obj/machinery/chemical_dispenser/bar_coffee/full,
+/obj/machinery/chemical_dispenser/catering/bar_coffee,
/turf/simulated/floor/wood,
/area/maintenance/security/starboard)
"ctv" = (
@@ -7658,7 +7658,7 @@
/area/security/warden)
"fAN" = (
/obj/structure/table/woodentable,
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
dir = 8
},
/turf/simulated/floor/wood,
@@ -12656,7 +12656,7 @@
/area/security/brig)
"jhL" = (
/obj/structure/table/steel,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/obj/machinery/light{
dir = 4
},
@@ -15782,7 +15782,7 @@
/area/security/brig)
"lxU" = (
/obj/structure/table/woodentable,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/turf/simulated/floor/plating,
/area/vacant/vacant_bar)
"lxY" = (
@@ -20090,7 +20090,7 @@
/area/exploration/meeting)
"oHO" = (
/obj/structure/table/woodentable,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/obj/machinery/light/small{
dir = 4
},
@@ -22163,7 +22163,7 @@
/area/crew_quarters/lounge)
"qaR" = (
/obj/structure/table/woodentable,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/obj/machinery/alarm{
dir = 8;
pixel_x = 24
@@ -23617,7 +23617,7 @@
/turf/simulated/floor/airless,
/area/shuttle/civvie/cockpit)
"qVj" = (
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
dir = 8
},
/obj/structure/table/woodentable,
@@ -26605,7 +26605,7 @@
/area/hallway/secondary/docking_hallway)
"sVx" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/turf/simulated/floor/wood,
/area/bridge/meeting_room)
"sVA" = (
@@ -30183,7 +30183,7 @@
/turf/simulated/floor/tiled/monotile,
/area/security/security_lockerroom)
"vBD" = (
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/obj/structure/table/woodentable,
/obj/machinery/light/small{
dir = 1
@@ -33783,7 +33783,7 @@
/area/security/lobby)
"xXe" = (
/obj/structure/table/woodentable,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/turf/simulated/floor/carpet/tealcarpet,
/area/crew_quarters/sleep/CMO_quarters)
"xXQ" = (
diff --git a/_maps/map_files/triumph/triumph-05-flagship.dmm b/_maps/map_files/triumph/triumph-05-flagship.dmm
index 71f5256c852..ef52108e17c 100644
--- a/_maps/map_files/triumph/triumph-05-flagship.dmm
+++ b/_maps/map_files/triumph/triumph-05-flagship.dmm
@@ -2164,7 +2164,7 @@
/area/centcom/control)
"dF" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_coffee/full,
+/obj/machinery/chemical_dispenser/catering/bar_coffee,
/obj/effect/floor_decal/corner/blue/diagonal{
dir = 4
},
@@ -7860,7 +7860,7 @@
/area/centcom/security)
"oD" = (
/obj/structure/table/standard,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/obj/item/storage/box/glasses/square,
/obj/effect/floor_decal/borderfloor{
dir = 9
@@ -9232,7 +9232,7 @@
/area/centcom/command)
"rc" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_coffee/full,
+/obj/machinery/chemical_dispenser/catering/bar_coffee,
/turf/unsimulated/floor{
icon_state = "lino"
},
@@ -13271,7 +13271,7 @@
/area/centcom/restaurant)
"yM" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_coffee/full,
+/obj/machinery/chemical_dispenser/catering/bar_coffee,
/obj/machinery/camera/network/crescent,
/turf/unsimulated/floor/steel{
icon = 'icons/turf/floors.dmi';
@@ -14254,7 +14254,7 @@
/area/centcom/bar)
"Az" = (
/obj/structure/table/reinforced,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/turf/unsimulated/floor/steel{
icon = 'icons/turf/floors.dmi';
icon_state = "wood"
@@ -14262,7 +14262,7 @@
/area/centcom/bar)
"AA" = (
/obj/structure/table/reinforced,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/turf/unsimulated/floor/steel{
icon = 'icons/turf/floors.dmi';
icon_state = "wood"
diff --git a/_maps/map_levels/140x140/Class_M.dmm b/_maps/map_levels/140x140/Class_M.dmm
index 37b1cb520cf..bf7ff308aba 100644
--- a/_maps/map_levels/140x140/Class_M.dmm
+++ b/_maps/map_levels/140x140/Class_M.dmm
@@ -543,7 +543,7 @@
/area/class_m/inside)
"na" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_coffee/full,
+/obj/machinery/chemical_dispenser/catering/bar_coffee,
/obj/structure/sign/double/barsign{
pixel_y = 32
},
@@ -821,7 +821,7 @@
/area/class_m/inside)
"sk" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/obj/machinery/light{
dir = 1
},
@@ -1761,7 +1761,7 @@
/area/class_m/inside)
"MG" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/turf/simulated/floor/wood/classm,
/area/class_m/inside)
"MK" = (
diff --git a/_maps/map_levels/140x140/lavaland.dmm b/_maps/map_levels/140x140/lavaland.dmm
index 64405ea57a4..145d7e4e0a8 100644
--- a/_maps/map_levels/140x140/lavaland.dmm
+++ b/_maps/map_levels/140x140/lavaland.dmm
@@ -182,7 +182,7 @@
/area/lavaland/central/base/common)
"fh" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/obj/effect/debris/cleanable/cobweb,
/turf/simulated/floor/wood,
/area/lavaland/central/base/common)
@@ -451,7 +451,7 @@
/area/lavaland/central/base/common)
"kq" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/turf/simulated/floor/wood,
/area/lavaland/central/base/common)
"kr" = (
diff --git a/_maps/map_levels/140x140/lavaland_dungeon.dmm b/_maps/map_levels/140x140/lavaland_dungeon.dmm
index b78ceb54e81..18ce1ba21c1 100644
--- a/_maps/map_levels/140x140/lavaland_dungeon.dmm
+++ b/_maps/map_levels/140x140/lavaland_dungeon.dmm
@@ -582,7 +582,7 @@
/area/lavaland/dungeon/facility)
"zq" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_soft{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
dir = 8
},
/obj/effect/floor_decal/spline/fancy{
diff --git a/_maps/map_levels/140x140/talon/talon1.dmm b/_maps/map_levels/140x140/talon/talon1.dmm
index 67552a38691..f065c373b86 100644
--- a/_maps/map_levels/140x140/talon/talon1.dmm
+++ b/_maps/map_levels/140x140/talon/talon1.dmm
@@ -4753,7 +4753,7 @@
/area/talon/deckone/bridge_hallway)
"Md" = (
/obj/structure/table/standard,
-/obj/machinery/chemical_dispenser/biochemistry/full,
+/obj/machinery/chemical_dispenser/biochemistry,
/turf/simulated/floor/tiled/eris/white/bluecorner,
/area/talon/deckone/medical)
"Mj" = (
diff --git a/_maps/map_levels/140x140/talon/talon2.dmm b/_maps/map_levels/140x140/talon/talon2.dmm
index 5f075ca2259..ce5449f05b7 100644
--- a/_maps/map_levels/140x140/talon/talon2.dmm
+++ b/_maps/map_levels/140x140/talon/talon2.dmm
@@ -2567,7 +2567,7 @@
/area/talon/maintenance/decktwo_aft)
"DQ" = (
/obj/structure/table/standard,
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
dir = 1;
req_access = ""
},
@@ -2941,7 +2941,7 @@
/turf/simulated/floor/plating,
/area/talon/maintenance/decktwo_aft)
"Is" = (
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
dir = 8
},
/obj/structure/table/marble,
@@ -3143,7 +3143,7 @@
/turf/simulated/wall/rshull,
/area/talon/maintenance/decktwo_aft)
"Kn" = (
-/obj/machinery/chemical_dispenser/bar_alc/full{
+/obj/machinery/chemical_dispenser/catering/bar_alc{
dir = 8
},
/obj/structure/table/marble,
diff --git a/_maps/map_levels/140x140/tradeport.dmm b/_maps/map_levels/140x140/tradeport.dmm
index 91f72d88ee8..db15f2ccf17 100644
--- a/_maps/map_levels/140x140/tradeport.dmm
+++ b/_maps/map_levels/140x140/tradeport.dmm
@@ -2469,7 +2469,7 @@
/area/tradeport/facility)
"jB" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_alc/full{
+/obj/machinery/chemical_dispenser/catering/bar_alc{
dir = 1
},
/obj/effect/floor_decal/spline/plain,
@@ -2477,7 +2477,7 @@
/area/tradeport/cafeteria)
"jE" = (
/obj/structure/table/standard,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/turf/simulated/floor/tiled/old_tile/gray,
/area/shuttle/trade_ship/general)
"jF" = (
@@ -11235,7 +11235,7 @@
/area/space)
"QO" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
dir = 1
},
/obj/machinery/light/small,
diff --git a/_maps/map_levels/140x140/virgo4_beach.dmm b/_maps/map_levels/140x140/virgo4_beach.dmm
index e8503c701c0..963d3ffae45 100644
--- a/_maps/map_levels/140x140/virgo4_beach.dmm
+++ b/_maps/map_levels/140x140/virgo4_beach.dmm
@@ -175,17 +175,17 @@
/area/tether_away/beach/resort/janibar)
"aN" = (
/obj/structure/table/woodentable,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/turf/simulated/floor/wood,
/area/tether_away/beach/resort/janibar)
"aO" = (
/obj/structure/table/woodentable,
-/obj/machinery/chemical_dispenser/bar_coffee/full,
+/obj/machinery/chemical_dispenser/catering/bar_coffee,
/turf/simulated/floor/wood,
/area/tether_away/beach/resort/janibar)
"aP" = (
/obj/structure/table/woodentable,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/turf/simulated/floor/wood,
/area/tether_away/beach/resort/janibar)
"aQ" = (
@@ -787,7 +787,7 @@
/area/tether_away/beach/powershed)
"mu" = (
/obj/structure/table/steel_reinforced,
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
dir = 8
},
/turf/simulated/floor/lino,
diff --git a/_maps/map_levels/192x192/Class_M.dmm b/_maps/map_levels/192x192/Class_M.dmm
index 00010161839..f0d2790d539 100644
--- a/_maps/map_levels/192x192/Class_M.dmm
+++ b/_maps/map_levels/192x192/Class_M.dmm
@@ -7,7 +7,7 @@
/area/class_m/outside)
"aq" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/turf/simulated/floor/wood/classm,
/area/class_m/inside)
"aN" = (
@@ -292,7 +292,7 @@
/area/class_m/outside)
"iQ" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/obj/machinery/light{
dir = 1
},
@@ -988,7 +988,7 @@
/area/class_m/inside)
"xX" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_coffee/full,
+/obj/machinery/chemical_dispenser/catering/bar_coffee,
/obj/structure/sign/double/barsign{
pixel_y = 32
},
diff --git a/_maps/map_levels/192x192/lavaland.dmm b/_maps/map_levels/192x192/lavaland.dmm
index bf17122b9dc..6a5bfa1c936 100644
--- a/_maps/map_levels/192x192/lavaland.dmm
+++ b/_maps/map_levels/192x192/lavaland.dmm
@@ -1091,13 +1091,13 @@
/area/lavaland/central/base/common)
"ui" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/obj/effect/debris/cleanable/cobweb,
/turf/simulated/floor/wood,
/area/lavaland/central/base/common)
"uk" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/turf/simulated/floor/wood,
/area/lavaland/central/base/common)
"ut" = (
diff --git a/_maps/map_levels/192x192/miaphus_beach.dmm b/_maps/map_levels/192x192/miaphus_beach.dmm
index f2e815351e3..3df58bcd2ac 100644
--- a/_maps/map_levels/192x192/miaphus_beach.dmm
+++ b/_maps/map_levels/192x192/miaphus_beach.dmm
@@ -883,7 +883,7 @@
/area/tether_away/beach/resort/fishing)
"fL" = (
/obj/structure/table/woodentable,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/turf/simulated/floor/tiled/steel_dirty,
/area/tether_away/beach/bunker/mess)
"fO" = (
@@ -2451,7 +2451,7 @@
/area/tether_away/beach/aa)
"td" = (
/obj/structure/table/woodentable,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/turf/simulated/floor/tiled/steel_dirty,
/area/tether_away/beach/bunker/mess)
"tj" = (
@@ -3391,7 +3391,7 @@
/area/tether_away/beach/resort/bunk)
"Ce" = (
/obj/structure/table/steel_reinforced,
-/obj/machinery/chemical_dispenser/bar_alc/full{
+/obj/machinery/chemical_dispenser/catering/bar_alc{
dir = 8
},
/turf/simulated/floor/tiled/old_tile/white,
@@ -4994,7 +4994,7 @@
/area/tether_away/beach/desalinator)
"QX" = (
/obj/structure/table/steel_reinforced,
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
dir = 8
},
/turf/simulated/floor/tiled/old_tile/white,
diff --git a/_maps/map_levels/192x192/tradeport.dmm b/_maps/map_levels/192x192/tradeport.dmm
index 95cfb0e9333..01f80e1c6f3 100644
--- a/_maps/map_levels/192x192/tradeport.dmm
+++ b/_maps/map_levels/192x192/tradeport.dmm
@@ -525,7 +525,7 @@
/area/tradeport/commhall)
"cg" = (
/obj/structure/table/standard,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/turf/simulated/floor/tiled/old_tile/gray,
/area/shuttle/trade_ship/general)
"ch" = (
@@ -9395,7 +9395,7 @@
/area/tradeport/cyndishow)
"JW" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_alc/full{
+/obj/machinery/chemical_dispenser/catering/bar_alc{
dir = 1
},
/obj/effect/floor_decal/spline/plain,
@@ -12938,7 +12938,7 @@
/area/shuttle/trade_ship/general)
"XR" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
dir = 1
},
/obj/machinery/light/small,
diff --git a/_maps/rift-08-west_deep.dmm b/_maps/rift-08-west_deep.dmm
index 6f7e3810e07..f097783361a 100644
--- a/_maps/rift-08-west_deep.dmm
+++ b/_maps/rift-08-west_deep.dmm
@@ -5228,7 +5228,7 @@
/obj/effect/floor_decal/spline/fancy/wood{
dir = 4
},
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
dir = 8
},
/turf/simulated/floor/wood,
diff --git a/_maps/submaps/level_specific/class_h/AuxiliaryResearchFacility.dmm b/_maps/submaps/level_specific/class_h/AuxiliaryResearchFacility.dmm
index a40fbbaa84b..cb8809b6d06 100644
--- a/_maps/submaps/level_specific/class_h/AuxiliaryResearchFacility.dmm
+++ b/_maps/submaps/level_specific/class_h/AuxiliaryResearchFacility.dmm
@@ -136,7 +136,7 @@
/area/class_h/POIs/AuxiliaryResearchFacility)
"cA" = (
/obj/structure/table/woodentable,
-/obj/machinery/chemical_dispenser/bar_coffee/full,
+/obj/machinery/chemical_dispenser/catering/bar_coffee,
/turf/simulated/floor/lino,
/area/class_h/POIs/AuxiliaryResearchFacility)
"cE" = (
@@ -431,7 +431,7 @@
/area/class_h/POIs/AuxiliaryResearchFacility)
"jN" = (
/obj/structure/table/woodentable,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/obj/machinery/light{
dir = 4
},
@@ -2119,7 +2119,7 @@
/area/class_h/POIs/AuxiliaryResearchFacility)
"Xw" = (
/obj/structure/table/woodentable,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/turf/simulated/floor/lino,
/area/class_h/POIs/AuxiliaryResearchFacility)
"XD" = (
diff --git a/_maps/submaps/level_specific/class_h/BunkerH.dmm b/_maps/submaps/level_specific/class_h/BunkerH.dmm
index 663f94a2b00..d8ebbf0045a 100644
--- a/_maps/submaps/level_specific/class_h/BunkerH.dmm
+++ b/_maps/submaps/level_specific/class_h/BunkerH.dmm
@@ -47,7 +47,7 @@
/area/class_h/POIs/vault)
"cA" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/obj/effect/debris/cleanable/dirt,
/obj/machinery/light{
dir = 1
@@ -622,7 +622,7 @@
/area/class_h/explored)
"Vw" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/obj/effect/debris/cleanable/dirt,
/turf/simulated/floor/tiled,
/area/class_h/POIs/vault)
diff --git a/_maps/submaps/level_specific/class_h/desertsaloon.dmm b/_maps/submaps/level_specific/class_h/desertsaloon.dmm
index b1a7df45523..f1370c50a51 100644
--- a/_maps/submaps/level_specific/class_h/desertsaloon.dmm
+++ b/_maps/submaps/level_specific/class_h/desertsaloon.dmm
@@ -8,7 +8,7 @@
/area/class_h/POIs/saloon)
"bF" = (
/obj/structure/table/wooden_reinforced,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/turf/simulated/floor/wood/classh,
/area/class_h/POIs/saloon)
"cr" = (
diff --git a/_maps/submaps/level_specific/class_h/highnoonH.dmm b/_maps/submaps/level_specific/class_h/highnoonH.dmm
index a5025cb5f29..2a4604b828d 100644
--- a/_maps/submaps/level_specific/class_h/highnoonH.dmm
+++ b/_maps/submaps/level_specific/class_h/highnoonH.dmm
@@ -121,7 +121,7 @@
/area/class_h/POIs/WW_Town)
"ua" = (
/obj/structure/table/woodentable,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/turf/simulated/floor/wood/classh,
/area/class_h/POIs/WW_Town)
"ug" = (
diff --git a/_maps/submaps/plains/Diner.dmm b/_maps/submaps/plains/Diner.dmm
index f20bf5414f2..d37293b6c91 100644
--- a/_maps/submaps/plains/Diner.dmm
+++ b/_maps/submaps/plains/Diner.dmm
@@ -342,7 +342,7 @@
/area/submap/Diner)
"be" = (
/obj/structure/table/standard,
-/obj/machinery/chemical_dispenser/bar_coffee,
+/obj/machinery/chemical_dispenser/catering/bar_coffee,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"bf" = (
diff --git a/_maps/submaps/plains/Diner_vr.dmm b/_maps/submaps/plains/Diner_vr.dmm
index c7a607ff7f9..67d63b084b6 100644
--- a/_maps/submaps/plains/Diner_vr.dmm
+++ b/_maps/submaps/plains/Diner_vr.dmm
@@ -354,7 +354,7 @@
/area/submap/Diner)
"bh" = (
/obj/structure/table/standard,
-/obj/machinery/chemical_dispenser/bar_coffee,
+/obj/machinery/chemical_dispenser/catering/bar_coffee,
/turf/simulated/floor/tiled/white,
/area/submap/Diner)
"bi" = (
diff --git a/_maps/templates/admin/dhael_centcom.dmm b/_maps/templates/admin/dhael_centcom.dmm
index a54f88be465..4b7cf3518b7 100644
--- a/_maps/templates/admin/dhael_centcom.dmm
+++ b/_maps/templates/admin/dhael_centcom.dmm
@@ -1419,7 +1419,7 @@
/area/centcom/control)
"dF" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_coffee/full,
+/obj/machinery/chemical_dispenser/catering/bar_coffee,
/obj/effect/floor_decal/corner/blue/diagonal{
dir = 4
},
@@ -3235,7 +3235,7 @@
/area/centcom/evac)
"iR" = (
/obj/structure/table/reinforced,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/turf/unsimulated/floor/steel{
icon = 'icons/turf/floors.dmi';
icon_state = "wood"
@@ -5026,7 +5026,7 @@
/area/centcom/security)
"oD" = (
/obj/structure/table/standard,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/obj/item/storage/box/glasses/square,
/obj/effect/floor_decal/borderfloor{
dir = 9
@@ -6372,7 +6372,7 @@
/area/centcom/command)
"rc" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_coffee/full,
+/obj/machinery/chemical_dispenser/catering/bar_coffee,
/turf/unsimulated/floor{
icon_state = "lino"
},
@@ -11022,7 +11022,7 @@
/area/centcom/security)
"HM" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_coffee/full,
+/obj/machinery/chemical_dispenser/catering/bar_coffee,
/obj/machinery/camera/network/crescent,
/turf/unsimulated/floor/steel{
icon = 'icons/turf/floors.dmi';
@@ -12069,7 +12069,7 @@
/area/centcom/specops)
"LR" = (
/obj/structure/table/reinforced,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/turf/unsimulated/floor/steel{
icon = 'icons/turf/floors.dmi';
icon_state = "wood"
@@ -14081,7 +14081,7 @@
/area/centcom/security)
"TY" = (
/obj/structure/table/reinforced,
-/obj/machinery/chemical_dispenser/biochemistry/full,
+/obj/machinery/chemical_dispenser/biochemistry,
/turf/unsimulated/floor{
icon_state = "dark"
},
diff --git a/_maps/templates/admin/ert.dmm b/_maps/templates/admin/ert.dmm
index 89ad335924c..56205ffc420 100644
--- a/_maps/templates/admin/ert.dmm
+++ b/_maps/templates/admin/ert.dmm
@@ -3243,7 +3243,7 @@
/area/ship/ert/med)
"yJ" = (
/obj/structure/table/steel_reinforced,
-/obj/machinery/chemical_dispenser/biochemistry/full,
+/obj/machinery/chemical_dispenser/biochemistry,
/obj/item/reagent_containers/glass/beaker/large,
/obj/machinery/light,
/turf/simulated/floor/tiled/techfloor,
diff --git a/_maps/templates/admin/ert_base.dmm b/_maps/templates/admin/ert_base.dmm
index 6e206b8d87b..8043163265a 100644
--- a/_maps/templates/admin/ert_base.dmm
+++ b/_maps/templates/admin/ert_base.dmm
@@ -248,7 +248,7 @@
/area/shuttle/specops/centcom)
"aD" = (
/obj/structure/table/steel_reinforced,
-/obj/machinery/chemical_dispenser/biochemistry/full,
+/obj/machinery/chemical_dispenser/biochemistry,
/obj/item/reagent_containers/glass/beaker/large,
/turf/simulated/shuttle/floor/black,
/area/shuttle/specops/centcom)
diff --git a/_maps/templates/admin/kk_mercship.dmm b/_maps/templates/admin/kk_mercship.dmm
index 4964d01baf4..7871a4aac88 100644
--- a/_maps/templates/admin/kk_mercship.dmm
+++ b/_maps/templates/admin/kk_mercship.dmm
@@ -972,7 +972,7 @@
/turf/simulated/floor/tiled/white,
/area/ship/manta/med)
"eF" = (
-/obj/machinery/chemical_dispenser/biochemistry/full,
+/obj/machinery/chemical_dispenser/biochemistry,
/obj/structure/table/steel_reinforced,
/obj/item/reagent_containers/glass/beaker/large,
/obj/effect/floor_decal/techfloor{
@@ -5235,7 +5235,7 @@
/area/ship/manta/armoury_as)
"zo" = (
/obj/structure/table/standard,
-/obj/machinery/chemical_dispenser/bar_soft/full{
+/obj/machinery/chemical_dispenser/catering/bar_soft{
dir = 1
},
/obj/effect/floor_decal/techfloor,
@@ -7956,7 +7956,7 @@
/turf/simulated/wall/rshull,
/area/ship/manta/radiator_port)
"Or" = (
-/obj/machinery/chemical_dispenser/bar_coffee/full{
+/obj/machinery/chemical_dispenser/catering/bar_coffee{
dir = 4
},
/obj/structure/table/woodentable,
diff --git a/_maps/templates/admin/mercbase.dmm b/_maps/templates/admin/mercbase.dmm
index ec4d98f9142..73442a61c87 100644
--- a/_maps/templates/admin/mercbase.dmm
+++ b/_maps/templates/admin/mercbase.dmm
@@ -1116,7 +1116,7 @@
/area/antag/antag_base)
"bN" = (
/obj/structure/table/marble,
-/obj/machinery/chemical_dispenser/bar_coffee/full,
+/obj/machinery/chemical_dispenser/catering/bar_coffee,
/turf/unsimulated/floor{
icon_state = "cult";
name = "plating"
@@ -2394,7 +2394,7 @@
/area/antag/antag_base)
"dS" = (
/obj/structure/table/standard,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/turf/unsimulated/floor{
icon_state = "white"
},
diff --git a/_maps/templates/admin/skipjack.dmm b/_maps/templates/admin/skipjack.dmm
index f8d798db7bb..b5cc4cb92a6 100644
--- a/_maps/templates/admin/skipjack.dmm
+++ b/_maps/templates/admin/skipjack.dmm
@@ -105,7 +105,7 @@
/area/skipjack_station)
"aq" = (
/obj/structure/table/standard,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/turf/unsimulated/floor{
icon_state = "white"
},
diff --git a/_maps/templates/admin/wizard.dmm b/_maps/templates/admin/wizard.dmm
index 94ff13228cd..b5952d69bcf 100644
--- a/_maps/templates/admin/wizard.dmm
+++ b/_maps/templates/admin/wizard.dmm
@@ -13,7 +13,7 @@
},
/area/wizard_station)
"ad" = (
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/obj/structure/table/marble,
/turf/unsimulated/floor{
icon_state = "white"
diff --git a/_maps/templates/archive/tradeship.dmm b/_maps/templates/archive/tradeship.dmm
index 7e1f08e6699..011cbda60b6 100644
--- a/_maps/templates/archive/tradeship.dmm
+++ b/_maps/templates/archive/tradeship.dmm
@@ -291,7 +291,7 @@
/area/shuttle/trade)
"aR" = (
/obj/structure/table/standard,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/turf/simulated/shuttle/floor/black,
/area/shuttle/trade)
"aS" = (
diff --git a/_maps/templates/shelters/shelter_3.dmm b/_maps/templates/shelters/shelter_3.dmm
index b392908adc2..6cbf727d46b 100644
--- a/_maps/templates/shelters/shelter_3.dmm
+++ b/_maps/templates/shelters/shelter_3.dmm
@@ -25,12 +25,12 @@
/area/survivalpod)
"f" = (
/obj/structure/table/gamblingtable,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/turf/simulated/shuttle/floor/voidcraft/dark,
/area/survivalpod)
"g" = (
/obj/structure/table/gamblingtable,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/obj/machinery/light{
dir = 1
},
diff --git a/_maps/templates/shuttles/overmaps/generic/cruise_ship.dmm b/_maps/templates/shuttles/overmaps/generic/cruise_ship.dmm
index 5326f50d4a1..25592f635c3 100644
--- a/_maps/templates/shuttles/overmaps/generic/cruise_ship.dmm
+++ b/_maps/templates/shuttles/overmaps/generic/cruise_ship.dmm
@@ -458,7 +458,7 @@
/area/shuttle/cruise_ship)
"QK" = (
/obj/structure/table/hardwoodtable,
-/obj/machinery/chemical_dispenser/bar_coffee/full{
+/obj/machinery/chemical_dispenser/catering/bar_coffee{
dir = 4
},
/turf/simulated/floor/wood,
@@ -574,7 +574,7 @@
/area/shuttle/cruise_ship)
"YK" = (
/obj/structure/table/hardwoodtable,
-/obj/machinery/chemical_dispenser/bar_alc/full{
+/obj/machinery/chemical_dispenser/catering/bar_alc{
dir = 4
},
/turf/simulated/floor/wood,
diff --git a/_maps/templates/shuttles/overmaps/generic/cruiser.dmm b/_maps/templates/shuttles/overmaps/generic/cruiser.dmm
index 58e00fd1b77..6be130643e3 100644
--- a/_maps/templates/shuttles/overmaps/generic/cruiser.dmm
+++ b/_maps/templates/shuttles/overmaps/generic/cruiser.dmm
@@ -414,17 +414,17 @@
/area/mothership/breakroom)
"aY" = (
/obj/structure/table/steel_reinforced,
-/obj/machinery/chemical_dispenser/bar_alc/full,
+/obj/machinery/chemical_dispenser/catering/bar_alc,
/turf/simulated/floor/wood,
/area/mothership/breakroom)
"aZ" = (
/obj/structure/table/steel_reinforced,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/turf/simulated/floor/wood,
/area/mothership/breakroom)
"ba" = (
/obj/structure/table/steel_reinforced,
-/obj/machinery/chemical_dispenser/bar_coffee/full,
+/obj/machinery/chemical_dispenser/catering/bar_coffee,
/turf/simulated/floor/wood,
/area/mothership/breakroom)
"bb" = (
@@ -2613,7 +2613,7 @@
},
/obj/machinery/atmospherics/component/unary/vent_scrubber/on,
/obj/structure/table/steel_reinforced,
-/obj/machinery/chemical_dispenser/biochemistry/full,
+/obj/machinery/chemical_dispenser/biochemistry,
/turf/simulated/floor/tiled/white,
/area/mothership/chemistry)
"fN" = (
diff --git a/_maps/templates/shuttles/overmaps/generic/itglight.dmm b/_maps/templates/shuttles/overmaps/generic/itglight.dmm
index 94d9201fd0f..0c7d61ca1ea 100644
--- a/_maps/templates/shuttles/overmaps/generic/itglight.dmm
+++ b/_maps/templates/shuttles/overmaps/generic/itglight.dmm
@@ -6432,7 +6432,7 @@
/turf/simulated/floor,
/area/itglight/portengi)
"RZ" = (
-/obj/machinery/chemical_dispenser/biochemistry/full,
+/obj/machinery/chemical_dispenser/biochemistry,
/obj/structure/table/reinforced,
/obj/machinery/light{
dir = 8
@@ -7451,7 +7451,7 @@
/area/itglight/showers)
"Zd" = (
/obj/structure/table/steel_reinforced,
-/obj/machinery/chemical_dispenser/bar_soft/full,
+/obj/machinery/chemical_dispenser/catering/bar_soft,
/turf/simulated/floor/tiled/eris/cafe,
/area/itglight/kitchen)
"Zf" = (
diff --git a/citadel.dme b/citadel.dme
index 05d19913f9f..25000494952 100644
--- a/citadel.dme
+++ b/citadel.dme
@@ -225,6 +225,7 @@
#include "code\__DEFINES\radiation\insulation.dm"
#include "code\__DEFINES\radiation\mobs.dm"
#include "code\__DEFINES\radiation\simulation.dm"
+#include "code\__DEFINES\reagents\flags.dm"
#include "code\__DEFINES\rendering\alert.dm"
#include "code\__DEFINES\rendering\ao.dm"
#include "code\__DEFINES\rendering\atom_huds.dm"
@@ -1775,7 +1776,6 @@
#include "code\modules\actionspeed\modifiers\base.dm"
#include "code\modules\admin\admin.dm"
#include "code\modules\admin\admin_attack_log.dm"
-#include "code\modules\admin\admin_investigate.dm"
#include "code\modules\admin\admin_memo.dm"
#include "code\modules\admin\admin_ranks.dm"
#include "code\modules\admin\admin_secrets.dm"
@@ -1788,6 +1788,7 @@
#include "code\modules\admin\create_object.dm"
#include "code\modules\admin\create_turf.dm"
#include "code\modules\admin\holder2.dm"
+#include "code\modules\admin\investigate.dm"
#include "code\modules\admin\IsBanned.dm"
#include "code\modules\admin\map_capture.dm"
#include "code\modules\admin\NewBan.dm"
@@ -3862,13 +3863,14 @@
#include "code\modules\reagents\reagent_containers.dm"
#include "code\modules\reagents\Topical-Recipes.dm"
#include "code\modules\reagents\chemistry\_readme.dm"
-#include "code\modules\reagents\chemistry\chemical_reactions.dm"
#include "code\modules\reagents\chemistry\colors.dm"
#include "code\modules\reagents\chemistry\helpers.dm"
#include "code\modules\reagents\chemistry\holder.dm"
#include "code\modules\reagents\chemistry\logging.dm"
#include "code\modules\reagents\chemistry\machinery.dm"
#include "code\modules\reagents\chemistry\metabolism.dm"
+#include "code\modules\reagents\chemistry\reaction.dm"
+#include "code\modules\reagents\chemistry\wiki_generation.dm"
#include "code\modules\reagents\chemistry\reagent.dm"
#include "code\modules\reagents\chemistry\reagents\Chemistry-Reagents-Core.dm"
#include "code\modules\reagents\chemistry\reagents\Chemistry-Reagents-Dispenser.dm"
@@ -3883,20 +3885,26 @@
#include "code\modules\reagents\distilling\Distilling-Recipes.dm"
#include "code\modules\reagents\distilling\distilling.dm"
#include "code\modules\reagents\machinery\chem_master.dm"
-#include "code\modules\reagents\machinery\dispenser\_defines.dm"
+#include "code\modules\reagents\machinery\reagent_dispenser.dm"
#include "code\modules\reagents\machinery\dispenser\cartridge.dm"
-#include "code\modules\reagents\machinery\dispenser\cartridge_presets.dm"
-#include "code\modules\reagents\machinery\dispenser\cartridge_presets_vr.dm"
-#include "code\modules\reagents\machinery\dispenser\cartridge_spawn.dm"
-#include "code\modules\reagents\machinery\dispenser\dispenser2.dm"
-#include "code\modules\reagents\machinery\dispenser\dispenser2_energy.dm"
+#include "code\modules\reagents\machinery\dispenser\dispenser.dm"
#include "code\modules\reagents\machinery\dispenser\dispenser_presets.dm"
-#include "code\modules\reagents\machinery\dispenser\dispenser_presets_vr.dm"
-#include "code\modules\reagents\machinery\dispenser\reagent_tank.dm"
#include "code\modules\reagents\machinery\dispenser\supply.dm"
+#include "code\modules\reagents\machinery\dispenser\synthesizer.dm"
+#include "code\modules\reagents\machinery\reagent_dispenser\acid.dm"
+#include "code\modules\reagents\machinery\reagent_dispenser\beer.dm"
+#include "code\modules\reagents\machinery\reagent_dispenser\foam.dm"
+#include "code\modules\reagents\machinery\reagent_dispenser\fuel.dm"
+#include "code\modules\reagents\machinery\reagent_dispenser\helium.dm"
+#include "code\modules\reagents\machinery\reagent_dispenser\oil.dm"
+#include "code\modules\reagents\machinery\reagent_dispenser\pepper.dm"
+#include "code\modules\reagents\machinery\reagent_dispenser\virusfood.dm"
+#include "code\modules\reagents\machinery\reagent_dispenser\water.dm"
+#include "code\modules\reagents\machinery\reagent_dispenser\watercooler.dm"
#include "code\modules\reagents\reagent_containers\blood_pack.dm"
#include "code\modules\reagents\reagent_containers\blood_pack_vr.dm"
#include "code\modules\reagents\reagent_containers\borghydro.dm"
+#include "code\modules\reagents\reagent_containers\cartridge.dm"
#include "code\modules\reagents\reagent_containers\dropper.dm"
#include "code\modules\reagents\reagent_containers\glass.dm"
#include "code\modules\reagents\reagent_containers\hard_candy.dm"
@@ -3963,6 +3971,7 @@
#include "code\modules\research\designs\circuits\disks.dm"
#include "code\modules\research\designs\circuits\machine.dm"
#include "code\modules\research\designs\circuits\computers\misc.dm"
+#include "code\modules\research\designs\circuits\machines\chemistry.dm"
#include "code\modules\research\designs\circuits\machines\misc.dm"
#include "code\modules\resleeving\circuitboards.dm"
#include "code\modules\resleeving\computers.dm"
diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm
index 59a3bd350ff..4ebe5609ddf 100644
--- a/code/__DEFINES/logging.dm
+++ b/code/__DEFINES/logging.dm
@@ -17,6 +17,7 @@ GLOBAL_VAR(##gvar);
#define INVESTIGATE_CIRCUIT "circuit"
#define INVESTIGATE_PRESENTS "presents"
#define INVESTIGATE_RADIATION "radiation"
+#define INVESTIGATE_REAGENTS "reagents"
#define INVESTIGATE_RECORDS "records"
#define INVESTIGATE_SINGULO "singulo"
#define INVESTIGATE_SUPERMATTER "supermatter"
@@ -27,6 +28,7 @@ GLOBAL_VAR(##gvar);
INVESTIGATE_CIRCUIT, \
INVESTIGATE_PRESENTS, \
INVESTIGATE_RADIATION, \
+ INVESTIGATE_REAGENTS, \
INVESTIGATE_RECORDS, \
INVESTIGATE_SINGULO, \
INVESTIGATE_SUPERMATTER, \
diff --git a/code/__DEFINES/misc/message_ranges.dm b/code/__DEFINES/misc/message_ranges.dm
index 434af54c848..ac904468230 100644
--- a/code/__DEFINES/misc/message_ranges.dm
+++ b/code/__DEFINES/misc/message_ranges.dm
@@ -6,6 +6,10 @@
#define MESSAGE_RANGE_COMBAT_LOUD 7
/// message range for most construction / deconstruction actions
-#define MESSAGE_RANGE_CONSTRUCTION 5
+#define MESSAGE_RANGE_CONSTRUCTION 3
/// message range for most machine / structure configuration actions
#define MESSAGE_RANGE_CONFIGURATION 3
+/// silent-ish inv ops like swapping beacons
+#define MESSAGE_RANGE_INVENTORY_SOFT 3
+/// hard-ish inv ops like taking things out of backpacks
+#define MESSAGE_RANGE_INVENTORY_HARD 7
diff --git a/code/__DEFINES/procs/do_after.dm b/code/__DEFINES/procs/do_after.dm
index b6714e95754..6fb0882a5c2 100644
--- a/code/__DEFINES/procs/do_after.dm
+++ b/code/__DEFINES/procs/do_after.dm
@@ -52,3 +52,7 @@
#define INTERACTING_FOR_DO_AFTER "do_after"
/// Dynaimc tool usage in progress
#define INTERACTING_FOR_DYNAMIC_TOOL "dynamic_tools"
+/// Generic 'something' in attack hand
+#define INTERACTING_FOR_ATTACK_HAND "attack_hand"
+/// Generic 'something' in alt click
+#define INTERACTING_FOR_ALT_CLICK "alt_click"
diff --git a/code/__DEFINES/reagents/flags.dm b/code/__DEFINES/reagents/flags.dm
new file mode 100644
index 00000000000..5e8296150bf
--- /dev/null
+++ b/code/__DEFINES/reagents/flags.dm
@@ -0,0 +1,11 @@
+//? flags for /datum/reagents/var/reagent_holder_flags
+
+// none yet
+
+//? flags for /datum/reagent/var/reagent_flags
+
+// none yet
+
+//? flags for /datum/chemical_reaction/var/chemical_reaction_flags
+
+// none yet
diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm
index 622fe7c6efd..501ab7a5f42 100644
--- a/code/__HELPERS/_logging.dm
+++ b/code/__HELPERS/_logging.dm
@@ -391,6 +391,12 @@ GLOBAL_LIST_INIT(testing_global_profiler, list("_PROFILE_NAME" = "Global"))
else if(A.loc)
return "(UNKNOWN (?, ?, ?))"
+/proc/ref_name(atom/A)
+ return "[A] ([REF(A)])"
+
+/proc/ref_name_path(atom/A)
+ return "[A] ([REF(A)]) \[[A.type]\]"
+
/// VSTATION SPECIFIC LOGGING. ///
/proc/log_debug(text)
if (config_legacy.log_debug)
diff --git a/code/controllers/subsystem/processing/chemistry.dm b/code/controllers/subsystem/processing/chemistry.dm
index 7cc072d8505..d42a5d360a4 100644
--- a/code/controllers/subsystem/processing/chemistry.dm
+++ b/code/controllers/subsystem/processing/chemistry.dm
@@ -3,13 +3,17 @@ PROCESSING_SUBSYSTEM_DEF(chemistry)
wait = 10
subsystem_flags = SS_BACKGROUND|SS_POST_FIRE_TIMING
init_order = INIT_ORDER_CHEMISTRY
+
+ /// id to instance dict of reagents
+ var/list/reagent_lookup = list()
+
var/list/chemical_reactions = list()
var/list/chemical_reactions_by_reagent = list()
- var/list/chemical_reagents = list()
+
/datum/controller/subsystem/processing/chemistry/Recover()
chemical_reactions = SSchemistry.chemical_reactions
- chemical_reagents = SSchemistry.chemical_reagents
+ reagent_lookup = SSchemistry.reagent_lookup
// honestly hate that we have to do this but some things INITIALIZE_IMMEDIATE so uh fuck me I guess!
/datum/controller/subsystem/processing/chemistry/PreInit(recovering)
@@ -41,9 +45,19 @@ PROCESSING_SUBSYSTEM_DEF(chemistry)
/// Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id
/datum/controller/subsystem/processing/chemistry/proc/initialize_chemical_reagents()
var/paths = typesof(/datum/reagent) - /datum/reagent
- chemical_reagents = list()
- for(var/path in paths)
+ reagent_lookup = list()
+ for(var/datum/reagent/path as anything in paths)
+ if(initial(path.abstract_type) == path)
+ continue
var/datum/reagent/D = new path()
if(!D.name)
continue
- chemical_reagents[D.id] = D
+ reagent_lookup[D.id] = D
+
+/**
+ * fetches the instance of a reagent
+ *
+ * do not edit the returned instance, it is global!
+ */
+/datum/controller/subsystem/processing/chemistry/proc/get_reagent(datum/reagent/id_or_path)
+ return reagent_lookup[ispath(id_or_path)? initial(id_or_path.id) : id_or_path]
diff --git a/code/game/atoms/defense.dm b/code/game/atoms/defense.dm
index 4a1a3534981..0d0a2057e77 100644
--- a/code/game/atoms/defense.dm
+++ b/code/game/atoms/defense.dm
@@ -34,7 +34,18 @@
* called to drop the products of deconstruction
*
* @params
- * - method - how we were deconstructed
+ * * method - how we were deconstructed
*/
/atom/proc/drop_products(method)
return
+
+/**
+ * called to move a product to a place
+ *
+ * @params
+ * * method - how we were deconstructed
+ * * dropping - movable in question
+ * * where - where to move to
+ */
+/atom/proc/drop_product(method, atom/movable/dropping, atom/where)
+ dropping.forceMove(where || drop_location())
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index 601460a18d1..00ce70a3195 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -49,7 +49,7 @@
use_power = USE_POWER_IDLE
idle_power_usage = 50
active_power_usage = 300
- interact_offline = TRUE
+ interaction_flags_machine = INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_ALLOW_SILICON
circuit = /obj/item/circuitboard/clonescanner
var/locked = FALSE
@@ -57,10 +57,6 @@
var/mob/living/carbon/occupant = null
var/obj/item/reagent_containers/glass/beaker = null
-/obj/machinery/dna_scannernew/Initialize(mapload)
- . = ..()
- default_apply_parts()
-
/obj/machinery/dna_scannernew/relaymove(mob/user)
if (user.stat)
return
diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm
index 6826953537d..0a95097a387 100644
--- a/code/game/machinery/OpTable.dm
+++ b/code/game/machinery/OpTable.dm
@@ -15,10 +15,6 @@
var/strapped = FALSE
var/obj/machinery/computer/operating/computer = null
-/obj/machinery/optable/Initialize(mapload)
- . = ..()
- default_apply_parts()
-
/obj/machinery/optable/Initialize(mapload)
. = ..()
for(var/direction in list(NORTH,EAST,SOUTH,WEST))
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 0668e89e52e..e5311057165 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -8,7 +8,7 @@
dir = 8
use_power = USE_POWER_IDLE
idle_power_usage = 40
- interact_offline = TRUE
+ interaction_flags_machine = INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_ALLOW_SILICON
circuit = /obj/item/circuitboard/sleeper_console
/obj/machinery/sleep_console/Initialize(mapload, newdir)
@@ -106,7 +106,7 @@
else
data["occupant"] = 0
if(S.beaker)
- data["beaker"] = S.beaker.reagents.get_free_space()
+ data["beaker"] = S.beaker.reagents.available_volume()
else
data["beaker"] = -1
data["filtering"] = S.filtering
@@ -182,7 +182,6 @@
/obj/machinery/sleeper/Initialize(mapload)
. = ..()
beaker = new /obj/item/reagent_containers/glass/beaker/large(src)
- default_apply_parts()
/obj/machinery/sleeper/Destroy()
if(console)
diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm
index 18efb2ccb86..63e2c1fd57b 100644
--- a/code/game/machinery/_machinery.dm
+++ b/code/game/machinery/_machinery.dm
@@ -139,8 +139,6 @@
var/clicksound
///Volume of interface sounds.
var/clickvol = 40
- ///Can the machine be interacted with while de-powered.
- var/interact_offline = FALSE
var/obj/item/circuitboard/circuit = null
///If false, SSmachines. If true, SSfastprocess.
var/speed_process = FALSE
@@ -156,6 +154,7 @@
if(ispath(circuit))
circuit = new circuit(src)
+ default_apply_parts()
if(!speed_process)
START_MACHINE_PROCESSING(src)
@@ -244,7 +243,7 @@
return (machine_stat & (NOPOWER | BROKEN | additional_flags))
/obj/machinery/CanUseTopic(mob/user)
- if(!interact_offline && (machine_stat & (NOPOWER | BROKEN)))
+ if(!(interaction_flags_machine & INTERACT_MACHINE_OFFLINE) && (machine_stat & (NOPOWER | BROKEN)))
return UI_CLOSE
return ..()
@@ -470,6 +469,7 @@
/obj/machinery/proc/dismantle()
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
+ drop_products(ATOM_DECONSTRUCT_DISASSEMBLED)
on_deconstruction()
// If it doesn't have a circuit board, don't create a frame. Return a smack instead. BONK!
if(!circuit)
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 40b8308c7d2..811fed49874 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -15,10 +15,6 @@
light_color = "#00FF00"
var/obj/machinery/body_scanconsole/console
-/obj/machinery/bodyscanner/Initialize(mapload, newdir)
- . = ..()
- default_apply_parts()
-
/obj/machinery/bodyscanner/Destroy()
if(console)
console.scanner = null
diff --git a/code/game/machinery/air_alarm.dm b/code/game/machinery/air_alarm.dm
index 17e95076ed4..b4b2d977a7e 100644
--- a/code/game/machinery/air_alarm.dm
+++ b/code/game/machinery/air_alarm.dm
@@ -664,7 +664,7 @@ GLOBAL_LIST_EMPTY(air_alarms)
data["thresholds"] = thresholds
return data
-/obj/machinery/alarm/ui_act(action, params, datum/tgui/ui, datum/ui_state/state)
+/obj/machinery/alarm/ui_act(action, params, datum/tgui/ui)
if(..())
return TRUE
@@ -696,7 +696,7 @@ GLOBAL_LIST_EMPTY(air_alarms)
// Yes, this is kinda snowflaky; however, I would argue it would be far more snowflakey
// to include "custom hrefs" and all the other bullshit that nano states have just for the
// like, two UIs, that want remote access to other UIs.
- if((locked && !issilicon(usr) && !istype(state, /datum/ui_state/air_alarm_remote)) || (issilicon(usr) && aidisabled))
+ if((locked && !issilicon(usr) && !istype(ui.state, /datum/ui_state/air_alarm_remote)) || (issilicon(usr) && aidisabled))
return
var/device_id = params["id_tag"]
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index ff229296951..9a0d9c0aa36 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -5,6 +5,7 @@
icon = 'icons/obj/atmos.dmi'
icon_state = "yellow"
density = 1
+ interaction_flags_machine = INTERACT_MACHINE_OFFLINE
var/health = 100.0
w_class = ITEMSIZE_HUGE
@@ -37,7 +38,6 @@
var/temperature_resistance = 1000 + T0C
volume = 1000
use_power = USE_POWER_OFF
- interact_offline = 1 // Allows this to be used when not in powered area.
var/update_flag = 0
/obj/machinery/portable_atmospherics/canister/nitrous_oxide
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index ab6ca90d674..9256845dabb 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -37,7 +37,6 @@
if(!autolathe_recipes)
autolathe_recipes = new()
wires = new(src)
- default_apply_parts()
/obj/machinery/autolathe/Destroy()
QDEL_NULL(wires)
diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm
index f9ac2449007..8d31732f188 100644
--- a/code/game/machinery/biogenerator.dm
+++ b/code/game/machinery/biogenerator.dm
@@ -61,7 +61,6 @@
R.my_atom = src
beaker = new /obj/item/reagent_containers/glass/bottle(src)
- default_apply_parts()
item_list = list()
item_list["Food Items"] = list(
@@ -216,7 +215,7 @@
if(cost > points)
to_chat(usr, SPAN_DANGER("Insufficient biomass."))
return
- var/amt_to_actually_dispense = round(min(beaker.reagents.get_free_space(), br.reagent_amt))
+ var/amt_to_actually_dispense = round(min(beaker.reagents.available_volume(), br.reagent_amt))
if(amt_to_actually_dispense <= 0)
to_chat(usr, SPAN_DANGER("The loaded beaker is full!"))
return
diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm
index e5e498d1215..f5b03542472 100644
--- a/code/game/machinery/bioprinter.dm
+++ b/code/game/machinery/bioprinter.dm
@@ -61,10 +61,6 @@
"Adrenal Valve Cluster" = list(/obj/item/organ/internal/heart/replicant/rage, 80)
)
-/obj/machinery/organ_printer/Initialize(mapload, newdir)
- . = ..()
- default_apply_parts()
-
/obj/machinery/organ_printer/update_icon_state()
. = ..()
if(machine_stat & NOPOWER)
diff --git a/code/game/machinery/bomb_tester.dm b/code/game/machinery/bomb_tester.dm
index 8d9dbd58a2b..48d68ca5326 100644
--- a/code/game/machinery/bomb_tester.dm
+++ b/code/game/machinery/bomb_tester.dm
@@ -36,8 +36,7 @@
var/faketank_integrity
/obj/machinery/bomb_tester/Initialize(mapload)
- .=..()
- default_apply_parts()
+ . = ..()
faketank = new
/obj/machinery/bomb_tester/Destroy()
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index eecab2e25ff..f631634ec3d 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -16,10 +16,6 @@
var/obj/item/cell/charging = null
circuit = /obj/item/circuitboard/cell_charger
-/obj/machinery/cell_charger/Initialize(mapload, newdir)
- . = ..()
- default_apply_parts()
-
/obj/machinery/cell_charger/update_icon()
icon_state = "ccharger[charging ? 1 : 0]"
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 0a51789ea33..cf2de35d7fa 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -51,9 +51,8 @@
/// How many beakers can the machine hold?
var/container_limit = 3
-/obj/machinery/clonepod/Initialize(mapload, newdir)
+/obj/machinery/clonepod/Initialize(mapload)
. = ..()
- default_apply_parts()
update_icon()
/obj/machinery/clonepod/attack_ai(mob/user)
diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm
index 3cd803d3e7a..921e28aebaa 100644
--- a/code/game/machinery/computer/atmos_alert.dm
+++ b/code/game/machinery/computer/atmos_alert.dm
@@ -22,14 +22,14 @@ var/global/list/minor_air_alarms = list()
/obj/machinery/computer/atmos_alert/attack_hand(mob/user, list/params)
ui_interact(user)
-/obj/machinery/computer/atmos_alert/ui_interact(mob/user, datum/tgui/ui)
+/obj/machinery/computer/atmos_alert/ui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "AtmosAlertConsole", name)
ui.open()
/obj/machinery/computer/atmos_alert/ui_data(mob/user)
- var/list/data = list()
+ . = ..()
var/list/major_alarms = list()
var/list/minor_alarms = list()
@@ -39,10 +39,8 @@ var/global/list/minor_air_alarms = list()
for(var/datum/alarm/alarm in atmosphere_alarm.minor_alarms())
minor_alarms[++minor_alarms.len] = list("name" = sanitize(alarm.alarm_name()), "ref" = "\ref[alarm]")
- data["priority_alarms"] = major_alarms
- data["minor_alarms"] = minor_alarms
-
- return data
+ .["priority_alarms"] = major_alarms
+ .["minor_alarms"] = minor_alarms
/obj/machinery/computer/atmos_alert/update_icon()
if(!(machine_stat & (NOPOWER|BROKEN)))
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index ab1976aa188..22b551cc206 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -7,7 +7,7 @@
density = TRUE
anchored = TRUE
layer = UNDER_JUNK_LAYER
- interact_offline = TRUE
+ interaction_flags_machine = INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_ALLOW_SILICON
var/on = FALSE
use_power = USE_POWER_IDLE
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 9ade7477847..7eae65922e8 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -15,7 +15,7 @@
icon_state = "cellconsole"
circuit = /obj/item/circuitboard/cryopodcontrol
density = FALSE
- interact_offline = TRUE
+ interaction_flags_machine = INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_ALLOW_SILICON
var/mode = null
//Used for logging people entering cryosleep and important items they are carrying.
diff --git a/code/game/machinery/exonet_node.dm b/code/game/machinery/exonet_node.dm
index af8ea1c7f25..b13157631a2 100644
--- a/code/game/machinery/exonet_node.dm
+++ b/code/game/machinery/exonet_node.dm
@@ -23,8 +23,6 @@
// Description: Adds components to the machine for deconstruction. Also refreshes the descrition.
/obj/machinery/exonet_node/map/Initialize(mapload, newdir)
. = ..()
-
- default_apply_parts()
desc = "This machine is one of many, many nodes inside [GLOB.using_map.starsys_name]'s section of the Exonet, connecting the \
[GLOB.using_map.station_short] to the rest of the system, at least electronically."
update_desc()
diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm
index 9b69dd593d8..109988acaaa 100644
--- a/code/game/machinery/jukebox.dm
+++ b/code/game/machinery/jukebox.dm
@@ -66,10 +66,6 @@
)
-/obj/machinery/media/jukebox/Initialize(mapload)
- . = ..()
- default_apply_parts()
-
/obj/machinery/media/jukebox/Destroy()
qdel(wires)
wires = null
diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm
index 5eef2de8b04..6fa74842bee 100644
--- a/code/game/machinery/mass_driver.dm
+++ b/code/game/machinery/mass_driver.dm
@@ -15,10 +15,6 @@
var/id = 1
var/drive_range = 50 //this is mostly irrelevant since current mass drivers throw into space, but you could make a lower-range mass driver for interstation transport or something I guess.
-/obj/machinery/mass_driver/Initialize(mapload, newdir)
- . = ..()
- default_apply_parts()
-
/obj/machinery/mass_driver/attackby(obj/item/I, mob/user)
if(default_deconstruction_screwdriver(user, I))
return
diff --git a/code/game/machinery/partslathe_vr.dm b/code/game/machinery/partslathe_vr.dm
index 7d5f0d51a52..3f1041f8aa8 100644
--- a/code/game/machinery/partslathe_vr.dm
+++ b/code/game/machinery/partslathe_vr.dm
@@ -49,7 +49,6 @@
/obj/machinery/partslathe/Initialize(mapload)
. = ..()
- default_apply_parts()
update_icon()
update_recipe_list()
diff --git a/code/game/machinery/pda_multicaster.dm b/code/game/machinery/pda_multicaster.dm
index 9d148f1f5d9..324fc042db0 100644
--- a/code/game/machinery/pda_multicaster.dm
+++ b/code/game/machinery/pda_multicaster.dm
@@ -24,14 +24,10 @@
"cargo" = new /obj/item/pda/multicaster/cargo(src),
"civilian" = new /obj/item/pda/multicaster/civilian(src))
-/obj/machinery/pda_multicaster/prebuilt/Initialize(mapload, newdir)
- . = ..()
- default_apply_parts()
-
/obj/machinery/pda_multicaster/Destroy()
for(var/atom/movable/AM in contents)
qdel(AM)
- ..()
+ return ..()
/obj/machinery/pda_multicaster/update_icon()
if(on)
diff --git a/code/game/machinery/pipe/pipelayer.dm b/code/game/machinery/pipe/pipelayer.dm
index d79559e975b..c7205346492 100644
--- a/code/game/machinery/pipe/pipelayer.dm
+++ b/code/game/machinery/pipe/pipelayer.dm
@@ -24,7 +24,6 @@
/obj/machinery/pipelayer/Initialize(mapload)
. = ..()
W = new(src)
- default_apply_parts()
update_icon()
/obj/machinery/pipelayer/Destroy()
diff --git a/code/game/machinery/pointdefense.dm b/code/game/machinery/pointdefense.dm
index 1ffe17214cf..aea45a68569 100644
--- a/code/game/machinery/pointdefense.dm
+++ b/code/game/machinery/pointdefense.dm
@@ -27,10 +27,6 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
if(PC != src && PC.id_tag == id_tag)
warning("Two [src] with the same id_tag of [id_tag]")
id_tag = null
- // TODO - Remove this bit once machines are converted to Initialize
- if(ispath(circuit))
- circuit = new circuit(src)
- default_apply_parts()
/obj/machinery/pointdefense_control/get_description_interaction(mob/user)
. = ..()
@@ -140,10 +136,6 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
/obj/machinery/power/pointdefense/Initialize(mapload)
. = ..()
- // TODO - Remove this bit once machines are converted to Initialize
- if(ispath(circuit))
- circuit = new circuit(src)
- default_apply_parts()
if(anchored)
connect_to_network()
update_icon()
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 20229c70ea4..696eb07b9fd 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -18,10 +18,6 @@
var/base_power_draw = 20000
circuit = /obj/item/circuitboard/recharger
-/obj/machinery/recharger/Initialize(mapload)
- . = ..()
- default_apply_parts()
-
/obj/machinery/recharger/examine(mob/user)
. = ..()
. += "[charging ? "[charging]" : "Nothing"] is in [src]."
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index bacd14d2ec8..6ae3e591570 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -32,9 +32,8 @@
/// Power used per point of burn damage repaired.
var/wire_power_use = 500
-/obj/machinery/recharge_station/Initialize(mapload, newdir)
+/obj/machinery/recharge_station/Initialize(mapload)
. = ..()
- default_apply_parts()
update_icon()
/obj/machinery/recharge_station/proc/has_cell_power()
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index 734bf13ef2d..972999815f1 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -200,10 +200,6 @@
var/target_temp = T20C
var/mode = MODE_IDLE
-/obj/machinery/power/thermoregulator/Initialize(mapload)
- .=..()
- default_apply_parts()
-
/obj/machinery/power/thermoregulator/examine(mob/user)
. = ..()
. += "There is a small display that reads [target_temp]K."
diff --git a/code/game/machinery/telecomms/_telecomms.dm b/code/game/machinery/telecomms/_telecomms.dm
index 6b5dedd04b6..138aea71740 100644
--- a/code/game/machinery/telecomms/_telecomms.dm
+++ b/code/game/machinery/telecomms/_telecomms.dm
@@ -321,7 +321,7 @@
data["multitool"] = FALSE
data["multitool_buffer"] = null
- if(on || interact_offline)
+ if(on || (interaction_flags_machine & INTERACT_MACHINE_OFFLINE))
data["id"] = id
data["network"] = network
data["autolinkers"] = !!LAZYLEN(autolinkers)
@@ -505,7 +505,7 @@
return data
/obj/machinery/telecomms/broadcaster
- interact_offline = TRUE // because you can accidentally nuke power grids with these, need to be able to fix mistake
+ interaction_flags_machine = INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_ALLOW_SILICON
/obj/machinery/telecomms/broadcaster/Options_Act(action, params)
if(..())
@@ -527,7 +527,7 @@
return data
/obj/machinery/telecomms/receiver
- interact_offline = TRUE // because you can accidentally nuke power grids with these, need to be able to fix mistake
+ interaction_flags_machine = INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_ALLOW_SILICON
/obj/machinery/telecomms/receiver/Options_Act(action, params)
if(..())
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index 709e15d77f1..5ee8c0d451a 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -29,10 +29,6 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
//Linked bluespace radios
var/list/linked_radios_weakrefs = list()
-/obj/machinery/telecomms/broadcaster/Initialize(mapload)
- . = ..()
- default_apply_parts()
-
/obj/machinery/telecomms/broadcaster/proc/link_radio(var/obj/item/radio/R)
if(!istype(R))
return
diff --git a/code/game/machinery/telecomms/bus.dm b/code/game/machinery/telecomms/bus.dm
index 42de08a0c72..e74c6918eee 100644
--- a/code/game/machinery/telecomms/bus.dm
+++ b/code/game/machinery/telecomms/bus.dm
@@ -21,10 +21,6 @@
netspeed = 40
var/change_frequency = 0
-/obj/machinery/telecomms/bus/Initialize(mapload)
- . = ..()
- default_apply_parts()
-
/obj/machinery/telecomms/bus/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
if(is_freq_listening(signal))
diff --git a/code/game/machinery/telecomms/hub.dm b/code/game/machinery/telecomms/hub.dm
index 6644fa720ee..29938d3675f 100644
--- a/code/game/machinery/telecomms/hub.dm
+++ b/code/game/machinery/telecomms/hub.dm
@@ -21,10 +21,6 @@
long_range_link = 1
netspeed = 40
-/obj/machinery/telecomms/hub/Initialize(mapload)
- . = ..()
- default_apply_parts()
-
/obj/machinery/telecomms/hub/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
if(is_freq_listening(signal))
if(istype(machine_from, /obj/machinery/telecomms/receiver))
diff --git a/code/game/machinery/telecomms/processor.dm b/code/game/machinery/telecomms/processor.dm
index d05509e1f47..72a1df40170 100644
--- a/code/game/machinery/telecomms/processor.dm
+++ b/code/game/machinery/telecomms/processor.dm
@@ -19,10 +19,6 @@
circuit = /obj/item/circuitboard/telecomms/processor
var/process_mode = 1 // 1 = Uncompress Signals, 0 = Compress Signals
-/obj/machinery/telecomms/processor/Initialize(mapload)
- . = ..()
- default_apply_parts()
-
/obj/machinery/telecomms/processor/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
if(is_freq_listening(signal))
diff --git a/code/game/machinery/telecomms/receiver.dm b/code/game/machinery/telecomms/receiver.dm
index 83c7e7e6721..bbf4879bb8f 100644
--- a/code/game/machinery/telecomms/receiver.dm
+++ b/code/game/machinery/telecomms/receiver.dm
@@ -24,10 +24,6 @@
var/list/linked_radios_weakrefs = list()
-/obj/machinery/telecomms/receiver/Initialize(mapload)
- . = ..()
- default_apply_parts()
-
/obj/machinery/telecomms/receiver/proc/link_radio(var/obj/item/radio/R)
if(!istype(R))
return
diff --git a/code/game/machinery/telecomms/relay.dm b/code/game/machinery/telecomms/relay.dm
index 811435255c0..f70a20665bb 100644
--- a/code/game/machinery/telecomms/relay.dm
+++ b/code/game/machinery/telecomms/relay.dm
@@ -22,10 +22,6 @@
var/broadcasting = 1
var/receiving = 1
-/obj/machinery/telecomms/relay/Initialize(mapload)
- . = ..()
- default_apply_parts()
-
/obj/machinery/telecomms/relay/onTransitZ(old_z, new_z)
. = ..()
listening_level = z
diff --git a/code/game/machinery/telecomms/server.dm b/code/game/machinery/telecomms/server.dm
index 6bd63a05c3e..6dfe672a7ce 100644
--- a/code/game/machinery/telecomms/server.dm
+++ b/code/game/machinery/telecomms/server.dm
@@ -38,10 +38,6 @@
. = ..()
server_radio = new()
-/obj/machinery/telecomms/server/Initialize(mapload)
- . = ..()
- default_apply_parts()
-
/obj/machinery/telecomms/server/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
if(signal.data["message"])
diff --git a/code/game/machinery/teleporter/pad.dm b/code/game/machinery/teleporter/pad.dm
index 41adee93bf2..5a577787407 100644
--- a/code/game/machinery/teleporter/pad.dm
+++ b/code/game/machinery/teleporter/pad.dm
@@ -14,7 +14,6 @@
/obj/machinery/tele_pad/Initialize(mapload)
. = ..()
- default_apply_parts()
return INITIALIZE_HINT_LATELOAD
/obj/machinery/tele_pad/LateInitialize()
diff --git a/code/game/machinery/teleporter/projector.dm b/code/game/machinery/teleporter/projector.dm
index 540c02c33f4..14876c9453d 100644
--- a/code/game/machinery/teleporter/projector.dm
+++ b/code/game/machinery/teleporter/projector.dm
@@ -15,7 +15,6 @@
/obj/machinery/tele_projector/Initialize(mapload)
. = ..()
- default_apply_parts()
update_appearance()
return INITIALIZE_HINT_LATELOAD
diff --git a/code/game/machinery/vitals_monitor.dm b/code/game/machinery/vitals_monitor.dm
index 2cea6297c4d..810469e3ea1 100644
--- a/code/game/machinery/vitals_monitor.dm
+++ b/code/game/machinery/vitals_monitor.dm
@@ -21,10 +21,6 @@
var/mob/living/carbon/human/victim
var/beep = TRUE
-/obj/machinery/vitals_monitor/Initialize(mapload)
- . = ..()
- default_apply_parts()
-
/obj/machinery/vitals_monitor/Destroy()
victim = null
. = ..()
diff --git a/code/game/machinery/vr_console.dm b/code/game/machinery/vr_console.dm
index 87fffb55df0..c75339692c9 100644
--- a/code/game/machinery/vr_console.dm
+++ b/code/game/machinery/vr_console.dm
@@ -15,10 +15,6 @@
active_power_usage = 200
light_color = "#FF0000"
-/obj/machinery/vr_sleeper/Initialize(mapload)
- . = ..()
- default_apply_parts()
-
/obj/machinery/vr_sleeper/Initialize(mapload)
. = ..()
update_icon()
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index 6657fa5fd9f..5b821e3228c 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -25,10 +25,6 @@
/obj/item/clothing/head/helmet/space
)
-/obj/machinery/washing_machine/Initialize(mapload, newdir)
- . = ..()
- default_apply_parts()
-
/obj/machinery/washing_machine/verb/start()
set name = "Start Washing"
set category = "Object"
diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm
index c6b2ba4ebae..095694a6b8b 100644
--- a/code/game/mecha/mech_bay.dm
+++ b/code/game/mecha/mech_bay.dm
@@ -16,10 +16,6 @@
// /mob/living/silicon/robot/platform
)
-/obj/machinery/mech_recharger/Initialize(mapload)
- . = ..()
- default_apply_parts()
-
/obj/machinery/mech_recharger/Crossed(var/atom/movable/M)
. = ..()
if(charging == M)
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 789ced6e2b3..d53db054ade 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -101,10 +101,8 @@
materials[Name] = 0
- default_apply_parts()
files = new /datum/research(src) //Setup the research data holder.
-
/obj/machinery/mecha_part_fabricator/update_icon_state()
. = ..()
if(machine_stat & NOPOWER)
diff --git a/code/game/objects/items/devices/advnifrepair.dm b/code/game/objects/items/devices/advnifrepair.dm
index fb913878371..4bb37c56881 100644
--- a/code/game/objects/items/devices/advnifrepair.dm
+++ b/code/game/objects/items/devices/advnifrepair.dm
@@ -23,11 +23,11 @@
/obj/item/nifrepairer/attackby(obj/W, mob/user)
if(istype(W,/obj/item/stack/nanopaste))
var/obj/item/stack/nanopaste/np = W
- if(np.use(1) && supply.get_free_space() >= efficiency)
+ if(np.use(1) && supply.available_volume() >= efficiency)
to_chat(user,"You convert some nanopaste into programmed nanites inside \the [src].")
supply.add_reagent(id = "nifrepairnanites", amount = efficiency)
update_icon()
- else if(supply.get_free_space() < efficiency)
+ else if(supply.available_volume() < efficiency)
to_chat(user,"\The [src] is too full. Empty it into a container first.")
return
@@ -45,7 +45,7 @@
to_chat(user,"[src] is empty. Feed it nanopaste.")
return 1
- if(!target.reagents.get_free_space())
+ if(!target.reagents.available_volume())
to_chat(user, "[target] is already full.")
return 1
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index fca42427453..f8f5e92bb8a 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -317,7 +317,7 @@
if(istype(L))
process_heat(L)
wash_floor()
- reagents.add_reagent("water", reagents.get_free_space())
+ reagents.add_reagent("water", reagents.available_volume())
/obj/machinery/shower/proc/wash_floor()
if(!ismist && is_washing)
diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm
deleted file mode 100644
index 4e2f354f3a5..00000000000
--- a/code/modules/admin/admin_investigate.dm
+++ /dev/null
@@ -1,46 +0,0 @@
-//By Carnwennan
-
-//This system was made as an alternative to all the in-game lists and variables used to log stuff in-game.
-//lists and variables are great. However, they have several major flaws:
-//Firstly, they use memory. TGstation has one of the highest memory usage of all the ss13 branches.
-//Secondly, they are usually stored in an object. This means that they aren't centralised. It also means that
-//the data is lost when the object is deleted! This is especially annoying for things like the singulo engine!
-#define INVESTIGATE_DIR "data/investigate/"
-
-//SYSTEM
-/proc/investigate_subject2file(var/subject)
- return file("[INVESTIGATE_DIR][subject].html")
-
-/hook/startup/proc/resetInvestigate()
- investigate_reset()
- return 1
-
-/proc/investigate_reset()
- if(fdel(INVESTIGATE_DIR)) return 1
- return 0
-
-/atom/proc/investigate_log(message, subject)
- if(!message)
- return
- var/F = investigate_subject2file(subject)
- if(!F) return
- F << "[time2text(world.timeofday,"hh:mm")] \ref[src] ([x],[y],[z]) || [src] [message]
"
-
-//ADMINVERBS
-/client/proc/investigate_show()
- set name = "Investigate"
- set category = "Admin"
- if(!holder)
- return
-
- var/static/list/subjects = ALL_INVESTIGATE_SUBJECTS
- var/subject = input(usr, "Choose a subject", "Investigate") as null|anything in subjects
-
- if(!(subject in subjects))
- to_chat(src, SPAN_DANGER("Invalid subject: [subject]"))
- return
- var/F = investigate_subject2file(subject)
- if(!F)
- to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.")
- return
- src << browse(F,"window=investigate[subject];size=800x300")
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index ac1ef60f2bb..90e9cc5bcce 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -158,7 +158,6 @@ var/list/admin_verbs_spawn = list(
/client/proc/respawn_character,
/client/proc/spawn_character_mob,
/client/proc/virus2_editor,
- /client/proc/spawn_chemdisp_cartridge,
/client/proc/map_template_load,
/client/proc/map_template_upload,
/client/proc/map_template_load_on_new_z
diff --git a/code/modules/admin/investigate.dm b/code/modules/admin/investigate.dm
new file mode 100644
index 00000000000..3aa90d8d682
--- /dev/null
+++ b/code/modules/admin/investigate.dm
@@ -0,0 +1,29 @@
+/proc/investigate_subject2file(subject)
+ return file("[GLOB.log_directory]/investigate/[subject].html")
+
+/atom/proc/investigate_log(message, subject)
+ if(!message)
+ return
+ var/F = investigate_subject2file(subject)
+ if(!F)
+ CRASH("invalid file / no file")
+ F << "[time2text(world.timeofday,"hh:mm")] \ref[src] ([x],[y],[z]) || [src] [message]
"
+
+//ADMINVERBS
+/client/proc/investigate_show()
+ set name = "Investigate"
+ set category = "Admin"
+ if(!holder)
+ return
+
+ var/static/list/subjects = ALL_INVESTIGATE_SUBJECTS
+ var/subject = input(usr, "Choose a subject", "Investigate") as null|anything in subjects
+
+ if(!(subject in subjects))
+ to_chat(src, SPAN_DANGER("Invalid subject: [subject]"))
+ return
+ var/F = investigate_subject2file(subject)
+ if(!F)
+ to_chat(src, "Error: admin_investigate: [F? F : "!!NO PATH - CHECK RUNTIMES!!"] is an invalid path or cannot be accessed.")
+ return
+ src << browse(F,"window=investigate[subject];size=800x300")
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/algae_generator_vr.dm b/code/modules/atmospherics/machinery/components/binary_devices/algae_generator_vr.dm
index 373250abc3a..68b7324e4d8 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/algae_generator_vr.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/algae_generator_vr.dm
@@ -40,7 +40,6 @@
/obj/machinery/atmospherics/component/binary/algae_farm/Initialize(mapload)
. = ..()
desc = initial(desc) + " Its outlet port is to the [dir2text(dir)]."
- default_apply_parts()
update_icon()
var/list/overlays_to_add = list()
// TODO - Make these in actual icon states so its not silly like this
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/binary_atmos_base.dm b/code/modules/atmospherics/machinery/components/binary_devices/binary_atmos_base.dm
index ed5d0d81f54..8cbb4cdb0ad 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/binary_atmos_base.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/binary_atmos_base.dm
@@ -11,13 +11,10 @@
var/datum/pipe_network/network2
/obj/machinery/atmospherics/component/binary/Initialize(mapload)
- . = ..()
+ air1 = new(200)
+ air2 = new(200)
- air1 = new
- air2 = new
-
- air1.volume = 200
- air2.volume = 200
+ return ..()
/obj/machinery/atmospherics/component/binary/init_dir()
switch(dir)
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/massive_gas_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/massive_gas_pump.dm
index def925098af..b08c894514b 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/massive_gas_pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/massive_gas_pump.dm
@@ -38,7 +38,6 @@
air2.volume = ATMOS_DEFAULT_VOLUME_PUMP * 50//default is 200 L we give it 1000 L or 1m³
desc = initial(desc) + " Its outlet port is to the [dir2text(dir)]."
- default_apply_parts()
update_icon()
var/list/overlays_to_add = list()
// TODO - Make these in actual icon states so its not silly like this
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/massive_heat_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/massive_heat_pump.dm
index ee6f928cc44..ec470e3bc4e 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/massive_heat_pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/massive_heat_pump.dm
@@ -41,7 +41,6 @@
air2.volume = ATMOS_DEFAULT_VOLUME_PUMP * 50//default is 200 L we give it 1000 L or 1m³
desc = initial(desc) + " Its outlet port is to the [dir2text(dir)]."
- default_apply_parts()
update_icon()
var/list/overlays_to_add = list()
// TODO - Make these in actual icon states so its not silly like this
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/trinary_base.dm b/code/modules/atmospherics/machinery/components/trinary_devices/trinary_base.dm
index dd051990510..ca882a302f7 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/trinary_base.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/trinary_base.dm
@@ -18,15 +18,11 @@
var/datum/pipe_network/network3
/obj/machinery/atmospherics/component/trinary/Initialize(mapload)
- . = ..()
+ air1 = new(200)
+ air2 = new(200)
+ air3 = new(200)
- air1 = new
- air2 = new
- air3 = new
-
- air1.volume = 200
- air2.volume = 200
- air3.volume = 200
+ return ..()
/obj/machinery/atmospherics/component/trinary/init_dir()
initialize_directions = get_initialize_directions_trinary(dir, mirrored, tee)
diff --git a/code/modules/atmospherics/machinery/components/unary/heat_source.dm b/code/modules/atmospherics/machinery/components/unary/heat_source.dm
index 6071bd5a89a..3e9a5aa563c 100644
--- a/code/modules/atmospherics/machinery/components/unary/heat_source.dm
+++ b/code/modules/atmospherics/machinery/components/unary/heat_source.dm
@@ -19,10 +19,6 @@
var/set_temperature = T20C //thermostat
var/heating = 0 //mainly for icon updates
-/obj/machinery/atmospherics/component/unary/heater/Initialize(mapload)
- . = ..()
- default_apply_parts()
-
/obj/machinery/atmospherics/component/unary/heater/atmos_init()
if(node)
return
diff --git a/code/modules/atmospherics/machinery/components/unary/unary_base.dm b/code/modules/atmospherics/machinery/components/unary/unary_base.dm
index 7d6a8a3b521..6d95d6a9370 100644
--- a/code/modules/atmospherics/machinery/components/unary/unary_base.dm
+++ b/code/modules/atmospherics/machinery/components/unary/unary_base.dm
@@ -14,10 +14,8 @@
var/welded = 0 //defining this here for ventcrawl stuff
/obj/machinery/atmospherics/component/unary/Initialize(mapload)
- . = ..()
- air_contents = new
-
- air_contents.volume = 200
+ air_contents = new(200)
+ return ..()
/obj/machinery/atmospherics/component/unary/init_dir()
initialize_directions = dir
diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm
index 406c24ef05f..56046b2aeb7 100644
--- a/code/modules/detectivework/tools/rag.dm
+++ b/code/modules/detectivework/tools/rag.dm
@@ -152,7 +152,7 @@
return
if(istype(A, /obj/structure/reagent_dispensers) || istype(A, /obj/item/reagent_containers/glass/bucket) || istype(A, /obj/structure/mopbucket))
- if(!reagents.get_free_space())
+ if(!reagents.available_volume())
to_chat(user, "\The [src] is already soaked.")
return
diff --git a/code/modules/economy/price_list.dm b/code/modules/economy/price_list.dm
index c70bf9f3de0..c92082d23ad 100644
--- a/code/modules/economy/price_list.dm
+++ b/code/modules/economy/price_list.dm
@@ -9,1047 +9,6 @@
return price_tag
-//***************//
-//---Beverages---//
-//***************//
-
/datum/reagent/var/price_tag = null
-
-// Juices, soda and similar //
-
-/datum/reagent/water
- price_tag = 2
-
-/datum/reagent/drink/juice
- price_tag = 2
-
-/datum/reagent/toxin/poisonberryjuice
- price_tag = 2
-
-/datum/reagent/drink/milk
- price_tag = 2
-
-/datum/reagent/drink/soda
- price_tag = 2
-
-/datum/reagent/drink/doctor_delight
- price_tag = 2
-
-/datum/reagent/drink/nothing
- price_tag = 2
-
-/datum/reagent/drink/milkshake
- price_tag = 2
-
-/datum/reagent/drink/roy_rogers
- price_tag = 2
-
-/datum/reagent/drink/shirley_temple
- price_tag = 2
-
-/datum/reagent/drink/arnold_palmer
- price_tag = 2
-
-/datum/reagent/drink/collins_mix
- price_tag = 2
-
-
-// Beer //
-
-/datum/reagent/ethanol/ale
- price_tag = 2
-
-/datum/reagent/ethanol/beer
- price_tag = 2
-
-
-// Hot Drinks //
-
-/datum/reagent/drink/rewriter
- price_tag = 3
-
-/datum/reagent/drink/tea
- price_tag = 3
-
-/datum/reagent/drink/coffee
- price_tag = 3
-
-/datum/reagent/drink/hot_coco
- price_tag = 3
-
-/obj/item/reagent_containers/food/drinks/coffee
- price_tag = 3
-
-/obj/item/reagent_containers/food/drinks/tea
- price_tag = 3
-
-/obj/item/reagent_containers/food/drinks/h_chocolate
- price_tag = 3
-
-/obj/item/reagent_containers/food/drinks/cans/robustexpress
- price_tag = 1
-
-/obj/item/reagent_containers/food/drinks/cans/robustexpresslatte
- price_tag = 1
-
-// Spirituous liquors //
-
-/datum/reagent/ethanol/irish_cream
- price_tag = 5
-
-/datum/reagent/ethanol/absinthe
- price_tag = 5
-
-/datum/reagent/ethanol/bluecuracao
- price_tag = 5
-
-/datum/reagent/ethanol/deadrum
- price_tag = 5
-
-/datum/reagent/ethanol/gin
- price_tag = 5
-
-/datum/reagent/ethanol/coffee/kahlua
- price_tag = 5
-
-/datum/reagent/ethanol/melonliquor
- price_tag = 5
-
-/datum/reagent/ethanol/rum
- price_tag = 5
-
-/datum/reagent/ethanol/whiterum
- price_tag = 5
-
-/datum/reagent/ethanol/tequila
- price_tag = 5
-
-/datum/reagent/ethanol/thirteenloko
- price_tag = 5
-
-/datum/reagent/ethanol/vodka
- price_tag = 5
-
-/datum/reagent/ethanol/whiskey
- price_tag = 5
-
-/datum/reagent/ethanol/specialwhiskey
- price_tag = 5
-
-/datum/reagent/ethanol/patron
- price_tag = 5
-
-/datum/reagent/ethanol/goldschlager
- price_tag = 5
-
-/datum/reagent/ethanol/coffee/brave_bull // Not an original liquor in its own. But since it's a mix of purely Tequila
- price_tag = 5 // and Kahlua, it's basically just another one and gets the same price.
-
-
-// Wines //
-
-/datum/reagent/ethanol/wine
- price_tag = 8
-
-/datum/reagent/ethanol/cognac
- price_tag = 8
-
-/datum/reagent/ethanol/sake
- price_tag = 8
-
-/datum/reagent/ethanol/vermouth
- price_tag = 8
-
-/datum/reagent/ethanol/pwine
- price_tag = 8
-
-
-// Cocktails //
-
-/datum/reagent/ethanol/acid_spit
- price_tag = 4
-
-/datum/reagent/ethanol/alliescocktail
- price_tag = 4
-
-/datum/reagent/ethanol/aloe
- price_tag = 4
-
-/datum/reagent/ethanol/amasec
- price_tag = 4
-
-/datum/reagent/ethanol/andalusia
- price_tag = 4
-
-/datum/reagent/ethanol/antifreeze
- price_tag = 4
-
-/datum/reagent/ethanol/atomicbomb
- price_tag = 4
-
-/datum/reagent/ethanol/coffee/b52
- price_tag = 4
-
-/datum/reagent/ethanol/bahama_mama
- price_tag = 4
-
-/datum/reagent/ethanol/barefoot
- price_tag = 4
-
-/datum/reagent/ethanol/beepsky_smash
- price_tag = 4
-
-/datum/reagent/ethanol/bilk
- price_tag = 4
-
-/datum/reagent/ethanol/black_russian
- price_tag = 4
-
-/datum/reagent/ethanol/bloody_mary
- price_tag = 4
-
-/datum/reagent/ethanol/booger
- price_tag = 4
-
-/datum/reagent/ethanol/coffee/brave_bull
- price_tag = 4
-
-/datum/reagent/ethanol/changelingsting
- price_tag = 4
-
-/datum/reagent/ethanol/martini
- price_tag = 4
-
-/datum/reagent/ethanol/cuba_libre
- price_tag = 4
-
-/datum/reagent/ethanol/demonsblood
- price_tag = 4
-
-/datum/reagent/ethanol/devilskiss
- price_tag = 4
-
-/datum/reagent/ethanol/driestmartini
- price_tag = 4
-
-/datum/reagent/ethanol/ginfizz
- price_tag = 4
-
-/datum/reagent/ethanol/grog
- price_tag = 4
-
-/datum/reagent/ethanol/erikasurprise
- price_tag = 4
-
-/datum/reagent/ethanol/gargle_blaster
- price_tag = 4
-
-/datum/reagent/ethanol/gintonic
- price_tag = 4
-
-/datum/reagent/ethanol/hippies_delight
- price_tag = 4
-
-/datum/reagent/ethanol/iced_beer
- price_tag = 4
-
-/datum/reagent/ethanol/irishcarbomb
- price_tag = 4
-
-/datum/reagent/ethanol/coffee/irishcoffee
- price_tag = 4
-
-/datum/reagent/ethanol/longislandicedtea
- price_tag = 4
-
-/datum/reagent/ethanol/manhattan
- price_tag = 4
-
-/datum/reagent/ethanol/manhattan_proj
- price_tag = 4
-
-/datum/reagent/ethanol/manly_dorf
- price_tag = 4
-
-/datum/reagent/ethanol/margarita
- price_tag = 4
-
-/datum/reagent/ethanol/mead
- price_tag = 4
-
-/datum/reagent/ethanol/moonshine
- price_tag = 4
-
-/datum/reagent/ethanol/neurotoxin
- price_tag = 4
-
-/datum/reagent/ethanol/red_mead
- price_tag = 4
-
-/datum/reagent/ethanol/sbiten
- price_tag = 4
-
-/datum/reagent/ethanol/screwdrivercocktail
- price_tag = 4
-
-/datum/reagent/ethanol/silencer
- price_tag = 4
-
-/datum/reagent/ethanol/singulo
- price_tag = 4
-
-/datum/reagent/ethanol/snowwhite
- price_tag = 4
-
-/datum/reagent/ethanol/suidream
- price_tag = 4
-
-/datum/reagent/ethanol/syndicatebomb
- price_tag = 4
-
-/datum/reagent/ethanol/tequila_sunrise
- price_tag = 4
-
-/datum/reagent/ethanol/threemileisland
- price_tag = 4
-
-/datum/reagent/ethanol/toxins_special
- price_tag = 4
-
-/datum/reagent/ethanol/vodkamartini
- price_tag = 4
-
-/datum/reagent/ethanol/vodkatonic
- price_tag = 4
-
-/datum/reagent/ethanol/white_russian
- price_tag = 4
-
-/datum/reagent/ethanol/whiskey_cola
- price_tag = 4
-
-/datum/reagent/ethanol/whiskeysoda
- price_tag = 4
-
-/datum/reagent/ethanol/binmanbliss
- price_tag = 4
-
-/datum/reagent/ethanol/xanaducannon
- price_tag = 4
-
-/datum/reagent/ethanol/balloon
- price_tag = 4
-
-/datum/reagent/ethanol/coffee/elysiumfacepunch
- price_tag = 4
-
-/datum/reagent/ethanol/saketini
- price_tag = 4
-
-/datum/reagent/ethanol/tokyorose
- price_tag = 4
-
-/datum/reagent/ethanol/ginzamary
- price_tag = 4
-
-/datum/reagent/ethanol/tamagozake
- price_tag = 4
-
-/datum/reagent/ethanol/sakebomb
- price_tag = 4
-
-/datum/reagent/ethanol/erebusmoonrise
- price_tag = 4
-
-// The Cheap Shit //
-
-/datum/reagent/ethanol/hooch
- price_tag = 2
-
-/datum/reagent/ethanol/debugger
- price_tag = 2
-
-/datum/reagent/ethanol/spacersbrew
- price_tag = 2
-
-/datum/reagent/ethanol/natunabrandy
- price_tag = 2
-
-// Cocktails without alcohol //
-
-/datum/reagent/ethanol/bananahonk
- price_tag = 3
-
-// From the machine //
-
-/obj/item/reagent_containers/food/drinks/cans/cola
- price_tag = 1
-
-/obj/item/reagent_containers/food/drinks/cans/space_mountain_wind
- price_tag = 1
-
-/obj/item/reagent_containers/food/drinks/cans/dr_gibb
- price_tag = 1
-
-/obj/item/reagent_containers/food/drinks/cans/starkist
- price_tag = 1
-
-/obj/item/reagent_containers/food/drinks/cans/waterbottle
- price_tag = 2
-
-/obj/item/reagent_containers/food/drinks/cans/space_up
- price_tag = 1
-
-/obj/item/reagent_containers/food/drinks/cans/iced_tea
- price_tag = 1
-
-/obj/item/reagent_containers/food/drinks/cans/grape_juice
- price_tag = 1
-
-/obj/item/reagent_containers/food/drinks/cans/gingerale
- price_tag = 1
-
-/obj/item/reagent_containers/food/drinks/cans/nicola
- price_tag = 1
-
-/obj/item/reagent_containers/food/drinks/cans/cola_coffee
- price_tag = 1
-
-/obj/item/reagent_containers/food/drinks/cans/robustexpressiced
- price_tag = 1
-
-//***************//
-//----Bottles----//
-//***************//
-
-// Juices, soda and similar //
-
-/obj/item/reagent_containers/food/drinks/bottle/cola
- price_tag = 6
-
-/obj/item/reagent_containers/food/drinks/bottle/space_up
- price_tag = 6
-
-/obj/item/reagent_containers/food/drinks/bottle/space_mountain_wind
- price_tag = 6
-
-/obj/item/reagent_containers/food/drinks/bottle/orangejuice
- price_tag = 6
-
-/obj/item/reagent_containers/food/drinks/bottle/applejuice
- price_tag = 6
-
-/obj/item/reagent_containers/food/drinks/bottle/cream
- price_tag = 6
-
-/obj/item/reagent_containers/food/drinks/bottle/tomatojuice
- price_tag = 6
-
-/obj/item/reagent_containers/food/drinks/bottle/limejuice
- price_tag = 6
-
-/obj/item/reagent_containers/food/drinks/bottle/small/sassafras
- price_tag = 6
-
-/obj/item/reagent_containers/food/drinks/bottle/small/sarsaparilla
- price_tag = 6
-
-
-// Beer //
-
-/obj/item/reagent_containers/food/drinks/bottle/small/beer
- price_tag = 3
-
-/obj/item/reagent_containers/food/drinks/bottle/small/ale
- price_tag = 3
-
-/obj/item/reagent_containers/food/drinks/bottle/small/alcsassafras
- price_tag = 3
-
-
-// Spirituous Liquors //
-
-/obj/item/reagent_containers/food/drinks/bottle/absinthe
- price_tag = 15
-
-/obj/item/reagent_containers/food/drinks/bottle/bluecuracao
- price_tag = 15
-
-/obj/item/reagent_containers/food/drinks/bottle/gin
- price_tag = 15
-
-/obj/item/reagent_containers/food/drinks/bottle/kahlua
- price_tag = 15
-
-/obj/item/reagent_containers/food/drinks/bottle/melonliquor
- price_tag = 15
-
-/obj/item/reagent_containers/food/drinks/bottle/rum
- price_tag = 15
-
-/obj/item/reagent_containers/food/drinks/bottle/tequila
- price_tag = 15
-
-/obj/item/reagent_containers/food/drinks/bottle/vodka
- price_tag = 15
-
-/obj/item/reagent_containers/food/drinks/bottle/whiskey
- price_tag = 15
-
-/obj/item/reagent_containers/food/drinks/bottle/specialwhiskey
- price_tag = 15
-
-/obj/item/reagent_containers/food/drinks/bottle/patron
- price_tag = 15
-
-/obj/item/reagent_containers/food/drinks/bottle/goldschlager
- price_tag = 15
-
-/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing
- price_tag = 15
-
-/obj/item/reagent_containers/food/drinks/bottle/grenadine
- price_tag = 15
-
-
-// Wines //
-
-/obj/item/reagent_containers/food/drinks/bottle/wine
- price_tag = 25
-
-/obj/item/reagent_containers/food/drinks/bottle/cognac
- price_tag = 25
-
-/obj/item/reagent_containers/food/drinks/bottle/vermouth
- price_tag = 25
-
-/obj/item/reagent_containers/food/drinks/bottle/pwine
- price_tag = 25
-
-/obj/item/reagent_containers/food/drinks/bottle/sake
- price_tag = 25
-
-//***************//
-//---Foodstuff---//
-//***************//
-
-// Snacks //
-
-/obj/item/reagent_containers/food/snacks/candy
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/sosjerky
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/unajerky
- price_tag = 12
-
-/obj/item/reagent_containers/food/snacks/cheesiehonkers
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/hotcheesiehonkers
- price_tag = 3
-
-/obj/item/reagent_containers/food/snacks/tastybread
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/no_raisin
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/spacetwinkie
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/skrellsnacks
- price_tag = 4
-
-/obj/item/reagent_containers/food/snacks/chips
- price_tag = 1
-
-/obj/item/reagent_containers/food/drinks/dry_ramen
- price_tag = 5
-
-
-// Burger //
-
-/obj/item/reagent_containers/food/snacks/brainburger
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/ghostburger
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/human/burger
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/cheeseburger
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/monkeyburger
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/fishburger
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/tofuburger
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/roburger
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/roburgerbig
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/xenoburger
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/clownburger
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/mimeburger
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/spellburger
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/jellyburger
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/bigbiteburger
- price_tag = 4
-
-/obj/item/reagent_containers/food/snacks/superbiteburger
- price_tag = 8
-
-
-// Sandwiches //
-
-/obj/item/reagent_containers/food/snacks/sandwich
- price_tag = 3
-
-/obj/item/reagent_containers/food/snacks/toastedsandwich
- price_tag = 3
-
-/obj/item/reagent_containers/food/snacks/grilledcheese
- price_tag = 3
-
-/obj/item/reagent_containers/food/snacks/jellysandwich
- price_tag = 3
-
-
-// Cookies and Candies //
-
-/obj/item/reagent_containers/food/snacks/cookie
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/chocolatebar
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/chocolateegg
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/candy_corn
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/donut
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/donut/chaos
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/popcorn
- price_tag = 3
-
-/obj/item/reagent_containers/food/snacks/fortunecookie
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/candiedapple
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/plumphelmetbiscuit
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/chawanmushi
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/cracker
- price_tag = 1
-
-
-// Full meals //
-
-/obj/item/reagent_containers/food/snacks/friedegg
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/tofurkey
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/carpmeat
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/fishfingers
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/omelette
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/berryclafoutis
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/waffles
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/eggplantparm
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/soylentgreen
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/soylenviridians
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/wingfangchu
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/kabob
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/monkeykabob
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/tofukabob
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/cubancarp
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/loadedbakedpotato
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/fries
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/spagetti
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/cheesyfries
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/enchiladas
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/taco
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/monkeysdelight
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/fishandchips
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/rofflewaffles
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/stew
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/stewedsoymeat
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/boiledspagetti
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/boiledrice
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/ricepudding
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/pastatomato
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/meatballspagetti
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/spesslaw
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/carrotfries
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/appletart
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/sliceable/pizza
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/slice/margherita
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/slice/meatpizza
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/slice/mushroompizza
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/slice/vegetablepizza
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/
-
-
-// Baked Goods //
-
-/obj/item/reagent_containers/food/snacks/poppypretzel
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/baguette
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/jelliedtoast
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/twobread
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/sliceable/meatbread
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/slice/meatbread
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/sliceable/xenomeatbread
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/slice/xenomeatbread
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/sliceable/bananabread
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/slice/bananabread
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/sliceable/tofubread
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/slice/tofubread
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/sliceable/bread
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/slice/bread
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/sliceable/creamcheesebread
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/slice/creamcheesebread
- price_tag = 1
-
-
-// Soups //
-
-/obj/item/reagent_containers/food/snacks/meatballsoup
- price_tag = 3
-
-/obj/item/reagent_containers/food/snacks/slimesoup
- price_tag = 3
-
-/obj/item/reagent_containers/food/snacks/bloodsoup
- price_tag = 3
-
-/obj/item/reagent_containers/food/snacks/clownstears
- price_tag = 3
-
-/obj/item/reagent_containers/food/snacks/vegetablesoup
- price_tag = 3
-
-/obj/item/reagent_containers/food/snacks/nettlesoup
- price_tag = 3
-
-/obj/item/reagent_containers/food/snacks/mysterysoup
- price_tag = 3
-
-/obj/item/reagent_containers/food/snacks/wishsoup
- price_tag = 3
-
-/obj/item/reagent_containers/food/snacks/hotchili
- price_tag = 3
-
-/obj/item/reagent_containers/food/snacks/coldchili
- price_tag = 3
-
-/obj/item/reagent_containers/food/snacks/tomatosoup
- price_tag = 3
-
-/obj/item/reagent_containers/food/snacks/milosoup
- price_tag = 3
-
-/obj/item/reagent_containers/food/snacks/mushroomsoup
- price_tag = 3
-
-/obj/item/reagent_containers/food/snacks/beetsoup
- price_tag = 3
-
-
-// Pies //
-
-/obj/item/reagent_containers/food/snacks/pie
- price_tag = 4
-
-/obj/item/reagent_containers/food/snacks/meatpie
- price_tag = 4
-
-/obj/item/reagent_containers/food/snacks/tofupie
- price_tag = 4
-
-/obj/item/reagent_containers/food/snacks/plump_pie
- price_tag = 4
-
-/obj/item/reagent_containers/food/snacks/xemeatpie
- price_tag = 4
-
-/obj/item/reagent_containers/food/snacks/applepie
- price_tag = 4
-
-/obj/item/reagent_containers/food/snacks/cherrypie
- price_tag = 4
-
-
-// Cakes //
-
-/obj/item/reagent_containers/food/snacks/sliceable/carrotcake
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/slice/carrotcake
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/sliceable/braincake
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/slice/braincake
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/sliceable/cheesecake
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/slice/cheesecake
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/sliceable/plaincake
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/slice/plaincake
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/sliceable/orangecake
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/slice/orangecake
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/sliceable/limecake
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/slice/limecake
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/sliceable/lemoncake
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/slice/lemoncake
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/sliceable/chocolatecake
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/slice/chocolatecake
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/sliceable/birthdaycake
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/slice/birthdaycake
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/sliceable/applecake
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/slice/applecake
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/sliceable/pumpkinpie
- price_tag = 5
-
-/obj/item/reagent_containers/food/snacks/slice/pumpkinpie
- price_tag = 1
-
-
-// Misc //
-
-/obj/item/reagent_containers/food/snacks/boiledegg
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/donkpocket
- price_tag = 1
-
-/obj/item/reagent_containers/food/snacks/sausage
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/muffin
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/tossedsalad
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/validsalad
- price_tag = 2
-
-/obj/item/reagent_containers/food/snacks/dionaroast
- price_tag = 25
-
-/obj/item/pizzabox/get_item_cost()
- return get_item_cost(pizza)
-
-
-//***************//
-//----Smokes-----//
-//***************//
-
-/obj/item/storage/fancy/cigarettes
- price_tag = 15
-
-/obj/item/storage/fancy/cigarettes/luckystars
- price_tag = 17
-
-/obj/item/storage/fancy/cigarettes/jerichos
- price_tag = 22
-
-/obj/item/storage/fancy/cigarettes/menthols
- price_tag = 18
-
-/obj/item/storage/fancy/cigar
- price_tag = 27
-
-/obj/item/storage/fancy/cigarettes/carcinomas
- price_tag = 23
-
-/obj/item/storage/fancy/cigarettes/professionals
- price_tag = 25
-
-/obj/item/storage/box/matches
- price_tag = 1
-
-/obj/item/flame/lighter
- price_tag = 2
-
-/obj/item/flame/lighter/zippo
- price_tag = 5
-
-//******************************//
-//|IN THIS MOMENT I AM EUPHORIC|//
-//******************************//
-
-/datum/reagent/ethanol/euphoria
- price_tag = 30
+// todo: kill this shit with fire
diff --git a/code/modules/events/supply_demand.dm b/code/modules/events/supply_demand.dm
index b0454cfff01..ba0e9bbe588 100644
--- a/code/modules/events/supply_demand.dm
+++ b/code/modules/events/supply_demand.dm
@@ -282,7 +282,7 @@
var/list/medicineReagents = list()
for(var/path in typesof(/datum/chemical_reaction) - /datum/chemical_reaction)
var/datum/chemical_reaction/CR = path // Stupid casting required for reading
- var/datum/reagent/R = SSchemistry.chemical_reagents[initial(CR.result)]
+ var/datum/reagent/R = SSchemistry.reagent_lookup[initial(CR.result)]
if(R && R.scannable)
medicineReagents += R
for(var/i in 1 to differentTypes)
@@ -296,7 +296,7 @@
var/list/drinkReagents = list()
for(var/path in typesof(/datum/chemical_reaction) - /datum/chemical_reaction)
var/datum/chemical_reaction/CR = path // Stupid casting required for reading
- var/datum/reagent/R = SSchemistry.chemical_reagents[initial(CR.result)]
+ var/datum/reagent/R = SSchemistry.reagent_lookup[initial(CR.result)]
if(istype(R, /datum/reagent/drink) || istype(R, /datum/reagent/ethanol))
drinkReagents += R
for(var/i in 1 to differentTypes)
diff --git a/code/modules/food/food/condiment.dm b/code/modules/food/food/condiment.dm
index bfc0f25c0c2..025197733c4 100644
--- a/code/modules/food/food/condiment.dm
+++ b/code/modules/food/food/condiment.dm
@@ -41,7 +41,7 @@
to_chat(user, "There is no condiment left in \the [src].")
return
- if(!target.reagents.get_free_space())
+ if(!target.reagents.available_volume())
to_chat(user, "You can't add more condiment to \the [target].")
return
diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm
index 0d6f24bc8b9..6c86cf31fe4 100644
--- a/code/modules/food/food/snacks.dm
+++ b/code/modules/food/food/snacks.dm
@@ -4016,8 +4016,8 @@ END CITADEL CHANGE */
var/id = C.id
//First make sure there's space for our batter
- if (reagents.get_free_space() < req+5)
- var/extra = req+5 - reagents.get_free_space()
+ if (reagents.available_volume() < req+5)
+ var/extra = req+5 - reagents.available_volume()
reagents.maximum_volume += extra
//Suck the coating out of the holder
diff --git a/code/modules/food/kitchen/cooking_machines/fryer.dm b/code/modules/food/kitchen/cooking_machines/fryer.dm
index 15715e67c9f..b3800673501 100644
--- a/code/modules/food/kitchen/cooking_machines/fryer.dm
+++ b/code/modules/food/kitchen/cooking_machines/fryer.dm
@@ -219,7 +219,7 @@
var/amount = 0
for (var/datum/reagent/R in I.reagents.reagent_list)
if (istype(R, /datum/reagent/nutriment/triglyceride/oil))
- var/delta = oil.get_free_space()
+ var/delta = oil.available_volume()
delta = min(delta, R.volume)
oil.add_reagent(R.id, delta)
I.reagents.remove_reagent(R.id, delta)
diff --git a/code/modules/food/recipe_dump.dm b/code/modules/food/recipe_dump.dm
index 799d158394a..a60f83e2900 100644
--- a/code/modules/food/recipe_dump.dm
+++ b/code/modules/food/recipe_dump.dm
@@ -68,14 +68,14 @@
//Reagents can be resolved to nicer names as well
for(var/Rp in food_recipes)
for(var/rid in food_recipes[Rp]["Reagents"])
- var/datum/reagent/Rd = SSchemistry.chemical_reagents[rid]
+ var/datum/reagent/Rd = SSchemistry.reagent_lookup[rid]
var/R_name = Rd.name
var/amt = food_recipes[Rp]["Reagents"][rid]
food_recipes[Rp]["Reagents"] -= rid
food_recipes[Rp]["Reagents"][R_name] = amt
for(var/Rp in drink_recipes)
for(var/rid in drink_recipes[Rp]["Reagents"])
- var/datum/reagent/Rd = SSchemistry.chemical_reagents[rid]
+ var/datum/reagent/Rd = SSchemistry.reagent_lookup[rid]
var/R_name = Rd.name
var/amt = drink_recipes[Rp]["Reagents"][rid]
drink_recipes[Rp]["Reagents"] -= rid
diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm
index 2e61d6f5a71..47631d82ef6 100644
--- a/code/modules/hydroponics/seed.dm
+++ b/code/modules/hydroponics/seed.dm
@@ -440,7 +440,7 @@
for(var/x=1;x<=additional_chems;x++)
- var/new_chem = pick(SSchemistry.chemical_reagents)
+ var/new_chem = pick(SSchemistry.reagent_lookup)
if(new_chem in banned_chems)
continue
banned_chems += new_chem
diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm
index 0273315cd91..e926e2d245c 100644
--- a/code/modules/integrated_electronics/subtypes/reagents.dm
+++ b/code/modules/integrated_electronics/subtypes/reagents.dm
@@ -239,11 +239,11 @@
if(!source.is_open_container() || !target.is_open_container())
return
if(direc)
- if(!target.reagents.get_free_space())
+ if(!target.reagents.available_volume())
return
source.reagents.trans_to(target, transfer_amount)
else
- if(!source.reagents.get_free_space())
+ if(!source.reagents.available_volume())
return
target.reagents.trans_to(source, transfer_amount)
activate_pin(2)
@@ -607,7 +607,7 @@
return
if(!source.is_open_container() || !target.is_open_container())
return
- if(!target.reagents.get_free_space())
+ if(!target.reagents.available_volume())
return
for(var/datum/reagent/G in source.reagents.reagent_list)
if (!direc)
diff --git a/code/modules/maps/misc_maps/lavaland/_lavaland.dm b/code/modules/maps/misc_maps/lavaland/_lavaland.dm
index 7850f86af41..bc6f74945d3 100644
--- a/code/modules/maps/misc_maps/lavaland/_lavaland.dm
+++ b/code/modules/maps/misc_maps/lavaland/_lavaland.dm
@@ -20,7 +20,7 @@
icon_state = "qpad-idle"
anchored = 1
use_power = USE_POWER_IDLE
- interact_offline = 0
+ interaction_flags_machine = INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_ALLOW_SILICON
/obj/machinery/lavaland_entryportal/attack_hand(mob/user, list/params)
if(istype(user, /mob/living/silicon/ai)) // lets not teleport AI cores
diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm
index 941d92fc8cb..a43b17b3d0b 100644
--- a/code/modules/materials/material_recipes.dm
+++ b/code/modules/materials/material_recipes.dm
@@ -144,9 +144,9 @@
recipes += new/datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("plastic bag", /obj/item/storage/bag/plasticbag, 3, on_floor = 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("blood pack", /obj/item/reagent_containers/blood/empty, 4, on_floor = 0, pass_stack_color = TRUE)
- recipes += new/datum/stack_recipe("reagent dispenser cartridge (large)", /obj/item/reagent_containers/chem_disp_cartridge, 5, on_floor=0, pass_stack_color = TRUE) // 500u
- recipes += new/datum/stack_recipe("reagent dispenser cartridge (med)", /obj/item/reagent_containers/chem_disp_cartridge/medium, 3, on_floor=0, pass_stack_color = TRUE) // 250u
- recipes += new/datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0, pass_stack_color = TRUE) // 100u
+ recipes += new/datum/stack_recipe("reagent dispenser cartridge (large)", /obj/item/reagent_containers/cartridge/dispenser/large, 5, on_floor=0, pass_stack_color = TRUE) // 500u
+ recipes += new/datum/stack_recipe("reagent dispenser cartridge (med)", /obj/item/reagent_containers/cartridge/dispenser/medium, 3, on_floor=0, pass_stack_color = TRUE) // 250u
+ recipes += new/datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/reagent_containers/cartridge/dispenser/small, 1, on_floor=0, pass_stack_color = TRUE) // 100u
recipes += new/datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor/white, 1, 4, 20, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("freezer floor tile", /obj/item/stack/tile/floor/freezer, 1, 4, 20, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("shower curtain", /obj/structure/curtain, 4, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)
diff --git a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm
index 2637c92175c..16c47fb6948 100644
--- a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm
+++ b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm
@@ -102,10 +102,6 @@
src.equipment_path = path
src.cost = cost
-/obj/machinery/power/quantumpad/Initialize(mapload)
- . = ..()
- default_apply_parts()
-
/obj/machinery/mineral/equipment_vendor/power_change()
var/old_stat = machine_stat
..()
diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
index e4faba9cfd7..e51fcab651d 100644
--- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
+++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
@@ -192,12 +192,12 @@
dat += "
Injector
"
if(patient)// && patient.health > min_health) //Not necessary, leave the buttons on, but the feedback during injection will give more information.
for(var/re in injection_chems)
- var/datum/reagent/C = SSchemistry.chemical_reagents[re]
+ var/datum/reagent/C = SSchemistry.reagent_lookup[re]
if(C)
dat += "Inject [C.name]
"
else
for(var/re in injection_chems)
- var/datum/reagent/C = SSchemistry.chemical_reagents[re]
+ var/datum/reagent/C = SSchemistry.reagent_lookup[re]
if(C)
dat += "Inject [C.name]
"
@@ -402,7 +402,7 @@
patient.reagents.add_reagent(chem, inject_amount)
drain(750) //-750 charge per injection
var/units = round(patient.reagents.get_reagent_amount(chem))
- to_chat(hound, "Injecting [units] unit\s of [SSchemistry.chemical_reagents[chem]] into occupant.") //If they were immersed, the reagents wouldn't leave with them.
+ to_chat(hound, "Injecting [units] unit\s of [SSchemistry.reagent_lookup[chem]] into occupant.") //If they were immersed, the reagents wouldn't leave with them.
//For if the dogborg's existing patient uh, doesn't make it.
/obj/item/dogborg/sleeper/proc/update_patient()
diff --git a/code/modules/overmap/disperser/disperser.dm b/code/modules/overmap/disperser/disperser.dm
index a4e2de16964..f7ad59d769d 100644
--- a/code/modules/overmap/disperser/disperser.dm
+++ b/code/modules/overmap/disperser/disperser.dm
@@ -9,13 +9,6 @@
density = TRUE
anchored = TRUE
-/obj/machinery/disperser/Initialize(mapload)
- . = ..()
- // TODO - Remove this bit once machines are converted to Initialize
- if(ispath(circuit))
- circuit = new circuit(src)
- default_apply_parts()
-
/obj/machinery/disperser/examine(mob/user)
. = ..()
if(panel_open)
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index f46e9b90440..61295f7ac73 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -19,10 +19,6 @@
var/maxcopies = 10 //how many copies can be copied at once- idea shamelessly stolen from bs12's copier!
var/copying = FALSE // Is the printer busy with something? Sanity check variable.
-/obj/machinery/photocopier/Initialize(mapload)
- . = ..()
- default_apply_parts()
-
/obj/machinery/photocopier/examine(mob/user)
. = ..()
if(Adjacent(user))
diff --git a/code/modules/power/breaker_box.dm b/code/modules/power/breaker_box.dm
index 23c5f37dfe0..cc968d6420e 100644
--- a/code/modules/power/breaker_box.dm
+++ b/code/modules/power/breaker_box.dm
@@ -32,7 +32,6 @@
/obj/machinery/power/breakerbox/Initialize(mapload)
. = ..()
wires = new(src)
- default_apply_parts()
/obj/machinery/power/breakerbox/activated
icon_state = "bbox_on"
diff --git a/code/modules/power/fusion/core/_core.dm b/code/modules/power/fusion/core/_core.dm
index a5ed6b29d08..ceec7f8f01f 100644
--- a/code/modules/power/fusion/core/_core.dm
+++ b/code/modules/power/fusion/core/_core.dm
@@ -31,7 +31,6 @@ var/list/fusion_cores = list()
/obj/machinery/power/fusion_core/Initialize(mapload)
. = ..()
fusion_cores += src
- default_apply_parts()
if(anchored)
connect_to_network()
diff --git a/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm b/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm
index dce19d3d0bf..14123922b5a 100644
--- a/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm
+++ b/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm
@@ -7,10 +7,6 @@
circuit = /obj/item/circuitboard/fusion_fuel_compressor
-/obj/machinery/fusion_fuel_compressor/Initialize(mapload)
- . = ..()
- default_apply_parts()
-
/obj/machinery/fusion_fuel_compressor/MouseDroppedOnLegacy(var/atom/movable/target, var/mob/user)
if(user.incapacitated() || !user.Adjacent(src))
return
diff --git a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm
index 0cacea4cd23..00d137e7fa6 100644
--- a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm
+++ b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm
@@ -21,7 +21,6 @@ var/list/fuel_injectors = list()
/obj/machinery/fusion_fuel_injector/Initialize(mapload)
. = ..()
fuel_injectors += src
- default_apply_parts()
/obj/machinery/fusion_fuel_injector/Destroy()
if(cur_assembly)
diff --git a/code/modules/power/fusion/gyrotron/gyrotron.dm b/code/modules/power/fusion/gyrotron/gyrotron.dm
index e1c3809c846..9ffd19e484a 100644
--- a/code/modules/power/fusion/gyrotron/gyrotron.dm
+++ b/code/modules/power/fusion/gyrotron/gyrotron.dm
@@ -23,7 +23,6 @@ var/list/gyrotrons = list()
/obj/machinery/power/emitter/gyrotron/Initialize(mapload)
gyrotrons += src
active_power_usage = mega_energy * 50000
- default_apply_parts()
. = ..()
/obj/machinery/power/emitter/gyrotron/Destroy()
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 5bdd65663c7..113f9ea1571 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -526,7 +526,6 @@
. = ..()
if(ispath(circuit))
circuit = new circuit(src)
- default_apply_parts()
connect_to_network()
/obj/machinery/power/rtg/process()
diff --git a/code/modules/power/smes/smes_construction.dm b/code/modules/power/smes/smes_construction.dm
index fa4fffcf4fd..0a63f7c96cc 100644
--- a/code/modules/power/smes/smes_construction.dm
+++ b/code/modules/power/smes/smes_construction.dm
@@ -97,6 +97,7 @@
// Parameters: None
// Description: Adds standard components for this SMES, and forces recalculation of properties.
/obj/machinery/power/smes/buildable/Initialize(mapload, install_coils = TRUE)
+ . = ..()
component_parts = list()
component_parts += new /obj/item/stack/cable_coil(src,30)
wires = new /datum/wires/smes(src)
@@ -106,7 +107,6 @@
for(var/i = 1, i <= cur_coils, i++)
component_parts += new /obj/item/smes_coil(src)
recalc_coils()
- return ..()
// Proc: attack_hand()
// Parameters: None
diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm
index 71da7e493e3..249354f75f1 100644
--- a/code/modules/power/tesla/coil.dm
+++ b/code/modules/power/tesla/coil.dm
@@ -24,7 +24,6 @@
/obj/machinery/power/tesla_coil/Initialize(mapload)
. = ..()
wires = new(src)
- default_apply_parts()
/obj/machinery/power/tesla_coil/Destroy()
QDEL_NULL(wires)
@@ -38,7 +37,6 @@
zap_cooldown -= (C.rating * 20)
input_power_multiplier = power_multiplier
-
/obj/machinery/power/tesla_coil/update_icon()
if(panel_open)
icon_state = "coil_open[anchored]"
diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm
index 3f4daaac93b..e8d7410e77e 100644
--- a/code/modules/power/turbine.dm
+++ b/code/modules/power/turbine.dm
@@ -88,7 +88,6 @@
/obj/machinery/compressor/Initialize(mapload)
. = ..()
- default_apply_parts()
gas_contained = new()
inturf = get_step(src, dir)
locate_machinery()
@@ -195,7 +194,6 @@
/obj/machinery/power/turbine/Initialize(mapload)
. = ..()
- default_apply_parts()
// The outlet is pointed at the direction of the turbine component
outturf = get_step(src, dir)
locate_machinery()
diff --git a/code/modules/preferences/preference_setup/loadout/gear_tweaks.dm b/code/modules/preferences/preference_setup/loadout/gear_tweaks.dm
index 77f96ac24f7..7923941a854 100644
--- a/code/modules/preferences/preference_setup/loadout/gear_tweaks.dm
+++ b/code/modules/preferences/preference_setup/loadout/gear_tweaks.dm
@@ -180,7 +180,7 @@ GLOBAL_DATUM_INIT(gear_tweak_free_matrix_recolor, /datum/gear_tweak/matrix_recol
. = valid_reagents[pick(valid_reagents)]
else
. = valid_reagents[metadata]
- I.reagents.add_reagent(., I.reagents.get_free_space())
+ I.reagents.add_reagent(., I.reagents.available_volume())
//Custom name and desciption code
//note to devs downstream: where 'gear_tweaks = list(gear_tweak_free_color_choice)' was used before for color selection
diff --git a/code/modules/reagents/chemistry/_readme.dm b/code/modules/reagents/chemistry/_readme.dm
index ac80472030c..5d07cb8b43d 100644
--- a/code/modules/reagents/chemistry/_readme.dm
+++ b/code/modules/reagents/chemistry/_readme.dm
@@ -39,7 +39,7 @@ About the Holder:
Procs:
- get_free_space()
+ available_volume()
Returns the remaining free volume in the holder.
get_master_reagent()
diff --git a/code/modules/reagents/chemistry/helpers.dm b/code/modules/reagents/chemistry/helpers.dm
index df4a4ec7166..3e57546ebb7 100644
--- a/code/modules/reagents/chemistry/helpers.dm
+++ b/code/modules/reagents/chemistry/helpers.dm
@@ -3,7 +3,7 @@
return FALSE
if(!reagents)
return FALSE
- if(!reagents.get_free_space())
+ if(!reagents.available_volume())
return FALSE
return TRUE
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index daafd4fc95b..b87b0d4a5d6 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -1,8 +1,15 @@
/datum/reagents
+ //? core
+ /// reagent holder flags - see [code/__DEFINES/reagents/flags.dm]
+ var/reagent_holder_flags = NONE
+
+ ///? legacy / unsorted
var/list/datum/reagent/reagent_list = list()
var/total_volume = 0
var/maximum_volume = 100
+
var/atom/my_atom = null
+ // todo: remove / refactor this var into reagent_holder_flags with proper defines, this was never ported properly.
var/reagents_holder_flags
/datum/reagents/New(max = 100, atom/A = null, new_flags = NONE)
@@ -11,15 +18,15 @@
my_atom = A
//I dislike having these here but map-objects are initialised before world/New() is called. >_>
- if(!SSchemistry.chemical_reagents)
+ if(!SSchemistry.reagent_lookup)
//Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id
var/paths = typesof(/datum/reagent) - /datum/reagent
- SSchemistry.chemical_reagents = list()
+ SSchemistry.reagent_lookup = list()
for(var/path in paths)
var/datum/reagent/D = new path()
if(!D.name)
continue
- SSchemistry.chemical_reagents[D.id] = D
+ SSchemistry.reagent_lookup[D.id] = D
reagents_holder_flags = new_flags
@@ -46,9 +53,6 @@
/* Internal procs */
-/datum/reagents/proc/get_free_space() // Returns free space.
- return maximum_volume - total_volume
-
/datum/reagents/proc/get_master_reagent() // Returns reference to the reagent with the biggest volume.
var/the_reagent = null
var/the_volume = 0
@@ -125,11 +129,15 @@
/* Holder-to-chemical */
/datum/reagents/proc/add_reagent(id, amount, data = null, safety = 0)
+ if(ispath(id))
+ var/datum/reagent/accessing = id
+ id = initial(accessing.id)
+
if(!isnum(amount) || amount <= 0)
return 0
update_total()
- amount = min(amount, get_free_space())
+ amount = min(amount, available_volume())
for(var/datum/reagent/current in reagent_list)
if(current.id == id)
@@ -146,7 +154,7 @@
if(my_atom)
my_atom.on_reagent_change()
return 1
- var/datum/reagent/D = SSchemistry.chemical_reagents[id]
+ var/datum/reagent/D = SSchemistry.reagent_lookup[id]
if(D)
var/datum/reagent/R = new D.type()
reagent_list += R
@@ -271,7 +279,7 @@
if(!target || !istype(target))
return
- amount = max(0, min(amount, total_volume, target.get_free_space() / multiplier))
+ amount = max(0, min(amount, total_volume, target.available_volume() / multiplier))
if(!amount)
return
@@ -511,3 +519,26 @@
if(C.can_happen(src))
do_happen = TRUE
return do_happen
+
+//? Queries - Whole
+
+/**
+ * returns volume remaining
+ */
+/datum/reagents/proc/available_volume()
+ return maximum_volume - total_volume
+
+//? UI
+
+/**
+ * data list for ReagentContents in /tgui/interfaces/common/Reagents.tsx
+ */
+/datum/reagents/proc/tgui_reagent_contents()
+ var/list/built = list()
+ for(var/datum/reagent/R as anything in reagent_list)
+ built[++built.len] = list(
+ "name" = R.name,
+ "amount" = R.volume,
+ "id" = R.id,
+ )
+ return built
diff --git a/code/modules/reagents/chemistry/machinery.dm b/code/modules/reagents/chemistry/machinery.dm
index f6554395fc7..8f2f4185534 100644
--- a/code/modules/reagents/chemistry/machinery.dm
+++ b/code/modules/reagents/chemistry/machinery.dm
@@ -13,7 +13,8 @@
active_power_usage = 100
circuit = /obj/item/circuitboard/grinder
var/inuse = 0
- var/obj/item/reagent_containers/beaker
+ /// beaker - set to path to start with a beaker.
+ var/obj/item/reagent_containers/beaker = /obj/item/reagent_containers/glass/beaker/large
var/limit = 10
var/list/holdingitems = list()
var/list/sheet_reagents = list( //have a number of reageents divisible by REAGENTS_PER_SHEET (default 20) unless you like decimals,
@@ -37,10 +38,10 @@
var/static/radial_grind = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_grind")
var/no_panel = FALSE
-/obj/machinery/reagentgrinder/Initialize(mapload, newdir)
+/obj/machinery/reagentgrinder/Initialize(mapload)
. = ..()
- beaker = new /obj/item/reagent_containers/glass/beaker/large(src)
- default_apply_parts()
+ if(ispath(beaker))
+ beaker = new beaker(src)
/obj/machinery/reagentgrinder/examine(mob/user)
. = ..()
diff --git a/code/modules/reagents/chemistry/chemical_reactions.dm b/code/modules/reagents/chemistry/reaction.dm
similarity index 98%
rename from code/modules/reagents/chemistry/chemical_reactions.dm
rename to code/modules/reagents/chemistry/reaction.dm
index 04631be534e..231409e16d2 100644
--- a/code/modules/reagents/chemistry/chemical_reactions.dm
+++ b/code/modules/reagents/chemistry/reaction.dm
@@ -1,6 +1,12 @@
/datum/chemical_reaction
+ //? core
+ /// id - must be unique and in CamelCase.
+ var/id
+ /// reagent reaction flags - see [code/__DEFINES/reagents/flags.dm]
+ var/chemical_reaction_flags = NONE
+
+ //? legacy / unsorted
var/name = null
- var/id = null
var/result = null
var/list/required_reagents = list()
var/list/catalysts = list()
diff --git a/code/modules/reagents/chemistry/reagent.dm b/code/modules/reagents/chemistry/reagent.dm
index 9503fc498a4..d3ba6810349 100644
--- a/code/modules/reagents/chemistry/reagent.dm
+++ b/code/modules/reagents/chemistry/reagent.dm
@@ -9,8 +9,16 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
/datum/reagent
+ abstract_type = /datum/reagent
+
+ //? core
+ /// id - must be unique and in CamelCase.
+ var/id
+ /// reagent flags - see [code/__DEFINES/reagents/flags.dm]
+ var/reagent_flags = NONE
+
+ //? legacy / unsorted
var/name = "Reagent"
- var/id = "reagent"
var/description = "A non-descript chemical."
var/taste_description = "bitterness"
/// How this taste compares to others. Higher values means it is more noticable
@@ -61,6 +69,16 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
/// economic category of the reagent
var/economic_category_reagent = ECONOMIC_CATEGORY_REAGENT_DEFAULT
+ //? wiki markup generation additional
+ /// override "name"
+ var/wiki_name
+ /// override "desc"
+ var/wiki_desc
+ /// wiki category - determines what table to put it into
+ var/wiki_category = "Miscellaneous"
+ /// forced sort ordering in its category - falls back to name otherwise.
+ var/wiki_sort = 0
+
/datum/reagent/proc/remove_self(var/amount) // Shortcut
if(holder)
holder.remove_reagent(id, amount)
diff --git a/code/modules/reagents/chemistry/wiki_generation.dm b/code/modules/reagents/chemistry/wiki_generation.dm
new file mode 100644
index 00000000000..be664392d4c
--- /dev/null
+++ b/code/modules/reagents/chemistry/wiki_generation.dm
@@ -0,0 +1,60 @@
+/proc/generate_wiki_markup_for_reagents()
+ var/list/built = list()
+ // gather
+ var/list/reagents_by_category = list()
+ var/list/recipes_by_id = list()
+ for(var/datum/chemical_reaction/reaction as anything in subtypesof(/datum/chemical_reaction))
+ LAZYADD(recipes_by_id[reaction.result], new reaction)
+ for(var/datum/reagent/path as anything in subtypesof(/datum/reagent))
+ if(initial(path.abstract_type) == path)
+ continue
+ // todo: skip flag?
+ LAZYADD(reagents_by_category[initial(path.wiki_category)], new path)
+ // todo: styling for tables
+ for(var/category in reagents_by_category)
+ tim_sort(reagents_by_category[category], /proc/cmp_reagents_wiki)
+ var/list/sub_built = list()
+ sub_built += {"
+ {| class="wikitable" style="margin: auto"
+ |+ [category]
+ |-
+ ! Name !! Desc !! Overdose / Addiction !!
+ "}
+ for(var/datum/reagent/R as anything in reagents_by_category[category])
+ var/list/recipes = recipes_by_id[R.id]
+ if(!length(recipes))
+ // todo: flag check
+ continue
+ // todo: recipes :agony:
+ var/overdose_text = R.overdose? "Overdose: [R.overdose]u" : "None"
+ var/recipes_text = "WIP"
+ sub_built += {"
+ |-
+ | [R.wiki_name || R.name] || [R.wiki_desc || R.description] || [overdose_text] || [recipes_text]
+ "}
+ // todo: handle recipes
+ built += "## [category]
[jointext(sub_built, "")]"
+
+ return "[jointext(built, "
")]
"
+
+/proc/browse_wiki_markup_for_reagents(mob/user = usr)
+ user << browse("Chemistry Wiki Generation[generate_wiki_markup_for_reagents()]", "window=chemwiki;display=1;size=600x600;can_close=1;can_resize=1;can_minimize=0;titlebar=1")
+
+/proc/cmp_reagents_wiki(datum/reagent/A, datum/reagent/B)
+ return (A.wiki_sort == B.wiki_sort)? (sorttext(B.name, A.name)) : (B.wiki_sort - A.wiki_sort)
+
+// for reference below
+
+/*
+ {| class="wikitable" style="margin:auto"
+ |+ Caption text
+ |-
+ ! Header text !! Header text !! Header text
+ |-
+ | Example || Example || Example
+ |-
+ | Example || Example || Example
+ |-
+ | Example || Example || Example
+|}
+*/
diff --git a/code/modules/reagents/machinery/chem_master.dm b/code/modules/reagents/machinery/chem_master.dm
index b6c9b122cd2..4fdffd63d6a 100644
--- a/code/modules/reagents/machinery/chem_master.dm
+++ b/code/modules/reagents/machinery/chem_master.dm
@@ -61,10 +61,9 @@
name = "CondiMaster 3000"
condi = TRUE
-/obj/machinery/chem_master/Initialize(mapload, newdir)
- . = ..()
- create_reagents(1000)
- default_apply_parts()
+/obj/machinery/chem_master/Initialize(mapload)
+ create_reagents(1000) // refreshparts needs reagents
+ return ..()
/obj/machinery/chem_master/Destroy()
QDEL_NULL(beaker)
diff --git a/code/modules/reagents/machinery/dispenser/_defines.dm b/code/modules/reagents/machinery/dispenser/_defines.dm
deleted file mode 100644
index 3d6f13ddd56..00000000000
--- a/code/modules/reagents/machinery/dispenser/_defines.dm
+++ /dev/null
@@ -1,8 +0,0 @@
-#define CARTRIDGE_VOLUME_LARGE 1000
-#define CARTRIDGE_VOLUME_MEDIUM 500
-#define CARTRIDGE_VOLUME_SMALL 250
-
-// Chemistry dispenser starts with 21
-// ERT dispenser starts with 28
-#define DISPENSER_MAX_CARTRIDGES 30
-
diff --git a/code/modules/reagents/machinery/dispenser/cartridge.dm b/code/modules/reagents/machinery/dispenser/cartridge.dm
index 920d1522a64..644ef5ffca6 100644
--- a/code/modules/reagents/machinery/dispenser/cartridge.dm
+++ b/code/modules/reagents/machinery/dispenser/cartridge.dm
@@ -1,27 +1,37 @@
-/obj/item/reagent_containers/chem_disp_cartridge
- name = "chemical dispenser cartridge"
+/obj/item/reagent_containers/cartridge/dispenser
+ name = "dispenser cartridge"
desc = "This goes in a chemical dispenser."
icon_state = "cartridge"
-
- w_class = ITEMSIZE_NORMAL
-
- volume = CARTRIDGE_VOLUME_LARGE
+ w_class = WEIGHT_CLASS_NORMAL
amount_per_transfer_from_this = 50
- // Large, but inaccurate. Use a chem dispenser or beaker for accuracy.
possible_transfer_amounts = list(50, 100, 250, 500)
- unacidable = 1
- var/spawn_reagent = null
- var/label = ""
+ /// label - the dispenser sees this, not what's in us
+ var/label
-/obj/item/reagent_containers/chem_disp_cartridge/Initialize(mapload)
+/obj/item/reagent_containers/cartridge/dispenser/Initialize(mapload)
. = ..()
- if(spawn_reagent)
- reagents.add_reagent(spawn_reagent, volume)
- var/datum/reagent/R = SSchemistry.chemical_reagents[spawn_reagent]
- setLabel(R.name)
+ set_label(label)
-/obj/item/reagent_containers/chem_disp_cartridge/examine(mob/user)
+/obj/item/reagent_containers/cartridge/dispenser/proc/set_label(new_label)
+ label = new_label
+ name = "[initial(name)] ([label])"
+
+/obj/item/reagent_containers/cartridge/dispenser/verb/set_label_verb()
+ set name = "Set Label"
+ set category = "Object"
+ set src in usr
+
+ var/new_label = input(usr, "Enter a new label.", "Label Cartridge", label) as text|null
+
+ if(isnull(new_label))
+ return
+
+ to_chat(usr, new_label? SPAN_NOTICE("You set the cartridge's label to '[new_label]'.") : SPAN_NOTICE("You erase the label on the cartridge."))
+
+ set_label(new_label)
+
+/obj/item/reagent_containers/cartridge/dispenser/examine(mob/user)
. = ..()
. += "It has a capacity of [volume] units."
if(reagents.total_volume <= 0)
@@ -31,68 +41,26 @@
if(!is_open_container())
. += "The cap is sealed."
-/obj/item/reagent_containers/chem_disp_cartridge/verb/verb_set_label(L as text)
- set name = "Set Cartridge Label"
- set category = "Object"
- set src in view(usr, 1)
-
- setLabel(L, usr)
-
-/obj/item/reagent_containers/chem_disp_cartridge/proc/setLabel(L, mob/user = null)
- if(L)
- if(user)
- to_chat(user, "You set the label on \the [src] to '[L]'.")
-
- label = L
- name = "[initial(name)] - '[L]'"
- else
- if(user)
- to_chat(user, "You clear the label on \the [src].")
- label = ""
- name = initial(name)
-
-/obj/item/reagent_containers/chem_disp_cartridge/attack_self(mob/user)
+/obj/item/reagent_containers/cartridge/dispenser/attack_self(mob/user)
. = ..()
if(.)
return
- ..()
- if (is_open_container())
- to_chat(usr, "You put the cap on \the [src].")
+ if(is_open_container())
+ to_chat(user, SPAN_NOTICE("You put the cap on \the [src]."))
atom_flags ^= OPENCONTAINER
else
- to_chat(usr, "You take the cap off \the [src].")
+ to_chat(user, SPAN_NOTICE("You put the cap off of \the [src]."))
atom_flags |= OPENCONTAINER
-/obj/item/reagent_containers/chem_disp_cartridge/afterattack(obj/target, mob/user , flag)
- if (!is_open_container() || !flag)
- return
- else if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
- target.add_fingerprint(user)
+/obj/item/reagent_containers/cartridge/dispenser/large
+ name = "large dispenser cartridge"
+ volume = 1000
- if(!target.reagents.total_volume && target.reagents)
- to_chat(user, "\The [target] is empty.")
- return
+/obj/item/reagent_containers/cartridge/dispenser/medium
+ name = "medium dispenser cartridge"
+ volume = 500
- if(reagents.total_volume >= reagents.maximum_volume)
- to_chat(user, "\The [src] is full.")
- return
-
- var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this)
- to_chat(user, "You fill \the [src] with [trans] units of the contents of \the [target].")
-
- else if(target.is_open_container() && target.reagents) //Something like a glass. Player probably wants to transfer TO it.
-
- if(!reagents.total_volume)
- to_chat(user, "\The [src] is empty.")
- return
-
- if(target.reagents.total_volume >= target.reagents.maximum_volume)
- to_chat(user, "\The [target] is full.")
- return
-
- var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
- to_chat(user, "You transfer [trans] units of the solution to \the [target].")
-
- else
- return ..()
+/obj/item/reagent_containers/cartridge/dispenser/small
+ name = "small dispenser cartridge"
+ volume = 250
diff --git a/code/modules/reagents/machinery/dispenser/cartridge_presets.dm b/code/modules/reagents/machinery/dispenser/cartridge_presets.dm
deleted file mode 100644
index 50f747fd749..00000000000
--- a/code/modules/reagents/machinery/dispenser/cartridge_presets.dm
+++ /dev/null
@@ -1,203 +0,0 @@
-/obj/item/reagent_containers/chem_disp_cartridge
-/obj/item/reagent_containers/chem_disp_cartridge/small
- volume = CARTRIDGE_VOLUME_SMALL
-/obj/item/reagent_containers/chem_disp_cartridge/medium
- volume = CARTRIDGE_VOLUME_MEDIUM
-
-// Multiple
-/obj/item/reagent_containers/chem_disp_cartridge/water
- spawn_reagent = "water"
-/obj/item/reagent_containers/chem_disp_cartridge/sugar
- spawn_reagent = "sugar"
-
-// Chemistry
-/obj/item/reagent_containers/chem_disp_cartridge/hydrogen
- spawn_reagent = "hydrogen"
-/obj/item/reagent_containers/chem_disp_cartridge/lithium
- spawn_reagent = "lithium"
-/obj/item/reagent_containers/chem_disp_cartridge/carbon
- spawn_reagent = "carbon"
-/obj/item/reagent_containers/chem_disp_cartridge/nitrogen
- spawn_reagent = "nitrogen"
-/obj/item/reagent_containers/chem_disp_cartridge/oxygen
- spawn_reagent = "oxygen"
-/obj/item/reagent_containers/chem_disp_cartridge/fluorine
- spawn_reagent = "fluorine"
-/obj/item/reagent_containers/chem_disp_cartridge/sodium
- spawn_reagent = "sodium"
-/obj/item/reagent_containers/chem_disp_cartridge/aluminum
- spawn_reagent = "aluminum"
-/obj/item/reagent_containers/chem_disp_cartridge/silicon
- spawn_reagent = "silicon"
-/obj/item/reagent_containers/chem_disp_cartridge/phosphorus
- spawn_reagent = "phosphorus"
-/obj/item/reagent_containers/chem_disp_cartridge/sulfur
- spawn_reagent = "sulfur"
-/obj/item/reagent_containers/chem_disp_cartridge/chlorine
- spawn_reagent = "chlorine"
-/obj/item/reagent_containers/chem_disp_cartridge/potassium
- spawn_reagent = "potassium"
-/obj/item/reagent_containers/chem_disp_cartridge/iron
- spawn_reagent = "iron"
-/obj/item/reagent_containers/chem_disp_cartridge/copper
- spawn_reagent = "copper"
-/obj/item/reagent_containers/chem_disp_cartridge/mercury
- spawn_reagent = "mercury"
-/obj/item/reagent_containers/chem_disp_cartridge/radium
- spawn_reagent = "radium"
-/obj/item/reagent_containers/chem_disp_cartridge/ethanol
- spawn_reagent = "ethanol"
-/obj/item/reagent_containers/chem_disp_cartridge/sacid
- spawn_reagent = "sacid"
-/obj/item/reagent_containers/chem_disp_cartridge/tungsten
- spawn_reagent = "tungsten"
-/obj/item/reagent_containers/chem_disp_cartridge/calcium
- spawn_reagent = "calcium"
-
-// Bar, alcoholic
-/obj/item/reagent_containers/chem_disp_cartridge/beer
- spawn_reagent = "beer"
-/obj/item/reagent_containers/chem_disp_cartridge/kahlua
- spawn_reagent = "kahlua"
-/obj/item/reagent_containers/chem_disp_cartridge/whiskey
- spawn_reagent = "whiskey"
-/obj/item/reagent_containers/chem_disp_cartridge/wine
- spawn_reagent = "wine"
-/obj/item/reagent_containers/chem_disp_cartridge/whitewine
- spawn_reagent = "whitewine"
-/obj/item/reagent_containers/chem_disp_cartridge/vodka
- spawn_reagent = "vodka"
-/obj/item/reagent_containers/chem_disp_cartridge/gin
- spawn_reagent = "gin"
-/obj/item/reagent_containers/chem_disp_cartridge/rum
- spawn_reagent = "rum"
-/obj/item/reagent_containers/chem_disp_cartridge/tequila
- spawn_reagent = "tequila"
-/obj/item/reagent_containers/chem_disp_cartridge/vermouth
- spawn_reagent = "vermouth"
-/obj/item/reagent_containers/chem_disp_cartridge/cognac
- spawn_reagent = "cognac"
-/obj/item/reagent_containers/chem_disp_cartridge/ale
- spawn_reagent = "ale"
-/obj/item/reagent_containers/chem_disp_cartridge/mead
- spawn_reagent = "mead"
-/obj/item/reagent_containers/chem_disp_cartridge/bitters
- spawn_reagent = "bitters"
-/obj/item/reagent_containers/chem_disp_cartridge/cider
- spawn_reagent = "cider"
-/obj/item/reagent_containers/chem_disp_cartridge/alcsassafras
- spawn_reagent = "alcsassafras"
-
-// Bar, soft
-/obj/item/reagent_containers/chem_disp_cartridge/ice
- spawn_reagent = "ice"
-/obj/item/reagent_containers/chem_disp_cartridge/tea
- spawn_reagent = "tea"
-/obj/item/reagent_containers/chem_disp_cartridge/icetea
- spawn_reagent = "icetea"
-/obj/item/reagent_containers/chem_disp_cartridge/cola
- spawn_reagent = "cola"
-/obj/item/reagent_containers/chem_disp_cartridge/smw
- spawn_reagent = "spacemountainwind"
-/obj/item/reagent_containers/chem_disp_cartridge/dr_gibb
- spawn_reagent = "dr_gibb"
-/obj/item/reagent_containers/chem_disp_cartridge/spaceup
- spawn_reagent = "space_up"
-/obj/item/reagent_containers/chem_disp_cartridge/tonic
- spawn_reagent = "tonic"
-/obj/item/reagent_containers/chem_disp_cartridge/sodawater
- spawn_reagent = "sodawater"
-/obj/item/reagent_containers/chem_disp_cartridge/lemon_lime
- spawn_reagent = "lemon_lime"
-/obj/item/reagent_containers/chem_disp_cartridge/orange
- spawn_reagent = "orangejuice"
-/obj/item/reagent_containers/chem_disp_cartridge/lime
- spawn_reagent = "limejuice"
-/obj/item/reagent_containers/chem_disp_cartridge/watermelon
- spawn_reagent = "watermelonjuice"
-/obj/item/reagent_containers/chem_disp_cartridge/lemon
- spawn_reagent = "lemonjuice"
-/obj/item/reagent_containers/chem_disp_cartridge/sarsaparilla
- spawn_reagent = "sarsaparilla"
-/obj/item/reagent_containers/chem_disp_cartridge/sassafras
- spawn_reagent = "sassafras"
-
-// Bar, coffee
-/obj/item/reagent_containers/chem_disp_cartridge/coffee
- spawn_reagent = "coffee"
-/obj/item/reagent_containers/chem_disp_cartridge/cafe_latte
- spawn_reagent = "cafe_latte"
-/obj/item/reagent_containers/chem_disp_cartridge/soy_latte
- spawn_reagent = "soy_latte"
-/obj/item/reagent_containers/chem_disp_cartridge/hot_coco
- spawn_reagent = "hot_coco"
-/obj/item/reagent_containers/chem_disp_cartridge/milk
- spawn_reagent = "milk"
-/obj/item/reagent_containers/chem_disp_cartridge/cream
- spawn_reagent = "cream"
-/obj/item/reagent_containers/chem_disp_cartridge/mint
- spawn_reagent = "mint"
-/obj/item/reagent_containers/chem_disp_cartridge/berry
- spawn_reagent = "berryjuice"
-// greentea spawn_reagent = "greentea"
-// decaf spawn_reagent = "decaf"
-
-// ERT
-/obj/item/reagent_containers/chem_disp_cartridge/inaprov
- spawn_reagent = "inaprovaline"
-/obj/item/reagent_containers/chem_disp_cartridge/ryetalyn
- spawn_reagent = "ryetalyn"
-/obj/item/reagent_containers/chem_disp_cartridge/paracetamol
- spawn_reagent = "paracetamol"
-/obj/item/reagent_containers/chem_disp_cartridge/tramadol
- spawn_reagent = "tramadol"
-/obj/item/reagent_containers/chem_disp_cartridge/oxycodone
- spawn_reagent = "oxycodone"
-/obj/item/reagent_containers/chem_disp_cartridge/sterilizine
- spawn_reagent = "sterilizine"
-/obj/item/reagent_containers/chem_disp_cartridge/leporazine
- spawn_reagent = "leporazine"
-/obj/item/reagent_containers/chem_disp_cartridge/kelotane
- spawn_reagent = "kelotane"
-/obj/item/reagent_containers/chem_disp_cartridge/dermaline
- spawn_reagent = "dermaline"
-/obj/item/reagent_containers/chem_disp_cartridge/dexalin
- spawn_reagent = "dexalin"
-/obj/item/reagent_containers/chem_disp_cartridge/dexalin/small
- volume = CARTRIDGE_VOLUME_SMALL // For the medicine cartridge crate, so it's not too easy to get large amounts of dexalin
-/obj/item/reagent_containers/chem_disp_cartridge/dexalin_p
- spawn_reagent = "dexalinp"
-/obj/item/reagent_containers/chem_disp_cartridge/tricord
- spawn_reagent = "tricordrazine"
-/obj/item/reagent_containers/chem_disp_cartridge/dylovene
- spawn_reagent = "anti_toxin"
-/obj/item/reagent_containers/chem_disp_cartridge/synaptizine
- spawn_reagent = "synaptizine"
-/obj/item/reagent_containers/chem_disp_cartridge/hyronalin
- spawn_reagent = "hyronalin"
-/obj/item/reagent_containers/chem_disp_cartridge/arithrazine
- spawn_reagent = "arithrazine"
-/obj/item/reagent_containers/chem_disp_cartridge/alkysine
- spawn_reagent = "alkysine"
-/obj/item/reagent_containers/chem_disp_cartridge/imidazoline
- spawn_reagent = "imidazoline"
-/obj/item/reagent_containers/chem_disp_cartridge/peridaxon
- spawn_reagent = "peridaxon"
-/obj/item/reagent_containers/chem_disp_cartridge/bicaridine
- spawn_reagent = "bicaridine"
-/obj/item/reagent_containers/chem_disp_cartridge/hyperzine
- spawn_reagent = "hyperzine"
-/obj/item/reagent_containers/chem_disp_cartridge/rezadone
- spawn_reagent = "rezadone"
-/obj/item/reagent_containers/chem_disp_cartridge/spaceacillin
- spawn_reagent = "spaceacillin"
-/obj/item/reagent_containers/chem_disp_cartridge/ethylredox
- spawn_reagent = "ethylredoxrazine"
-/obj/item/reagent_containers/chem_disp_cartridge/sleeptox
- spawn_reagent = "stoxin"
-/obj/item/reagent_containers/chem_disp_cartridge/chloral
- spawn_reagent = "chloralhydrate"
-/obj/item/reagent_containers/chem_disp_cartridge/cryoxadone
- spawn_reagent = "cryoxadone"
-/obj/item/reagent_containers/chem_disp_cartridge/clonexadone
- spawn_reagent = "clonexadone"
diff --git a/code/modules/reagents/machinery/dispenser/cartridge_presets_vr.dm b/code/modules/reagents/machinery/dispenser/cartridge_presets_vr.dm
deleted file mode 100644
index d3dba6fad4e..00000000000
--- a/code/modules/reagents/machinery/dispenser/cartridge_presets_vr.dm
+++ /dev/null
@@ -1,17 +0,0 @@
-/obj/item/reagent_containers/chem_disp_cartridge
- //Xenoflora
- ammonia spawn_reagent = "ammonia"
- diethylamine spawn_reagent = "diethylamine"
- plantbgone spawn_reagent = "plantbgone"
- mutagen spawn_reagent = "mutagen"
-
- //Biochem
- nutriment spawn_reagent = "nutriment"
- protein spawn_reagent = "protein"
-
- //Special Ops
- biomass spawn_reagent = "biomass"
- carthatoline spawn_reagent = "carthatoline"
- corophizine spawn_reagent = "corophizine"
- myelamine spawn_reagent = "myelamine"
- osteodaxon spawn_reagent = "osteodaxon"
diff --git a/code/modules/reagents/machinery/dispenser/cartridge_spawn.dm b/code/modules/reagents/machinery/dispenser/cartridge_spawn.dm
deleted file mode 100644
index 00287e83734..00000000000
--- a/code/modules/reagents/machinery/dispenser/cartridge_spawn.dm
+++ /dev/null
@@ -1,13 +0,0 @@
-/client/proc/spawn_chemdisp_cartridge(size in list("small", "medium", "large"), reagent in SSchemistry.chemical_reagents)
- set name = "Spawn Chemical Dispenser Cartridge"
- set category = "Admin"
-
- var/obj/item/reagent_containers/chem_disp_cartridge/C
- switch(size)
- if("small") C = new /obj/item/reagent_containers/chem_disp_cartridge/small(usr.loc)
- if("medium") C = new /obj/item/reagent_containers/chem_disp_cartridge/medium(usr.loc)
- if("large") C = new /obj/item/reagent_containers/chem_disp_cartridge(usr.loc)
- C.reagents.add_reagent(reagent, C.volume)
- var/datum/reagent/R = SSchemistry.chemical_reagents[reagent]
- C.setLabel(R.name)
- log_admin("[key_name(usr)] spawned a [size] reagent container containing [reagent] at ([usr.x],[usr.y],[usr.z])")
diff --git a/code/modules/reagents/machinery/dispenser/dispenser.dm b/code/modules/reagents/machinery/dispenser/dispenser.dm
new file mode 100644
index 00000000000..2aef77ecf0c
--- /dev/null
+++ b/code/modules/reagents/machinery/dispenser/dispenser.dm
@@ -0,0 +1,495 @@
+/obj/item/circuitboard/machine/chemical_dispenser
+ name = T_BOARD("chemical dispenser")
+ build_path = /obj/machinery/chemical_dispenser
+ req_components = list(
+ /obj/item/stock_parts/capacitor = 2,
+ /obj/item/stock_parts/manipulator = 1,
+ /obj/item/cell = 1,
+ /obj/item/stock_parts/console_screen = 1,
+ )
+
+#define MAX_MACROS 20
+#define MAX_MACRO_STEPS 50
+
+/obj/machinery/chemical_dispenser
+ name = "chemical dispenser"
+ icon = 'icons/obj/medical/chemical.dmi'
+ icon_state = "dispenser"
+ circuit = /obj/item/circuitboard/machine/chemical_dispenser
+
+ use_power = USE_POWER_IDLE
+ idle_power_usage = 50
+ anchored = TRUE
+ allow_unanchor = TRUE
+ allow_deconstruct = TRUE
+
+ interaction_flags_machine = INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_OPEN | INTERACT_MACHINE_OPEN_SILICON
+
+ /// reagent synthesizers in us - set to list of typepaths to init on Initialize().
+ var/list/obj/item/reagent_synth/synthesizers
+ /// synthesizers are swappable
+ var/synthesizers_swappable = TRUE
+ /// cartridges in us, usable for dispensing with.
+ var/list/obj/item/reagent_containers/cartridge/dispenser/cartridges
+ /// max cartridges
+ var/cartridges_max = 50
+ /// our cell - this is in component_parts too.
+ // todo: component_parts supporting "use this and don't keep this in component_parts".
+ var/obj/item/cell/cell
+ /// initial cell type
+ var/cell_type = /obj/item/cell/high
+ /// recharge rate in KW
+ var/recharge_rate = 10
+ /// inserted beaker / whatever
+ var/obj/item/reagent_containers/inserted
+ /// allow drinking glasses
+ var/allow_drinking = TRUE
+ /// current dispense amount
+ var/dispense_amount = 10
+ /// max dispense amount - this is relatively important to prevent *easy* maxcaps.
+ var/dispense_amount_max = 60
+ /// power in kilojoules per unit synthesized
+ var/kj_per_unit = 4
+ /// is recharging active?
+ var/charging = TRUE
+ /// macros: list of list("name" = name, "index" = number, "data" = list("id" = amount, ...))
+ // todo: macros utilizing cartridges
+ var/list/macros
+ /// awful code but lets us identify macros regardless of tgui sort order.
+ var/macro_index_next = 0
+
+/obj/machinery/chemical_dispenser/Initialize(mapload)
+ . = ..()
+ // default_apply_parts runs in ..()
+ component_parts -= cell
+ if(cell)
+ qdel(cell)
+ if(cell_type)
+ cell = new cell_type(src)
+ component_parts |= cell
+ if(islist(synthesizers))
+ var/list/created = list()
+ for(var/path in synthesizers)
+ if(!ispath(path, /obj/item/reagent_synth))
+ if(istype(path, /obj/item/reagent_synth))
+ created += path
+ continue
+ created += new path(src)
+ synthesizers = created
+
+/obj/machinery/chemical_dispenser/Destroy()
+ QDEL_LIST_NULL(cartridges)
+ QDEL_LIST_NULL(synthesizers)
+ if(inserted)
+ QDEL_NULL(inserted)
+ macros = null
+ if(cell)
+ QDEL_NULL(cell)
+ component_parts -= cell
+ return ..()
+
+/obj/machinery/chemical_dispenser/RefreshParts()
+ var/total_capacitor_rating = 0
+ var/total_capacitors = 0
+ for(var/obj/item/stock_parts/capacitor/cap in component_parts)
+ total_capacitors++
+ total_capacitor_rating += cap.rating
+ recharge_rate = initial(recharge_rate) * (0.5 + (total_capacitor_rating / (total_capacitors || 1)) * 0.5)
+ var/total_manip_rating = 0
+ var/total_manips = 0
+ for(var/obj/item/stock_parts/manipulator/manip in component_parts)
+ total_manips++
+ total_manip_rating += manip.rating
+ kj_per_unit = max(0, initial(kj_per_unit) - 0.25 * ((total_manip_rating / (total_manips || 1)) - 1))
+ var/obj/item/cell/comp_cell = locate() in component_parts
+ cell = comp_cell
+
+/obj/machinery/chemical_dispenser/examine(mob/user)
+ . = ..()
+ . += "It has [length(cartridges)] cartridges installed, and has space for [cartridges_max - length(cartridges)] more."
+
+/obj/machinery/chemical_dispenser/process(delta_time)
+ // todo: rework power handling
+ if(machine_stat & NOPOWER)
+ return
+ if(!cell)
+ return
+ var/wanted = max(0, DYNAMIC_CELL_UNITS_TO_KW(cell.maxcharge - cell.charge, delta_time))
+ if(!wanted)
+ return
+ // todo: this is shit, it doesn't update area power because our power code is primitive.
+ var/kw_used = use_power_oneoff(min(recharge_rate * delta_time, wanted))
+ if(!kw_used)
+ return
+ cell.give(DYNAMIC_KW_TO_CELL_UNITS(kw_used, delta_time))
+ SStgui.update_uis(src)
+
+/obj/machinery/chemical_dispenser/ui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "ChemDispenser", name)
+ ui.open()
+
+/obj/machinery/chemical_dispenser/proc/ui_cartridge_data()
+ var/list/carts_built = list()
+ for(var/obj/item/reagent_containers/cartridge/dispenser/cart as anything in cartridges)
+ carts_built[++carts_built.len] = list(
+ "label" = cart.label,
+ "amount" = cart.reagents?.total_volume || 0,
+ )
+ return carts_built
+
+/obj/machinery/chemical_dispenser/ui_static_data(mob/user, datum/tgui/ui, datum/ui_state/state)
+ . = ..()
+ .["cartridges"] = ui_cartridge_data()
+ var/list/chems_built = list()
+ // gather
+ for(var/obj/item/reagent_synth/synth as anything in synthesizers)
+ for(var/id in synth.reagents_provided)
+ if(chems_built[id])
+ continue
+ var/datum/reagent/R = SSchemistry.get_reagent(id)
+ if(!R)
+ continue
+ chems_built[id] = list(
+ "id" = id,
+ "name" = R.name,
+ )
+ // build
+ var/list/chems_final = list()
+ for(var/id in chems_built)
+ chems_final += list(chems_built[id])
+ .["reagents"] = chems_final
+ .["macros"] = macros || list()
+ .["macros_full"] = length(macros) >= MAX_MACROS
+ .["macros_max_steps"] = MAX_MACRO_STEPS
+
+/obj/machinery/chemical_dispenser/ui_data(mob/user)
+ . = ..()
+ .["amount"] = dispense_amount
+ .["amount_max"] = dispense_amount_max
+ .["has_cell"] = !!cell
+ .["cell_charge"] = cell?.charge
+ .["cell_capacity"] = cell?.maxcharge
+ .["panel_open"] = panel_open
+ .["has_beaker"] = !!inserted
+ .["beaker"] = inserted?.reagents? list(
+ "volume" = inserted.reagents.total_volume,
+ "capacity" = inserted.reagents.maximum_volume,
+ "data" = inserted.reagents.tgui_reagent_contents(),
+ ) : null
+ .["recharging"] = charging
+ .["recharge_rate"] = recharge_rate
+
+/obj/machinery/chemical_dispenser/ui_act(action, params)
+ . = ..()
+ if(.)
+ return
+ add_fingerprint(usr)
+ switch(action)
+ if("toggle_charge")
+ charging = !charging
+ return TRUE
+ if("reagent")
+ if(isnull(inserted?.reagents))
+ return TRUE
+ var/id = params["id"]
+ if(!check_reagent_id(id))
+ return TRUE
+ var/amount = round(dispense_amount)
+ if(!amount)
+ return TRUE
+ playsound(src, 'sound/machines/reagent_dispense.ogg', 25, 1)
+ var/wanted = clamp(amount, 0, inserted.reagents.maximum_volume - inserted.reagents.total_volume)
+ var/avail = min(wanted, cell.use(DYNAMIC_KJ_TO_CELL_UNITS(wanted * kj_per_unit)))
+ inserted.reagents.add_reagent(id, avail)
+ investigate_log("[key_name(usr)] dispensed [avail] of [id]", INVESTIGATE_REAGENTS)
+ return TRUE
+ if("cartridge")
+ if(isnull(inserted?.reagents))
+ return TRUE
+ var/id = params["label"]
+ if(!id)
+ return TRUE
+ var/obj/item/reagent_containers/cartridge/dispenser/cart
+ for(cart as anything in cartridges)
+ if(cart.label == id)
+ break
+ if(cart?.label != id)
+ return TRUE
+ playsound(src, 'sound/machines/reagent_dispense.ogg', 25, 1)
+ cart.reagents.trans_to(inserted, dispense_amount)
+ push_ui_data(data = list("cartridges" = ui_cartridge_data()))
+ return TRUE
+ if("amount")
+ var/target = text2num(params["set"])
+ if(isnull(target))
+ return TRUE
+ target = round(target)
+ dispense_amount = clamp(target, 0, dispense_amount_max)
+ return TRUE
+ if("isolate")
+ var/id = params["id"]
+ if(isnull(id))
+ return TRUE
+ investigate_log("[key_name(usr)] isolated [id]", INVESTIGATE_REAGENTS)
+ inserted?.reagents?.isolate_reagent(id)
+ return TRUE
+ if("purge")
+ var/id = params["id"]
+ if(isnull(id))
+ return TRUE
+ var/amount = isnull(params["amount"])? INFINITY : round(text2num(params["amount"]))
+ if(!amount)
+ return TRUE
+ investigate_log("[key_name(usr)] purged[amount == INFINITY? "" : " [amount] of"] [id]", INVESTIGATE_REAGENTS)
+ inserted?.reagents?.remove_reagent(id, amount)
+ return TRUE
+ if("eject")
+ if(!inserted)
+ return TRUE
+ usr.grab_item_from_interacted_with(inserted, src)
+ usr.visible_action_feedback(SPAN_NOTICE("[usr] ejects [inserted] from [src]."), src, range = MESSAGE_RANGE_INVENTORY_SOFT)
+ investigate_log("[key_name(usr)] ejected [ref_name_path(inserted)]", INVESTIGATE_REAGENTS)
+ inserted = null
+ return TRUE
+ if("eject_cart")
+ if(!panel_open)
+ return TRUE
+ var/label = params["label"]
+ if(isnull(label))
+ return TRUE
+ var/obj/item/reagent_containers/cartridge/dispenser/cart
+ for(cart as anything in cartridges)
+ if(cart.label == label)
+ break
+ if(cart?.label != label)
+ return TRUE
+ remove_cartridge(cart, usr)
+ usr.grab_item_from_interacted_with(cart, src)
+ usr.visible_action_feedback(SPAN_NOTICE("[usr] removes [cart] from [src]."), src, range = MESSAGE_RANGE_CONSTRUCTION)
+ update_static_data()
+ return TRUE
+ if("eject_cell")
+ if(!panel_open)
+ return TRUE
+ if(!cell)
+ return TRUE
+ usr.grab_item_from_interacted_with(cell, src)
+ usr.visible_action_feedback(SPAN_NOTICE("[usr] removes [cell] from [src]."), src, range = MESSAGE_RANGE_CONSTRUCTION)
+ component_parts -= cell
+ cell = null
+ return TRUE
+ if("macro")
+ var/index = text2num(params["index"])
+ if(isnull(index) || (length(macros) < index))
+ return TRUE
+ playsound(src, 'sound/machines/reagent_dispense.ogg')
+ var/list/the_list = macros[index]["data"]
+ if(!length(the_list))
+ return TRUE
+ var/list/logstr = list()
+ for(var/id in the_list)
+ if(!check_reagent_id(id))
+ logstr += "[id]: skipped"
+ break
+ var/amount = the_list[id]
+ amount = min(amount, dispense_amount_max)
+ if(!amount)
+ continue
+ var/wanted = min(inserted.reagents.available_volume(), amount)
+ if(!wanted)
+ logstr += "interrupt-nospace"
+ break
+ wanted = min(wanted, cell.use(DYNAMIC_KJ_TO_CELL_UNITS(wanted * kj_per_unit)))
+ if(!wanted)
+ logstr += "interrupt-nopower"
+ break
+ logstr += "[id]: [wanted]"
+ inserted.reagents.add_reagent(id, wanted)
+ investigate_log("[key_name(usr)] dispensed macro [jointext(logstr, ", ")]", INVESTIGATE_REAGENTS)
+ return TRUE
+ if("add_macro")
+ var/list/raw = params["data"]
+ var/name = params["name"]
+ if(isnull(name))
+ name = input(usr, "Name this macro", "Chemical Macro", "Macro") as text|null
+ if(length(macros) > MAX_MACROS)
+ return TRUE
+ if(!length(raw) || !name)
+ return TRUE
+ var/list/built = list()
+ for(var/list/L as anything in raw)
+ built[L[1]] = max(0, round(text2num(L[2])))
+ raw.len = min(raw.len, MAX_MACRO_STEPS)
+ LAZYINITLIST(macros)
+ macros[++macros.len] = list(
+ "name" = name,
+ "index" = ++macro_index_next,
+ "data" = built,
+ )
+ update_static_data()
+ return TRUE
+ if("del_macro")
+ var/index = text2num(params["index"])
+ if(isnull(index) || (length(macros) < index))
+ return TRUE
+ macros.Cut(index, index + 1)
+ update_static_data()
+ return TRUE
+
+/obj/machinery/chemical_dispenser/attackby(obj/item/I, mob/living/user, params, clickchain_flags, damage_multiplier)
+ . = ..()
+ if(. & CLICKCHAIN_DO_NOT_PROPAGATE)
+ return
+
+ if(panel_open)
+ if(istype(I, /obj/item/reagent_containers/cartridge/dispenser))
+ var/obj/item/reagent_containers/cartridge/dispenser/cart = I
+ if(!cart.label)
+ user.action_feedback(SPAN_WARNING("[I] has no label!"), src)
+ return CLICKCHAIN_DO_NOT_PROPAGATE
+ if(length(cartridges) >= cartridges_max)
+ user.action_feedback(SPAN_WARNING("[src] has no more room for cartridges."), src)
+ return CLICKCHAIN_DO_NOT_PROPAGATE
+ if(!user.attempt_insert_item_for_installation(I, src))
+ user.action_feedback(SPAN_WARNING("[I] is stuck to your hand."), src)
+ return CLICKCHAIN_DO_NOT_PROPAGATE
+ if(!insert_cartridge(I))
+ I.forceMove(drop_location())
+ return CLICKCHAIN_DO_NOT_PROPAGATE
+ user.visible_action_feedback(SPAN_NOTICE("[user] inserts [I] into [src]."), src, range = MESSAGE_RANGE_CONSTRUCTION)
+ return CLICKCHAIN_DO_NOT_PROPAGATE
+ if(istype(I, /obj/item/reagent_synth))
+ var/obj/item/reagent_synth/synth = I
+ if(synth.reagents_group)
+ for(var/obj/item/reagent_synth/other as anything in synthesizers)
+ if(other.reagents_group == synth.reagents_group)
+ user.action_feedback(SPAN_WARNING("[src] already has a synthesis module of this type."), src)
+ return CLICKCHAIN_DO_NOT_PROPAGATE
+ if(!user.attempt_insert_item_for_installation(I, src))
+ user.action_feedback(SPAN_WARNING("[I] is stuck to your hand."), src)
+ return CLICKCHAIN_DO_NOT_PROPAGATE
+ synthesizers += synth
+ user.visible_action_feedback(SPAN_NOTICE("[user] inserts [I] into [src]."), src, range = MESSAGE_RANGE_CONSTRUCTION)
+ update_static_data()
+ return CLICKCHAIN_DO_NOT_PROPAGATE
+ if(istype(I, /obj/item/cell))
+ if(cell)
+ user.action_feedback(SPAN_WARNING("[src] already has a cell."), src)
+ return CLICKCHAIN_DO_NOT_PROPAGATE
+ if(!user.attempt_insert_item_for_installation(I, src))
+ user.action_feedback(SPAN_WARNING("[I] is stuck to your hand."), src)
+ return CLICKCHAIN_DO_NOT_PROPAGATE
+ cell = I
+ component_parts |= cell
+ user.visible_action_feedback(SPAN_NOTICE("[user] inserts [I] into [src]."), src, range = MESSAGE_RANGE_CONSTRUCTION)
+ return CLICKCHAIN_DO_NOT_PROPAGATE
+
+ if(istype(I, /obj/item/reagent_containers))
+ var/obj/item/reagent_containers/container = I
+ // trying to insert
+ if(!container.is_open_container())
+ user.action_feedback(SPAN_WARNING("[I] can't be directly filled."), src)
+ return CLICKCHAIN_DO_NOT_PROPAGATE
+ // check
+ if(istype(container, /obj/item/reagent_containers/cartridge))
+ // always fine
+ else if(istype(container, /obj/item/reagent_containers/food) && !allow_drinking)
+ user.action_feedback(SPAN_WARNING("[src] doesn't accept beakers."), src)
+ return CLICKCHAIN_DO_NOT_PROPAGATE
+ // insert
+ if(!user.transfer_item_to_loc(I, src))
+ user.action_feedback(SPAN_WARNING("[I] is stuck to your hand."), src)
+ return CLICKCHAIN_DO_NOT_PROPAGATE
+ // process swap?
+ if(inserted)
+ investigate_log("[key_name(user)] ejected [ref_name_path(inserted)]", INVESTIGATE_REAGENTS)
+ user.visible_action_feedback(SPAN_NOTICE("[user] quickly swaps [src]'s [inserted] for [I]."), src, range = MESSAGE_RANGE_INVENTORY_SOFT)
+ user.put_in_hand_or_drop(inserted)
+ else
+ user.visible_action_feedback(SPAN_NOTICE("[user] inserts [I] into [src]."), src, range = MESSAGE_RANGE_INVENTORY_SOFT)
+ investigate_log("[key_name(user)] inserted [ref_name_path(I)]", INVESTIGATE_REAGENTS)
+ inserted = I
+ SStgui.update_uis(src)
+ return CLICKCHAIN_DO_NOT_PROPAGATE
+
+/obj/machinery/chemical_dispenser/proc/check_reagent_id(id)
+ for(var/obj/item/reagent_synth/synth as anything in synthesizers)
+ if(id in synth.reagents_provided)
+ return TRUE
+ return FALSE
+
+/obj/machinery/chemical_dispenser/proc/remove_cartridge(obj/item/reagent_containers/cartridge/dispenser/cart, atom/where = drop_location())
+ ASSERT(cart in cartridges)
+ LAZYREMOVE(cartridges, cart)
+ cart.forceMove(where)
+ update_static_data()
+
+/obj/machinery/chemical_dispenser/proc/insert_cartridge(obj/item/reagent_containers/cartridge/dispenser/cart)
+ . = FALSE
+ ASSERT(cart.label)
+ for(var/obj/item/reagent_containers/cartridge/dispenser/other as anything in cartridges)
+ if(other.label == cart.label)
+ CRASH("collision on label.")
+ LAZYADD(cartridges, cart)
+ cart.forceMove(src)
+ update_static_data()
+ return TRUE
+
+/obj/machinery/chemical_dispenser/crowbar_act(obj/item/I, mob/user, flags, hint)
+ if(!allow_deconstruct || !panel_open)
+ return ..()
+ if(default_deconstruction_crowbar(user, I))
+ user.visible_message(SPAN_NOTICE("[user] dismantles [src]."), range = MESSAGE_RANGE_CONSTRUCTION)
+ return TRUE
+ return ..()
+
+/obj/machinery/chemical_dispenser/screwdriver_act(obj/item/I, mob/user, flags, hint)
+ if(!allow_deconstruct)
+ return ..()
+ if(default_deconstruction_screwdriver(user, I))
+ user.visible_message(SPAN_NOTICE("[user] [panel_open? "opens" : "closes"] the panel on [src]."), range = MESSAGE_RANGE_CONSTRUCTION)
+ return TRUE
+ return ..()
+
+/obj/machinery/chemical_dispenser/wrench_act(obj/item/I, mob/user, flags, hint)
+ if(!allow_unanchor)
+ return ..()
+ if(default_unfasten_wrench(user, I, 4 SECONDS))
+ user.visible_message(SPAN_NOTICE("[user] [anchored? "fastens [src] to the ground" : "unfastens [src] from the ground"]."), range = MESSAGE_RANGE_CONSTRUCTION)
+ return TRUE
+ return ..()
+
+/obj/machinery/chemical_dispenser/dynamic_tool_functions(obj/item/I, mob/user)
+ . = list()
+ if(allow_unanchor)
+ .[TOOL_WRENCH] = anchored? "anchor" : "unanchor"
+ if(allow_deconstruct)
+ .[TOOL_SCREWDRIVER] = panel_open? "close panel" : "open panel"
+ if(panel_open)
+ .[TOOL_CROWBAR] = "deconstruct"
+
+/obj/machinery/chemical_dispenser/dynamic_tool_image(function, hint)
+ switch(function)
+ if(TOOL_WRENCH)
+ return anchored? dyntool_image_backward(TOOL_WRENCH) : dyntool_image_forward(TOOL_WRENCH)
+ if(TOOL_SCREWDRIVER)
+ return panel_open? dyntool_image_forward(TOOL_SCREWDRIVER) : dyntool_image_backward(TOOL_SCREWDRIVER)
+ return ..()
+
+/obj/machinery/chemical_dispenser/drop_products(method)
+ . = ..()
+ for(var/obj/item/I as anything in (synthesizers | cartridges))
+ drop_product(method, I)
+ synthesizers = null
+ cartridges = null
+ if(inserted)
+ drop_product(method, inserted)
+ inserted = null
+ if(cell)
+ if(cell.loc == src)
+ drop_product(method, cell)
+ cell = null
+/obj/machinery/chemical_dispenser/unanchored
+ anchored = FALSE
diff --git a/code/modules/reagents/machinery/dispenser/dispenser2.dm b/code/modules/reagents/machinery/dispenser/dispenser2.dm
deleted file mode 100644
index 6c39eab28ef..00000000000
--- a/code/modules/reagents/machinery/dispenser/dispenser2.dm
+++ /dev/null
@@ -1,194 +0,0 @@
-/obj/machinery/chemical_dispenser
- name = "chemical dispenser"
- icon = 'icons/obj/medical/chemical.dmi'
- icon_state = "dispenser"
-
- var/list/spawn_cartridges = null // Set to a list of types to spawn one of each on New()
-
- var/list/cartridges = list() // Associative, label -> cartridge
- var/obj/item/reagent_containers/container = null
-
- var/ui_title = "Chemical Dispenser"
-
- var/accept_drinking = 0
- var/amount = 30
-
- use_power = USE_POWER_IDLE
- idle_power_usage = 100
- anchored = 1
-
-/obj/machinery/chemical_dispenser/Initialize(mapload)
- . = ..()
- if(spawn_cartridges)
- for(var/type in spawn_cartridges)
- add_cartridge(new type(src))
-
-/obj/machinery/chemical_dispenser/examine(mob/user)
- . = ..()
- . += "It has [cartridges.len] cartridges installed, and has space for [DISPENSER_MAX_CARTRIDGES - cartridges.len] more."
-
-/obj/machinery/chemical_dispenser/proc/add_cartridge(obj/item/reagent_containers/chem_disp_cartridge/C, mob/user)
- if(!istype(C))
- if(user)
- to_chat(user, "\The [C] will not fit in \the [src]!")
- return
-
- if(cartridges.len >= DISPENSER_MAX_CARTRIDGES)
- if(user)
- to_chat(user, "\The [src] does not have any slots open for \the [C] to fit into!")
- return
-
- if(!C.label)
- if(user)
- to_chat(user, "\The [C] does not have a label!")
- return
-
- if(cartridges[C.label])
- if(user)
- to_chat(user, "\The [src] already contains a cartridge with that label!")
- return
- if(user && user.is_in_inventory(C))
- if(!user.attempt_insert_item_for_installation(C, src))
- return
- to_chat(user, "You add \the [C] to \the [src].")
-
- cartridges[C.label] = C
- cartridges = tim_sort(cartridges, /proc/cmp_text_asc)
- SStgui.update_uis(src)
-
-/obj/machinery/chemical_dispenser/proc/remove_cartridge(label)
- . = cartridges[label]
- cartridges -= label
- SStgui.update_uis(src)
-
-/obj/machinery/chemical_dispenser/attackby(obj/item/W, mob/user)
- if(W.is_wrench())
- playsound(src, W.tool_sound, 50, 1)
- to_chat(user, "You begin to [anchored ? "un" : ""]fasten \the [src].")
- if (do_after(user, 20 * W.tool_speed))
- user.visible_message(
- "\The [user] [anchored ? "un" : ""]fastens \the [src].",
- "You have [anchored ? "un" : ""]fastened \the [src].",
- "You hear a ratchet.")
- anchored = !anchored
- else
- to_chat(user, "You decide not to [anchored ? "un" : ""]fasten \the [src].")
-
- else if(istype(W, /obj/item/reagent_containers/chem_disp_cartridge))
- add_cartridge(W, user)
-
- else if(W.is_screwdriver())
- var/label = input(user, "Which cartridge would you like to remove?", "Chemical Dispenser") as null|anything in cartridges
- if(!label) return
- var/obj/item/reagent_containers/chem_disp_cartridge/C = remove_cartridge(label)
- if(C)
- to_chat(user, "You remove \the [C] from \the [src].")
- C.loc = loc
- playsound(src, W.tool_sound, 50, 1)
-
- else if(istype(W, /obj/item/reagent_containers/glass) || istype(W, /obj/item/reagent_containers/food))
- if(container)
- to_chat(user, "There is already \a [container] on \the [src]!")
- return
-
- var/obj/item/reagent_containers/RC = W
-
- if(!accept_drinking && istype(RC,/obj/item/reagent_containers/food))
- to_chat(user, "This machine only accepts beakers!")
- return
- if(!RC.is_open_container())
- to_chat(user, "You don't see how \the [src] could dispense reagents into \the [RC].")
- return
- if(!user.attempt_insert_item_for_installation(RC, src))
- return
- container = RC
- to_chat(user, "You set \the [RC] on \the [src].")
- SStgui.update_uis(src) // update all UIs attached to src
-
- else
- return ..()
-
-/obj/machinery/chemical_dispenser/ui_interact(mob/user, datum/tgui/ui = null)
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "ChemDispenser", ui_title) // 390, 655
- ui.open()
-
-/obj/machinery/chemical_dispenser/ui_data(mob/user)
- var/data[0]
- data["amount"] = amount
- data["isBeakerLoaded"] = container ? 1 : 0
- data["glass"] = accept_drinking
-
- var/beakerContents[0]
- if(container && container.reagents && container.reagents.reagent_list.len)
- for(var/datum/reagent/R in container.reagents.reagent_list)
- beakerContents.Add(list(list("name" = R.name, "id" = R.id, "volume" = R.volume))) // list in a list because Byond merges the first list...
- data["beakerContents"] = beakerContents
-
- if(container)
- data["beakerCurrentVolume"] = container.reagents.total_volume
- data["beakerMaxVolume"] = container.reagents.maximum_volume
- else
- data["beakerCurrentVolume"] = null
- data["beakerMaxVolume"] = null
-
- var/chemicals[0]
- for(var/label in cartridges)
- var/obj/item/reagent_containers/chem_disp_cartridge/C = cartridges[label]
- chemicals.Add(list(list("title" = label, "id" = label, "amount" = C.reagents.total_volume))) // list in a list because Byond merges the first list...
- data["chemicals"] = chemicals
- return data
-
-/obj/machinery/chemical_dispenser/ui_act(action, params)
- if(..())
- return TRUE
-
- . = TRUE
- switch(action)
- if("amount")
- amount = clamp(round(text2num(params["amount"]), 1), 0, 120) // round to nearest 1 and clamp 0 - 120
- if("dispense")
- var/label = params["reagent"]
- if(cartridges[label] && container && container.is_open_container())
- var/obj/item/reagent_containers/chem_disp_cartridge/C = cartridges[label]
- playsound(src, 'sound/machines/reagent_dispense.ogg', 25, 1)
- C.reagents.trans_to(container, amount)
- if("remove")
- var/amount = text2num(params["amount"])
- if(!container || !amount)
- return
- var/datum/reagents/R = container.reagents
- var/id = params["reagent"]
- if(amount > 0)
- R.remove_reagent(id, amount)
- else if(amount == -1) // Isolate
- R.isolate_reagent(id)
- if("ejectBeaker")
- if(!container)
- return
- if(!usr)
- return
- usr.grab_item_from_interacted_with(container, src)
- container = null
- else
- return FALSE
-
- add_fingerprint(usr)
-
-/obj/machinery/chemical_dispenser/attack_ghost(mob/user)
- . = ..()
- if(machine_stat & BROKEN)
- return
- ui_interact(user)
-
-/obj/machinery/chemical_dispenser/attack_ai(mob/user)
- attack_hand(user)
-
-/obj/machinery/chemical_dispenser/attack_hand(mob/user, list/params)
- if(machine_stat & BROKEN)
- return
- ui_interact(user)
-
-/obj/machinery/chemical_dispenser/unanchored
- anchored = FALSE
diff --git a/code/modules/reagents/machinery/dispenser/dispenser2_energy.dm b/code/modules/reagents/machinery/dispenser/dispenser2_energy.dm
deleted file mode 100644
index b34c80c44ec..00000000000
--- a/code/modules/reagents/machinery/dispenser/dispenser2_energy.dm
+++ /dev/null
@@ -1,62 +0,0 @@
-
-/obj/machinery/chemical_dispenser
- var/_recharge_reagents = 1
- var/list/dispense_reagents = list()
- var/process_tick = 0
-
-/obj/machinery/chemical_dispenser/process(delta_time)
- if(!_recharge_reagents)
- return
- if(machine_stat & (BROKEN|NOPOWER))
- return
- . = 0
- for(var/id in dispense_reagents)
- var/datum/reagent/R = SSchemistry.chemical_reagents[id]
- if(!R)
- stack_trace("[src] at [x],[y],[z] failed to find reagent '[id]'!")
- dispense_reagents -= id
- continue
- var/obj/item/reagent_containers/chem_disp_cartridge/C = cartridges[R.name]
- if(C && C.reagents.total_volume < C.reagents.maximum_volume)
- var/to_restore = min(C.reagents.maximum_volume - C.reagents.total_volume, 1)
- use_power(to_restore * 200)
- C.reagents.add_reagent(id, to_restore)
- . = 1
- if(.)
- SStgui.update_uis(src)
-
-/obj/machinery/chemical_dispenser
- dispense_reagents = list(
- "hydrogen", "lithium", "carbon", "nitrogen", "oxygen", "fluorine", "sodium",
- "aluminum", "silicon", "phosphorus", "sulfur", "chlorine", "potassium", "iron",
- "copper", "mercury", "radium", "water", "ethanol", "sugar", "sacid", "tungsten"
- )
-
-/obj/machinery/chemical_dispenser/ert
- dispense_reagents = list(
- "inaprovaline", "ryetalyn", "paracetamol", "tramadol", "oxycodone", "sterilizine", "leporazine",
- "kelotane", "dermaline", "dexalin", "dexalinp", "tricordrazine", "anti_toxin", "synaptizine",
- "hyronalin", "arithrazine", "alkysine", "imidazoline", "peridaxon", "bicaridine", "hyperzine",
- "rezadone", "spaceacillin", "ethylredoxrazine", "stoxin", "chloralhydrate", "cryoxadone",
- "clonexadone"
- )
-
-/obj/machinery/chemical_dispenser/bar_soft
- dispense_reagents = list(
- "water", "ice", "coffee", "cream", "tea", "icetea", "cola", "spacemountainwind", "dr_gibb", "space_up", "tonic",
- "sodawater", "lemon_lime", "sugar", "orangejuice", "limejuice", "watermelonjuice", "thirteenloko", "grapesoda",
- "sarsaparilla", "sassafras"
- )
-
-/obj/machinery/chemical_dispenser/bar_alc
- dispense_reagents = list(
- "lemon_lime", "sugar", "orangejuice", "limejuice", "sodawater", "tonic", "beer", "kahlua",
- "whiskey", "wine", "vodka", "cider", "gin", "rum", "tequila", "vermouth", "cognac", "ale", "mead", "bitters",
- "alcsassafras"
- )
-
-/obj/machinery/chemical_dispenser/bar_coffee
- dispense_reagents = list(
- "coffee", "cafe_latte", "soy_latte", "hot_coco", "milk", "cream", "tea", "ice",
- "orangejuice", "lemonjuice", "limejuice", "berryjuice", "mint"//, "decaf"
- )
diff --git a/code/modules/reagents/machinery/dispenser/dispenser_presets.dm b/code/modules/reagents/machinery/dispenser/dispenser_presets.dm
index 95a0f09ffa4..aa081c9f799 100644
--- a/code/modules/reagents/machinery/dispenser/dispenser_presets.dm
+++ b/code/modules/reagents/machinery/dispenser/dispenser_presets.dm
@@ -1,160 +1,91 @@
/obj/machinery/chemical_dispenser/full
- spawn_cartridges = list(
- /obj/item/reagent_containers/chem_disp_cartridge/hydrogen,
- /obj/item/reagent_containers/chem_disp_cartridge/lithium,
- /obj/item/reagent_containers/chem_disp_cartridge/carbon,
- /obj/item/reagent_containers/chem_disp_cartridge/nitrogen,
- /obj/item/reagent_containers/chem_disp_cartridge/oxygen,
- /obj/item/reagent_containers/chem_disp_cartridge/fluorine,
- /obj/item/reagent_containers/chem_disp_cartridge/sodium,
- /obj/item/reagent_containers/chem_disp_cartridge/aluminum,
- /obj/item/reagent_containers/chem_disp_cartridge/silicon,
- /obj/item/reagent_containers/chem_disp_cartridge/phosphorus,
- /obj/item/reagent_containers/chem_disp_cartridge/sulfur,
- /obj/item/reagent_containers/chem_disp_cartridge/chlorine,
- /obj/item/reagent_containers/chem_disp_cartridge/potassium,
- /obj/item/reagent_containers/chem_disp_cartridge/iron,
- /obj/item/reagent_containers/chem_disp_cartridge/copper,
- /obj/item/reagent_containers/chem_disp_cartridge/mercury,
- /obj/item/reagent_containers/chem_disp_cartridge/radium,
- /obj/item/reagent_containers/chem_disp_cartridge/water,
- /obj/item/reagent_containers/chem_disp_cartridge/ethanol,
- /obj/item/reagent_containers/chem_disp_cartridge/sugar,
- /obj/item/reagent_containers/chem_disp_cartridge/sacid,
- /obj/item/reagent_containers/chem_disp_cartridge/tungsten,
- /obj/item/reagent_containers/chem_disp_cartridge/calcium
- )
+ synthesizers = list(
+ /obj/item/reagent_synth/chemistry,
+ )
/obj/machinery/chemical_dispenser/full/unanchored
anchored = FALSE
-/obj/machinery/chemical_dispenser/ert
- name = "medicine dispenser"
- spawn_cartridges = list(
- /obj/item/reagent_containers/chem_disp_cartridge/inaprov,
- /obj/item/reagent_containers/chem_disp_cartridge/ryetalyn,
- /obj/item/reagent_containers/chem_disp_cartridge/paracetamol,
- /obj/item/reagent_containers/chem_disp_cartridge/tramadol,
- /obj/item/reagent_containers/chem_disp_cartridge/oxycodone,
- /obj/item/reagent_containers/chem_disp_cartridge/sterilizine,
- /obj/item/reagent_containers/chem_disp_cartridge/leporazine,
- /obj/item/reagent_containers/chem_disp_cartridge/kelotane,
- /obj/item/reagent_containers/chem_disp_cartridge/dermaline,
- /obj/item/reagent_containers/chem_disp_cartridge/dexalin,
- /obj/item/reagent_containers/chem_disp_cartridge/dexalin_p,
- /obj/item/reagent_containers/chem_disp_cartridge/tricord,
- /obj/item/reagent_containers/chem_disp_cartridge/dylovene,
- /obj/item/reagent_containers/chem_disp_cartridge/synaptizine,
- /obj/item/reagent_containers/chem_disp_cartridge/hyronalin,
- /obj/item/reagent_containers/chem_disp_cartridge/arithrazine,
- /obj/item/reagent_containers/chem_disp_cartridge/alkysine,
- /obj/item/reagent_containers/chem_disp_cartridge/imidazoline,
- /obj/item/reagent_containers/chem_disp_cartridge/peridaxon,
- /obj/item/reagent_containers/chem_disp_cartridge/bicaridine,
- /obj/item/reagent_containers/chem_disp_cartridge/hyperzine,
- /obj/item/reagent_containers/chem_disp_cartridge/rezadone,
- /obj/item/reagent_containers/chem_disp_cartridge/spaceacillin,
- /obj/item/reagent_containers/chem_disp_cartridge/ethylredox,
- /obj/item/reagent_containers/chem_disp_cartridge/sleeptox,
- /obj/item/reagent_containers/chem_disp_cartridge/chloral,
- /obj/item/reagent_containers/chem_disp_cartridge/cryoxadone,
- /obj/item/reagent_containers/chem_disp_cartridge/clonexadone
- )
+/obj/machinery/chemical_dispenser/catering
+ abstract_type = /obj/machinery/chemical_dispenser/catering
+ allow_drinking = TRUE
+ synthesizers_swappable = FALSE
-/obj/machinery/chemical_dispenser/bar_soft
+/obj/item/circuitboard/machine/chemical_dispenser/soda
+ build_path = /obj/machinery/chemical_dispenser/catering/bar_soft
+
+/obj/machinery/chemical_dispenser/catering/bar_soft
name = "soft drink dispenser"
desc = "A soda machine."
+ circuit = /obj/item/circuitboard/machine/chemical_dispenser/soda
icon_state = "soda_dispenser"
- ui_title = "Soda Dispenser"
- accept_drinking = 1
+ synthesizers_swappable = FALSE
+ synthesizers = list(
+ /obj/item/reagent_synth/drink,
+ )
-/obj/machinery/chemical_dispenser/bar_soft/full
- spawn_cartridges = list(
- /obj/item/reagent_containers/chem_disp_cartridge/water,
- /obj/item/reagent_containers/chem_disp_cartridge/ice,
- /obj/item/reagent_containers/chem_disp_cartridge/coffee,
- /obj/item/reagent_containers/chem_disp_cartridge/cream,
- /obj/item/reagent_containers/chem_disp_cartridge/tea,
- /obj/item/reagent_containers/chem_disp_cartridge/icetea,
- /obj/item/reagent_containers/chem_disp_cartridge/cola,
- /obj/item/reagent_containers/chem_disp_cartridge/smw,
- /obj/item/reagent_containers/chem_disp_cartridge/dr_gibb,
- /obj/item/reagent_containers/chem_disp_cartridge/spaceup,
- /obj/item/reagent_containers/chem_disp_cartridge/tonic,
- /obj/item/reagent_containers/chem_disp_cartridge/sodawater,
- /obj/item/reagent_containers/chem_disp_cartridge/lemon_lime,
- /obj/item/reagent_containers/chem_disp_cartridge/sugar,
- /obj/item/reagent_containers/chem_disp_cartridge/orange,
- /obj/item/reagent_containers/chem_disp_cartridge/lime,
- /obj/item/reagent_containers/chem_disp_cartridge/watermelon,
- /obj/item/reagent_containers/chem_disp_cartridge/lemon,
- /obj/item/reagent_containers/chem_disp_cartridge/sassafras,
- /obj/item/reagent_containers/chem_disp_cartridge/sarsaparilla
- )
-
-/obj/machinery/chemical_dispenser/bar_soft/unanchored
+/obj/machinery/chemical_dispenser/catering/bar_soft/unanchored
anchored = FALSE
-/obj/machinery/chemical_dispenser/bar_alc
+/obj/item/circuitboard/machine/chemical_dispenser/booze
+ build_path = /obj/machinery/chemical_dispenser/catering/bar_alc
+
+/obj/machinery/chemical_dispenser/catering/bar_alc
name = "booze dispenser"
desc = "A beer machine. Like a soda machine, but more fun!"
+ circuit = /obj/item/circuitboard/machine/chemical_dispenser/booze
icon_state = "booze_dispenser"
- ui_title = "Booze Dispenser"
- accept_drinking = 1
+ synthesizers = list(
+ /obj/item/reagent_synth/bar,
+ )
-/obj/machinery/chemical_dispenser/bar_alc/full
- spawn_cartridges = list(
- /obj/item/reagent_containers/chem_disp_cartridge/lemon_lime,
- /obj/item/reagent_containers/chem_disp_cartridge/sugar,
- /obj/item/reagent_containers/chem_disp_cartridge/orange,
- /obj/item/reagent_containers/chem_disp_cartridge/lime,
- /obj/item/reagent_containers/chem_disp_cartridge/sodawater,
- /obj/item/reagent_containers/chem_disp_cartridge/tonic,
- /obj/item/reagent_containers/chem_disp_cartridge/beer,
- /obj/item/reagent_containers/chem_disp_cartridge/kahlua,
- /obj/item/reagent_containers/chem_disp_cartridge/whiskey,
- /obj/item/reagent_containers/chem_disp_cartridge/wine,
- /obj/item/reagent_containers/chem_disp_cartridge/whitewine,
- /obj/item/reagent_containers/chem_disp_cartridge/vodka,
- /obj/item/reagent_containers/chem_disp_cartridge/gin,
- /obj/item/reagent_containers/chem_disp_cartridge/rum,
- /obj/item/reagent_containers/chem_disp_cartridge/tequila,
- /obj/item/reagent_containers/chem_disp_cartridge/vermouth,
- /obj/item/reagent_containers/chem_disp_cartridge/cognac,
- /obj/item/reagent_containers/chem_disp_cartridge/cider,
- /obj/item/reagent_containers/chem_disp_cartridge/ale,
- /obj/item/reagent_containers/chem_disp_cartridge/mead,
- /obj/item/reagent_containers/chem_disp_cartridge/alcsassafras
- )
-
-/obj/machinery/chemical_dispenser/bar_alc/unanchored
+/obj/machinery/chemical_dispenser/catering/bar_alc/unanchored
anchored = FALSE
-/obj/machinery/chemical_dispenser/bar_coffee
+/obj/item/circuitboard/machine/chemical_dispenser/cafe
+ build_path = /obj/machinery/chemical_dispenser/catering/bar_coffee
+
+/obj/machinery/chemical_dispenser/catering/bar_coffee
name = "coffee dispenser"
desc = "Driving crack dealers out of employment since 2280."
icon_state = "coffee_dispenser"
- ui_title = "Coffee Dispenser"
- accept_drinking = 1
+ circuit = /obj/item/circuitboard/machine/chemical_dispenser/cafe
+ synthesizers = list(
+ /obj/item/reagent_synth/cafe,
+ )
-/obj/machinery/chemical_dispenser/bar_coffee/full
- spawn_cartridges = list(
- /obj/item/reagent_containers/chem_disp_cartridge/coffee,
- /obj/item/reagent_containers/chem_disp_cartridge/cafe_latte,
- /obj/item/reagent_containers/chem_disp_cartridge/soy_latte,
- /obj/item/reagent_containers/chem_disp_cartridge/hot_coco,
- /obj/item/reagent_containers/chem_disp_cartridge/milk,
- /obj/item/reagent_containers/chem_disp_cartridge/cream,
- /obj/item/reagent_containers/chem_disp_cartridge/tea,
- /obj/item/reagent_containers/chem_disp_cartridge/ice,
- /obj/item/reagent_containers/chem_disp_cartridge/mint,
- /obj/item/reagent_containers/chem_disp_cartridge/orange,
- /obj/item/reagent_containers/chem_disp_cartridge/lemon,
- /obj/item/reagent_containers/chem_disp_cartridge/lime,
- /obj/item/reagent_containers/chem_disp_cartridge/berry,
- // /obj/item/reagent_containers/chem_disp_cartridge/greentea,
- // /obj/item/reagent_containers/chem_disp_cartridge/decaf
- )
-
-/obj/machinery/chemical_dispenser/bar_coffee/unanchored
+/obj/machinery/chemical_dispenser/catering/bar_coffee/unanchored
anchored = FALSE
+
+/obj/machinery/chemical_dispenser/xenoflora
+ name = "xenoflora chem dispenser"
+ synthesizers_swappable = FALSE
+ synthesizers = list(
+ /obj/item/reagent_synth/botanical,
+ )
+
+/obj/machinery/chemical_dispenser/biochemistry
+ name = "bioproduct dispenser"
+ synthesizers_swappable = FALSE
+ synthesizers = list(
+ /obj/item/reagent_synth/bioproduct,
+ )
+
+/obj/machinery/chemical_dispenser/ert
+ name = "medicine dispenser"
+ synthesizers_swappable = FALSE
+ synthesizers = list(
+ /obj/item/reagent_synth/medicine,
+ )
+
+/obj/machinery/chemical_dispenser/ert/specialops
+ synthesizers = list(
+ /obj/item/reagent_synth/medicine,
+ /obj/item/reagent_synth/medicine_addon,
+ )
+
+/obj/machinery/chemical_dispenser/ert/specialops/abductor
+ name = "chemical dispenser"
+ icon = 'icons/obj/abductor_vr.dmi'
+ icon_state = "dispenser_2way"
+ desc = "A mysterious machine which can fabricate many chemicals."
diff --git a/code/modules/reagents/machinery/dispenser/dispenser_presets_vr.dm b/code/modules/reagents/machinery/dispenser/dispenser_presets_vr.dm
deleted file mode 100644
index 57f62d50dc0..00000000000
--- a/code/modules/reagents/machinery/dispenser/dispenser_presets_vr.dm
+++ /dev/null
@@ -1,73 +0,0 @@
-/obj/machinery/chemical_dispenser/xenoflora
- name = "xenoflora chem dispenser"
- ui_title = "Xenoflora Chemical Dispenser"
- dispense_reagents = list(
- "water", "sugar", "ethanol", "radium", "ammonia", "diethylamine", "plantbgone", "mutagen", "calcium"
- )
-
-/obj/machinery/chemical_dispenser/xenoflora/full
- spawn_cartridges = list(
- /obj/item/reagent_containers/chem_disp_cartridge/water,
- /obj/item/reagent_containers/chem_disp_cartridge/sugar,
- /obj/item/reagent_containers/chem_disp_cartridge/ethanol,
- /obj/item/reagent_containers/chem_disp_cartridge/radium,
- /obj/item/reagent_containers/chem_disp_cartridge/ammonia,
- /obj/item/reagent_containers/chem_disp_cartridge/diethylamine,
- /obj/item/reagent_containers/chem_disp_cartridge/plantbgone,
- /obj/item/reagent_containers/chem_disp_cartridge/mutagen,
- /obj/item/reagent_containers/chem_disp_cartridge/calcium
- )
-
-/obj/machinery/chemical_dispenser/biochemistry
- name = "bioproduct dispenser"
- ui_title = "Bioproduct Dispenser"
- dispense_reagents = list(
- "nutriment", "protein", "milk"
- )
-
-/obj/machinery/chemical_dispenser/biochemistry/full
- spawn_cartridges = list(
- /obj/item/reagent_containers/chem_disp_cartridge/nutriment,
- /obj/item/reagent_containers/chem_disp_cartridge/protein,
- /obj/item/reagent_containers/chem_disp_cartridge/milk
- )
-
-/obj/machinery/chemical_dispenser/ert/specialops
- spawn_cartridges = list(
- /obj/item/reagent_containers/chem_disp_cartridge/inaprov,
- /obj/item/reagent_containers/chem_disp_cartridge/dylovene,
- /obj/item/reagent_containers/chem_disp_cartridge/ryetalyn,
- /obj/item/reagent_containers/chem_disp_cartridge/tramadol,
- /obj/item/reagent_containers/chem_disp_cartridge/oxycodone,
- /obj/item/reagent_containers/chem_disp_cartridge/sterilizine,
- /obj/item/reagent_containers/chem_disp_cartridge/leporazine,
- /obj/item/reagent_containers/chem_disp_cartridge/kelotane,
- /obj/item/reagent_containers/chem_disp_cartridge/dermaline,
- /obj/item/reagent_containers/chem_disp_cartridge/dexalin,
- /obj/item/reagent_containers/chem_disp_cartridge/dexalin_p,
- /obj/item/reagent_containers/chem_disp_cartridge/synaptizine,
- /obj/item/reagent_containers/chem_disp_cartridge/hyronalin,
- /obj/item/reagent_containers/chem_disp_cartridge/arithrazine,
- /obj/item/reagent_containers/chem_disp_cartridge/alkysine,
- /obj/item/reagent_containers/chem_disp_cartridge/imidazoline,
- /obj/item/reagent_containers/chem_disp_cartridge/peridaxon,
- /obj/item/reagent_containers/chem_disp_cartridge/bicaridine,
- /obj/item/reagent_containers/chem_disp_cartridge/hyperzine,
- /obj/item/reagent_containers/chem_disp_cartridge/rezadone,
- /obj/item/reagent_containers/chem_disp_cartridge/spaceacillin,
- /obj/item/reagent_containers/chem_disp_cartridge/ethylredox,
- /obj/item/reagent_containers/chem_disp_cartridge/carthatoline,
- /obj/item/reagent_containers/chem_disp_cartridge/corophizine,
- /obj/item/reagent_containers/chem_disp_cartridge/myelamine,
- /obj/item/reagent_containers/chem_disp_cartridge/osteodaxon,
- /obj/item/reagent_containers/chem_disp_cartridge/biomass,
- /obj/item/reagent_containers/chem_disp_cartridge/iron,
- /obj/item/reagent_containers/chem_disp_cartridge/nutriment,
- /obj/item/reagent_containers/chem_disp_cartridge/protein
- )
-
-/obj/machinery/chemical_dispenser/ert/specialops/abductor
- name = "chemical dispenser"
- icon = 'icons/obj/abductor_vr.dmi'
- icon_state = "dispenser_2way"
- desc = "A mysterious machine which can fabricate many chemicals."
diff --git a/code/modules/reagents/machinery/dispenser/reagent_tank.dm b/code/modules/reagents/machinery/dispenser/reagent_tank.dm
deleted file mode 100644
index 495eac943bf..00000000000
--- a/code/modules/reagents/machinery/dispenser/reagent_tank.dm
+++ /dev/null
@@ -1,487 +0,0 @@
-/obj/structure/reagent_dispensers
- name = "Dispenser"
- desc = "..."
- icon = 'icons/obj/objects.dmi'
- icon_state = "watertank"
- layer = TABLE_LAYER
- density = 1
- anchored = 0
- pressure_resistance = 2*ONE_ATMOSPHERE
-
- // var/obj/item/hose_connector/input/active/InputSocket
- // var/obj/item/hose_connector/output/active/OutputSocket
-
- var/amount_per_transfer_from_this = 10
- var/possible_transfer_amounts = list(10,25,50,100)
-
-/obj/structure/reagent_dispensers/attackby(obj/item/W as obj, mob/user as mob)
- return
-
-/obj/structure/reagent_dispensers/Destroy()
- // QDEL_NULL(InputSocket)
- // QDEL_NULL(OutputSocket)
-
- ..()
-
-/obj/structure/reagent_dispensers/Initialize(mapload)
- var/datum/reagents/R = new/datum/reagents(5000)
- reagents = R
- R.my_atom = src
- if (!possible_transfer_amounts)
- remove_obj_verb(src, /obj/structure/reagent_dispensers/verb/set_APTFT)
-
- // InputSocket = new(src)
- // InputSocket.carrier = src
- // OutputSocket = new(src)
- // OutputSocket.carrier = src
-
- . = ..()
-
-/obj/structure/reagent_dispensers/examine(mob/user)
- . = ..()
- if(get_dist(user, src) <= 2)
- . += "It contains:"
- if(reagents && reagents.reagent_list.len)
- for(var/datum/reagent/R in reagents.reagent_list)
- . += "[R.volume] units of [R.name]"
- else
- . += "Nothing."
-
-/obj/structure/reagent_dispensers/verb/set_APTFT() //set amount_per_transfer_from_this
- set name = "Set transfer amount"
- set category = "Object"
- set src in view(1)
- var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts
- if (N)
- amount_per_transfer_from_this = N
-
-/obj/structure/reagent_dispensers/legacy_ex_act(severity)
- switch(severity)
- if(1.0)
- qdel(src)
- return
- if(2.0)
- if (prob(50))
- new /obj/effect/water(src.loc)
- qdel(src)
- return
- if(3.0)
- if (prob(5))
- new /obj/effect/water(src.loc)
- qdel(src)
- return
- else
- return
-
-/obj/structure/reagent_dispensers/blob_act()
- qdel(src)
-
-
-
-//Dispensers
-/obj/structure/reagent_dispensers/watertank
- name = "watertank"
- desc = "A watertank."
- icon = 'icons/obj/objects_vr.dmi'
- icon_state = "watertank"
- amount_per_transfer_from_this = 10
-
-/obj/structure/reagent_dispensers/watertank/Initialize(mapload)
- . = ..()
- reagents.add_reagent("water", 1000)
-
-/obj/structure/reagent_dispensers/watertank/high
- name = "high-capacity water tank"
- desc = "A highly-pressurized water tank made to hold vast amounts of water.."
- icon_state = "watertank_high"
-
-/obj/structure/reagent_dispensers/watertank/high/Initialize(mapload)
- . = ..()
- reagents.add_reagent("water", 4000)
-
-/obj/structure/reagent_dispensers/fueltank
- name = "fueltank"
- desc = "A fueltank."
- icon = 'icons/obj/objects_vr.dmi'
- icon_state = "weldtank"
- amount_per_transfer_from_this = 10
- var/modded = 0
- var/obj/item/assembly_holder/rig = null
-
-/obj/structure/reagent_dispensers/fueltank/Initialize(mapload)
- . = ..()
- reagents.add_reagent("fuel",1000)
-
-/obj/structure/reagent_dispensers/fueltank/high
- name = "high-capacity fuel tank"
- desc = "A highly-pressurized fuel tank made to hold vast amounts of fuel."
- icon_state = "weldtank_high"
-
-/obj/structure/reagent_dispensers/fueltank/high/Initialize(mapload)
- . = ..()
- reagents.add_reagent("fuel",4000)
-
-/obj/structure/reagent_dispensers/foam
- name = "foamtank"
- desc = "A foam tank."
- icon = 'icons/obj/objects_vr.dmi'
- icon_state = "foamtank"
- amount_per_transfer_from_this = 10
-
-/obj/structure/reagent_dispensers/foam/Initialize(mapload)
- . = ..()
- reagents.add_reagent("firefoam",1000)
-
-/obj/structure/reagent_dispensers/fueltank/barrel
- name = "hazardous barrel"
- desc = "An open-topped barrel full of nasty-looking liquid."
- icon_state = "barrel"
- modded = TRUE
-
-/obj/structure/reagent_dispensers/fueltank/barrel/attackby(obj/item/W as obj, mob/user as mob)
- if (W.is_wrench()) //can't wrench it shut, it's always open
- return
- return ..()
-
-/obj/structure/reagent_dispensers/fueltank/examine(mob/user)
- . = ..()
- if(get_dist(user, src) <= 2)
- if(modded)
- . += "Fuel faucet is wrenched open, leaking the fuel!"
- if(rig)
- . += "There is some kind of device rigged to the tank."
-
-/obj/structure/reagent_dispensers/fueltank/attack_hand(mob/user, list/params)
- if (rig)
- usr.visible_message("[usr] begins to detach [rig] from \the [src].", "You begin to detach [rig] from \the [src]")
- if(do_after(usr, 20))
- usr.visible_message("[usr] detaches [rig] from \the [src].", "You detach [rig] from \the [src]")
- rig.loc = get_turf(usr)
- rig = null
- cut_overlays()
-
-/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/W as obj, mob/user as mob)
- src.add_fingerprint(user)
- if (W.is_wrench())
- user.visible_message("[user] wrenches [src]'s faucet [modded ? "closed" : "open"].", \
- "You wrench [src]'s faucet [modded ? "closed" : "open"]")
- modded = modded ? 0 : 1
- playsound(src, W.tool_sound, 75, 1)
- if (modded)
- message_admins("[key_name_admin(user)] opened fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking fuel. (JMP)")
- log_game("[key_name(user)] opened fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking fuel.")
- leak_fuel(amount_per_transfer_from_this)
- if (istype(W,/obj/item/assembly_holder))
- if (rig)
- to_chat(user, "There is another device in the way.")
- return ..()
- user.visible_message("[user] begins rigging [W] to \the [src].", "You begin rigging [W] to \the [src]")
- if(do_after(user, 20))
- user.visible_message("[user] rigs [W] to \the [src].", "You rig [W] to \the [src]")
-
- var/obj/item/assembly_holder/H = W
- if (istype(H.a_left,/obj/item/assembly/igniter) || istype(H.a_right,/obj/item/assembly/igniter))
- message_admins("[key_name_admin(user)] rigged fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) for explosion. (JMP)")
- log_game("[key_name(user)] rigged fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) for explosion.")
-
- if(!user.attempt_insert_item_for_installation(W, src))
- return
-
- rig = W
-
- var/icon/test = get_flat_icon(W)
- test.Shift(NORTH,1)
- test.Shift(EAST,6)
- add_overlay(test)
-
- return ..()
-
-
-/obj/structure/reagent_dispensers/fueltank/bullet_act(var/obj/item/projectile/Proj)
- if(Proj.get_structure_damage())
- if(istype(Proj.firer))
- message_admins("[key_name_admin(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) (JMP).")
- log_game("[key_name(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]).")
-
- if(!istype(Proj ,/obj/item/projectile/beam/lasertag) && !istype(Proj ,/obj/item/projectile/beam/practice) )
- explode()
-
-/obj/structure/reagent_dispensers/fueltank/legacy_ex_act()
- explode()
-
-/obj/structure/reagent_dispensers/fueltank/blob_act()
- explode()
-
-/obj/structure/reagent_dispensers/fueltank/proc/explode()
- if (reagents.total_volume > 500)
- explosion(src.loc,1,2,4)
- else if (reagents.total_volume > 100)
- explosion(src.loc,0,1,3)
- else if (reagents.total_volume > 50)
- explosion(src.loc,-1,1,2)
- if(src)
- qdel(src)
-
-/obj/structure/reagent_dispensers/fueltank/fire_act(datum/gas_mixture/air, temperature, volume)
- if (modded)
- explode()
- else if (temperature > T0C+500)
- explode()
- return ..()
-
-/obj/structure/reagent_dispensers/fueltank/Move()
- if (..() && modded)
- leak_fuel(amount_per_transfer_from_this/10.0)
-
-/obj/structure/reagent_dispensers/fueltank/proc/leak_fuel(amount)
- if (reagents.total_volume == 0)
- return
-
- amount = min(amount, reagents.total_volume)
- reagents.remove_reagent("fuel",amount)
- new /obj/effect/debris/cleanable/liquid_fuel(src.loc, amount,1)
-
-/obj/structure/reagent_dispensers/peppertank
- name = "Pepper Spray Refiller"
- desc = "Refills pepper spray canisters."
- icon = 'icons/obj/objects.dmi'
- icon_state = "peppertank"
- anchored = TRUE
- density = FALSE
- amount_per_transfer_from_this = 45
-
-/obj/structure/reagent_dispensers/peppertank/Initialize(mapload)
- . = ..()
- reagents.add_reagent("condensedcapsaicin",1000)
-
-
-/obj/structure/reagent_dispensers/water_cooler
- name = "Water-Cooler"
- desc = "A machine that dispenses water to drink."
- amount_per_transfer_from_this = 5
- icon = 'icons/obj/vending.dmi'
- icon_state = "water_cooler"
- possible_transfer_amounts = null
- anchored = TRUE
- var/bottle = 0
- var/cups = 0
- var/cupholder = 0
-
-/obj/structure/reagent_dispensers/water_cooler/full
- bottle = 1
- cupholder = 1
- cups = 10
-
-/obj/structure/reagent_dispensers/water_cooler/Initialize(mapload)
- . = ..()
- if(bottle)
- reagents.add_reagent("water",120)
- update_icon()
-
-/obj/structure/reagent_dispensers/water_cooler/examine(mob/user)
- . = ..()
- if(cupholder)
- . += "There are [cups] cups in the cup dispenser."
-
-/obj/structure/reagent_dispensers/water_cooler/verb/rotate_clockwise()
- set name = "Rotate Cooler Clockwise"
- set category = "Object"
- set src in oview(1)
-
- if (src.anchored || usr:stat)
- to_chat(usr, "It is fastened to the floor!")
- return 0
- setDir(turn(dir, 270))
- return 1
-
-/obj/structure/reagent_dispensers/water_cooler/attackby(obj/item/I as obj, mob/user as mob)
- if(I.is_wrench())
- src.add_fingerprint(user)
- if(bottle)
- playsound(src, I.tool_sound, 50, 1)
- if(do_after(user, 20) && bottle)
- to_chat(user, "You unfasten the jug.")
- var/obj/item/reagent_containers/glass/cooler_bottle/G = new /obj/item/reagent_containers/glass/cooler_bottle( src.loc )
- for(var/datum/reagent/R in reagents.reagent_list)
- var/total_reagent = reagents.get_reagent_amount(R.id)
- G.reagents.add_reagent(R.id, total_reagent)
- reagents.clear_reagents()
- bottle = 0
- update_icon()
- else
- if(anchored)
- user.visible_message("\The [user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.")
- else
- user.visible_message("\The [user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.")
- if(do_after(user, 20 * I.tool_speed, src))
- if(!src) return
- to_chat(user, "You [anchored? "un" : ""]secured \the [src]!")
- anchored = !anchored
- playsound(src, I.tool_sound, 50, 1)
- return
-
- if(I.is_screwdriver())
- if(cupholder)
- playsound(src, I.tool_sound, 50, 1)
- to_chat(user, "You take the cup dispenser off.")
- new /obj/item/stack/material/plastic( src.loc )
- if(cups)
- for(var/i = 0 to cups)
- new /obj/item/reagent_containers/food/drinks/sillycup(src.loc)
- cups = 0
- cupholder = 0
- update_icon()
- return
- if(!bottle && !cupholder)
- playsound(src, I.tool_sound, 50, 1)
- to_chat(user, "You start taking the water-cooler apart.")
- if(do_after(user, 20 * I.tool_speed) && !bottle && !cupholder)
- to_chat(user, "You take the water-cooler apart.")
- new /obj/item/stack/material/plastic( src.loc, 4 )
- qdel(src)
- return
-
- if(istype(I, /obj/item/reagent_containers/glass/cooler_bottle))
- src.add_fingerprint(user)
- if(!bottle)
- if(anchored)
- var/obj/item/reagent_containers/glass/cooler_bottle/G = I
- to_chat(user, "You start to screw the bottle onto the water-cooler.")
- if(do_after(user, 20) && !bottle && anchored)
- bottle = 1
- update_icon()
- to_chat(user, "You screw the bottle onto the water-cooler!")
- for(var/datum/reagent/R in G.reagents.reagent_list)
- var/total_reagent = G.reagents.get_reagent_amount(R.id)
- reagents.add_reagent(R.id, total_reagent)
- qdel(G)
- else
- to_chat(user, "You need to wrench down the cooler first.")
- else
- to_chat(user, "There is already a bottle there!")
- return 1
-
- if(istype(I, /obj/item/stack/material/plastic))
- if(!cupholder)
- if(anchored)
- var/obj/item/stack/material/plastic/P = I
- src.add_fingerprint(user)
- to_chat(user, "You start to attach a cup dispenser onto the water-cooler.")
- playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 20) && !cupholder && anchored)
- if (P.use(1))
- to_chat(user, "You attach a cup dispenser onto the water-cooler.")
- cupholder = 1
- update_icon()
- else
- to_chat(user, "You need to wrench down the cooler first.")
- else
- to_chat(user, "There is already a cup dispenser there!")
- return
-
-/obj/structure/reagent_dispensers/water_cooler/attack_hand(mob/user, list/params)
- if(cups)
- new /obj/item/reagent_containers/food/drinks/sillycup(src.loc)
- cups--
- flick("[icon_state]-vend", src)
- return
-
-/obj/structure/reagent_dispensers/water_cooler/update_icon()
- icon_state = "water_cooler"
- cut_overlays()
- var/image/I
- if(bottle)
- I = image(icon, "water_cooler_bottle")
- add_overlay(I)
- return
-
-/obj/structure/reagent_dispensers/beerkeg
- name = "beer keg"
- desc = "A beer keg."
- icon = 'icons/obj/objects.dmi'
- icon_state = "beertankTEMP"
- amount_per_transfer_from_this = 10
-
-/obj/structure/reagent_dispensers/beerkeg/Initialize(mapload)
- . = ..()
- reagents.add_reagent("beer",1000)
-
-/obj/structure/reagent_dispensers/beerkeg/fakenuke
- name = "nuclear beer keg"
- desc = "A beer keg in the form of a nuclear bomb! An absolute blast at parties!"
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "nuclearbomb0"
-
-/obj/structure/reagent_dispensers/virusfood
- name = "Virus Food Dispenser"
- desc = "A dispenser of virus food. Yum."
- icon = 'icons/obj/objects.dmi'
- icon_state = "virusfoodtank"
- amount_per_transfer_from_this = 10
- anchored = TRUE
- density = FALSE
-
-/obj/structure/reagent_dispensers/virusfood/Initialize(mapload)
- . = ..()
- reagents.add_reagent("virusfood", 1000)
-
-/obj/structure/reagent_dispensers/acid
- name = "Sulphuric Acid Dispenser"
- desc = "A dispenser of acid for industrial processes."
- icon = 'icons/obj/objects.dmi'
- icon_state = "acidtank"
- amount_per_transfer_from_this = 10
- anchored = TRUE
- density = FALSE
-
-/obj/structure/reagent_dispensers/acid/Initialize(mapload)
- . = ..()
- reagents.add_reagent("sacid", 1000)
-
-//Cooking oil refill tank
-/obj/structure/reagent_dispensers/tallow
- name = "tallow tank"
- desc = "A fifty-litre tank of commercial-grade tallow, intended for use in large scale deep fryers. Store in a cool, dark place"
- icon = 'icons/obj/objects.dmi'
- icon_state = "oiltank"
- amount_per_transfer_from_this = 120
-
-/obj/structure/reagent_dispensers/tallow/Initialize(mapload)
- . = ..()
- reagents.add_reagent("tallow", 5000)
-
-/obj/structure/reagent_dispensers/cookingoil/bullet_act(var/obj/item/projectile/Proj)
- if(Proj.get_structure_damage())
- explode()
-
-/obj/structure/reagent_dispensers/cookingoil/legacy_ex_act()
- explode()
-
-/obj/structure/reagent_dispensers/cookingoil/proc/explode()
- reagents.splash_area(get_turf(src), 3)
- visible_message(SPAN_DANGER("The [src] bursts open, spreading oil all over the area."))
- qdel(src)
-
-/obj/structure/reagent_dispensers/he3
- name = "fueltank"
- desc = "A fueltank."
- icon = 'icons/obj/objects.dmi'
- icon_state = "weldtank"
- amount_per_transfer_from_this = 10
-
-/obj/structure/reagent_dispenser/he3/Initialize(mapload)
- ..()
- reagents.add_reagent("helium3",1000)
-
-//Oil from Main. Seems like it could fit into Robotics as well as Surt stuff.
-/obj/structure/reagent_dispensers/oil
- name = "Oil Dispenser"
- desc = "A dispenser of crude oil for industrial processes."
- icon = 'icons/obj/objects.dmi'
- icon_state = "oiltank"
- amount_per_transfer_from_this = 10
- anchored = TRUE
-
-/obj/structure/reagent_dispensers/oil/Initialize(mapload)
- . = ..()
- reagents.add_reagent("oil", 1000)
diff --git a/code/modules/reagents/machinery/dispenser/supply.dm b/code/modules/reagents/machinery/dispenser/supply.dm
index 40372bc5abf..8844b0b582f 100644
--- a/code/modules/reagents/machinery/dispenser/supply.dm
+++ b/code/modules/reagents/machinery/dispenser/supply.dm
@@ -1,9 +1,9 @@
-/datum/supply_pack/chemistry_dispenser
- name = "Reagent dispenser"
+/datum/supply_pack/chemical_dispenser
+ name = "Reagent dispenser (Empty)"
contains = list(
/obj/machinery/chemical_dispenser/unanchored
)
- cost = 25
+ cost = 10
container_type = /obj/structure/largecrate
container_name = "reagent dispenser crate"
group = "Reagents"
@@ -11,9 +11,9 @@
/datum/supply_pack/beer_dispenser
name = "Booze dispenser"
contains = list(
- /obj/machinery/chemical_dispenser/bar_alc/unanchored
+ /obj/machinery/chemical_dispenser/catering/bar_alc/unanchored
)
- cost = 25
+ cost = 20
container_type = /obj/structure/largecrate
container_name = "booze dispenser crate"
group = "Reagents"
@@ -21,218 +21,25 @@
/datum/supply_pack/soda_dispenser
name = "Soda dispenser"
contains = list(
- /obj/machinery/chemical_dispenser/bar_soft/unanchored
+ /obj/machinery/chemical_dispenser/catering/bar_soft/unanchored
)
- cost = 25
+ cost = 20
container_type = /obj/structure/largecrate
container_name = "soda dispenser crate"
group = "Reagents"
-/datum/supply_pack/reagents
- name = "Chemistry dispenser refill"
+/datum/supply_pack/reagent_synth_chemistry
+ name = "Reagent Synthesis Module - Chemistry"
contains = list(
- /obj/item/reagent_containers/chem_disp_cartridge/hydrogen,
- /obj/item/reagent_containers/chem_disp_cartridge/lithium,
- /obj/item/reagent_containers/chem_disp_cartridge/carbon,
- /obj/item/reagent_containers/chem_disp_cartridge/nitrogen,
- /obj/item/reagent_containers/chem_disp_cartridge/oxygen,
- /obj/item/reagent_containers/chem_disp_cartridge/fluorine,
- /obj/item/reagent_containers/chem_disp_cartridge/sodium,
- /obj/item/reagent_containers/chem_disp_cartridge/aluminum,
- /obj/item/reagent_containers/chem_disp_cartridge/silicon,
- /obj/item/reagent_containers/chem_disp_cartridge/phosphorus,
- /obj/item/reagent_containers/chem_disp_cartridge/sulfur,
- /obj/item/reagent_containers/chem_disp_cartridge/chlorine,
- /obj/item/reagent_containers/chem_disp_cartridge/potassium,
- /obj/item/reagent_containers/chem_disp_cartridge/iron,
- /obj/item/reagent_containers/chem_disp_cartridge/copper,
- /obj/item/reagent_containers/chem_disp_cartridge/mercury,
- /obj/item/reagent_containers/chem_disp_cartridge/radium,
- /obj/item/reagent_containers/chem_disp_cartridge/water,
- /obj/item/reagent_containers/chem_disp_cartridge/ethanol,
- /obj/item/reagent_containers/chem_disp_cartridge/sugar,
- /obj/item/reagent_containers/chem_disp_cartridge/sacid,
- /obj/item/reagent_containers/chem_disp_cartridge/tungsten
- )
- cost = 150
- container_type = /obj/structure/closet/crate/secure
- container_name = "chemical crate"
- access = list(ACCESS_MEDICAL_CHEMISTRY)
- group = "Reagents"
-
-/datum/supply_pack/alcohol_reagents
- name = "Bar alcoholic dispenser refill"
- contains = list(
- /obj/item/reagent_containers/chem_disp_cartridge/beer,
- /obj/item/reagent_containers/chem_disp_cartridge/kahlua,
- /obj/item/reagent_containers/chem_disp_cartridge/whiskey,
- /obj/item/reagent_containers/chem_disp_cartridge/wine,
- /obj/item/reagent_containers/chem_disp_cartridge/whitewine,
- /obj/item/reagent_containers/chem_disp_cartridge/vodka,
- /obj/item/reagent_containers/chem_disp_cartridge/gin,
- /obj/item/reagent_containers/chem_disp_cartridge/rum,
- /obj/item/reagent_containers/chem_disp_cartridge/tequila,
- /obj/item/reagent_containers/chem_disp_cartridge/vermouth,
- /obj/item/reagent_containers/chem_disp_cartridge/cognac,
- /obj/item/reagent_containers/chem_disp_cartridge/ale,
- /obj/item/reagent_containers/chem_disp_cartridge/mead,
- /obj/item/reagent_containers/chem_disp_cartridge/bitters
- )
- cost = 50
- container_type = /obj/structure/closet/crate/secure
- container_name = "alcoholic drinks crate"
- access = list(ACCESS_GENERAL_BAR)
- group = "Reagents"
-
-/datum/supply_pack/softdrink_reagents
- name = "Bar soft drink dispenser refill"
- contains = list(
- /obj/item/reagent_containers/chem_disp_cartridge/water,
- /obj/item/reagent_containers/chem_disp_cartridge/ice,
- /obj/item/reagent_containers/chem_disp_cartridge/coffee,
- /obj/item/reagent_containers/chem_disp_cartridge/cream,
- /obj/item/reagent_containers/chem_disp_cartridge/tea,
- /obj/item/reagent_containers/chem_disp_cartridge/icetea,
- /obj/item/reagent_containers/chem_disp_cartridge/cola,
- /obj/item/reagent_containers/chem_disp_cartridge/smw,
- /obj/item/reagent_containers/chem_disp_cartridge/dr_gibb,
- /obj/item/reagent_containers/chem_disp_cartridge/spaceup,
- /obj/item/reagent_containers/chem_disp_cartridge/tonic,
- /obj/item/reagent_containers/chem_disp_cartridge/sodawater,
- /obj/item/reagent_containers/chem_disp_cartridge/lemon_lime,
- /obj/item/reagent_containers/chem_disp_cartridge/sugar,
- /obj/item/reagent_containers/chem_disp_cartridge/orange,
- /obj/item/reagent_containers/chem_disp_cartridge/lime,
- /obj/item/reagent_containers/chem_disp_cartridge/watermelon,
- /obj/item/reagent_containers/chem_disp_cartridge/lemon
- )
- cost = 50
- container_type = /obj/structure/closet/crate
- container_name = "soft drinks crate"
- group = "Reagents"
-
-/datum/supply_pack/coffee_reagents
- name = "Coffee machine dispenser refill"
- contains = list(
- /obj/item/reagent_containers/chem_disp_cartridge/coffee,
- /obj/item/reagent_containers/chem_disp_cartridge/cafe_latte,
- /obj/item/reagent_containers/chem_disp_cartridge/soy_latte,
- /obj/item/reagent_containers/chem_disp_cartridge/hot_coco,
- /obj/item/reagent_containers/chem_disp_cartridge/milk,
- /obj/item/reagent_containers/chem_disp_cartridge/cream,
- /obj/item/reagent_containers/chem_disp_cartridge/tea,
- /obj/item/reagent_containers/chem_disp_cartridge/ice
- )
- cost = 50
- container_type = /obj/structure/closet/crate
- container_name = "coffee drinks crate"
- group = "Reagents"
+ /obj/item/reagent_synth/chemistry,
+ )
/datum/supply_pack/dispenser_cartridges
- name = "Empty dispenser cartridges"
+ name = "Large Chemical Dispenser Cartridges"
contains = list(
- /obj/item/reagent_containers/chem_disp_cartridge,
- /obj/item/reagent_containers/chem_disp_cartridge,
- /obj/item/reagent_containers/chem_disp_cartridge,
- /obj/item/reagent_containers/chem_disp_cartridge,
- /obj/item/reagent_containers/chem_disp_cartridge,
- /obj/item/reagent_containers/chem_disp_cartridge,
- /obj/item/reagent_containers/chem_disp_cartridge,
- /obj/item/reagent_containers/chem_disp_cartridge,
- /obj/item/reagent_containers/chem_disp_cartridge,
- /obj/item/reagent_containers/chem_disp_cartridge
+ /obj/item/reagent_containers/cartridge/dispenser/large = 10,
)
cost = 15
container_type = /obj/structure/closet/crate
container_name = "dispenser cartridge crate"
group = "Reagents"
-
-#define SEC_PACK(_tname, _type, _name, _cname, _cost, _access)\
-/datum/supply_pack/dispenser_cartridges/_tname{\
- name = _name ;\
- container_name = _cname ;\
- container_type = /obj/structure/closet/crate/secure;\
- access = list( _access );\
- cost = _cost ;\
- contains = list( _type , _type );\
- group = "Reagent Cartridges"\
-}\
-
-#define PACK(_tname, _type, _name, _cname, _cost)\
-/datum/supply_pack/dispenser_cartridges/_tname{\
- name = _name ;\
- container_name = _cname ;\
- container_type = /obj/structure/closet/crate;\
- cost = _cost ;\
- contains = list( _type , _type );\
- group = "Reagent Cartridges"\
-}\
-
-// Chemistry-restricted (raw reagents excluding sugar/water)
-// Datum path Contents type Supply pack name Container name Cost Container access
-SEC_PACK(hydrogen, /obj/item/reagent_containers/chem_disp_cartridge/hydrogen, "Reagent refill - Hydrogen", "hydrogen reagent cartridge crate", 15, ACCESS_MEDICAL_CHEMISTRY)
-SEC_PACK(lithium, /obj/item/reagent_containers/chem_disp_cartridge/lithium, "Reagent refill - Lithium", "lithium reagent cartridge crate", 15, ACCESS_MEDICAL_CHEMISTRY)
-SEC_PACK(carbon, /obj/item/reagent_containers/chem_disp_cartridge/carbon, "Reagent refill - Carbon", "carbon reagent cartridge crate", 15, ACCESS_MEDICAL_CHEMISTRY)
-SEC_PACK(nitrogen, /obj/item/reagent_containers/chem_disp_cartridge/nitrogen, "Reagent refill - Nitrogen", "nitrogen reagent cartridge crate", 15, ACCESS_MEDICAL_CHEMISTRY)
-SEC_PACK(oxygen, /obj/item/reagent_containers/chem_disp_cartridge/oxygen, "Reagent refill - Oxygen", "oxygen reagent cartridge crate", 15, ACCESS_MEDICAL_CHEMISTRY)
-SEC_PACK(fluorine, /obj/item/reagent_containers/chem_disp_cartridge/fluorine, "Reagent refill - Fluorine", "fluorine reagent cartridge crate", 15, ACCESS_MEDICAL_CHEMISTRY)
-SEC_PACK(sodium, /obj/item/reagent_containers/chem_disp_cartridge/sodium, "Reagent refill - Sodium", "sodium reagent cartridge crate", 15, ACCESS_MEDICAL_CHEMISTRY)
-SEC_PACK(aluminium, /obj/item/reagent_containers/chem_disp_cartridge/aluminum, "Reagent refill - Aluminum", "aluminum reagent cartridge crate", 15, ACCESS_MEDICAL_CHEMISTRY)
-SEC_PACK(silicon, /obj/item/reagent_containers/chem_disp_cartridge/silicon, "Reagent refill - Silicon", "silicon reagent cartridge crate", 15, ACCESS_MEDICAL_CHEMISTRY)
-SEC_PACK(phosphorus,/obj/item/reagent_containers/chem_disp_cartridge/phosphorus, "Reagent refill - Phosphorus", "phosphorus reagent cartridge crate", 15, ACCESS_MEDICAL_CHEMISTRY)
-SEC_PACK(sulfur, /obj/item/reagent_containers/chem_disp_cartridge/sulfur, "Reagent refill - Sulfur", "sulfur reagent cartridge crate", 15, ACCESS_MEDICAL_CHEMISTRY)
-SEC_PACK(chlorine, /obj/item/reagent_containers/chem_disp_cartridge/chlorine, "Reagent refill - Chlorine", "chlorine reagent cartridge crate", 15, ACCESS_MEDICAL_CHEMISTRY)
-SEC_PACK(potassium, /obj/item/reagent_containers/chem_disp_cartridge/potassium, "Reagent refill - Potassium", "potassium reagent cartridge crate", 15, ACCESS_MEDICAL_CHEMISTRY)
-SEC_PACK(iron, /obj/item/reagent_containers/chem_disp_cartridge/iron, "Reagent refill - Iron", "iron reagent cartridge crate", 15, ACCESS_MEDICAL_CHEMISTRY)
-SEC_PACK(copper, /obj/item/reagent_containers/chem_disp_cartridge/copper, "Reagent refill - Copper", "copper reagent cartridge crate", 15, ACCESS_MEDICAL_CHEMISTRY)
-SEC_PACK(mercury, /obj/item/reagent_containers/chem_disp_cartridge/mercury, "Reagent refill - Mercury", "mercury reagent cartridge crate", 15, ACCESS_MEDICAL_CHEMISTRY)
-SEC_PACK(radium, /obj/item/reagent_containers/chem_disp_cartridge/radium, "Reagent refill - Radium", "radium reagent cartridge crate", 15, ACCESS_MEDICAL_CHEMISTRY)
-SEC_PACK(ethanol, /obj/item/reagent_containers/chem_disp_cartridge/ethanol, "Reagent refill - Ethanol", "ethanol reagent cartridge crate", 15, ACCESS_MEDICAL_CHEMISTRY)
-SEC_PACK(sacid, /obj/item/reagent_containers/chem_disp_cartridge/sacid, "Reagent refill - Sulfuric Acid", "sulfuric acid reagent cartridge crate", 15, ACCESS_MEDICAL_CHEMISTRY)
-SEC_PACK(tungsten, /obj/item/reagent_containers/chem_disp_cartridge/tungsten, "Reagent refill - Tungsten", "tungsten reagent cartridge crate", 15, ACCESS_MEDICAL_CHEMISTRY)
-SEC_PACK(calcium, /obj/item/reagent_containers/chem_disp_cartridge/calcium, "Reagent refill - Calcium", "calcium reagent cartridge crate", 15, ACCESS_MEDICAL_CHEMISTRY)
-
-// Bar-restricted (alcoholic drinks)
-// Datum path Contents type Supply pack name Container name Cost Container access
-SEC_PACK(beer, /obj/item/reagent_containers/chem_disp_cartridge/beer, "Reagent refill - Beer", "beer reagent cartridge crate", 15, ACCESS_GENERAL_BAR)
-SEC_PACK(kahlua, /obj/item/reagent_containers/chem_disp_cartridge/kahlua, "Reagent refill - Kahlua", "kahlua reagent cartridge crate", 15, ACCESS_GENERAL_BAR)
-SEC_PACK(whiskey, /obj/item/reagent_containers/chem_disp_cartridge/whiskey, "Reagent refill - Whiskey", "whiskey reagent cartridge crate", 15, ACCESS_GENERAL_BAR)
-SEC_PACK(wine, /obj/item/reagent_containers/chem_disp_cartridge/wine, "Reagent refill - Wine", "wine reagent cartridge crate", 15, ACCESS_GENERAL_BAR)
-SEC_PACK(vodka, /obj/item/reagent_containers/chem_disp_cartridge/vodka, "Reagent refill - Vodka", "vodka reagent cartridge crate", 15, ACCESS_GENERAL_BAR)
-SEC_PACK(gin, /obj/item/reagent_containers/chem_disp_cartridge/gin, "Reagent refill - Gin", "gin reagent cartridge crate", 15, ACCESS_GENERAL_BAR)
-SEC_PACK(rum, /obj/item/reagent_containers/chem_disp_cartridge/rum, "Reagent refill - Rum", "rum reagent cartridge crate", 15, ACCESS_GENERAL_BAR)
-SEC_PACK(tequila, /obj/item/reagent_containers/chem_disp_cartridge/tequila, "Reagent refill - Tequila", "tequila reagent cartridge crate", 15, ACCESS_GENERAL_BAR)
-SEC_PACK(vermouth, /obj/item/reagent_containers/chem_disp_cartridge/vermouth, "Reagent refill - Vermouth", "vermouth reagent cartridge crate", 15, ACCESS_GENERAL_BAR)
-SEC_PACK(cognac, /obj/item/reagent_containers/chem_disp_cartridge/cognac, "Reagent refill - Cognac", "cognac reagent cartridge crate", 15, ACCESS_GENERAL_BAR)
-SEC_PACK(ale, /obj/item/reagent_containers/chem_disp_cartridge/ale, "Reagent refill - Ale", "ale reagent cartridge crate", 15, ACCESS_GENERAL_BAR)
-SEC_PACK(mead, /obj/item/reagent_containers/chem_disp_cartridge/mead, "Reagent refill - Mead", "mead reagent cartridge crate", 15, ACCESS_GENERAL_BAR)
-
-// Unrestricted (water, sugar, non-alcoholic drinks)
-// Datum path Contents type Supply pack name Container name Cost
-PACK(water, /obj/item/reagent_containers/chem_disp_cartridge/water, "Reagent refill - Water", "water reagent cartridge crate", 15)
-PACK(sugar, /obj/item/reagent_containers/chem_disp_cartridge/sugar, "Reagent refill - Sugar", "sugar reagent cartridge crate", 15)
-PACK(ice, /obj/item/reagent_containers/chem_disp_cartridge/ice, "Reagent refill - Ice", "ice reagent cartridge crate", 15)
-PACK(tea, /obj/item/reagent_containers/chem_disp_cartridge/tea, "Reagent refill - Tea", "tea reagent cartridge crate", 15)
-PACK(icetea, /obj/item/reagent_containers/chem_disp_cartridge/icetea, "Reagent refill - Iced Tea", "iced tea reagent cartridge crate", 15)
-PACK(cola, /obj/item/reagent_containers/chem_disp_cartridge/cola, "Reagent refill - Space Cola", "\improper Space Cola reagent cartridge crate", 15)
-PACK(smw, /obj/item/reagent_containers/chem_disp_cartridge/smw, "Reagent refill - Space Mountain Wind", "\improper Space Mountain Wind reagent cartridge crate", 15)
-PACK(dr_gibb, /obj/item/reagent_containers/chem_disp_cartridge/dr_gibb, "Reagent refill - Dr. Gibb", "\improper Dr. Gibb reagent cartridge crate", 15)
-PACK(spaceup, /obj/item/reagent_containers/chem_disp_cartridge/spaceup, "Reagent refill - Space-Up", "\improper Space-Up reagent cartridge crate", 15)
-PACK(tonic, /obj/item/reagent_containers/chem_disp_cartridge/tonic, "Reagent refill - Tonic Water", "tonic water reagent cartridge crate", 15)
-PACK(sodawater, /obj/item/reagent_containers/chem_disp_cartridge/sodawater, "Reagent refill - Soda Water", "soda water reagent cartridge crate", 15)
-PACK(lemon_lime, /obj/item/reagent_containers/chem_disp_cartridge/lemon_lime, "Reagent refill - Lemon-Lime Juice", "lemon-lime juice reagent cartridge crate", 15)
-PACK(orange, /obj/item/reagent_containers/chem_disp_cartridge/orange, "Reagent refill - Orange Juice", "orange juice reagent cartridge crate", 15)
-PACK(lime, /obj/item/reagent_containers/chem_disp_cartridge/lime, "Reagent refill - Lime Juice", "lime juice reagent cartridge crate", 15)
-PACK(lemon, /obj/item/reagent_containers/chem_disp_cartridge/lemon, "Reagent refill - Lemon Juice", "lemon juice reagent cartridge crate", 15)
-PACK(watermelon, /obj/item/reagent_containers/chem_disp_cartridge/watermelon, "Reagent refill - Watermelon Juice", "watermelon juice reagent cartridge crate", 15)
-PACK(coffee, /obj/item/reagent_containers/chem_disp_cartridge/coffee, "Reagent refill - Coffee", "coffee reagent cartridge crate", 15)
-PACK(cafe_latte, /obj/item/reagent_containers/chem_disp_cartridge/cafe_latte, "Reagent refill - Cafe Latte", "cafe latte reagent cartridge crate", 15)
-PACK(soy_latte, /obj/item/reagent_containers/chem_disp_cartridge/soy_latte, "Reagent refill - Soy Latte", "soy latte reagent cartridge crate", 15)
-PACK(hot_coco, /obj/item/reagent_containers/chem_disp_cartridge/hot_coco, "Reagent refill - Hot Coco", "hot coco reagent cartridge crate", 15)
-PACK(milk, /obj/item/reagent_containers/chem_disp_cartridge/milk, "Reagent refill - Milk", "milk reagent cartridge crate", 15)
-PACK(cream, /obj/item/reagent_containers/chem_disp_cartridge/cream, "Reagent refill - Cream", "cream reagent cartridge crate", 15)
-
-/datum/silly_datum_to_block_byond_bug_2072419
-
-#undef SEC_PACK
-#undef PACK
diff --git a/code/modules/reagents/machinery/dispenser/synthesizer.dm b/code/modules/reagents/machinery/dispenser/synthesizer.dm
new file mode 100644
index 00000000000..1538696bfdd
--- /dev/null
+++ b/code/modules/reagents/machinery/dispenser/synthesizer.dm
@@ -0,0 +1,186 @@
+/obj/item/reagent_synth
+ name = "reagent synthesis module"
+ desc = "Some kind of complex device used for synthesizing reagents."
+ worn_render_flags = WORN_RENDER_INHAND_NO_RENDER | WORN_RENDER_SLOT_NO_RENDER
+ icon = 'icons/items/parts/reagent_synth.dmi'
+ icon_state = "synth_prefab"
+
+ /// type enum
+ var/reagents_group
+ /// reagents by typepath or id that we allow syntehsis of
+ var/list/reagents_provided
+
+/obj/item/reagent_synth/Initialize(mapload)
+ if(has_typelist(NAMEOF(src, reagents_provided)))
+ reagents_provided = get_typelist(NAMEOF(src, reagents_provided))
+ else
+ reagents_provided = typelist(NAMEOF(src, reagents_provided), resolve_reagents_provided())
+ return ..()
+
+/obj/item/reagent_synth/proc/resolve_reagents_provided()
+
+ RETURN_TYPE(/list)
+ . = list()
+ for(var/thing in reagents_provided)
+ if(istext(thing))
+ . += thing
+ else if(ispath(thing))
+ var/datum/reagent/accessing = thing
+ . += initial(accessing.id)
+
+/obj/item/reagent_synth/chemistry
+ name = "reagent synthesis module (Chemistry)"
+ reagents_provided = list(
+ /datum/reagent/hydrogen,
+ /datum/reagent/lithium,
+ /datum/reagent/carbon,
+ /datum/reagent/nitrogen,
+ /datum/reagent/oxygen,
+ /datum/reagent/fluorine,
+ /datum/reagent/sodium,
+ /datum/reagent/aluminum,
+ /datum/reagent/silicon,
+ /datum/reagent/phosphorus,
+ /datum/reagent/iron,
+ /datum/reagent/copper,
+ /datum/reagent/mercury,
+ /datum/reagent/radium,
+ /datum/reagent/water,
+ /datum/reagent/ethanol,
+ /datum/reagent/sugar,
+ /datum/reagent/acid,
+ /datum/reagent/tungsten,
+ /datum/reagent/calcium,
+ )
+
+/obj/item/reagent_synth/bar
+ name = "reagent synthesis module (Bar)"
+ reagents_provided = list(
+ /datum/reagent/drink/soda/lemon_lime,
+ /datum/reagent/sugar,
+ /datum/reagent/drink/juice/orange,
+ /datum/reagent/drink/juice/lime,
+ /datum/reagent/drink/soda/sodawater,
+ /datum/reagent/drink/soda/tonic,
+ /datum/reagent/ethanol/beer,
+ /datum/reagent/ethanol/coffee/kahlua,
+ /datum/reagent/ethanol/whiskey,
+ /datum/reagent/ethanol/wine,
+ /datum/reagent/ethanol/whitewine,
+ /datum/reagent/ethanol/vodka,
+ /datum/reagent/ethanol/gin,
+ /datum/reagent/ethanol/rum,
+ /datum/reagent/ethanol/tequila,
+ /datum/reagent/ethanol/vermouth,
+ /datum/reagent/ethanol/cognac,
+ /datum/reagent/ethanol/cider,
+ /datum/reagent/ethanol/ale,
+ /datum/reagent/ethanol/mead,
+ /datum/reagent/ethanol/alcsassafras
+ )
+
+/obj/item/reagent_synth/cafe
+ name = "reagent synthesis module (Cafe)"
+ reagents_provided = list(
+ /datum/reagent/drink/coffee,
+ /datum/reagent/drink/coffee/cafe_latte,
+ /datum/reagent/drink/coffee/soy_latte,
+ /datum/reagent/drink/hot_coco,
+ /datum/reagent/drink/milk,
+ /datum/reagent/drink/milk/cream,
+ /datum/reagent/drink/tea,
+ /datum/reagent/drink/ice,
+ /datum/reagent/nutriment/mint,
+ /datum/reagent/drink/juice/orange,
+ /datum/reagent/drink/juice/lemon,
+ /datum/reagent/drink/juice/lime,
+ /datum/reagent/drink/juice/berry,
+ )
+
+/obj/item/reagent_synth/drink
+ name = "reagent synthesis module (Soda)"
+ reagents_provided = list(
+ /datum/reagent/water,
+ /datum/reagent/drink/ice,
+ /datum/reagent/drink/coffee,
+ /datum/reagent/drink/milk/cream,
+ /datum/reagent/drink/tea,
+ /datum/reagent/drink/tea/icetea,
+ /datum/reagent/drink/soda,
+ /datum/reagent/drink/soda/spacemountainwind,
+ /datum/reagent/drink/soda/sodawater,
+ /datum/reagent/drink/soda/dr_gibb,
+ /datum/reagent/drink/soda/space_up,
+ /datum/reagent/drink/soda/tonic,
+ /datum/reagent/sugar,
+ /datum/reagent/drink/juice/orange,
+ /datum/reagent/drink/juice/watermelon,
+ /datum/reagent/drink/juice/lemon,
+ /datum/reagent/drink/soda/sassafras,
+ /datum/reagent/drink/soda/sarsaparilla,
+ )
+
+/obj/item/reagent_synth/medicine
+ name = "reagent synthesis module (Medicine)"
+ reagents_provided = list(
+ /datum/reagent/inaprovaline,
+ /datum/reagent/ryetalyn,
+ /datum/reagent/paracetamol,
+ /datum/reagent/tramadol,
+ /datum/reagent/oxycodone,
+ /datum/reagent/sterilizine,
+ /datum/reagent/leporazine,
+ /datum/reagent/kelotane,
+ /datum/reagent/dermaline,
+ /datum/reagent/dexalin,
+ /datum/reagent/dexalinp,
+ /datum/reagent/tricordrazine,
+ /datum/reagent/dylovene,
+ /datum/reagent/synaptizine,
+ /datum/reagent/hyronalin,
+ /datum/reagent/arithrazine,
+ /datum/reagent/alkysine,
+ /datum/reagent/imidazoline,
+ /datum/reagent/peridaxon,
+ /datum/reagent/bicaridine,
+ /datum/reagent/hyperzine,
+ /datum/reagent/rezadone,
+ /datum/reagent/spaceacillin,
+ /datum/reagent/ethylredoxrazine,
+ /datum/reagent/soporific,
+ /datum/reagent/chloralhydrate,
+ /datum/reagent/cryoxadone,
+ /datum/reagent/clonexadone,
+ )
+
+/obj/item/reagent_synth/medicine_addon
+ reagents_provided = list(
+ /datum/reagent/carthatoline,
+ /datum/reagent/corophizine,
+ /datum/reagent/myelamine,
+ /datum/reagent/osteodaxon,
+ /datum/reagent/nutriment/biomass,
+ /datum/reagent/iron,
+ /datum/reagent/nutriment,
+ /datum/reagent/nutriment/protein
+ )
+
+/obj/item/reagent_synth/bioproduct
+ reagents_provided = list(
+ /datum/reagent/nutriment,
+ /datum/reagent/nutriment/protein,
+ /datum/reagent/drink/milk,
+ )
+
+/obj/item/reagent_synth/botanical
+ reagents_provided = list(
+ /datum/reagent/water,
+ /datum/reagent/sugar,
+ /datum/reagent/ethanol,
+ /datum/reagent/radium,
+ /datum/reagent/mutagen,
+ /datum/reagent/ammonia,
+ /datum/reagent/diethylamine,
+ /datum/reagent/toxin/plantbgone,
+ /datum/reagent/calcium,
+ )
diff --git a/code/modules/reagents/machinery/reagent_dispenser.dm b/code/modules/reagents/machinery/reagent_dispenser.dm
new file mode 100644
index 00000000000..18144d2a75d
--- /dev/null
+++ b/code/modules/reagents/machinery/reagent_dispenser.dm
@@ -0,0 +1,67 @@
+/obj/structure/reagent_dispensers
+ name = "Dispenser"
+ desc = "..."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "watertank"
+ layer = TABLE_LAYER
+ density = 1
+ anchored = 0
+ pressure_resistance = 2 * ONE_ATMOSPHERE
+
+ /// what this starts with - wiped on init
+ var/list/starting_reagents
+ /// max capacity
+ var/starting_capacity = 5000
+
+ var/amount_per_transfer_from_this = 10
+ var/possible_transfer_amounts = list(10,25,50,100)
+
+/obj/structure/reagent_dispensers/attackby(obj/item/W as obj, mob/user as mob)
+ return
+
+
+/obj/structure/reagent_dispensers/Initialize(mapload)
+ . = ..()
+ create_reagents(starting_capacity)
+ for(var/thing in starting_reagents)
+ reagents.add_reagent(thing, starting_reagents[thing])
+
+ if (!possible_transfer_amounts)
+ remove_obj_verb(src, /obj/structure/reagent_dispensers/verb/set_APTFT)
+
+/obj/structure/reagent_dispensers/examine(mob/user)
+ . = ..()
+ if(get_dist(user, src) <= 2)
+ . += "It contains:"
+ if(reagents && reagents.reagent_list.len)
+ for(var/datum/reagent/R in reagents.reagent_list)
+ . += "[R.volume] units of [R.name]"
+ else
+ . += "Nothing."
+
+/obj/structure/reagent_dispensers/verb/set_APTFT() //set amount_per_transfer_from_this
+ set name = "Set transfer amount"
+ set category = "Object"
+ set src in view(1)
+ var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts
+ if (N)
+ amount_per_transfer_from_this = N
+
+/obj/structure/reagent_dispensers/legacy_ex_act(severity)
+ switch(severity)
+ if(1.0)
+ qdel(src)
+ return
+ if(2.0)
+ if (prob(50))
+ new /obj/effect/water(src.loc)
+ qdel(src)
+ return
+ if(3.0)
+ if (prob(5))
+ new /obj/effect/water(src.loc)
+ qdel(src)
+ return
+
+/obj/structure/reagent_dispensers/blob_act()
+ qdel(src)
diff --git a/code/modules/reagents/machinery/reagent_dispenser/acid.dm b/code/modules/reagents/machinery/reagent_dispenser/acid.dm
new file mode 100644
index 00000000000..f4e3e4b5191
--- /dev/null
+++ b/code/modules/reagents/machinery/reagent_dispenser/acid.dm
@@ -0,0 +1,12 @@
+/obj/structure/reagent_dispensers/acid
+ name = "Sulphuric Acid Dispenser"
+ desc = "A dispenser of acid for industrial processes."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "acidtank"
+ amount_per_transfer_from_this = 10
+ anchored = TRUE
+ density = FALSE
+ starting_reagents = list(
+ /datum/reagent/acid = 1000,
+ )
+ starting_capacity = 1000
diff --git a/code/modules/reagents/machinery/reagent_dispenser/beer.dm b/code/modules/reagents/machinery/reagent_dispenser/beer.dm
new file mode 100644
index 00000000000..098edd8985b
--- /dev/null
+++ b/code/modules/reagents/machinery/reagent_dispenser/beer.dm
@@ -0,0 +1,16 @@
+/obj/structure/reagent_dispensers/beerkeg
+ name = "beer keg"
+ desc = "A beer keg."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "beertankTEMP"
+ amount_per_transfer_from_this = 10
+ starting_reagents = list(
+ /datum/reagent/ethanol/beer = 1000,
+ )
+ starting_capacity = 1000
+
+/obj/structure/reagent_dispensers/beerkeg/fakenuke
+ name = "nuclear beer keg"
+ desc = "A beer keg in the form of a nuclear bomb! An absolute blast at parties!"
+ icon = 'icons/obj/stationobjs.dmi'
+ icon_state = "nuclearbomb0"
diff --git a/code/modules/reagents/machinery/reagent_dispenser/foam.dm b/code/modules/reagents/machinery/reagent_dispenser/foam.dm
new file mode 100644
index 00000000000..0e6cb142442
--- /dev/null
+++ b/code/modules/reagents/machinery/reagent_dispenser/foam.dm
@@ -0,0 +1,10 @@
+/obj/structure/reagent_dispensers/foam
+ name = "foamtank"
+ desc = "A foam tank."
+ icon = 'icons/obj/objects_vr.dmi'
+ icon_state = "foamtank"
+ starting_reagents = list(
+ /datum/reagent/firefighting_foam = 1000,
+ )
+ starting_capacity = 1000
+ amount_per_transfer_from_this = 10
diff --git a/code/modules/reagents/machinery/reagent_dispenser/fuel.dm b/code/modules/reagents/machinery/reagent_dispenser/fuel.dm
new file mode 100644
index 00000000000..16a8dcc0c80
--- /dev/null
+++ b/code/modules/reagents/machinery/reagent_dispenser/fuel.dm
@@ -0,0 +1,129 @@
+/obj/structure/reagent_dispensers/fueltank
+ name = "fueltank"
+ desc = "A fueltank."
+ icon = 'icons/obj/objects_vr.dmi'
+ icon_state = "weldtank"
+ starting_reagents = list(
+ /datum/reagent/fuel = 1000,
+ )
+ starting_capacity = 1000
+ amount_per_transfer_from_this = 10
+ var/modded = 0
+ var/obj/item/assembly_holder/rig = null
+
+/obj/structure/reagent_dispensers/fueltank/high
+ name = "high-capacity fuel tank"
+ desc = "A highly-pressurized fuel tank made to hold vast amounts of fuel."
+ icon_state = "weldtank_high"
+ starting_reagents = list(
+ /datum/reagent/water = 4000,
+ )
+ starting_capacity = 4000
+
+/obj/structure/reagent_dispensers/fueltank/barrel
+ name = "hazardous barrel"
+ desc = "An open-topped barrel full of nasty-looking liquid."
+ icon_state = "barrel"
+ modded = TRUE
+
+/obj/structure/reagent_dispensers/fueltank/barrel/attackby(obj/item/W as obj, mob/user as mob)
+ if (W.is_wrench()) //can't wrench it shut, it's always open
+ return
+ return ..()
+
+/obj/structure/reagent_dispensers/fueltank/examine(mob/user)
+ . = ..()
+ if(get_dist(user, src) <= 2)
+ if(modded)
+ . += "Fuel faucet is wrenched open, leaking the fuel!"
+ if(rig)
+ . += "There is some kind of device rigged to the tank."
+
+/obj/structure/reagent_dispensers/fueltank/attack_hand()
+ if (rig)
+ usr.visible_message("[usr] begins to detach [rig] from \the [src].", "You begin to detach [rig] from \the [src]")
+ if(do_after(usr, 20))
+ usr.visible_message("[usr] detaches [rig] from \the [src].", "You detach [rig] from \the [src]")
+ rig.loc = get_turf(usr)
+ rig = null
+ cut_overlays()
+
+/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/W as obj, mob/user as mob)
+ src.add_fingerprint(user)
+ if (W.is_wrench())
+ user.visible_message("[user] wrenches [src]'s faucet [modded ? "closed" : "open"].", \
+ "You wrench [src]'s faucet [modded ? "closed" : "open"]")
+ modded = modded ? 0 : 1
+ playsound(src, W.tool_sound, 75, 1)
+ if (modded)
+ message_admins("[key_name_admin(user)] opened fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking fuel. (JMP)")
+ log_game("[key_name(user)] opened fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking fuel.")
+ leak_fuel(amount_per_transfer_from_this)
+ if (istype(W,/obj/item/assembly_holder))
+ if (rig)
+ to_chat(user, "There is another device in the way.")
+ return ..()
+ user.visible_message("[user] begins rigging [W] to \the [src].", "You begin rigging [W] to \the [src]")
+ if(do_after(user, 20))
+ user.visible_message("[user] rigs [W] to \the [src].", "You rig [W] to \the [src]")
+
+ var/obj/item/assembly_holder/H = W
+ if (istype(H.a_left,/obj/item/assembly/igniter) || istype(H.a_right,/obj/item/assembly/igniter))
+ message_admins("[key_name_admin(user)] rigged fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) for explosion. (JMP)")
+ log_game("[key_name(user)] rigged fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) for explosion.")
+
+ if(!user.attempt_insert_item_for_installation(W, src))
+ return
+
+ rig = W
+
+ var/icon/test = get_flat_icon(W)
+ test.Shift(NORTH,1)
+ test.Shift(EAST,6)
+ add_overlay(test)
+
+ return ..()
+
+/obj/structure/reagent_dispensers/fueltank/bullet_act(var/obj/item/projectile/Proj)
+ if(Proj.get_structure_damage())
+ if(istype(Proj.firer))
+ message_admins("[key_name_admin(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) (JMP).")
+ log_game("[key_name(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]).")
+
+ if(!istype(Proj ,/obj/item/projectile/beam/lasertag) && !istype(Proj ,/obj/item/projectile/beam/practice) )
+ explode()
+
+/obj/structure/reagent_dispensers/fueltank/legacy_ex_act()
+ explode()
+
+/obj/structure/reagent_dispensers/fueltank/blob_act()
+ explode()
+
+/obj/structure/reagent_dispensers/fueltank/proc/explode()
+ if (reagents.total_volume > 500)
+ explosion(src.loc,1,2,4)
+ else if (reagents.total_volume > 100)
+ explosion(src.loc,0,1,3)
+ else if (reagents.total_volume > 50)
+ explosion(src.loc,-1,1,2)
+ if(src)
+ qdel(src)
+
+/obj/structure/reagent_dispensers/fueltank/fire_act(datum/gas_mixture/air, temperature, volume)
+ if (modded)
+ explode()
+ else if (temperature > T0C+500)
+ explode()
+ return ..()
+
+/obj/structure/reagent_dispensers/fueltank/Move()
+ if (..() && modded)
+ leak_fuel(amount_per_transfer_from_this/10.0)
+
+/obj/structure/reagent_dispensers/fueltank/proc/leak_fuel(amount)
+ if (reagents.total_volume == 0)
+ return
+
+ amount = min(amount, reagents.total_volume)
+ reagents.remove_reagent("fuel",amount)
+ new /obj/effect/debris/cleanable/liquid_fuel(src.loc, amount,1)
diff --git a/code/modules/reagents/machinery/reagent_dispenser/helium.dm b/code/modules/reagents/machinery/reagent_dispenser/helium.dm
new file mode 100644
index 00000000000..ca1398b9538
--- /dev/null
+++ b/code/modules/reagents/machinery/reagent_dispenser/helium.dm
@@ -0,0 +1,10 @@
+/obj/structure/reagent_dispensers/he3
+ name = "helium tank"
+ desc = "A tank of helium-3. Wait, WHAT?"
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "weldtank"
+ amount_per_transfer_from_this = 10
+ starting_reagents = list(
+ /datum/reagent/helium3 = 1000,
+ )
+ starting_capacity = 1000
diff --git a/code/modules/reagents/machinery/reagent_dispenser/oil.dm b/code/modules/reagents/machinery/reagent_dispenser/oil.dm
new file mode 100644
index 00000000000..71f673e4c33
--- /dev/null
+++ b/code/modules/reagents/machinery/reagent_dispenser/oil.dm
@@ -0,0 +1,34 @@
+/obj/structure/reagent_dispensers/oil
+ name = "Oil Dispenser"
+ desc = "A dispenser of crude oil for industrial processes."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "oiltank"
+ amount_per_transfer_from_this = 10
+ anchored = TRUE
+ starting_reagents = list(
+ /datum/reagent/crude_oil = 1000,
+ )
+ starting_capacity = 1000
+
+/obj/structure/reagent_dispensers/tallow
+ name = "tallow tank"
+ desc = "A fifty-litre tank of commercial-grade tallow, intended for use in large scale deep fryers. Store in a cool, dark place"
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "oiltank"
+ amount_per_transfer_from_this = 120
+ starting_reagents = list(
+ /datum/reagent/nutriment/triglyceride/oil/tallow = 5000,
+ )
+ starting_capacity = 5000
+
+/obj/structure/reagent_dispensers/cookingoil/bullet_act(var/obj/item/projectile/Proj)
+ if(Proj.get_structure_damage())
+ explode()
+
+/obj/structure/reagent_dispensers/cookingoil/legacy_ex_act()
+ explode()
+
+/obj/structure/reagent_dispensers/cookingoil/proc/explode()
+ reagents.splash_area(get_turf(src), 3)
+ visible_message(SPAN_DANGER("The [src] bursts open, spreading oil all over the area."))
+ qdel(src)
diff --git a/code/modules/reagents/machinery/reagent_dispenser/pepper.dm b/code/modules/reagents/machinery/reagent_dispenser/pepper.dm
new file mode 100644
index 00000000000..865d54a315f
--- /dev/null
+++ b/code/modules/reagents/machinery/reagent_dispenser/pepper.dm
@@ -0,0 +1,12 @@
+/obj/structure/reagent_dispensers/peppertank
+ name = "Pepper Spray Refiller"
+ desc = "Refills pepper spray canisters."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "peppertank"
+ anchored = TRUE
+ density = FALSE
+ amount_per_transfer_from_this = 45
+ starting_reagents = list(
+ /datum/reagent/condensedcapsaicin = 1000,
+ )
+ starting_capacity = 1000
diff --git a/code/modules/reagents/machinery/reagent_dispenser/virusfood.dm b/code/modules/reagents/machinery/reagent_dispenser/virusfood.dm
new file mode 100644
index 00000000000..f38ce570634
--- /dev/null
+++ b/code/modules/reagents/machinery/reagent_dispenser/virusfood.dm
@@ -0,0 +1,12 @@
+/obj/structure/reagent_dispensers/virusfood
+ name = "Virus Food Dispenser"
+ desc = "A dispenser of virus food. Yum."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "virusfoodtank"
+ amount_per_transfer_from_this = 10
+ anchored = TRUE
+ density = FALSE
+ starting_reagents = list(
+ /datum/reagent/nutriment/virus_food = 1000,
+ )
+ starting_capacity = 1000
diff --git a/code/modules/reagents/machinery/reagent_dispenser/water.dm b/code/modules/reagents/machinery/reagent_dispenser/water.dm
new file mode 100644
index 00000000000..b0c3b913b91
--- /dev/null
+++ b/code/modules/reagents/machinery/reagent_dispenser/water.dm
@@ -0,0 +1,19 @@
+/obj/structure/reagent_dispensers/watertank
+ name = "watertank"
+ desc = "A watertank."
+ icon = 'icons/obj/objects_vr.dmi'
+ icon_state = "watertank"
+ starting_reagents = list(
+ /datum/reagent/water = 1000,
+ )
+ starting_capacity = 1000
+ amount_per_transfer_from_this = 10
+
+/obj/structure/reagent_dispensers/watertank/high
+ name = "high-capacity water tank"
+ desc = "A highly-pressurized water tank made to hold vast amounts of water.."
+ icon_state = "watertank_high"
+ starting_reagents = list(
+ /datum/reagent/water = 5000,
+ )
+ starting_capacity = 5000
diff --git a/code/modules/reagents/machinery/reagent_dispenser/watercooler.dm b/code/modules/reagents/machinery/reagent_dispenser/watercooler.dm
new file mode 100644
index 00000000000..75dde8c7208
--- /dev/null
+++ b/code/modules/reagents/machinery/reagent_dispenser/watercooler.dm
@@ -0,0 +1,138 @@
+/obj/structure/reagent_dispensers/water_cooler
+ name = "Water-Cooler"
+ desc = "A machine that dispenses water to drink."
+ amount_per_transfer_from_this = 5
+ icon = 'icons/obj/vending.dmi'
+ icon_state = "water_cooler"
+ possible_transfer_amounts = null
+ anchored = TRUE
+ var/bottle = 0
+ var/cups = 0
+ var/cupholder = 0
+
+/obj/structure/reagent_dispensers/water_cooler/full
+ bottle = 1
+ cupholder = 1
+ cups = 10
+
+/obj/structure/reagent_dispensers/water_cooler/Initialize(mapload)
+ . = ..()
+ if(bottle)
+ reagents.add_reagent(/datum/reagent/water, 120)
+ update_icon()
+
+/obj/structure/reagent_dispensers/water_cooler/examine(mob/user)
+ . = ..()
+ if(cupholder)
+ . += "There are [cups] cups in the cup dispenser."
+
+/obj/structure/reagent_dispensers/water_cooler/verb/rotate_clockwise()
+ set name = "Rotate Cooler Clockwise"
+ set category = "Object"
+ set src in oview(1)
+
+ if (src.anchored || usr:stat)
+ to_chat(usr, "It is fastened to the floor!")
+ return 0
+ setDir(turn(dir, 270))
+ return 1
+
+/obj/structure/reagent_dispensers/water_cooler/attackby(obj/item/I as obj, mob/user as mob)
+ if(I.is_wrench())
+ src.add_fingerprint(user)
+ if(bottle)
+ playsound(src, I.tool_sound, 50, 1)
+ if(do_after(user, 20) && bottle)
+ to_chat(user, "You unfasten the jug.")
+ var/obj/item/reagent_containers/glass/cooler_bottle/G = new /obj/item/reagent_containers/glass/cooler_bottle( src.loc )
+ for(var/datum/reagent/R in reagents.reagent_list)
+ var/total_reagent = reagents.get_reagent_amount(R.id)
+ G.reagents.add_reagent(R.id, total_reagent)
+ reagents.clear_reagents()
+ bottle = 0
+ update_icon()
+ else
+ if(anchored)
+ user.visible_message("\The [user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.")
+ else
+ user.visible_message("\The [user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.")
+ if(do_after(user, 20 * I.tool_speed, src))
+ if(!src) return
+ to_chat(user, "You [anchored? "un" : ""]secured \the [src]!")
+ anchored = !anchored
+ playsound(src, I.tool_sound, 50, 1)
+ return
+
+ if(I.is_screwdriver())
+ if(cupholder)
+ playsound(src, I.tool_sound, 50, 1)
+ to_chat(user, "You take the cup dispenser off.")
+ new /obj/item/stack/material/plastic( src.loc )
+ if(cups)
+ for(var/i = 0 to cups)
+ new /obj/item/reagent_containers/food/drinks/sillycup(src.loc)
+ cups = 0
+ cupholder = 0
+ update_icon()
+ return
+ if(!bottle && !cupholder)
+ playsound(src, I.tool_sound, 50, 1)
+ to_chat(user, "You start taking the water-cooler apart.")
+ if(do_after(user, 20 * I.tool_speed) && !bottle && !cupholder)
+ to_chat(user, "You take the water-cooler apart.")
+ new /obj/item/stack/material/plastic( src.loc, 4 )
+ qdel(src)
+ return
+
+ if(istype(I, /obj/item/reagent_containers/glass/cooler_bottle))
+ src.add_fingerprint(user)
+ if(!bottle)
+ if(anchored)
+ var/obj/item/reagent_containers/glass/cooler_bottle/G = I
+ to_chat(user, "You start to screw the bottle onto the water-cooler.")
+ if(do_after(user, 20) && !bottle && anchored)
+ bottle = 1
+ update_icon()
+ to_chat(user, "You screw the bottle onto the water-cooler!")
+ for(var/datum/reagent/R in G.reagents.reagent_list)
+ var/total_reagent = G.reagents.get_reagent_amount(R.id)
+ reagents.add_reagent(R.id, total_reagent)
+ qdel(G)
+ else
+ to_chat(user, "You need to wrench down the cooler first.")
+ else
+ to_chat(user, "There is already a bottle there!")
+ return 1
+
+ if(istype(I, /obj/item/stack/material/plastic))
+ if(!cupholder)
+ if(anchored)
+ var/obj/item/stack/material/plastic/P = I
+ src.add_fingerprint(user)
+ to_chat(user, "You start to attach a cup dispenser onto the water-cooler.")
+ playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
+ if(do_after(user, 20) && !cupholder && anchored)
+ if (P.use(1))
+ to_chat(user, "You attach a cup dispenser onto the water-cooler.")
+ cupholder = 1
+ update_icon()
+ else
+ to_chat(user, "You need to wrench down the cooler first.")
+ else
+ to_chat(user, "There is already a cup dispenser there!")
+ return
+
+/obj/structure/reagent_dispensers/water_cooler/attack_hand(mob/user)
+ if(cups)
+ new /obj/item/reagent_containers/food/drinks/sillycup(src.loc)
+ cups--
+ flick("[icon_state]-vend", src)
+ return
+
+/obj/structure/reagent_dispensers/water_cooler/update_icon()
+ icon_state = "water_cooler"
+ cut_overlays()
+ var/image/I
+ if(bottle)
+ I = image(icon, "water_cooler_bottle")
+ add_overlay(I)
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index ff4325ad39d..7901aa80a2d 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -28,9 +28,6 @@
return
return
-/obj/item/reagent_containers/afterattack(obj/target, mob/user, flag)
- return
-
/obj/item/reagent_containers/proc/reagentlist() // For attack logs
if(reagents)
return reagents.get_reagents()
@@ -44,7 +41,7 @@
to_chat(user, "[target] is empty.")
return 1
- if(reagents && !reagents.get_free_space())
+ if(reagents && !reagents.available_volume())
to_chat(user, "[src] is full.")
return 1
@@ -60,7 +57,7 @@
to_chat(user, "[src] is empty.")
return 1
- if(target.reagents && !target.reagents.get_free_space())
+ if(target.reagents && !target.reagents.available_volume())
to_chat(user, "[target] is full.")
return 1
@@ -139,7 +136,7 @@
to_chat(user, "[src] is empty.")
return 1
- if(!target.reagents.get_free_space())
+ if(!target.reagents.available_volume())
to_chat(user, "[target] is full.")
return 1
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index ce1e448a6f0..5dc3f1ba057 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -39,7 +39,7 @@
for(var/T in reagent_ids)
reagent_volumes[T] = volume
- var/datum/reagent/R = SSchemistry.chemical_reagents[T]
+ var/datum/reagent/R = SSchemistry.reagent_lookup[T]
reagent_names += R.name
START_PROCESSING(SSobj, src)
@@ -117,11 +117,11 @@
if(t)
playsound(src, 'sound/effects/pop.ogg', 50, 0)
mode = t
- var/datum/reagent/R = SSchemistry.chemical_reagents[reagent_ids[mode]]
+ var/datum/reagent/R = SSchemistry.reagent_lookup[reagent_ids[mode]]
to_chat(usr, "Synthesizer is now producing '[R.name]'.")
/obj/item/reagent_containers/borghypo/examine(mob/user)
- var/datum/reagent/R = SSchemistry.chemical_reagents[reagent_ids[mode]]
+ var/datum/reagent/R = SSchemistry.reagent_lookup[reagent_ids[mode]]
. = ..()
. += "It is currently producing [R.name] and has [reagent_volumes[reagent_ids[mode]]] out of [volume] units left."
@@ -192,7 +192,7 @@
to_chat(user, "[src] is out of this reagent, give it some time to refill.")
return
- if(!target.reagents.get_free_space())
+ if(!target.reagents.available_volume())
to_chat(user, "[target] is full.")
return
diff --git a/code/modules/reagents/reagent_containers/cartridge.dm b/code/modules/reagents/reagent_containers/cartridge.dm
new file mode 100644
index 00000000000..2beb2aaef65
--- /dev/null
+++ b/code/modules/reagents/reagent_containers/cartridge.dm
@@ -0,0 +1,30 @@
+/obj/item/reagent_containers/cartridge
+ /// prespawn with a reagent?
+ var/spawn_reagent
+ /// prespawn amount instead of max?
+ var/spawn_amount
+
+/obj/item/reagent_containers/cartridge/Initialize(mapload)
+ . = ..()
+ if(spawn_reagent)
+ reagents.add_reagent(spawn_reagent, spawn_amount || volume)
+
+/obj/item/reagent_containers/cartridge/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
+ if (!is_open_container() || !proximity_flag)
+ return
+
+ if(target.is_open_container() && target.reagents) //Something like a glass. Player probably wants to transfer TO it.
+
+ if(!reagents.total_volume)
+ to_chat(user, "\The [src] is empty.")
+ return
+
+ if(target.reagents.total_volume >= target.reagents.maximum_volume)
+ to_chat(user, "\The [target] is full.")
+ return
+
+ var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
+ to_chat(user, "You transfer [trans] units of the solution to \the [target].")
+ return
+ else
+ return ..()
diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm
index ffddea7d547..491bf949c33 100644
--- a/code/modules/reagents/reagent_containers/dropper.dm
+++ b/code/modules/reagents/reagent_containers/dropper.dm
@@ -27,7 +27,7 @@
if(reagents.total_volume)
- if(!target.reagents.get_free_space())
+ if(!target.reagents.available_volume())
to_chat(user, "[target] is full.")
return
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index 31c58a4737b..3a8d6d96748 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -74,7 +74,7 @@
var/injtime = time // Calculated 'true' injection time (as added to by hardsuits and whatnot), 66% of this goes to warmup, then every 33% after injects 5u
switch(mode)
if(SYRINGE_DRAW)
- if(!reagents.get_free_space())
+ if(!reagents.available_volume())
to_chat(user, "The syringe is full.")
mode = SYRINGE_INJECT
return
@@ -85,7 +85,7 @@
return
if(istype(target, /mob/living/carbon))
- var/amount = reagents.get_free_space()
+ var/amount = reagents.available_volume()
var/mob/living/carbon/T = target
if(!T.dna)
to_chat(user, "You are unable to locate any blood. (To be specific, your target seems to be missing their DNA datum).")
@@ -146,7 +146,7 @@
update_icon()
- if(!reagents.get_free_space())
+ if(!reagents.available_volume())
mode = SYRINGE_INJECT
update_icon()
@@ -161,7 +161,7 @@
if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/reagent_containers/food) && !istype(target, /obj/item/slime_extract) && !istype(target, /obj/item/clothing/mask/smokable/cigarette) && !istype(target, /obj/item/storage/fancy/cigarettes))
to_chat(user, "You cannot directly fill this object.")
return
- if(!target.reagents.get_free_space())
+ if(!target.reagents.available_volume())
to_chat(user, "[target] is full.")
return
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index 8825559ac60..04bac8ab1c0 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -51,10 +51,6 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid).
idle_power_usage = 30
active_power_usage = 2500
-/obj/machinery/r_n_d/circuit_imprinter/Initialize(mapload)
- . = ..()
- default_apply_parts()
-
/obj/machinery/r_n_d/circuit_imprinter/process(delta_time)
..()
if(machine_stat)
diff --git a/code/modules/research/designs/circuits/machines/chemistry.dm b/code/modules/research/designs/circuits/machines/chemistry.dm
new file mode 100644
index 00000000000..9545857bcf8
--- /dev/null
+++ b/code/modules/research/designs/circuits/machines/chemistry.dm
@@ -0,0 +1,23 @@
+/datum/design/circuit/machine/chemical_dispenser
+ name = "Chemical Dispenser"
+ build_path = /obj/item/circuitboard/machine/chemical_dispenser
+ id = "MachineChemicalDispenser"
+ req_tech = list(TECH_DATA = 3, TECH_BIO = 3, TECH_MATERIAL = 4)
+
+/datum/design/circuit/machine/soda_dispenser
+ name = "Drink Dispenser (Soda)"
+ build_path = /obj/item/circuitboard/machine/chemical_dispenser/soda
+ id = "MachineDrinkDispenserSoda"
+ req_tech = list(TECH_DATA = 3, TECH_BIO = 3, TECH_MATERIAL = 4)
+
+/datum/design/circuit/machine/booze_dispenser
+ name = "Drink Dispenser (Bar)"
+ build_path = /obj/item/circuitboard/machine/chemical_dispenser/booze
+ id = "MachineDrinkDispenserBooze"
+ req_tech = list(TECH_DATA = 3, TECH_BIO = 3, TECH_MATERIAL = 4)
+
+/datum/design/circuit/machine/cafe_dispenser
+ name = "Drink Dispenser (Cafe)"
+ build_path = /obj/item/circuitboard/machine/chemical_dispenser/cafe
+ id = "MachineDrinkDispenserCafe"
+ req_tech = list(TECH_DATA = 3, TECH_BIO = 3, TECH_MATERIAL = 4)
diff --git a/code/modules/research/designs/misc.dm b/code/modules/research/designs/misc.dm
index a559af8ae49..05fbcbce290 100644
--- a/code/modules/research/designs/misc.dm
+++ b/code/modules/research/designs/misc.dm
@@ -147,3 +147,11 @@
req_tech = list(TECH_BLUESPACE = 5, TECH_MATERIAL = 6)
materials = list(MAT_PLASTIC = 5000, MAT_GOLD = 1500, MAT_URANIUM = 250, MAT_PHORON = 1500)
build_path = /obj/item/storage/bag/trash/bluespace
+
+/datum/design/item/reagent_synth_chemistry
+ name = "Chemistry Synthesis Module"
+ desc = "A reagent synthesis module required for dispenser functionality"
+ id = "ReagentSynth"
+ req_tech = list(TECH_BLUESPACE = 5, TECH_MATERIAL = 6, TECH_BIO = 5)
+ materials = list(MAT_STEEL = 4000, MAT_GLASS = 2000, MAT_URANIUM = 500, MAT_GOLD = 500, MAT_SILVER = 500)
+ build_path = /obj/item/reagent_synth/chemistry
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index a2e3da6017f..6fdcfc9b68c 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -21,10 +21,6 @@
hidden_materials = list(MAT_PLASTEEL, MAT_DURASTEEL, MAT_VERDANTIUM, MAT_MORPHIUM, MAT_METALHYDROGEN, MAT_SUPERMATTER)
-/obj/machinery/r_n_d/protolathe/Initialize(mapload)
- . = ..()
- default_apply_parts()
-
/obj/machinery/r_n_d/protolathe/process(delta_time)
..()
if(machine_stat)
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 94120753abf..1be1333f86f 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -70,7 +70,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
return return_name
/obj/machinery/computer/rdconsole/proc/CallReagentName(var/ID)
- var/datum/reagent/R = SSchemistry.chemical_reagents["[ID]"]
+ var/datum/reagent/R = SSchemistry.reagent_lookup["[ID]"]
if(!R)
return ID
return R.name
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index e7455ff7ee1..284723f7ce7 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -18,10 +18,6 @@
req_access = list(ACCESS_SCIENCE_RD) //Only the R&D can change server settings.
circuit = /obj/item/circuitboard/rdserver
-/obj/machinery/r_n_d/server/Initialize(mapload)
- . = ..()
- default_apply_parts()
-
/obj/machinery/r_n_d/server/Destroy()
griefProtection()
..()
diff --git a/code/modules/resleeving/machines.dm b/code/modules/resleeving/machines.dm
index 4625967ce41..c8c26768da0 100644
--- a/code/modules/resleeving/machines.dm
+++ b/code/modules/resleeving/machines.dm
@@ -198,7 +198,6 @@
/obj/machinery/transhuman/synthprinter/Initialize(mapload)
. = ..()
- default_apply_parts()
update_icon()
/obj/machinery/transhuman/synthprinter/RefreshParts()
@@ -418,7 +417,6 @@
/obj/machinery/transhuman/resleever/Initialize(mapload)
. = ..()
- default_apply_parts()
update_icon()
/obj/machinery/transhuman/resleever/RefreshParts()
diff --git a/code/modules/shieldgen/shield_diffuser.dm b/code/modules/shieldgen/shield_diffuser.dm
index 1cd44cceb38..a52ca181682 100644
--- a/code/modules/shieldgen/shield_diffuser.dm
+++ b/code/modules/shieldgen/shield_diffuser.dm
@@ -16,10 +16,6 @@
/obj/machinery/shield_diffuser/Initialize(mapload)
. = ..()
- // TODO - Remove this bit once machines are converted to Initialize
- if(ispath(circuit))
- circuit = new circuit(src)
- default_apply_parts()
var/turf/T = get_turf(src)
hide(!T.is_plating())
diff --git a/code/modules/shieldgen/shield_generator.dm b/code/modules/shieldgen/shield_generator.dm
index a15aa5ccd3c..1c991f98941 100644
--- a/code/modules/shieldgen/shield_generator.dm
+++ b/code/modules/shieldgen/shield_generator.dm
@@ -54,10 +54,6 @@
. = ..()
if(!wires)
wires = new(src)
- // TODO - Remove this bit once machines are converted to Initialize
- if(ispath(circuit))
- circuit = new circuit(src)
- default_apply_parts()
connect_to_network()
mode_list = list()
diff --git a/code/modules/telesci/quantum_pad.dm b/code/modules/telesci/quantum_pad.dm
index 24c18d548c2..3aabd75950b 100644
--- a/code/modules/telesci/quantum_pad.dm
+++ b/code/modules/telesci/quantum_pad.dm
@@ -22,7 +22,6 @@
/obj/machinery/power/quantumpad/Initialize(mapload)
. = ..()
- default_apply_parts()
connect_to_network()
if(map_pad_id)
mapped_quantum_pads[map_pad_id] = src
diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm
index f92dab1f7f9..ea246132d89 100644
--- a/code/modules/telesci/telepad.dm
+++ b/code/modules/telesci/telepad.dm
@@ -13,7 +13,6 @@
/obj/machinery/telepad/Initialize(mapload)
. = ..()
- default_apply_parts()
update_icon()
/obj/machinery/telepad/RefreshParts()
diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm
index 3010fd22399..aeed2bf5b1e 100644
--- a/code/modules/virus2/effect.dm
+++ b/code/modules/virus2/effect.dm
@@ -294,7 +294,7 @@
data = c_data
else
data = pick("bicaridine", "kelotane", "anti_toxin", "tricordrazine")
- var/datum/reagent/R = SSchemistry.chemical_reagents[data]
+ var/datum/reagent/R = SSchemistry.reagent_lookup[data]
name = "[initial(name)] ([initial(R.name)])"
/datum/disease2/effect/improved_chem_synthesis/activate(var/mob/living/carbon/mob,var/multiplier)
@@ -426,7 +426,7 @@
data = pick("bicaridine", "kelotane", "anti_toxin", "inaprovaline", "space_drugs", "sugar",
"tramadol", "dexalin", "cryptobiolin", "impedrezene", "hyperzine", "ethylredoxrazine",
"mindbreaker", "glucose")
- var/datum/reagent/R = SSchemistry.chemical_reagents[data]
+ var/datum/reagent/R = SSchemistry.reagent_lookup[data]
name = "[initial(name)] ([initial(R.name)])"
/datum/disease2/effect/chem_synthesis/activate(var/mob/living/carbon/mob,var/multiplier)
diff --git a/config/entries/lobby.txt b/config/entries/lobby.txt
index 5b03ed47010..ff7c9f013ef 100644
--- a/config/entries/lobby.txt
+++ b/config/entries/lobby.txt
@@ -5,6 +5,7 @@ LOBBY_COUNTDOWN 120
ROUND_END_COUNTDOWN 180
## How many seconds to wait before roundstart until starting the gamemode vote
+## -1 to disable gamemode voting.
LOBBY_GAMEMODE_VOTE_DELAY 60
## Should we appear on the hub?
diff --git a/icons/items/misc/glue.dmi b/icons/items/misc/glue.dmi
new file mode 100644
index 00000000000..d2b0770bf2c
Binary files /dev/null and b/icons/items/misc/glue.dmi differ
diff --git a/icons/items/parts/reagent_synth.dmi b/icons/items/parts/reagent_synth.dmi
new file mode 100644
index 00000000000..565cbc96dcc
Binary files /dev/null and b/icons/items/parts/reagent_synth.dmi differ
diff --git a/tgui/packages/common/collections.ts b/tgui/packages/common/collections.ts
index 5ab378070f0..ab1629ab3f2 100644
--- a/tgui/packages/common/collections.ts
+++ b/tgui/packages/common/collections.ts
@@ -310,3 +310,52 @@ export const binaryInsertWith = (getKey: (value: T) => U):
return copy;
};
};
+
+/**
+ * splits an array into x arrays of max size divisor
+ * does not balance between the buckets
+ */
+export const arrayBucketFill = (arrIn: Array, amt: number):
+ Array> => {
+ let output = new Array>();
+ if (amt <= 0) {
+ return output;
+ }
+ let left = arrIn.length;
+ let curr = 0;
+ while (left >= amt) {
+ output.push(arrIn.slice(curr, curr + amt));
+ curr += amt;
+ left -= amt;
+ }
+ if (left > 0) {
+ output.push(arrIn.slice(curr));
+ }
+ return output;
+};
+
+/**
+ * splits an array between x buckets evenly
+ */
+export const arrayBucketSplit = (arrIn: Array, amt: number):
+Array> => {
+ let output = new Array>();
+ if (amt <= 0) {
+ return output;
+ }
+ let want = Math.ceil(arrIn.length / amt);
+ if (want <= 0) {
+ return output;
+ }
+ let left = arrIn.length;
+ let curr = 0;
+ while (left >= want) {
+ output.push(arrIn.slice(curr, curr + want));
+ curr += want;
+ left -= want;
+ }
+ if (left > 0) {
+ output.push(arrIn.slice(curr));
+ }
+ return output;
+};
diff --git a/tgui/packages/tgui/components/ProgressBar.js b/tgui/packages/tgui/components/ProgressBar.tsx
similarity index 84%
rename from tgui/packages/tgui/components/ProgressBar.js
rename to tgui/packages/tgui/components/ProgressBar.tsx
index cba65fd71f2..3a247021e10 100644
--- a/tgui/packages/tgui/components/ProgressBar.js
+++ b/tgui/packages/tgui/components/ProgressBar.tsx
@@ -6,10 +6,19 @@
import { clamp01, scale, keyOfMatchingRange, toFixed } from 'common/math';
import { classes, pureComponentHooks } from 'common/react';
-import { computeBoxClassName, computeBoxProps } from './Box';
+import { BoxProps, computeBoxClassName, computeBoxProps } from './Box';
import { CSS_COLORS } from '../constants';
-export const ProgressBar = props => {
+interface ProgressBarProps extends BoxProps {
+ className?: string;
+ value: number;
+ minValue?: number;
+ maxValue?: number;
+ ranges?: Record;
+ color?: any;
+}
+
+export const ProgressBar = (props: ProgressBarProps) => {
const {
className,
value,
diff --git a/tgui/packages/tgui/components/Slider.js b/tgui/packages/tgui/components/Slider.tsx
similarity index 85%
rename from tgui/packages/tgui/components/Slider.js
rename to tgui/packages/tgui/components/Slider.tsx
index 005e6c1f8f7..bd5315bd5f2 100644
--- a/tgui/packages/tgui/components/Slider.js
+++ b/tgui/packages/tgui/components/Slider.tsx
@@ -5,12 +5,29 @@
*/
import { clamp01, keyOfMatchingRange, scale } from 'common/math';
-import { classes } from 'common/react';
-import { computeBoxClassName, computeBoxProps } from './Box';
+import { BooleanLike, classes } from 'common/react';
+import { BoxProps, computeBoxClassName, computeBoxProps } from './Box';
import { DraggableControl } from './DraggableControl';
import { NumberInput } from './NumberInput';
-export const Slider = props => {
+interface SliderProps extends BoxProps {
+ animated?: BooleanLike;
+ color?: string;
+ value: number;
+ unit?: string;
+ minValue: number;
+ maxValue: number;
+ fillValue?: number;
+ ranges?: Record;
+ step?: number;
+ stepPixelSize?: number;
+ format?: (n: number) => number;
+ suppressFlicker?: number;
+ onChange?: Function;
+ onDrag?: Function;
+}
+
+export const Slider = (props: SliderProps) => {
// IE8: I don't want to support a yet another component on IE8.
if (Byond.IS_LTE_IE8) {
return (
diff --git a/tgui/packages/tgui/interfaces/AtmosAlertConsole.js b/tgui/packages/tgui/interfaces/AtmosAlertConsole.tsx
similarity index 54%
rename from tgui/packages/tgui/interfaces/AtmosAlertConsole.js
rename to tgui/packages/tgui/interfaces/AtmosAlertConsole.tsx
index f86bb9826ba..484a078c044 100644
--- a/tgui/packages/tgui/interfaces/AtmosAlertConsole.js
+++ b/tgui/packages/tgui/interfaces/AtmosAlertConsole.tsx
@@ -2,10 +2,18 @@ import { useBackend } from '../backend';
import { Button, Section } from '../components';
import { Window } from '../layouts';
+interface AtmosAlertConsoleData {
+ priority_alarms: Array;
+ minor_alarms: Array;
+}
+
+interface AtmosAlert {
+ name: string;
+ ref: string;
+}
+
export const AtmosAlertConsole = (props, context) => {
- const { act, data } = useBackend(context);
- const priorityAlerts = data.priority_alarms || [];
- const minorAlerts = data.minor_alarms || [];
+ const { act, data } = useBackend(context);
return (
{
- {priorityAlerts.length === 0 && (
+ {data.priority_alarms.length === 0 && (
-
No Priority Alerts
)}
- {priorityAlerts.map(alert => (
- -
+ {data.priority_alarms.map(alert => (
+
-
))}
- {minorAlerts.length === 0 && (
+ {data.minor_alarms.length === 0 && (
-
No Minor Alerts
)}
- {minorAlerts.map(alert => (
- -
+ {data.minor_alarms.map(alert => (
+
-
))}
diff --git a/tgui/packages/tgui/interfaces/ChemDispenser.js b/tgui/packages/tgui/interfaces/ChemDispenser.js
deleted file mode 100644
index 886bae80964..00000000000
--- a/tgui/packages/tgui/interfaces/ChemDispenser.js
+++ /dev/null
@@ -1,170 +0,0 @@
-import { Fragment } from 'inferno';
-import { useBackend } from "../backend";
-import { Box, Button, Flex, LabeledList, Slider, Section } from "../components";
-import { BeakerContents } from "../interfaces/common/BeakerContents";
-import { Window } from "../layouts";
-
-const dispenseAmounts = [5, 10, 20, 30, 40, 60];
-const removeAmounts = [1, 5, 10];
-
-export const ChemDispenser = (props, context) => {
- return (
-
-
-
-
-
-
-
- );
-};
-
-const ChemDispenserSettings = (properties, context) => {
- const { act, data } = useBackend(context);
- const {
- amount,
- } = data;
- return (
-
-
-
-
- {dispenseAmounts.map((a, i) => (
-
-
- ))}
-
-
-
- act('amount', {
- amount: value,
- })} />
-
-
-
- );
-};
-
-const ChemDispenserChemicals = (properties, context) => {
- const { act, data } = useBackend(context);
- const {
- chemicals = [],
- } = data;
- const flexFillers = [];
- for (let i = 0; i < (chemicals.length + 1) % 3; i++) {
- flexFillers.push(true);
- }
- return (
-
-
- {chemicals.map((c, i) => (
-
-
- ))}
- {flexFillers.map((_, i) => (
-
- ))}
-
-
- );
-};
-
-const ChemDispenserBeaker = (properties, context) => {
- const { act, data } = useBackend(context);
- const {
- isBeakerLoaded,
- beakerCurrentVolume,
- beakerMaxVolume,
- beakerContents = [],
- } = data;
- return (
-
- {!!isBeakerLoaded && (
-
- {beakerCurrentVolume} / {beakerMaxVolume} units
-
- )}
-
- );
-};
diff --git a/tgui/packages/tgui/interfaces/ChemDispenser.tsx b/tgui/packages/tgui/interfaces/ChemDispenser.tsx
new file mode 100644
index 00000000000..5d1dba3ebe9
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ChemDispenser.tsx
@@ -0,0 +1,244 @@
+import { arrayBucketFill } from "common/collections";
+import { BooleanLike } from "common/react";
+import { useBackend, useSharedState } from "../backend";
+import { Button, LabeledList, NoticeBox, ProgressBar, Section, Slider, Stack } from "../components";
+import { Window } from "../layouts";
+import { ReagentContents, ReagentContentsData } from "./common/Reagents";
+
+interface ReagentData {
+ name: string;
+ id: string;
+}
+
+interface CartridgeData {
+ label: string;
+ amount: number;
+}
+
+interface BeakerData {
+ volume: number;
+ capacity: BeakerData;
+ data: ReagentContentsData;
+}
+
+interface ChemDispenserData {
+ cell_charge: number;
+ cell_capacity: number;
+ has_cell: BooleanLike;
+ cartridges: Array;
+ reagents: Array;
+ has_beaker: BooleanLike;
+ beaker: BeakerData;
+ panel_open: BooleanLike;
+ macros: Array;
+ amount: number;
+ amount_max: number;
+ recharging: BooleanLike;
+ recharge_rate: number;
+}
+
+interface DispenserMacro {
+ name: string;
+ data: Array>;
+ index: number;
+}
+
+export const ChemDispenser = (props, context) => {
+ const { act, data } = useBackend(context);
+ const [macro, setMacro] = useSharedState | undefined>(context, 'recording', undefined);
+ const isRecording = () => (macro !== undefined);
+ const recordReagent = (id: string, amount: number) => {
+ if (macro === undefined) {
+ return;
+ }
+ let appended = macro?.slice();
+ if (appended.length && appended[appended.length - 1][0] === id) {
+ appended[appended.length - 1][1] += amount;
+ }
+ else {
+ appended?.push([id, amount]);
+ }
+ setMacro(appended);
+ };
+ const finalizeMacro = (name?: string) => {
+ if (macro?.length) {
+ act("add_macro", { data: macro, name: name });
+ }
+ setMacro(undefined);
+ };
+ return (
+
+
+
+
+ act('eject_cell')} />
+ }>
+
+ {data.has_cell ? (
+ `${Math.round(data.cell_charge / data.cell_capacity * 100)}%`
+ ) : (
+ "No Cell"
+ )}
+
+
+ act('toggle_charge')} />
+ }>
+ {data.recharging? `Drawing ${data.recharge_rate}kW` : ``}
+
+
+
+
+
+
+ act('amount', { set: val })} />
+
+
+
+ macro === undefined? setMacro(new Array<[string, number]>()) : finalizeMacro()}
+ icon={macro === undefined? "circle" : "square"}
+ color={macro === undefined? "good" : "bad"} />
+ }>
+
+ {
+ arrayBucketFill(data.macros.sort((a, b) => (a.name.localeCompare(b.name))), 4).map((arr) => (
+ // yes, this is shitcode for key, but maybe it shouldn't be so damn PICKY
+
+
+ {arr.map((m) => (
+ // ditto
+
+
+
+ act('macro', { index: m.index })} />
+
+
+ act('del_macro', { index: m.index })} />
+
+
+
+ ))}
+
+
+ ))
+ }
+
+
+
+
+ {arrayBucketFill(data.reagents.sort((a, b) => (a.name.localeCompare(b.name))), 4).map((reagentArray) => (
+
+
+ {reagentArray.map((reagent) => (
+
+ {
+ act('reagent', { id: reagent.id });
+ recordReagent(reagent.id, data.amount);
+ }} />
+
+ ))}
+
+
+ ))}
+
+
+
+ {data.cartridges.sort((a, b) => (a.label.localeCompare(b.label))).map((cart) => (
+
+
+ act('cartridge', { label: cart.label })} />
+
+
+ act('eject_cart', { label: cart.label })} />
+
+
+ ))}
+
+ {macro !== undefined && (
+
+ {
+ macro.map((a) => `${a[0]}: ${a[1]}`).join(", ")
+ }
+
+ )}
+ act('eject')} />
+ }>
+ {data.has_beaker? (
+ (
+ <>
+ act('isolate', { id: id })} />
+ {
+ [1, 2, 3, 5].map((n) => (
+ act('purge', { id: id, amount: n })} />
+ ))
+ }
+ act('purge', { id: id })} />
+ >
+ )} />
+ ) : (
+
+
+ No beaker inserted.
+
+
+ )}
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/Mecha/MechStatPane.tsx b/tgui/packages/tgui/interfaces/Mecha/MechStatPane.tsx
index 7d8a26dfe93..6a4512af634 100644
--- a/tgui/packages/tgui/interfaces/Mecha/MechStatPane.tsx
+++ b/tgui/packages/tgui/interfaces/Mecha/MechStatPane.tsx
@@ -56,7 +56,7 @@ export const MechStatPane = (props, context) => {
- act('toggle_airsource')}>
{air_source}
@@ -188,7 +188,7 @@ const PowerBar = (props, context) => {
bad: [-Infinity, 0.25*power_max],
}}
maxValue={power_max}
- value={power_level} />
+ value={power_level || 0} />
);
}
};
diff --git a/tgui/packages/tgui/interfaces/common/Reagents.tsx b/tgui/packages/tgui/interfaces/common/Reagents.tsx
new file mode 100644
index 00000000000..e02d6933283
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/common/Reagents.tsx
@@ -0,0 +1,47 @@
+/**
+ * Collection of common reagent things.
+ *
+ * @file
+ * @license MIT
+ */
+
+import { InfernoNode } from "inferno";
+import { LabeledList, NoticeBox, Section } from "../../components";
+
+interface ReagentContentsProps {
+ buttons?: InfernoNode;
+ reagentButtons?: Function; // called to generate buttons with (id)
+ reagents: ReagentContentsData;
+}
+
+export type ReagentContentsData = Array;
+
+interface ReagentContentsEntry {
+ id: string;
+ name: string;
+ amount: number;
+}
+
+export const ReagentContents = (props: ReagentContentsProps, context) => {
+ return (
+
+
+ {props.reagents.length === 0 && (
+
+ Container is empty.
+
+ )}
+ {
+ props.reagents.map((reagent) => (
+
+ {reagent.amount}u
+
+ ))
+ }
+
+
+ );
+};