diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm
index a560083458a..ce911101b70 100644
--- a/code/__DEFINES/role_preferences.dm
+++ b/code/__DEFINES/role_preferences.dm
@@ -17,10 +17,6 @@
#define ROLE_TRAITOR "Traitor"
#define ROLE_WIZARD "Wizard"
#define ROLE_SPY "Spy"
-// SKYRAT EDIT START
-#define ROLE_ASSAULT_OPERATIVE "Assault Operative"
-#define ROLE_OPFOR_CANDIDATE "OPFOR Candidate"
-// SKYRAT EDIT END
// Midround roles
#define ROLE_ABDUCTOR "Abductor"
@@ -42,12 +38,6 @@
#define ROLE_SPACE_DRAGON "Space Dragon"
#define ROLE_SPIDER "Spider"
#define ROLE_WIZARD_MIDROUND "Wizard (Midround)"
-//SKYRAT EDIT START
-#define ROLE_BORER "Borer"
-#define ROLE_LONE_INFILTRATOR "Lone Infiltrator"
-#define ROLE_MUTANT "Mutated Abomination"
-#define ROLE_CLOCK_CULTIST "Clock Cultist"
-// SKYRAT EDIT END
#define ROLE_VOIDWALKER "Voidwalker"
// Latejoin roles
diff --git a/code/__DEFINES/~~bubber_defines/role_preferences.dm b/code/__DEFINES/~~bubber_defines/role_preferences.dm
new file mode 100644
index 00000000000..76f6cd5ce3d
--- /dev/null
+++ b/code/__DEFINES/~~bubber_defines/role_preferences.dm
@@ -0,0 +1,21 @@
+#define ROLE_ASSAULT_OPERATIVE "Assault Operative"
+#define ROLE_OPFOR_CANDIDATE "OPFOR Candidate"
+
+#define ROLE_BORER "Borer"
+#define ROLE_LONE_INFILTRATOR "Lone Infiltrator"
+#define ROLE_MUTANT "Mutated Abomination"
+#define ROLE_CLOCK_CULTIST "Clock Cultist"
+
+#define ROLE_BLACK_MARKET_DEALER "Black Market Dealer"
+#define ROLE_DS2 "DS2 Syndicate"
+#define ROLE_FREIGHTER_CREW "Freighter Crew"
+#define ROLE_GHOST_CAFE "Ghost Cafe Visitor"
+#define ROLE_PORT_TARKON "Port Tarkon Survivor"
+#define ROLE_DAUNTLESS "Dauntless Syndicate"
+#define ROLE_PERSISTENCE "Persistence Syndicate"
+#define ROLE_BLOODSUCKER "Bloodsucker"
+#define ROLE_VAMPIRICACCIDENT "Bloodsucker (Midround)"
+#define ROLE_BLOODSUCKERBREAKOUT "Bloodsucker (Latejoin)"
+#define ROLE_MONSTERHUNTER "Monster Hunter"
+#define ROLE_VASSAL "Ghoul"
+#define ROLE_CHANGELING_ZOMBIE "Changeling Zombie"
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 77d3b4d8a06..c7a66051734 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -21,7 +21,7 @@
var/dat
- dat += "Dynamic Panel
"
+ dat += "Storyteller Panel
" // BUBBER EDIT CHANGE - Storyteller - Dynamic Panel -> Storyteller Panel
dat += "
"
dat += {"
Create Object
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 987b795cb8d..2db0a11a83a 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -57,41 +57,6 @@
handle_job_exempt_menu_topic(usr, href, href_list, target_ckey)
// BUBBER EDIT END
-// SKYRAT EDIT BEGIN -- ONE CLICK ANTAG
- else if(href_list["makeAntag"])
-
- message_admins("[key_name_admin(usr)] is attempting to make [href_list["makeAntag"]]")
-
- if(!check_rights(R_ADMIN))
- return
-
- if (!SSticker.HasRoundStarted())
- to_chat(usr, span_danger("Not until the round starts!"), confidential = TRUE)
- return
-
- var/opt = null
- switch(href_list["makeAntag"])
- if(ROLE_BLOB)
- opt = input("Set Blob Resource Gain Rate","Set Resource Rate",1) as num|null
- if(ROLE_TRAITOR)
- opt = input("How Many", ROLE_TRAITOR, 1) as num|null
- if(ROLE_CHANGELING)
- opt = input("How Many", ROLE_CHANGELING, 1) as num|null
- if(ROLE_CULTIST)
- opt = input("How Many", ROLE_CULTIST, 2) as num|null
- if(ROLE_HERETIC)
- opt = input("How Many", ROLE_HERETIC, 2) as num|null
- if(ROLE_REV)
- opt = input("How Many", ROLE_REV, 1) as num|null
- if(ROLE_OPERATIVE)
- opt = input("How Many", ROLE_OPERATIVE, 3) as num|null
- if(ROLE_BROTHER)
- opt = input("How Many", ROLE_BROTHER, 2) as num|null
- if(src.make_antag(href_list["makeAntag"], opt))
- message_admins("[key_name_admin(usr)] created '[href_list["makeAntag"]]' with a parameter of '[opt]'.")
- else message_admins("[key_name_admin(usr)] FAILED to create '[href_list["makeAntag"]]' with a parameter of '[opt]'.")
-// SKYRAT EDIT END -- ONE CLICK ANTAG
-
else if(href_list["editrightsbrowser"])
edit_admin_permissions(0)
@@ -1617,7 +1582,7 @@
if(!check_rights(R_ADMIN))
return
- if(!SSdynamic.picking_specific_rule(/datum/dynamic_ruleset/midround/from_living/opfor_candidate, forced = TRUE, ignore_cost = TRUE))
+ if(!SSdynamic.force_run_midround(/datum/dynamic_ruleset/midround/from_living/opfor_candidate, admin = usr))
message_admins("An OPFOR candidate could not be selected.")
// SKYRAT EDIT ADDITION END
else if(href_list["play_internet"])
diff --git a/code/modules/jobs/job_types/cargo_gorilla.dm b/code/modules/jobs/job_types/cargo_gorilla.dm
deleted file mode 100644
index 96a79e3a4d3..00000000000
--- a/code/modules/jobs/job_types/cargo_gorilla.dm
+++ /dev/null
@@ -1,50 +0,0 @@
-/datum/job/cargo_gorilla
- title = JOB_CARGO_GORILLA
- description = "Assist the supply department by moving freight and disposing of unwanted fruits."
- department_head = list(JOB_QUARTERMASTER)
- faction = FACTION_STATION
- total_positions = 0
- spawn_positions = 0
- supervisors = SUPERVISOR_QM
- spawn_type = /mob/living/basic/gorilla/cargorilla
- config_tag = "CARGO_GORILLA"
- random_spawns_possible = FALSE
- display_order = JOB_DISPLAY_ORDER_CARGO_GORILLA
- departments_list = list(/datum/job_department/cargo)
- mail_goodies = list(
- /obj/item/food/grown/banana = 1,
- )
- rpg_title = "Beast of Burden"
- allow_bureaucratic_error = FALSE
- job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK | JOB_CANNOT_OPEN_SLOTS | JOB_HIDE_WHEN_EMPTY | JOB_LATEJOIN_ONLY
-
-/datum/job/cargo_gorilla/get_roundstart_spawn_point()
- if (length(GLOB.gorilla_start))
- return pick(GLOB.gorilla_start)
- return ..()
-
-/datum/job/cargo_gorilla/get_spawn_mob(client/player_client, atom/spawn_point)
- if (!player_client)
- return
- var/mob/living/the_big_man = new spawn_type(get_turf(spawn_point))
- the_big_man.fully_replace_character_name(the_big_man.real_name, pick(GLOB.cargorilla_names))
- return the_big_man
-
-/datum/job/cargo_gorilla/after_spawn(mob/living/spawned, client/player_client)
- . = ..()
- // Gorilla with a wage, what's he buyin?
- var/datum/bank_account/bank_account = new(spawned.real_name, src)
- bank_account.payday(STARTING_PAYCHECKS, TRUE)
- bank_account.replaceable = FALSE
- spawned.add_mob_memory(/datum/memory/key/account, remembered_id = bank_account.account_id)
-
- var/obj/item/card/id/advanced/cargo_gorilla/gorilla_id = new(spawned.loc)
- gorilla_id.registered_name = spawned.name
- gorilla_id.update_label()
- gorilla_id.registered_account = bank_account
- bank_account.bank_cards += gorilla_id
- spawned.put_in_hands(gorilla_id, del_on_fail = TRUE)
-
- to_chat(spawned, span_boldnotice("You are Cargorilla, a pacifist friend of the station and carrier of freight."))
- to_chat(spawned, span_notice("You can pick up crates by clicking on them, and drop them by clicking on the ground."))
- spawned.mind.special_role = "Cargorilla"
diff --git a/modular_skyrat/modules/Midroundtraitor/code/datum_traitor.dm b/modular_skyrat/modules/Midroundtraitor/code/datum_traitor.dm
index 2e72a8896fc..aa47e065cc0 100644
--- a/modular_skyrat/modules/Midroundtraitor/code/datum_traitor.dm
+++ b/modular_skyrat/modules/Midroundtraitor/code/datum_traitor.dm
@@ -2,7 +2,7 @@
name = "Lone Infiltrator"
var/infil_outfit = /datum/outfit/syndicateinfiltrator
preview_outfit = /datum/outfit/lone_infiltrator_preview
- job_rank = ROLE_LONE_INFILTRATOR
+ pref_flag = ROLE_LONE_INFILTRATOR
/datum/antagonist/traitor/lone_infiltrator/on_gain()
var/mob/living/carbon/human/current = owner.current
diff --git a/modular_skyrat/modules/Midroundtraitor/code/event.dm b/modular_skyrat/modules/Midroundtraitor/code/event.dm
index f75197b92c9..d10d981c83b 100644
--- a/modular_skyrat/modules/Midroundtraitor/code/event.dm
+++ b/modular_skyrat/modules/Midroundtraitor/code/event.dm
@@ -1,56 +1,43 @@
/datum/dynamic_ruleset/midround/from_ghosts/lone_infiltrator
name = "Lone Infiltrator"
- antag_datum = /datum/antagonist/traitor/lone_infiltrator
- midround_ruleset_style = MIDROUND_RULESET_STYLE_LIGHT
- antag_flag = ROLE_LONE_INFILTRATOR
- restricted_roles = list(JOB_CYBORG,
- JOB_AI,
- JOB_SECURITY_OFFICER,
- JOB_WARDEN,
- JOB_DETECTIVE,
- JOB_HEAD_OF_SECURITY,
- JOB_CAPTAIN,
- JOB_CORRECTIONS_OFFICER,
- JOB_NT_REP,
- JOB_BLUESHIELD,
- JOB_ORDERLY,
- JOB_BOUNCER,
- JOB_CUSTOMS_AGENT,
- JOB_ENGINEERING_GUARD,
- JOB_SCIENCE_GUARD,
- )
- required_candidates = 1
+ config_tag = "Midround Lone Infiltrator"
+ preview_antag_datum = /datum/antagonist/traitor/lone_infiltrator
+ midround_type = LIGHT_MIDROUND
+ pref_flag = ROLE_LONE_INFILTRATOR
+ blacklisted_roles = list(
+ JOB_CYBORG,
+ JOB_AI,
+ JOB_SECURITY_OFFICER,
+ JOB_WARDEN,
+ JOB_DETECTIVE,
+ JOB_HEAD_OF_SECURITY,
+ JOB_CAPTAIN,
+ JOB_CORRECTIONS_OFFICER,
+ JOB_NT_REP,
+ JOB_BLUESHIELD,
+ JOB_ORDERLY,
+ JOB_BOUNCER,
+ JOB_CUSTOMS_AGENT,
+ JOB_ENGINEERING_GUARD,
+ JOB_SCIENCE_GUARD,
+ )
+ min_antag_cap = 1
weight = 4 //Slightly less common than normal midround traitors.
- cost = 4 //But also slightly more costly.
- minimum_players = 10
- var/list/spawn_locs = list()
+ min_pop = 10
-/datum/dynamic_ruleset/midround/from_ghosts/lone_infiltrator/execute()
+/datum/dynamic_ruleset/midround/from_ghosts/lone_infiltrator/create_execute_args()
+ return list(gather_spawns())
+
+/// Create list of valid spawnpoints
+/datum/dynamic_ruleset/midround/from_ghosts/lone_infiltrator/proc/gather_spawns()
+ var/list/spawns = list()
for(var/obj/effect/landmark/carpspawn/carp in GLOB.landmarks_list)
- spawn_locs += carp.loc
- if(!length(spawn_locs))
- message_admins("No valid spawn locations found, aborting...")
- return MAP_ERROR
- return ..()
+ spawns += carp.loc
+ return spawns
-/datum/dynamic_ruleset/midround/from_ghosts/lone_infiltrator/generate_ruleset_body(mob/applicant)
- var/datum/mind/player_mind = new /datum/mind(applicant.key)
-
- var/mob/living/carbon/human/operative = new(pick(spawn_locs))
- applicant.client.prefs.safe_transfer_prefs_to(operative)
- operative.dna.update_dna_identity()
- operative.dna.species.pre_equip_species_outfit(null, operative)
- operative.regenerate_icons()
- SSquirks.AssignQuirks(operative, applicant.client, TRUE, TRUE, null, FALSE, operative)
- player_mind.set_assigned_role(SSjob.get_job_type(/datum/job/lone_operative))
- player_mind.special_role = "Lone Infiltrator"
- player_mind.active = TRUE
- player_mind.transfer_to(operative)
- player_mind.add_antag_datum(/datum/antagonist/traitor/lone_infiltrator)
-
- message_admins("[ADMIN_LOOKUPFLW(operative)] has been made into lone infiltrator by midround ruleset.")
- log_game("[key_name(operative)] was spawned as a lone infiltrator by midround ruleset.")
- return operative
+/datum/dynamic_ruleset/midround/from_ghosts/lone_infiltrator/assign_role(datum/mind/candidate, list/valid_spawns)
+ candidate.add_antag_datum(/datum/antagonist/traitor/lone_infiltrator)
+ candidate.current.forceMove(pick(valid_spawns))
//OUTFIT//
/datum/outfit/syndicateinfiltrator
diff --git a/modular_skyrat/modules/assault_operatives/code/assault_operatives.dm b/modular_skyrat/modules/assault_operatives/code/assault_operatives.dm
index 65974e82f6a..79177b93f9d 100644
--- a/modular_skyrat/modules/assault_operatives/code/assault_operatives.dm
+++ b/modular_skyrat/modules/assault_operatives/code/assault_operatives.dm
@@ -4,7 +4,7 @@
/datum/antagonist/assault_operative
name = ROLE_ASSAULT_OPERATIVE
- job_rank = ROLE_ASSAULT_OPERATIVE
+ pref_flag = ROLE_ASSAULT_OPERATIVE
roundend_category = "assault operatives"
antagpanel_category = "Assault Operatives"
antag_hud_name = "synd"
@@ -68,7 +68,6 @@
return
assault_team = new /datum/team/assault_operatives
assault_team.add_member(owner)
- assault_team.update_objectives()
return
if(!istype(new_team))
stack_trace("Wrong team type passed to [type] initialization.")
@@ -200,14 +199,10 @@
*/
/datum/team/assault_operatives
- /// Our core objective, it's obviously goldeneye.
- var/core_objective = /datum/objective/goldeneye
-/datum/team/assault_operatives/proc/update_objectives()
- if(core_objective)
- var/datum/objective/new_objective = new core_objective
- new_objective.team = src
- objectives += new_objective
+/datum/team/assault_operatives/New(starting_members)
+ . = ..()
+ add_objective(new /datum/objective/goldeneye())
/datum/team/assault_operatives/proc/operatives_dead()
var/total_operatives = LAZYLEN(members)
diff --git a/modular_skyrat/modules/assault_operatives/code/dynamic_ruleset_roundstart.dm b/modular_skyrat/modules/assault_operatives/code/dynamic_ruleset_roundstart.dm
new file mode 100644
index 00000000000..59cfb77baa9
--- /dev/null
+++ b/modular_skyrat/modules/assault_operatives/code/dynamic_ruleset_roundstart.dm
@@ -0,0 +1,41 @@
+/*
+* ASSAULT OPERATIVES
+*/
+
+/datum/dynamic_ruleset/roundstart/assault_operatives
+ name = "Assault Operatives"
+ config_tag = "Roundstart Assault Operatives"
+ pref_flag = ROLE_ASSAULT_OPERATIVE
+ preview_antag_datum = /datum/antagonist/assault_operative
+ minimum_required_age = 14
+ blacklisted_roles = list(
+ JOB_CAPTAIN,
+ JOB_HEAD_OF_SECURITY,
+ JOB_HEAD_OF_SECURITY,
+ JOB_CHIEF_MEDICAL_OFFICER,
+ JOB_CHIEF_ENGINEER,
+ )
+ weight = 3
+ min_pop = 50
+ ruleset_flags = RULESET_INVADER|RULESET_HIGH_IMPACT
+ min_antag_cap = 5
+ max_antag_cap = list("denominator" = 18, "offset" = 1)
+
+/datum/dynamic_ruleset/roundstart/assault_operatives/prepare_for_role(datum/mind/candidate)
+ LAZYSET(SSjob.forced_occupations, candidate, /datum/job/assault_operative)
+
+/datum/dynamic_ruleset/roundstart/assault_operatives/create_execute_args()
+ return list(
+ new /datum/team/assault_operatives(),
+ )
+
+/datum/dynamic_ruleset/roundstart/assault_operatives/assign_role(datum/mind/candidate, datum/team/ops_team)
+ candidate.add_antag_datum(/datum/antagonist/assault_operative, ops_team)
+
+/datum/dynamic_ruleset/roundstart/assault_operatives/execute()
+ . = ..()
+ SSgoldeneye.required_keys = get_goldeneye_key_count()
+
+/// Returns the required goldeneye keys for activation. This is to make sure we don't have an impossible to achieve goal. However, there has to be at least one key.
+/datum/dynamic_ruleset/roundstart/assault_operatives/proc/get_goldeneye_key_count()
+ return clamp(LAZYLEN(SSjob.get_all_heads()), 1, GOLDENEYE_REQUIRED_KEYS_MAXIMUM)
diff --git a/modular_skyrat/modules/assault_operatives/code/dynamic_rulsesets_roundstart.dm b/modular_skyrat/modules/assault_operatives/code/dynamic_rulsesets_roundstart.dm
deleted file mode 100644
index 06c6e7ced78..00000000000
--- a/modular_skyrat/modules/assault_operatives/code/dynamic_rulsesets_roundstart.dm
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
-* ASSAULT OPERATIVES
-*/
-
-#define ASSAULT_OPERATIVES_COUNT 5
-
-/datum/dynamic_ruleset/roundstart/assault_operatives
- name = "Assault Operatives"
- antag_flag = ROLE_ASSAULT_OPERATIVE
- antag_datum = /datum/antagonist/assault_operative
- minimum_required_age = 14
- restricted_roles = list(
- JOB_CAPTAIN,
- JOB_HEAD_OF_SECURITY,
- JOB_HEAD_OF_SECURITY,
- JOB_CHIEF_MEDICAL_OFFICER,
- JOB_CHIEF_ENGINEER,
- )
- required_candidates = 5
- weight = 3
- cost = 20
- minimum_players = 50
- flags = HIGH_IMPACT_RULESET
- antag_cap = list("denominator" = 18, "offset" = 1)
- var/datum/team/assault_operatives/assault_operatives_team
-
-/datum/dynamic_ruleset/roundstart/assault_operatives/ready(population, forced = FALSE)
- required_candidates = get_antag_cap(population)
- . = ..()
-
-/datum/dynamic_ruleset/roundstart/assault_operatives/pre_execute(population)
- . = ..()
- // If ready() did its job, candidates should have 5 or more members in it
- for(var/operatives_number in 1 to ASSAULT_OPERATIVES_COUNT)
- if(candidates.len <= 0)
- break
- var/mob/candidate = pick_n_take(candidates)
- assigned += candidate.mind
- candidate.mind.set_assigned_role(SSjob.get_job_type(/datum/job/assault_operative))
- candidate.mind.special_role = ROLE_ASSAULT_OPERATIVE
- GLOB.pre_setup_antags += candidate.mind
- return TRUE
-
-/datum/dynamic_ruleset/roundstart/assault_operatives/execute()
- assault_operatives_team = new()
- for(var/datum/mind/iterating_mind in assigned)
- GLOB.pre_setup_antags -= iterating_mind
- var/datum/antagonist/assault_operative/new_op = new antag_datum()
- iterating_mind.add_antag_datum(new_op, assault_operatives_team)
- if(assault_operatives_team.members.len)
- assault_operatives_team.update_objectives()
- SSgoldeneye.required_keys = get_goldeneye_key_count()
- return TRUE
- log_game("DYNAMIC: [ruletype] [name] failed to get any eligible assault operatives. Refunding [cost] threat.")
- return FALSE
-
-/// Returns the required goldeneye keys for activation. This is to make sure we don't have an impossible to achieve goal. However, there has to be at least one key.
-/datum/dynamic_ruleset/roundstart/assault_operatives/proc/get_goldeneye_key_count()
- return clamp(LAZYLEN(SSjob.get_all_heads()), 1, GOLDENEYE_REQUIRED_KEYS_MAXIMUM)
-
-#undef ASSAULT_OPERATIVES_COUNT
diff --git a/modular_skyrat/modules/clock_cult/code/antagonist.dm b/modular_skyrat/modules/clock_cult/code/antagonist.dm
index c2c57950a0a..1b97d08f8ce 100644
--- a/modular_skyrat/modules/clock_cult/code/antagonist.dm
+++ b/modular_skyrat/modules/clock_cult/code/antagonist.dm
@@ -6,7 +6,7 @@
name = "\improper Clock Cultist"
antagpanel_category = "Clock Cultist"
preview_outfit = /datum/outfit/clock/preview
- job_rank = ROLE_CLOCK_CULTIST
+ pref_flag = ROLE_CLOCK_CULTIST
antag_moodlet = /datum/mood_event/cult
show_to_ghosts = TRUE
suicide_cry = ",r For Ratvar!!!"
diff --git a/modular_skyrat/modules/cortical_borer/code/cortical_borer_antag.dm b/modular_skyrat/modules/cortical_borer/code/cortical_borer_antag.dm
index 4bedfed4651..c04e358dd4b 100644
--- a/modular_skyrat/modules/cortical_borer/code/cortical_borer_antag.dm
+++ b/modular_skyrat/modules/cortical_borer/code/cortical_borer_antag.dm
@@ -31,11 +31,10 @@
/datum/antagonist/cortical_borer
name = "Cortical Borer"
- job_rank = ROLE_BORER
+ pref_flag = ROLE_BORER
show_in_antagpanel = TRUE
roundend_category = "cortical borers"
antagpanel_category = "Cortical Borers"
- prevent_roundtype_conversion = FALSE
show_to_ghosts = TRUE
/// The team of borers
var/datum/team/cortical_borers/borers
@@ -97,7 +96,6 @@
weight = 10
min_players = 999
max_occurrences = 1 //should only ever happen once
- dynamic_should_hijack = TRUE
category = EVENT_CATEGORY_ENTITIES
description = "A cortical borer has appeared on station. It will also attempt to produce eggs, and will attempt to gather willing hosts and learn chemicals through the blood."
@@ -143,47 +141,43 @@
/datum/dynamic_ruleset/midround/from_ghosts/cortical_borer
name = "Cortical Borer Infestation"
- antag_datum = /datum/antagonist/cortical_borer
- midround_ruleset_style = MIDROUND_RULESET_STYLE_LIGHT
- antag_flag = ROLE_BORER
- enemy_roles = list(
- JOB_CAPTAIN,
- JOB_DETECTIVE,
- JOB_HEAD_OF_SECURITY,
- JOB_SECURITY_OFFICER,
- )
- required_enemies = list(2,2,1,1,1,1,1,0,0,0)
- required_candidates = 1
+ config_tag = "Midround Cortical Borer Infestation"
+ preview_antag_datum = /datum/antagonist/cortical_borer
+ midround_type = LIGHT_MIDROUND
+ pref_flag = ROLE_BORER
+ min_antag_cap = 1
weight = 3
- cost = 15
- minimum_players = 20
+ min_pop = 20
repeatable = TRUE
- /// List of on-station vents
- var/list/vents = list()
-/datum/dynamic_ruleset/midround/from_ghosts/cortical_borer/execute()
- for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/atmospherics/components/unary/vent_pump))
+/datum/dynamic_ruleset/midround/from_ghosts/cortical_borer/create_ruleset_body()
+ return new /mob/living/basic/cortical_borer
+
+/datum/dynamic_ruleset/midround/from_ghosts/cortical_borer/create_execute_args()
+ return list(find_vents())
+
+/// Locate our vents to spawn in
+/datum/dynamic_ruleset/midround/from_ghosts/cortical_borer/proc/find_vents()
+ var/list/vents = list()
+ var/list/vent_pumps = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/atmospherics/components/unary/vent_pump)
+ for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent as anything in vent_pumps)
if(QDELETED(temp_vent))
continue
- if(is_station_level(temp_vent.loc.z) && !temp_vent.welded)
- var/datum/pipeline/temp_vent_parent = temp_vent.parents[1]
- if(!temp_vent_parent)
- continue // No parent vent
- // Stops Borers getting stuck in small networks.
- // See: Security, Virology
- if(length(temp_vent_parent.other_atmos_machines) > 20)
- vents += temp_vent
- if(!length(vents))
- return FALSE
- return TRUE
+ if(!is_station_level(temp_vent.loc.z) || temp_vent.welded)
+ continue
+ var/datum/pipeline/temp_vent_parent = temp_vent.parents[1]
+ if(!temp_vent_parent)
+ continue
+ // Stops Borers getting stuck in small networks.
+ // See: Security, Virology
+ if(length(temp_vent_parent.other_atmos_machines) <= 20)
+ continue
+ vents += temp_vent
+ return vents
-/datum/dynamic_ruleset/midround/from_ghosts/cortical_borer/generate_ruleset_body(mob/applicant)
- var/obj/vent = pick_n_take(vents)
- var/mob/living/basic/cortical_borer/new_borer = new(vent.loc)
- new_borer.key = applicant.key
- new_borer.move_into_vent(vent)
- message_admins("[ADMIN_LOOKUPFLW(new_borer)] has been made into a borer by the midround ruleset.")
- log_game("DYNAMIC: [key_name(new_borer)] was spawned as a borer by the midround ruleset.")
- return new_borer
+/datum/dynamic_ruleset/midround/from_ghosts/cortical_borer/assign_role(datum/mind/candidate, list/vent_list)
+ var/obj/vent = length(vent_list) >= 2 ? pick_n_take(vent_list) : vent_list[1]
+ candidate.add_antag_datum(/datum/antagonist/cortical_borer)
+ candidate.current.move_into_vent(vent)
#undef POP_PER_BORER
diff --git a/modular_skyrat/modules/cryosleep/code/ai.dm b/modular_skyrat/modules/cryosleep/code/ai.dm
index 84a1073ec11..9b494dcd9f3 100644
--- a/modular_skyrat/modules/cryosleep/code/ai.dm
+++ b/modular_skyrat/modules/cryosleep/code/ai.dm
@@ -18,7 +18,7 @@
//Handle job slot/tater cleanup.
if(src.mind.assigned_role.title == JOB_AI)
SSjob.FreeRole(JOB_AI)
- src.mind.special_role = null
+ LAZYNULL(src.mind.special_roles)
qdel(src)
else
return
diff --git a/modular_skyrat/modules/cryosleep/code/cryopod.dm b/modular_skyrat/modules/cryosleep/code/cryopod.dm
index 5805ae1ffa2..ede4041927d 100644
--- a/modular_skyrat/modules/cryosleep/code/cryopod.dm
+++ b/modular_skyrat/modules/cryosleep/code/cryopod.dm
@@ -383,7 +383,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/cryopod, 32)
// Handle tater cleanup.
if(LAZYLEN(mob_occupant.mind.objectives))
mob_occupant.mind.objectives.Cut()
- mob_occupant.mind.special_role = null
+ LAZYNULL(mob_occupant.mind.special_roles)
// Handle freeing the high priest role for the next chaplain in line
if(mob_occupant.mind.holy_role == HOLY_ROLE_HIGHPRIEST)
reset_religion()
diff --git a/modular_skyrat/modules/encounters/code/nri_raiders.dm b/modular_skyrat/modules/encounters/code/nri_raiders.dm
index 60c948df0ef..d4ac2d5aa19 100644
--- a/modular_skyrat/modules/encounters/code/nri_raiders.dm
+++ b/modular_skyrat/modules/encounters/code/nri_raiders.dm
@@ -528,7 +528,7 @@ GLOBAL_VAR(first_officer)
/datum/antagonist/cop
name = "\improper Commonwealth Police Officer"
//Even if their goal's almost a complete antithesis to what pirates normally do, their spawn is, well, done via pirate code.
- job_rank = ROLE_SPACE_PIRATE
+ pref_flag = ROLE_SPACE_PIRATE
roundend_category = "nri cops"
antagpanel_category = "Commonwealth Police"
show_in_antagpanel = FALSE
diff --git a/modular_skyrat/modules/examinemore/code/examine_more.dm b/modular_skyrat/modules/examinemore/code/examine_more.dm
index e1581f5a68e..468276e4b6e 100644
--- a/modular_skyrat/modules/examinemore/code/examine_more.dm
+++ b/modular_skyrat/modules/examinemore/code/examine_more.dm
@@ -55,7 +55,7 @@ would only be recognisable with someone that had the syndicate trait.
if(EXAMINE_CHECK_SYNDICATE)
if(user.mind)
var/datum/mind/M = user.mind
- if((M.special_role == ROLE_TRAITOR) || (ROLE_SYNDICATE in user.faction))
+ if((ROLE_TRAITOR in M.get_special_roles()) || (ROLE_SYNDICATE in user.faction))
composed_message = "You note the following because of your [special_desc_affiliation ? special_desc_affiliation : "Syndicate Affiliation"]:
"
composed_message += special_desc
. += composed_message
@@ -67,7 +67,7 @@ would only be recognisable with someone that had the syndicate trait.
if(EXAMINE_CHECK_SYNDICATE_TOY)
if(user.mind)
var/datum/mind/M = user.mind
- if((M.special_role == ROLE_TRAITOR) || (ROLE_SYNDICATE in user.faction))
+ if((ROLE_TRAITOR in M.get_special_roles()) || (ROLE_SYNDICATE in user.faction))
composed_message = "You note the following because of your [special_desc_affiliation ? special_desc_affiliation : "Syndicate Affiliation"]:
"
composed_message += special_desc
. += composed_message
@@ -83,7 +83,7 @@ would only be recognisable with someone that had the syndicate trait.
if(user.mind)
var/datum/mind/M = user.mind
for(var/role_i in special_desc_roles)
- if(M.special_role == role_i)
+ if(role_i in M.get_special_roles())
composed_message = "You note the following because of your [role_i] role:
"
composed_message += special_desc
. += composed_message
diff --git a/modular_skyrat/modules/mutants/code/mutant_antag_datum.dm b/modular_skyrat/modules/mutants/code/mutant_antag_datum.dm
index acfc5de6883..39f2a481af8 100644
--- a/modular_skyrat/modules/mutants/code/mutant_antag_datum.dm
+++ b/modular_skyrat/modules/mutants/code/mutant_antag_datum.dm
@@ -1,6 +1,6 @@
/datum/antagonist/mutant
name = "\improper Mutated Abomination"
- job_rank = ROLE_MUTANT
+ pref_flag = ROLE_MUTANT
roundend_category = "mutants"
antagpanel_category = "Mutant"
show_in_antagpanel = TRUE
diff --git a/modular_skyrat/modules/mutants/code/mutant_event.dm b/modular_skyrat/modules/mutants/code/mutant_event.dm
index bc2327a2097..c1526719d24 100644
--- a/modular_skyrat/modules/mutants/code/mutant_event.dm
+++ b/modular_skyrat/modules/mutants/code/mutant_event.dm
@@ -2,7 +2,6 @@
name = "HNZ-1 Pathogen Outbreak"
typepath = /datum/round_event/mutant_infestation
weight = 0
- dynamic_should_hijack = TRUE
/datum/round_event/mutant_infestation
announce_when = 300
diff --git a/modular_skyrat/modules/oneclickantag/code/oneclickantag.dm b/modular_skyrat/modules/oneclickantag/code/oneclickantag.dm
deleted file mode 100644
index 9d2c35be97a..00000000000
--- a/modular_skyrat/modules/oneclickantag/code/oneclickantag.dm
+++ /dev/null
@@ -1,247 +0,0 @@
-/datum/mind/var/list/oneclickantag = list()
-
-/datum/mind/remove_antag_datum(datum)
- var/datum/antagonist/antag = datum
- var/role = initial(antag.job_rank)
- if(role)
- oneclickantag += role
- else message_admins("Unable to update [src]'s previous antag list for One Click Antag. Unhandled datum '[datum]'. Ping ZephyrTFA.")
- return ..()
-
-/datum/mind/proc/make_antag(antagtype, opt = null)
- message_admins("[src] was turned into [antagtype]")
- src.oneclickantag += antagtype
- switch(antagtype)
- if(ROLE_TRAITOR)
- src.add_antag_datum(/datum/antagonist/traitor)
- if(ROLE_CHANGELING)
- src.add_antag_datum(/datum/antagonist/changeling)
- if(ROLE_REV)
- var/datum/antagonist/rev/head/antag = new
- antag.give_flash = TRUE
- antag.give_hud = TRUE
- src.add_antag_datum(antag)
- if(ROLE_CULTIST)
- src.add_antag_datum(/datum/antagonist/cult)
- if(ROLE_BROTHER)
- if(!istype(opt, /datum/team/brother_team))
- message_admins("Attempted to create bloodbrothers but no team was specified!")
- return FALSE
- var/datum/team/brother_team/team = opt
- src.add_antag_datum(/datum/antagonist/brother, team)
- if(ROLE_HERETIC)
- src.add_antag_datum(/datum/antagonist/heretic)
- else
- message_admins("[src] could not be turned into [antagtype] as it is not implemented; blame coders.")
- return FALSE
- return TRUE
-
-ADMIN_VERB(one_click_antag, R_ADMIN, "Create Antagonist", "Auto-create an antagonist of your choice", ADMIN_CATEGORY_EVENTS)
- user.holder?.one_click_antag()
-
-/**
-If anyone can figure out how to get Obsessed to work I would be very appreciative.
-**/
-/datum/admins/proc/one_click_antag()
- var/dat = ""
- for(var/role in GLOB.special_roles)
- if(role in list(ROLE_MALF, ROLE_PAI, ROLE_SENTIENCE, ROLE_OBSESSED))
- continue
- dat += "Make [role](s)."
- if(antag_is_ghostrole(role))
- dat += " (Requires Ghosts)"
- dat += "
"
- var/datum/browser/popup = new(usr, "oneclickantag", "Quick-Create Antagonist", 400, 400)
- popup.set_content(dat)
- popup.open()
-
-/datum/admins/proc/can_make_antag(mob/living/carbon/human/applicant, targetrole, onstation = TRUE, conscious = TRUE)
- if(applicant.mind.oneclickantag.Find(targetrole))
- return FALSE
- if(applicant.mind.special_role)
- return FALSE
- if(!(targetrole in applicant.client.prefs.be_special))
- return FALSE
- if(!applicant.client.prefs.read_preference(/datum/preference/toggle/be_antag))
- return FALSE
- if(onstation)
- var/turf/T = get_turf(applicant)
- if(!is_station_level(T.z))
- return FALSE
- if(conscious && applicant.stat)
- return FALSE
- if(!considered_alive(applicant.mind) || considered_afk(applicant.mind))
- return FALSE
- if(is_banned_from(applicant.ckey, list(targetrole, ROLE_SYNDICATE)))
- return FALSE
- return TRUE
-
-/datum/admins/
- var/MAKEANTAG_RESTRICTLIST = list()
- var/MAKEANTAG_PL_DEFAULT_SECURITY = list(JOB_PRISONER, JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_DETECTIVE, JOB_HEAD_OF_SECURITY, JOB_CAPTAIN, JOB_CORRECTIONS_OFFICER, JOB_SECURITY_MEDIC, JOB_BLUESHIELD, JOB_ORDERLY, JOB_BOUNCER, JOB_CUSTOMS_AGENT, JOB_ENGINEERING_GUARD, JOB_SCIENCE_GUARD)
- var/MAKEANTAG_PL_DEFAULT_HEADS = list(JOB_CAPTAIN,JOB_HEAD_OF_PERSONNEL,JOB_RESEARCH_DIRECTOR,JOB_CHIEF_ENGINEER,JOB_CHIEF_MEDICAL_OFFICER,JOB_HEAD_OF_SECURITY,JOB_QUARTERMASTER)
- var/MAKEANTAG_PL_DEFAULT_SILICON = list(JOB_AI, JOB_CYBORG)
-
-/datum/admins/proc/antag_get_protected_roles(antagtype)
- if(MAKEANTAG_RESTRICTLIST[antagtype])
- return MAKEANTAG_RESTRICTLIST[antagtype]
- var/c_p = CONFIG_GET(flag/protect_roles_from_antagonist)
- var/c_a = CONFIG_GET(flag/protect_assistant_from_antagonist)
- var/list/p_p = list()
- var/list/p_r = list()
- switch(antagtype)
- if(ROLE_TRAITOR)
- p_p += MAKEANTAG_PL_DEFAULT_SECURITY
- p_p += MAKEANTAG_PL_DEFAULT_HEADS
- if(ROLE_CHANGELING)
- p_p += MAKEANTAG_PL_DEFAULT_SECURITY
- p_p += MAKEANTAG_PL_DEFAULT_HEADS
- if(ROLE_CULTIST)
- p_p += MAKEANTAG_PL_DEFAULT_SECURITY
- p_p += MAKEANTAG_PL_DEFAULT_HEADS
- p_p += MAKEANTAG_PL_DEFAULT_SILICON
- p_p += list(JOB_CHAPLAIN, JOB_HEAD_OF_PERSONNEL)
- if(ROLE_HERETIC)
- p_p += MAKEANTAG_PL_DEFAULT_SECURITY
- p_p += MAKEANTAG_PL_DEFAULT_HEADS
- p_r += MAKEANTAG_PL_DEFAULT_SILICON
- if(ROLE_REV)
- p_r += MAKEANTAG_PL_DEFAULT_SECURITY
- p_r += MAKEANTAG_PL_DEFAULT_HEADS
- p_r += MAKEANTAG_PL_DEFAULT_SILICON
- if(c_a)
- p_r += list(JOB_ASSISTANT)
- if(c_p)
- p_r += p_p
- MAKEANTAG_RESTRICTLIST[antagtype] = p_r
- return p_r
-
-/datum/admins/proc/antag_is_ghostrole(antagtype)
- switch(antagtype)
- if(ROLE_WIZARD)
- return TRUE
- if(ROLE_OPERATIVE)
- return TRUE
- if(ROLE_NINJA)
- return TRUE
- if(ROLE_ABDUCTOR)
- return TRUE
- if(ROLE_REVENANT)
- return TRUE
- if(ROLE_SPACE_DRAGON)
- return TRUE
- if(ROLE_BLOB)
- return TRUE
- if(ROLE_ALIEN)
- return TRUE
- return FALSE
-
-/datum/admins/proc/make_antag(antagtype, opt)
- if(antag_is_ghostrole(antagtype))
- return make_antag_ghostrole(antagtype, opt)
- var/datum/team/brother_team/team
- if(antagtype == ROLE_BROTHER)
- team = new
- team.forge_brother_objectives()
- var/list/restricted_jobs = antag_get_protected_roles(antagtype)
- var/list/mob/living/carbon/human/candidates = list()
- var/mob/living/carbon/human/holder = null
- for(var/mob/living/carbon/human/applicant in GLOB.player_list)
- if(can_make_antag(applicant, antagtype))
- if(applicant.job in restricted_jobs)
- continue
- candidates += applicant
- if(candidates.len)
- candidates = shuffle(candidates)
- var/canmake = min(candidates.len, opt)
- for(var/index = 0, index 0)
- trimmed_list.Remove(mob_candidate)
- continue
-
- if (is_banned_from(mob_candidate.ckey, BAN_OPFOR))
- trimmed_list.Remove(mob_candidate)
- continue
-
- if (mob_candidate.mind)
- if (restrict_ghost_roles && (mob_candidate.mind.assigned_role.title in GLOB.exp_specialmap[EXP_TYPE_SPECIAL])) // Are they playing a ghost role?
- trimmed_list.Remove(mob_candidate)
- continue
-
- return trimmed_list
+/datum/dynamic_ruleset/midround/from_living/opfor_candidate/assign_role(datum/mind/candidate)
+ candidate.add_antag_datum(/datum/antagonist/opfor_candidate)
+ message_admins("[ADMIN_LOOKUPFLW(candidate.current)] had OPFOR candidacy passed onto them.")
+ log_dynamic("[key_name(candidate.current)] had OPFOR candidacy passed onto them.")
diff --git a/modular_skyrat/modules/primitive_catgirls/code/spawner.dm b/modular_skyrat/modules/primitive_catgirls/code/spawner.dm
index 42becf32073..11a3d9d96ce 100644
--- a/modular_skyrat/modules/primitive_catgirls/code/spawner.dm
+++ b/modular_skyrat/modules/primitive_catgirls/code/spawner.dm
@@ -111,12 +111,11 @@
/datum/antagonist/primitive_catgirl
name = "\improper Icewalker"
- job_rank = ROLE_LAVALAND // If you're ashwalker banned you should also not be playing this, other way around as well
+ pref_flag = ROLE_LAVALAND // If you're ashwalker banned you should also not be playing this, other way around as well
show_in_antagpanel = FALSE
show_to_ghosts = TRUE
- prevent_roundtype_conversion = FALSE
antagpanel_category = "Icemoon Dwellers"
- count_against_dynamic_roll_chance = FALSE
+ antag_flags = ANTAG_FAKE|ANTAG_SKIP_GLOBAL_LIST
show_in_roundend = FALSE
/// Tracks the antag datum's 'team' for showing in the ghost orbit menu
diff --git a/modular_zubbers/code/__DEFINES/bloodsucker_defines.dm b/modular_zubbers/code/__DEFINES/bloodsucker_defines.dm
index 823eddb00e5..f1817563fbf 100644
--- a/modular_zubbers/code/__DEFINES/bloodsucker_defines.dm
+++ b/modular_zubbers/code/__DEFINES/bloodsucker_defines.dm
@@ -263,7 +263,7 @@
#define POLL_IGNORE_GHOUL "ghoul"
// Why waste memory on a dynamic global list if we can just bake it in on compile time?
-#define BLOODSUCKER_PROTECTED_ROLES list( \
+#define BLOODSUCKER_BLACKLISTED_ROLES list( \
JOB_CAPTAIN, \
JOB_HEAD_OF_PERSONNEL, \
JOB_HEAD_OF_SECURITY, \
diff --git a/modular_zubbers/code/controllers/subsystem/dynamic/dynamic_ruleset_latejoin.dm b/modular_zubbers/code/controllers/subsystem/dynamic/dynamic_ruleset_latejoin.dm
new file mode 100644
index 00000000000..d48f2756c4f
--- /dev/null
+++ b/modular_zubbers/code/controllers/subsystem/dynamic/dynamic_ruleset_latejoin.dm
@@ -0,0 +1,30 @@
+
+//////////////////////////////////////////////
+// //
+// LATEJOIN BLOODSUCKER //
+// //
+//////////////////////////////////////////////
+
+/datum/dynamic_ruleset/latejoin/bloodsucker
+ name = "Bloodsucker Breakout"
+ config_tag = "Latejoin Bloodsucker"
+ preview_antag_datum = /datum/antagonist/bloodsucker
+ pref_flag = ROLE_BLOODSUCKERBREAKOUT
+ jobban_flag = ROLE_BLOODSUCKER
+ blacklisted_roles = BLOODSUCKER_BLACKLISTED_ROLES
+ weight = 5
+ repeatable = FALSE
+ /// List of species that cannot be bloodsuckers
+ var/list/restricted_species = BLOODSUCKER_RESTRICTED_SPECIES
+
+/datum/dynamic_ruleset/latejoin/bloodsucker/is_valid_candidate(mob/candidate, client/candidate_client)
+ var/selected_species = candidate_client.prefs?.read_preference(/datum/preference/choiced/species)
+ if(selected_species in restricted_species)
+ return FALSE
+ if(!candidate.mind.valid_bloodsucker_candidate())
+ return FALSE
+ return ..()
+
+/datum/dynamic_ruleset/latejoin/bloodsucker/assign_role(datum/mind/candidate)
+ var/datum/antagonist/bloodsucker/suck_datum = candidate.add_antag_datum(/datum/antagonist/bloodsucker)
+ suck_datum.AdjustUnspentRank(rand(2, 3))
diff --git a/modular_zubbers/code/controllers/subsystem/dynamic/dynamic_ruleset_midround.dm b/modular_zubbers/code/controllers/subsystem/dynamic/dynamic_ruleset_midround.dm
new file mode 100644
index 00000000000..5ab62163c43
--- /dev/null
+++ b/modular_zubbers/code/controllers/subsystem/dynamic/dynamic_ruleset_midround.dm
@@ -0,0 +1,68 @@
+
+//////////////////////////////////////////////
+// //
+// MIDROUND BLOODSUCKER //
+// //
+//////////////////////////////////////////////
+
+/datum/dynamic_ruleset/midround/from_living/bloodsucker
+ name = "Vampiric Accident"
+ config_tag = "Midround Bloodsucker"
+ midround_type = HEAVY_MIDROUND
+ preview_antag_datum = /datum/antagonist/bloodsucker
+ pref_flag = ROLE_VAMPIRICACCIDENT
+ jobban_flag = ROLE_BLOODSUCKER
+ blacklisted_roles = BLOODSUCKER_BLACKLISTED_ROLES
+ weight = 5
+ repeatable = FALSE
+ /// List of species that cannot be bloodsuckers
+ var/list/restricted_species = BLOODSUCKER_RESTRICTED_SPECIES
+
+/datum/dynamic_ruleset/midround/from_living/bloodsucker/is_valid_candidate(mob/candidate, client/candidate_client)
+ if(!is_station_level(candidate.z))
+ return FALSE
+ var/selected_species = candidate_client.prefs?.read_preference(/datum/preference/choiced/species)
+ if(selected_species in restricted_species)
+ return FALSE
+ if(!candidate.mind.valid_bloodsucker_candidate())
+ return FALSE
+ return ..()
+
+/datum/dynamic_ruleset/midround/from_living/bloodsucker/assign_role(datum/mind/candidate)
+ var/datum/antagonist/bloodsucker/suck_datum = candidate.add_antag_datum(/datum/antagonist/bloodsucker)
+ suck_datum.AdjustUnspentRank(rand(2, 3))
+
+
+/datum/dynamic_ruleset/midround/from_living/traitor
+ repeatable = TRUE
+
+/datum/dynamic_ruleset/midround/from_ghosts/blob
+ repeatable = TRUE
+
+/datum/dynamic_ruleset/midround/from_living/blob
+ repeatable = TRUE
+
+/datum/dynamic_ruleset/midround/from_ghosts/xenomorph
+ repeatable = FALSE
+
+/datum/dynamic_ruleset/midround/from_ghosts/nightmare
+ repeatable = FALSE
+
+/datum/dynamic_ruleset/midround/from_ghosts/abductors
+ repeatable = FALSE
+
+/datum/dynamic_ruleset/midround/from_ghosts/space_ninja
+ min_pop = 20
+ repeatable = FALSE
+
+/datum/dynamic_ruleset/midround/spiders
+ repeatable = FALSE
+
+/datum/dynamic_ruleset/midround/from_ghosts/revenant
+ repeatable = FALSE
+
+/datum/dynamic_ruleset/midround/pirates
+ repeatable = FALSE
+
+/datum/dynamic_ruleset/midround/from_living/obsesed
+ repeatable = FALSE
diff --git a/modular_zubbers/code/controllers/subsystem/dynamic/dynamic_ruleset_roundstart.dm b/modular_zubbers/code/controllers/subsystem/dynamic/dynamic_ruleset_roundstart.dm
new file mode 100644
index 00000000000..65fea09e627
--- /dev/null
+++ b/modular_zubbers/code/controllers/subsystem/dynamic/dynamic_ruleset_roundstart.dm
@@ -0,0 +1,31 @@
+
+//////////////////////////////////////////////
+// //
+// ROUNDSTART BLOODSUCKER //
+// //
+//////////////////////////////////////////////
+
+
+
+/datum/dynamic_ruleset/roundstart/bloodsucker
+ name = "Bloodsuckers"
+ config_tag = "Roundstart Bloodsucker"
+ pref_flag = ROLE_BLOODSUCKER
+ preview_antag_datum = /datum/antagonist/bloodsucker
+ blacklisted_roles = BLOODSUCKER_BLACKLISTED_ROLES
+ weight = 5
+ max_antag_cap = list("denominator" = 24)
+ /// List of species that cannot be bloodsuckers
+ var/list/restricted_species = BLOODSUCKER_RESTRICTED_SPECIES
+
+/datum/dynamic_ruleset/roundstart/bloodsucker/is_valid_candidate(mob/candidate, client/candidate_client)
+ var/selected_species = candidate_client.prefs?.read_preference(/datum/preference/choiced/species)
+ if(selected_species in restricted_species)
+ return FALSE
+ if(!candidate.mind.valid_bloodsucker_candidate())
+ return FALSE
+ return ..()
+
+/datum/dynamic_ruleset/roundstart/bloodsucker/assign_role(datum/mind/candidate)
+ var/datum/antagonist/bloodsucker/suck_datum = candidate.add_antag_datum(/datum/antagonist/bloodsucker)
+ suck_datum.AdjustUnspentRank(rand(2, 3))
diff --git a/modular_zubbers/code/game/gamemodes/dynamic/dynamic_rulesets.dm b/modular_zubbers/code/game/gamemodes/dynamic/dynamic_rulesets.dm
deleted file mode 100644
index f31c902d682..00000000000
--- a/modular_zubbers/code/game/gamemodes/dynamic/dynamic_rulesets.dm
+++ /dev/null
@@ -1,22 +0,0 @@
-/datum/dynamic_ruleset
- /// Species that won't be considered as a valid target for the rule.
- var/restricted_species = list()
-
-/datum/dynamic_ruleset/proc/trim_restricted_species()
- for(var/mob/candidate_player in candidates)
- var/client/candidate_client = GET_CLIENT(candidate_player)
- var/selected_species = candidate_client.prefs?.read_preference(/datum/preference/choiced/species)
- if(selected_species in restricted_species)
- candidates.Remove(candidate_player)
-
-/datum/dynamic_ruleset/roundstart/trim_candidates()
- . = ..()
- trim_restricted_species()
-
-/datum/dynamic_ruleset/midround/trim_candidates()
- . = ..()
- trim_restricted_species()
-
-/datum/dynamic_ruleset/latejoin/trim_candidates()
- . = ..()
- trim_restricted_species()
diff --git a/modular_zubbers/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/modular_zubbers/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm
deleted file mode 100644
index 76e6a174fb4..00000000000
--- a/modular_zubbers/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm
+++ /dev/null
@@ -1,37 +0,0 @@
-
-//////////////////////////////////////////////
-// //
-// LATEJOIN BLOODSUCKER //
-// //
-//////////////////////////////////////////////
-
-/datum/dynamic_ruleset/latejoin/bloodsucker
- name = "Bloodsucker Breakout"
- antag_datum = /datum/antagonist/bloodsucker
- antag_flag = ROLE_BLOODSUCKERBREAKOUT
- antag_flag_override = ROLE_BLOODSUCKER
- protected_roles = BLOODSUCKER_PROTECTED_ROLES
- restricted_roles = BLOODSUCKER_RESTRICTED_ROLES
- restricted_species = BLOODSUCKER_RESTRICTED_SPECIES
- required_candidates = 1
- weight = 5
- cost = 10
- requirements = list(10,10,10,10,10,10,10,10,10,10)
- repeatable = FALSE
-
-/datum/dynamic_ruleset/latejoin/bloodsucker/execute()
- if(!length(candidates))
- return FALSE
- var/mob/latejoiner = pick(candidates) // This should contain a single player, but in case.
- assigned += latejoiner.mind
-
- for(var/datum/mind/candidate_mind as anything in assigned)
- var/datum/antagonist/bloodsucker/bloodsuckerdatum = candidate_mind.make_bloodsucker()
- if(!bloodsuckerdatum)
- assigned -= candidate_mind
- message_admins("[ADMIN_LOOKUPFLW(candidate_mind)] was selected by the [name] ruleset, but couldn't be made into a Bloodsucker.")
- continue
- bloodsuckerdatum.AdjustUnspentRank(rand(2, 3))
- message_admins("[ADMIN_LOOKUPFLW(candidate_mind)] was selected by the [name] ruleset and has been made into a midround Bloodsucker.")
- log_game("DYNAMIC: [key_name(candidate_mind)] was selected by the [name] ruleset and has been made into a midround Bloodsucker.")
- return TRUE
diff --git a/modular_zubbers/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/modular_zubbers/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
deleted file mode 100644
index 713c1572018..00000000000
--- a/modular_zubbers/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
+++ /dev/null
@@ -1,47 +0,0 @@
-
-//////////////////////////////////////////////
-// //
-// MIDROUND BLOODSUCKER //
-// //
-//////////////////////////////////////////////
-
-/datum/dynamic_ruleset/midround/bloodsucker
- name = "Vampiric Accident"
- midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY
- antag_datum = /datum/antagonist/bloodsucker
- antag_flag = ROLE_VAMPIRICACCIDENT
- antag_flag_override = ROLE_BLOODSUCKER
- protected_roles = BLOODSUCKER_PROTECTED_ROLES
- restricted_roles = BLOODSUCKER_RESTRICTED_ROLES
- restricted_species = BLOODSUCKER_RESTRICTED_SPECIES
- required_candidates = 1
- weight = 5
- cost = 10
- requirements = list(40,30,20,10,10,10,10,10,10,10)
- repeatable = FALSE
-
-/datum/dynamic_ruleset/midround/bloodsucker/trim_candidates()
- ..()
- candidates = living_players
- for(var/mob/living/player in candidates)
- if(!is_station_level(player.z))
- candidates.Remove(player)
- else if(player.mind && (player.mind.special_role || length(player.mind.antag_datums) > 0))
- candidates.Remove(player)
-
-/datum/dynamic_ruleset/midround/bloodsucker/execute()
- if(!length(candidates))
- return FALSE
- var/mob/selected_mobs = pick(candidates)
- assigned += selected_mobs.mind
- candidates -= selected_mobs
- var/datum/mind/candidate_mind = selected_mobs.mind
- var/datum/antagonist/bloodsucker/bloodsuckerdatum = candidate_mind.make_bloodsucker()
- if(!bloodsuckerdatum)
- assigned -= selected_mobs.mind
- message_admins("[ADMIN_LOOKUPFLW(selected_mobs)] was selected by the [name] ruleset, but couldn't be made into a Bloodsucker.")
- return FALSE
- bloodsuckerdatum.AdjustUnspentRank(rand(2, 3))
- message_admins("[ADMIN_LOOKUPFLW(selected_mobs)] was selected by the [name] ruleset and has been made into a midround Bloodsucker.")
- log_game("DYNAMIC: [key_name(selected_mobs)] was selected by the [name] ruleset and has been made into a midround Bloodsucker.")
- return TRUE
diff --git a/modular_zubbers/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/modular_zubbers/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
deleted file mode 100644
index b6423d25a96..00000000000
--- a/modular_zubbers/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
+++ /dev/null
@@ -1,47 +0,0 @@
-
-//////////////////////////////////////////////
-// //
-// ROUNDSTART BLOODSUCKER //
-// //
-//////////////////////////////////////////////
-
-
-
-/datum/dynamic_ruleset/roundstart/bloodsucker
- name = "Bloodsuckers"
- antag_flag = ROLE_BLOODSUCKER
- antag_datum = /datum/antagonist/bloodsucker
- protected_roles = BLOODSUCKER_PROTECTED_ROLES
- restricted_roles = BLOODSUCKER_RESTRICTED_ROLES
- restricted_species = BLOODSUCKER_RESTRICTED_SPECIES
- required_candidates = 1
- weight = 5
- cost = 10
- scaling_cost = 9
- requirements = list(10,10,10,10,10,10,10,10,10,10)
- antag_cap = list("denominator" = 24)
-
-/datum/dynamic_ruleset/roundstart/bloodsucker/pre_execute(population)
- . = ..()
- var/num_bloodsuckers = get_antag_cap(population) * (scaled_times + 1)
-
- for(var/i = 1 to num_bloodsuckers)
- if(candidates.len <= 0)
- break
- var/mob/selected_mobs = pick_n_take(candidates)
- assigned += selected_mobs.mind
- selected_mobs.mind.special_role = ROLE_BLOODSUCKER
- selected_mobs.mind.restricted_roles = restricted_roles
- GLOB.pre_setup_antags += selected_mobs.mind
- return TRUE
-
-/datum/dynamic_ruleset/roundstart/bloodsucker/execute()
- for(var/datum/mind/candidate_minds as anything in assigned)
- if(!candidate_minds.make_bloodsucker())
- candidate_minds.special_role = null
- candidate_minds.restricted_roles = null
- message_admins("[ADMIN_LOOKUPFLW(candidate_minds)] was selected by the [name] ruleset, but couldn't be made into a Bloodsucker.")
- assigned -= candidate_minds
- continue
- GLOB.pre_setup_antags -= candidate_minds
- return TRUE
diff --git a/modular_zubbers/code/modules/antagonists/bloodsucker/bloodsuckers/bloodsucker.dm b/modular_zubbers/code/modules/antagonists/bloodsucker/bloodsuckers/bloodsucker.dm
index 2588f4ea8bc..65f41de5faf 100644
--- a/modular_zubbers/code/modules/antagonists/bloodsucker/bloodsuckers/bloodsucker.dm
+++ b/modular_zubbers/code/modules/antagonists/bloodsucker/bloodsuckers/bloodsucker.dm
@@ -3,10 +3,9 @@
show_in_antagpanel = TRUE
roundend_category = "bloodsuckers"
antagpanel_category = "Bloodsucker"
- job_rank = ROLE_BLOODSUCKER
+ pref_flag = ROLE_BLOODSUCKER
antag_hud_name = "bloodsucker"
show_name_in_check_antagonists = TRUE
- can_coexist_with_others = FALSE
hijack_speed = 0.5
hud_icon = 'modular_zubbers/icons/mob/huds/bloodsucker.dmi'
ui_name = "AntagInfoBloodsucker"
diff --git a/modular_zubbers/code/modules/antagonists/bloodsucker/bloodsuckers/conversion.dm b/modular_zubbers/code/modules/antagonists/bloodsucker/bloodsuckers/conversion.dm
index 58f16912ae4..ea896e695c4 100644
--- a/modular_zubbers/code/modules/antagonists/bloodsucker/bloodsuckers/conversion.dm
+++ b/modular_zubbers/code/modules/antagonists/bloodsucker/bloodsuckers/conversion.dm
@@ -86,30 +86,12 @@
return TRUE
/// Check if this is a valid person to actually be a bloodsucker
-/datum/mind/proc/is_valid_bloodsucker()
+/datum/mind/proc/valid_bloodsucker_candidate()
if(has_antag_datum(/datum/antagonist/bloodsucker))
return FALSE
if(!(current.mob_biotypes & MOB_ORGANIC))
- stack_trace("Somehow tried to give [current] a bloodsucker datum, when they did not have the MOB_ORGANIC biotype. ")
return FALSE
// While the antag can function without the mob itself having no blood, it doesn't make sense.
if(HAS_TRAIT(src, TRAIT_NOBLOOD))
- stack_trace("Somehow tried to give [current] a bloodsucker datum, when they had TRAIT_NOBLOOD. ")
return FALSE
return TRUE
-
-/*
- * # make_bloodsucker
- *
- * MIND Helper proc that turns the person into a Bloodsucker
- * Args:
- * creator - Person attempting to convert them.
- */
-/datum/mind/proc/make_bloodsucker(datum/mind/creator)
- if(!is_valid_bloodsucker())
- return FALSE
- var/datum/antagonist/bloodsuckerdatum = add_antag_datum(/datum/antagonist/bloodsucker)
- if(bloodsuckerdatum && creator)
- message_admins("[src] has become a Bloodsucker, and was created by [creator].")
- log_admin("[src] has become a Bloodsucker, and was created by [creator].")
- return bloodsuckerdatum
diff --git a/modular_zubbers/code/modules/antagonists/bloodsucker/bloodsuckers/objectives.dm b/modular_zubbers/code/modules/antagonists/bloodsucker/bloodsuckers/objectives.dm
index c7efd5a6fa6..25c7811bcf8 100644
--- a/modular_zubbers/code/modules/antagonists/bloodsucker/bloodsuckers/objectives.dm
+++ b/modular_zubbers/code/modules/antagonists/bloodsucker/bloodsuckers/objectives.dm
@@ -358,7 +358,7 @@
/datum/objective/bloodsucker/ghoulhim/update_explanation_text()
. = ..()
if(target?.current)
- explanation_text = "Ensure [target.name], the [!target_department_type ? target.assigned_role.title : target.special_role], is Ghoulifyd via the Persuasion Rack."
+ explanation_text = "Ensure [target.name], the [!target_department_type ? target.assigned_role.title : english_list(target.get_special_roles())], is Ghoulifyd via the Persuasion Rack."
else
explanation_text = "Free Objective"
diff --git a/modular_zubbers/code/modules/antagonists/bloodsucker/vassal/vassal_datum.dm b/modular_zubbers/code/modules/antagonists/bloodsucker/vassal/vassal_datum.dm
index 40e5af31e13..38e4b1a4f21 100644
--- a/modular_zubbers/code/modules/antagonists/bloodsucker/vassal/vassal_datum.dm
+++ b/modular_zubbers/code/modules/antagonists/bloodsucker/vassal/vassal_datum.dm
@@ -2,7 +2,7 @@
name = "\improper Ghoul"
roundend_category = "ghouls"
antagpanel_category = "Bloodsucker"
- job_rank = ROLE_VASSAL
+ pref_flag = ROLE_VASSAL
antag_hud_name = "ghoul"
show_in_roundend = FALSE
hud_icon = 'modular_zubbers/icons/mob/huds/bloodsucker.dmi'
diff --git a/modular_zubbers/code/modules/antagonists/bloodsucker/vassal/vassal_types/ex_vassal.dm b/modular_zubbers/code/modules/antagonists/bloodsucker/vassal/vassal_types/ex_vassal.dm
index ac0c125ba6e..a587093d7ed 100644
--- a/modular_zubbers/code/modules/antagonists/bloodsucker/vassal/vassal_types/ex_vassal.dm
+++ b/modular_zubbers/code/modules/antagonists/bloodsucker/vassal/vassal_types/ex_vassal.dm
@@ -5,7 +5,7 @@
name = "\improper Ex-Ghoul"
roundend_category = "ghouls"
antagpanel_category = "Bloodsucker"
- job_rank = ROLE_VASSAL
+ pref_flag = ROLE_VASSAL
antag_hud_name = "ghoul_grey"
show_in_roundend = FALSE
show_in_antagpanel = FALSE
diff --git a/modular_zubbers/code/modules/antagonists/pirate/pirate_event.dm b/modular_zubbers/code/modules/antagonists/pirate/pirate_event.dm
deleted file mode 100644
index 6cb85ba473d..00000000000
--- a/modular_zubbers/code/modules/antagonists/pirate/pirate_event.dm
+++ /dev/null
@@ -1,9 +0,0 @@
-/datum/round_event/pirates/start()
- //Check for admin customization - gang_list is only populated if admins manually spawn the event
- if(gang_list)
- send_pirate_threat(gang_list)
- else
- //fires with the global pirate gang lists if gang_list is empty
- send_pirate_threat(GLOB.heavy_pirate_gangs + GLOB.light_pirate_gangs)
-
-
diff --git a/modular_zubbers/code/modules/changeling_zombies/antagonist.dm b/modular_zubbers/code/modules/changeling_zombies/antagonist.dm
index 34ee55daabc..752f4ce7041 100644
--- a/modular_zubbers/code/modules/changeling_zombies/antagonist.dm
+++ b/modular_zubbers/code/modules/changeling_zombies/antagonist.dm
@@ -1,10 +1,7 @@
/datum/antagonist/changeling_zombie
name = "\improper Changeling Zombie"
- job_rank = ROLE_CHANGELING_ZOMBIE
-
- prevent_roundtype_conversion = FALSE
- can_coexist_with_others = TRUE
+ pref_flag = ROLE_CHANGELING_ZOMBIE
replace_banned = FALSE
show_to_ghosts = TRUE
diff --git a/modular_zubbers/code/modules/dynamic/midround_rulesets.dm b/modular_zubbers/code/modules/dynamic/midround_rulesets.dm
deleted file mode 100644
index d529e8ef043..00000000000
--- a/modular_zubbers/code/modules/dynamic/midround_rulesets.dm
+++ /dev/null
@@ -1,35 +0,0 @@
-// It should go without saying that these are all Bubberstation edits
-/datum/dynamic_ruleset/midround/from_living/autotraitor
- repeatable = TRUE
-
-/datum/dynamic_ruleset/midround/from_ghosts/blob
- repeatable = TRUE
-
-/datum/dynamic_ruleset/midround/from_living/blob_infection
- repeatable = TRUE
-
-/datum/dynamic_ruleset/midround/from_ghosts/xenomorph
- repeatable = FALSE
-
-/datum/dynamic_ruleset/midround/from_ghosts/nightmare
- repeatable = FALSE
-
-/datum/dynamic_ruleset/midround/from_ghosts/abductors
- repeatable = FALSE
-
-/datum/dynamic_ruleset/midround/from_ghosts/space_ninja
- minimum_players = 20
- repeatable = FALSE
-
-/datum/dynamic_ruleset/midround/spiders
- repeatable = FALSE
-
-/datum/dynamic_ruleset/midround/from_ghosts/revenant
- repeatable = FALSE
-
-/datum/dynamic_ruleset/midround/pirates
- repeatable = FALSE
-
-/datum/dynamic_ruleset/midround/from_living/obsessed
- cost = 4
- repeatable = FALSE
diff --git a/modular_zubbers/code/modules/storyteller/event_defines/crewset/_antagonist_event.dm b/modular_zubbers/code/modules/storyteller/event_defines/crewset/_antagonist_event.dm
index ffdbd02f714..a26bc0c3eb0 100644
--- a/modular_zubbers/code/modules/storyteller/event_defines/crewset/_antagonist_event.dm
+++ b/modular_zubbers/code/modules/storyteller/event_defines/crewset/_antagonist_event.dm
@@ -149,8 +149,7 @@
/datum/round_event/antagonist/proc/candidate_roles_setup(mob/candidate)
SHOULD_CALL_PARENT(FALSE)
- candidate.mind.special_role = antag_flag
- candidate.mind.restricted_roles = restricted_roles
+ LAZYADD(candidate.mind.special_roles, antag_flag)
/datum/round_event/antagonist/proc/template_setup(datum/round_event_control/antagonist/cast_control)
for(var/template in cast_control.ruleset_lazy_templates)
diff --git a/modular_zubbers/code/modules/storyteller/event_defines/crewset/malf.dm b/modular_zubbers/code/modules/storyteller/event_defines/crewset/malf.dm
index 51355d4b34f..87e5652611b 100644
--- a/modular_zubbers/code/modules/storyteller/event_defines/crewset/malf.dm
+++ b/modular_zubbers/code/modules/storyteller/event_defines/crewset/malf.dm
@@ -51,4 +51,4 @@
. = ..()
for(var/datum/mind/new_malf in setup_minds)
GLOB.pre_setup_antags += new_malf
- LAZYADDASSOC(SSjob.dynamic_forced_occupations, new_malf.current, "AI")
+ LAZYSET(SSjob.forced_occupations, new_malf.current, /datum/job/ai)
diff --git a/modular_zubbers/code/modules/storyteller/event_defines/crewset/nuke_ops.dm b/modular_zubbers/code/modules/storyteller/event_defines/crewset/nuke_ops.dm
index 7dc3a43cfd2..8f48ee1d123 100644
--- a/modular_zubbers/code/modules/storyteller/event_defines/crewset/nuke_ops.dm
+++ b/modular_zubbers/code/modules/storyteller/event_defines/crewset/nuke_ops.dm
@@ -19,13 +19,12 @@
/datum/round_event/antagonist/team/nukie
var/datum/job/job_type = /datum/job/nuclear_operative
- var/required_role = ROLE_NUCLEAR_OPERATIVE
+ var/required_role = ROLE_OPERATIVE
var/datum/team/nuclear/nuke_team
/datum/round_event/antagonist/team/nukie/candidate_roles_setup(mob/candidate)
candidate.mind.set_assigned_role(SSjob.get_job_type(job_type))
- candidate.mind.special_role = required_role
/datum/round_event/antagonist/team/nukie/start()
// Get our nukie leader
diff --git a/modular_zubbers/code/modules/storyteller/event_defines/ghostset/lone_infiltrator.dm b/modular_zubbers/code/modules/storyteller/event_defines/ghostset/lone_infiltrator.dm
index 70337f25284..c80b456f60f 100644
--- a/modular_zubbers/code/modules/storyteller/event_defines/ghostset/lone_infiltrator.dm
+++ b/modular_zubbers/code/modules/storyteller/event_defines/ghostset/lone_infiltrator.dm
@@ -3,7 +3,6 @@
typepath = /datum/round_event/ghost_role/lone_infiltrator
max_occurrences = 2
min_players = 10
- dynamic_should_hijack = TRUE
category = EVENT_CATEGORY_ENTITIES
description = "Spawns a lone infiltrator, a non-crew syndicate agent."
min_wizard_trigger_potency = NEVER_TRIGGERED_BY_WIZARDS
@@ -39,7 +38,6 @@
player_mind.transfer_to(operative)
player_mind.set_assigned_role(SSjob.get_job_type(/datum/job/lone_operative))
- player_mind.special_role = "Lone Infiltrator"
player_mind.add_antag_datum(/datum/antagonist/traitor/lone_infiltrator)
spawned_mobs += operative
diff --git a/modular_zubbers/code/modules/storyteller/event_defines/ghostset/voidwalker.dm b/modular_zubbers/code/modules/storyteller/event_defines/ghostset/voidwalker.dm
index 704a360e5da..9116a92baaa 100644
--- a/modular_zubbers/code/modules/storyteller/event_defines/ghostset/voidwalker.dm
+++ b/modular_zubbers/code/modules/storyteller/event_defines/ghostset/voidwalker.dm
@@ -7,7 +7,6 @@
weight = 3
earliest_start = 20 MINUTES
min_players = 30
- dynamic_should_hijack = TRUE
category = EVENT_CATEGORY_ENTITIES
description = "A Void Walker that drags people out of the station and into the abyss"
map_flags = EVENT_SPACE_ONLY
diff --git a/modular_zubbers/code/modules/storyteller/gamemode.dm b/modular_zubbers/code/modules/storyteller/gamemode.dm
index b5dc240e763..8291b60b39e 100644
--- a/modular_zubbers/code/modules/storyteller/gamemode.dm
+++ b/modular_zubbers/code/modules/storyteller/gamemode.dm
@@ -247,8 +247,6 @@ SUBSYSTEM_DEF(gamemode)
special_role_flag,
pick_observers,
pick_roundstart_players,
- required_time,
- inherit_required_time = TRUE,
no_antags = TRUE,
list/restricted_roles,
list/restricted_species,
@@ -259,7 +257,7 @@ SUBSYSTEM_DEF(gamemode)
var/list/candidate_candidates = list() //lol
if(pick_roundstart_players)
for(var/mob/dead/new_player/player in GLOB.new_player_list)
- if(player.ready == PLAYER_READY_TO_PLAY && player.mind && player.check_preferences())
+ if(player.ready == PLAYER_READY_TO_PLAY && player.mind && player.check_job_preferences())
candidate_candidates += player
else if(pick_observers)
for(var/mob/player as anything in GLOB.dead_mob_list)
@@ -276,7 +274,7 @@ SUBSYSTEM_DEF(gamemode)
for(var/mob/candidate as anything in candidate_candidates)
if(QDELETED(candidate) || !candidate.key || !candidate.client || !candidate.mind)
continue
- if(no_antags && candidate.mind.special_role)
+ if(no_antags && LAZYLEN(candidate.mind.special_roles))
continue
if(restricted_roles && (candidate.mind.assigned_role.title in restricted_roles))
continue
@@ -287,17 +285,11 @@ SUBSYSTEM_DEF(gamemode)
if(special_role_flag)
if(!(candidate.client.prefs) || !(special_role_flag in candidate.client.prefs.be_special))
continue
- var/time_to_check
- if(required_time)
- time_to_check = required_time
- else if (inherit_required_time)
- time_to_check = GLOB.special_roles[special_role_flag]
-
- if(time_to_check && candidate.client.get_remaining_days(time_to_check) > 0)
+ if(candidate.client.get_days_to_play_antag(special_role_flag) > 0)
+ continue
+ if(is_banned_from(candidate.ckey, list(special_role_flag, ROLE_SYNDICATE)))
continue
- if(special_role_flag && is_banned_from(candidate.ckey, list(special_role_flag, ROLE_SYNDICATE)))
- continue
if(is_banned_from(candidate.client.ckey, BAN_ANTAGONIST))
continue
if(!candidate.client?.prefs?.read_preference(/datum/preference/toggle/be_antag))
diff --git a/tgstation.dme b/tgstation.dme
index e25f0d464ec..b35fec27f7f 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -531,6 +531,7 @@
#include "code\__DEFINES\~~bubber_defines\nanites.dm"
#include "code\__DEFINES\~~bubber_defines\research_categories.dm"
#include "code\__DEFINES\~~bubber_defines\robot_defines.dm"
+#include "code\__DEFINES\~~bubber_defines\role_preferences.dm"
#include "code\__DEFINES\~~bubber_defines\say.dm"
#include "code\__DEFINES\~~bubber_defines\signals.dm"
#include "code\__DEFINES\~~bubber_defines\span.dm"
@@ -4651,7 +4652,6 @@
#include "code\modules\jobs\job_types\bartender.dm"
#include "code\modules\jobs\job_types\botanist.dm"
#include "code\modules\jobs\job_types\captain.dm"
-#include "code\modules\jobs\job_types\cargo_gorilla.dm"
#include "code\modules\jobs\job_types\cargo_technician.dm"
#include "code\modules\jobs\job_types\chemist.dm"
#include "code\modules\jobs\job_types\chief_engineer.dm"
@@ -7301,7 +7301,7 @@
#include "modular_skyrat\modules\assault_operatives\code\assault_operatives.dm"
#include "modular_skyrat\modules\assault_operatives\code\assault_operatives_outfits.dm"
#include "modular_skyrat\modules\assault_operatives\code\base_alarm.dm"
-#include "modular_skyrat\modules\assault_operatives\code\dynamic_rulsesets_roundstart.dm"
+#include "modular_skyrat\modules\assault_operatives\code\dynamic_ruleset_roundstart.dm"
#include "modular_skyrat\modules\assault_operatives\code\goldeneye.dm"
#include "modular_skyrat\modules\assault_operatives\code\interrogator.dm"
#include "modular_skyrat\modules\assault_operatives\code\keycard_doors.dm"
@@ -8496,7 +8496,6 @@
#include "modular_skyrat\modules\novaya_ert\code\toolbox.dm"
#include "modular_skyrat\modules\novaya_ert\code\uniform.dm"
#include "modular_skyrat\modules\officestuff\code\officestuff.dm"
-#include "modular_skyrat\modules\oneclickantag\code\oneclickantag.dm"
#include "modular_skyrat\modules\opposing_force\code\admin_procs.dm"
#include "modular_skyrat\modules\opposing_force\code\antagonist.dm"
#include "modular_skyrat\modules\opposing_force\code\dynamic.dm"
@@ -8850,6 +8849,9 @@
#include "modular_zubbers\code\controllers\subsystem\research.dm"
#include "modular_zubbers\code\controllers\subsystem\security_level.dm"
#include "modular_zubbers\code\controllers\subsystem\vote.dm"
+#include "modular_zubbers\code\controllers\subsystem\dynamic\dynamic_ruleset_latejoin.dm"
+#include "modular_zubbers\code\controllers\subsystem\dynamic\dynamic_ruleset_midround.dm"
+#include "modular_zubbers\code\controllers\subsystem\dynamic\dynamic_ruleset_roundstart.dm"
#include "modular_zubbers\code\controllers\subsystem\processing\nanites.dm"
#include "modular_zubbers\code\controllers\subsystem\processing\quirks.dm"
#include "modular_zubbers\code\controllers\subsystem\processing\sol_subsystem.dm"
@@ -8966,10 +8968,6 @@
#include "modular_zubbers\code\game\area\areas\station.dm"
#include "modular_zubbers\code\game\area\areas\away_content\byos.dm"
#include "modular_zubbers\code\game\brain_damage\severe.dm"
-#include "modular_zubbers\code\game\gamemodes\dynamic\dynamic_rulesets.dm"
-#include "modular_zubbers\code\game\gamemodes\dynamic\dynamic_rulesets_latejoin.dm"
-#include "modular_zubbers\code\game\gamemodes\dynamic\dynamic_rulesets_midround.dm"
-#include "modular_zubbers\code\game\gamemodes\dynamic\dynamic_rulesets_roundstart.dm"
#include "modular_zubbers\code\game\gamemodes\objectives\gimmick.dm"
#include "modular_zubbers\code\game\Items\big_bertha_shield.dm"
#include "modular_zubbers\code\game\Items\coins.dm"
@@ -9135,7 +9133,6 @@
#include "modular_zubbers\code\modules\antagonists\malf\doomsday.dm"
#include "modular_zubbers\code\modules\antagonists\malf\remove_malf.dm"
#include "modular_zubbers\code\modules\antagonists\nightmare\nightmare_species.dm"
-#include "modular_zubbers\code\modules\antagonists\pirate\pirate_event.dm"
#include "modular_zubbers\code\modules\antagonists\traitor\one_shot_emag.dm"
#include "modular_zubbers\code\modules\antagonists\traitor\uplink\uplinkdatums.dm"
#include "modular_zubbers\code\modules\antagonists\traitor\uplink\uplink_items\bundle.dm"
@@ -9295,7 +9292,6 @@
#include "modular_zubbers\code\modules\designs\limbgrower_designs.dm"
#include "modular_zubbers\code\modules\disease\disease_transmission.dm"
#include "modular_zubbers\code\modules\disease\hidden.dm"
-#include "modular_zubbers\code\modules\dynamic\midround_rulesets.dm"
#include "modular_zubbers\code\modules\emotes\emotes.dm"
#include "modular_zubbers\code\modules\emotes\hand_items.dm"
#include "modular_zubbers\code\modules\emotes\scream_datums.dm"