From 744b6e3a616ff07728d7c37dfe50e07205b937d6 Mon Sep 17 00:00:00 2001
From: Luc <89928798+lewcc@users.noreply.github.com>
Date: Tue, 17 Oct 2023 14:42:42 -0400
Subject: [PATCH] Refactors transit tubes (#22452)
* Rework transit tube pods to not use timers
* please work
* yes
* henri review
* Fix mapping mishaps
* fix icon mishaps
* re-adds missing intercomm
---
_maps/map_files/Delta/delta.dmm | 222 ++++-------
_maps/map_files/MetaStation/MetaStation.dmm | 163 ++-------
_maps/map_files/cyberiad/cyberiad.dmm | 26 +-
.../subsystem/processing/transittube.dm | 6 +
.../structures/transit_tubes/station.dm | 175 +++++++--
.../structures/transit_tubes/transit_tube.dm | 346 ++++++++----------
.../transit_tubes/transit_tube_pod.dm | 200 +++++++---
icons/obj/pipes/transit_tube.dmi | Bin 8818 -> 14133 bytes
icons/obj/pipes/transit_tube_pod.dmi | Bin 4938 -> 8560 bytes
icons/obj/pipes/transit_tube_station.dmi | Bin 5503 -> 42718 bytes
paradise.dme | 1 +
11 files changed, 563 insertions(+), 576 deletions(-)
create mode 100644 code/controllers/subsystem/processing/transittube.dm
diff --git a/_maps/map_files/Delta/delta.dmm b/_maps/map_files/Delta/delta.dmm
index 9b4782887a0..cc39089960d 100644
--- a/_maps/map_files/Delta/delta.dmm
+++ b/_maps/map_files/Delta/delta.dmm
@@ -33688,37 +33688,22 @@
"bPS" = (
/turf/simulated/wall,
/area/space/nearstation)
-"bPT" = (
-/obj/structure/lattice,
-/obj/structure/window/reinforced,
-/obj/structure/transit_tube{
- icon_state = "D-SE"
- },
-/turf/space,
-/area/space/nearstation)
"bPU" = (
/obj/structure/lattice,
-/obj/structure/transit_tube{
- icon_state = "E-SW"
+/obj/structure/transit_tube/curved/flipped{
+ dir = 4
},
/turf/space,
/area/space/nearstation)
"bPV" = (
/obj/structure/lattice,
-/obj/structure/transit_tube,
+/obj/structure/transit_tube/horizontal,
/turf/space,
/area/space/nearstation)
"bPW" = (
/obj/structure/lattice,
-/obj/structure/transit_tube{
- icon_state = "W-SE"
- },
-/turf/space,
-/area/space/nearstation)
-"bPX" = (
-/obj/structure/lattice,
-/obj/structure/transit_tube{
- icon_state = "D-SW"
+/obj/structure/transit_tube/curved{
+ dir = 8
},
/turf/space,
/area/space/nearstation)
@@ -34397,37 +34382,12 @@
/obj/structure/window/reinforced{
dir = 4
},
-/obj/structure/transit_tube{
- icon_state = "S-NE"
- },
+/obj/structure/transit_tube/curved,
/turf/simulated/floor/plasteel/dark,
/area/station/aisat)
-"bRO" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/structure/transit_tube{
- icon_state = "D-NW"
- },
-/turf/space,
-/area/space/nearstation)
-"bRP" = (
-/obj/structure/transit_tube{
- icon_state = "D-NE"
- },
-/turf/space,
-/area/space/nearstation)
"bRQ" = (
/obj/structure/lattice,
-/obj/structure/transit_tube{
- icon_state = "NW-SE"
- },
-/turf/space,
-/area/space/nearstation)
-"bRR" = (
-/obj/structure/transit_tube{
- icon_state = "D-SW"
- },
+/obj/structure/transit_tube/diagonal/topleft,
/turf/space,
/area/space/nearstation)
"bRS" = (
@@ -35347,16 +35307,16 @@
/turf/simulated/floor/plasteel/dark,
/area/station/aisat)
"bTQ" = (
-/obj/item/radio/beacon,
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
+/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
+ dir = 1
+ },
/obj/structure/cable{
d1 = 4;
d2 = 8;
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
+/obj/item/radio/beacon,
/turf/simulated/floor/plasteel/dark,
/area/station/aisat)
"bTR" = (
@@ -36330,58 +36290,31 @@
/obj/structure/window/reinforced{
dir = 4
},
-/obj/structure/transit_tube{
- icon_state = "N-SE"
+/obj/structure/transit_tube/curved/flipped{
+ dir = 1
},
/turf/simulated/floor/plasteel/dark,
/area/station/aisat)
-"bVZ" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/structure/transit_tube{
- icon_state = "D-SW"
- },
-/turf/space,
-/area/space/nearstation)
"bWa" = (
-/obj/structure/transit_tube{
- icon_state = "D-SE"
- },
/turf/space,
/area/space/nearstation)
"bWb" = (
/obj/structure/lattice,
-/obj/structure/transit_tube{
- icon_state = "NE-SW"
- },
-/turf/space,
-/area/space/nearstation)
-"bWc" = (
-/obj/structure/transit_tube{
- icon_state = "D-NW"
- },
-/turf/space,
-/area/space/nearstation)
-"bWd" = (
-/obj/structure/lattice,
-/obj/structure/transit_tube{
- icon_state = "D-NE"
- },
+/obj/structure/transit_tube/diagonal,
/turf/space,
/area/space/nearstation)
"bWf" = (
-/obj/structure/transit_tube,
/obj/structure/window/reinforced{
dir = 8
},
+/obj/structure/transit_tube/horizontal,
/turf/simulated/floor/plasteel{
dir = 8;
icon_state = "vault"
},
/area/station/engineering/break_room)
"bWg" = (
-/obj/structure/transit_tube,
+/obj/structure/transit_tube/horizontal,
/turf/simulated/floor/plasteel/dark,
/area/station/engineering/break_room)
"bWh" = (
@@ -36401,15 +36334,14 @@
},
/area/station/security/warden)
"bWi" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/transit_tube/cap{
+ dir = 8
+ },
/obj/item/radio/intercom{
name = "south bump";
pixel_y = -28
},
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/transit_tube{
- dir = 8;
- icon_state = "Block"
- },
/turf/simulated/floor/plasteel{
dir = 8;
icon_state = "vault"
@@ -37008,35 +36940,17 @@
icon_state = "vault"
},
/area/station/turret_protected/aisat)
-"bXQ" = (
-/obj/structure/lattice,
-/obj/structure/window/reinforced{
- dir = 1;
- layer = 2.9
- },
-/obj/structure/transit_tube{
- icon_state = "D-NE"
- },
-/turf/space,
-/area/space/nearstation)
"bXR" = (
/obj/structure/lattice,
-/obj/structure/transit_tube{
- icon_state = "E-NW"
+/obj/structure/transit_tube/curved{
+ dir = 4
},
/turf/space,
/area/space/nearstation)
"bXS" = (
/obj/structure/lattice,
-/obj/structure/transit_tube{
- icon_state = "W-NE"
- },
-/turf/space,
-/area/space/nearstation)
-"bXT" = (
-/obj/structure/lattice,
-/obj/structure/transit_tube{
- icon_state = "D-NW"
+/obj/structure/transit_tube/curved/flipped{
+ dir = 8
},
/turf/space,
/area/space/nearstation)
@@ -40312,15 +40226,15 @@
},
/area/station/hallway/primary/port)
"cgD" = (
-/obj/structure/transit_tube/station/reverse{
- dir = 1
- },
/obj/structure/transit_tube_pod{
dir = 8
},
/obj/machinery/ai_status_display{
pixel_y = -32
},
+/obj/structure/transit_tube/station{
+ dir = 1
+ },
/turf/simulated/floor/plasteel{
dir = 8;
icon_state = "vault"
@@ -41236,22 +41150,6 @@
icon_state = "neutralfull"
},
/area/station/public/locker)
-"cjl" = (
-/obj/structure/transit_tube{
- icon_state = "D-NE"
- },
-/obj/structure/transit_tube{
- icon_state = "D-SE"
- },
-/obj/structure/lattice/catwalk,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/turf/space,
-/area/space/nearstation)
"cjm" = (
/obj/structure/closet/crate,
/obj/effect/spawner/lootdrop/maintenance/two,
@@ -42989,9 +42887,6 @@
/turf/simulated/floor/plating,
/area/station/command/teleporter)
"cnH" = (
-/obj/structure/transit_tube{
- icon_state = "E-SW-NW"
- },
/obj/structure/lattice/catwalk,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
@@ -42999,6 +42894,9 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
+/obj/structure/transit_tube/junction{
+ dir = 4
+ },
/turf/space,
/area/space/nearstation)
"cnJ" = (
@@ -43171,9 +43069,6 @@
/turf/simulated/floor/plasteel,
/area/station/engineering/control)
"coi" = (
-/obj/structure/transit_tube{
- icon_state = "E-W-Pass"
- },
/obj/structure/lattice/catwalk,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
@@ -43181,6 +43076,9 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
+/obj/structure/transit_tube/crossing{
+ dir = 8
+ },
/turf/space,
/area/space/nearstation)
"coj" = (
@@ -44927,7 +44825,6 @@
/turf/simulated/floor/plating,
/area/station/engineering/control)
"csr" = (
-/obj/structure/transit_tube,
/obj/structure/lattice/catwalk,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
@@ -44935,6 +44832,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
+/obj/structure/transit_tube/horizontal,
/turf/space,
/area/space/nearstation)
"css" = (
@@ -44992,9 +44890,6 @@
/turf/simulated/floor/plating,
/area/station/engineering/equipmentstorage)
"csy" = (
-/obj/structure/transit_tube{
- icon_state = "W-SE"
- },
/obj/structure/lattice/catwalk,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
@@ -45002,6 +44897,9 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
+/obj/structure/transit_tube/curved{
+ dir = 8
+ },
/turf/space,
/area/space/nearstation)
"csz" = (
@@ -45467,9 +45365,6 @@
/turf/simulated/floor/plasteel/dark,
/area/station/service/library)
"ctI" = (
-/obj/structure/transit_tube{
- icon_state = "D-SW"
- },
/obj/structure/window/reinforced{
dir = 4
},
@@ -45483,13 +45378,13 @@
/turf/space,
/area/space/nearstation)
"ctJ" = (
-/obj/structure/transit_tube{
- icon_state = "E-NW"
+/obj/structure/lattice/catwalk,
+/obj/structure/transit_tube/curved{
+ dir = 4
},
/obj/structure/window/reinforced{
dir = 4
},
-/obj/structure/lattice/catwalk,
/turf/space,
/area/space/nearstation)
"ctK" = (
@@ -86554,6 +86449,17 @@
/obj/structure/lattice,
/turf/space,
/area/space/nearstation)
+"orM" = (
+/obj/structure/transit_tube/horizontal,
+/obj/structure/lattice/catwalk,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/space,
+/area/space/nearstation)
"orY" = (
/obj/structure/barricade/wooden,
/obj/machinery/door/airlock/command/glass{
@@ -112044,11 +111950,11 @@ aaa
aaa
bUJ
aaa
-bPT
+bku
bRN
bTU
bVY
-bXQ
+brr
aaa
aaa
aaa
@@ -112302,9 +112208,9 @@ aaa
bUJ
aaa
bPU
-bRO
+bms
bZw
-bVZ
+bms
bXR
aaa
aaa
@@ -112816,7 +112722,7 @@ aaa
bUJ
aaa
bPW
-bRP
+bWa
chw
bWa
bXS
@@ -113072,11 +112978,11 @@ aaa
aaa
bUJ
aaa
-bPX
+abj
bRQ
-cjl
+chw
bWb
-bXT
+abj
aaa
aaa
aaa
@@ -113330,9 +113236,9 @@ aaa
bUJ
aaa
abj
-bRR
+bWa
cnH
-bWc
+bWa
abj
aaa
aaa
@@ -119242,7 +119148,7 @@ dVS
abj
abj
abj
-csr
+orM
abj
bXU
bZk
@@ -119500,7 +119406,7 @@ byl
byl
abj
csy
-bWd
+abj
bXU
bZl
cbb
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 72783ce8cd9..fed42864121 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -4737,15 +4737,6 @@
/obj/effect/spawner/lootdrop/maintenance,
/turf/simulated/floor/plating,
/area/station/maintenance/fsmaint)
-"azv" = (
-/obj/structure/transit_tube{
- icon_state = "D-NW"
- },
-/obj/structure/window/reinforced{
- dir = 1
- },
-/turf/space,
-/area/space/nearstation)
"azy" = (
/obj/structure/reagent_dispensers/fueltank,
/turf/simulated/floor/plating,
@@ -5056,15 +5047,13 @@
},
/area/station/legal/courtroom)
"aAO" = (
-/obj/structure/transit_tube{
- icon_state = "S-NW"
- },
/obj/structure/window/reinforced{
dir = 8
},
/obj/structure/window/reinforced{
dir = 1
},
+/obj/structure/transit_tube/curved/flipped,
/turf/simulated/floor/plasteel{
dir = 1;
icon_state = "darkbluecorners"
@@ -18284,8 +18273,8 @@
/area/station/maintenance/fpmaint)
"bmj" = (
/obj/structure/lattice/catwalk,
-/obj/structure/transit_tube{
- icon_state = "E-W-Pass"
+/obj/structure/transit_tube/crossing{
+ dir = 8
},
/turf/space,
/area/space/nearstation)
@@ -20138,12 +20127,6 @@
icon_state = "dark"
},
/area/station/turret_protected/ai)
-"bqY" = (
-/obj/structure/transit_tube{
- icon_state = "D-SE"
- },
-/turf/space,
-/area/space/nearstation)
"bqZ" = (
/obj/machinery/ai_slipper,
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
@@ -20180,13 +20163,6 @@
icon_state = "cult"
},
/area/station/legal/lawoffice)
-"brd" = (
-/obj/structure/transit_tube{
- icon_state = "D-SW"
- },
-/obj/structure/window/reinforced,
-/turf/space,
-/area/space/nearstation)
"bre" = (
/turf/simulated/wall/r_wall,
/area/space/nearstation)
@@ -20783,7 +20759,7 @@
},
/area/station/engineering/break_room)
"bsJ" = (
-/obj/structure/transit_tube,
+/obj/structure/transit_tube/horizontal,
/obj/structure/lattice/catwalk,
/obj/structure/window/reinforced{
dir = 8
@@ -20793,22 +20769,16 @@
"bsK" = (
/turf/simulated/wall/mineral/titanium,
/area/shuttle/pod_4)
-"bsL" = (
-/obj/structure/transit_tube{
- icon_state = "D-SW"
- },
-/turf/space,
-/area/space/nearstation)
"bsP" = (
/obj/structure/lattice/catwalk,
-/obj/structure/transit_tube{
- icon_state = "W-NE-SE"
+/obj/structure/transit_tube/junction{
+ dir = 8
},
/turf/space,
/area/space/nearstation)
"bsS" = (
-/obj/structure/transit_tube{
- icon_state = "W-SE"
+/obj/structure/transit_tube/curved{
+ dir = 8
},
/turf/space,
/area/space/nearstation)
@@ -21273,9 +21243,7 @@
},
/area/station/command/bridge)
"bud" = (
-/obj/structure/transit_tube{
- icon_state = "NE-SW"
- },
+/obj/structure/transit_tube/diagonal,
/turf/space,
/area/space/nearstation)
"bue" = (
@@ -21515,12 +21483,6 @@
},
/turf/simulated/floor/plating,
/area/station/public/storage/emergency)
-"buM" = (
-/obj/structure/transit_tube{
- icon_state = "D-NW"
- },
-/turf/space,
-/area/space/nearstation)
"buN" = (
/obj/structure/transit_tube_pod,
/obj/structure/window/reinforced{
@@ -21534,15 +21496,6 @@
icon_state = "vault"
},
/area/station/aisat)
-"buO" = (
-/obj/structure/transit_tube{
- icon_state = "D-NE"
- },
-/obj/structure/window/reinforced{
- dir = 4
- },
-/turf/space,
-/area/space/nearstation)
"buP" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 6
@@ -21606,7 +21559,7 @@
},
/area/station/hallway/primary/starboard)
"buW" = (
-/obj/structure/transit_tube,
+/obj/structure/transit_tube/horizontal,
/obj/structure/lattice/catwalk,
/turf/space,
/area/space/nearstation)
@@ -21821,9 +21774,8 @@
},
/area/station/engineering/controlroom)
"bvv" = (
-/obj/structure/transit_tube{
- dir = 4;
- icon_state = "Block"
+/obj/structure/transit_tube/cap{
+ dir = 4
},
/obj/machinery/status_display{
layer = 4;
@@ -22552,16 +22504,6 @@
icon_state = "darkbluecorners"
},
/area/station/aisat)
-"bwX" = (
-/obj/structure/transit_tube{
- icon_state = "D-SW"
- },
-/obj/structure/transit_tube{
- icon_state = "D-NW"
- },
-/obj/structure/lattice/catwalk,
-/turf/space,
-/area/space/nearstation)
"bxb" = (
/obj/structure/table/wood,
/obj/machinery/light/small{
@@ -22618,12 +22560,6 @@
},
/turf/simulated/floor/bluegrid/telecomms,
/area/station/science/xenobiology)
-"bxk" = (
-/obj/structure/transit_tube{
- icon_state = "D-NE"
- },
-/turf/space,
-/area/space/nearstation)
"bxl" = (
/obj/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
@@ -23406,8 +23342,8 @@
},
/area/station/engineering/control)
"bzc" = (
-/obj/structure/transit_tube{
- icon_state = "E-SW"
+/obj/structure/transit_tube/curved/flipped{
+ dir = 4
},
/turf/space,
/area/space/nearstation)
@@ -23562,19 +23498,17 @@
/turf/simulated/floor/plasteel,
/area/station/hallway/secondary/entry)
"bzt" = (
-/obj/structure/transit_tube{
- icon_state = "NW-SE"
- },
+/obj/structure/transit_tube/diagonal/topleft,
/turf/space,
/area/space/nearstation)
"bzu" = (
-/obj/structure/transit_tube{
- icon_state = "N-SW"
- },
/obj/structure/window/reinforced{
dir = 8
},
/obj/structure/window/reinforced,
+/obj/structure/transit_tube/curved{
+ dir = 1
+ },
/turf/simulated/floor/plasteel{
dir = 8;
icon_state = "darkbluecorners"
@@ -24088,16 +24022,7 @@
/turf/simulated/floor/plasteel,
/area/station/supply/storage)
"bBa" = (
-/obj/structure/transit_tube{
- icon_state = "E-NW"
- },
-/turf/space,
-/area/space/nearstation)
-"bBb" = (
-/obj/structure/transit_tube{
- icon_state = "D-SE"
- },
-/obj/structure/window/reinforced{
+/obj/structure/transit_tube/curved{
dir = 4
},
/turf/space,
@@ -25539,8 +25464,8 @@
},
/area/station/telecomms/computer)
"bFk" = (
-/obj/structure/transit_tube{
- icon_state = "E-W-Pass"
+/obj/structure/transit_tube/crossing{
+ dir = 8
},
/obj/structure/lattice,
/turf/space,
@@ -25952,8 +25877,8 @@
},
/area/station/aisat)
"bGN" = (
-/obj/structure/transit_tube{
- icon_state = "W-NE"
+/obj/structure/transit_tube/curved/flipped{
+ dir = 8
},
/turf/space,
/area/space/nearstation)
@@ -29261,7 +29186,7 @@
/turf/space,
/area/space/nearstation)
"bRq" = (
-/obj/structure/transit_tube,
+/obj/structure/transit_tube/horizontal,
/obj/structure/window/reinforced{
dir = 4
},
@@ -81187,13 +81112,6 @@
icon_state = "whitepurple"
},
/area/station/science/research)
-"sil" = (
-/obj/structure/transit_tube{
- icon_state = "D-NE"
- },
-/obj/structure/lattice,
-/turf/space,
-/area/space/nearstation)
"sjx" = (
/obj/structure/chair{
dir = 1
@@ -87248,7 +87166,7 @@
/area/station/security/prison/cell_block/A)
"vbU" = (
/obj/structure/lattice/catwalk,
-/obj/structure/transit_tube,
+/obj/structure/transit_tube/horizontal,
/turf/space,
/area/space/nearstation)
"vbV" = (
@@ -91247,13 +91165,6 @@
icon_state = "dark"
},
/area/station/security/interrogation)
-"xhd" = (
-/obj/structure/transit_tube{
- icon_state = "D-SE"
- },
-/obj/structure/lattice,
-/turf/space,
-/area/space/nearstation)
"xhh" = (
/obj/effect/spawner/window/reinforced/polarized/grilled{
id = "CMO"
@@ -93360,7 +93271,7 @@
},
/area/station/science/toxins/launch)
"yeg" = (
-/obj/structure/transit_tube,
+/obj/structure/transit_tube/horizontal,
/obj/structure/lattice/catwalk,
/obj/machinery/atmospherics/pipe/simple/visible/yellow,
/turf/space,
@@ -143942,9 +143853,9 @@ abq
abq
abq
abq
-xhd
+abq
bsP
-sil
+abq
abq
abq
aef
@@ -144198,11 +144109,11 @@ aaa
aaa
aaa
aaa
-bqY
+bwM
bud
-bwX
+aef
bzt
-bxk
+bwM
aaa
aef
aaa
@@ -144456,9 +144367,9 @@ aaa
aaa
aaa
bzc
-buM
+bwM
aef
-bsL
+bwM
bBa
aaa
aef
@@ -144970,9 +144881,9 @@ efR
efR
aXL
bsS
-buO
+aXH
bDg
-bBb
+aXH
bGN
aaa
aaa
@@ -145226,11 +145137,11 @@ aUU
blE
dkq
aXL
-brd
+aUU
aAO
buN
bzu
-azv
+aQF
aaa
aaa
aaa
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index bc1fa2a43d1..02968dfbfd1 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -52663,9 +52663,8 @@
name = "north bump";
pixel_y = 24
},
-/obj/structure/transit_tube{
- dir = 4;
- icon_state = "Block"
+/obj/structure/transit_tube/cap{
+ dir = 4
},
/turf/simulated/floor/plasteel{
icon_state = "dark"
@@ -52692,7 +52691,7 @@
},
/obj/structure/transit_tube/station,
/obj/structure/transit_tube_pod{
- dir = 8
+ dir = 4
},
/turf/simulated/floor/plasteel{
icon_state = "dark"
@@ -53091,8 +53090,8 @@
/turf/simulated/floor/wood,
/area/station/public/mrchangs)
"dhr" = (
-/obj/structure/transit_tube,
/obj/effect/spawner/window/reinforced/grilled,
+/obj/structure/transit_tube/horizontal,
/turf/simulated/floor/plating,
/area/station/maintenance/storage)
"dhv" = (
@@ -54745,24 +54744,22 @@
},
/area/station/aisat/hall)
"dmW" = (
-/obj/structure/transit_tube,
+/obj/structure/transit_tube/horizontal,
/turf/space,
/area/space/nearstation)
"dmX" = (
-/obj/structure/transit_tube{
- icon_state = "E-W-Pass"
- },
/obj/structure/lattice,
+/obj/structure/transit_tube/crossing/horizontal,
/turf/space,
/area/space/nearstation)
"dna" = (
-/obj/structure/transit_tube,
+/obj/structure/transit_tube/horizontal,
/turf/simulated/floor/plating,
/area/station/turret_protected/aisat/interior)
"dnb" = (
/obj/structure/transit_tube/station,
/obj/structure/transit_tube_pod{
- dir = 4
+ dir = 8
},
/obj/machinery/atmospherics/pipe/simple/visible/yellow,
/turf/simulated/floor/plating,
@@ -54857,9 +54854,8 @@
},
/area/station/turret_protected/ai)
"dno" = (
-/obj/structure/transit_tube{
- dir = 8;
- icon_state = "Block"
+/obj/structure/transit_tube/cap{
+ dir = 8
},
/turf/simulated/floor/plating,
/area/station/turret_protected/aisat/interior)
@@ -73588,8 +73584,8 @@
/turf/simulated/floor/plating,
/area/station/maintenance/apmaint2)
"mHY" = (
-/obj/structure/transit_tube,
/obj/effect/spawner/window/reinforced/grilled,
+/obj/structure/transit_tube/horizontal,
/turf/simulated/floor/plating,
/area/station/turret_protected/aisat/interior)
"mIu" = (
diff --git a/code/controllers/subsystem/processing/transittube.dm b/code/controllers/subsystem/processing/transittube.dm
new file mode 100644
index 00000000000..2d77bcf8c42
--- /dev/null
+++ b/code/controllers/subsystem/processing/transittube.dm
@@ -0,0 +1,6 @@
+PROCESSING_SUBSYSTEM_DEF(transit_tube)
+ name = "Transit Tubes"
+ wait = 1
+ flags = SS_NO_INIT|SS_BACKGROUND
+ offline_implications = "Transit tubes will no longer function. Admin intervention recommended, but shuttle call not required."
+ cpu_display = SS_CPUDISPLAY_HIGH
diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm
index 889a22eae95..2552b7c896d 100644
--- a/code/game/objects/structures/transit_tubes/station.dm
+++ b/code/game/objects/structures/transit_tubes/station.dm
@@ -8,8 +8,10 @@
// one.
/obj/structure/transit_tube/station
name = "station tube station"
+ desc = "The lynchpin of the transit system."
icon = 'icons/obj/pipes/transit_tube_station.dmi'
- icon_state = "closed"
+ icon_state = "closed_station0"
+ base_icon_state = "station0"
exit_delay = 1
enter_delay = 2
var/pod_moving = FALSE
@@ -18,6 +20,8 @@
var/hatch_state = TRANSIT_TUBE_CLOSED
var/list/disallowed_mobs = list(/mob/living/silicon/ai)
+ /// Direction by which you can board the tube
+ var/boarding_dir
/obj/structure/transit_tube/station/Initialize(mapload)
. = ..()
@@ -27,24 +31,32 @@
STOP_PROCESSING(SSobj, src)
return ..()
-// Stations which will send the tube in the opposite direction after their stop.
-/obj/structure/transit_tube/station/reverse
- reverse_launch = TRUE
+/obj/structure/transit_tube/station/init_tube_dirs()
+ // Tube station directions are simply 90 to either side of
+ // the exit.
+ switch(dir)
+ if(NORTH)
+ tube_dirs = list(EAST, WEST)
+ if(SOUTH)
+ tube_dirs = list(EAST, WEST)
+ if(EAST)
+ tube_dirs = list(NORTH, SOUTH)
+ if(WEST)
+ tube_dirs = list(NORTH, SOUTH)
+ boarding_dir = reverse_direction(dir)
/obj/structure/transit_tube/station/should_stop_pod(pod, from_dir)
return TRUE
/obj/structure/transit_tube/station/Bumped(mob/living/L)
- if(!pod_moving && hatch_state == TRANSIT_TUBE_OPEN && isliving(L) && !is_type_in_list(L, disallowed_mobs))
- var/failed = FALSE
+ if(!pod_moving && L.dir == boarding_dir && hatch_state == TRANSIT_TUBE_OPEN && isliving(L) && !is_type_in_list(L, disallowed_mobs))
for(var/obj/structure/transit_tube_pod/pod in loc)
- if(pod.contents.len)
- failed = TRUE
- else if(!pod.moving && (pod.dir in directions()))
+ if(length(pod.contents))
+ to_chat(L, "The pod is already occupied.")
+ return
+ if(!pod.moving && ((pod.dir in directions()) || (reverse_launch && (turn(pod.dir, 180) in directions()))))
pod.move_into(L)
return
- if(failed)
- to_chat(L, "The pod is already occupied.")
@@ -88,31 +100,36 @@
/obj/structure/transit_tube/station/proc/open_hatch()
if(hatch_state == TRANSIT_TUBE_CLOSED)
- icon_state = "opening"
+ icon_state = "opening_[base_icon_state]"
hatch_state = TRANSIT_TUBE_OPENING
- addtimer(CALLBACK(src, PROC_REF(open_hatch_callback)), OPEN_DURATION)
-
-/obj/structure/transit_tube/station/proc/open_hatch_callback()
- if(hatch_state == TRANSIT_TUBE_OPENING)
- icon_state = "open"
- hatch_state = TRANSIT_TUBE_OPEN
-
-
+ addtimer(CALLBACK(src, PROC_REF(finish_animation)), OPEN_DURATION)
/obj/structure/transit_tube/station/proc/close_hatch()
if(hatch_state == TRANSIT_TUBE_OPEN)
- icon_state = "closing"
+ icon_state = "closing_[base_icon_state]"
hatch_state = TRANSIT_TUBE_CLOSING
- addtimer(CALLBACK(src, PROC_REF(close_hatch_calllback)), CLOSE_DURATION)
+ addtimer(CALLBACK(src, PROC_REF(finish_animation)), CLOSE_DURATION)
-/obj/structure/transit_tube/station/proc/close_hatch_calllback()
- if(hatch_state == TRANSIT_TUBE_CLOSING)
- icon_state = "closed"
- hatch_state = TRANSIT_TUBE_CLOSED
+/obj/structure/transit_tube/station/proc/finish_animation()
+ switch(hatch_state)
+ if(TRANSIT_TUBE_OPENING)
+ icon_state = "open_[base_icon_state]"
+ hatch_state = TRANSIT_TUBE_OPEN
+ for(var/obj/structure/transit_tube_pod/pod in loc)
+ for(var/thing in pod)
+ if(ismob(thing))
+ var/mob/mob_content = thing
+ if(mob_content.client && mob_content.stat < UNCONSCIOUS)
+ continue // Let the mobs with clients decide what they want to do themselves.
+ var/atom/movable/movable_content = thing
+ movable_content.forceMove(loc) //Everything else is moved out of.
+ if(TRANSIT_TUBE_CLOSING)
+ icon_state = "closed_[base_icon_state]"
+ hatch_state = TRANSIT_TUBE_CLOSED
/obj/structure/transit_tube/station/proc/launch_pod()
for(var/obj/structure/transit_tube_pod/pod in loc)
- if(!pod.moving && (pod.dir in directions()))
+ if(!pod.moving && ((pod.dir in directions()) || (reverse_launch && (turn(pod.dir, 180) in directions()))))
addtimer(CALLBACK(src, PROC_REF(launch_pod_callback), pod), 5)
return
@@ -131,7 +148,7 @@
if(!nexttube)
pod.dir = turn(pod.dir, 180)
- if(hatch_state == TRANSIT_TUBE_CLOSED && pod)
+ if(hatch_state == TRANSIT_TUBE_CLOSED && pod && pod.loc == loc)
pod.follow_tube()
pod_moving = FALSE
@@ -142,6 +159,7 @@
/obj/structure/transit_tube/station/pod_stopped(obj/structure/transit_tube_pod/pod, from_dir)
pod_moving = TRUE
+ pod.stop_following()
addtimer(CALLBACK(src, PROC_REF(pod_stopped_callback), pod), 5)
/obj/structure/transit_tube/station/proc/pod_stopped_callback(obj/structure/transit_tube_pod/pod)
@@ -152,10 +170,103 @@
pod_moving = FALSE
pod.mix_air()
-// Tube station directions are simply 90 to either side of
-// the exit.
-/obj/structure/transit_tube/station/init_dirs()
- tube_dirs = list(turn(dir, 90), turn(dir, -90))
+/obj/structure/transit_tube/station/flipped
+ icon_state = "closed_station1"
+ base_icon_state = "station1"
+
+/obj/structure/transit_tube/station/flipped/init_tube_dirs()
+ ..()
+ boarding_dir = dir
+
+// Stations which will send the tube in the opposite direction after their stop.
+/obj/structure/transit_tube/station/reverse
+ icon_state = "closed_terminus0"
+ base_icon_state = "terminus0"
+ reverse_launch = TRUE
+
+/obj/structure/transit_tube/station/reverse/init_tube_dirs()
+ tube_dirs = list(turn(dir, -90))
+ boarding_dir = reverse_direction(dir)
+
+/obj/structure/transit_tube/station/reverse/flipped
+ icon_state = "closed_terminus1"
+ base_icon_state = "terminus1"
+
+/obj/structure/transit_tube/station/reverse/flipped/init_tube_dirs()
+ ..()
+ boarding_dir = dir
+
+//special dispenser station, it creates a pod for you to enter when you bump into it.
+
+/obj/structure/transit_tube/station/dispenser
+ name = "station tube pod dispenser"
+ icon_state = "open_dispenser0"
+ desc = "The lynchpin of a GOOD transit system."
+ enter_delay = 1
+ base_icon_state = "dispenser0"
+ hatch_state = TRANSIT_TUBE_OPEN
+
+/obj/structure/transit_tube/station/dispenser/examine(mob/user)
+ . = ..()
+ . += "This station will create a pod for you to ride, no need to wait for one."
+ . += "Any pods arriving at this station will be reclaimed."
+
+/obj/structure/transit_tube/station/dispenser/close_hatch()
+ . = ..()
+ return
+
+/obj/structure/transit_tube/station/dispenser/launch_pod()
+ for(var/obj/structure/transit_tube_pod/pod in loc)
+ if(!pod.moving)
+ pod_moving = TRUE
+ pod.follow_tube()
+ pod_moving = FALSE
+ return TRUE
+ return FALSE
+
+/obj/structure/transit_tube/station/dispenser/Bumped(atom/movable/AM)
+ if(!(istype(AM) && AM.dir == boarding_dir) || AM.anchored)
+ return
+ var/obj/structure/transit_tube_pod/dispensed/pod = new(loc)
+ AM.visible_message("[pod] forms around [AM].", "[pod] materializes around you.")
+ playsound(src, 'sound/weapons/emitter2.ogg', 50, TRUE)
+ pod.dir = turn(dir, -90)
+ pod.move_into(AM)
+ launch_pod()
+
+/obj/structure/transit_tube/station/dispenser/pod_stopped(obj/structure/transit_tube_pod/pod)
+ playsound(src, 'sound/machines/ding.ogg', 50, TRUE)
+ qdel(pod)
+
+
+
+/obj/structure/transit_tube/station/dispenser/flipped
+ icon_state = "open_dispenser1"
+ base_icon_state = "dispenser1"
+
+/obj/structure/transit_tube/station/dispenser/flipped/init_tube_dirs()
+ ..()
+ boarding_dir = dir
+
+
+/obj/structure/transit_tube/station/dispenser/reverse
+ reverse_launch = TRUE
+ icon_state = "open_terminusdispenser0"
+ base_icon_state = "terminusdispenser0"
+
+/obj/structure/transit_tube/station/dispenser/reverse/init_tube_dirs()
+ tube_dirs = list(turn(dir, 90))
+ boarding_dir = reverse_direction(dir)
+
+/obj/structure/transit_tube/station/dispenser/reverse/flipped
+ icon_state = "open_terminusdispenser1"
+ base_icon_state = "terminusdispenser1"
+
+/obj/structure/transit_tube/station/dispenser/reverse/flipped/init_tube_dirs()
+ ..()
+ boarding_dir = dir
+
+
#undef CLOSE_DURATION
#undef OPEN_DURATION
diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm
index 7b09c3d567a..7173194cc6f 100644
--- a/code/game/objects/structures/transit_tubes/transit_tube.dm
+++ b/code/game/objects/structures/transit_tubes/transit_tube.dm
@@ -4,8 +4,10 @@
// Mappers: you can use "Generate Instances from Icon-states"
// to get the different pieces.
/obj/structure/transit_tube
+ name = "transit tube"
+ desc = "A pneumatic tube that brings you from here to there."
icon = 'icons/obj/pipes/transit_tube.dmi'
- icon_state = "E-W"
+ icon_state = "straight"
density = TRUE
layer = 3.1
anchored = TRUE
@@ -13,29 +15,39 @@
var/exit_delay = 1
var/enter_delay = 0
- // alldirs in global.dm is the same list of directions, but since
- // the specific order matters to get a usable icon_state, it is
- // copied here so that, in the unlikely case that alldirs is changed,
- // this continues to work.
- var/global/list/tube_dir_list = list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)
+/obj/structure/transit_tube/Initialize(mapload, new_direction)
+ . = ..()
+ if(new_direction)
+ setDir(new_direction)
+ // set up our appearance after the initialize in case someone's setting our direction afterwards
+ // (especially for things like admin spawning)
+ addtimer(CALLBACK(src, PROC_REF(setup_appearance)), 1)
+/obj/structure/transit_tube/proc/setup_appearance()
+ init_tube_dirs()
+ update_appearance()
+
+/obj/structure/transit_tube/Destroy()
+ for(var/obj/structure/transit_tube_pod/P in loc)
+ P.empty_pod()
+ return ..()
/obj/structure/transit_tube/CanPass(atom/movable/mover, turf/target)
if(istype(mover) && mover.checkpass(PASSGLASS))
- return 1
+ return TRUE
return !density
// When destroyed by explosions, properly handle contents.
/obj/structure/transit_tube/ex_act(severity)
switch(severity)
- if(1.0)
+ if(EXPLODE_DEVASTATE)
for(var/atom/movable/AM in contents)
AM.loc = loc
AM.ex_act(severity++)
qdel(src)
return
- if(2.0)
+ if(EXPLODE_HEAVY)
if(prob(50))
for(var/atom/movable/AM in contents)
AM.loc = loc
@@ -43,20 +55,12 @@
qdel(src)
return
- if(3.0)
+ if(EXPLODE_LIGHT)
return
-
-/obj/structure/transit_tube/New(loc)
- ..(loc)
-
- if(tube_dirs == null)
- init_dirs()
-
-
// Called to check if a pod should stop upon entering this tube.
/obj/structure/transit_tube/proc/should_stop_pod(pod, from_dir)
- return 0
+ return FALSE
// Called when a pod stops in this tube section.
/obj/structure/transit_tube/proc/pod_stopped(pod, from_dir)
@@ -76,18 +80,18 @@
for(var/direction in directions())
if(direction == from_dir)
- return 1
+ return TRUE
- return 0
+ return FALSE
/obj/structure/transit_tube/proc/has_exit(in_dir)
for(var/direction in directions())
if(direction == in_dir)
- return 1
+ return TRUE
- return 0
+ return FALSE
@@ -122,191 +126,157 @@
/obj/structure/transit_tube/proc/enter_delay(pod, to_dir)
return enter_delay
+/obj/structure/transit_tube/proc/init_tube_dirs()
+ switch(dir)
+ if(NORTH, SOUTH)
+ tube_dirs = list(NORTH, SOUTH)
+ if(EAST, WEST)
+ tube_dirs = list(EAST, WEST)
-// Parse the icon_state into a list of directions.
-// This means that mappers can use Dream Maker's built in
-// "Generate Instances from Icon-states" option to get all
-// variations. Additionally, as a separate proc, sub-types
-// can handle it more intelligently.
-/obj/structure/transit_tube/proc/init_dirs()
- if(icon_state == "auto")
- // Additional delay, for map loading.
- spawn(1)
- init_dirs_automatic()
+/obj/structure/transit_tube/update_overlays()
+ . = ..()
+ for(var/direction in directions())
+ if(!IS_DIR_DIAGONAL(direction))
+ . += create_tube_overlay(direction)
+ continue
+ if(!(direction & NORTH))
+ continue
+ . += create_tube_overlay(direction ^ (NORTH|SOUTH), NORTH)
+ if(direction & EAST)
+ . += create_tube_overlay(direction ^ (EAST|WEST), EAST)
+ else
+ . += create_tube_overlay(direction ^ (EAST|WEST), WEST)
+
+
+/obj/structure/transit_tube/proc/create_tube_overlay(direction, shift_dir)
+ // We use image() because a mutable appearance will have its dir mirror the parent which sort of fucks up what we're doing here
+ var/image/tube_overlay = image(icon, dir = direction)
+ if(shift_dir)
+ tube_overlay.icon_state = "decorative_diag"
+ switch(shift_dir)
+ if(NORTH)
+ tube_overlay.pixel_y = 32
+ if(SOUTH)
+ tube_overlay.pixel_y = -32
+ if(EAST)
+ tube_overlay.pixel_x = 32
+ if(WEST)
+ tube_overlay.pixel_x = -32
else
- tube_dirs = parse_dirs(icon_state)
+ tube_overlay.icon_state = "decorative"
- if(copytext(icon_state, 1, 3) == "D-" || findtextEx(icon_state, "Pass"))
- density = FALSE
+ tube_overlay.overlays += emissive_blocker(icon, tube_overlay.icon_state, src)
+ return tube_overlay
+
+//Some of these are mostly for mapping use
+/obj/structure/transit_tube/horizontal
+ dir = WEST
+/obj/structure/transit_tube/diagonal
+ icon_state = "diagonal"
+
+/obj/structure/transit_tube/diagonal/init_tube_dirs()
+ switch(dir)
+ if(NORTH)
+ tube_dirs = list(NORTHEAST, SOUTHWEST)
+ if(SOUTH)
+ tube_dirs = list(NORTHEAST, SOUTHWEST)
+ if(EAST)
+ tube_dirs = list(NORTHWEST, SOUTHEAST)
+ if(WEST)
+ tube_dirs = list(NORTHWEST, SOUTHEAST)
+
+//mostly for mapping use
+/obj/structure/transit_tube/diagonal/topleft
+ dir = WEST
+
+/obj/structure/transit_tube/diagonal/crossing
+ density = FALSE
+ icon_state = "diagonal_crossing"
+
+//mostly for mapping use
+/obj/structure/transit_tube/diagonal/crossing/topleft
+ dir = WEST
-// Initialize dirs by searching for tubes that do/might connect
-// on nearby turfs. Create corner pieces if nessecary.
-// Pick two directions, preferring tubes that already connect
-// to loc, or other auto tubes if there aren't enough connections.
-/obj/structure/transit_tube/proc/init_dirs_automatic()
- var/list/connected = list()
- var/list/connected_auto = list()
+/obj/structure/transit_tube/curved
+ icon_state = "curved0"
- for(var/direction in tube_dir_list)
- var/location = get_step(loc, direction)
- for(var/obj/structure/transit_tube/tube in location)
- if(tube.directions() == null && tube.icon_state == "auto")
- connected_auto += direction
- break
+/obj/structure/transit_tube/curved/init_tube_dirs()
+ switch(dir)
+ if(NORTH)
+ tube_dirs = list(NORTH, SOUTHWEST)
+ if(SOUTH)
+ tube_dirs = list(SOUTH, NORTHEAST)
+ if(EAST)
+ tube_dirs = list(EAST, NORTHWEST)
+ if(WEST)
+ tube_dirs = list(SOUTHEAST, WEST)
- else if(turn(direction, 180) in tube.directions())
- connected += direction
- break
+/obj/structure/transit_tube/curved/flipped
+ icon_state = "curved1"
- connected += connected_auto
-
- tube_dirs = select_automatic_dirs(connected)
-
- if(length(tube_dirs) == 2 && tube_dir_list.Find(tube_dirs[1]) > tube_dir_list.Find(tube_dirs[2]))
- tube_dirs.Swap(1, 2)
-
- generate_automatic_corners(tube_dirs)
- select_automatic_icon_state(tube_dirs)
+/obj/structure/transit_tube/curved/flipped/init_tube_dirs()
+ switch(dir)
+ if(NORTH)
+ tube_dirs = list(NORTH, SOUTHEAST)
+ if(SOUTH)
+ tube_dirs = list(SOUTH, NORTHWEST)
+ if(EAST)
+ tube_dirs = list(EAST, SOUTHWEST)
+ if(WEST)
+ tube_dirs = list(NORTHEAST, WEST)
+/obj/structure/transit_tube/junction
+ icon_state = "junction0"
-// Given a list of directions, look a pair that forms a 180 or
-// 135 degree angle, and return a list containing the pair.
-// If none exist, return list(connected[1], turn(connected[1], 180)
-/obj/structure/transit_tube/proc/select_automatic_dirs(connected)
- if(length(connected) < 1)
- return list()
+/obj/structure/transit_tube/junction/init_tube_dirs()
+ switch(dir)
+ if(NORTH)
+ tube_dirs = list(NORTH, SOUTHEAST, SOUTHWEST)//ending with the prefered direction
+ if(SOUTH)
+ tube_dirs = list(SOUTH, NORTHWEST, NORTHEAST)
+ if(EAST)
+ tube_dirs = list(EAST, SOUTHWEST, NORTHWEST)
+ if(WEST)
+ tube_dirs = list(WEST, NORTHEAST, SOUTHEAST)
- for(var/i = 1, i <= length(connected), i++)
- for(var/j = i + 1, j <= length(connected), j++)
- var/d1 = connected[i]
- var/d2 = connected[j]
+/obj/structure/transit_tube/junction/flipped
+ icon_state = "junction1"
- if(d1 == turn(d2, 135) || d1 == turn(d2, 180) || d1 == turn(d2, 225))
- return list(d1, d2)
-
- return list(connected[1], turn(connected[1], 180))
+/obj/structure/transit_tube/junction/flipped/init_tube_dirs()
+ switch(dir)
+ if(NORTH)
+ tube_dirs = list(NORTH, SOUTHWEST, SOUTHEAST)//ending with the prefered direction
+ if(SOUTH)
+ tube_dirs = list(SOUTH, NORTHEAST, NORTHWEST)
+ if(EAST)
+ tube_dirs = list(EAST, NORTHWEST, SOUTHWEST)
+ if(WEST)
+ tube_dirs = list(WEST, SOUTHEAST, NORTHEAST)
+/obj/structure/transit_tube/crossing
+ icon_state = "crossing"
+ density = FALSE
-/obj/structure/transit_tube/proc/select_automatic_icon_state(directions)
- if(length(directions) == 2)
- icon_state = "[dir2text_short(directions[1])]-[dir2text_short(directions[2])]"
+//mostly for mapping use
+/obj/structure/transit_tube/crossing/horizontal
+ dir = WEST
+// cosmetic "cap" for tubes. Note that tubes can't enter this.
+/obj/structure/transit_tube/cap
+ icon_state = "cap"
+/obj/structure/transit_tube/cap/init_tube_dirs()
+ tube_dirs = list(turn(dir, 180)) // back the way we came
-// Look for diagonal directions, generate the decorative corners in each.
-/obj/structure/transit_tube/proc/generate_automatic_corners(directions)
- for(var/direction in directions)
- if(direction == 5 || direction == 6 || direction == 9 || direction == 10)
- if(direction & NORTH)
- create_automatic_decorative_corner(get_step(loc, NORTH), direction ^ 3)
-
- else
- create_automatic_decorative_corner(get_step(loc, SOUTH), direction ^ 3)
-
- if(direction & EAST)
- create_automatic_decorative_corner(get_step(loc, EAST), direction ^ 12)
-
- else
- create_automatic_decorative_corner(get_step(loc, WEST), direction ^ 12)
-
-
-
-// Generate a corner, if one doesn't exist for the direction on the turf.
-/obj/structure/transit_tube/proc/create_automatic_decorative_corner(location, direction)
- var/state = "D-[dir2text_short(direction)]"
-
- for(var/obj/structure/transit_tube/tube in location)
- if(tube.icon_state == state)
- return
-
- var/obj/structure/transit_tube/tube = new(location)
- tube.icon_state = state
- tube.init_dirs()
-
-
-
-// Uses a list() to cache return values. Since they should
-// never be edited directly, all tubes with a certain
-// icon_state can just reference the same list. In theory,
-// reduces memory usage, and improves CPU cache usage.
-// In reality, I don't know if that is quite how BYOND works,
-// but it is probably safer to assume the existence of, and
-// rely on, a sufficiently smart compiler/optimizer.
-/obj/structure/transit_tube/proc/parse_dirs(text)
- var/global/list/direction_table = list()
-
- if(text in direction_table)
- return direction_table[text]
-
- var/list/split_text = splittext(text, "-")
-
- // If the first token is D, the icon_state represents
- // a purely decorative tube, and doesn't actually
- // connect to anything.
- if(split_text[1] == "D")
- direction_table[text] = list()
- return null
-
- var/list/directions = list()
-
- for(var/text_part in split_text)
- var/direction = text2dir_extended(text_part)
-
- if(direction > 0)
- directions += direction
-
- direction_table[text] = directions
- return directions
-
-
-
-// A copy of text2dir, extended to accept one and two letter
-// directions, and to clearly return 0 otherwise.
-/obj/structure/transit_tube/proc/text2dir_extended(direction)
- switch(uppertext(direction))
- if("NORTH", "N")
- return 1
- if("SOUTH", "S")
- return 2
- if("EAST", "E")
- return 4
- if("WEST", "W")
- return 8
- if("NORTHEAST", "NE")
- return 5
- if("NORTHWEST", "NW")
- return 9
- if("SOUTHEAST", "SE")
- return 6
- if("SOUTHWEST", "SW")
- return 10
-
-
-
-// A copy of dir2text, which returns the short one or two letter
-// directions used in tube icon states.
-/obj/structure/transit_tube/proc/dir2text_short(direction)
- switch(direction)
- if(1)
- return "N"
- if(2)
- return "S"
- if(4)
- return "E"
- if(8)
- return "W"
- if(5)
- return "NE"
- if(6)
- return "SE"
- if(9)
- return "NW"
- if(10)
- return "SW"
+/obj/structure/transit_tube/cap/has_entrance(from_dir)
+ return FALSE
+/obj/structure/transit_tube/cap/create_tube_overlay()
+ // cap sprites already have overlays
+ return
diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
index 12f187df28e..a08dd320650 100644
--- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
+++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
@@ -1,3 +1,6 @@
+#define MOVE_ANIMATION_STAGE_ONE 1
+#define MOVE_ANIMATION_STAGE_TWO 2
+
/obj/structure/transit_tube_pod
icon = 'icons/obj/pipes/transit_tube_pod.dmi'
icon_state = "pod"
@@ -6,9 +9,25 @@
density = TRUE
var/moving = FALSE
var/datum/gas_mixture/air_contents = new()
+ /// The tube we're currently traveling through
+ var/obj/structure/transit_tube/current_tube = null
+ /// The direction of our next transit from pipe to pipe. Stored between process calls here.
+ var/next_dir
+ /// The location of our next target tube. Stored same as above
+ var/next_loc
+ /// How long to wait when entering a new tube
+ var/enter_delay = 0
+ /// How long to wait when exiting a new tube
+ var/exit_delay
+ /// The next time we'll be moving
+ COOLDOWN_DECLARE(move_cooldown)
+ /// The move animation mode for the next processing tick
+ var/current_move_anim_mode = MOVE_ANIMATION_STAGE_ONE
+ /// Icon state in use while we're occupied
+ var/occupied_icon_state = "pod_occupied"
-/obj/structure/transit_tube_pod/New(loc)
- ..(loc)
+/obj/structure/transit_tube_pod/Initialize(mapload)
+ . = ..()
air_contents.oxygen = MOLES_O2STANDARD * 2
air_contents.nitrogen = MOLES_N2STANDARD
@@ -18,9 +37,16 @@
spawn(5)
follow_tube()
+/obj/structure/transit_tube_pod/update_icon_state()
+ . = ..()
+ icon_state = length(contents) ? occupied_icon_state : initial(icon_state)
+
+/obj/structure/transit_tube_pod/proc/stop_following()
+ STOP_PROCESSING(SStransit_tube, src)
+
/obj/structure/transit_tube_pod/Destroy()
- for(var/atom/movable/AM in contents)
- AM.forceMove(get_turf(src))
+ empty_pod()
+ stop_following()
return ..()
/obj/structure/transit_tube_pod/Process_Spacemove()
@@ -28,66 +54,111 @@
return TRUE
else return ..()
+/obj/structure/transit_tube_pod/proc/empty_pod(atom/location)
+ if(!location)
+ location = get_turf(src)
+ for(var/atom/movable/M in contents)
+ M.forceMove(location)
+ update_appearance()
+
+/obj/structure/transit_tube_pod/crowbar_act(mob/living/user, obj/item/I)
+ . = ..()
+ if(moving)
+ return
+
+ if(length(contents))
+ I.play_tool_sound(src)
+ user.visible_message("[user] pries [src] open.")
+ empty_pod()
+
+/obj/structure/transit_tube_pod/process()
+ ..()
+
+ if(!COOLDOWN_FINISHED(src, move_cooldown))
+ return
+
+ var/move_result = move_animation(current_move_anim_mode)
+ if(isnull(move_result))
+ if(isnull(current_tube) || (!(dir in current_tube.directions()) && !(reverse_direction(dir) in current_tube.directions())))
+ outside_tube()
+ return PROCESS_KILL
+
+ current_move_anim_mode = move_result
+
+/obj/structure/transit_tube_pod/proc/outside_tube()
+ var/list/savedcontents = contents.Copy()
+ var/saveddir = dir
+ var/turf/destination = get_edge_target_turf(src, saveddir)
+ visible_message("[src] ejects its insides out!")
+ for(var/i in savedcontents)
+ var/atom/movable/AM = i
+ AM.throw_at(destination, rand(1, 3), 5)
+
+
+/obj/structure/transit_tube_pod/proc/move_animation(stage = MOVE_ANIMATION_STAGE_ONE)
+ if(stage == MOVE_ANIMATION_STAGE_ONE)
+ next_dir = current_tube.get_exit(dir)
+
+ if(!next_dir)
+ moving = FALSE
+ density = TRUE
+ return
+ exit_delay = current_tube.exit_delay
+ next_loc = get_step(src, next_dir)
+ current_tube = null
+ for(var/obj/structure/transit_tube/tube in next_loc)
+ if(tube.has_entrance(next_dir))
+ current_tube = tube
+ break
+
+ if(isnull(current_tube))
+ setDir(next_dir)
+ Move(get_step(loc, dir), dir) // Allow collisions when leaving the tubes.
+ moving = FALSE
+ density = TRUE
+ return
+
+ enter_delay = current_tube.enter_delay(src, next_dir)
+ if(enter_delay > 0)
+ COOLDOWN_START(src, move_cooldown, enter_delay)
+ return MOVE_ANIMATION_STAGE_TWO
+
+ stage = MOVE_ANIMATION_STAGE_TWO
+
+ if(stage == MOVE_ANIMATION_STAGE_TWO)
+ setDir(next_dir)
+ forceMove(next_loc) // When moving from one tube to another, skip collision and such.
+ density = current_tube.density
+
+ if(current_tube?.should_stop_pod(src, next_dir))
+ current_tube.pod_stopped(src, dir)
+ else
+ COOLDOWN_START(src, move_cooldown, exit_delay)
+ return MOVE_ANIMATION_STAGE_ONE
+
+ density = TRUE
+ moving = FALSE
+
+ return MOVE_ANIMATION_STAGE_ONE
+
+
/obj/structure/transit_tube_pod/proc/follow_tube(reverse_launch)
if(moving)
return
moving = TRUE
- spawn()
- var/obj/structure/transit_tube/current_tube = null
- var/next_dir
- var/next_loc
- var/last_delay = 0
- var/exit_delay
-
- if(reverse_launch)
- dir = turn(dir, 180) // Back it up
-
- for(var/obj/structure/transit_tube/tube in loc)
- if(tube.has_exit(dir))
- current_tube = tube
- break
-
- while(current_tube)
- next_dir = current_tube.get_exit(dir)
-
- if(!next_dir)
- break
-
- exit_delay = current_tube.exit_delay(src, dir)
- last_delay += exit_delay
-
- sleep(exit_delay)
-
- next_loc = get_step(loc, next_dir)
-
- current_tube = null
- for(var/obj/structure/transit_tube/tube in next_loc)
- if(tube.has_entrance(next_dir))
- current_tube = tube
- break
-
- if(current_tube == null)
- setDir(next_dir)
- Move(get_step(loc, dir), dir) // Allow collisions when leaving the tubes.
- break
-
- last_delay = current_tube.enter_delay(src, next_dir)
- sleep(last_delay)
- setDir(next_dir)
- forceMove(next_loc) // When moving from one tube to another, skip collision and such.
- density = current_tube.density
-
- if(current_tube && current_tube.should_stop_pod(src, next_dir))
- current_tube.pod_stopped(src, dir)
- break
-
- density = TRUE
+ for(var/obj/structure/transit_tube/tube in loc)
+ if(tube.has_exit(dir))
+ current_tube = tube
+ break
+ if(!isnull(current_tube))
+ START_PROCESSING(SStransit_tube, src)
+ // move_animation(MOVE_ANIMATION_STAGE_ONE)
+ else
moving = FALSE
-
// Should I return a copy here? If the caller edits or qdel()s the returned
// datum, there might be problems if I don't...
/obj/structure/transit_tube_pod/return_air()
@@ -174,8 +245,8 @@
return
/obj/structure/transit_tube_pod/proc/move_into(atom/movable/A)
- icon_state = "pod_occupied"
A.forceMove(src)
+ update_appearance()
/obj/structure/transit_tube_pod/proc/eject_mindless(direction)
for(var/atom/movable/A in contents)
@@ -188,9 +259,24 @@
/obj/structure/transit_tube_pod/proc/eject(atom/movable/A, direction)
- icon_state = "pod"
A.forceMove(loc)
+ update_appearance()
A.Move(get_step(loc, direction), direction)
if(ismob(A))
var/mob/M = A
M.reset_perspective(null)
+
+
+/obj/structure/transit_tube_pod/dispensed
+ name = "temporary transit tube pod"
+ desc = "Gets you from here to there, and no further."
+ icon_state = "temppod"
+ occupied_icon_state = "temppod_occupied"
+
+
+/obj/structure/transit_tube_pod/dispensed/outside_tube()
+ if(!QDELETED(src))
+ qdel(src)
+
+#undef MOVE_ANIMATION_STAGE_TWO
+#undef MOVE_ANIMATION_STAGE_ONE
diff --git a/icons/obj/pipes/transit_tube.dmi b/icons/obj/pipes/transit_tube.dmi
index bdb1608a313bf3def61520a1193604a32d564dba..aca65d502fdc7c2bbc074c81a3b510af1b6741a6 100644
GIT binary patch
literal 14133
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
z
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
P9N>|*p;m>4L*)Mh%FPXD
literal 8818
zcmYLvcQ~8hA9h4SP@7sMM$HzrwIxz}@7bzVt3}PC#H?Lv?_F9-QM(i&T6@>5y-StY
ziA22m{k`w?{_#BLpU*z`bzk>$&J(Mzt42xAN)7-3C^giT4X@YEe-DJ@`fa%2N_xHY
z1Q?t9C_8vR^Lp;#^W6O<0N|gOFj-55;$#M`uoQ$hNc2=xY8lx*P}gS8i&fz=(EyyD
z3P139@s%>A#&5N(*s)6XB;{3aL5EJvh{9aKUsD%N*h_WaU#>D~=Ibw|FJ;7b>_0k8
zEnPZ%7GSZA!SZNUKT^=PlBwVQ${_LL<~R$ST*GklcG#ptL}VD`PUH=R9p<_Zsoe37=5{r4zhv9PjpviW_
zZcP}r)8zgV`7FIn3GBPuNI28tETt4kUSlksBj@47R
zG)5ft^RG>O&{`WSR-)%Ne0DOpBZ`!jNDY$X@q3y!uhQ}qh1_;>TJAXPVf6U#+}
zR3ixihpW-hI3(h9iv0*L*piW>#=0N>)1V@Wou3hCX>K1>JlvgI-g7d9l5*5u8~(7boLh}+Lq
z+Xg>UBPHqLN5S+1M&?5<-$3_Vl`s#h02I%)#DH?R=_k0Wm*@K>At88-?%dnEW$k_a
z4P{xY+hw?$6Qs@Zm$I?Z`BoBFlezBuAsZtP6YW4>&zAyA(nt)$%g*=uhi*U=RGnSL
z>`H#Fp%R~QKDcrZ!E`U`kcX5pu7qXkLNk;q)FVS=6f(%Kq)!no?(pSJDK;bUgLqQ@
zn|jJ*l%=418t(0ZYa5mL_oGg(^LKaSe`O~3Sd#^x%vP76m*F(d7?0cd
z*^fMDRN{eO=~gT;9?aO)-pg?#caE2em=d7!i}-hPUtdx2-9^-%FNY}5JJTe9KD}1*
zg)!Lj4{_{bcNU(!Y*ER(@6GpZrdTQZJ{i4Ybm(K|XL@&m|h)Iw1g_|TK9A^$);IFEC-DUmJ
zHvH*;@V8XJ!soaB*G^~7?~E7U{iQ@D`Y*Qw`u%v53fQC6__rx%1ZTtx+A8t(o7=D^
zml*@=nf2z`c~son$6El
zOK1v7tOXYN6YipBdi~@Hi
z>_MP;f3W1Ytg%MjOE+_&8`a%Ms-lL&!c4dZA=_)`Kjn9=MnigK4Vd!I48idD?8xf8
zJ}F(DevdTT0e08`-$vIFR|o6I7p>=eJd8qs&2=2-!k}*t-L}%}
zHWf~8l{$k^k&X3d8=+*TWnmpo8iLXJ+jTQ7iKBo1EJ+B3_JGLp6RDvpzRCGlvwe>Hma
zS?W-fOPamx_MdOknyO&)ZBQX76>-8oE+UJ!lWeI>x~G(&@xXdUW)rOjjxkn`(H)lq
zE4Ih@cCE^^+}vULN|NdWt3KEb&ngG}$>a3T+TcM8x1efMJVc%nS9k~IZM-F?NmB>Z
zzozQe7v(1|*1#{W
zBQ}p@rW-EkP-A%91wOC_@cZ>_H`CE-^BJAu@d55Qkq6!tNOm`(-7q}q??F58Uaq(K
zIj=hNL9FN6a^rT$M$Fej_JV*FqC-8MCWUu^N@`>i4fhKYPIE2G!7=
z0hz22v7xg4aHVS<$!q=cs1z9DFP$1?M~E{)I=qJbQiTAP3u-JR3wic8k-U@q{yc=s
z>pkQ~dEPZG)jRGMg1M^KsbY`U_5h1Mj`
z;lTsLFLwdSH21C17fCPyVqE-<^lM;+ux+|M1-If&ieA_TFGRczGxX}=TwxXR#9x0
zoHD_%l~khH^1rbfn8Ky{?XN!KCachQfw*fl<>Z(=;H3en=2Cr|r^u_%)AqR7xrIjh
z>`dGe<)56wIn6_92%n7QZg^;)E&dix3*goJ<-*R4v3whB-M)}V_
zY%0B`(hhhgJ&4fOX9G|p=@WJ;Qx{V0Kl@cHxF_uh*4^pWHOaCy?kL^IW`B~h
zPq$}K%{^*E#3IiUvu1r8@h3K9LUnYs+Y;;x6?U74l+i12(DR6#M$Q|862$GVG41+@
zBp7+ZHJw+of=g_}8~;XH)p15da6*s9k5@OlZ^08yGm)|ADt>|no4f+I&~5xqqWr*7
zvo{-!#5?=URm&X4y>4kseg{$+=tM+EXGv83z?-2jk;W%S
zIuV6YJ|{l@SbxV!+sRFLZp8WsQVblr)wOjkw+f)B#5sA`T-fMr^s}@wO5UPmn}hlt
zebbT=kKRw{%`%=Yr3PhvW;j^$#x$8VUMIqR0W0$!z_5Een#qy+6#tsTw>2o(S9%ol
zMn>-mD_Md69(on;AjF2sNsd-?q&kM%v{`
zTy1Pm^eNfL3hai!6QrXNmx;~I-
z!Tdx8`ZPaeq5)m6zfI?QO}ld6L?sCJVU#U#PNXg;cF;6<4sgy8sgM30w0WRIgnp)t
zpA5pCr9TjS%U|K{6-WW>pXuS|R?(GH6~x<4u93&n-Y8)*=_}UAuJHO8c)p)M*0>yT
zHA?!Xr4Pw*^_8P2v|O2CZ4gq`CCLAtHlBV^s~<8`1Z;DOE$>6J6AXyRV>FfJzvWa?
zAwkDC(+aC^l36BM#4@**O}K1{Q6`e3MR?zHU-@Fxzyh39|svFBxSLJ}@0G($a0Pbyv*Oc77BMhO6
zI_Rc(yNb1+xkpz!VZ>@W`&UzMNYCfdiKS3p0~_FIYD~NR&
zx`#_*PKvR9QPs-dmiq84SwV;mTq1v=9F{aup<0S)qn3TaUb{vP{m|iWIpf_nQL`%OkQhw8^pbkebCe2e^{hq$(-@k&nbTAln}+)w;+X?o>A#}&?uBvYk3~x7+dKyL=dIY_dG6;vYM~RDVrv%T&Av;oD6SLnBq;nB
zo*u}O&Q)r9;~5ybl!dIhS3aPSBBmojH2gM#!FY7zRU3JvK1XwfUT2!kH~ij^g01Y|
zswib<>t_T+N?AA`JH{`LrddW~Poh1OU*b166f9KXL`4~?p9N9KS5^_-)?5FUi&&uU@MC#m?3O+4eHGZY0}BcSI(Xf8d*QuVYWJpg;y
z)Unq<;4?OAlONGCn+JE;AHUIq_P;;YuW;Jek61P(BacLu!+;1`d#WTB3YAV66R$Ra
zB`nS8b3vy6ZbE7}wfhh>_G#4Jrdf2NJ&asnO2RL0d>|Y3hz!IO{PO~`5S?0>kKw;{
z=V`URYo0N}--zI`rJbQ{nqSgYmT3G4JSEYhuu=hfG3x#pYTG!r_`MEjcJ?_h7
zE+-gjm35@1S)-v`GO+sdFwq!0;xi=?BoIcEaY}nn0?|z=vteVAEA2LLrr|vlcV+%T
zQMn=dOX;VA?1w)%(rsQ%3YI4(kzeRmkddV5U+8X`4}s(C<>~ZKhgvl|0iIQVc+lbg
z)jYJ<6jT1?HLv8dXNSE})Pk{dhtXX+t_>;NC&%=`_vj?N+pTq0O?~ALsKll&+A_|l
z8zoSuJH7GPf7AqYQu)e2@mp+z?tz#%{dizGdOwSW*T>G{(~mObzWf!y~T2qJmK&|N!LsoHmZb7-&K(C(~LWFw@!s;OA`@vAR{0tg+TOzD3$v;ZS{|BgUtI(LTE9gg=
z``RW2Z>0efn0Ct|tt*|=7{^8Zf{%#Uw0_OH91zr7=6@AeEr1@2@Z-7Vj^w;bh7GXU{)%%DHQd?DZ
z#v`aZ6I?2t#R!%hKS{vs=!-#*GU6y!4Xp3Lth(I6C8>
z@Do8L2C9IaU(bsAV^cfQ;fmpbgZV;_T#pwCpHh5&C*Pd_`s>{JHzOtl2HxHApuc|O
z2^l)q4e(q?t%L5nwCLZm4H-y#9jBw@TM5QsUiM$HAvjpm79$OFeoM%Otv5qxT$?J^S#_vT6S<1Vj;SZb)pY@y>e*4&~oVw~FA74V$h
zxs=!@#;r^;#x0=%Dhp@66bu3t*6M|+h^-Z7-N5C!qUSah&xKj0+iXQArD1IvHBNxZ
zT_HROsPAGBdxx{?*+C(NLOTU&yLNcj=edGju{z_s(AqpK|IO|WL0F*Cc$6x7)lD&<
zwP?B(RijA!KroDg(`|Uk`ioyOPgAj4#%%t4jx&-ZOeAmwl(C6Y@MJ!Fh1nxsB{CHQ
z!P=DamV3VxI{8?6ViuXwlk{f+sA*&167A+exR(n}JUj_V%X%}pa*99)YL#k{Z^Eat
zc6Yqvi{wE)5kUCQYgE$}nYyf&E$cfOkdZ}Fa(<4b6Bt!u@R8*ih#3KB#A-TLC!TqO
zT2V;_6j$GEXJs^AIrQ<t1f8
zcan0tEd}=qhHEO&$csi$BTYtn%^R)Xz{@VotuXvj(U*VsxF~cGGZCM$61?RJ)T2@U
z+ZrO7w#zDHl3SrPQa|}vAsYs2S&uTu>`Mh7sDOd_8n?&d{$*9@j|y7C&A0iu5MYO^
zZ~6RP`C9t+YT3_p(u+E8t)Q&c$jHI9FGX$!cy8D|!q7}eXU7=R{-&XtL8E&V4kh>W
z?w=8KQQP#;j%u`b^o+x-pCoD9CRO?+34|)ZuHY^BsziY4tsgMrm#Tct@Lf5svBs`{
zemuI!d51o~)dPB{RsJG_)K50cs30}(&P+N6jHASTPNIxkbm@%Dy|v!kBb&>f!qb0S
z`IN4e!J+IP)Tz5;a3fAEgbjg7K^$o!0y0^w!~pvMWDS__{s&N
zAEH>al#)&sd6_=D5j51Ig38jBO)%(&^6<3KcC!2$?ObpukESKtLwglakZ0@6;}
z^Xr@6K@4S^KkBYk&_kSSeF6OXJLTwr92;TyJSQao;zkQFqNj{HlG-{GvAUjk=W5Kj
z`7&1fHbs=)0qQy#B9}U({SYd%%5?LTNRha%DT*4pwpv30R6
z6}*%Y`G46yDN!talvYS~N8mlzp*gPe)~5veRVM=#cDU((le+c%E9Z#2Hs#uSBKT@-
zV}ej|UKoQ8{XC6#L$BV62%$qViaA9r3J@pLt4cjs0_pF|9*%-Ey>;1-n|IF4+ONKw
zKq9T-re$|~gb@Bq{+iKS31tvE4xv95s*w9TSvni$A7Ei#y$MK|V+i>QR{a4=Hi!V~5&?_|DL1f&Zk(C!xnM~tpr}T3A7y}$&HzMRolShd>
z8nCH==rkjDFZof_oPTs*5An*q82-0!Lo%{I<>p=__*Sdt9dXSt>F;M9ZI^OuGLU$
zio_jB(+IF2d-pOs-{m3s)GEhoD4Ll|&VD0jU2YSTBxuKvk>Hx`Ia)t~i3rBsbE9Lwu@p?-Ktzo24PgGD&vrrc*c{=%pm#wNxgvJ=wCP@c5e1&b
zZb^_%C@#&GQc9R7Qr}JA#kwY`J@qhUd
zeTB8rw?KXt@+;7(axa6JKnR_hykFJj?gU_GQRAf!rD;6YsYt3k-?=8(8;$uK*APSA
zhz!i$!V{!3D;;Gl^+Bwc{TdvvWVA%qWM17*!Kp5*n0djhpya_K~KrGirt
zR!&2d-E%hzTXR1_t=IW`1h=995xY{05r`!weqa@C;*NhhAcfsHm>`s@Lxd0K28THL
zd7UYs9Maz!n3#NYne&afPr_ADUa6$?Z$jU?CLvi_x5mY)=mmv-=F1J!Y^Sg#sU`KaDjEh0}i2
zc=_%N%anx9Aybsa_u_e^DiLC>Udt8R?Zr3Nx8%YGEwGK(y_seFu#YT(&lWqb4L_o&pDVW&hA?Qnui9*tudtMM85kA7Cz4Jd0~ITT!+3TZ(j`DsX56B
z`9P+;14+}O3~vc@aLr3I(VvsbT75Fgr(Swkrb(~wB&K#~XS9n9SkrQXF*1S!0nLEcJ
zbZ&DeF(iTgN@fIf`q{np`RT)L7C}ROut1m7^4;d`pUA6csLR``04!;M+5VMj1xT+i
z$UGwwF|}-aKFHP3MN!{iydh#(YV%*UPg)|;S2YYrNR3E*whzusn~3n_9boh$4yw}}
zJyCO&N_bkez#l!XT0k|y=G-LxfBkgtBrE7#!89Uqw0m03-k*}7y3N#m>(H|0#L{Jh
z1b6PmV4g**AJrdl8~1*#L@sa?EL~r9(EKa1Y^Y__km#z3!PUn6Zdu`#+~RrM9+nFq
z!dE>+)LERbecm2Au2`Tjxmb9Zz#y0hOk1h1Q6~z~erYYxsu8ePD1|GqC7^O}F60X;
zaSW`I^DfGXU_rTXB4ns|AcHLq44i?Iq1Fap|=GAcews>MyV0<*RpQmaHGLqrvN(rj*S
z(Re3O^qax_OVt}0I=Acv7wTJ|>BpU5YBB0O3F$y)yBcp^a|vMIr76mNP{y!Sm7xe!
z7#!}#&%o~w*S$A)VH18y)@Ar%6?CjPlgte^3Z+B%Rs)FnhBkhW42;`k
zu$ztk6atK~`3rwiPYxFfy)AXS8=Ohto2%u@1<-4+@Ta@*`J6i;u0dD^;Kl6So{i0$
z42bxv=4@p4J|=)rS^6gb3od@)|4+}T8b#95uDUiiY
zA;Z!la{Z{$;Pa2MqJ#~ksqR>cI^?X@&(x~7)*8PyaDUcLV`FKU{(NQj+kus50GTRe
zP-rJH<~W`~upG#+T0bb&X1&m$fv~o;7z#%aY7nawYtRX+%lS{@d4@N?FTZ)V<14;+
zWf_2gEjltj{?eAhl)RF4@aI;ou;C12(VmS^XLS0(!`W??%~^VtQW6;A^~Wq=qgt$+Jyff+IkqM
diff --git a/icons/obj/pipes/transit_tube_pod.dmi b/icons/obj/pipes/transit_tube_pod.dmi
index 86070b8ce59a49e316d8aac44362ba5fc18c6242..a0bdb36ec222217403d1403ec331c7a642f171c4 100644
GIT binary patch
delta 8530
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
Td0IgFKLVt$ZK749;TrWn4*`B3
delta 4879
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