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 += "[antag.role_text]: " var/ban_reason = jobban_isbanned(preference_mob(), antag.bantype) if(ban_reason == "AGE WHITELISTED") diff --git a/code/modules/client/preferences_spawnpoints.dm b/code/modules/client/preferences_spawnpoints.dm index 0ccb07a846f..c2a23acc1de 100644 --- a/code/modules/client/preferences_spawnpoints.dm +++ b/code/modules/client/preferences_spawnpoints.dm @@ -31,10 +31,12 @@ display_name = "Cryogenic Storage" msg = "has completed cryogenic revival" disallow_job = list("Cyborg", "Merchant") + var/list/command_turfs = list() /datum/spawnpoint/cryo/New() ..() turfs = latejoin_cryo + command_turfs = latejoin_cryo_command /datum/spawnpoint/cryo/after_join(mob/victim) if(!istype(victim)) diff --git a/code/modules/ghostroles/spawner/antagonist/revenant.dm b/code/modules/ghostroles/spawner/antagonist/revenant.dm index 2d59205d165..f3b7f7b9531 100644 --- a/code/modules/ghostroles/spawner/antagonist/revenant.dm +++ b/code/modules/ghostroles/spawner/antagonist/revenant.dm @@ -14,6 +14,7 @@ spawn_mob = /mob/living/carbon/human/revenant respawn_flag = ANIMAL + var/spawn_index = 1 // used to add a numerical identifier to the revenant. increases by 1 per spawn var/has_fired = FALSE /datum/ghostspawner/revenant/spawn_mob(mob/user) @@ -26,6 +27,9 @@ return if(R) + R.real_name = "[R.real_name] ([spawn_index])" + R.name = R.real_name + spawn_index++ announce_ghost_joinleave(user, FALSE, "They are now a [name].") R.ckey = user.ckey diff --git a/code/modules/ghostroles/spawner/base.dm b/code/modules/ghostroles/spawner/base.dm index 0844e1b589e..d2f78c5eca7 100644 --- a/code/modules/ghostroles/spawner/base.dm +++ b/code/modules/ghostroles/spawner/base.dm @@ -126,11 +126,13 @@ if(T) //If we have a spawnpoint, return it return T if(!isnull(landmark_name)) - var/obj/effect/landmark/L + var/list/possible_landmarks = list() for(var/obj/effect/landmark/landmark in landmarks_list) if(landmark.name == landmark_name) - L = landmark - return get_turf(L) + possible_landmarks += landmark + if(length(possible_landmarks)) + var/obj/effect/landmark/L = pick(possible_landmarks) + return get_turf(L) log_debug("Ghostspawner: Spawner [short_name] has neither spawnpoints nor landmarks or a matching spawnpoint/landmark could not be found") diff --git a/code/modules/mob/language/outsider.dm b/code/modules/mob/language/outsider.dm index e48a0c511a9..dba7d88c4e9 100644 --- a/code/modules/mob/language/outsider.dm +++ b/code/modules/mob/language/outsider.dm @@ -103,4 +103,5 @@ colour = "revenant" key = "c" syllables = list("grhhg", "ghrohg", "grgugh", "grrhh", "hghh", "rghghh", "gghhh", "ggrh", "aghrh") - flags = RESTRICTED \ No newline at end of file + flags = RESTRICTED + partial_understanding = list(LANGUAGE_TCB = 80) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/outsider/revenant.dm b/code/modules/mob/living/carbon/human/species/outsider/revenant.dm index 0ee45d4e8fa..122a888b186 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/revenant.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/revenant.dm @@ -117,6 +117,7 @@ H.name = H.real_name ..() H.gender = NEUTER + H.universal_understand = TRUE /datum/species/revenant/get_random_name() return "Revenant" diff --git a/html/changelogs/geeves-command_cryo.yml b/html/changelogs/geeves-command_cryo.yml new file mode 100644 index 00000000000..127fa2e829f --- /dev/null +++ b/html/changelogs/geeves-command_cryo.yml @@ -0,0 +1,6 @@ +author: Geeves + +delete-after: True + +changes: + - rscadd: "Command members now spawn in the cryogenics section of the bridge." \ No newline at end of file diff --git a/html/changelogs/geeves-revenant_fixes.yml b/html/changelogs/geeves-revenant_fixes.yml new file mode 100644 index 00000000000..e9cddc3ca0d --- /dev/null +++ b/html/changelogs/geeves-revenant_fixes.yml @@ -0,0 +1,7 @@ +author: Geeves + +delete-after: True + +changes: + - bugfix: "Fixed the revenant gamemode assigning roundstart humans as revenants." + - bugfix: "Fixed all revenants spawning at the radiators." diff --git a/html/changelogs/geeves-revenant_tweaks.yml b/html/changelogs/geeves-revenant_tweaks.yml new file mode 100644 index 00000000000..6a75101542d --- /dev/null +++ b/html/changelogs/geeves-revenant_tweaks.yml @@ -0,0 +1,9 @@ +author: Geeves + +delete-after: True + +changes: + - rscadd: "Tau Ceti Basic speakers can now understand 80% of what revenants say." + - tweak: "Revenants can now universally understand all languages." + - tweak: "Revenants now spawn between 20 and 30 minutes into the round." + - rscadd: "Revenants now get a numerical identifier after their name that increments up from 1." \ No newline at end of file diff --git a/maps/aurora/aurora-4_mainlevel.dmm b/maps/aurora/aurora-4_mainlevel.dmm index c6b9def2910..affa00d7e44 100644 --- a/maps/aurora/aurora-4_mainlevel.dmm +++ b/maps/aurora/aurora-4_mainlevel.dmm @@ -29913,6 +29913,9 @@ /obj/machinery/computer/cryopod{ pixel_y = 28 }, +/obj/effect/landmark{ + name = "JoinLateCryoCommand" + }, /turf/simulated/floor/tiled/dark, /area/crew_quarters/heads/cryo) "aYQ" = ( @@ -30706,6 +30709,9 @@ /turf/simulated/floor/tiled/dark, /area/crew_quarters/heads/cryo) "bai" = ( +/obj/effect/landmark{ + name = "JoinLateCryoCommand" + }, /turf/simulated/floor/tiled/dark, /area/crew_quarters/heads/cryo) "baj" = (