diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index a787074ca67a..fabff1688191 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -348,6 +348,47 @@ else return ..() +////////////////////////////////////////////// +// // +// INFILTRATORS (MIDROUND) // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/midround/from_ghosts/infiltration + name = "Infiltration" + antag_flag = ROLE_INFILTRATOR + antag_datum = ANTAG_DATUM_INFILTRATOR + enemy_roles = list("AI", "Cyborg", "Security Officer", "Warden","Detective","Head of Security", "Captain") + required_enemies = list(3,3,3,3,2,2,1,1,0,0) + required_candidates = 5 + weight = 3 + cost = 22 + requirements = list(90,90,90,80,60,40,30,20,10,10) + var/list/agents_cap = list(2,2,3,3,4,5,5,5,5,5) + var/datum/team/infiltrator/sit_team + flags = HIGH_IMPACT_RULESET + minimum_players = 35 + +/datum/dynamic_ruleset/midround/from_ghosts/infiltration/acceptable(population=0, threat=0) + if (locate(/datum/dynamic_ruleset/roundstart/infiltration) in mode.executed_rules) + return FALSE + indice_pop = min(agents_cap.len, round(living_players.len/5)+1) + required_candidates = agents_cap[indice_pop] + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/infiltration/ready(forced = FALSE) + if (required_candidates > (dead_players.len + list_observers.len)) + return FALSE + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/infiltration/finish_setup(mob/new_character, index) + new_character.mind.special_role = "Syndicate Infiltrator" + new_character.mind.assigned_role = "Syndicate Infiltrator" + if(!sit_team) + sit_team = new /datum/team/infiltrator + new_character.mind.add_antag_datum(ANTAG_DATUM_INFILTRATOR, sit_team) + sit_team.update_objectives() + ////////////////////////////////////////////// // // // BLOB (GHOST) // diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index 6f75591d5968..c2a57d3826bb 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -357,6 +357,62 @@ SSticker.mode_result = "halfwin - interrupted" SSticker.news_report = OPERATIVE_SKIRMISH +////////////////////////////////////////////// +// // +// INFILTRATORS // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/roundstart/infiltration + name = "Infiltration" + antag_flag = ROLE_INFILTRATOR + antag_datum = ANTAG_DATUM_INFILTRATOR + minimum_required_age = 14 + restricted_roles = list("Head of Security", "Captain") + required_candidates = 5 + weight = 4 + cost = 18 + requirements = list(90,90,90,80,60,40,30,20,10,10) + flags = HIGH_IMPACT_RULESET + antag_cap = list("denominator" = 15, "offset" = 1) + var/datum/team/infiltrator/sit_team + minimum_players = 30 + +/datum/dynamic_ruleset/roundstart/infiltration/ready(population, forced = FALSE) + required_candidates = get_antag_cap(population) + . = ..() + +/datum/dynamic_ruleset/roundstart/infiltration/pre_execute(population) + . = ..() + var/inflitrators_amount = get_antag_cap(population) + for(var/i = 1 to inflitrators_amount) + if(candidates.len <= 0) + break + var/mob/M = pick_n_take(candidates) + assigned += M.mind + M.mind.assigned_role = "Syndicate Infiltrator" + M.mind.special_role = "Syndicate Infiltrator" + return TRUE + +/datum/dynamic_ruleset/roundstart/infiltration/execute() + sit_team = new /datum/team/infiltrator + for(var/datum/mind/sit_mind in assigned) + sit_mind.add_antag_datum(ANTAG_DATUM_INFILTRATOR, sit_team) + sit_team.update_objectives() + return TRUE + +/datum/dynamic_ruleset/roundstart/infiltration/round_result() + var/result = sit_team.get_result() + switch(result) + if(INFILTRATION_ALLCOMPLETE) + SSticker.mode_result = "major win - objectives complete" + if(INFILTRATION_MOSTCOMPLETE) + SSticker.mode_result = "minor win - most objectives complete" + if(INFILTRATION_SOMECOMPLETE) + SSticker.mode_result = "neutral - some objectives complete" + else + SSticker.mode_result = "loss - no objectives complete" + ////////////////////////////////////////////// // // // REVS // diff --git a/yogstation/code/modules/events/infiltrators.dm b/yogstation/code/modules/events/infiltrators.dm index 804cac1a3ce2..0d761a8323a1 100644 --- a/yogstation/code/modules/events/infiltrators.dm +++ b/yogstation/code/modules/events/infiltrators.dm @@ -8,7 +8,7 @@ min_players = 23 - gamemode_blacklist = list("nuclear","wizard","revolution","abduction","infiltration","gang","cult","clockcult","darkspawn") + gamemode_blacklist = list("nuclear","wizard","revolution","abduction","infiltration","gang","cult","clockcult","darkspawn","dynamic") /datum/round_event_control/infiltrators/canSpawnEvent(var/players_amt, var/gamemode) . = ..()