diff --git a/baystation12.dme b/baystation12.dme
index 5a899acba0..e1421ebc1b 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -1297,6 +1297,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/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm
index 8cdd12732d..11678a7d91 100644
--- a/code/controllers/shuttle_controller.dm
+++ b/code/controllers/shuttle_controller.dm
@@ -5,429 +5,233 @@
// 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/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
- 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/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
- 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"
+ 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
- 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 && 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()
- // 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*10
+ 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()
- */
+//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
- departed = 1 // It's going!
- location = 0 // in deep space
- direction = 2 // heading to centcom
+//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()
- //main shuttle
- var/area/start_location = locate(/area/shuttle/escape/station)
- var/area/end_location = locate(/area/shuttle/escape/transit)
+//calls the shuttle for a routine crew transfer
+/datum/shuttle_controller/emergency_shuttle/proc/call_transfer()
+ if(!can_call()) return
- settimeleft(SHUTTLETRANSITTIME)
- start_location.move_contents_to(end_location, null, NORTH)
+ //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.")
- // Close shuttle doors, lock
- for(var/obj/machinery/door/unpowered/shuttle/D in end_location)
- spawn(0)
- D.close()
- D.locked = 1
+//recalls the shuttle
+/datum/shuttle_controller/emergency_shuttle/proc/recall()
+ if (!can_recall()) return
- // 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)
+ wait_for_launch = 0
+ shuttle.cancel_launch(src)
- //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()
+ 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.")
- 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)
+/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
- 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()
+//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
- 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)
+/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
- 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()
+ return SHUTTLE_PREPTIME
+
- 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)
+/*
+ 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.
+*/
- 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()
+//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
- 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 the time left until the shuttle launches, in seconds
+/datum/shuttle_controller/emergency_shuttle/proc/estimate_launch_time()
+ return (launch_time - world.time)/10
- captain_announce("The Emergency Shuttle has left the station. Estimate [round(timeleft()/60,1)] minutes until the shuttle docks at Central Command.")
+/datum/shuttle_controller/emergency_shuttle/proc/has_eta()
+ return (wait_for_launch || shuttle.moving_status != SHUTTLE_IDLE)
- return 1
+//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
- else
- return 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
+//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
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 666d3dd17c..415d1362be 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -123,7 +123,7 @@ Implants;
/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 18f6d11410..f53a09313c 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -315,10 +315,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 eccf013fff..1f6f40176c 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 30791aefcc..e58801a329 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 f0713a6cfc..80f2f3a4dd 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -279,7 +279,7 @@
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 848f247db9..5112a51187 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -285,7 +285,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
@@ -307,7 +307,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
@@ -325,7 +325,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)
@@ -350,7 +350,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
@@ -709,7 +709,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 f6199dcb16..0a32c1ed45 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()
..()
@@ -175,7 +175,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 475c3d22aa..e3c270678d 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/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 9d499e168c..9af0cff2a8 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -119,7 +119,7 @@
if("callshuttle2")
if(src.authenticated)
call_shuttle_proc(usr)
- if(emergency_shuttle.online)
+ if(emergency_shuttle.online())
post_status("shuttle")
src.state = STATE_DEFAULT
if("cancelshuttle")
@@ -284,8 +284,8 @@
user.set_machine(src)
var/dat = "
Communications Console"
- if (emergency_shuttle.online && emergency_shuttle.location==0)
- var/timeleft = emergency_shuttle.timeleft()
+ if (emergency_shuttle.has_eta())
+ var/timeleft = emergency_shuttle.estimate_arrival_time()
dat += "Emergency shuttle\n
\nETA: [timeleft / 60 % 60]:[add_zero(num2text(timeleft % 60), 2)]
"
if (istype(user, /mob/living/silicon))
@@ -309,8 +309,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 \]"
@@ -377,7 +377,7 @@
var/dat = ""
switch(src.aistate)
if(STATE_DEFAULT)
- if(emergency_shuttle.location==0 && !emergency_shuttle.online)
+ if(!emergency_shuttle.location() && !emergency_shuttle.online())
dat += "
\[ Call Emergency Shuttle \]"
dat += "
\[ Message List \]"
dat += "
\[ Set Status Display \]"
@@ -424,22 +424,26 @@
PS.allowedtocall = !(PS.allowedtocall)
/proc/call_shuttle_proc(var/mob/user)
- if ((!( ticker ) || emergency_shuttle.location))
+ if ((!( ticker ) || !emergency_shuttle.location()))
return
if(sent_strike_team == 1)
user << "Centcom will not allow the shuttle to be called. Consider all contracts terminated."
return
- if(world.time < 6000) // Ten minute grace period to let the game get going without lolmetagaming. -- TLE
- user << "The emergency shuttle is refueling. Please wait another [round((6000-world.time)/600)] minutes before trying again."
+ if(emergency_shuttle.deny_shuttle)
+ user << "The emergency shuttle may not be sent at this time. Please try again later."
return
- if(emergency_shuttle.direction == -1)
+ if(world.time < 6000) // Ten minute grace period to let the game get going without lolmetagaming. -- TLE
+ user << "The emergency shuttle is refueling. Please wait another [round((6000-world.time)/60)] minutes before trying again."
+ return
+
+ if(emergency_shuttle.going_to_centcom())
user << "The emergency shuttle may not be called while returning to CentCom."
return
- if(emergency_shuttle.online)
+ if(emergency_shuttle.online())
user << "The emergency shuttle is already on its way."
return
@@ -447,23 +451,22 @@
user << "Under directive 7-10, [station_name()] is quarantined until further notice."
return
- emergency_shuttle.incall()
+ emergency_shuttle.call_evac()
log_game("[key_name(user)] has called the shuttle.")
message_admins("[key_name_admin(user)] has called the shuttle.", 1)
- captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
- world << sound('sound/AI/shuttlecalled.ogg')
+
return
/proc/init_shift_change(var/mob/user, var/force = 0)
- if ((!( ticker ) || emergency_shuttle.location))
+ if ((!( ticker ) || !emergency_shuttle.location()))
return
- if(emergency_shuttle.direction == -1)
+ if(emergency_shuttle.going_to_centcom())
user << "The shuttle may not be called while returning to CentCom."
return
- if(emergency_shuttle.online)
+ if(emergency_shuttle.online())
user << "The shuttle is already on its way."
return
@@ -478,32 +481,30 @@
return
if(world.time < 54000) // 30 minute grace period to let the game get going
- user << "The shuttle is refueling. Please wait another [round((54000-world.time)/600)] minutes before trying again."//may need to change "/600"
+ user << "The shuttle is refueling. Please wait another [round((54000-world.time)/60)] minutes before trying again."
return
if(ticker.mode.name == "revolution" || ticker.mode.name == "AI malfunction" || ticker.mode.name == "sandbox")
//New version pretends to call the shuttle but cause the shuttle to return after a random duration.
- emergency_shuttle.fake_recall = rand(300,500)
+ emergency_shuttle.auto_recall = 1
if(ticker.mode.name == "blob" || ticker.mode.name == "epidemic")
user << "Under directive 7-10, [station_name()] is quarantined until further notice."
return
- emergency_shuttle.shuttlealert(1)
- emergency_shuttle.incall()
+ emergency_shuttle.call_transfer()
log_game("[key_name(user)] has called the shuttle.")
message_admins("[key_name_admin(user)] has called the shuttle.", 1)
- captain_announce("A crew transfer has been initiated. The shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
return
/proc/cancel_call_proc(var/mob/user)
- if ((!( ticker ) || emergency_shuttle.location || emergency_shuttle.direction == 0 || emergency_shuttle.timeleft() < 300))
+ if (!( ticker ) || !emergency_shuttle.can_recall())
return
if((ticker.mode.name == "blob")||(ticker.mode.name == "meteor"))
return
- if(emergency_shuttle.direction != -1 && emergency_shuttle.online) //check that shuttle isn't already heading to centcomm
+ if(!emergency_shuttle.going_to_centcom()) //check that shuttle isn't already heading to centcomm
emergency_shuttle.recall()
log_game("[key_name(user)] has recalled the shuttle.")
message_admins("[key_name_admin(user)] has recalled the shuttle.", 1)
@@ -549,11 +550,9 @@
if(ticker.mode.name == "revolution" || ticker.mode.name == "AI malfunction" || sent_strike_team)
return ..()
- emergency_shuttle.incall(2)
+ emergency_shuttle.call_evac()
log_game("All the AIs, comm consoles and boards are destroyed. Shuttle called.")
message_admins("All the AIs, comm consoles and boards are destroyed. Shuttle called.", 1)
- captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
- world << sound('sound/AI/shuttlecalled.ogg')
..()
@@ -574,10 +573,8 @@
if(ticker.mode.name == "revolution" || ticker.mode.name == "AI malfunction" || sent_strike_team)
return ..()
- emergency_shuttle.incall(2)
+ emergency_shuttle.call_evac()
log_game("All the AIs, comm consoles and boards are destroyed. Shuttle called.")
message_admins("All the AIs, comm consoles and boards are destroyed. Shuttle called.", 1)
- captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
- world << sound('sound/AI/shuttlecalled.ogg')
..()
diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm
index 978db653f9..9d8b1da6f9 100644
--- a/code/game/machinery/computer/shuttle.dm
+++ b/code/game/machinery/computer/shuttle.dm
@@ -8,7 +8,7 @@
attackby(var/obj/item/weapon/card/W as obj, var/mob/user as mob)
if(stat & (BROKEN|NOPOWER)) return
- if ((!( istype(W, /obj/item/weapon/card) ) || !( ticker ) || emergency_shuttle.location != 1 || !( user ))) return
+ if ((!( istype(W, /obj/item/weapon/card) ) || !( ticker ) || emergency_shuttle.location() || !( user ))) return
if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
if (istype(W, /obj/item/device/pda))
var/obj/item/device/pda/pda = W
@@ -27,7 +27,7 @@
return 0
var/choice = alert(user, text("Would you like to (un)authorize a shortened launch time? [] authorization\s are still needed. Use abort to cancel all authorizations.", src.auth_need - src.authorized.len), "Shuttle Launch", "Authorize", "Repeal", "Abort")
- if(emergency_shuttle.location != 1 && user.get_active_hand() != W)
+ if(emergency_shuttle.location() && user.get_active_hand() != W)
return 0
switch(choice)
if("Authorize")
@@ -41,8 +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.online = 1
- emergency_shuttle.settimeleft(10)
+ emergency_shuttle.launch_time = min(world.time + 100, emergency_shuttle.launch_time)
//src.authorized = null
del(src.authorized)
src.authorized = list( )
@@ -59,11 +58,11 @@
else if (istype(W, /obj/item/weapon/card/emag) && !emagged)
var/choice = alert(user, "Would you like to launch the shuttle?","Shuttle control", "Launch", "Cancel")
- if(!emagged && emergency_shuttle.location == 1 && user.get_active_hand() == W)
+ if(!emagged && !emergency_shuttle.location() && user.get_active_hand() == W)
switch(choice)
if("Launch")
world << "\blue Alert: Shuttle launch time shortened to 10 seconds!"
- emergency_shuttle.settimeleft( 10 )
+ emergency_shuttle.launch_time = min(world.time + 100, emergency_shuttle.launch_time)
emagged = 1
if("Cancel")
return
diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm
index 404c2d54ca..ea145b5444 100644
--- a/code/game/machinery/status_display.dm
+++ b/code/game/machinery/status_display.dm
@@ -74,13 +74,15 @@
if(0) //blank
remove_display()
if(1) //emergency shuttle timer
- if(emergency_shuttle.online)
- var/line1
- var/line2 = get_shuttle_timer()
- if(emergency_shuttle.location == 1)
- line1 = "-ETD-"
- else
- line1 = "-ETA-"
+ if(emergency_shuttle.waiting_to_leave())
+ var/line1 = "-ETD-"
+ var/line2 = get_shuttle_timer_departure()
+ if(length(line2) > CHARS_PER_LINE)
+ line2 = "Error!"
+ update_display(line1, line2)
+ else if(emergency_shuttle.has_eta())
+ var/line1 = "-ETA-"
+ var/line2 = get_shuttle_timer_arrival()
if(length(line2) > CHARS_PER_LINE)
line2 = "Error!"
update_display(line1, line2)
@@ -111,8 +113,8 @@
if(4) // supply shuttle timer
var/line1 = "SUPPLY"
var/line2 = ""
-
- var/datum/shuttle/ferry/supply/shuttle = supply_controller.get_shuttle()
+
+ var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle
if (!shuttle)
line2 = "Error"
else if(shuttle.has_eta())
@@ -164,17 +166,23 @@
if(maptext != new_text)
maptext = new_text
- proc/get_shuttle_timer()
- var/timeleft = emergency_shuttle.timeleft()
- if(timeleft)
- return "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]"
- return ""
+ proc/get_shuttle_timer_arrival()
+ var/timeleft = emergency_shuttle.estimate_arrival_time()
+ if(timeleft < 0)
+ return ""
+ return "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]"
+
+ proc/get_shuttle_timer_departure()
+ var/timeleft = emergency_shuttle.estimate_launch_time()
+ if(timeleft < 0)
+ return ""
+ return "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]"
proc/get_supply_shuttle_timer()
- var/datum/shuttle/ferry/supply/shuttle = supply_controller.get_shuttle()
+ var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle
if (!shuttle)
return "Error"
-
+
if(shuttle.has_eta())
var/timeleft = round((shuttle.arrive_time - world.time) / 10,1)
if(timeleft < 0)
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
index 0f041ef5c9..9262c943bf 100644
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ b/code/game/objects/items/devices/PDA/cart.dm
@@ -411,7 +411,7 @@
if(mode==47)
var/supplyData[0]
- var/datum/shuttle/ferry/supply/shuttle = supply_controller.get_shuttle()
+ var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle
if (shuttle)
supplyData["shuttle_moving"] = shuttle.has_eta()
supplyData["shuttle_eta"] = shuttle.eta_minutes()
diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm
index aa4ecd007d..e2dfe3b442 100644
--- a/code/game/supplyshuttle.dm
+++ b/code/game/supplyshuttle.dm
@@ -143,22 +143,11 @@ var/list/mechtoys = list(
var/list/supply_packs = list()
//shuttle movement
var/movetime = 1200
- var/shuttle_tag = "Supply"
+ var/datum/shuttle/ferry/supply/shuttle
New()
ordernum = rand(1,9000)
- proc/get_shuttle()
- if (!shuttles || !(shuttle_tag in shuttles))
- return null
-
- var/datum/shuttle/ferry/supply/shuttle = shuttles[shuttle_tag]
-
- if (!istype(shuttle))
- return null
-
- return shuttle
-
//Supply shuttle ticker - handles supply point regenertion and shuttle travelling between centcomm and the station
proc/process()
for(var/typepath in (typesof(/datum/supply_packs) - /datum/supply_packs))
@@ -178,8 +167,7 @@ var/list/mechtoys = list(
set background = 1
while(1)
if(processing)
- var/datum/shuttle/ferry/supply/shuttle = get_shuttle()
- if (shuttle && shuttle.in_use)
+ if (shuttle.in_use)
shuttle.process_shuttle()
sleep(10)
@@ -202,21 +190,18 @@ var/list/mechtoys = list(
//Sellin
proc/sell()
- var/datum/shuttle/ferry/supply/shuttle_datum = get_shuttle()
- if (!shuttle_datum) return
-
- var/area/shuttle = shuttle_datum.get_location_area()
- if(!shuttle) return
+ var/area/area_shuttle = shuttle.get_location_area()
+ if(!area_shuttle) return
var/phoron_count = 0
var/plat_count = 0
- for(var/atom/movable/MA in shuttle)
+ for(var/atom/movable/MA in area_shuttle)
if(MA.anchored) continue
// Must be in a crate!
if(istype(MA,/obj/structure/closet/crate))
- callHook("sell_crate", list(MA, shuttle))
+ callHook("sell_crate", list(MA, area_shuttle))
points += points_per_crate
var/find_slip = 1
@@ -253,15 +238,12 @@ var/list/mechtoys = list(
proc/buy()
if(!shoppinglist.len) return
- var/datum/shuttle/ferry/supply/shuttle_datum = get_shuttle()
- if (!shuttle_datum) return
-
- var/area/shuttle = shuttle_datum.get_location_area()
- if(!shuttle) return
+ var/area/area_shuttle = shuttle.get_location_area()
+ if(!area_shuttle) return
var/list/clear_turfs = list()
- for(var/turf/T in shuttle)
+ for(var/turf/T in area_shuttle)
if(T.density || T.contents.len) continue
clear_turfs += T
@@ -339,7 +321,7 @@ var/list/mechtoys = list(
if(temp)
dat = temp
else
- var/datum/shuttle/ferry/supply/shuttle = supply_controller.get_shuttle()
+ var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle
if (shuttle)
dat += {"
Supply shuttle
Location: [shuttle.has_eta() ? "Moving to station ([shuttle.eta_minutes()] Mins.)":shuttle.at_station() ? "Docked":"Away"]
@@ -466,7 +448,7 @@ var/list/mechtoys = list(
if (temp)
dat = temp
else
- var/datum/shuttle/ferry/supply/shuttle = supply_controller.get_shuttle()
+ var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle
if (shuttle)
dat += "
Supply shuttle
"
dat += "\nLocation: "
@@ -525,7 +507,7 @@ var/list/mechtoys = list(
if(!supply_controller)
world.log << "## ERROR: Eek. The supply_controller controller datum is missing somehow."
return
- var/datum/shuttle/ferry/supply/shuttle = supply_controller.get_shuttle()
+ var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle
if (!shuttle)
world.log << "## ERROR: Eek. The supply/shuttle datum is missing somehow."
return
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 132352bfc5..977239f92f 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -397,15 +397,15 @@
dat += "Current Game Mode: [ticker.mode.name]
"
dat += "Round Duration: [round(world.time / 36000)]:[add_zero(world.time / 600 % 60, 2)]:[world.time / 100 % 6][world.time / 100 % 10]
"
dat += "Emergency shuttle
"
- if (!emergency_shuttle.online)
+ if (!emergency_shuttle.online())
dat += "Call Shuttle
"
else
- var/timeleft = emergency_shuttle.timeleft()
- switch(emergency_shuttle.location)
- if(0)
+ var/timeleft = emergency_shuttle.estimate_launch_time()
+ switch(emergency_shuttle.location())
+ if(1)
dat += "ETA: [(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]
"
dat += "Send Back
"
- if(1)
+ if(0)
dat += "ETA: [(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]
"
dat += "[ticker.delay_end ? "End Round Normally" : "Delay Round End"]
"
if(ticker.mode.syndicates.len)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 6ec90e50c5..dcbbf837b2 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -214,36 +214,37 @@
switch(href_list["call_shuttle"])
if("1")
- if ((!( ticker ) || emergency_shuttle.location))
+ if ((!( ticker ) || !emergency_shuttle.location()))
return
- emergency_shuttle.incall()
- captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
- log_admin("[key_name(usr)] called the Emergency Shuttle")
- message_admins("\blue [key_name_admin(usr)] called the Emergency Shuttle to the station", 1)
+ if (emergency_shuttle.can_call())
+ emergency_shuttle.call_evac()
+ log_admin("[key_name(usr)] called the Emergency Shuttle")
+ message_admins("\blue [key_name_admin(usr)] called the Emergency Shuttle to the station", 1)
if("2")
- if ((!( ticker ) || emergency_shuttle.location || emergency_shuttle.direction == 0))
+ if (!( ticker ) || !emergency_shuttle.location())
return
- switch(emergency_shuttle.direction)
- if(-1)
- emergency_shuttle.incall()
- captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
- log_admin("[key_name(usr)] called the Emergency Shuttle")
- message_admins("\blue [key_name_admin(usr)] called the Emergency Shuttle to the station", 1)
- if(1)
- emergency_shuttle.recall()
- log_admin("[key_name(usr)] sent the Emergency Shuttle back")
- message_admins("\blue [key_name_admin(usr)] sent the Emergency Shuttle back", 1)
+ if (emergency_shuttle.can_call())
+ emergency_shuttle.call_evac()
+ log_admin("[key_name(usr)] called the Emergency Shuttle")
+ message_admins("\blue [key_name_admin(usr)] called the Emergency Shuttle to the station", 1)
+
+ else if (emergency_shuttle.can_recall())
+ emergency_shuttle.recall()
+ log_admin("[key_name(usr)] sent the Emergency Shuttle back")
+ message_admins("\blue [key_name_admin(usr)] sent the Emergency Shuttle back", 1)
href_list["secretsadmin"] = "check_antagonist"
else if(href_list["edit_shuttle_time"])
if(!check_rights(R_SERVER)) return
- emergency_shuttle.settimeleft( input("Enter new shuttle duration (seconds):","Edit Shuttle Timeleft", emergency_shuttle.timeleft() ) as num )
- log_admin("[key_name(usr)] edited the Emergency Shuttle's timeleft to [emergency_shuttle.timeleft()]")
- captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
- message_admins("\blue [key_name_admin(usr)] edited the Emergency Shuttle's timeleft to [emergency_shuttle.timeleft()]", 1)
+ var/new_time_left = input("Enter new shuttle launch duration (seconds):","Edit Shuttle Timeleft", emergency_shuttle.estimate_launch_time() ) as num
+
+ emergency_shuttle.launch_time = world.time + new_time_left*10
+
+ log_admin("[key_name(usr)] edited the Emergency Shuttle's timeleft to [new_time_left]")
+ message_admins("\blue [key_name_admin(usr)] edited the Emergency Shuttle's timeleft to [new_time_left*10]", 1)
href_list["secretsadmin"] = "check_antagonist"
else if(href_list["delay_round_end"])
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 06e702bc17..ce2a2800bb 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -73,7 +73,7 @@
var/age = alert(src, "Age check", "Show accounts yonger then _____ days","7", "30" , "All")
- if(age == "All")
+ if(age == "All")
age = 9999999
else
age = text2num(age)
@@ -91,7 +91,7 @@
continue
if(C.player_age < age)
msg += "[key_name(C, 1, 1, highlight_special_characters)]: account is [C.player_age] days old
"
-
+
if(missing_ages)
src << "Some accounts did not have proper ages set in their clients. This function requires database to be present"
@@ -264,7 +264,7 @@ Ccomp's first proc.
/client/proc/get_ghosts(var/notify = 0,var/what = 2)
// what = 1, return ghosts ass list.
- // what = 2, return mob list
+ // what = 2, return mob list
var/list/mobs = list()
var/list/ghosts = list()
@@ -300,22 +300,22 @@ Ccomp's first proc.
src << "Hrm, appears you didn't select a ghost" // Sanity check, if no ghosts in the list we don't want to edit a null variable and cause a runtime error.
return
- var/mob/dead/observer/G = ghosts[target]
- if(G.has_enabled_antagHUD && config.antag_hud_restricted)
+ var/mob/dead/observer/G = ghosts[target]
+ if(G.has_enabled_antagHUD && config.antag_hud_restricted)
var/response = alert(src, "Are you sure you wish to allow this individual to play?","Ghost has used AntagHUD","Yes","No")
- if(response == "No") return
+ if(response == "No") return
G.timeofdeath=-19999 /* time of death is checked in /mob/verb/abandon_mob() which is the Respawn verb.
timeofdeath is used for bodies on autopsy but since we're messing with a ghost I'm pretty sure
there won't be an autopsy.
*/
- G.has_enabled_antagHUD = 2
+ G.has_enabled_antagHUD = 2
G.can_reenter_corpse = 1
G:show_message(text("\blue You may now respawn. You should roleplay as if you learned nothing about the round during your time with the dead."), 1)
log_admin("[key_name(usr)] allowed [key_name(G)] to bypass the 30 minute respawn limit")
message_admins("Admin [key_name_admin(usr)] allowed [key_name_admin(G)] to bypass the 30 minute respawn limit", 1)
-
+
/client/proc/toggle_antagHUD_use()
set category = "Server"
set name = "Toggle antagHUD usage"
@@ -331,7 +331,7 @@ Ccomp's first proc.
if(g.antagHUD)
g.antagHUD = 0 // Disable it on those that have it enabled
g.has_enabled_antagHUD = 2 // We'll allow them to respawn
- g << "\red The Administrator has disabled AntagHUD "
+ g << "\red The Administrator has disabled AntagHUD "
config.antag_hud_allowed = 0
src << "\red AntagHUD usage has been disabled"
action = "disabled"
@@ -343,8 +343,8 @@ Ccomp's first proc.
config.antag_hud_allowed = 1
action = "enabled"
src << "\blue AntagHUD usage has been enabled"
-
-
+
+
log_admin("[key_name(usr)] has [action] antagHUD usage for observers")
message_admins("Admin [key_name_admin(usr)] has [action] antagHUD usage for observers", 1)
@@ -361,7 +361,7 @@ Ccomp's first proc.
for(var/mob/dead/observer/g in get_ghosts())
g << "\blue The administrator has lifted restrictions on joining the round if you use AntagHUD"
action = "lifted restrictions"
- config.antag_hud_restricted = 0
+ config.antag_hud_restricted = 0
src << "\blue AntagHUD restrictions have been lifted"
else
for(var/mob/dead/observer/g in get_ghosts())
@@ -375,7 +375,7 @@ Ccomp's first proc.
log_admin("[key_name(usr)] has [action] on joining the round if they use AntagHUD")
message_admins("Admin [key_name_admin(usr)] has [action] on joining the round if they use AntagHUD", 1)
-
+
@@ -883,7 +883,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set category = "Admin"
set name = "Call Shuttle"
- if ((!( ticker ) || emergency_shuttle.location))
+ if ((!( ticker ) || !emergency_shuttle.location()))
return
if(!check_rights(R_ADMIN)) return
@@ -891,16 +891,21 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
if(confirm != "Yes") return
+ var/choice
if(ticker.mode.name == "revolution" || ticker.mode.name == "AI malfunction" || ticker.mode.name == "confliction")
- var/choice = input("The shuttle will just return if you call it. Call anyway?") in list("Confirm", "Cancel")
+ choice = input("The shuttle will just return if you call it. Call anyway?") in list("Confirm", "Cancel")
if(choice == "Confirm")
- emergency_shuttle.fake_recall = rand(300,500)
+ emergency_shuttle.auto_recall = 1 //enable auto-recall
else
return
- emergency_shuttle.incall()
- captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
- world << sound('sound/AI/shuttlecalled.ogg')
+ choice = input("Is this an emergency evacuation or a crew transfer?") in list("Emergency", "Crew Transfer")
+ if (choice == "Emergency")
+ emergency_shuttle.call_evac()
+ else
+ emergency_shuttle.call_transfer()
+
+
feedback_add_details("admin_verb","CSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] admin-called the emergency shuttle.")
message_admins("\blue [key_name_admin(usr)] admin-called the emergency shuttle.", 1)
@@ -914,7 +919,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(alert(src, "You sure?", "Confirm", "Yes", "No") != "Yes") return
- if(!ticker || emergency_shuttle.location || emergency_shuttle.direction == 0)
+ if(!ticker || !emergency_shuttle.can_recall())
return
emergency_shuttle.recall()
diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm
index 92de9fff49..cf5b94322d 100644
--- a/code/modules/admin/verbs/striketeam.dm
+++ b/code/modules/admin/verbs/striketeam.dm
@@ -30,7 +30,7 @@ var/global/sent_strike_team = 0
sent_strike_team = 1
- if (emergency_shuttle.direction == 1 && emergency_shuttle.online == 1)
+ if (emergency_shuttle.can_recall())
emergency_shuttle.recall()
var/commando_number = commandos_possible //for selecting a leader
diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm
index e8c446d966..bd1b1707f6 100644
--- a/code/modules/admin/verbs/striketeam_syndicate.dm
+++ b/code/modules/admin/verbs/striketeam_syndicate.dm
@@ -35,8 +35,8 @@ var/global/sent_syndicate_strike_team = 0
sent_syndicate_strike_team = 1
- if (emergency_shuttle.direction == 1 && emergency_shuttle.online == 1)
- emergency_shuttle.recall()
+ //if (emergency_shuttle.can_recall())
+ // emergency_shuttle.recall() //why, exactly? Admins can do this themselves.
var/syndicate_commando_number = syndicate_commandos_possible //for selecting a leader
var/syndicate_leader_selected = 0 //when the leader is chosen. The last person spawned.
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index df0edf4b1a..2386c5f524 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -216,8 +216,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(ticker.mode:malf_mode_declared)
stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]")
if(emergency_shuttle)
- if(emergency_shuttle.online && emergency_shuttle.location < 2)
- var/timeleft = emergency_shuttle.timeleft()
+ if(emergency_shuttle.has_eta() && !emergency_shuttle.returned())
+ var/timeleft = emergency_shuttle.estimate_arrival_time()
if (timeleft)
stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index c0214abd9f..89e9cff654 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -159,8 +159,8 @@
stat(null, "Plasma Stored: [getPlasma()]/[max_plasma]")
if(emergency_shuttle)
- if(emergency_shuttle.online && emergency_shuttle.location < 2)
- var/timeleft = emergency_shuttle.timeleft()
+ if(emergency_shuttle.has_eta() && !emergency_shuttle.returned())
+ var/timeleft = emergency_shuttle.estimate_arrival_time()
if (timeleft)
stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index c25a712ec7..7f668cf2f1 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -171,8 +171,8 @@
if(ticker.mode:malf_mode_declared)
stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]")
if(emergency_shuttle)
- if(emergency_shuttle.online && emergency_shuttle.location < 2)
- var/timeleft = emergency_shuttle.timeleft()
+ if(emergency_shuttle.has_eta() && !emergency_shuttle.returned())
+ var/timeleft = emergency_shuttle.estimate_arrival_time()
if (timeleft)
stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 594c66da5d..005386f3d2 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -291,7 +291,7 @@ var/list/ai_list = list()
call_shuttle_proc(src)
// hack to display shuttle timer
- if(emergency_shuttle.online)
+ if(emergency_shuttle.online())
var/obj/machinery/computer/communications/C = locate() in machines
if(C)
C.post_status("shuttle")
diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm
index 6e2fb560b3..c954185846 100644
--- a/code/modules/mob/living/silicon/ai/death.dm
+++ b/code/modules/mob/living/silicon/ai/death.dm
@@ -39,11 +39,9 @@
callshuttle = 0
if(callshuttle == 3) //if all three conditions are met
- emergency_shuttle.incall(2)
+ emergency_shuttle.call_evac()
log_game("All the AIs, comm consoles and boards are destroyed. Shuttle called.")
message_admins("All the AIs, comm consoles and boards are destroyed. Shuttle called.", 1)
- captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
- world << sound('sound/AI/shuttlecalled.ogg')
if(explosive)
spawn(10)
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 19ed4be3c2..8e1cf220d8 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -97,10 +97,11 @@
// this function displays the shuttles ETA in the status panel if the shuttle has been called
/mob/living/silicon/proc/show_emergency_shuttle_eta()
- if(emergency_shuttle.online && emergency_shuttle.location < 2)
- var/timeleft = emergency_shuttle.timeleft()
- if (timeleft)
- stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
+ if(emergency_shuttle)
+ if(emergency_shuttle.has_eta() && !emergency_shuttle.returned())
+ var/timeleft = emergency_shuttle.estimate_arrival_time()
+ if (timeleft)
+ stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
// This adds the basic clock, shuttle recall timer, and malf_ai info to all silicon lifeforms
diff --git a/code/modules/mob/living/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm
index b78c037bbc..f8faad0635 100644
--- a/code/modules/mob/living/simple_animal/borer.dm
+++ b/code/modules/mob/living/simple_animal/borer.dm
@@ -146,8 +146,8 @@
statpanel("Status")
if(emergency_shuttle)
- if(emergency_shuttle.online && emergency_shuttle.location < 2)
- var/timeleft = emergency_shuttle.timeleft()
+ if(emergency_shuttle.has_eta() && !emergency_shuttle.returned())
+ var/timeleft = emergency_shuttle.estimate_arrival_time()
if (timeleft)
stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index d869d4ba36..1bc7730b36 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -329,12 +329,13 @@
dat += "Round Duration: [round(hours)]h [round(mins)]m
"
if(emergency_shuttle) //In case Nanotrasen decides reposess CentComm's shuttles.
- if(emergency_shuttle.direction == 2) //Shuttle is going to centcomm, not recalled
+ if(emergency_shuttle.going_to_centcom()) //Shuttle is going to centcomm, not recalled
dat += "The station has been evacuated.
"
- if(emergency_shuttle.direction == 1 && emergency_shuttle.timeleft() < 300 && emergency_shuttle.alert == 0) // Emergency shuttle is past the point of no recall
- dat += "The station is currently undergoing evacuation procedures.
"
- if(emergency_shuttle.direction == 1 && emergency_shuttle.alert == 1) // Crew transfer initiated
- dat += "The station is currently undergoing crew transfer procedures.
"
+ if(emergency_shuttle.online())
+ if (emergency_shuttle.evac) // Emergency shuttle is past the point of no recall
+ dat += "The station is currently undergoing evacuation procedures.
"
+ else // Crew transfer initiated
+ dat += "The station is currently undergoing crew transfer procedures.
"
dat += "Choose from the following open positions:
"
for(var/datum/job/job in job_master.occupations)
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 900d0c2b17..e71157be7e 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -475,8 +475,9 @@ var/global/list/uneatable = list(
/obj/machinery/singularity/narsie/large/New()
..()
world << "NAR-SIE HAS RISEN"
- if(emergency_shuttle)
- emergency_shuttle.incall(0.5) // Cannot recall
+ if(emergency_shuttle && emergency_shuttle.can_call())
+ emergency_shuttle.call_evac()
+ emergency_shuttle.launch_time = 0 // Cannot recall
/obj/machinery/singularity/narsie/process()
eat()
diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm
index 471c4a77d3..3d6e421f5b 100644
--- a/code/modules/shuttles/shuttle.dm
+++ b/code/modules/shuttles/shuttle.dm
@@ -101,7 +101,7 @@ var/global/list/shuttles
for(var/mob/living/simple_animal/pest in destination)
pest.gib()
- origin.move_contents_to(destination)
+ origin.move_contents_to(destination) //might need to use the "direction" argument here, I dunno.
for(var/mob/M in destination)
if(M.client)
@@ -124,8 +124,23 @@ var/global/list/shuttles
shuttles = list()
var/datum/shuttle/ferry/shuttle
-
- //Supply and escape shuttles.
+
+ // 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
@@ -134,6 +149,8 @@ var/global/list/shuttles
shuttle.docking_controller_tag = "supply_shuttle"
shuttle.dock_target_station = "cargo_bay"
shuttles["Supply"] = shuttle
+
+ supply_controller.shuttle = shuttle
// Admin shuttles.
shuttle = new()
diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm
index 13f8884be3..e1ae517a4c 100644
--- a/code/modules/shuttles/shuttle_console.dm
+++ b/code/modules/shuttles/shuttle_console.dm
@@ -6,11 +6,15 @@
/datum/shuttle/ferry
var/location = 0 //0 = at area_station, 1 = at area_offsite
+ 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
-
+ var/obj/machinery/computer/shuttle_control/in_use = null //this doesn't have to be a console...
+
+ var/area_transition
+ var/travel_time = 0
+
var/area_station
var/area_offsite
//TODO: change location to a string and use a mapping for area and dock targets.
@@ -25,7 +29,8 @@
destination = get_location_area(!location)
if(!origin)
origin = get_location_area(location)
-
+
+ direction = !location
..(origin, destination)
/datum/shuttle/ferry/long_jump(var/area/departing,var/area/destination,var/area/interim,var/travel_time)
@@ -36,7 +41,8 @@
destination = get_location_area(!location)
if(!departing)
departing = get_location_area(location)
-
+
+ direction = !location
..(departing, destination, interim, travel_time)
/datum/shuttle/ferry/move(var/area/origin,var/area/destination)
@@ -44,16 +50,20 @@
destination = get_location_area(!location)
if(!origin)
origin = get_location_area(location)
-
+
if (docking_controller && !docking_controller.undocked())
docking_controller.force_undock()
..(origin, destination)
- location = !location
+
+
+ if (destination == area_station) location = 0
+ if (destination == area_offsite) location = 1
+ //if this is a long_jump retain the location we were last at until we get to the new one
/datum/shuttle/ferry/proc/get_location_area(location_id = null)
if (isnull(location_id))
location_id = location
-
+
if (!location_id)
return area_station
return area_offsite
@@ -62,12 +72,12 @@
switch(process_state)
if (WAIT_LAUNCH)
if (skip_docking_checks() || docking_controller.can_launch())
-
- //once you have a transition area, making ferry shuttles have a transition would merely requre replacing this with
- //if (transition_area) long_jump(...)
- //else short_jump ()
- short_jump()
-
+
+ if (travel_time && area_transition)
+ long_jump(null, null, area_transition, travel_time)
+ else
+ short_jump()
+
process_state = WAIT_ARRIVE
if (WAIT_ARRIVE)
if (moving_status == SHUTTLE_IDLE)
@@ -77,6 +87,7 @@
if (skip_docking_checks() || docking_controller.docked())
process_state = IDLE_STATE
in_use = null //release lock
+ arrived()
/datum/shuttle/ferry/current_dock_target()
var/dock_target
@@ -89,42 +100,42 @@
/datum/shuttle/ferry/proc/launch(var/obj/machinery/computer/shuttle_control/user)
if (!can_launch()) return
-
+
in_use = user //obtain an exclusive lock on the shuttle
-
+
process_state = WAIT_LAUNCH
undock()
/datum/shuttle/ferry/proc/force_launch(var/obj/machinery/computer/shuttle_control/user)
if (!can_force()) return
-
+
in_use = user //obtain an exclusive lock on the shuttle
-
+
short_jump()
-
+
process_state = WAIT_ARRIVE
/datum/shuttle/ferry/proc/cancel_launch(var/obj/machinery/computer/shuttle_control/user)
if (!can_cancel()) return
-
+
moving_status = SHUTTLE_IDLE
process_state = WAIT_FINISH
-
+
if (docking_controller && !docking_controller.undocked())
docking_controller.force_undock()
-
+
spawn(10)
dock()
-
+
return
/datum/shuttle/ferry/proc/can_launch()
if (moving_status != SHUTTLE_IDLE)
return 0
-
+
if (in_use)
return 0
-
+
return 1
/datum/shuttle/ferry/proc/can_force()
@@ -137,6 +148,10 @@
return 1
return 0
+//This gets called when the shuttle finishes arriving at it's destination
+//This can be used by subtypes to do things when the shuttle arrives.
+/datum/shuttle/ferry/proc/arrived()
+ return //do nothing for now
/obj/machinery/computer/shuttle_control
@@ -145,7 +160,7 @@
icon_state = "shuttle"
req_access = list(access_engine)
circuit = null
-
+
var/shuttle_tag // Used to coordinate data in shuttle controller.
var/hacked = 0 // Has been emagged, no access restrictions.
var/launch_override = 0
@@ -156,11 +171,11 @@
/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()
@@ -168,7 +183,7 @@
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
@@ -206,7 +221,7 @@
shuttle_status = "Proceeding to destination."
if(WAIT_FINISH)
shuttle_status = "Arriving at destination now."
-
+
data = list(
"shuttle_status" = shuttle_status,
"shuttle_state" = shuttle_state,
@@ -237,7 +252,7 @@
var/datum/shuttle/ferry/shuttle = shuttles[shuttle_tag]
if (!istype(shuttle))
return
-
+
if(href_list["move"])
shuttle.launch(src)
if(href_list["force"])
diff --git a/code/modules/shuttles/shuttle_emergency.dm b/code/modules/shuttles/shuttle_emergency.dm
new file mode 100644
index 0000000000..b03734507d
--- /dev/null
+++ b/code/modules/shuttles/shuttle_emergency.dm
@@ -0,0 +1,45 @@
+
+
+/datum/shuttle/ferry/emergency
+ var/jump_time = null //the time at which the shuttle last jumped. Used for ETAs
+
+/datum/shuttle/ferry/emergency/arrived()
+ emergency_shuttle.shuttle_arrived()
+
+/datum/shuttle/ferry/emergency/move(var/area/origin,var/area/destination)
+ if (destination == area_transition)
+ jump_time = world.time
+ else
+ jump_time = null
+
+ if (!location) //leaving the station
+ emergency_shuttle.departed = 1
+ captain_announce("The Emergency Shuttle has left the station. Estimate [round(emergency_shuttle.estimate_arrival_time()/60,1)] minutes until the shuttle docks at Central Command.")
+ ..(origin, destination)
+
+
+/datum/shuttle/ferry/escape_pod
+ //pass
+
+/datum/shuttle/ferry/escape_pod/can_launch()
+ if(location)
+ return 0 //it's a one-way trip.
+ return ..()
+
+/datum/shuttle/ferry/escape_pod/can_force()
+ return 0
+
+/datum/shuttle/ferry/escape_pod/can_cancel()
+ return 0
+
+//TODO replace this with proper door controllers
+/datum/shuttle/ferry/escape_pod/move(var/area/origin,var/area/destination)
+ for(var/obj/machinery/door/D in origin)
+ spawn(0)
+ D.close()
+
+ ..(origin, destination)
+
+ for(var/obj/machinery/door/D in destination)
+ spawn(0)
+ D.open()
\ No newline at end of file
diff --git a/code/modules/shuttles/shuttle_supply.dm b/code/modules/shuttles/shuttle_supply.dm
index f75193ea03..3d878bcb60 100644
--- a/code/modules/shuttles/shuttle_supply.dm
+++ b/code/modules/shuttles/shuttle_supply.dm
@@ -58,6 +58,9 @@
if (!at_station()) //at centcom
supply_controller.sell()
+/datum/shuttle/ferry/emergency/long_jump(var/area/departing,var/area/destination,var/area/interim,var/travel_time)
+ short_jump(departing, destination) //long jumps are disabled
+
// returns 1 if the supply shuttle should be prevented from moving because it contains forbidden atoms
/datum/shuttle/ferry/supply/proc/forbidden_atoms_check()
if (!at_station())
diff --git a/code/unused/hivebot/hivebot.dm b/code/unused/hivebot/hivebot.dm
index 4cfb4ad9d2..cf764c088b 100644
--- a/code/unused/hivebot/hivebot.dm
+++ b/code/unused/hivebot/hivebot.dm
@@ -43,10 +43,11 @@
..()
statpanel("Status")
if (src.client.statpanel == "Status")
- if(emergency_shuttle.online && emergency_shuttle.location < 2)
- var/timeleft = emergency_shuttle.timeleft()
- if (timeleft)
- stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
+ if(emergency_shuttle)
+ if(emergency_shuttle.has_eta() && !emergency_shuttle.returned())
+ var/timeleft = emergency_shuttle.estimate_arrival_time()
+ if (timeleft)
+ stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
/*
if(ticker.mode.name == "AI malfunction")
stat(null, "Points left until the AI takes over: [AI_points]/[AI_points_win]")
diff --git a/code/unused/hivebot/mainframe.dm b/code/unused/hivebot/mainframe.dm
index bef86752db..6e07b5b457 100644
--- a/code/unused/hivebot/mainframe.dm
+++ b/code/unused/hivebot/mainframe.dm
@@ -23,10 +23,11 @@
..()
statpanel("Status")
if (src.client.statpanel == "Status")
- if(emergency_shuttle.online && emergency_shuttle.location < 2)
- var/timeleft = emergency_shuttle.timeleft()
- if (timeleft)
- stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
+ if(emergency_shuttle)
+ if(emergency_shuttle.has_eta() && !emergency_shuttle.returned())
+ var/timeleft = emergency_shuttle.estimate_arrival_time()
+ if (timeleft)
+ stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
/*
if(ticker.mode.name == "AI malfunction")
stat(null, "Points left until the AI takes over: [AI_points]/[AI_points_win]")