diff --git a/baystation12.dme b/baystation12.dme
index 2724174e37..1fa1d56c23 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -78,6 +78,7 @@
#include "code\controllers\_DynamicAreaLighting_TG.dm"
#include "code\controllers\autotransfer.dm"
#include "code\controllers\configuration.dm"
+#include "code\controllers\emergency_shuttle_controller.dm"
#include "code\controllers\failsafe.dm"
#include "code\controllers\hooks-defs.dm"
#include "code\controllers\hooks.dm"
diff --git a/code/controllers/emergency_shuttle_controller.dm b/code/controllers/emergency_shuttle_controller.dm
new file mode 100644
index 0000000000..7b8781b386
--- /dev/null
+++ b/code/controllers/emergency_shuttle_controller.dm
@@ -0,0 +1,293 @@
+//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
+
+// Controls the emergency shuttle
+
+
+// these define the time taken for the shuttle to get to SS13
+// and the time before it leaves again
+#define SHUTTLE_PREPTIME 300 // 5 minutes = 300 seconds - after this time, the shuttle cannot be recalled
+#define SHUTTLE_LEAVETIME 180 // 3 minutes = 180 seconds - the duration for which the shuttle will wait at the station
+#define SHUTTLE_TRANSIT_DURATION 300 // 5 minutes = 300 seconds - how long it takes for the shuttle to get to the station
+#define SHUTTLE_TRANSIT_DURATION_RETURN 120 // 2 minutes = 120 seconds - for some reason it takes less time to come back, go figure.
+
+var/global/datum/emergency_shuttle_controller/emergency_shuttle
+
+/datum/emergency_shuttle_controller
+ var/datum/shuttle/ferry/emergency/shuttle
+ var/list/escape_pods
+
+ var/launch_time //the time at which the shuttle will be launched
+ var/auto_recall = 0 //if set, the shuttle will be auto-recalled
+ var/auto_recall_time //the time at which the shuttle will be auto-recalled
+ var/evac = 0 //1 = emergency evacuation, 0 = crew transfer
+ var/wait_for_launch = 0 //if the shuttle is waiting to launch
+
+ var/deny_shuttle = 0 //allows admins to prevent the shuttle from being called
+ var/departed = 0 //if the shuttle has left the station at least once
+
+/datum/emergency_shuttle_controller/proc/setup_pods()
+ escape_pods = list()
+
+ var/datum/shuttle/ferry/escape_pod/pod
+
+ pod = new()
+ pod.location = 0
+ pod.warmup_time = 0
+ pod.area_station = locate(/area/shuttle/escape_pod1/station)
+ pod.area_offsite = locate(/area/shuttle/escape_pod1/centcom)
+ pod.area_transition = locate(/area/shuttle/escape_pod1/transit)
+ pod.travel_time = SHUTTLE_TRANSIT_DURATION_RETURN
+ escape_pods += pod
+
+ pod = new()
+ pod.location = 0
+ pod.warmup_time = 0
+ pod.area_station = locate(/area/shuttle/escape_pod2/station)
+ pod.area_offsite = locate(/area/shuttle/escape_pod2/centcom)
+ pod.area_transition = locate(/area/shuttle/escape_pod2/transit)
+ pod.travel_time = SHUTTLE_TRANSIT_DURATION_RETURN
+ escape_pods += pod
+
+ pod = new()
+ pod.location = 0
+ pod.warmup_time = 0
+ pod.area_station = locate(/area/shuttle/escape_pod3/station)
+ pod.area_offsite = locate(/area/shuttle/escape_pod3/centcom)
+ pod.area_transition = locate(/area/shuttle/escape_pod3/transit)
+ pod.travel_time = SHUTTLE_TRANSIT_DURATION_RETURN
+ escape_pods += pod
+
+ //There is no pod 4, apparently.
+
+ pod = new()
+ pod.location = 0
+ pod.warmup_time = 0
+ pod.area_station = locate(/area/shuttle/escape_pod5/station)
+ pod.area_offsite = locate(/area/shuttle/escape_pod5/centcom)
+ pod.area_transition = locate(/area/shuttle/escape_pod5/transit)
+ pod.travel_time = SHUTTLE_TRANSIT_DURATION_RETURN
+ escape_pods += pod
+
+
+/datum/emergency_shuttle_controller/proc/process()
+ if (wait_for_launch)
+ if (auto_recall && world.time >= auto_recall_time)
+ recall()
+ if (world.time >= launch_time) //time to launch the shuttle
+ stop_launch_countdown()
+
+ //set the travel time
+ if (!shuttle.location) //leaving from the station
+ //launch the pods!
+ for (var/datum/shuttle/ferry/escape_pod/pod in escape_pods)
+ pod.launch(src)
+
+ shuttle.travel_time = SHUTTLE_TRANSIT_DURATION_RETURN
+ else
+ shuttle.travel_time = SHUTTLE_TRANSIT_DURATION
+
+ shuttle.launch(src)
+
+//called when the shuttle has arrived.
+/datum/emergency_shuttle_controller/proc/shuttle_arrived()
+ if (!shuttle.location) //at station
+ set_launch_countdown(SHUTTLE_LEAVETIME) //get ready to return
+
+//begins the launch countdown and sets the amount of time left until launch
+//if the launch countdown has already been set then this may reduce the countdown time, but not extend it
+//to reset for a later time, just stop the timer first
+/datum/emergency_shuttle_controller/proc/set_launch_countdown(var/seconds)
+ if (wait_for_launch)
+ launch_time = min(world.time + seconds*10, launch_time)
+ else
+ wait_for_launch = 1
+ launch_time = world.time + seconds*10
+
+/datum/emergency_shuttle_controller/proc/stop_launch_countdown()
+ wait_for_launch = 0
+
+//calls the shuttle for an emergency evacuation
+/datum/emergency_shuttle_controller/proc/call_evac()
+ if(!can_call()) return
+
+ //set the launch timer
+ set_launch_countdown(get_shuttle_prep_time())
+ auto_recall_time = rand(world.time + 300, launch_time - 300)
+
+ evac = 1
+ captain_announce("An emergency evacuation shuttle has been called. It will arrive in approximately [round(estimate_arrival_time()/60)] minutes.")
+ world << sound('sound/AI/shuttlecalled.ogg')
+ for(var/area/A in world)
+ if(istype(A, /area/hallway))
+ A.readyalert()
+
+//calls the shuttle for a routine crew transfer
+/datum/emergency_shuttle_controller/proc/call_transfer()
+ if(!can_call()) return
+
+ //set the launch timer
+ set_launch_countdown(get_shuttle_prep_time())
+ auto_recall_time = rand(world.time + 300, launch_time - 300)
+
+ captain_announce("A crew transfer has been initiated. The shuttle has been called. It will arrive in [round(estimate_arrival_time()/60)] minutes.")
+
+//recalls the shuttle
+/datum/emergency_shuttle_controller/proc/recall()
+ if (!can_recall()) return
+
+ wait_for_launch = 0
+ shuttle.cancel_launch(src)
+
+ if (evac)
+ captain_announce("The emergency shuttle has been recalled.")
+ world << sound('sound/AI/shuttlerecalled.ogg')
+
+ for(var/area/A in world)
+ if(istype(A, /area/hallway))
+ A.readyreset()
+ evac = 0
+ else
+ captain_announce("The scheduled crew transfer has been cancelled.")
+
+/datum/emergency_shuttle_controller/proc/can_call()
+ if (deny_shuttle)
+ return 0
+ if (shuttle.moving_status != SHUTTLE_IDLE || !shuttle.location) //must be idle at centcom
+ return 0
+ if (wait_for_launch) //already launching
+ return 0
+ return 1
+
+//this only returns 0 if it would absolutely make no sense to recall
+//e.g. the shuttle is already at the station or wasn't called to begin with
+//other reasons for the shuttle not being recallable should be handled elsewhere
+/datum/emergency_shuttle_controller/proc/can_recall()
+ if (shuttle.moving_status == SHUTTLE_INTRANSIT) //if the shuttle is already in transit then it's too late
+ return 0
+ if (!shuttle.location) //already at the station.
+ return 0
+ if (!wait_for_launch) //we weren't going anywhere, anyways...
+ return 0
+ return 1
+
+/datum/emergency_shuttle_controller/proc/get_shuttle_prep_time()
+ // During mutiny rounds, the shuttle takes twice as long.
+ if(ticker && istype(ticker.mode,/datum/game_mode/mutiny))
+ return SHUTTLE_PREPTIME * 3 //15 minutes
+
+ return SHUTTLE_PREPTIME
+
+
+/*
+ These procs are not really used by the controller itself, but are for other parts of the
+ game whose logic depends on the emergency shuttle.
+*/
+
+//so we don't have emergency_shuttle.shuttle.location everywhere
+/datum/emergency_shuttle_controller/proc/location()
+ if (!shuttle)
+ return 1 //if we dont have a shuttle datum, just act like it's at centcom
+ return shuttle.location
+
+//returns the time left until the shuttle arrives at it's destination, in seconds
+/datum/emergency_shuttle_controller/proc/estimate_arrival_time()
+ var/eta
+ if (isnull(shuttle.jump_time))
+ eta = launch_time + shuttle.travel_time
+ else
+ eta = shuttle.jump_time + shuttle.travel_time
+ return (eta - world.time)/10
+
+//returns the time left until the shuttle launches, in seconds
+/datum/emergency_shuttle_controller/proc/estimate_launch_time()
+ return (launch_time - world.time)/10
+
+/datum/emergency_shuttle_controller/proc/has_eta()
+ return (wait_for_launch || shuttle.moving_status != SHUTTLE_IDLE)
+
+//returns 1 if the shuttle has gone to the station and come back at least once,
+//used for game completion checking purposes
+/datum/emergency_shuttle_controller/proc/returned()
+ return (departed && shuttle.moving_status != SHUTTLE_IDLE && shuttle.location) //we've gone to the station at least once, no longer in transit and are idle back at centcom
+
+//returns 1 if the shuttle is not idle at centcom
+/datum/emergency_shuttle_controller/proc/online()
+ if (!shuttle.location) //not at centcom
+ return 1
+ if (wait_for_launch || shuttle.moving_status != SHUTTLE_IDLE)
+ return 1
+ return 0
+
+//returns 1 if the shuttle is currently in transit (or just leaving) to the station
+/datum/emergency_shuttle_controller/proc/going_to_station()
+ return (!shuttle.direction && shuttle.moving_status != SHUTTLE_IDLE)
+
+//returns 1 if the shuttle is currently in transit (or just leaving) to centcom
+/datum/emergency_shuttle_controller/proc/going_to_centcom()
+ return (shuttle.direction && shuttle.moving_status != SHUTTLE_IDLE)
+
+//returns 1 if the shuttle is docked at the station and waiting to leave
+/datum/emergency_shuttle_controller/proc/waiting_to_leave()
+ if (shuttle.location)
+ return 0 //not at station
+ if (!wait_for_launch)
+ return 0 //not going anywhere
+ if (shuttle.moving_status != SHUTTLE_IDLE)
+ return 0 //shuttle is doing stuff
+ return 1
+
+/*
+ Some slapped-together star effects for maximum spess immershuns. Basically consists of a
+ spawner, an ender, and bgstar. Spawners create bgstars, bgstars shoot off into a direction
+ until they reach a starender.
+*/
+
+/obj/effect/bgstar
+ name = "star"
+ var/speed = 10
+ var/direction = SOUTH
+ layer = 2 // TURF_LAYER
+
+/obj/effect/bgstar/New()
+ ..()
+ pixel_x += rand(-2,30)
+ pixel_y += rand(-2,30)
+ var/starnum = pick("1", "1", "1", "2", "3", "4")
+
+ icon_state = "star"+starnum
+
+ speed = rand(2, 5)
+
+/obj/effect/bgstar/proc/startmove()
+
+ while(src)
+ sleep(speed)
+ step(src, direction)
+ for(var/obj/effect/starender/E in loc)
+ del(src)
+
+
+/obj/effect/starender
+ invisibility = 101
+
+/obj/effect/starspawner
+ invisibility = 101
+ var/spawndir = SOUTH
+ var/spawning = 0
+
+/obj/effect/starspawner/West
+ spawndir = WEST
+
+/obj/effect/starspawner/proc/startspawn()
+ spawning = 1
+ while(spawning)
+ sleep(rand(2, 30))
+ var/obj/effect/bgstar/S = new/obj/effect/bgstar(locate(x,y,z))
+ S.direction = spawndir
+ spawn()
+ S.startmove()
+
+#undef SHUTTLE_PREPTIME
+#undef SHUTTLE_LEAVETIME
+#undef SHUTTLE_TRANSIT_DURATION
+#undef SHUTTLE_TRANSIT_DURATION_RETURN
\ No newline at end of file
diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm
index 77f3adfdbd..1c480fd8d4 100644
--- a/code/controllers/master_controller.dm
+++ b/code/controllers/master_controller.dm
@@ -52,7 +52,8 @@ datum/controller/game_controller/New()
if(!syndicate_code_phrase) syndicate_code_phrase = generate_code_phrase()
if(!syndicate_code_response) syndicate_code_response = generate_code_phrase()
- if(!emergency_shuttle) emergency_shuttle = new /datum/shuttle_controller/emergency_shuttle()
+ if(!emergency_shuttle) emergency_shuttle = new /datum/emergency_shuttle_controller()
+ if(!shuttle_controller) shuttle_controller = new /datum/shuttle_controller()
datum/controller/game_controller/proc/setup()
world.tick_lag = config.Ticklag
@@ -67,9 +68,6 @@ datum/controller/game_controller/proc/setup()
if(!ticker)
ticker = new /datum/controller/gameticker()
- if(!shuttles) setup_shuttles()
- shuttle_list = shuttles
-
setup_objects()
setupgenetics()
setupfactions()
@@ -135,6 +133,7 @@ datum/controller/game_controller/proc/process()
vote.process()
transfer_controller.process()
+ shuttle_controller.process()
process_newscaster()
//AIR
@@ -230,7 +229,7 @@ datum/controller/game_controller/proc/process()
total_cost = air_cost + sun_cost + mobs_cost + diseases_cost + machines_cost + objects_cost + networks_cost + powernets_cost + nano_cost + events_cost + ticker_cost
var/end_time = world.timeofday
- if(end_time < start_time)
+ if(end_time < start_time) //why not just use world.time instead?
start_time -= 864000 //deciseconds in a day
sleep( round(minimum_ticks - (end_time - start_time),1) )
else
diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm
index 11678a7d91..3428ca918c 100644
--- a/code/controllers/shuttle_controller.dm
+++ b/code/controllers/shuttle_controller.dm
@@ -1,287 +1,220 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
-// Controls the emergency shuttle
+var/global/datum/shuttle_controller/shuttle_controller
-// these define the time taken for the shuttle to get to SS13
-// and the time before it leaves again
-#define SHUTTLE_PREPTIME 300 // 5 minutes = 300 seconds - after this time, the shuttle cannot be recalled
-#define SHUTTLE_LEAVETIME 180 // 3 minutes = 180 seconds - the duration for which the shuttle will wait at the station
-#define SHUTTLE_TRANSIT_DURATION 300 // 5 minutes = 300 seconds - how long it takes for the shuttle to get to the station
-#define SHUTTLE_TRANSIT_DURATION_RETURN 120 // 2 minutes = 120 seconds - for some reason it takes less time to come back, go figure.
+/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
-var/global/datum/shuttle_controller/emergency_shuttle/emergency_shuttle
+/datum/shuttle_controller/proc/process()
+ //process ferry shuttles
+ for (var/datum/shuttle/ferry/shuttle in process_shuttles)
+ if (shuttle.in_use)
+ shuttle.process()
-/datum/shuttle_controller/emergency_shuttle
- var/datum/shuttle/ferry/emergency/shuttle
- var/list/escape_pods
+
+/datum/shuttle_controller/New()
+ shuttles = list()
+ process_shuttles = list()
+
+ var/datum/shuttle/ferry/shuttle
- var/launch_time //the time at which the shuttle will be launched
- var/auto_recall = 0 //if set, the shuttle will be auto-recalled
- var/auto_recall_time //the time at which the shuttle will be auto-recalled
- var/evac = 0 //1 = emergency evacuation, 0 = crew transfer
- var/wait_for_launch = 0 //if the shuttle is waiting to launch
+ // 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.travel_time = 300
+ //shuttle.docking_controller_tag = "supply_shuttle"
+ //shuttle.dock_target_station = "cargo_bay"
+ shuttles["Escape"] = shuttle
+ process_shuttles += shuttle
- var/deny_shuttle = 0 //allows admins to prevent the shuttle from being called
- var/departed = 0 //if the shuttle has left the station at least once
-
-/datum/shuttle_controller/emergency_shuttle/proc/setup_pods()
- escape_pods = list()
+ //give the emergency shuttle controller it's shuttle
+ emergency_shuttle.shuttle = shuttle
+ emergency_shuttle.setup_pods()
+ process_shuttles += emergency_shuttle.escape_pods
- var/datum/shuttle/ferry/escape_pod/pod
+ // 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
- pod = new()
- pod.location = 0
- pod.warmup_time = 0
- pod.area_station = locate(/area/shuttle/escape_pod1/station)
- pod.area_offsite = locate(/area/shuttle/escape_pod1/centcom)
- pod.area_transition = locate(/area/shuttle/escape_pod1/transit)
- pod.travel_time = SHUTTLE_TRANSIT_DURATION_RETURN
- escape_pods += pod
+ supply_controller.shuttle = shuttle
- pod = new()
- pod.location = 0
- pod.warmup_time = 0
- pod.area_station = locate(/area/shuttle/escape_pod2/station)
- pod.area_offsite = locate(/area/shuttle/escape_pod2/centcom)
- pod.area_transition = locate(/area/shuttle/escape_pod2/transit)
- pod.travel_time = SHUTTLE_TRANSIT_DURATION_RETURN
- escape_pods += pod
+ // 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
+
+ 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
+
+ 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.location = 1
+ 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 = "engineering_station_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 Exodus 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
+
+ //Vox Shuttle.
+ var/datum/shuttle/multi_shuttle/VS = new/datum/shuttle/multi_shuttle()
+ VS.origin = /area/shuttle/vox/station
+
+ VS.destinations = list(
+ "Fore Starboard Solars" = /area/vox_station/northeast_solars,
+ "Fore Port Solars" = /area/vox_station/northwest_solars,
+ "Aft Starboard Solars" = /area/vox_station/southeast_solars,
+ "Aft Port Solars" = /area/vox_station/southwest_solars,
+ "Mining asteroid" = /area/vox_station/mining
+ )
+
+ VS.announcer = "NSV Icarus"
+ VS.arrival_message = "Attention, Exodus, we just tracked a small target bypassing our defensive perimeter. Can't fire on it without hitting the station - you've got incoming visitors, like it or not."
+ VS.departure_message = "Your guests are pulling away, Exodus - moving too fast for us to draw a bead on them. Looks like they're heading out of the system at a rapid clip."
+ VS.interim = /area/vox_station/transit
+
+ VS.warmup_time = 10
+ shuttles["Vox Skipjack"] = VS
+
+ //Nuke Ops shuttle.
+ var/datum/shuttle/multi_shuttle/MS = new/datum/shuttle/multi_shuttle()
+ MS.origin = /area/syndicate_station/start
+
+ MS.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 Asteroid" = /area/syndicate_station/mining
+ )
+
+ MS.announcer = "NSV Icarus"
+ MS.arrival_message = "Attention, Exodus, you have a large signature approaching the station - looks unarmed to surface scans. We're too far out to intercept - brace for visitors."
+ MS.departure_message = "Your visitors are on their way out of the system, Exodus, burning delta-v like it's nothing. Good riddance."
+ MS.interim = /area/syndicate_station/transit
+
+ MS.warmup_time = 10
+ shuttles["Syndicate"] = MS
+
+
+//This is called by gameticker after all the machines and radio frequencies have been properly initialized
+/datum/shuttle_controller/proc/setup_shuttle_docks()
+ var/datum/shuttle/shuttle
+ var/datum/shuttle/ferry/multidock/multidock
+ var/list/dock_controller_map = list() //so we only have to iterate once through each list
- pod = new()
- pod.location = 0
- pod.warmup_time = 0
- pod.area_station = locate(/area/shuttle/escape_pod3/station)
- pod.area_offsite = locate(/area/shuttle/escape_pod3/centcom)
- pod.area_transition = locate(/area/shuttle/escape_pod3/transit)
- pod.travel_time = SHUTTLE_TRANSIT_DURATION_RETURN
- escape_pods += pod
+ //multidock shuttles
+ var/list/dock_controller_map_station = list()
+ var/list/dock_controller_map_offsite = list()
+
+ for (var/shuttle_tag in shuttles)
+ shuttle = shuttles[shuttle_tag]
+ if (shuttle.docking_controller_tag)
+ dock_controller_map[shuttle.docking_controller_tag] = shuttle
+ if (istype(shuttle, /datum/shuttle/ferry/multidock))
+ multidock = shuttle
+ dock_controller_map_station[multidock.docking_controller_tag_station] = multidock
+ dock_controller_map_offsite[multidock.docking_controller_tag_offsite] = multidock
+
+ //search for the controllers, if we have one.
+ if (dock_controller_map.len)
+ for (var/obj/machinery/embedded_controller/radio/C in machines) //only radio controllers are supported at the moment
+ if (istype(C.program, /datum/computer/file/embedded_program/docking))
+ if (C.id_tag in dock_controller_map)
+ shuttle = dock_controller_map[C.id_tag]
+ shuttle.docking_controller = C.program
+ dock_controller_map -= C.id_tag
+ if (C.id_tag in dock_controller_map_station)
+ multidock = dock_controller_map_station[C.id_tag]
+ if (istype(multidock))
+ multidock.docking_controller_station = C.program
+ dock_controller_map_station -= C.id_tag
+ if (C.id_tag in dock_controller_map_offsite)
+ multidock = dock_controller_map_offsite[C.id_tag]
+ if (istype(multidock))
+ multidock.docking_controller_offsite = C.program
+ dock_controller_map_offsite -= C.id_tag
- //There is no pod 4, apparently.
+ //sanity check
+ if (dock_controller_map.len || dock_controller_map_station.len || dock_controller_map_offsite.len)
+ var/dat = ""
+ for (var/dock_tag in dock_controller_map + dock_controller_map_station + dock_controller_map_offsite)
+ dat += "\"[dock_tag]\", "
+ world << "/red /b warning: shuttles with docking tags [dat] could not find their controllers!"
- pod = new()
- pod.location = 0
- pod.warmup_time = 0
- pod.area_station = locate(/area/shuttle/escape_pod5/station)
- pod.area_offsite = locate(/area/shuttle/escape_pod5/centcom)
- pod.area_transition = locate(/area/shuttle/escape_pod5/transit)
- pod.travel_time = SHUTTLE_TRANSIT_DURATION_RETURN
- escape_pods += pod
-
-
-/datum/shuttle_controller/emergency_shuttle/proc/process()
- if (wait_for_launch)
- if (auto_recall && world.time >= auto_recall_time)
- recall()
- if (world.time >= launch_time) //time to launch the shuttle
- wait_for_launch = 0
-
- //set the travel time
- if (!shuttle.location) //leaving from the station
- //launch the pods!
- for (var/datum/shuttle/ferry/escape_pod/pod in escape_pods)
- pod.launch(src)
-
- shuttle.travel_time = SHUTTLE_TRANSIT_DURATION_RETURN
- else
- shuttle.travel_time = SHUTTLE_TRANSIT_DURATION
-
- shuttle.launch(src)
-
- //process the shuttles
- if (shuttle.in_use)
- shuttle.process_shuttle()
- for (var/datum/shuttle/ferry/escape_pod/pod in escape_pods)
- if (pod.in_use)
- pod.process_shuttle()
-
-//called when the shuttle has arrived.
-/datum/shuttle_controller/emergency_shuttle/proc/shuttle_arrived()
- if (!shuttle.location) //at station
- launch_time = world.time + SHUTTLE_LEAVETIME*10
- wait_for_launch = 1 //get ready to return
-
-//so we don't have emergency_shuttle.shuttle.location everywhere
-/datum/shuttle_controller/emergency_shuttle/proc/location()
- if (!shuttle)
- return 1 //if we dont have a shuttle datum, just act like it's at centcom
- return shuttle.location
-
-//calls the shuttle for an emergency evacuation
-/datum/shuttle_controller/emergency_shuttle/proc/call_evac()
- if(!can_call()) return
-
- //set the launch timer
- launch_time = world.time + get_shuttle_prep_time()*10
- auto_recall_time = rand(world.time + 300, launch_time - 300)
- wait_for_launch = 1
-
- evac = 1
- captain_announce("An emergency evacuation shuttle has been called. It will arrive in approximately [round(estimate_arrival_time()/60)] minutes.")
- world << sound('sound/AI/shuttlecalled.ogg')
- for(var/area/A in world)
- if(istype(A, /area/hallway))
- A.readyalert()
-
-//calls the shuttle for a routine crew transfer
-/datum/shuttle_controller/emergency_shuttle/proc/call_transfer()
- if(!can_call()) return
-
- //set the launch timer
- launch_time = world.time + get_shuttle_prep_time()
- auto_recall_time = rand(world.time + 300, launch_time - 300)
- wait_for_launch = 1
-
- captain_announce("A crew transfer has been initiated. The shuttle has been called. It will arrive in [round(estimate_arrival_time()/60)] minutes.")
-
-//recalls the shuttle
-/datum/shuttle_controller/emergency_shuttle/proc/recall()
- if (!can_recall()) return
-
- wait_for_launch = 0
- shuttle.cancel_launch(src)
-
- if (evac)
- captain_announce("The emergency shuttle has been recalled.")
- world << sound('sound/AI/shuttlerecalled.ogg')
-
- for(var/area/A in world)
- if(istype(A, /area/hallway))
- A.readyreset()
- evac = 0
- else
- captain_announce("The scheduled crew transfer has been cancelled.")
-
-/datum/shuttle_controller/emergency_shuttle/proc/can_call()
- if (deny_shuttle)
- return 0
- if (shuttle.moving_status != SHUTTLE_IDLE || !shuttle.location) //must be idle at centcom
- return 0
- if (wait_for_launch) //already launching
- return 0
- return 1
-
-//this only returns 0 if it would absolutely make no sense to recall
-//e.g. the shuttle is already at the station or wasn't called to begin with
-//other reasons for the shuttle not being recallable should be handled elsewhere
-/datum/shuttle_controller/emergency_shuttle/proc/can_recall()
- if (shuttle.moving_status == SHUTTLE_INTRANSIT) //if the shuttle is already in transit then it's too late
- return 0
- if (!shuttle.location) //already at the station.
- return 0
- if (!wait_for_launch) //we weren't going anywhere, anyways...
- return 0
- return 1
-
-/datum/shuttle_controller/emergency_shuttle/proc/get_shuttle_prep_time()
- // During mutiny rounds, the shuttle takes twice as long.
- if(ticker && istype(ticker.mode,/datum/game_mode/mutiny))
- return SHUTTLE_PREPTIME * 3 //15 minutes
-
- return SHUTTLE_PREPTIME
-
-
-/*
- These procs are not really used by the controller itself, but are for other parts of the
- game whose logic depends on the emergency shuttle.
-*/
-
-//returns the time left until the shuttle arrives at it's destination, in seconds
-/datum/shuttle_controller/emergency_shuttle/proc/estimate_arrival_time()
- var/eta
- if (isnull(shuttle.jump_time))
- eta = launch_time + shuttle.travel_time
- else
- eta = shuttle.jump_time + shuttle.travel_time
- return (eta - world.time)/10
-
-//returns the time left until the shuttle launches, in seconds
-/datum/shuttle_controller/emergency_shuttle/proc/estimate_launch_time()
- return (launch_time - world.time)/10
-
-/datum/shuttle_controller/emergency_shuttle/proc/has_eta()
- return (wait_for_launch || shuttle.moving_status != SHUTTLE_IDLE)
-
-//returns 1 if the shuttle has gone to the station and come back at least once,
-//used for game completion checking purposes
-/datum/shuttle_controller/emergency_shuttle/proc/returned()
- return (departed && shuttle.moving_status != SHUTTLE_IDLE && shuttle.location) //we've gone to the station at least once, no longer in transit and are idle back at centcom
-
-//returns 1 if the shuttle is not idle at centcom
-/datum/shuttle_controller/emergency_shuttle/proc/online()
- if (!shuttle.location) //not at centcom
- return 1
- if (wait_for_launch || shuttle.moving_status != SHUTTLE_IDLE)
- return 1
- return 0
-
-//returns 1 if the shuttle is currently in transit (or just leaving) to the station
-/datum/shuttle_controller/emergency_shuttle/proc/going_to_station()
- return (!shuttle.direction && shuttle.moving_status != SHUTTLE_IDLE)
-
-//returns 1 if the shuttle is currently in transit (or just leaving) to centcom
-/datum/shuttle_controller/emergency_shuttle/proc/going_to_centcom()
- return (shuttle.direction && shuttle.moving_status != SHUTTLE_IDLE)
-
-//returns 1 if the shuttle is docked at the station and waiting to leave
-/datum/shuttle_controller/emergency_shuttle/proc/waiting_to_leave()
- if (shuttle.location)
- return 0 //not at station
- if (!wait_for_launch)
- return 0 //not going anywhere
- if (shuttle.moving_status != SHUTTLE_IDLE)
- return 0 //shuttle is doing stuff
- return 1
-
-/*
- Some slapped-together star effects for maximum spess immershuns. Basically consists of a
- spawner, an ender, and bgstar. Spawners create bgstars, bgstars shoot off into a direction
- until they reach a starender.
-*/
-
-/obj/effect/bgstar
- name = "star"
- var/speed = 10
- var/direction = SOUTH
- layer = 2 // TURF_LAYER
-
-/obj/effect/bgstar/New()
- ..()
- pixel_x += rand(-2,30)
- pixel_y += rand(-2,30)
- var/starnum = pick("1", "1", "1", "2", "3", "4")
-
- icon_state = "star"+starnum
-
- speed = rand(2, 5)
-
-/obj/effect/bgstar/proc/startmove()
-
- while(src)
- sleep(speed)
- step(src, direction)
- for(var/obj/effect/starender/E in loc)
- del(src)
-
-
-/obj/effect/starender
- invisibility = 101
-
-/obj/effect/starspawner
- invisibility = 101
- var/spawndir = SOUTH
- var/spawning = 0
-
-/obj/effect/starspawner/West
- spawndir = WEST
-
-/obj/effect/starspawner/proc/startspawn()
- spawning = 1
- while(spawning)
- sleep(rand(2, 30))
- var/obj/effect/bgstar/S = new/obj/effect/bgstar(locate(x,y,z))
- S.direction = spawndir
- spawn()
- S.startmove()
-
-
+ //makes all shuttles docked to something at round start go into the docked state
+ for (var/shuttle_tag in shuttles)
+ shuttle = shuttles[shuttle_tag]
+ shuttle.dock()
diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm
index 491a1b2c43..e8785482a9 100644
--- a/code/controllers/verbs.dm
+++ b/code/controllers/verbs.dm
@@ -27,8 +27,7 @@
message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.")
return
-
-/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Air","Jobs","Sun","Radio","Supply","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller"))
+/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Air","Jobs","Sun","Radio","Supply","Shuttles","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller"))
set category = "Debug"
set name = "Debug Controller"
set desc = "Debug the various periodic loop controllers for the game (be careful!)"
@@ -62,6 +61,9 @@
if("Supply")
debug_variables(supply_controller)
feedback_add_details("admin_verb","DSupply")
+ if("Shuttles")
+ debug_variables(shuttle_controller)
+ feedback_add_details("admin_verb","DShuttles")
if("Emergency Shuttle")
debug_variables(emergency_shuttle)
feedback_add_details("admin_verb","DEmergency")
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index f53a09313c..0c8a7aa8bd 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -130,7 +130,7 @@ var/global/datum/controller/gameticker/ticker
//here to initialize the random events nicely at round start
setup_economy()
- setup_shuttle_docks()
+ shuttle_controller.setup_shuttle_docks()
spawn(0)//Forking here so we dont have to wait for this to finish
mode.post_setup()
diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm
index 9d8b1da6f9..b8b25b3e34 100644
--- a/code/game/machinery/computer/shuttle.dm
+++ b/code/game/machinery/computer/shuttle.dm
@@ -41,7 +41,7 @@
message_admins("[key_name_admin(user)] has launched the shuttle")
log_game("[user.ckey] has launched the shuttle early")
world << "\blue Alert: Shuttle launch time shortened to 10 seconds!"
- emergency_shuttle.launch_time = min(world.time + 100, emergency_shuttle.launch_time)
+ emergency_shuttle.set_launch_countdown(10)
//src.authorized = null
del(src.authorized)
src.authorized = list( )
@@ -62,7 +62,7 @@
switch(choice)
if("Launch")
world << "\blue Alert: Shuttle launch time shortened to 10 seconds!"
- emergency_shuttle.launch_time = min(world.time + 100, emergency_shuttle.launch_time)
+ emergency_shuttle.set_launch_countdown(10)
emagged = 1
if("Cancel")
return
diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm
index e2dfe3b442..ef6dbf2c5f 100644
--- a/code/game/supplyshuttle.dm
+++ b/code/game/supplyshuttle.dm
@@ -162,15 +162,6 @@ var/list/mechtoys = list(
points += points_per_process
sleep(processing_interval)
-
- spawn(0)
- set background = 1
- while(1)
- if(processing)
- if (shuttle.in_use)
- shuttle.process_shuttle()
-
- sleep(10)
//To stop things being sent to centcomm which should not be sent to centcomm. Recursively checks for these types.
proc/forbidden_atoms_check(atom/A)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index dcbbf837b2..653a2a8e7f 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1924,15 +1924,15 @@
if("moveshuttle")
- if(!shuttles) return // Something is very wrong, the global shuttle list has not been created.
+ if(!shuttle_controller) return // Something is very wrong, the shuttle controller has not been created.
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","ShA")
- var/shuttle_tag = input("Which shuttle do you want to call?") as null|anything in shuttles
+ var/shuttle_tag = input("Which shuttle do you want to call?") as null|anything in shuttle_controller.shuttles
if(shuttle_tag)
- var/datum/shuttle/S = shuttles[shuttle_tag]
+ var/datum/shuttle/S = shuttle_controller.shuttles[shuttle_tag]
if(istype(S) && S.moving_status == 0)
S.move()
message_admins("\blue [key_name_admin(usr)] moved the [shuttle_tag] shuttle", 1)
diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm
index 3d6e421f5b..5a4394142f 100644
--- a/code/modules/shuttles/shuttle.dm
+++ b/code/modules/shuttles/shuttle.dm
@@ -3,14 +3,12 @@
//shuttle moving state defines are in setup.dm
-var/global/list/shuttles
-
/datum/shuttle
var/warmup_time = 0
- var/moving_status = SHUTTLE_IDLE //prevents people from doing things they shouldn't when the shuttle is in transit
+ var/moving_status = SHUTTLE_IDLE
var/docking_controller_tag //tag of the controller used to coordinate docking
- var/datum/computer/file/embedded_program/docking/docking_controller //the controller itself
+ var/datum/computer/file/embedded_program/docking/docking_controller //the controller itself. (micro-controller, not game controller)
/datum/shuttle/proc/short_jump(var/area/origin,var/area/destination)
if(moving_status != SHUTTLE_IDLE) return
@@ -35,7 +33,7 @@ var/global/list/shuttles
move(locate(departing),locate(interim))
- sleep(travel_time)
+ sleep(travel_time*10)
move(locate(interim),locate(destination))
@@ -116,200 +114,4 @@ var/global/list/shuttles
if(!M.buckled)
M.Weaken(3)
- return
-
-
-
-/proc/setup_shuttles()
- 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.travel_time = SHUTTLE_TRANSIT_DURATION
- //shuttle.docking_controller_tag = "supply_shuttle"
- //shuttle.dock_target_station = "cargo_bay"
- shuttles["Escape"] = shuttle
-
- emergency_shuttle.shuttle = shuttle
- emergency_shuttle.setup_pods()
-
- // 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
-
- 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
-
- 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
-
- shuttle = new()
- shuttle.area_offsite = locate(/area/shuttle/alien/base)
- shuttle.area_station = locate(/area/shuttle/alien/mine)
- shuttles["Alien"] = shuttle
-
- // Public shuttles
- shuttle = new()
- shuttle.location = 1
- 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 = "engineering_station_airlock"
- shuttles["Engineering"] = 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
-
- 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
-
- // 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 Exodus 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
-
- //Vox Shuttle.
- var/datum/shuttle/multi_shuttle/VS = new/datum/shuttle/multi_shuttle()
- VS.origin = /area/shuttle/vox/station
-
- VS.destinations = list(
- "Fore Starboard Solars" = /area/vox_station/northeast_solars,
- "Fore Port Solars" = /area/vox_station/northwest_solars,
- "Aft Starboard Solars" = /area/vox_station/southeast_solars,
- "Aft Port Solars" = /area/vox_station/southwest_solars,
- "Mining asteroid" = /area/vox_station/mining
- )
-
- VS.announcer = "NSV Icarus"
- VS.arrival_message = "Attention, Exodus, we just tracked a small target bypassing our defensive perimeter. Can't fire on it without hitting the station - you've got incoming visitors, like it or not."
- VS.departure_message = "Your guests are pulling away, Exodus - moving too fast for us to draw a bead on them. Looks like they're heading out of the system at a rapid clip."
- VS.interim = /area/vox_station/transit
-
- VS.warmup_time = 10
- shuttles["Vox Skipjack"] = VS
-
- //Nuke Ops shuttle.
- var/datum/shuttle/multi_shuttle/MS = new/datum/shuttle/multi_shuttle()
- MS.origin = /area/syndicate_station/start
-
- MS.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 Asteroid" = /area/syndicate_station/mining
- )
-
- MS.announcer = "NSV Icarus"
- MS.arrival_message = "Attention, Exodus, you have a large signature approaching the station - looks unarmed to surface scans. We're too far out to intercept - brace for visitors."
- MS.departure_message = "Your visitors are on their way out of the system, Exodus, burning delta-v like it's nothing. Good riddance."
- MS.interim = /area/syndicate_station/transit
-
- MS.warmup_time = 10
- shuttles["Syndicate"] = MS
-
-
-/proc/setup_shuttle_docks()
- var/datum/shuttle/shuttle
- var/datum/shuttle/ferry/multidock/multidock
- var/list/dock_controller_map = list() //so we only have to iterate once through each list
-
- //multidock shuttles
- var/list/dock_controller_map_station = list()
- var/list/dock_controller_map_offsite = list()
-
- for (var/shuttle_tag in shuttles)
- shuttle = shuttles[shuttle_tag]
- if (shuttle.docking_controller_tag)
- dock_controller_map[shuttle.docking_controller_tag] = shuttle
- if (istype(shuttle, /datum/shuttle/ferry/multidock))
- multidock = shuttle
- dock_controller_map_station[multidock.docking_controller_tag_station] = multidock
- dock_controller_map_offsite[multidock.docking_controller_tag_offsite] = multidock
-
- //search for the controllers, if we have one.
- if (dock_controller_map.len)
- for (var/obj/machinery/embedded_controller/radio/C in machines) //only radio controllers are supported at the moment
- if (istype(C.program, /datum/computer/file/embedded_program/docking))
- if (C.id_tag in dock_controller_map)
- shuttle = dock_controller_map[C.id_tag]
- shuttle.docking_controller = C.program
- dock_controller_map -= C.id_tag
- if (C.id_tag in dock_controller_map_station)
- multidock = dock_controller_map_station[C.id_tag]
- if (istype(multidock))
- multidock.docking_controller_station = C.program
- dock_controller_map_station -= C.id_tag
- if (C.id_tag in dock_controller_map_offsite)
- multidock = dock_controller_map_offsite[C.id_tag]
- if (istype(multidock))
- multidock.docking_controller_offsite = C.program
- dock_controller_map_offsite -= C.id_tag
-
- //sanity check
- if (dock_controller_map.len || dock_controller_map_station.len || dock_controller_map_offsite.len)
- var/dat = ""
- for (var/dock_tag in dock_controller_map + dock_controller_map_station + dock_controller_map_offsite)
- dat += "\"[dock_tag]\", "
- world << "/red /b warning: shuttles with docking tags [dat] could not find their controllers!"
-
- //makes all shuttles docked to something at round start go into the docked state
- for (var/shuttle_tag in shuttles)
- shuttle = shuttles[shuttle_tag]
- shuttle.dock()
-
\ No newline at end of file
+ return
\ No newline at end of file
diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm
index e1ae517a4c..6dc1e5c9d3 100644
--- a/code/modules/shuttles/shuttle_console.dm
+++ b/code/modules/shuttles/shuttle_console.dm
@@ -9,8 +9,7 @@
var/direction = 0 //0 = going to station, 1 = going to offsite.
var/process_state = IDLE_STATE
- //this mutex ensures that only one console is processing the shuttle's controls at a time
- var/obj/machinery/computer/shuttle_control/in_use = null //this doesn't have to be a console...
+ var/in_use = null //tells the controller whether this shuttle needs processing
var/area_transition
var/travel_time = 0
@@ -68,7 +67,7 @@
return area_station
return area_offsite
-/datum/shuttle/ferry/proc/process_shuttle()
+/datum/shuttle/ferry/proc/process()
switch(process_state)
if (WAIT_LAUNCH)
if (skip_docking_checks() || docking_controller.can_launch())
@@ -98,7 +97,7 @@
return dock_target
-/datum/shuttle/ferry/proc/launch(var/obj/machinery/computer/shuttle_control/user)
+/datum/shuttle/ferry/proc/launch(var/user)
if (!can_launch()) return
in_use = user //obtain an exclusive lock on the shuttle
@@ -106,12 +105,15 @@
process_state = WAIT_LAUNCH
undock()
-/datum/shuttle/ferry/proc/force_launch(var/obj/machinery/computer/shuttle_control/user)
+/datum/shuttle/ferry/proc/force_launch(var/user)
if (!can_force()) return
in_use = user //obtain an exclusive lock on the shuttle
- short_jump()
+ if (travel_time && area_transition)
+ long_jump(null, null, area_transition, travel_time)
+ else
+ short_jump()
process_state = WAIT_ARRIVE
@@ -166,27 +168,6 @@
var/launch_override = 0
-
-//TODO move this stuff into the shuttle datum itself, instead of manipulating the shuttle's members
-/obj/machinery/computer/shuttle_control/process()
- if (!shuttles || !(shuttle_tag in shuttles))
- return
-
- var/datum/shuttle/ferry/shuttle = shuttles[shuttle_tag]
- if (!istype(shuttle))
- return
-
- if (shuttle.in_use == src)
- shuttle.process_shuttle()
-
-/obj/machinery/computer/shuttle_control/Del()
- var/datum/shuttle/ferry/shuttle = shuttles[shuttle_tag]
- if (!istype(shuttle))
- return
-
- if (shuttle.in_use == src)
- shuttle.in_use = null //shuttle may not dock properly if this gets deleted while in transit, but its not a big deal
-
/obj/machinery/computer/shuttle_control/attack_hand(user as mob)
if(..(user))
return
@@ -196,7 +177,7 @@
/obj/machinery/computer/shuttle_control/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
var/data[0]
- var/datum/shuttle/ferry/shuttle = shuttles[shuttle_tag]
+ var/datum/shuttle/ferry/shuttle = shuttle_controller.shuttles[shuttle_tag]
if (!istype(shuttle))
return
@@ -241,7 +222,6 @@
ui.open()
ui.set_auto_update(1)
-//TODO: Canceling launches, dock overrides using the console, forcing dock/undock
/obj/machinery/computer/shuttle_control/Topic(href, href_list)
if(..())
return
@@ -249,7 +229,7 @@
usr.set_machine(src)
src.add_fingerprint(usr)
- var/datum/shuttle/ferry/shuttle = shuttles[shuttle_tag]
+ var/datum/shuttle/ferry/shuttle = shuttle_controller.shuttles[shuttle_tag]
if (!istype(shuttle))
return
@@ -260,11 +240,11 @@
else if(href_list["cancel"])
shuttle.cancel_launch()
-
/obj/machinery/computer/shuttle_control/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/card/emag))
src.req_access = list()
+ src.req_one_access = list()
hacked = 1
usr << "You short out the console's ID checking system. It's now available to everyone!"
else
@@ -273,8 +253,3 @@
/obj/machinery/computer/shuttle_control/bullet_act(var/obj/item/projectile/Proj)
visible_message("[Proj] ricochets off [src]!")
-#undef IDLE_STATE
-#undef WAIT_LAUNCH
-#undef WAIT_ARRIVE
-#undef WAIT_FINISH
-
diff --git a/code/modules/shuttles/shuttles_multi.dm b/code/modules/shuttles/shuttles_multi.dm
index f553600715..4b737cd2cf 100644
--- a/code/modules/shuttles/shuttles_multi.dm
+++ b/code/modules/shuttles/shuttles_multi.dm
@@ -4,8 +4,8 @@
var/cloaked = 1
var/at_origin = 1
var/move_time = 240
- var/cooldown = 200
- var/last_move = 0
+ var/cooldown = 20
+ var/last_move = 0 //the time at which we last moved
var/announcer
var/arrival_message
@@ -21,6 +21,10 @@
..()
if(origin) last_departed = origin
+/datum/shuttle/multi_shuttle/move()
+ ..()
+ last_move = world.time
+
/datum/shuttle/multi_shuttle/proc/announce_departure()
if(cloaked || isnull(departure_message))
@@ -44,7 +48,7 @@
return
src.add_fingerprint(user)
- var/datum/shuttle/multi_shuttle/MS = shuttles[shuttle_tag]
+ var/datum/shuttle/multi_shuttle/MS = shuttle_controller.shuttles[shuttle_tag]
if(!istype(MS)) return
var/dat
@@ -57,7 +61,7 @@
var/area/areacheck = get_area(src)
dat += "Location: [areacheck.name]
"
- if((MS.last_move + MS.cooldown) > world.time)
+ if((MS.last_move + MS.cooldown*10) > world.time)
dat += "Engines charging.
"
else
dat += "Engines ready.
"
@@ -76,17 +80,13 @@
usr.set_machine(src)
src.add_fingerprint(usr)
- var/datum/shuttle/multi_shuttle/MS = shuttles[shuttle_tag]
+ var/datum/shuttle/multi_shuttle/MS = shuttle_controller.shuttles[shuttle_tag]
if(!istype(MS)) return
if (MS.moving_status != SHUTTLE_IDLE)
usr << "\blue [shuttle_tag] vessel is moving."
return
- if((MS.last_move + MS.cooldown) > world.time)
- usr << "\red The ship is inoperable while the engines are charging."
- return
-
if(href_list["start"])
if(MS.at_origin)
@@ -109,6 +109,9 @@
usr << "\red Ship stealth systems have been [(MS.cloaked ? "activated. The station will not" : "deactivated. The station will")] be warned of our arrival."
if(href_list["move_multi"])
+ if((MS.last_move + MS.cooldown) > world.time)
+ usr << "\red The ship's drive is inoperable while the engines are charging."
+ return
var/choice = input("Select a destination.") as null|anything in MS.destinations
if(!choice) return