From 656656bf96bde28c43e5c00e70d5f37a52f96d03 Mon Sep 17 00:00:00 2001 From: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Sun, 29 Jun 2025 00:10:41 -0400 Subject: [PATCH] Fixes for e0bdfc3f5ffd98ce0a6b0e6b6a7e060700204540 part one --- code/__DEFINES/role_preferences.dm | 10 - .../~~bubber_defines/role_preferences.dm | 21 ++ code/modules/admin/admin.dm | 2 +- code/modules/admin/topic.dm | 37 +-- code/modules/jobs/job_types/cargo_gorilla.dm | 50 ---- .../Midroundtraitor/code/datum_traitor.dm | 2 +- .../modules/Midroundtraitor/code/event.dm | 81 +++--- .../code/assault_operatives.dm | 13 +- .../code/dynamic_ruleset_roundstart.dm | 41 +++ .../code/dynamic_rulsesets_roundstart.dm | 61 ----- .../modules/clock_cult/code/antagonist.dm | 2 +- .../code/cortical_borer_antag.dm | 72 +++-- modular_skyrat/modules/cryosleep/code/ai.dm | 2 +- .../modules/cryosleep/code/cryopod.dm | 2 +- .../modules/encounters/code/nri_raiders.dm | 2 +- .../modules/examinemore/code/examine_more.dm | 6 +- .../mutants/code/mutant_antag_datum.dm | 2 +- .../modules/mutants/code/mutant_event.dm | 1 - .../oneclickantag/code/oneclickantag.dm | 247 ------------------ .../modules/opposing_force/code/antagonist.dm | 2 +- .../modules/opposing_force/code/dynamic.dm | 63 +---- .../primitive_catgirls/code/spawner.dm | 5 +- .../code/__DEFINES/bloodsucker_defines.dm | 2 +- .../dynamic/dynamic_ruleset_latejoin.dm | 30 +++ .../dynamic/dynamic_ruleset_midround.dm | 68 +++++ .../dynamic/dynamic_ruleset_roundstart.dm | 31 +++ .../gamemodes/dynamic/dynamic_rulesets.dm | 22 -- .../dynamic/dynamic_rulesets_latejoin.dm | 37 --- .../dynamic/dynamic_rulesets_midround.dm | 47 ---- .../dynamic/dynamic_rulesets_roundstart.dm | 47 ---- .../bloodsucker/bloodsuckers/bloodsucker.dm | 3 +- .../bloodsucker/bloodsuckers/conversion.dm | 20 +- .../bloodsucker/bloodsuckers/objectives.dm | 2 +- .../bloodsucker/vassal/vassal_datum.dm | 2 +- .../vassal/vassal_types/ex_vassal.dm | 2 +- .../antagonists/pirate/pirate_event.dm | 9 - .../modules/changeling_zombies/antagonist.dm | 5 +- .../code/modules/dynamic/midround_rulesets.dm | 35 --- .../crewset/_antagonist_event.dm | 3 +- .../storyteller/event_defines/crewset/malf.dm | 2 +- .../event_defines/crewset/nuke_ops.dm | 3 +- .../ghostset/lone_infiltrator.dm | 2 - .../event_defines/ghostset/voidwalker.dm | 1 - .../code/modules/storyteller/gamemode.dm | 18 +- tgstation.dme | 14 +- 45 files changed, 309 insertions(+), 820 deletions(-) create mode 100644 code/__DEFINES/~~bubber_defines/role_preferences.dm delete mode 100644 code/modules/jobs/job_types/cargo_gorilla.dm create mode 100644 modular_skyrat/modules/assault_operatives/code/dynamic_ruleset_roundstart.dm delete mode 100644 modular_skyrat/modules/assault_operatives/code/dynamic_rulsesets_roundstart.dm delete mode 100644 modular_skyrat/modules/oneclickantag/code/oneclickantag.dm create mode 100644 modular_zubbers/code/controllers/subsystem/dynamic/dynamic_ruleset_latejoin.dm create mode 100644 modular_zubbers/code/controllers/subsystem/dynamic/dynamic_ruleset_midround.dm create mode 100644 modular_zubbers/code/controllers/subsystem/dynamic/dynamic_ruleset_roundstart.dm delete mode 100644 modular_zubbers/code/game/gamemodes/dynamic/dynamic_rulesets.dm delete mode 100644 modular_zubbers/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm delete mode 100644 modular_zubbers/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm delete mode 100644 modular_zubbers/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm delete mode 100644 modular_zubbers/code/modules/antagonists/pirate/pirate_event.dm delete mode 100644 modular_zubbers/code/modules/dynamic/midround_rulesets.dm 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"