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 += {"

FINAL SCORE: [score_crewscore]
"} diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index db7ed93a159..886e9de1b77 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -29,7 +29,7 @@ var/shuttle_call/shuttle_calls[0] from=get_turf(computer) when=worldtime2text() if(dir==SHUTTLE_RECALL) - var/timeleft=emergency_shuttle.timeleft() + var/timeleft=emergency_shuttle.estimate_arrival_time() eta="[timeleft / 60 % 60]:[add_zero(num2text(timeleft % 60), 2)]" // The communications computer @@ -142,7 +142,7 @@ var/shuttle_call/shuttle_calls[0] var/response = alert("Are you sure you wish to call the shuttle?", "Confirm", "Yes", "No") if(response == "Yes") call_shuttle_proc(usr) - if(emergency_shuttle.online) + if(emergency_shuttle.online()) post_status("shuttle") setMenuState(usr,COMM_SCREEN_MAIN) if("cancelshuttle") @@ -150,8 +150,8 @@ var/shuttle_call/shuttle_calls[0] if(src.authenticated) var/response = alert("Are you sure you wish to recall the shuttle?", "Confirm", "Yes", "No") if(response == "Yes") - recall_shuttle(usr) - if(emergency_shuttle.online) + cancel_call_proc(usr) + if(emergency_shuttle.online()) post_status("shuttle") setMenuState(usr,COMM_SCREEN_MAIN) if("messagelist") @@ -307,11 +307,11 @@ var/shuttle_call/shuttle_calls[0] data["current_message"] = data["is_ai"] ? aicurrmsg : currmsg var/shuttle[0] - shuttle["on"]=emergency_shuttle.online - if (emergency_shuttle.online && emergency_shuttle.location==0) - var/timeleft=emergency_shuttle.timeleft() + shuttle["on"]=emergency_shuttle.online() + if (emergency_shuttle.online() && emergency_shuttle.location()) + var/timeleft=emergency_shuttle.estimate_arrival_time() shuttle["eta"]="[timeleft / 60 % 60]:[add_zero(num2text(timeleft % 60), 2)]" - shuttle["pos"] = emergency_shuttle.location + shuttle["pos"] = !emergency_shuttle.location() shuttle["can_recall"]=!(recall_time_limit && world.time >= recall_time_limit) data["shuttle"]=shuttle @@ -358,42 +358,49 @@ var/shuttle_call/shuttle_calls[0] 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 - emergency_shuttle.incall() + if(ticker.mode.name == "blob") + user << "Under directive 7-10, [station_name()] is quarantined until further notice." + return + + 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 @@ -408,32 +415,32 @@ var/shuttle_call/shuttle_calls[0] 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 == "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 - [formatJumpTo(user)].", 1) - captain_announce("A crew transfer has been initiated. The shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.") + captain_announce("A crew transfer has been initiated. The shuttle has been called. It will arrive in [round(emergency_shuttle.estimate_arrival_time()/60)] minutes.") return -/proc/recall_shuttle(var/mob/user) - if ((!( ticker ) || emergency_shuttle.location || emergency_shuttle.direction == 0 || emergency_shuttle.timeleft() < 300)) + +/proc/cancel_call_proc(var/mob/user) + if (!( ticker ) || !emergency_shuttle.can_recall()) return if(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 - [formatJumpTo(user)].", 1) @@ -479,11 +486,9 @@ var/shuttle_call/shuttle_calls[0] 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') ..() @@ -504,10 +509,8 @@ var/shuttle_call/shuttle_calls[0] 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 978db653f94..9d8b1da6f94 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 08a3f5e4f40..7feae2dc50f 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -79,13 +79,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) @@ -116,7 +118,7 @@ if(4) // supply shuttle timer var/line1 = "SUPPLY" var/line2 = "" - + var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle if (!shuttle) line2 = "Error" @@ -169,8 +171,14 @@ if(maptext != new_text) maptext = new_text - proc/get_shuttle_timer() - var/timeleft = emergency_shuttle.timeleft() + proc/get_shuttle_timer_arrival() + var/timeleft = emergency_shuttle.estimate_arrival_time() + if(timeleft) + return "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]" + return "" + + proc/get_shuttle_timer_departure() + var/timeleft = emergency_shuttle.estimate_launch_time() if(timeleft) return "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]" return "" @@ -179,7 +187,7 @@ 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/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index f8b67722e6c..2e61e25b443 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -391,15 +391,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 a6270c10927..e405ae88d59 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -218,36 +218,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 bca38ae4c66..78df3849311 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -367,7 +367,6 @@ Ccomp's first proc. message_admins("Admin [key_name_admin(usr)] has [action] on joining the round if they use AntagHUD", 1) */ - /* If a guy was gibbed and you want to revive him, this is a good way to do so. Works kind of like entering the game with a new character. Character receives a new mind if they didn't have one. @@ -928,7 +927,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 @@ -936,16 +935,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) @@ -959,7 +963,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 27e92cf75be..ac89ac173bd 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 54eed936541..e0da39bfa60 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 48d7d08292b..31ba7a14323 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -222,8 +222,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 55226404cb3..8f168246cb3 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -167,8 +167,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 23b37ebf1a3..54acd2937e2 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -195,8 +195,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 2e0c241efcb..c7c84639a52 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -303,14 +303,11 @@ var/list/ai_list = list() call_shuttle_proc(src) // hack to display shuttle timer - if(emergency_shuttle.online) - var/datum/radio_frequency/frequency = radio_controller.return_frequency(1435) - if(!frequency) return - var/datum/signal/status_signal = new - status_signal.source = src - status_signal.transmission_method = 1 - status_signal.data["command"] = "shuttle" - frequency.post_signal(src, status_signal) + if(emergency_shuttle.online()) + var/obj/machinery/computer/communications/C = locate() in machines + if(C) + C.post_status("shuttle") + return /mob/living/silicon/ai/verb/toggle_anchor() @@ -337,7 +334,7 @@ var/list/ai_list = list() if(AI.control_disabled) src << "Wireless control is disabled!" return - recall_shuttle(src) + cancel_call_proc(src) return /mob/living/silicon/ai/check_eye(var/mob/user as mob) diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index 6e2fb560b3f..c9541858467 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 41d7ee7a545..500148a9399 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -176,10 +176,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)]") diff --git a/code/modules/mob/living/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm index f4c991332ca..c69287feb6b 100644 --- a/code/modules/mob/living/simple_animal/borer.dm +++ b/code/modules/mob/living/simple_animal/borer.dm @@ -145,8 +145,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 cfa8d407a9a..b07182d64b7 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -346,12 +346,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 33a51c21ee5..31943d88576 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -499,9 +499,10 @@ var/global/list/uneatable = list( /obj/machinery/singularity/narsie/large/New() ..() - world << "NAR-SIE HAS RISEN" - if(emergency_shuttle) - emergency_shuttle.incall(0.3) // Cannot recall + world << "NAR-SIE HAS RISEN" + 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_console.dm b/code/modules/shuttles/shuttle_console.dm index 13f8884be3b..e1ae517a4c1 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 00000000000..1116b666c26 --- /dev/null +++ b/code/modules/shuttles/shuttle_emergency.dm @@ -0,0 +1,69 @@ + + + +/datum/shuttle/ferry/emergency + //pass + +/datum/shuttle/ferry/emergency/arrived() + emergency_shuttle.shuttle_arrived() + +/* +/datum/shuttle/ferry/emergency/move() + if (!location) //leaving the station + emergency_shuttle.departed = 1 + ..() +*/ + +/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) //might need to adjust shuttle/move so that it can take into account the direction argument to area/move_contents_to, I dunno. + + for(var/obj/machinery/door/D in destination) + spawn(0) + D.open() + +//Escape pod garbage, copied from the controller +/* + //pods + start_location = locate(/area/shuttle/escape_pod1/station) + end_location = locate(/area/shuttle/escape_pod1/transit) + end_location = locate(/area/shuttle/escape_pod1/centcom) + start_location.move_contents_to(end_location, null, NORTH) + + start_location = locate(/area/shuttle/escape_pod2/station) + end_location = locate(/area/shuttle/escape_pod2/transit) + end_location = locate(/area/shuttle/escape_pod2/centcom) + start_location.move_contents_to(end_location, null, NORTH) + + start_location = locate(/area/shuttle/escape_pod3/station) + end_location = locate(/area/shuttle/escape_pod3/transit) + end_location = locate(/area/shuttle/escape_pod3/centcom) + start_location.move_contents_to(end_location, null, NORTH) + + //There is no pod 4, apparently. + + start_location = locate(/area/shuttle/escape_pod5/station) + end_location = locate(/area/shuttle/escape_pod5/transit) + end_location = locate(/area/shuttle/escape_pod5/centcom) + start_location.move_contents_to(end_location, null, EAST) + + +*/ \ No newline at end of file diff --git a/code/unused/hivebot/hivebot.dm b/code/unused/hivebot/hivebot.dm index 3852b024fb2..2589bc2f34f 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 faa28164163..e629a8f7d20 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]")