diff --git a/code/controllers/emergency_shuttle_controller.dm b/code/controllers/emergency_shuttle_controller.dm index dcb695779c6..55b325eba3c 100644 --- a/code/controllers/emergency_shuttle_controller.dm +++ b/code/controllers/emergency_shuttle_controller.dm @@ -11,6 +11,7 @@ var/global/datum/emergency_shuttle_controller/emergency_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/no_escape = 0 //alternative to auto_recall - the shuttle will arrive, but never leave var/evac = 0 //1 = emergency evacuation, 0 = crew transfer var/wait_for_launch = 0 //if the shuttle is waiting to launch var/autopilot = 1 //set to 0 to disable the shuttle automatically launching @@ -27,6 +28,10 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle stop_launch_countdown() if (!shuttle.location) //leaving from the station + if(is_stranded()) + captain_announce("Hostile environment detected. Departure has been postponed indefinitely pending conflict resolution.") + wait_for_launch = 0 + return //launch the pods! for (var/datum/shuttle/ferry/escape_pod/pod in escape_pods) if (!pod.arming_controller || pod.arming_controller.armed) @@ -38,6 +43,8 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle //called when the shuttle has arrived. /datum/emergency_shuttle_controller/proc/shuttle_arrived() if (!shuttle.location) //at station + if(no_escape) + shuttle.moving_status = SHUTTLE_STRANDED if (autopilot) set_launch_countdown(SHUTTLE_LEAVETIME) //get ready to return @@ -154,7 +161,7 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle /datum/emergency_shuttle_controller/proc/waiting_to_leave() if (shuttle.location) return 0 //not at station - return (wait_for_launch || shuttle.moving_status != SHUTTLE_INTRANSIT) + return (wait_for_launch || (shuttle.moving_status != SHUTTLE_INTRANSIT && shuttle.moving_status != SHUTTLE_STRANDED)) //so we don't have emergency_shuttle.shuttle.location everywhere /datum/emergency_shuttle_controller/proc/location() @@ -178,7 +185,10 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle return (launch_time - world.time)/10 /datum/emergency_shuttle_controller/proc/has_eta() - return (wait_for_launch || shuttle.moving_status != SHUTTLE_IDLE) + return (wait_for_launch || shuttle.moving_status != SHUTTLE_IDLE && shuttle.moving_status != SHUTTLE_STRANDED) + +/datum/emergency_shuttle_controller/proc/is_stranded() + return (shuttle.moving_status == SHUTTLE_STRANDED) //returns 1 if the shuttle has gone to the station and come back at least once, //used for game completion checking purposes @@ -214,7 +224,10 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle var/timeleft = emergency_shuttle.estimate_launch_time() return "ETD-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]" - + + if (is_stranded()) + return "ETA-ERR" + return "" /* Some slapped-together star effects for maximum spess immershuns. Basically consists of a diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index 2253ad0e1cd..856a7421852 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -136,7 +136,12 @@ if (is_malf_ai_dead()) if(config.continous_rounds) if(emergency_shuttle) - emergency_shuttle.auto_recall = 0 + if(emergency_shuttle.auto_recall) + emergency_shuttle.auto_recall = 0 + else if(emergency_shuttle.is_stranded()) + emergency_shuttle.no_escape = 0 + emergency_shuttle.shuttle.moving_status = SHUTTLE_IDLE + emergency_shuttle.shuttle_arrived() malf_mode_declared = 0 else return 1 diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 6aeafe753c3..620844a5135 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -92,7 +92,7 @@ greet_revolutionary(rev_mind) modePlayer += head_revolutionaries if(emergency_shuttle) - emergency_shuttle.auto_recall = 1 + emergency_shuttle.no_escape = 1 spawn (rand(waittime_l, waittime_h)) send_intercept() ..() @@ -172,7 +172,12 @@ if(config.continous_rounds) if(finished != 0) if(emergency_shuttle) - emergency_shuttle.auto_recall = 0 + if(emergency_shuttle.auto_recall) + emergency_shuttle.auto_recall = 0 + else if(emergency_shuttle.is_stranded()) + emergency_shuttle.no_escape = 0 + emergency_shuttle.shuttle.moving_status = SHUTTLE_IDLE + emergency_shuttle.shuttle_arrived() return ..() if(finished != 0) return 1 diff --git a/code/game/gamemodes/sandbox/sandbox.dm b/code/game/gamemodes/sandbox/sandbox.dm index e3c270678df..5f13763e5f2 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.auto_recall = 1 + emergency_shuttle.no_escape = 1 diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 85b83f43893..e4ecdb12efa 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -419,11 +419,7 @@ var/shuttle_call/shuttle_calls[0] 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)/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.auto_recall = 1 - + if(ticker.mode.name == "epidemic") user << "Under directive 7-10, [station_name()] is quarantined until further notice." return diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index ea63a0d6fa0..133432de77c 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -97,6 +97,10 @@ if(length(message2) > CHARS_PER_LINE) message2 = "Error" update_display(message1, message2) + else if(emergency_shuttle.is_stranded()) + message1 = "-ERR-" + message2 = "??:??" + update_display(message1, message2) else remove_display() return 1 diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 4bcc4bec78c..148174af767 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -937,11 +937,14 @@ Traitors and the like can also be revived with the previous role mostly intact. if(confirm != "Yes") return var/choice - if(ticker.mode.name == "revolution" || ticker.mode.name == "AI malfunction" || ticker.mode.name == "confliction") + if(emergency_shuttle.auto_recall) choice = input("The shuttle will just return if you call it. Call anyway?") in list("Confirm", "Cancel") - if(choice == "Confirm") - emergency_shuttle.auto_recall = 1 //enable auto-recall - else + if(choice != "Confirm") + return + + if(emergency_shuttle.no_escape) + choice = input("The shuttle will not be able to leave if you call it. Call anyway?") in list("Confirm", "Cancel") + if(choice != "Confirm") return choice = input("Is this an emergency evacuation or a crew transfer?") in list("Emergency", "Crew Transfer") diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 88ccd33523d..657713ca60a 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -337,7 +337,7 @@ var/list/ai_list = list() /mob/living/silicon/ai/proc/ai_cancel_call() - set category = "AI Commands" + set category = "Malfunction" if(src.stat == 2) src << "You can't send the shuttle back because you are dead!" return diff --git a/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm b/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm index 6e2c63c3713..2251f293b7d 100644 --- a/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm +++ b/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm @@ -5,7 +5,7 @@ icon_state = "samak" icon_living = "samak" icon_dead = "samak_dead" - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' + icon = 'code/modules/jungle/jungle.dmi' move_to_delay = 2 maxHealth = 125 health = 125 @@ -26,7 +26,7 @@ icon_state = "diyaab" icon_living = "diyaab" icon_dead = "diyaab_dead" - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' + icon = 'code/modules/jungle/jungle.dmi' move_to_delay = 1 maxHealth = 25 health = 25 @@ -47,7 +47,7 @@ icon_state = "shantak" icon_living = "shantak" icon_dead = "shantak_dead" - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' + icon = 'code/modules/jungle/jungle.dmi' move_to_delay = 1 maxHealth = 75 health = 75 @@ -66,7 +66,7 @@ icon_state = "yithian" icon_living = "yithian" icon_dead = "yithian_dead" - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' + icon = 'code/modules/jungle/jungle.dmi' /mob/living/simple_animal/tindalos name = "tindalos" @@ -74,4 +74,4 @@ icon_state = "tindalos" icon_living = "tindalos" icon_dead = "tindalos_dead" - icon = 'code/WorkInProgress/Cael_Aislinn/Jungle/jungle.dmi' + icon = 'code/modules/jungle/jungle.dmi' diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index aa126416d2f..f1ca624e73b 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -73,29 +73,29 @@ src.add_fingerprint(usr) if(href_list["move"]) - launch() + launch(usr) if(href_list["force"]) - force_launch() + force_launch(usr) else if(href_list["cancel"]) - cancel_launch() + cancel_launch(usr) -/obj/machinery/computer/shuttle_control/proc/launch() +/obj/machinery/computer/shuttle_control/proc/launch(var/mob/user) var/datum/shuttle/ferry/shuttle = shuttle_controller.shuttles[shuttle_tag] if (!istype(shuttle)) return - shuttle.launch(src) + shuttle.launch(user) -/obj/machinery/computer/shuttle_control/proc/force_launch() +/obj/machinery/computer/shuttle_control/proc/force_launch(var/mob/user) var/datum/shuttle/ferry/shuttle = shuttle_controller.shuttles[shuttle_tag] if (!istype(shuttle)) return - shuttle.force_launch(src) + shuttle.force_launch(user) -/obj/machinery/computer/shuttle_control/proc/cancel_launch() +/obj/machinery/computer/shuttle_control/proc/cancel_launch(var/mob/user) var/datum/shuttle/ferry/shuttle = shuttle_controller.shuttles[shuttle_tag] if (!istype(shuttle)) return - shuttle.cancel_launch(src) + shuttle.cancel_launch(user) /obj/machinery/computer/shuttle_control/attackby(obj/item/weapon/W as obj, mob/user as mob) diff --git a/code/modules/shuttles/shuttle_emergency.dm b/code/modules/shuttles/shuttle_emergency.dm index c7fff897e6d..b5268fd2ca5 100644 --- a/code/modules/shuttles/shuttle_emergency.dm +++ b/code/modules/shuttles/shuttle_emergency.dm @@ -32,14 +32,17 @@ ..(origin, destination) -/datum/shuttle/ferry/emergency/can_launch(var/user) +/datum/shuttle/ferry/emergency/can_launch(var/mob/user) if (istype(user, /obj/machinery/computer/shuttle_control/emergency)) var/obj/machinery/computer/shuttle_control/emergency/C = user if (!C.has_authorization()) return 0 + + if(moving_status == SHUTTLE_STRANDED && C.has_authorization()) + return 1 return ..() -/datum/shuttle/ferry/emergency/can_force(var/user) +/datum/shuttle/ferry/emergency/can_force(var/mob/user) if (istype(user, /obj/machinery/computer/shuttle_control/emergency)) var/obj/machinery/computer/shuttle_control/emergency/C = user @@ -47,9 +50,10 @@ //this is so that people can force launch if the docking controller cannot safely undock without needing X heads to swipe. if (process_state != WAIT_LAUNCH && !C.has_authorization()) return 0 + return ..() -/datum/shuttle/ferry/emergency/can_cancel(var/user) +/datum/shuttle/ferry/emergency/can_cancel(var/mob/user) if (istype(user, /obj/machinery/computer/shuttle_control/emergency)) var/obj/machinery/computer/shuttle_control/emergency/C = user if (!C.has_authorization()) @@ -58,6 +62,10 @@ /datum/shuttle/ferry/emergency/launch(var/user) if (!can_launch(user)) return + + if(emergency_shuttle.no_escape) + user << "The emergency shuttle has been disabled by Centcom." + return if (istype(user, /obj/machinery/computer/shuttle_control/emergency)) //if we were given a command by an emergency shuttle console if (emergency_shuttle.autopilot) @@ -164,6 +172,7 @@ if(SHUTTLE_IDLE) shuttle_state = "idle" if(SHUTTLE_WARMUP) shuttle_state = "warmup" if(SHUTTLE_INTRANSIT) shuttle_state = "in_transit" + if(SHUTTLE_STRANDED) shuttle_state = "idle" var/shuttle_status switch (shuttle.process_state) @@ -175,7 +184,7 @@ else shuttle_status = "Standing-by at Central Command." if(WAIT_LAUNCH) - shuttle_status = "Shuttle has recieved command and will depart shortly." + shuttle_status = "Shuttle has received command and will depart shortly." if(WAIT_ARRIVE) shuttle_status = "Proceeding to destination." if(WAIT_FINISH) diff --git a/code/modules/shuttles/shuttle_ferry.dm b/code/modules/shuttles/shuttle_ferry.dm index 8d6d1594279..341ee9b96d8 100644 --- a/code/modules/shuttles/shuttle_ferry.dm +++ b/code/modules/shuttles/shuttle_ferry.dm @@ -145,7 +145,7 @@ return 1 /datum/shuttle/ferry/proc/can_force() - if (moving_status == SHUTTLE_IDLE && process_state == WAIT_LAUNCH) + if ((moving_status == SHUTTLE_IDLE) && process_state == WAIT_LAUNCH) return 1 return 0 diff --git a/code/setup.dm b/code/setup.dm index 8770a2c08f4..008a92fbc06 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -908,6 +908,7 @@ var/list/RESTRICTED_CAMERA_NETWORKS = list( //Those networks can only be accesse #define SHUTTLE_IDLE 0 #define SHUTTLE_WARMUP 1 #define SHUTTLE_INTRANSIT 2 +#define SHUTTLE_STRANDED 3 //Ferry shuttle processing status #define IDLE_STATE 0