diff --git a/baystation12.dme b/baystation12.dme
index 9542503e124..2ad5a94fda2 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -1446,6 +1446,7 @@
#include "code\modules\shuttles\departmental.dm"
#include "code\modules\shuttles\shuttle.dm"
#include "code\modules\shuttles\shuttle_console.dm"
+#include "code\modules\shuttles\shuttle_emergency.dm"
#include "code\modules\shuttles\shuttle_specops.dm"
#include "code\modules\shuttles\shuttle_supply.dm"
#include "code\modules\shuttles\shuttles_multi.dm"
diff --git a/code/WorkInProgress/computer3/computers/communications.dm b/code/WorkInProgress/computer3/computers/communications.dm
index 23b2540ade3..20c29aaec43 100644
--- a/code/WorkInProgress/computer3/computers/communications.dm
+++ b/code/WorkInProgress/computer3/computers/communications.dm
@@ -124,7 +124,7 @@
return
if(authenticated)
call_shuttle_proc(usr)
- if(emergency_shuttle.online)
+ if(emergency_shuttle.online())
post_status("shuttle")
state = STATE_DEFAULT
if("cancelshuttle" in href_list)
@@ -269,8 +269,8 @@
proc/main_menu()
var/dat = ""
if (computer.radio.subspace)
- if(emergency_shuttle.online && emergency_shuttle.location==0)
- var/timeleft = emergency_shuttle.timeleft()
+ if(emergency_shuttle.online() && emergency_shuttle.location())
+ var/timeleft = emergency_shuttle.estimate_arrival_time()
dat += "Emergency shuttle\n
\nETA: [timeleft / 60 % 60]:[add_zero(num2text(timeleft % 60), 2)]
"
refresh = 1
else
@@ -286,8 +286,8 @@
dat += "
\[ Restore Backup Routing Data \]"
dat += "
\[ Change alert level \]"
- if(emergency_shuttle.location==0)
- if (emergency_shuttle.online)
+ if(emergency_shuttle.location())
+ if (emergency_shuttle.online())
dat += "
\[ Cancel Shuttle Call \]"
else
dat += "
\[ Call Emergency Shuttle \]"
diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm
index 8cdd12732d6..7ff76877102 100644
--- a/code/controllers/shuttle_controller.dm
+++ b/code/controllers/shuttle_controller.dm
@@ -5,429 +5,185 @@
// these define the time taken for the shuttle to get to SS13
// and the time before it leaves again
-#define SHUTTLEARRIVETIME 600 // 10 minutes = 600 seconds
-#define SHUTTLELEAVETIME 180 // 3 minutes = 180 seconds
-#define SHUTTLETRANSITTIME 120 // 2 minutes = 120 seconds
+#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/shuttle_controller/emergency_shuttle/emergency_shuttle
-datum/shuttle_controller/emergency_shuttle
- var/alert = 0 //0 = emergency, 1 = crew cycle
+/datum/shuttle_controller/emergency_shuttle
+ 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
+
+ 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
- var/location = 0 //0 = somewhere far away (in spess), 1 = at SS13, 2 = returned from SS13
- var/online = 0
- var/direction = 1 //-1 = going back to central command, 1 = going to SS13, 2 = in transit to centcom (not recalled)
+/datum/shuttle_controller/emergency_shuttle/New()
+ if ("Escape" in shuttles && istype(shuttles["Escape"], /datum/shuttle/ferry/emergency))
+ shuttle = shuttles["Escape"]
+
+ //still don't have the shuttle, so create one
+ if (!shuttle)
+ 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
- var/endtime // timeofday that shuttle arrives
- var/timelimit //important when the shuttle gets called for more than shuttlearrivetime
- //timeleft = 360 //600
- var/fake_recall = 0 //Used in rounds to prevent "ON NOES, IT MUST [INSERT ROUND] BECAUSE SHUTTLE CAN'T BE CALLED"
-
- var/always_fake_recall = 0
- var/deny_shuttle = 0 //for admins not allowing it to be called.
- var/departed = 0
- // call the shuttle
- // if not called before, set the endtime to T+600 seconds
- // otherwise if outgoing, switch to incoming
- proc/incall(coeff = 1)
- if(deny_shuttle && alert == 1) //crew transfer shuttle does not gets recalled by gamemode
- return
- if(endtime)
- if(direction == -1)
- setdirection(1)
- else
- settimeleft(get_shuttle_arrive_time()*coeff)
- online = 1
- if(always_fake_recall)
- fake_recall = rand(300,500) //turning on the red lights in hallways
- if(alert == 0)
- for(var/area/A in world)
- if(istype(A, /area/hallway))
- A.readyalert()
-
- proc/get_shuttle_arrive_time()
- // During mutiny rounds, the shuttle takes twice as long.
- if(ticker && istype(ticker.mode,/datum/game_mode/mutiny))
- return SHUTTLEARRIVETIME * 2
-
- return SHUTTLEARRIVETIME
-
-datum/shuttle_controller/emergency_shuttle/proc/shuttlealert(var/X)
- alert = X
-
-datum/shuttle_controller/emergency_shuttle/proc/recall()
- if(direction == 1)
- var/timeleft = timeleft()
- if(alert == 0)
- if(timeleft >= get_shuttle_arrive_time())
- return
- captain_announce("The emergency shuttle has been recalled.")
- world << sound('sound/AI/shuttlerecalled.ogg')
- setdirection(-1)
- online = 1
- for(var/area/A in world)
- if(istype(A, /area/hallway))
- A.readyreset()
- return
- else //makes it possible to send shuttle back.
- captain_announce("The shuttle has been recalled.")
- setdirection(-1)
- online = 1
- alert = 0 // set alert back to 0 after an admin recall
- return
-
- // returns the time (in seconds) before shuttle arrival
- // note if direction = -1, gives a count-up to SHUTTLEARRIVETIME
-datum/shuttle_controller/emergency_shuttle/proc/timeleft()
- if(online)
- var/timeleft = round((endtime - world.timeofday)/10 ,1)
- if(direction == 1 || direction == 2)
- return timeleft
- else
- return get_shuttle_arrive_time()-timeleft
- else
- return get_shuttle_arrive_time()
-
- // sets the time left to a given delay (in seconds)
-datum/shuttle_controller/emergency_shuttle/proc/settimeleft(var/delay)
- endtime = world.timeofday + delay * 10
- timelimit = delay
-
- // sets the shuttle direction
- // 1 = towards SS13, -1 = back to centcom
-datum/shuttle_controller/emergency_shuttle/proc/setdirection(var/dirn)
- if(direction == dirn)
- return
- direction = dirn
- // if changing direction, flip the timeleft by SHUTTLEARRIVETIME
- var/ticksleft = endtime - world.timeofday
- endtime = world.timeofday + (get_shuttle_arrive_time()*10 - ticksleft)
- return
-
-datum/shuttle_controller/emergency_shuttle/proc/process()
-
-datum/shuttle_controller/emergency_shuttle/process()
- if(!online)
- return
- var/timeleft = timeleft()
- if(timeleft > 1e5) // midnight rollover protection
- timeleft = 0
- switch(location)
- if(0)
-
- /* --- Shuttle is in transit to Central Command from SS13 --- */
- if(direction == 2)
- if(timeleft>0)
- return 0
-
- /* --- Shuttle has arrived at Centrcal Command --- */
- else
- // turn off the star spawners
- /*
- for(var/obj/effect/starspawner/S in world)
- S.spawning = 0
- */
-
- location = 2
-
- //main shuttle
- var/area/start_location = locate(/area/shuttle/escape/transit)
- var/area/end_location = locate(/area/shuttle/escape/centcom)
-
- start_location.move_contents_to(end_location, null, NORTH)
-
- for(var/obj/machinery/door/unpowered/shuttle/D in end_location)
- spawn(0)
- D.locked = 0
- D.open()
-
- for(var/mob/M in end_location)
- if(M.client)
- spawn(0)
- if(M.buckled)
- shake_camera(M, 4, 1) // buckled, not a lot of shaking
- else
- shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
- if(istype(M, /mob/living/carbon))
- if(!M.buckled)
- M.Weaken(5)
-
- //pods
- start_location = locate(/area/shuttle/escape_pod1/transit)
- end_location = locate(/area/shuttle/escape_pod1/centcom)
- start_location.move_contents_to(end_location, null, NORTH)
-
- for(var/obj/machinery/door/D in machines)
- if( get_area(D) == end_location )
- spawn(0)
- D.open()
-
- for(var/mob/M in end_location)
- if(M.client)
- spawn(0)
- if(M.buckled)
- shake_camera(M, 4, 1) // buckled, not a lot of shaking
- else
- shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
- if(istype(M, /mob/living/carbon))
- if(!M.buckled)
- M.Weaken(5)
-
- start_location = locate(/area/shuttle/escape_pod2/transit)
- end_location = locate(/area/shuttle/escape_pod2/centcom)
- start_location.move_contents_to(end_location, null, NORTH)
-
- for(var/obj/machinery/door/D in machines)
- if( get_area(D) == end_location )
- spawn(0)
- D.open()
-
- for(var/mob/M in end_location)
- if(M.client)
- spawn(0)
- if(M.buckled)
- shake_camera(M, 4, 1) // buckled, not a lot of shaking
- else
- shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
- if(istype(M, /mob/living/carbon))
- if(!M.buckled)
- M.Weaken(5)
-
- start_location = locate(/area/shuttle/escape_pod3/transit)
- end_location = locate(/area/shuttle/escape_pod3/centcom)
- start_location.move_contents_to(end_location, null, NORTH)
-
- for(var/obj/machinery/door/D in machines)
- if( get_area(D) == end_location )
- spawn(0)
- D.open()
-
- for(var/mob/M in end_location)
- if(M.client)
- spawn(0)
- if(M.buckled)
- shake_camera(M, 4, 1) // buckled, not a lot of shaking
- else
- shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
- if(istype(M, /mob/living/carbon))
- if(!M.buckled)
- M.Weaken(5)
-
- start_location = locate(/area/shuttle/escape_pod5/transit)
- end_location = locate(/area/shuttle/escape_pod5/centcom)
- start_location.move_contents_to(end_location, null, EAST)
-
- for(var/obj/machinery/door/D in machines)
- if( get_area(D) == end_location )
- spawn(0)
- D.open()
-
- for(var/mob/M in end_location)
- if(M.client)
- spawn(0)
- if(M.buckled)
- shake_camera(M, 4, 1) // buckled, not a lot of shaking
- else
- shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
- if(istype(M, /mob/living/carbon))
- if(!M.buckled)
- M.Weaken(5)
-
- online = 0
-
- return 1
-
- /* --- Shuttle has docked centcom after being recalled --- */
- if(timeleft>timelimit)
- online = 0
- direction = 1
- endtime = null
-
- return 0
-
- else if((fake_recall != 0) && (timeleft <= fake_recall))
- recall()
- fake_recall = 0
- return 0
-
- /* --- Shuttle has docked with the station - begin countdown to transit --- */
- else if(timeleft <= 0)
- location = 1
- var/area/start_location = locate(/area/shuttle/escape/centcom)
- var/area/end_location = locate(/area/shuttle/escape/station)
-
- var/list/dstturfs = list()
- var/throwy = world.maxy
-
- for(var/turf/T in end_location)
- dstturfs += T
- if(T.y < throwy)
- throwy = T.y
-
- // hey you, get out of the way!
- for(var/turf/T in dstturfs)
- // find the turf to move things to
- var/turf/D = locate(T.x, throwy - 1, 1)
- //var/turf/E = get_step(D, SOUTH)
- for(var/atom/movable/AM as mob|obj in T)
- AM.Move(D)
- // NOTE: Commenting this out to avoid recreating mass driver glitch
- /*
- spawn(0)
- AM.throw_at(E, 1, 1)
- return
- */
-
- if(istype(T, /turf/simulated))
- del(T)
-
- for(var/mob/living/carbon/bug in end_location) // If someone somehow is still in the shuttle's docking area...
- bug.gib()
-
- for(var/mob/living/simple_animal/pest in end_location) // And for the other kind of bug...
- pest.gib()
-
- start_location.move_contents_to(end_location)
- settimeleft(SHUTTLELEAVETIME)
- //send2irc("Server", "The Emergency Shuttle has docked with the station.")
- captain_announce("The Emergency Shuttle has docked with the station. You have [round(timeleft()/60,1)] minutes to board the Emergency Shuttle.")
- world << sound('sound/AI/shuttledock.ogg')
-
- return 1
-
- if(1)
-
- // Just before it leaves, close the damn doors!
- if(timeleft == 2 || timeleft == 1)
- var/area/start_location = locate(/area/shuttle/escape/station)
- for(var/obj/machinery/door/unpowered/shuttle/D in start_location)
- spawn(0)
- D.close()
- D.locked = 1
-
- if(timeleft>0)
- return 0
-
- /* --- Shuttle leaves the station, enters transit --- */
+/datum/shuttle_controller/emergency_shuttle/proc/process()
+ if (wait_for_launch)
+ if (auto_recall && can_recall() && world.time >= auto_recall_time)
+ recall()
+ if (world.time >= launch_time) //time to launch the shuttle
+
+ //set the travel time
+ if (!shuttle.location) //at station
+ shuttle.travel_time = SHUTTLE_TRANSIT_DURATION_RETURN
+ departed = 1 //technically we haven't left yet, but this should be good enough
+ //TODO launch pods
else
+ shuttle.travel_time = SHUTTLE_TRANSIT_DURATION
+
+ shuttle.launch(src)
- // Turn on the star effects
+//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
+ wait_for_launch = 1 //get ready to return
- /* // kinda buggy atm, i'll fix this later
- for(var/obj/effect/starspawner/S in world)
- if(!S.spawning)
- spawn() S.startspawn()
- */
+//returns the time left until the shuttle arrives at it's destination, in ticks
+/datum/shuttle_controller/emergency_shuttle/proc/estimate_arrival_time()
+ var/eta = launch_time + shuttle.travel_time
+ return (eta - world.time)
- departed = 1 // It's going!
- location = 0 // in deep space
- direction = 2 // heading to centcom
+//returns the time left until the shuttle launches, in ticks
+/datum/shuttle_controller/emergency_shuttle/proc/estimate_launch_time()
+ return (launch_time - world.time)
- //main shuttle
- var/area/start_location = locate(/area/shuttle/escape/station)
- var/area/end_location = locate(/area/shuttle/escape/transit)
+/datum/shuttle_controller/emergency_shuttle/proc/has_eta()
+ return (wait_for_launch || shuttle.moving_status != SHUTTLE_IDLE)
- settimeleft(SHUTTLETRANSITTIME)
- start_location.move_contents_to(end_location, null, NORTH)
+//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 0 //TODO
- // Close shuttle doors, lock
- for(var/obj/machinery/door/unpowered/shuttle/D in end_location)
- spawn(0)
- D.close()
- D.locked = 1
+//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
- // Some aesthetic turbulance shaking
- for(var/mob/M in end_location)
- if(M.client)
- spawn(0)
- if(M.buckled)
- shake_camera(M, 4, 1) // buckled, not a lot of shaking
- else
- shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
- if(istype(M, /mob/living/carbon))
- if(!M.buckled)
- M.Weaken(5)
+//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)
- //pods
- start_location = locate(/area/shuttle/escape_pod1/station)
- end_location = locate(/area/shuttle/escape_pod1/transit)
- start_location.move_contents_to(end_location, null, NORTH)
- for(var/obj/machinery/door/D in end_location)
- spawn(0)
- D.close()
+//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)
- for(var/mob/M in end_location)
- if(M.client)
- spawn(0)
- if(M.buckled)
- shake_camera(M, 4, 1) // buckled, not a lot of shaking
- else
- shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
- if(istype(M, /mob/living/carbon))
- if(!M.buckled)
- M.Weaken(5)
+//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
- start_location = locate(/area/shuttle/escape_pod2/station)
- end_location = locate(/area/shuttle/escape_pod2/transit)
- start_location.move_contents_to(end_location, null, NORTH)
- for(var/obj/machinery/door/D in end_location)
- spawn(0)
- D.close()
+//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
- for(var/mob/M in end_location)
- if(M.client)
- spawn(0)
- if(M.buckled)
- shake_camera(M, 4, 1) // buckled, not a lot of shaking
- else
- shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
- if(istype(M, /mob/living/carbon))
- if(!M.buckled)
- M.Weaken(5)
+//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()
+ auto_recall_time = world.time + rand(300,500)
+ 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()
- start_location = locate(/area/shuttle/escape_pod3/station)
- end_location = locate(/area/shuttle/escape_pod3/transit)
- start_location.move_contents_to(end_location, null, NORTH)
- for(var/obj/machinery/door/D in end_location)
- spawn(0)
- D.close()
+//calls the shuttle for a routine crew transfer
+/datum/shuttle_controller/emergency_shuttle/proc/call_transfer()
+ if(!can_call()) return
- for(var/mob/M in end_location)
- if(M.client)
- spawn(0)
- if(M.buckled)
- shake_camera(M, 4, 1) // buckled, not a lot of shaking
- else
- shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
- if(istype(M, /mob/living/carbon))
- if(!M.buckled)
- M.Weaken(5)
+ //set the launch timer
+ launch_time = world.time + get_shuttle_prep_time()
+ auto_recall_time = world.time + rand(100,SHUTTLE_PREPTIME-30)
+ 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.")
- start_location = locate(/area/shuttle/escape_pod5/station)
- end_location = locate(/area/shuttle/escape_pod5/transit)
- start_location.move_contents_to(end_location, null, EAST)
- for(var/obj/machinery/door/D in end_location)
- spawn(0)
- D.close()
+//recalls the shuttle
+/datum/shuttle_controller/emergency_shuttle/proc/recall()
+ if (!can_recall()) return
- for(var/mob/M in end_location)
- if(M.client)
- spawn(0)
- if(M.buckled)
- shake_camera(M, 4, 1) // buckled, not a lot of shaking
- else
- shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
- if(istype(M, /mob/living/carbon))
- if(!M.buckled)
- M.Weaken(5)
+ wait_for_launch = 0
+ shuttle.cancel_launch(src)
- captain_announce("The Emergency Shuttle has left the station. Estimate [round(timeleft()/60,1)] minutes until the shuttle docks at Central Command.")
+ 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.")
- return 1
+/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
- else
- 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
/*
Some slapped-together star effects for maximum spess immershuns. Basically consists of a
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index 5abacbeae6a..ad00b98148b 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -111,7 +111,7 @@ var/list/blob_nodes = list()
greet_blob(blob)
if(emergency_shuttle)
- emergency_shuttle.always_fake_recall = 1
+ emergency_shuttle.auto_recall = 1
/*// Disable the blob event for this round.
if(events)
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index f99b4cc795f..ecd4e23cfdd 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -189,7 +189,7 @@ Implants;
break
/datum/game_mode/proc/check_finished() //to be called by ticker
- if(emergency_shuttle.location==2 || station_was_nuked)
+ if(emergency_shuttle.returned() || station_was_nuked)
return 1
return 0
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index 587b50b6a05..6de7fc70d15 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -370,10 +370,10 @@ var/global/datum/controller/gameticker/ticker
var/game_finished = 0
var/mode_finished = 0
if (config.continous_rounds)
- game_finished = (emergency_shuttle.location == 2 || mode.station_was_nuked)
+ game_finished = (emergency_shuttle.returned() || mode.station_was_nuked)
mode_finished = (!post_game && mode.check_finished())
else
- game_finished = (mode.check_finished() || (emergency_shuttle.location == 2 && emergency_shuttle.alert == 1))
+ game_finished = (mode.check_finished() || (emergency_shuttle.returned() && emergency_shuttle.evac == 1))
mode_finished = game_finished
if(!mode.explosion_in_progress && game_finished && (mode_finished || post_game))
diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm
index c658e046c87..79dd518948b 100644
--- a/code/game/gamemodes/malfunction/malfunction.dm
+++ b/code/game/gamemodes/malfunction/malfunction.dm
@@ -67,7 +67,7 @@
AI_mind.current.icon_state = "ai-malf2"
*/
if(emergency_shuttle)
- emergency_shuttle.always_fake_recall = 1
+ emergency_shuttle.auto_recall = 1
spawn (rand(waittime_l, waittime_h))
send_intercept()
..()
@@ -136,7 +136,7 @@
if (is_malf_ai_dead())
if(config.continous_rounds)
if(emergency_shuttle)
- emergency_shuttle.always_fake_recall = 0
+ emergency_shuttle.auto_recall = 0
malf_mode_declared = 0
else
return 1
@@ -206,7 +206,7 @@
/datum/game_mode/malfunction/declare_completion()
var/malf_dead = is_malf_ai_dead()
- var/crew_evacuated = (emergency_shuttle.location==2)
+ var/crew_evacuated = (emergency_shuttle.returned())
if ( station_captured && station_was_nuked)
feedback_set_details("round_end_result","win - AI win - nuke")
diff --git a/code/game/gamemodes/newobjective.dm b/code/game/gamemodes/newobjective.dm
index 61196ac5a2b..fef4c97e902 100644
--- a/code/game/gamemodes/newobjective.dm
+++ b/code/game/gamemodes/newobjective.dm
@@ -267,7 +267,7 @@ datum
explanation_text = "Frame [target.current.real_name], the [target.assigned_role] for a crime and make sure they are arrested and brought back to the Centcom station alive. We'll handle the rest from there."
check_completion()
- if(emergency_shuttle.location<2)
+ if(!emergency_shuttle.returned())
return 0
if(target.current.stat == 2)
return 0
@@ -313,7 +313,7 @@ datum
explanation_text = "[target.current.real_name], the [target.assigned_role] is a [pick("relative of a","friend of a","") + pick("high ranking","important","well-liked")] Syndicate [pick("Leader","Officer","Agent","sympathiser")]. Make sure they get off the station safely, while minimizing intervention."
check_completion()
- if(emergency_shuttle.location<2)
+ if(!emergency_shuttle.returned())
return 0
if(target.current.stat == 2)
@@ -477,7 +477,7 @@ datum
explanation_text = "Hijack the emergency shuttle by escaping alone."
check_completion()
- if(emergency_shuttle.location<2)
+ if(!emergency_shuttle.returned())
return 0
if(!owner.current || owner.current.stat == 2)
@@ -512,7 +512,7 @@ datum
explanation_text = "Escape on the shuttle alive, without being arrested."
check_completion()
- if(emergency_shuttle.location<2)
+ if(!emergency_shuttle.returned())
return 0
if(!owner.current || owner.current.stat ==2)
@@ -1224,7 +1224,7 @@ datum
check_completion()
if(!istype(owner.current, /mob/living/silicon))
return 0
- if(emergency_shuttle.location<2)
+ if(!emergency_shuttle.returned())
return 0
if(!owner.current)
return 0
@@ -1447,7 +1447,7 @@ datum/objective/silence
explanation_text = "Do not allow anyone to escape the station. Only allow the shuttle to be called when everyone is dead and your story is the only one left."
check_completion()
- if(emergency_shuttle.location<2)
+ if(!emergency_shuttle.returned())
return 0
var/area/shuttle = locate(/area/shuttle/escape/centcom)
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index 06e1fcb0a19..89239b5b7e0 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -270,7 +270,7 @@ proc/issyndicate(mob/living/M as mob)
if(!is_type_in_list(disk_area, centcom_areas))
disk_rescued = 0
break
- var/crew_evacuated = (emergency_shuttle.location==2)
+ var/crew_evacuated = (emergency_shuttle.returned())
//var/operatives_are_dead = is_operatives_are_dead()
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index f576b17e39e..8365381a615 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -308,7 +308,7 @@ datum/objective/hijack
check_completion()
if(!owner.current || owner.current.stat)
return 0
- if(emergency_shuttle.location<2)
+ if(!emergency_shuttle.returned())
return 0
if(issilicon(owner.current))
return 0
@@ -333,7 +333,7 @@ datum/objective/speciesist
return 1
check_completion()
- if(emergency_shuttle.location<2)
+ if(!emergency_shuttle.location())
return 0
var/area/shuttle = locate(/area/shuttle/escape/centcom)
for(var/mob/living/carbon/human/player in player_list)
@@ -351,7 +351,7 @@ datum/objective/block
check_completion()
if(!istype(owner.current, /mob/living/silicon))
return 0
- if(emergency_shuttle.location<2)
+ if(!emergency_shuttle.returned())
return 0
if(!owner.current)
return 0
@@ -369,7 +369,7 @@ datum/objective/silence
explanation_text = "Do not allow anyone to escape the station. Only allow the shuttle to be called when everyone is dead and your story is the only one left."
check_completion()
- if(emergency_shuttle.location<2)
+ if(!emergency_shuttle.returned())
return 0
for(var/mob/living/player in player_list)
@@ -393,7 +393,7 @@ datum/objective/escape
return 0
if(isbrain(owner.current))
return 0
- if(emergency_shuttle.location<2)
+ if(!emergency_shuttle.returned())
return 0
if(!owner.current || owner.current.stat ==2)
return 0
@@ -684,7 +684,7 @@ datum/objective/absorb
explanation_text = "Our knowledge must live on. Make sure at least 5 acolytes escape on the shuttle to spread their work on an another station."
check_completion()
- if(emergency_shuttle.location<2)
+ if(!emergency_shuttle.returned())
return 0
var/cultists_escaped = 0
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index 12e851d064e..b298435cf02 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -91,7 +91,7 @@
greet_revolutionary(rev_mind)
modePlayer += head_revolutionaries
if(emergency_shuttle)
- emergency_shuttle.always_fake_recall = 1
+ emergency_shuttle.auto_recall = 1
spawn (rand(waittime_l, waittime_h))
send_intercept()
..()
@@ -171,7 +171,7 @@
if(config.continous_rounds)
if(finished != 0)
if(emergency_shuttle)
- emergency_shuttle.always_fake_recall = 0
+ emergency_shuttle.auto_recall = 0
return ..()
if(finished != 0)
return 1
diff --git a/code/game/gamemodes/sandbox/sandbox.dm b/code/game/gamemodes/sandbox/sandbox.dm
index 475c3d22aa5..e3c270678df 100644
--- a/code/game/gamemodes/sandbox/sandbox.dm
+++ b/code/game/gamemodes/sandbox/sandbox.dm
@@ -18,4 +18,4 @@
/datum/game_mode/sandbox/post_setup()
..()
if(emergency_shuttle)
- emergency_shuttle.always_fake_recall = 1
+ emergency_shuttle.auto_recall = 1
diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm
index c4c836b5b11..9fdf6c674d4 100644
--- a/code/game/gamemodes/scoreboard.dm
+++ b/code/game/gamemodes/scoreboard.dm
@@ -305,7 +305,7 @@
Ore Mined: [score_oremined] ([score_oremined * 2] Points)
Refreshments Prepared: [score_meals] ([score_meals * 5] Points)
Research Completed: [score_researchdone] ([score_researchdone * 30] Points)
"}
- if (emergency_shuttle.location == 2) dat += "Shuttle Escapees: [score_escapees] ([score_escapees * 25] Points)
"
+ if (!emergency_shuttle.location()) dat += "Shuttle Escapees: [score_escapees] ([score_escapees * 25] Points)
"
dat += {"Random Events Endured: [score_eventsendured] ([score_eventsendured * 50] Points)
Whole Station Powered: [score_powerbonus ? "Yes" : "No"] ([score_powerbonus * 2500] Points)
Ultra-Clean Station: [score_mess ? "No" : "Yes"] ([score_messbonus * 3000] Points)
@@ -326,7 +326,7 @@
dat += {"Richest Escapee: [score_richestname], [score_richestjob]: $[num2text(score_richestcash,50)] ([score_richestkey])
Most Battered Escapee: [score_dmgestname], [score_dmgestjob]: [score_dmgestdamage] damage ([score_dmgestkey])
"}
else
- if (emergency_shuttle.location != 2) dat += "The station wasn't evacuated!
"
+ if (emergency_shuttle.location()) dat += "The station wasn't evacuated!
"
else dat += "No-one escaped!
"
dat += {"