diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm
index f163b2a4c04..b7ff2c30e0d 100644
--- a/code/game/gamemodes/changeling/traitor_chan.dm
+++ b/code/game/gamemodes/changeling/traitor_chan.dm
@@ -2,11 +2,13 @@
name = "traitor+changeling"
config_tag = "traitorchan"
traitors_possible = 3 //hard limit on traitors if scaling is turned off
- restricted_jobs = list("AI", "Cyborg")
+ restricted_jobs = list("Cyborg")
+ secondary_restricted_jobs = list("AI") // Allows AI to roll traitor, but not changeling
required_players = 10
required_enemies = 1 // how many of each type are required
recommended_enemies = 3
- var/protected_species_changeling = list("Machine")
+ secondary_enemies_scaling = 0.025
+ secondary_protected_species = list("Machine")
/datum/game_mode/traitor/changeling/announce()
to_chat(world, "The current game mode is - Traitor+Changeling!")
@@ -18,17 +20,23 @@
restricted_jobs += protected_jobs
var/list/datum/mind/possible_changelings = get_players_for_role(ROLE_CHANGELING)
+ secondary_enemies = CEILING((secondary_enemies_scaling * num_players()), 1)
for(var/mob/new_player/player in GLOB.player_list)
- if((player.mind in possible_changelings) && (player.client.prefs.species in protected_species_changeling))
+ if((player.mind in possible_changelings) && (player.client.prefs.species in secondary_protected_species))
possible_changelings -= player.mind
if(possible_changelings.len > 0)
- var/datum/mind/changeling = pick(possible_changelings)
- changelings += changeling
- modePlayer += changelings
- changeling.restricted_roles = restricted_jobs
- changeling.special_role = SPECIAL_ROLE_CHANGELING
+ for(var/I in possible_changelings)
+ if(length(changelings) >= secondary_enemies)
+ break
+ var/datum/mind/changeling = pick(possible_changelings)
+ changelings += changeling
+ modePlayer += changelings
+ possible_changelings -= changeling
+ changeling.restricted_roles = (restricted_jobs + secondary_restricted_jobs)
+ changeling.special_role = SPECIAL_ROLE_CHANGELING
+
return ..()
else
return 0
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index d61b59cace2..4f150975322 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -20,11 +20,15 @@
var/explosion_in_progress = 0 //sit back and relax
var/list/datum/mind/modePlayer = new
var/list/restricted_jobs = list() // Jobs it doesn't make sense to be. I.E chaplain or AI cultist
+ var/list/secondary_restricted_jobs = list() // Same as above, but for secondary antagonists
var/list/protected_jobs = list() // Jobs that can't be traitors
var/list/protected_species = list() // Species that can't be traitors
+ var/list/secondary_protected_species = list() // Same as above, but for secondary antagonists
var/required_players = 0
var/required_enemies = 0
var/recommended_enemies = 0
+ var/secondary_enemies = 0
+ var/secondary_enemies_scaling = 0 // Scaling rate of secondary enemies
var/newscaster_announcements = null
var/ert_disabled = 0
var/uplink_welcome = "Syndicate Uplink Console:"
diff --git a/code/game/gamemodes/vampire/traitor_vamp.dm b/code/game/gamemodes/vampire/traitor_vamp.dm
index d69b9a23518..7fb1088214b 100644
--- a/code/game/gamemodes/vampire/traitor_vamp.dm
+++ b/code/game/gamemodes/vampire/traitor_vamp.dm
@@ -3,11 +3,13 @@
config_tag = "traitorvamp"
traitors_possible = 3 //hard limit on traitors if scaling is turned off
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Chaplain", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer")
- restricted_jobs = list("AI", "Cyborg")
+ restricted_jobs = list("Cyborg")
+ secondary_restricted_jobs = list("AI")
required_players = 10
required_enemies = 1 // how many of each type are required
recommended_enemies = 3
- var/protected_species_vampire = list("Machine")
+ secondary_enemies_scaling = 0.025
+ secondary_protected_species = list("Machine")
/datum/game_mode/traitor/vampire/announce()
to_chat(world, "The current game mode is - Traitor+Vampire!")
@@ -19,20 +21,26 @@
restricted_jobs += protected_jobs
var/list/datum/mind/possible_vampires = get_players_for_role(ROLE_VAMPIRE)
+ secondary_enemies = CEILING((secondary_enemies_scaling * num_players()), 1)
for(var/mob/new_player/player in GLOB.player_list)
- if((player.mind in possible_vampires) && (player.client.prefs.species in protected_species_vampire))
+ if((player.mind in possible_vampires) && (player.client.prefs.species in secondary_protected_species))
possible_vampires -= player.mind
if(possible_vampires.len > 0)
- var/datum/mind/vampire = pick(possible_vampires)
- vampires += vampire
- modePlayer += vampires
- var/datum/mindslaves/slaved = new()
- slaved.masters += vampire
- vampire.som = slaved //we MIGT want to mindslave someone
- vampire.restricted_roles = restricted_jobs
- vampire.special_role = SPECIAL_ROLE_VAMPIRE
+ for(var/I in possible_vampires)
+ if(length(vampires) >= secondary_enemies)
+ break
+ var/datum/mind/vampire = pick(possible_vampires)
+ vampires += vampire
+ modePlayer += vampires
+ possible_vampires -= vampire
+ var/datum/mindslaves/slaved = new()
+ slaved.masters += vampire
+ vampire.som = slaved //we MIGHT want to mindslave someone
+ vampire.restricted_roles = (restricted_jobs + secondary_restricted_jobs)
+ vampire.special_role = SPECIAL_ROLE_VAMPIRE
+
..()
return 1
else