diff --git a/code/ZAS/Turf.dm b/code/ZAS/Turf.dm
index bb5eb5050eb..a309cd3a082 100644
--- a/code/ZAS/Turf.dm
+++ b/code/ZAS/Turf.dm
@@ -5,9 +5,9 @@
/turf/var/datum/gas_mixture/air
/turf/simulated/proc/update_graphic(list/graphic_add = null, list/graphic_remove = null)
- if(graphic_add && graphic_add.len)
+ if(LAZYLEN(graphic_add))
overlays += graphic_add
- if(graphic_remove && graphic_remove.len)
+ if(LAZYLEN(graphic_remove))
overlays -= graphic_remove
/turf/proc/update_air_properties()
diff --git a/code/ZAS/Zone.dm b/code/ZAS/Zone.dm
index da39b868d3a..18c5ab28999 100644
--- a/code/ZAS/Zone.dm
+++ b/code/ZAS/Zone.dm
@@ -77,7 +77,8 @@ Class Procs:
fire_tiles.Add(T)
air_master.active_fire_zones |= src
if(fuel) fuel_objs += fuel
- T.update_graphic(air.graphic)
+ if(air.graphic)
+ T.update_graphic(air.graphic)
/zone/proc/remove(turf/simulated/T)
#ifdef ZASDBG
@@ -92,7 +93,8 @@ Class Procs:
var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in T
fuel_objs -= fuel
T.zone = null
- T.update_graphic(graphic_remove = air.graphic)
+ if(air.graphic)
+ T.update_graphic(graphic_remove = air.graphic)
if(contents.len)
air.group_multiplier = contents.len
else
@@ -106,9 +108,11 @@ Class Procs:
ASSERT(!into.invalid)
#endif
c_invalidate()
+ var/list/air_graphic = air.graphic // Cache for sanic speed
for(var/turf/simulated/T in contents)
into.add(T)
- T.update_graphic(graphic_remove = air.graphic)
+ if(air_graphic)
+ T.update_graphic(graphic_remove = air_graphic)
#ifdef ZASDBG
T.dbg(merged)
#endif
@@ -131,8 +135,10 @@ Class Procs:
/zone/proc/rebuild()
if(invalid) return //Short circuit for explosions where rebuild is called many times over.
c_invalidate()
+ var/list/air_graphic = air.graphic // Cache for sanic speed
for(var/turf/simulated/T in contents)
- T.update_graphic(graphic_remove = air.graphic) //we need to remove the overlays so they're not doubled when the zone is rebuilt
+ if(air_graphic)
+ T.update_graphic(graphic_remove = air_graphic) //we need to remove the overlays so they're not doubled when the zone is rebuilt
//T.dbg(invalid_zone)
T.needs_air_update = 0 //Reset the marker so that it will be added to the list.
air_master.mark_for_update(T)
diff --git a/code/controllers/emergency_shuttle_controller.dm b/code/controllers/emergency_shuttle_controller.dm
index 5b1b6a60d15..7fb3a56c61f 100644
--- a/code/controllers/emergency_shuttle_controller.dm
+++ b/code/controllers/emergency_shuttle_controller.dm
@@ -22,6 +22,10 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle
var/datum/announcement/priority/emergency_shuttle_called = new(0, new_sound = sound('sound/AI/shuttlecalled.ogg'))
var/datum/announcement/priority/emergency_shuttle_recalled = new(0, new_sound = sound('sound/AI/shuttlerecalled.ogg'))
+/datum/emergency_shuttle_controller/New()
+ escape_pods = list()
+ ..()
+
/datum/emergency_shuttle_controller/proc/process()
if (wait_for_launch)
if (evac && auto_recall && world.time >= auto_recall_time)
diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm
index 8a22539f51d..d881a65a4a2 100644
--- a/code/controllers/shuttle_controller.dm
+++ b/code/controllers/shuttle_controller.dm
@@ -15,8 +15,13 @@ var/global/datum/shuttle_controller/shuttle_controller
//This is called by gameticker after all the machines and radio frequencies have been properly initialized
/datum/shuttle_controller/proc/setup_shuttle_docks()
- for(var/shuttle_tag in shuttles)
- var/datum/shuttle/shuttle = shuttles[shuttle_tag]
+// for(var/shuttle_tag in shuttles)
+// var/datum/shuttle/shuttle = shuttles[shuttle_tag]
+ for(var/shuttle_type in subtypesof(/datum/shuttle))
+ var/datum/shuttle/shuttle = shuttle_type
+ if(initial(shuttle.category) == shuttle_type)
+ continue
+ shuttle = new shuttle()
shuttle.init_docking_controllers()
shuttle.dock() //makes all shuttles docked to something at round start go into the docked state
@@ -28,389 +33,3 @@ var/global/datum/shuttle_controller/shuttle_controller
shuttles = list()
process_shuttles = list()
- var/datum/shuttle/ferry/shuttle
-
- // Escape shuttle and pods
- shuttle = new/datum/shuttle/ferry/emergency()
- shuttle.location = 1
- shuttle.warmup_time = 10
- shuttle.area_offsite = locate(/area/shuttle/escape/centcom)
- shuttle.area_station = locate(/area/shuttle/escape/station)
- shuttle.area_transition = locate(/area/shuttle/escape/transit)
- shuttle.docking_controller_tag = "escape_shuttle"
- shuttle.dock_target_station = "escape_dock"
- shuttle.dock_target_offsite = "centcom_dock"
- shuttle.transit_direction = NORTH
- shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN
- //shuttle.docking_controller_tag = "supply_shuttle"
- //shuttle.dock_target_station = "cargo_bay"
- shuttles["Escape"] = shuttle
- process_shuttles += shuttle
-
- shuttle = new/datum/shuttle/ferry/escape_pod()
- shuttle.location = 0
- shuttle.warmup_time = 0
- shuttle.area_station = locate(/area/shuttle/escape_pod1/station)
- shuttle.area_offsite = locate(/area/shuttle/escape_pod1/centcom)
- shuttle.area_transition = locate(/area/shuttle/escape_pod1/transit)
- shuttle.docking_controller_tag = "escape_pod_1"
- shuttle.dock_target_station = "escape_pod_1_berth"
- shuttle.dock_target_offsite = "escape_pod_1_recovery"
- shuttle.transit_direction = NORTH
- shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one
- process_shuttles += shuttle
- shuttles["Escape Pod 1"] = shuttle
-
- shuttle = new/datum/shuttle/ferry/escape_pod()
- shuttle.location = 0
- shuttle.warmup_time = 0
- shuttle.area_station = locate(/area/shuttle/escape_pod2/station)
- shuttle.area_offsite = locate(/area/shuttle/escape_pod2/centcom)
- shuttle.area_transition = locate(/area/shuttle/escape_pod2/transit)
- shuttle.docking_controller_tag = "escape_pod_2"
- shuttle.dock_target_station = "escape_pod_2_berth"
- shuttle.dock_target_offsite = "escape_pod_2_recovery"
- shuttle.transit_direction = NORTH
- shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one
- process_shuttles += shuttle
- shuttles["Escape Pod 2"] = shuttle
-
- shuttle = new/datum/shuttle/ferry/escape_pod()
- shuttle.location = 0
- shuttle.warmup_time = 0
- shuttle.area_station = locate(/area/shuttle/escape_pod3/station)
- shuttle.area_offsite = locate(/area/shuttle/escape_pod3/centcom)
- shuttle.area_transition = locate(/area/shuttle/escape_pod3/transit)
- shuttle.docking_controller_tag = "escape_pod_3"
- shuttle.dock_target_station = "escape_pod_3_berth"
- shuttle.dock_target_offsite = "escape_pod_3_recovery"
- shuttle.transit_direction = NORTH
- shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one
- process_shuttles += shuttle
- shuttles["Escape Pod 3"] = shuttle
-
- shuttle = new/datum/shuttle/ferry/escape_pod()
- shuttle.location = 0
- shuttle.warmup_time = 0
- shuttle.area_station = locate(/area/shuttle/escape_pod4/station)
- shuttle.area_offsite = locate(/area/shuttle/escape_pod4/centcom)
- shuttle.area_transition = locate(/area/shuttle/escape_pod4/transit)
- shuttle.docking_controller_tag = "escape_pod_4"
- shuttle.dock_target_station = "escape_pod_4_berth"
- shuttle.dock_target_offsite = "escape_pod_4_recovery"
- shuttle.transit_direction = NORTH //should this be SOUTH? I have no idea.
- shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one
- process_shuttles += shuttle
- shuttles["Escape Pod 4"] = shuttle
-
- shuttle = new/datum/shuttle/ferry/escape_pod()
- shuttle.location = 0
- shuttle.warmup_time = 0
- shuttle.area_station = locate(/area/shuttle/escape_pod5/station)
- shuttle.area_offsite = locate(/area/shuttle/escape_pod5/centcom)
- shuttle.area_transition = locate(/area/shuttle/escape_pod5/transit)
- shuttle.docking_controller_tag = "escape_pod_5"
- shuttle.dock_target_station = "escape_pod_5_berth"
- shuttle.dock_target_offsite = "escape_pod_5_recovery"
- shuttle.transit_direction = NORTH //should this be WEST? I have no idea.
- shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one
- process_shuttles += shuttle
- shuttles["Escape Pod 5"] = shuttle
-
- shuttle = new/datum/shuttle/ferry/escape_pod()
- shuttle.location = 0
- shuttle.warmup_time = 0
- shuttle.area_station = locate(/area/shuttle/escape_pod6/station)
- shuttle.area_offsite = locate(/area/shuttle/escape_pod6/centcom)
- shuttle.area_transition = locate(/area/shuttle/escape_pod6/transit)
- shuttle.docking_controller_tag = "escape_pod_6"
- shuttle.dock_target_station = "escape_pod_6_berth"
- shuttle.dock_target_offsite = "escape_pod_6_recovery"
- shuttle.transit_direction = NORTH //should this be WEST? I have no idea.
- shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one
- process_shuttles += shuttle
- shuttles["Escape Pod 6"] = shuttle
-
- shuttle = new/datum/shuttle/ferry/escape_pod()
- shuttle.location = 0
- shuttle.warmup_time = 0
- shuttle.area_station = locate(/area/shuttle/cryo/station)
- shuttle.area_offsite = locate(/area/shuttle/cryo/centcom)
- shuttle.area_transition = locate(/area/shuttle/cryo/transit)
- shuttle.docking_controller_tag = "cryostorage_shuttle"
- shuttle.dock_target_station = "cryostorage_shuttle_berth"
- shuttle.dock_target_offsite = "cryostorage_shuttle_recovery"
- shuttle.transit_direction = NORTH //should this be WEST? I have no idea.
- shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one
- process_shuttles += shuttle
- shuttles["Cryostorage Shuttle"] = shuttle
-
- shuttle = new/datum/shuttle/ferry/escape_pod()
- shuttle.location = 0
- shuttle.warmup_time = 0
- shuttle.area_station = locate(/area/shuttle/large_escape_pod1/station)
- shuttle.area_offsite = locate(/area/shuttle/large_escape_pod1/centcom)
- shuttle.area_transition = locate(/area/shuttle/large_escape_pod1/transit)
- shuttle.docking_controller_tag = "large_escape_pod_1"
- shuttle.dock_target_station = "large_escape_pod_1_berth"
- shuttle.dock_target_offsite = "large_escape_pod_1_recovery"
- shuttle.transit_direction = EAST //should this be WEST? I have no idea.
- shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one
- process_shuttles += shuttle
- shuttles["Large Escape Pod 1"] = shuttle
-
- shuttle = new/datum/shuttle/ferry/escape_pod()
- shuttle.location = 0
- shuttle.warmup_time = 0
- shuttle.area_station = locate(/area/shuttle/large_escape_pod2/station)
- shuttle.area_offsite = locate(/area/shuttle/large_escape_pod2/centcom)
- shuttle.area_transition = locate(/area/shuttle/large_escape_pod2/transit)
- shuttle.docking_controller_tag = "large_escape_pod_2"
- shuttle.dock_target_station = "large_escape_pod_2_berth"
- shuttle.dock_target_offsite = "large_escape_pod_2_recovery"
- shuttle.transit_direction = EAST //should this be WEST? I have no idea.
- shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one
- process_shuttles += shuttle
- shuttles["Large Escape Pod 2"] = shuttle
-
- //give the emergency shuttle controller it's shuttles
- emergency_shuttle.shuttle = shuttles["Escape"]
- emergency_shuttle.escape_pods = list(
- shuttles["Escape Pod 1"],
- shuttles["Escape Pod 2"],
- shuttles["Escape Pod 3"],
- shuttles["Escape Pod 4"],
- shuttles["Escape Pod 5"],
- shuttles["Escape Pod 6"],
- shuttles["Cryostorage Shuttle"],
- shuttles["Large Escape Pod 1"],
- shuttles["Large Escape Pod 2"],
- )
-
- // Supply shuttle
- shuttle = new/datum/shuttle/ferry/supply()
- shuttle.location = 1
- shuttle.warmup_time = 10
- shuttle.area_offsite = locate(/area/supply/dock)
- shuttle.area_station = locate(/area/supply/station)
- shuttle.docking_controller_tag = "supply_shuttle"
- shuttle.dock_target_station = "cargo_bay"
- shuttles["Supply"] = shuttle
- process_shuttles += shuttle
-
- supply_controller.shuttle = shuttle
-
- // Admin shuttles.
- shuttle = new()
- shuttle.location = 1
- shuttle.warmup_time = 10
- shuttle.area_offsite = locate(/area/shuttle/transport1/centcom)
- shuttle.area_station = locate(/area/shuttle/transport1/station)
- shuttle.docking_controller_tag = "centcom_shuttle"
- shuttle.dock_target_station = "centcom_shuttle_dock_airlock"
- shuttle.dock_target_offsite = "centcom_shuttle_bay"
- shuttles["CentCom"] = shuttle
- process_shuttles += shuttle
- /* VOREStation Removal - This is a multishuttle now and is down there with them.
- shuttle = new()
- shuttle.location = 1
- shuttle.warmup_time = 10 //want some warmup time so people can cancel.
- shuttle.area_offsite = locate(/area/shuttle/administration/centcom)
- shuttle.area_station = locate(/area/shuttle/administration/station)
- shuttle.docking_controller_tag = "admin_shuttle"
- shuttle.dock_target_station = "admin_shuttle_dock_airlock"
- shuttle.dock_target_offsite = "admin_shuttle_bay"
- shuttles["Administration"] = shuttle
- process_shuttles += shuttle
- VOREStation Removal End */
- shuttle = new()
- shuttle.location = 1
- shuttle.warmup_time = 10 //want some warmup time so people can cancel.
- shuttle.area_offsite = locate(/area/shuttle/trade/centcom)
- shuttle.area_station = locate(/area/shuttle/trade/station)
- shuttle.docking_controller_tag = "trade_shuttle"
- shuttle.dock_target_station = "trade_shuttle_dock_airlock"
- shuttle.dock_target_offsite = "trade_shuttle_bay"
- shuttles["Trade"] = shuttle
- process_shuttles += shuttle
-
- shuttle = new()
- shuttle.area_offsite = locate(/area/shuttle/alien/base)
- shuttle.area_station = locate(/area/shuttle/alien/mine)
- shuttles["Alien"] = shuttle
- //process_shuttles += shuttle //don't need to process this. It can only be moved using admin magic anyways.
-
- // Public shuttles
- shuttle = new()
- shuttle.warmup_time = 10
- shuttle.area_offsite = locate(/area/shuttle/constructionsite/site)
- shuttle.area_station = locate(/area/shuttle/constructionsite/station)
- shuttle.docking_controller_tag = "engineering_shuttle"
- shuttle.dock_target_station = "engineering_dock_airlock"
- shuttle.dock_target_offsite = "edock_airlock"
- shuttles["Engineering"] = shuttle
- process_shuttles += shuttle
-
- shuttle = new()
- shuttle.warmup_time = 10
- shuttle.area_offsite = locate(/area/shuttle/mining/outpost)
- shuttle.area_station = locate(/area/shuttle/mining/station)
- shuttle.docking_controller_tag = "mining_shuttle"
- shuttle.dock_target_station = "mining_dock_airlock"
- shuttle.dock_target_offsite = "mining_outpost_airlock"
- shuttles["Mining"] = shuttle
- process_shuttles += shuttle
-
- shuttle = new()
- shuttle.warmup_time = 10
- shuttle.area_offsite = locate(/area/shuttle/research/outpost)
- shuttle.area_station = locate(/area/shuttle/research/station)
- shuttle.docking_controller_tag = "research_shuttle"
- shuttle.dock_target_station = "research_dock_airlock"
- shuttle.dock_target_offsite = "research_outpost_dock"
- shuttles["Research"] = shuttle
- process_shuttles += shuttle
-
- // ERT Shuttle
- var/datum/shuttle/ferry/multidock/specops/ERT = new()
- ERT.location = 0
- ERT.warmup_time = 10
- ERT.area_offsite = locate(/area/shuttle/specops/station) //centcom is the home station, the player station is offsite
- ERT.area_station = locate(/area/shuttle/specops/centcom)
- ERT.docking_controller_tag = "specops_shuttle_port"
- ERT.docking_controller_tag_station = "specops_shuttle_port"
- ERT.docking_controller_tag_offsite = "specops_shuttle_fore"
- ERT.dock_target_station = "specops_centcom_dock"
- ERT.dock_target_offsite = "specops_dock_airlock"
- shuttles["Special Operations"] = ERT
- process_shuttles += ERT
-
- //Skipjack.
- var/datum/shuttle/multi_shuttle/VS = new/datum/shuttle/multi_shuttle()
- VS.origin = locate(/area/skipjack_station/start)
-
- VS.destinations = list(
- "Fore Starboard Solars" = locate(/area/skipjack_station/northeast_solars),
- "Fore Port Solars" = locate(/area/skipjack_station/northwest_solars),
- "Aft Starboard Solars" = locate(/area/skipjack_station/southeast_solars),
- "Aft Port Solars" = locate(/area/skipjack_station/southwest_solars), // Vorestation edit
- "Station Arrivals Dock" = locate(/area/skipjack_station/southwest_solars),
- "Mining Station" = locate(/area/skipjack_station/mining)
- )
-
- VS.announcer = "Colony Automated Radar Array"
- VS.arrival_message = "Attention. Unidentified object approaching the colony."
- VS.departure_message = "Attention. Unidentified object exiting local space. Unidentified object expected to escape Virgo-3's gravity well with current velocity." // Vorestation edit
- VS.interim = locate(/area/skipjack_station/transit)
-
- VS.warmup_time = 0
- shuttles["Skipjack"] = VS
-
- //Nuke Ops shuttle.
- var/datum/shuttle/multi_shuttle/MS = new/datum/shuttle/multi_shuttle()
- MS.origin = locate(/area/syndicate_station/start)
- MS.start_location = "Mercenary Base"
-
- MS.destinations = list(
- "Northwest of the station" = locate(/area/syndicate_station/northwest),
- "North of the station" = locate(/area/syndicate_station/north),
- "Northeast of the station" = locate(/area/syndicate_station/northeast),
- "Southwest of the station" = locate(/area/syndicate_station/southwest),
- "South of the station" = locate(/area/syndicate_station/south),
- "Southeast of the station" = locate(/area/syndicate_station/southeast),
- "Telecomms Satellite" = locate(/area/syndicate_station/commssat),
- "Mining Station" = locate(/area/syndicate_station/mining),
- "Arrivals dock" = locate(/area/syndicate_station/arrivals_dock),
- )
-
- MS.docking_controller_tag = "merc_shuttle"
- MS.destination_dock_targets = list(
- "Mercenary Base" = "merc_base",
- "Arrivals dock" = "nuke_shuttle_dock_airlock",
- )
-
- MS.announcer = "Automated Traffic Control"
- MS.arrival_message = "Attention. A vessel is approaching the colony."
- MS.departure_message = "Attention. A vessel is now leaving from the colony."
- MS.interim = locate(/area/syndicate_station/transit)
-
- MS.warmup_time = 0
- shuttles["Mercenary"] = MS
-
- // VOREStation Add - The admin shuttle is a multishuttle now.
- //Centcom admin shuttle.
- var/datum/shuttle/multi_shuttle/CC = new/datum/shuttle/multi_shuttle()
- CC.legit = 1
- CC.origin = locate(/area/shuttle/administration/centcom)
- CC.start_location = "Central Command (AS)"
-
- CC.destinations = list(
- "Deep Space (AS)" = locate(/area/shuttle/administration/transit),
- "NSS Adephagia (AS)" = locate(/area/shuttle/administration/station)
- )
-
- CC.docking_controller_tag = "admin_shuttle"
- CC.destination_dock_targets = list(
- "Central Command (AS)" = "admin_shuttle_bay",
- "NSS Adephagia (AS)" = "admin_shuttle_dock_airlock"
- )
-
- var/area/ccaway_dest = locate(/area/shuttle/administration/away_mission)
- if(ccaway_dest.contents.len) //Otherwise this is an empty imaginary area
- CC.destinations["Unknown Location [rand(1000,9999)]"] = ccaway_dest
-
- CC.announcer = "Automated Traffic Control"
- //These seem backwards because they are written from the perspective of the merc and vox ships
- CC.departure_message = "Attention. A Centcom vessel is approaching the colony."
- CC.arrival_message = "Attention. A Centcom vessel is now leaving from the colony."
-
- CC.move_time = 0
- CC.warmup_time = 0
- shuttles["Administration"] = CC
- //VOREStation Add End - Admin shuttle.
- //////////////////////////////////////////////////////////////
- //VOREStation Add - Away-mission shuttle
- var/datum/shuttle/multi_shuttle/AM = new/datum/shuttle/multi_shuttle()
- AM.legit = 1
- AM.origin = locate(/area/shuttle/awaymission/home)
- AM.start_location = "NSS Adephagia (AM)"
-
- AM.destinations = list(
- "Old Engineering Base (AM)" = locate(/area/shuttle/awaymission/oldengbase)
- )
-
- AM.docking_controller_tag = "awaymission_shuttle"
- AM.destination_dock_targets = list(
- "NSS Adephagia (AM)" = "d1a2_dock_airlock"
- )
-
- var/area/awaym_dest = locate(/area/shuttle/awaymission/away)
- if(awaym_dest.contents.len) //Otherwise this is an empty imaginary area
- AM.destinations["Unknown Location [rand(1000,9999)]"] = awaym_dest
-
- AM.announcer = "Automated Traffic Control"
- //These seem backwards because they are written from the perspective of the merc and vox ships
- AM.departure_message = "Attention. The away mission vessel is approaching the colony."
- AM.arrival_message = "Attention. The away mission vessel is now leaving from the colony."
- AM.interim = locate(/area/shuttle/awaymission/warp)
-
- AM.move_time = 60
- AM.warmup_time = 8
- shuttles["AwayMission"] = AM
- //VOREStation Add End - Away-mission shuttle
- ///////////////////////////////////////////////
- //VOREStation Add - Belter Shuttle
- shuttle = new/datum/shuttle/ferry()
- shuttle.location = 0
- shuttle.warmup_time = 6
- shuttle.area_station = locate(/area/shuttle/belter/station)
- shuttle.area_offsite = locate(/area/shuttle/belter/belt/zone1)
- shuttle.area_transition = locate(/area/shuttle/belter/transit)
- shuttle.docking_controller_tag = "belter_docking"
- shuttle.dock_target_station = "belter_nodocking" //Fake tags to prevent the shuttle from opening doors.
- shuttle.dock_target_offsite = "belter_nodocking"
- shuttle.transit_direction = EAST
- shuttle.move_time = 60 + rand(10,40)
- process_shuttles += shuttle
- shuttles["Belter"] = shuttle
- //VOREStation Add End - Belter Shuttle
\ No newline at end of file
diff --git a/code/controllers/shuttle_controller_vr.dm b/code/controllers/shuttle_controller_vr.dm
deleted file mode 100644
index e3cca605141..00000000000
--- a/code/controllers/shuttle_controller_vr.dm
+++ /dev/null
@@ -1,210 +0,0 @@
-
-var/global/datum/shuttle_controller/shuttle_controller
-
-
-/datum/shuttle_controller
- var/list/shuttles //maps shuttle tags to shuttle datums, so that they can be looked up.
- var/list/process_shuttles //simple list of shuttles, for processing
-
-/datum/shuttle_controller/proc/process()
- //process ferry shuttles
- for (var/datum/shuttle/ferry/shuttle in process_shuttles)
- if (shuttle.process_state)
- shuttle.process()
-
-
-//This is called by gameticker after all the machines and radio frequencies have been properly initialized
-/datum/shuttle_controller/proc/setup_shuttle_docks()
- for(var/shuttle_tag in shuttles)
- var/datum/shuttle/shuttle = shuttles[shuttle_tag]
- shuttle.init_docking_controllers()
- shuttle.dock() //makes all shuttles docked to something at round start go into the docked state
-
- for(var/obj/machinery/embedded_controller/C in machines)
- if(istype(C.program, /datum/computer/file/embedded_program/docking))
- C.program.tag = null //clear the tags, 'cause we don't need 'em anymore
-
-/datum/shuttle_controller/New()
- shuttles = list()
- process_shuttles = list()
-
- var/datum/shuttle/ferry/shuttle
-
- //////////////////////////////////////////////////////////////
- // Escape shuttle and pods
- shuttle = new/datum/shuttle/ferry/emergency()
- shuttle.location = 1 // At offsite
- shuttle.warmup_time = 10
- shuttle.area_offsite = locate(/area/shuttle/escape/centcom)
- shuttle.area_station = locate(/area/shuttle/escape/station)
- shuttle.area_transition = locate(/area/shuttle/escape/transit)
- shuttle.docking_controller_tag = "escape_shuttle"
- shuttle.dock_target_station = "escape_dock"
- shuttle.dock_target_offsite = "centcom_dock"
- shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN
- shuttles["Escape"] = shuttle
- process_shuttles += shuttle
-
- //////////////////////////////////////////////////////////////
- shuttle = new/datum/shuttle/ferry/escape_pod()
- shuttle.location = 0 // At station
- shuttle.warmup_time = 0
- shuttle.area_station = locate(/area/shuttle/large_escape_pod1/station)
- shuttle.area_offsite = locate(/area/shuttle/large_escape_pod1/centcom)
- shuttle.area_transition = locate(/area/shuttle/large_escape_pod1/transit)
- shuttle.docking_controller_tag = "large_escape_pod_1"
- shuttle.dock_target_station = "large_escape_pod_1_berth"
- shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one
- process_shuttles += shuttle
- shuttles["Large Escape Pod 1"] = shuttle
-
- //////////////////////////////////////////////////////////////
- shuttle = new/datum/shuttle/ferry/escape_pod()
- shuttle.location = 0 // At station
- shuttle.warmup_time = 0
- shuttle.area_station = locate(/area/shuttle/large_escape_pod2/station)
- shuttle.area_offsite = locate(/area/shuttle/large_escape_pod2/centcom)
- shuttle.area_transition = locate(/area/shuttle/large_escape_pod2/transit)
- shuttle.docking_controller_tag = "large_escape_pod_2"
- shuttle.dock_target_station = "large_escape_pod_2_berth"
- shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one
- process_shuttles += shuttle
- shuttles["Large Escape Pod 2"] = shuttle
-
- //give the emergency shuttle controller it's shuttles
- emergency_shuttle.shuttle = shuttles["Escape"]
- emergency_shuttle.escape_pods = list(
- shuttles["Large Escape Pod 1"],
- shuttles["Large Escape Pod 2"],
- )
-
- //////////////////////////////////////////////////////////////
- // Supply shuttle
- shuttle = new/datum/shuttle/ferry/supply()
- shuttle.location = 1
- shuttle.warmup_time = 10
- shuttle.area_offsite = locate(/area/supply/dock)
- shuttle.area_station = locate(/area/supply/station)
- shuttle.docking_controller_tag = "supply_shuttle"
- shuttle.dock_target_station = "cargo_bay"
- shuttles["Supply"] = shuttle
- process_shuttles += shuttle
-
- supply_controller.shuttle = shuttle
-
- //////////////////////////////////////////////////////////////
- // Trade Ship
- shuttle = new()
- shuttle.location = 1
- shuttle.warmup_time = 10 //want some warmup time so people can cancel.
- shuttle.area_offsite = locate(/area/shuttle/trade/centcom)
- shuttle.area_station = locate(/area/shuttle/trade/station)
- shuttle.docking_controller_tag = "trade_shuttle"
- shuttle.dock_target_station = "trade_shuttle_dock_airlock"
- shuttle.dock_target_offsite = "trade_shuttle_bay"
- shuttles["Trade"] = shuttle
- process_shuttles += shuttle
-
- //////////////////////////////////////////////////////////////
- // Away Mission Shuttle
- var/datum/shuttle/multi_shuttle/AM = new/datum/shuttle/multi_shuttle()
- AM.legit = 1
- AM.origin = locate(/area/shuttle/awaymission/home)
- AM.start_location = "NSS Adephagia (AM)"
-
- AM.destinations = list(
- "Old Engineering Base (AM)" = locate(/area/shuttle/awaymission/oldengbase)
- )
-
- AM.docking_controller_tag = "awaymission_shuttle"
- AM.destination_dock_targets = list(
- "NSS Adephagia (AM)" = "d1a2_dock_airlock"
- )
-
- var/area/awaym_dest = locate(/area/shuttle/awaymission/away)
- if(awaym_dest.contents.len) //Otherwise this is an empty imaginary area
- AM.destinations["Unknown Location [rand(1000,9999)]"] = awaym_dest
-
- AM.announcer = "Automated Traffic Control"
- //These seem backwards because they are written from the perspective of the merc and vox ships
- AM.departure_message = "Attention. The away mission vessel is approaching the colony."
- AM.arrival_message = "Attention. The away mission vessel is now leaving from the colony."
- AM.interim = locate(/area/shuttle/awaymission/warp)
-
- AM.move_time = 60
- AM.warmup_time = 8
- shuttles["AwayMission"] = AM
-
-
- // TODO - Not implemented yet on new map
- ///////////////////////////////////////////////
- //VOREStation Add - Belter Shuttle
- // shuttle = new/datum/shuttle/ferry()
- // shuttle.location = 0
- // shuttle.warmup_time = 6
- // shuttle.area_station = locate(/area/shuttle/belter/station)
- // shuttle.area_offsite = locate(/area/shuttle/belter/belt/zone1)
- // shuttle.area_transition = locate(/area/shuttle/belter/transit)
- // shuttle.docking_controller_tag = "belter_docking"
- // shuttle.dock_target_station = "belter_nodocking" //Fake tags to prevent the shuttle from opening doors.
- // shuttle.dock_target_offsite = "belter_nodocking"
- // shuttle.transit_direction = EAST
- // shuttle.move_time = 60 + rand(10,40)
- // process_shuttles += shuttle
- // shuttles["Belter"] = shuttle
- //VOREStation Add End - Belter Shuttle
-
- //////////////////////////////////////////////////////////////
- // Tether Shuttle
- var/datum/shuttle/ferry/tether_backup/TB = new()
- TB.location = 1 // At offsite
- TB.warmup_time = 5
- TB.move_time = 45
- TB.area_offsite = locate(/area/shuttle/tether/surface)
- TB.area_station = locate(/area/shuttle/tether/station)
- TB.area_transition = locate(/area/shuttle/tether/transit)
- TB.crash_areas = list(locate(/area/shuttle/tether/crash1), locate(/area/shuttle/tether/crash2))
- TB.docking_controller_tag = "tether_shuttle"
- TB.dock_target_station = "tether_dock_airlock"
- TB.dock_target_offsite = "tether_pad_airlock"
- shuttles["Tether Backup"] = TB
- process_shuttles += TB
-
- for(var/obj/structure/shuttle/engine/propulsion/E in TB.area_offsite)
- TB.engines += E
- for(var/obj/machinery/computer/shuttle_control/tether_backup/comp in TB.area_offsite)
- TB.computer = comp
- break
-
-
- //////////////////////////////////////////////////////////////
- // Antag Space "Proto Shuttle" Shuttle
- AM = new/datum/shuttle/multi_shuttle()
- AM.docking_controller_tag = "antag_space_shuttle"
- AM.start_location = "Home Base"
- AM.origin = locate(/area/shuttle/antag_space/base)
- AM.interim = locate(/area/shuttle/antag_space/transit)
- AM.destinations = list(
- "Nearby" = locate(/area/shuttle/antag_space/north),
- "Docks" = locate(/area/shuttle/antag_space/docks)
- )
- AM.destination_dock_targets = list("Home Base" = "antag_space_dock")
- AM.move_time = 60
- AM.warmup_time = 8
- shuttles["Proto"] = AM
-
- //////////////////////////////////////////////////////////////
- // Antag Surface "Land Crawler" Shuttle
- AM = new/datum/shuttle/multi_shuttle()
- AM.docking_controller_tag = "antag_ground_shuttle"
- AM.start_location = "Home Base"
- AM.origin = locate(/area/shuttle/antag_ground/base)
- AM.interim = locate(/area/shuttle/antag_ground/transit)
- AM.destinations = list(
- "Solar Array" = locate(/area/shuttle/antag_ground/solars),
- "Mining Outpost" = locate(/area/shuttle/antag_ground/mining)
- )
- AM.destination_dock_targets = list("Home Base" = "antag_ground_dock")
- AM.move_time = 60
- AM.warmup_time = 8
- shuttles["Land Crawler"] = AM
diff --git a/code/datums/repositories/radiation.dm b/code/datums/repositories/radiation.dm
index 00c35324580..4e3259a6de8 100644
--- a/code/datums/repositories/radiation.dm
+++ b/code/datums/repositories/radiation.dm
@@ -23,11 +23,14 @@ var/global/repository/radiation/radiation_repository = new()
. = ..()
/datum/radiation_source/proc/update_rad_power(var/new_power = null)
- if(new_power != null && new_power != rad_power)
+ if(new_power == null || new_power == rad_power)
+ return // No change
+ else if(new_power <= 0)
+ qdel(src) // Decayed to nothing
+ else
rad_power = new_power
- . = 1
- if(. && !flat)
- range = min(round(sqrt(rad_power / config.radiation_lower_limit)), 31) // R = rad_power / dist**2 - Solve for dist
+ if(!flat)
+ range = min(round(sqrt(rad_power / config.radiation_lower_limit)), 31) // R = rad_power / dist**2 - Solve for dist
// Ray trace from all active radiation sources to T and return the strongest effect.
/repository/radiation/proc/get_rads_at_turf(var/turf/T)
@@ -65,6 +68,8 @@ var/global/repository/radiation/radiation_repository = new()
// Add a radiation source instance to the repository. It will override any existing source on the same turf.
/repository/radiation/proc/add_source(var/datum/radiation_source/S)
+ if(!isturf(S.source_turf))
+ return
var/datum/radiation_source/existing = sources_assoc[S.source_turf]
if(existing)
qdel(existing)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index fbef08cd307..05600494cd2 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -814,6 +814,9 @@ About the new airlock wires panel:
update_icon()
return 1
+/obj/machinery/door/airlock/proc/can_remove_electronics()
+ return src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN))))
+
/obj/machinery/door/airlock/attackby(C as obj, mob/user as mob)
//world << text("airlock attackby src [] obj [] mob []", src, C, user)
if(!istype(usr, /mob/living/silicon))
@@ -859,7 +862,7 @@ About the new airlock wires panel:
var/obj/item/weapon/pai_cable/cable = C
cable.plugin(src, user)
else if(!repairing && istype(C, /obj/item/weapon/crowbar))
- if(src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN)))) )
+ if(can_remove_electronics())
playsound(src.loc, 'sound/items/Crowbar.ogg', 75, 1)
user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.")
if(do_after(user,40))
diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm
index 890574d6641..25b49154080 100644
--- a/code/game/turfs/simulated/wall_attacks.dm
+++ b/code/game/turfs/simulated/wall_attacks.dm
@@ -190,6 +190,7 @@
else
user << "You need more welding fuel to complete this task."
return
+ user.update_examine_panel(src)
return
// Basic dismantling.
@@ -243,6 +244,7 @@
if (istype(W, /obj/item/weapon/wirecutters))
playsound(src, 'sound/items/Wirecutter.ogg', 100, 1)
construction_stage = 5
+ user.update_examine_panel(src)
user << "You cut through the outer grille."
update_icon()
return
@@ -253,11 +255,13 @@
if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 5)
return
construction_stage = 4
+ user.update_examine_panel(src)
update_icon()
user << "You unscrew the support lines."
return
else if (istype(W, /obj/item/weapon/wirecutters))
construction_stage = 6
+ user.update_examine_panel(src)
user << "You mend the outer grille."
update_icon()
return
@@ -280,6 +284,7 @@
if(!do_after(user, 60) || !istype(src, /turf/simulated/wall) || construction_stage != 4)
return
construction_stage = 3
+ user.update_examine_panel(src)
update_icon()
user << "You press firmly on the cover, dislodging it."
return
@@ -289,6 +294,7 @@
if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 4)
return
construction_stage = 5
+ user.update_examine_panel(src)
update_icon()
user << "You screw down the support lines."
return
@@ -299,6 +305,7 @@
if(!do_after(user,100) || !istype(src, /turf/simulated/wall) || construction_stage != 3)
return
construction_stage = 2
+ user.update_examine_panel(src)
update_icon()
user << "You pry off the cover."
return
@@ -309,6 +316,7 @@
if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 2)
return
construction_stage = 1
+ user.update_examine_panel(src)
update_icon()
user << "You remove the bolts anchoring the support rods."
return
@@ -329,6 +337,7 @@
if(!do_after(user,70) || !istype(src, /turf/simulated/wall) || construction_stage != 1)
return
construction_stage = 0
+ user.update_examine_panel(src)
update_icon()
user << "The slice through the support rods."
return
diff --git a/code/modules/examine/descriptions/engineering.dm b/code/modules/examine/descriptions/engineering.dm
index c3f9b9b21fa..37e69f16f90 100644
--- a/code/modules/examine/descriptions/engineering.dm
+++ b/code/modules/examine/descriptions/engineering.dm
@@ -25,11 +25,54 @@
Wires can be pulsed remotely with a signaler attached to it. A powersink will also drain any APCs connected to the same wire the powersink is on."
/obj/item/inflatable
- description_info = "Inflate by using it in your hand. The inflatable barrier will inflate on your tile. To deflate it, use the 'deflate' verb."
+ description_info = "Inflate by using it in your hand. The inflatable barrier will inflate on your tile. To deflate it, use the 'deflate' verb. \
+ You can also inflate this on an adjacent tile by clicking the tile."
/obj/structure/inflatable
- description_info = "To remove these safely, use the 'deflate' verb. Hitting these with any objects will probably puncture and break it forever."
+ description_info = "To remove these safely, use the 'deflate' verb, or alt-click on it. Hitting these with any objects will probably puncture and break it forever."
/obj/structure/inflatable/door
description_info = "Click the door to open or close it. It only stops air while closed.
\
To remove these safely, use the 'deflate' verb. Hitting these with any objects will probably puncture and break it forever."
+
+/obj/machinery/door/get_description_interaction()
+ var/list/results = list()
+ if(!repairing && (health < maxhealth) && !(stat & BROKEN))
+ results += "[desc_panel_image("metal sheet")]to start repairing damage (May require different material type)."
+ if(repairing && density)
+ results += "[desc_panel_image("welder")]to finish repairs."
+ results += "[desc_panel_image("crowbar")]to undo adding sheets for repairs."
+
+ return results
+
+/obj/machinery/door/airlock/get_description_interaction()
+ var/list/results = list()
+
+ if(can_remove_electronics())
+ results += "[desc_panel_image("crowbar")]to remove the airlock electronics."
+ else
+ results += "[desc_panel_image("crowbar")]to open or close if unpowered/broken, and unbolted."
+
+ if(welded)
+ results += "[desc_panel_image("welder")]to unweld, allowing it to open again."
+ else
+ results += "[desc_panel_image("welder")]to weld, preventing it from opening."
+
+ if(p_open)
+ results += "[desc_panel_image("screwdriver")]to close the wire panel."
+ results += "[desc_panel_image("wirecutters")]to cut an internal wire while hacking."
+ results += "[desc_panel_image("multitool")]to pulse an internal wire while hacking."
+ else
+ results += "[desc_panel_image("screwdriver")]to open the wire panel, enabling the ability to hack."
+
+ results += ..()
+
+ return results
+
+/obj/machinery/portable_atmospherics/canister/get_description_interaction()
+ var/list/results = list()
+
+ results += "[desc_panel_image("wrench")]to connect or disconnect from a connector port below."
+ results += "[desc_panel_image("air tank")]to fill the air tank from this canister."
+
+ return results
\ No newline at end of file
diff --git a/code/modules/examine/descriptions/turfs.dm b/code/modules/examine/descriptions/turfs.dm
index cccc43e0731..4319c23ffe6 100644
--- a/code/modules/examine/descriptions/turfs.dm
+++ b/code/modules/examine/descriptions/turfs.dm
@@ -1,3 +1,33 @@
/turf/simulated/wall
- description_info = "You can deconstruct this by welding it, and then wrenching the girder.
\
- You can build a wall by using metal sheets and making a girder, then adding more metal or plasteel."
\ No newline at end of file
+ description_info = "You can build a wall by using metal sheets and making a girder, then adding more metal or plasteel."
+
+/turf/simulated/wall/get_description_interaction()
+ var/list/results = list()
+ if(damage)
+ results += "[desc_panel_image("welder")]to repair."
+
+ if(isnull(construction_stage) || !reinf_material)
+ results += "[desc_panel_image("welder")]to deconstruct if undamaged."
+ else
+ switch(construction_stage)
+ if(6)
+ results += "[desc_panel_image("wirecutters")]to begin deconstruction."
+ if(5)
+ results += list(
+ "[desc_panel_image("screwdriver")]to continue deconstruction.",
+ "[desc_panel_image("wirecutters")]to reverse deconstruction."
+ )
+ if(4)
+ results += list(
+ "[desc_panel_image("welder")]to continue deconstruction.",
+ "[desc_panel_image("screwdriver")]to reverse deconstruction."
+ )
+ if(3)
+ results += "[desc_panel_image("crowbar")]to continue deconstruction."
+ if(2)
+ results += "[desc_panel_image("wrench")]to continue deconstruction."
+ if(1)
+ results += "[desc_panel_image("welder")]to continue deconstruction."
+ if(0)
+ results += "[desc_panel_image("crowbar")]to finish deconstruction."
+ return results
\ No newline at end of file
diff --git a/code/modules/examine/examine.dm b/code/modules/examine/examine.dm
index ec64ffbe41f..6e2df0b1fa9 100644
--- a/code/modules/examine/examine.dm
+++ b/code/modules/examine/examine.dm
@@ -5,6 +5,7 @@
This means that this file can be unchecked, along with the other examine files, and can be removed entirely with no effort.
*/
+#define EXAMINE_PANEL_PADDING " "
/atom/
var/description_info = null //Helpful blue text.
@@ -27,6 +28,14 @@
return description_antag
return
+// This one is slightly different, in that it must return a list.
+/atom/proc/get_description_interaction()
+ return list()
+
+// Quickly adds the boilerplate code to add an image and padding for the image.
+/proc/desc_panel_image(var/icon_state)
+ return "\icon[description_icons[icon_state]][EXAMINE_PANEL_PADDING]"
+
/mob/living/get_description_fluff()
if(flavor_text) //Get flavor text for the green text.
return flavor_text
@@ -44,6 +53,7 @@
description_holders["info"] = A.get_description_info()
description_holders["fluff"] = A.get_description_fluff()
description_holders["antag"] = (update_antag_info)? A.get_description_antag() : ""
+ description_holders["interactions"] = A.get_description_interaction()
description_holders["name"] = "[A.name]"
description_holders["icon"] = "\icon[A]"
@@ -57,6 +67,9 @@
stat(null,"[description_holders["desc"]]") //the default examine text.
if(description_holders["info"])
stat(null,"[description_holders["info"]]") //Blue, informative text.
+ if(description_holders["interactions"])
+ for(var/line in description_holders["interactions"])
+ stat(null, "[line]")
if(description_holders["fluff"])
stat(null,"[description_holders["fluff"]]") //Yellow, fluff-related text.
if(description_holders["antag"])
@@ -67,6 +80,9 @@
if(..())
return 1
- var/is_antag = ((mind && mind.special_role) || isobserver(src)) //ghosts don't have minds
+ update_examine_panel(A)
+
+/mob/proc/update_examine_panel(var/atom/A)
if(client)
+ var/is_antag = ((mind && mind.special_role) || isobserver(src)) //ghosts don't have minds
client.update_description_holders(A, is_antag)
diff --git a/code/modules/examine/stat_icons.dm b/code/modules/examine/stat_icons.dm
index 77d97fe0a17..ba09157d1c4 100644
--- a/code/modules/examine/stat_icons.dm
+++ b/code/modules/examine/stat_icons.dm
@@ -6,5 +6,19 @@ var/global/list/description_icons = list(
"energy_armor" = image(icon='icons/mob/screen1_stats.dmi',icon_state="energy_protection"),
"bomb_armor" = image(icon='icons/mob/screen1_stats.dmi',icon_state="bomb_protection"),
"radiation_armor" = image(icon='icons/mob/screen1_stats.dmi',icon_state="radiation_protection"),
- "biohazard_armor" = image(icon='icons/mob/screen1_stats.dmi',icon_state="biohazard_protection")
- )
\ No newline at end of file
+ "biohazard_armor" = image(icon='icons/mob/screen1_stats.dmi',icon_state="biohazard_protection"),
+
+ "welder" = image(icon='icons/obj/items.dmi',icon_state="welder"),
+ "wirecutters" = image(icon='icons/obj/items.dmi',icon_state="cutters"),
+ "screwdriver" = image(icon='icons/obj/items.dmi',icon_state="screwdriver"),
+ "wrench" = image(icon='icons/obj/items.dmi',icon_state="wrench"),
+ "crowbar" = image(icon='icons/obj/items.dmi',icon_state="crowbar"),
+ "multitool" = image(icon='icons/obj/device.dmi',icon_state="multitool"),
+
+ "metal sheet" = image(icon='icons/obj/items.dmi',icon_state="sheet-metal"),
+ "plasteel sheet" = image(icon='icons/obj/items.dmi',icon_state="sheet-plasteel"),
+
+ "air tank" = image(icon='icons/obj/tank.dmi',icon_state="oxygen"),
+
+ "connector" = image(icon='icons/obj/pipes.dmi',icon_state="connector")
+ )
diff --git a/code/modules/shuttles/_defines.dm b/code/modules/shuttles/_defines.dm
new file mode 100644
index 00000000000..ad8c39466b4
--- /dev/null
+++ b/code/modules/shuttles/_defines.dm
@@ -0,0 +1,4 @@
+#define SHUTTLE_FLAGS_NONE 0
+#define SHUTTLE_FLAGS_PROCESS 1
+#define SHUTTLE_FLAGS_SUPPLY 2
+#define SHUTTLE_FLAGS_ALL (~SHUTTLE_FLAGS_NONE)
\ No newline at end of file
diff --git a/code/modules/shuttles/crashes.dm b/code/modules/shuttles/crashes.dm
index 0e190c53990..eaf7e06019e 100644
--- a/code/modules/shuttles/crashes.dm
+++ b/code/modules/shuttles/crashes.dm
@@ -6,6 +6,12 @@
var/list/crash_areas = null
var/crash_message = "Oops. The shuttle blew up." // Announcement made when shuttle crashes
+/datum/shuttle/New()
+ if(crash_areas)
+ for(var/i in 1 to crash_areas.len)
+ crash_areas[i] = locate(crash_areas[i])
+ ..()
+
// Return 0 to let the jump continue, 1 to abort the jump.
// Default implementation checks if the shuttle should crash and if so crashes it.
/datum/shuttle/proc/process_longjump(var/area/origin, var/area/intended_destination, var/direction)
diff --git a/code/modules/shuttles/escape_pods.dm b/code/modules/shuttles/escape_pods.dm
index fd6aabc4a23..b832e94dbd5 100644
--- a/code/modules/shuttles/escape_pods.dm
+++ b/code/modules/shuttles/escape_pods.dm
@@ -1,16 +1,24 @@
/datum/shuttle/ferry/escape_pod
var/datum/computer/file/embedded_program/docking/simple/escape_pod/arming_controller
+ category = /datum/shuttle/ferry/escape_pod
+
+/datum/shuttle/ferry/escape_pod/New()
+ move_time = move_time + rand(-30, 60)
+ if(name in emergency_shuttle.escape_pods)
+ CRASH("An escape pod with the name '[name]' has already been defined.")
+ emergency_shuttle.escape_pods[name] = src
+ ..()
/datum/shuttle/ferry/escape_pod/init_docking_controllers()
..()
arming_controller = locate(dock_target_station)
if(!istype(arming_controller))
- world << "warning: escape pod with station dock tag [dock_target_station] could not find it's dock target!"
-
+ warning("warning: escape pod with station dock tag [dock_target_station] could not find it's dock target!")
+
if(docking_controller)
var/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/controller_master = docking_controller.master
if(!istype(controller_master))
- world << "warning: escape pod with docking tag [docking_controller_tag] could not find it's controller master!"
+ warning("warning: escape pod with docking tag [docking_controller_tag] could not find it's controller master!")
else
controller_master.pod = src
@@ -29,7 +37,7 @@
/datum/shuttle/ferry/escape_pod/can_cancel()
return 0
-
+
//This controller goes on the escape pod itself
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod
name = "escape pod controller"
@@ -58,7 +66,7 @@
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/Topic(href, href_list)
if(..())
return 1
-
+
if("manual_arm")
pod.arming_controller.arm()
if("force_launch")
@@ -87,7 +95,7 @@
if (istype(docking_program, /datum/computer/file/embedded_program/docking/simple/escape_pod))
var/datum/computer/file/embedded_program/docking/simple/escape_pod/P = docking_program
armed = P.armed
-
+
data = list(
"docking_status" = docking_program.get_docking_status(),
"override_enabled" = docking_program.override_enabled,
diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm
index 589f3b698cc..746dc256a62 100644
--- a/code/modules/shuttles/shuttle.dm
+++ b/code/modules/shuttles/shuttle.dm
@@ -4,6 +4,7 @@
//shuttle moving state defines are in setup.dm
/datum/shuttle
+ var/name = ""
var/warmup_time = 0
var/moving_status = SHUTTLE_IDLE
@@ -12,6 +13,28 @@
var/arrive_time = 0 //the time at which the shuttle arrives when long jumping
+ var/flags = SHUTTLE_FLAGS_PROCESS
+ var/category = /datum/shuttle
+
+/datum/shuttle/New()
+ ..()
+ if(src.name in shuttle_controller.shuttles)
+ CRASH("A shuttle with the name '[name]' is already defined.")
+ shuttle_controller.shuttles[src.name] = src
+ if(flags & SHUTTLE_FLAGS_PROCESS)
+ shuttle_controller.process_shuttles += src
+ if(flags & SHUTTLE_FLAGS_SUPPLY)
+ if(supply_controller.shuttle)
+ CRASH("A supply shuttle is already defined.")
+ supply_controller.shuttle = src
+
+/datum/shuttle/Destroy()
+ shuttle_controller.shuttles -= src.name
+ shuttle_controller.process_shuttles -= src
+ if(supply_controller.shuttle == src)
+ supply_controller.shuttle = null
+ . = ..()
+
/datum/shuttle/proc/init_docking_controllers()
if(docking_controller_tag)
docking_controller = locate(docking_controller_tag)
diff --git a/code/modules/shuttles/shuttle_emergency.dm b/code/modules/shuttles/shuttle_emergency.dm
index beea1781b43..347243ae5cf 100644
--- a/code/modules/shuttles/shuttle_emergency.dm
+++ b/code/modules/shuttles/shuttle_emergency.dm
@@ -1,5 +1,11 @@
/datum/shuttle/ferry/emergency
- //pass
+ category = /datum/shuttle/ferry/emergency
+
+/datum/shuttle/ferry/emergency/New()
+ if(emergency_shuttle.shuttle)
+ CRASH("An emergency shuttle has already been defined.")
+ emergency_shuttle.shuttle = src
+ ..()
/datum/shuttle/ferry/emergency/arrived()
if (istype(in_use, /obj/machinery/computer/shuttle_control/emergency))
diff --git a/code/modules/shuttles/shuttle_ferry.dm b/code/modules/shuttles/shuttle_ferry.dm
index 0a288a1ba9a..d0763577357 100644
--- a/code/modules/shuttles/shuttle_ferry.dm
+++ b/code/modules/shuttles/shuttle_ferry.dm
@@ -11,13 +11,21 @@
var/move_time = 0 //the time spent in the transition area
var/transit_direction = null //needed for area/move_contents_to() to properly handle shuttle corners - not exactly sure how it works.
- var/area_station
- var/area_offsite
+ var/area/area_station
+ var/area/area_offsite
//TODO: change location to a string and use a mapping for area and dock targets.
var/dock_target_station
var/dock_target_offsite
var/last_dock_attempt_time = 0
+ category = /datum/shuttle/ferry
+
+/datum/shuttle/ferry/New()
+ area_offsite = locate(area_offsite)
+ area_station = locate(area_station)
+ if(area_transition)
+ area_transition = locate(area_transition)
+ ..()
/datum/shuttle/ferry/short_jump(var/area/origin,var/area/destination)
if(isnull(location))
diff --git a/code/modules/shuttles/shuttle_specops.dm b/code/modules/shuttles/shuttle_specops.dm
index 434bb37f42b..d9cc121f790 100644
--- a/code/modules/shuttles/shuttle_specops.dm
+++ b/code/modules/shuttles/shuttle_specops.dm
@@ -13,16 +13,17 @@
var/docking_controller_tag_offsite
var/datum/computer/file/embedded_program/docking/docking_controller_station
var/datum/computer/file/embedded_program/docking/docking_controller_offsite
+ category = /datum/shuttle/ferry/multidock
/datum/shuttle/ferry/multidock/init_docking_controllers()
if(docking_controller_tag_station)
docking_controller_station = locate(docking_controller_tag_station)
if(!istype(docking_controller_station))
- world << "warning: shuttle with docking tag [docking_controller_station] could not find it's controller!"
+ warning("warning: shuttle with docking tag [docking_controller_station] could not find it's controller!")
if(docking_controller_tag_offsite)
docking_controller_offsite = locate(docking_controller_tag_offsite)
if(!istype(docking_controller_offsite))
- world << "warning: shuttle with docking tag [docking_controller_offsite] could not find it's controller!"
+ warning("warning: shuttle with docking tag [docking_controller_offsite] could not find it's controller!")
if (!location)
docking_controller = docking_controller_station
else
@@ -43,6 +44,7 @@
var/reset_time = 0 //the world.time at which the shuttle will be ready to move again.
var/launch_prep = 0
var/cancel_countdown = 0
+ category = /datum/shuttle/ferry/multidock/specops
/datum/shuttle/ferry/multidock/specops/New()
..()
diff --git a/code/modules/shuttles/shuttle_supply.dm b/code/modules/shuttles/shuttle_supply.dm
index c4122434e76..9a6b7f33801 100644
--- a/code/modules/shuttles/shuttle_supply.dm
+++ b/code/modules/shuttles/shuttle_supply.dm
@@ -2,11 +2,12 @@
var/away_location = 1 //the location to hide at while pretending to be in-transit
var/late_chance = 80
var/max_late_time = 300
+ category = /datum/shuttle/ferry/supply
/datum/shuttle/ferry/supply/short_jump(var/area/origin,var/area/destination)
if(moving_status != SHUTTLE_IDLE)
return
-
+
if(isnull(location))
return
@@ -18,21 +19,21 @@
//it would be cool to play a sound here
moving_status = SHUTTLE_WARMUP
spawn(warmup_time*10)
- if (moving_status == SHUTTLE_IDLE)
+ if (moving_status == SHUTTLE_IDLE)
return //someone cancelled the launch
-
+
if (at_station() && forbidden_atoms_check())
//cancel the launch because of forbidden atoms. announce over supply channel?
moving_status = SHUTTLE_IDLE
return
-
+
if (!at_station()) //at centcom
supply_controller.buy()
-
+
//We pretend it's a long_jump by making the shuttle stay at centcom for the "in-transit" period.
var/area/away_area = get_location_area(away_location)
moving_status = SHUTTLE_INTRANSIT
-
+
//If we are at the away_area then we are just pretending to move, otherwise actually do the move
if (origin != away_area)
move(origin, away_area)
@@ -46,11 +47,11 @@
//late
if (prob(late_chance))
sleep(rand(0,max_late_time))
-
+
move(away_area, destination)
-
+
moving_status = SHUTTLE_IDLE
-
+
if (!at_station()) //at centcom
supply_controller.sell()
@@ -58,7 +59,7 @@
/datum/shuttle/ferry/supply/proc/forbidden_atoms_check()
if (!at_station())
return 0 //if badmins want to send mobs or a nuke on the supply shuttle from centcom we don't care
-
+
return supply_controller.forbidden_atoms_check(get_location_area())
/datum/shuttle/ferry/supply/proc/at_station()
diff --git a/code/modules/shuttles/shuttles_multi.dm b/code/modules/shuttles/shuttles_multi.dm
index 15d8a65d56c..7d0d7c1df24 100644
--- a/code/modules/shuttles/shuttles_multi.dm
+++ b/code/modules/shuttles/shuttles_multi.dm
@@ -1,6 +1,7 @@
//This is a holder for things like the Skipjack and Nuke shuttle.
/datum/shuttle/multi_shuttle
+ flags = SHUTTLE_FLAGS_NONE
var/cloaked = 1
var/at_origin = 1
var/returned_home = 0
@@ -23,7 +24,13 @@
var/area/origin
var/return_warning = 0
var/legit = 0 //VOREStation Add - Whether or not a shuttle is a legit NT shuttle.
+ category = /datum/shuttle/multi_shuttle
+
/datum/shuttle/multi_shuttle/New()
+ origin = locate(origin)
+ interim = locate(interim)
+ for(var/destination in destinations)
+ destinations[destination] = locate(destinations[destination])
..()
/datum/shuttle/multi_shuttle/init_docking_controllers()
@@ -36,7 +43,7 @@
var/datum/computer/file/embedded_program/docking/C = locate(controller_tag)
if(!istype(C))
- world << "warning: shuttle with docking tag [controller_tag] could not find it's controller!"
+ warning("warning: shuttle with docking tag [controller_tag] could not find it's controller!")
else
destination_dock_controllers[destination] = C
diff --git a/code/modules/xgm/xgm_gas_mixture.dm b/code/modules/xgm/xgm_gas_mixture.dm
index cb600f254f7..7fe1a96d0d1 100644
--- a/code/modules/xgm/xgm_gas_mixture.dm
+++ b/code/modules/xgm/xgm_gas_mixture.dm
@@ -1,7 +1,7 @@
/datum/gas_mixture
//Associative list of gas moles.
//Gases with 0 moles are not tracked and are pruned by update_values()
- var/list/gas = list()
+ var/list/gas
//Temperature in Kelvin of this gas mix.
var/temperature = 0
@@ -13,10 +13,11 @@
var/group_multiplier = 1
//List of active tile overlays for this gas_mixture. Updated by check_tile_graphic()
- var/list/graphic = list()
+ var/list/graphic
/datum/gas_mixture/New(vol = CELL_VOLUME)
volume = vol
+ gas = list()
//Takes a gas string and the amount of moles to adjust by. Calls update_values() if update isn't 0.
/datum/gas_mixture/proc/adjust_gas(gasid, moles, update = 1)
@@ -329,27 +330,24 @@
//Rechecks the gas_mixture and adjusts the graphic list if needed.
//Two lists can be passed by reference if you need know specifically which graphics were added and removed.
/datum/gas_mixture/proc/check_tile_graphic(list/graphic_add = null, list/graphic_remove = null)
+ var/list/cur_graphic = graphic // Cache for sanic speed
for(var/g in gas_data.overlay_limit)
- if(graphic.Find(gas_data.tile_overlay[g]))
+ if(cur_graphic && cur_graphic.Find(gas_data.tile_overlay[g]))
//Overlay is already applied for this gas, check if it's still valid.
if(gas[g] <= gas_data.overlay_limit[g])
- if(!graphic_remove)
- graphic_remove = list()
- graphic_remove += gas_data.tile_overlay[g]
+ LAZYADD(graphic_remove, gas_data.tile_overlay[g])
else
//Overlay isn't applied for this gas, check if it's valid and needs to be added.
if(gas[g] > gas_data.overlay_limit[g])
- if(!graphic_add)
- graphic_add = list()
- graphic_add += gas_data.tile_overlay[g]
+ LAZYADD(graphic_add, gas_data.tile_overlay[g])
. = 0
//Apply changes
- if(graphic_add && graphic_add.len)
- graphic += graphic_add
+ if(LAZYLEN(graphic_add))
+ LAZYADD(graphic, graphic_add)
. = 1
- if(graphic_remove && graphic_remove.len)
- graphic -= graphic_remove
+ if(LAZYLEN(graphic_remove))
+ LAZYREMOVE(graphic, graphic_remove)
. = 1
diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi
index 736308440d2..cb4d4042c60 100644
Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ
diff --git a/maps/northern_star/northern_star.dm b/maps/northern_star/northern_star.dm
index 2212774657f..fe95bbaeb64 100644
--- a/maps/northern_star/northern_star.dm
+++ b/maps/northern_star/northern_star.dm
@@ -7,6 +7,7 @@
#include "polaris-5.dmm"
#include "northern_star_defines.dm"
+ #include "northern_star_shuttles.dm"
#define USING_MAP_DATUM /datum/map/northern_star
diff --git a/maps/northern_star/northern_star_shuttles.dm b/maps/northern_star/northern_star_shuttles.dm
new file mode 100644
index 00000000000..44a5e1a5bd3
--- /dev/null
+++ b/maps/northern_star/northern_star_shuttles.dm
@@ -0,0 +1,272 @@
+// Escape shuttle and pods
+/datum/shuttle/ferry/emergency/centcom
+ name = "Escape"
+ location = 1
+ warmup_time = 10
+ area_offsite = /area/shuttle/escape/centcom
+ area_station = /area/shuttle/escape/station
+ area_transition = /area/shuttle/escape/transit
+ docking_controller_tag = "escape_shuttle"
+ dock_target_station = "escape_dock"
+ dock_target_offsite = "centcom_dock"
+ transit_direction = NORTH
+ move_time = SHUTTLE_TRANSIT_DURATION_RETURN
+
+/datum/shuttle/ferry/escape_pod/escape_pod_one
+ name = "Escape Pod 1"
+ location = 0
+ warmup_time = 0
+ area_station = /area/shuttle/escape_pod1/station
+ area_offsite = /area/shuttle/escape_pod1/centcom
+ area_transition = /area/shuttle/escape_pod1/transit
+ docking_controller_tag = "escape_pod_1"
+ dock_target_station = "escape_pod_1_berth"
+ dock_target_offsite = "escape_pod_1_recovery"
+ transit_direction = NORTH
+ move_time = SHUTTLE_TRANSIT_DURATION_RETURN
+
+/datum/shuttle/ferry/escape_pod/escape_pod_two
+ name = "Escape Pod 2"
+ location = 0
+ warmup_time = 0
+ area_station = /area/shuttle/escape_pod2/station
+ area_offsite = /area/shuttle/escape_pod2/centcom
+ area_transition = /area/shuttle/escape_pod2/transit
+ docking_controller_tag = "escape_pod_2"
+ dock_target_station = "escape_pod_2_berth"
+ dock_target_offsite = "escape_pod_2_recovery"
+ transit_direction = NORTH
+ move_time = SHUTTLE_TRANSIT_DURATION_RETURN
+
+/datum/shuttle/ferry/escape_pod/escape_pod_three
+ name = "Escape Pod 3"
+ location = 0
+ warmup_time = 0
+ area_station = /area/shuttle/escape_pod3/station
+ area_offsite = /area/shuttle/escape_pod3/centcom
+ area_transition = /area/shuttle/escape_pod3/transit
+ docking_controller_tag = "escape_pod_3"
+ dock_target_station = "escape_pod_3_berth"
+ dock_target_offsite = "escape_pod_3_recovery"
+ transit_direction = NORTH
+ move_time = SHUTTLE_TRANSIT_DURATION_RETURN
+
+/datum/shuttle/ferry/escape_pod/escape_pod_four
+ name = "Escape Pod 4"
+ location = 0
+ warmup_time = 0
+ area_station = /area/shuttle/escape_pod4/station
+ area_offsite = /area/shuttle/escape_pod4/centcom
+ area_transition = /area/shuttle/escape_pod4/transit
+ docking_controller_tag = "escape_pod_4"
+ dock_target_station = "escape_pod_4_berth"
+ dock_target_offsite = "escape_pod_4_recovery"
+ transit_direction = NORTH //should this be SOUTH? I have no idea.
+ move_time = SHUTTLE_TRANSIT_DURATION_RETURN
+
+/datum/shuttle/ferry/escape_pod/escape_pod_five
+ name = "Escape Pod 5"
+ location = 0
+ warmup_time = 0
+ area_station = /area/shuttle/escape_pod5/station
+ area_offsite = /area/shuttle/escape_pod5/centcom
+ area_transition = /area/shuttle/escape_pod5/transit
+ docking_controller_tag = "escape_pod_5"
+ dock_target_station = "escape_pod_5_berth"
+ dock_target_offsite = "escape_pod_5_recovery"
+ transit_direction = NORTH //should this be WEST? I have no idea.
+ move_time = SHUTTLE_TRANSIT_DURATION_RETURN
+
+/datum/shuttle/ferry/escape_pod/escape_pod_six
+ name = "Escape Pod 6"
+ location = 0
+ warmup_time = 0
+ area_station = /area/shuttle/escape_pod6/station
+ area_offsite = /area/shuttle/escape_pod6/centcom
+ area_transition = /area/shuttle/escape_pod6/transit
+ docking_controller_tag = "escape_pod_6"
+ dock_target_station = "escape_pod_6_berth"
+ dock_target_offsite = "escape_pod_6_recovery"
+ transit_direction = NORTH //should this be WEST? I have no idea.
+ move_time = SHUTTLE_TRANSIT_DURATION_RETURN
+
+/datum/shuttle/ferry/escape_pod/escape_pod_cryo
+ name = "Cryostorage Shuttle"
+ location = 0
+ warmup_time = 0
+ area_station = /area/shuttle/cryo/station
+ area_offsite = /area/shuttle/cryo/centcom
+ area_transition = /area/shuttle/cryo/transit
+ docking_controller_tag = "cryostorage_shuttle"
+ dock_target_station = "cryostorage_shuttle_berth"
+ dock_target_offsite = "cryostorage_shuttle_recovery"
+ transit_direction = NORTH
+ move_time = SHUTTLE_TRANSIT_DURATION_RETURN
+
+/datum/shuttle/ferry/escape_pod/large_escape_pod1
+ name = "Large Escape Pod 1"
+ location = 0
+ warmup_time = 0
+ area_station = /area/shuttle/large_escape_pod1/station
+ area_offsite = /area/shuttle/large_escape_pod1/centcom
+ area_transition = /area/shuttle/large_escape_pod1/transit
+ docking_controller_tag = "large_escape_pod_1"
+ dock_target_station = "large_escape_pod_1_berth"
+ dock_target_offsite = "large_escape_pod_1_recovery"
+ transit_direction = EAST
+ move_time = SHUTTLE_TRANSIT_DURATION_RETURN
+
+/datum/shuttle/ferry/escape_pod/large_escape_pod2
+ name = "Large Escape Pod 2"
+ location = 0
+ warmup_time = 0
+ area_station = /area/shuttle/large_escape_pod2/station
+ area_offsite = /area/shuttle/large_escape_pod2/centcom
+ area_transition = /area/shuttle/large_escape_pod2/transit
+ docking_controller_tag = "large_escape_pod_2"
+ dock_target_station = "large_escape_pod_2_berth"
+ dock_target_offsite = "large_escape_pod_2_recovery"
+ transit_direction = EAST
+ move_time = SHUTTLE_TRANSIT_DURATION_RETURN
+
+// Cargo shuttle.
+/datum/shuttle/ferry/supply/cargo
+ name = "Supply"
+ location = 1
+ warmup_time = 10
+ area_offsite = /area/supply/dock
+ area_station = /area/supply/station
+ docking_controller_tag = "supply_shuttle"
+ dock_target_station = "cargo_bay"
+ flags = SHUTTLE_FLAGS_PROCESS|SHUTTLE_FLAGS_SUPPLY
+
+// The "Elevators"
+/datum/shuttle/ferry/engineering
+ name = "Engineering"
+ warmup_time = 10
+ area_offsite = /area/shuttle/constructionsite/site
+ area_station = /area/shuttle/constructionsite/station
+ docking_controller_tag = "engineering_shuttle"
+ dock_target_station = "engineering_dock_airlock"
+ dock_target_offsite = "edock_airlock"
+
+/datum/shuttle/ferry/mining
+ name = "Mining"
+ warmup_time = 10
+ area_offsite = /area/shuttle/mining/outpost
+ area_station = /area/shuttle/mining/station
+ docking_controller_tag = "mining_shuttle"
+ dock_target_station = "mining_dock_airlock"
+ dock_target_offsite = "mining_outpost_airlock"
+
+/datum/shuttle/ferry/research
+ name = "Research"
+ warmup_time = 10
+ area_offsite = /area/shuttle/research/outpost
+ area_station = /area/shuttle/research/station
+ docking_controller_tag = "research_shuttle"
+ dock_target_station = "research_dock_airlock"
+ dock_target_offsite = "research_outpost_dock"
+
+// Admin shuttles.
+/datum/shuttle/ferry/centcom
+ name = "Centcom"
+ location = 1
+ warmup_time = 10
+ area_offsite = /area/shuttle/transport1/centcom
+ area_station = /area/shuttle/transport1/station
+ docking_controller_tag = "centcom_shuttle"
+ dock_target_station = "centcom_shuttle_dock_airlock"
+ dock_target_offsite = "centcom_shuttle_bay"
+
+/datum/shuttle/ferry/administration
+ name = "Administration"
+ location = 1
+ warmup_time = 10 //want some warmup time so people can cancel.
+ area_offsite = /area/shuttle/administration/centcom
+ area_station = /area/shuttle/administration/station
+ docking_controller_tag = "admin_shuttle"
+ dock_target_station = "admin_shuttle_dock_airlock"
+ dock_target_offsite = "admin_shuttle_bay"
+
+// Traders
+/datum/shuttle/ferry/trade
+ name = "Trade"
+ location = 1
+ warmup_time = 10 //want some warmup time so people can cancel.
+ area_offsite = /area/shuttle/trade/centcom
+ area_station = /area/shuttle/trade/station
+ docking_controller_tag = "trade_shuttle"
+ dock_target_station = "trade_shuttle_dock_airlock"
+ dock_target_offsite = "trade_shuttle_bay"
+
+// Is this even used?
+/datum/shuttle/ferry/alien
+ name = "Alien"
+ area_offsite = /area/shuttle/alien/base
+ area_station = /area/shuttle/alien/mine
+ flags = SHUTTLE_FLAGS_NONE
+
+// Mercenary
+/datum/shuttle/multi_shuttle/mercenary
+ name = "Mercenary"
+ warmup_time = 0
+ origin = /area/syndicate_station/start
+ interim = /area/syndicate_station/transit
+ start_location = "Mercenary Base"
+ destinations = list(
+ "Northwest of the station" = /area/syndicate_station/northwest,
+ "North of the station" = /area/syndicate_station/north,
+ "Northeast of the station" = /area/syndicate_station/northeast,
+ "Southwest of the station" = /area/syndicate_station/southwest,
+ "South of the station" = /area/syndicate_station/south,
+ "Southeast of the station" = /area/syndicate_station/southeast,
+ "Telecomms Satellite" = /area/syndicate_station/commssat,
+ "Mining Station" = /area/syndicate_station/mining,
+ "Arrivals dock" = /area/syndicate_station/arrivals_dock,
+ )
+ docking_controller_tag = "merc_shuttle"
+ destination_dock_targets = list(
+ "Mercenary Base" = "merc_base",
+ "Arrivals dock" = "nuke_shuttle_dock_airlock",
+ )
+ announcer = "Automated Traffic Control"
+
+/datum/shuttle/multi_shuttle/mercenary/New()
+ arrival_message = "Attention. A vessel is approaching the colony."
+ departure_message = "Attention. A vessel is now leaving from the colony."
+ ..()
+
+// Heist
+/datum/shuttle/multi_shuttle/skipjack
+ name = "Skipjack"
+ warmup_time = 0
+ origin = /area/skipjack_station/start
+ interim = /area/skipjack_station/transit
+ destinations = list(
+ "Fore Starboard Solars" = /area/skipjack_station/northeast_solars,
+ "Fore Port Solars" = /area/skipjack_station/northwest_solars,
+ "Aft Starboard Solars" = /area/skipjack_station/southeast_solars,
+ "Aft Port Solars" = /area/skipjack_station/southwest_solars,
+ "Mining Station" = /area/skipjack_station/mining
+ )
+ announcer = "Automated Traffic Control"
+
+/datum/shuttle/multi_shuttle/skipjack/New()
+ arrival_message = "Attention. Unidentified object approaching the colony."
+ departure_message = "Attention. Unidentified object exiting local space. Unidentified object expected to escape Kara gravity well with current velocity."
+ ..()
+
+/datum/shuttle/ferry/multidock/specops/ert
+ name = "Special Operations"
+ location = 0
+ warmup_time = 10
+ area_offsite = /area/shuttle/specops/station //centcom is the home station, the Exodus is offsite
+ area_station = /area/shuttle/specops/centcom
+ docking_controller_tag = "specops_shuttle_port"
+ docking_controller_tag_station = "specops_shuttle_port"
+ docking_controller_tag_offsite = "specops_shuttle_fore"
+ dock_target_station = "specops_centcom_dock"
+ dock_target_offsite = "specops_dock_airlock"
+
+
diff --git a/maps/tether/tether.dm b/maps/tether/tether.dm
index 6de1a83e9b1..7db16e4a4d9 100644
--- a/maps/tether/tether.dm
+++ b/maps/tether/tether.dm
@@ -6,6 +6,7 @@
#include "tether_phoronlock.dm"
#include "tether_areas.dm"
#include "tether_areas2.dm"
+ #include "tether_shuttle_defs.dm"
#include "tether_shuttles.dm"
#include "tether_telecomms.dm"
#include "tether_virgo3b.dm"
diff --git a/maps/tether/tether_shuttle_defs.dm b/maps/tether/tether_shuttle_defs.dm
new file mode 100644
index 00000000000..b16eb49b857
--- /dev/null
+++ b/maps/tether/tether_shuttle_defs.dm
@@ -0,0 +1,159 @@
+//////////////////////////////////////////////////////////////
+// Escape shuttle and pods
+/datum/shuttle/ferry/emergency/escape
+ name = "Escape"
+ location = 1 // At offsite
+ warmup_time = 10
+ area_offsite = /area/shuttle/escape/centcom
+ area_station = /area/shuttle/escape/station
+ area_transition = /area/shuttle/escape/transit
+ docking_controller_tag = "escape_shuttle"
+ dock_target_station = "escape_dock"
+ dock_target_offsite = "centcom_dock"
+ move_time = SHUTTLE_TRANSIT_DURATION_RETURN
+
+//////////////////////////////////////////////////////////////
+/datum/shuttle/ferry/escape_pod/large_escape_pod1
+ name = "Large Escape Pod 1"
+ location = 0
+ warmup_time = 0
+ area_station = /area/shuttle/large_escape_pod1/station
+ area_offsite = /area/shuttle/large_escape_pod1/centcom
+ area_transition = /area/shuttle/large_escape_pod1/transit
+ docking_controller_tag = "large_escape_pod_1"
+ dock_target_station = "large_escape_pod_1_berth"
+ dock_target_offsite = "large_escape_pod_1_recovery"
+ move_time = SHUTTLE_TRANSIT_DURATION_RETURN
+
+//////////////////////////////////////////////////////////////
+/datum/shuttle/ferry/escape_pod/large_escape_pod2
+ name = "Large Escape Pod 2"
+ location = 0
+ warmup_time = 0
+ area_station = /area/shuttle/large_escape_pod2/station
+ area_offsite = /area/shuttle/large_escape_pod2/centcom
+ area_transition = /area/shuttle/large_escape_pod2/transit
+ docking_controller_tag = "large_escape_pod_2"
+ dock_target_station = "large_escape_pod_2_berth"
+ dock_target_offsite = "large_escape_pod_2_recovery"
+ move_time = SHUTTLE_TRANSIT_DURATION_RETURN
+
+//////////////////////////////////////////////////////////////
+// Supply shuttle
+/datum/shuttle/ferry/supply/cargo
+ name = "Supply"
+ location = 1
+ warmup_time = 10
+ area_offsite = /area/supply/dock
+ area_station = /area/supply/station
+ docking_controller_tag = "supply_shuttle"
+ dock_target_station = "cargo_bay"
+ flags = SHUTTLE_FLAGS_PROCESS|SHUTTLE_FLAGS_SUPPLY
+
+//////////////////////////////////////////////////////////////
+// Trade Ship
+/datum/shuttle/ferry/trade
+ name = "Trade"
+ location = 1
+ warmup_time = 10 //want some warmup time so people can cancel.
+ area_offsite = /area/shuttle/trade/centcom
+ area_station = /area/shuttle/trade/station
+ docking_controller_tag = "trade_shuttle"
+ dock_target_station = "trade_shuttle_dock_airlock"
+ dock_target_offsite = "trade_shuttle_bay"
+
+//////////////////////////////////////////////////////////////
+// Away Mission Shuttle
+/datum/shuttle/multi_shuttle/awaymission
+ name = "AwayMission"
+ legit = TRUE
+ warmup_time = 8
+ move_time = 60
+ origin = /area/shuttle/awaymission/home
+ interim = /area/shuttle/awaymission/warp
+ start_location = "NSS Adephagia (AM)"
+ destinations = list(
+ "Old Engineering Base (AM)" = /area/shuttle/awaymission/oldengbase
+ )
+ docking_controller_tag = "awaymission_shuttle"
+ destination_dock_targets = list(
+ "NSS Adephagia (AM)" = "d1a2_dock_airlock"
+ )
+ announcer = "Automated Traffic Control"
+ //These seem backwards because they are written from the perspective of the merc and vox ships
+ departure_message = "Attention. The away mission vessel is approaching the colony."
+ arrival_message = "Attention. The away mission vessel is now leaving from the colony."
+
+/datum/shuttle/multi_shuttle/awaymission/New()
+ ..()
+ var/area/awaym_dest = locate(/area/shuttle/awaymission/away)
+ if(awaym_dest && awaym_dest.contents.len) // Otherwise this is an empty imaginary area
+ destinations["Unknown Location [rand(1000,9999)]"] = awaym_dest
+
+//////////////////////////////////////////////////////////////
+// Tether Shuttle
+/datum/shuttle/ferry/tether_backup/goodluckmcgee
+ name = "Tether Backup"
+ location = 1 // At offsite
+ warmup_time = 5
+ move_time = 45
+ area_offsite = /area/shuttle/tether/surface
+ area_station = /area/shuttle/tether/station
+ area_transition = /area/shuttle/tether/transit
+ crash_areas = list(/area/shuttle/tether/crash1, /area/shuttle/tether/crash2)
+ docking_controller_tag = "tether_shuttle"
+ dock_target_station = "tether_dock_airlock"
+ dock_target_offsite = "tether_pad_airlock"
+
+//////////////////////////////////////////////////////////////
+// Antag Space "Proto Shuttle" Shuttle
+/datum/shuttle/multi_shuttle/protoshuttle
+ name = "Proto"
+ warmup_time = 8
+ move_time = 60
+ origin = /area/shuttle/antag_space/base
+ interim = /area/shuttle/antag_space/transit
+ start_location = "Home Base"
+ destinations = list(
+ "Nearby" = /area/shuttle/antag_space/north,
+ "Docks" = /area/shuttle/antag_space/docks
+ )
+ docking_controller_tag = "antag_space_shuttle"
+ destination_dock_targets = list("Home Base" = "antag_space_dock")
+
+//////////////////////////////////////////////////////////////
+// Antag Surface "Land Crawler" Shuttle
+/datum/shuttle/multi_shuttle/landcrawler
+ name = "Land Crawler"
+ warmup_time = 8
+ move_time = 60
+ origin = /area/shuttle/antag_ground/base
+ interim = /area/shuttle/antag_ground/transit
+ start_location = "Home Base"
+ destinations = list(
+ "Solar Array" = /area/shuttle/antag_ground/solars,
+ "Mining Outpost" = /area/shuttle/antag_ground/mining
+ )
+ docking_controller_tag = "antag_ground_shuttle"
+ destination_dock_targets = list("Home Base" = "antag_ground_dock")
+
+//////////////////////////////////////////////////////////////
+// RogueMiner "Belter: Shuttle
+// TODO - Not implemented yet on new map
+/*
+/datum/shuttle/ferry/belter
+ name = "Belter"
+ location = 0
+ warmup_time = 6
+ move_time = 60
+ area_station = /area/shuttle/belter/station
+ area_offsite = /area/shuttle/belter/belt/zone1
+ area_transition = /area/shuttle/belter/transit
+ docking_controller_tag = "belter_docking"
+ dock_target_station = "belter_nodocking" //Fake tags to prevent the shuttle from opening doors.
+ dock_target_offsite = "belter_nodocking"
+
+/datum/shuttle/ferry/belter/New()
+ move_time = move_time + rand(10, 40)
+ ..()
+*/
diff --git a/maps/tether/tether_shuttles.dm b/maps/tether/tether_shuttles.dm
index 0328233a982..8bd433ab163 100644
--- a/maps/tether/tether_shuttles.dm
+++ b/maps/tether/tether_shuttles.dm
@@ -1,3 +1,7 @@
+////////////////////////////////////////
+// Tether custom shuttle implemnetations
+////////////////////////////////////////
+
/obj/machinery/computer/shuttle_control/tether_backup
name = "tether backup shuttle control console"
shuttle_tag = "Tether Backup"
@@ -56,9 +60,18 @@
//
/datum/shuttle/ferry/tether_backup
crash_message = "Tether shuttle distress signal received. Shuttle location is approximately 200 meters from tether base."
+ category = /datum/shuttle/ferry/tether_backup // So shuttle_controller.dm doesn't try and instantiate this type as an acutal mapped in shuttle.
var/list/engines = list()
var/obj/machinery/computer/shuttle_control/tether_backup/computer
+/datum/shuttle/ferry/tether_backup/New()
+ ..()
+ var/area/current_area = get_location_area(location)
+ for(var/obj/structure/shuttle/engine/propulsion/E in current_area)
+ engines += E
+ for(var/obj/machinery/computer/shuttle_control/tether_backup/comp in current_area)
+ computer = comp
+
/datum/shuttle/ferry/tether_backup/process_longjump(var/area/origin, var/area/intended_destination)
var/failures = engines.len
for(var/engine in engines)
diff --git a/vorestation.dme b/vorestation.dme
index 36b780c4477..40a1283418a 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -159,7 +159,7 @@
#include "code\controllers\hooks.dm"
#include "code\controllers\master.dm"
#include "code\controllers\master_controller.dm"
-#include "code\controllers\shuttle_controller_vr.dm"
+#include "code\controllers\shuttle_controller.dm"
#include "code\controllers\subsystem.dm"
#include "code\controllers\verbs.dm"
#include "code\controllers\voting.dm"
@@ -2281,6 +2281,7 @@
#include "code\modules\shieldgen\shield_diffuser.dm"
#include "code\modules\shieldgen\shield_gen.dm"
#include "code\modules\shieldgen\shield_gen_external.dm"
+#include "code\modules\shuttles\_defines.dm"
#include "code\modules\shuttles\antagonist.dm"
#include "code\modules\shuttles\crashes.dm"
#include "code\modules\shuttles\departmental.dm"