diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm
index 386c3e58c4e..67bc6e53baa 100644
--- a/code/__defines/gamemode.dm
+++ b/code/__defines/gamemode.dm
@@ -20,19 +20,20 @@
#define BE_PAI "BE_PAI"
// Antagonist datum flags.
-#define ANTAG_OVERRIDE_JOB 0x1 // Assigned job is set to MODE when spawning.
-#define ANTAG_OVERRIDE_MOB 0x2 // Mob is recreated from datum mob_type var when spawning.
-#define ANTAG_CLEAR_EQUIPMENT 0x4 // All preexisting equipment is purged.
-#define ANTAG_CHOOSE_NAME 0x8 // Antagonists are prompted to enter a name.
-#define ANTAG_IMPLANT_IMMUNE 0x10 // Cannot be loyalty implanted.
-#define ANTAG_SUSPICIOUS 0x20 // Shows up on roundstart report.
-#define ANTAG_HAS_LEADER 0x40 // Generates a leader antagonist.
-#define ANTAG_HAS_NUKE 0x80 // Will spawn a nuke at supplied location.
-#define ANTAG_RANDSPAWN 0x100 // Potentially randomly spawns due to events.
-#define ANTAG_VOTABLE 0x200 // Can be voted as an additional antagonist before roundstart.
-#define ANTAG_SET_APPEARANCE 0x400 // Causes antagonists to use an appearance modifier on spawn.
-#define ANTAG_RANDOM_EXCEPTED 0x800 // If a game mode randomly selects antag types, antag types with this flag should be excluded.
-#define ANTAG_NO_FLAVORTEXT 0x1000 // To prevent flavor text from being scrubbed from crewmember intruders
+#define ANTAG_OVERRIDE_JOB 0x1 // Assigned job is set to MODE when spawning.
+#define ANTAG_OVERRIDE_MOB 0x2 // Mob is recreated from datum mob_type var when spawning.
+#define ANTAG_CLEAR_EQUIPMENT 0x4 // All preexisting equipment is purged.
+#define ANTAG_CHOOSE_NAME 0x8 // Antagonists are prompted to enter a name.
+#define ANTAG_IMPLANT_IMMUNE 0x10 // Cannot be loyalty implanted.
+#define ANTAG_SUSPICIOUS 0x20 // Shows up on roundstart report.
+#define ANTAG_HAS_LEADER 0x40 // Generates a leader antagonist.
+#define ANTAG_HAS_NUKE 0x80 // Will spawn a nuke at supplied location.
+#define ANTAG_RANDSPAWN 0x100 // Potentially randomly spawns due to events.
+#define ANTAG_VOTABLE 0x200 // Can be voted as an additional antagonist before roundstart.
+#define ANTAG_SET_APPEARANCE 0x400 // Causes antagonists to use an appearance modifier on spawn.
+#define ANTAG_RANDOM_EXCEPTED 0x800 // If a game mode randomly selects antag types, antag types with this flag should be excluded.
+#define ANTAG_NO_FLAVORTEXT 0x1000 // To prevent flavor text from being scrubbed from crewmember intruders
+#define ANTAG_NO_ROUNDSTART_SPAWN 0x2000 // Prevents the antag from spawning at roundstart
// Mode/antag template macros.
#define MODE_BORER "borer"
diff --git a/code/controllers/subsystems/job.dm b/code/controllers/subsystems/job.dm
index 0e00ee6cc90..bb8593c436e 100644
--- a/code/controllers/subsystems/job.dm
+++ b/code/controllers/subsystems/job.dm
@@ -660,7 +660,14 @@
if(spawnpos && istype(spawnpos))
if(spawnpos.check_job_spawning(rank))
- H.forceMove(pick(spawnpos.turfs))
+ if(istype(spawnpos, /datum/spawnpoint/cryo) && (rank in command_positions))
+ var/datum/spawnpoint/cryo/C = spawnpos
+ if(length(C.command_turfs))
+ H.forceMove(pick(C.command_turfs))
+ else
+ H.forceMove(pick(spawnpos.turfs))
+ else
+ H.forceMove(pick(spawnpos.turfs))
. = spawnpos.msg
spawnpos.after_join(H)
else
diff --git a/code/game/antagonist/outsider/revenant.dm b/code/game/antagonist/outsider/revenant.dm
index 8ddfcfa26a6..8391cb89e92 100644
--- a/code/game/antagonist/outsider/revenant.dm
+++ b/code/game/antagonist/outsider/revenant.dm
@@ -6,6 +6,7 @@ var/datum/antagonist/revenant/revenants = null
role_text_plural = "Revenants"
welcome_text = "A creature borne of bluespace, you are here to wreak havoc and put an end to bluespace experimentation, one station at a time."
antaghud_indicator = "hudrevenant"
+ flags = ANTAG_NO_ROUNDSTART_SPAWN
initial_spawn_req = 0
initial_spawn_target = 0
hard_cap = 12
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index d7c4f784fc1..7d957306189 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -284,7 +284,8 @@ var/global/list/additional_antag_types = list()
for(var/datum/antagonist/antag in antag_templates)
if(!(antag.flags & ANTAG_OVERRIDE_JOB))
antag.attempt_spawn() //select antags to be spawned
- antag.finalize_spawn() //actually spawn antags
+ if(!(antag.flags & ANTAG_NO_ROUNDSTART_SPAWN))
+ antag.finalize_spawn() //actually spawn antags
if(emergency_shuttle && auto_recall_shuttle)
emergency_shuttle.auto_recall = 1
diff --git a/code/game/gamemodes/revenants/revenants.dm b/code/game/gamemodes/revenants/revenants.dm
index 7e809567bd0..f9f6ae61866 100644
--- a/code/game/gamemodes/revenants/revenants.dm
+++ b/code/game/gamemodes/revenants/revenants.dm
@@ -4,6 +4,7 @@
required_players = 10
required_enemies = 0
round_autoantag = TRUE
+ var/first_spawn_delay = 20 MINUTES
min_autotraitor_delay = 3 MINUTES
max_autotraitor_delay = 6 MINUTES
antag_scaling_coeff = 4 // four people can handle one revenant pretty easily
@@ -11,7 +12,13 @@
extended_round_description = "This a wave defense gamemode. The crew all have to work together to repel an endless horde of bluespace horrors."
antag_tags = list(MODE_REVENANT)
+/datum/game_mode/revenants/New()
+ ..()
+ first_spawn_delay = rand(20 MINUTES, 30 MINUTES)
+
/datum/game_mode/revenants/process_autoantag()
+ if(world.time - round_start_time < first_spawn_delay)
+ return
var/datum/ghostspawner/revenant/R = SSghostroles.get_spawner(MODE_REVENANT)
var/datum/antagonist/A = all_antag_types[MODE_REVENANT]
A.update_current_antag_max()
@@ -20,4 +27,5 @@
if(R.max_count > previous_count)
say_dead_direct("A slot for a Revenant as opened up!
Spawn in as it by using the ghost spawner menu in the ghost tab, and try to be good!")
if(!R.enabled)
- R.enable()
\ No newline at end of file
+ R.enable()
+ next_spawn = world.time + rand(min_autotraitor_delay, max_autotraitor_delay)
\ No newline at end of file
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index 246df672bb6..9824cdc405d 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -37,6 +37,10 @@
latejoin_cryo += loc
delete_me = 1
return
+ if("JoinLateCryoCommand")
+ latejoin_cryo_command += loc
+ delete_me = 1
+ return
if("JoinLateCyborg")
latejoin_cyborg += loc
delete_me = 1
diff --git a/code/global.dm b/code/global.dm
index 8985488586d..c07d74d10ff 100644
--- a/code/global.dm
+++ b/code/global.dm
@@ -50,12 +50,13 @@ var/list/wizardstart = list()
var/turf/newplayer_start = null
//Spawnpoints.
-var/list/latejoin = list()
-var/list/latejoin_gateway = list()
-var/list/latejoin_cryo = list()
-var/list/latejoin_cyborg = list()
-var/list/latejoin_merchant = list()
-var/list/kickoffsloc = list()
+var/list/latejoin = list()
+var/list/latejoin_gateway = list()
+var/list/latejoin_cryo = list()
+var/list/latejoin_cryo_command = list()
+var/list/latejoin_cyborg = list()
+var/list/latejoin_merchant = list()
+var/list/kickoffsloc = list()
var/list/prisonwarp = list() // Prisoners go to these
var/list/holdingfacility = list() // Captured people go here
diff --git a/code/modules/client/preference_setup/antagonism/01_candidacy.dm b/code/modules/client/preference_setup/antagonism/01_candidacy.dm
index 58d8100e6de..512c8580801 100644
--- a/code/modules/client/preference_setup/antagonism/01_candidacy.dm
+++ b/code/modules/client/preference_setup/antagonism/01_candidacy.dm
@@ -44,6 +44,8 @@
var/is_global_banned = jobban_isbanned(preference_mob(), "Antagonist")
for(var/antag_type in all_antag_types)
var/datum/antagonist/antag = all_antag_types[antag_type]
+ if(antag.flags & ANTAG_NO_ROUNDSTART_SPAWN)
+ continue
dat += "