diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm
index c8a583a55ea..14d9060b84b 100644
--- a/code/__DEFINES/shuttles.dm
+++ b/code/__DEFINES/shuttles.dm
@@ -7,6 +7,8 @@
#define SHUTTLE_STRANDED "stranded"
#define SHUTTLE_ESCAPE "escape"
#define SHUTTLE_ENDGAME "endgame: game over"
+#define SHUTTLE_RECHARGING "recharging"
+#define SHUTTLE_PREARRIVAL "landing"
#define EMERGENCY_IDLE_OR_RECALLED (SSshuttle.emergency && ((SSshuttle.emergency.mode == SHUTTLE_IDLE) || (SSshuttle.emergency.mode == SHUTTLE_RECALL)))
#define EMERGENCY_ESCAPED_OR_ENDGAMED (SSshuttle.emergency && ((SSshuttle.emergency.mode == SHUTTLE_ESCAPE) || (SSshuttle.emergency.mode == SHUTTLE_ENDGAME)))
diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm
index b2402de2a72..70d75c8077c 100644
--- a/code/modules/events/pirates.dm
+++ b/code/modules/events/pirates.dm
@@ -198,27 +198,7 @@
/obj/docking_port/mobile/pirate
name = "pirate shuttle"
id = "pirateship"
- var/engines_cooling = FALSE
- var/engine_cooldown = 3 MINUTES
-
-/obj/docking_port/mobile/pirate/getStatusText()
- . = ..()
- if(engines_cooling)
- return "[.] - Engines cooling."
-
-/obj/docking_port/mobile/pirate/initiate_docking(obj/docking_port/stationary/new_dock, movement_direction, force=FALSE)
- . = ..()
- if(. == DOCKING_SUCCESS && !is_reserved_level(new_dock.z))
- engines_cooling = TRUE
- addtimer(CALLBACK(src,.proc/reset_cooldown),engine_cooldown,TIMER_UNIQUE)
-
-/obj/docking_port/mobile/pirate/proc/reset_cooldown()
- engines_cooling = FALSE
-
-/obj/docking_port/mobile/pirate/canMove()
- if(engines_cooling)
- return FALSE
- return ..()
+ rechargeTime = 3 MINUTES
/obj/machinery/suit_storage_unit/pirate
suit_type = /obj/item/clothing/suit/space
diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm
index 7f603b3c61f..7ee5a9eab75 100644
--- a/code/modules/shuttle/computer.dm
+++ b/code/modules/shuttle/computer.dm
@@ -51,6 +51,9 @@
to_chat(usr, "You've already escaped. Never going back to that place again!")
return
if(no_destination_swap)
+ if(M.mode == SHUTTLE_RECHARGING)
+ to_chat(usr, "Shuttle engines are not ready for use.")
+ return
if(M.mode != SHUTTLE_IDLE)
to_chat(usr, "Shuttle already in transit.")
return
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 10c955fc263..d706fc4d18e 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -241,6 +241,8 @@
var/mode = SHUTTLE_IDLE //current shuttle mode
var/callTime = 100 //time spent in transit (deciseconds). Should not be lower then 10 seconds without editing the animation of the hyperspace ripples.
var/ignitionTime = 55 // time spent "starting the engines". Also rate limits how often we try to reserve transit space if its ever full of transiting shuttles.
+ var/rechargeTime = 0 // time spent after arrival before being able to begin ignition
+ var/prearrivalTime = 0 // time spent after transit 'landing' before actually arriving
// The direction the shuttle prefers to travel in
var/preferred_direction = NORTH
@@ -534,7 +536,11 @@
// If we can't dock or we don't have a transit slot, wait for 20 ds,
// then try again
switch(mode)
- if(SHUTTLE_CALL)
+ if(SHUTTLE_CALL, SHUTTLE_PREARRIVAL)
+ if(prearrivalTime && mode != SHUTTLE_PREARRIVAL)
+ mode = SHUTTLE_PREARRIVAL
+ setTimer(prearrivalTime)
+ return
var/error = initiate_docking(destination, preferred_direction)
if(error && error & (DOCKING_NULL_DESTINATION | DOCKING_NULL_SOURCE))
var/msg = "A mobile dock in transit exited initiate_docking() with an error. This is most likely a mapping problem: Error: [error], ([src]) ([previous][ADMIN_JMP(previous)] -> [destination][ADMIN_JMP(destination)])"
@@ -545,6 +551,10 @@
else if(error)
setTimer(20)
return
+ if(rechargeTime)
+ mode = SHUTTLE_RECHARGING
+ setTimer(rechargeTime)
+ return
if(SHUTTLE_RECALL)
if(initiate_docking(previous) != DOCKING_SUCCESS)
setTimer(20)
@@ -647,6 +657,10 @@
return "ESC"
if(SHUTTLE_STRANDED)
return "ERR"
+ if(SHUTTLE_RECHARGING)
+ return "RCH"
+ if(SHUTTLE_PREARRIVAL)
+ return "LDN"
return ""
// returns 5-letter timer string, used by status screens and mob status panel
@@ -665,7 +679,7 @@
/obj/docking_port/mobile/proc/getStatusText()
var/obj/docking_port/stationary/dockedAt = get_docked()
-
+ var/docked_at = dockedAt?.name || "unknown"
if(istype(dockedAt, /obj/docking_port/stationary/transit))
if (timeLeft() > 1 HOURS)
return "hyperspace"
@@ -676,8 +690,10 @@
else
dst = destination
. = "transit towards [dst?.name || "unknown location"] ([getTimerStr()])"
+ else if(mode == SHUTTLE_RECHARGING)
+ return "[docked_at], recharging [getTimerStr()]"
else
- return dockedAt?.name || "unknown"
+ return docked_at
/obj/docking_port/mobile/proc/getDbgStatusText()
@@ -766,7 +782,7 @@
/obj/docking_port/mobile/proc/in_flight()
switch(mode)
- if(SHUTTLE_CALL,SHUTTLE_RECALL)
+ if(SHUTTLE_CALL,SHUTTLE_RECALL,SHUTTLE_PREARRIVAL)
return TRUE
if(SHUTTLE_IDLE,SHUTTLE_IGNITING)
return FALSE