diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm
index 14d2aa9d707..172e1ed3746 100644
--- a/code/__DEFINES/antagonists.dm
+++ b/code/__DEFINES/antagonists.dm
@@ -61,10 +61,6 @@
#define CONTRACT_UPLINK_PAGE_CONTRACTS "CONTRACTS"
#define CONTRACT_UPLINK_PAGE_HUB "HUB"
-///It is faster as a macro than a proc
-#define IS_HERETIC(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic))
-#define IS_HERETIC_MONSTER(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic_monster))
-
GLOBAL_LIST_INIT(heretic_start_knowledge,list(/datum/eldritch_knowledge/spell/basic,/datum/eldritch_knowledge/living_heart,/datum/eldritch_knowledge/codex_cicatrix))
@@ -85,3 +81,28 @@ GLOBAL_LIST_INIT(heretic_start_knowledge,list(/datum/eldritch_knowledge/spell/ba
/// TC to charge someone if they get a free implant through choice or
/// because they have nothing else that supports an implant.
#define UPLINK_IMPLANT_TELECRYSTAL_COST 4
+
+/// Checks if the given mob is a blood cultist
+#define IS_CULTIST(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/cult))
+
+/// Checks if the given mind is a leader of the monkey antagonists
+#define IS_MONKEY_LEADER(mind) mind?.has_antag_datum(/datum/antagonist/monkey/leader)
+
+/// Checks if the given mind is a monkey antagonist
+#define IS_INFECTED_MONKEY(mind) mind?.has_antag_datum(/datum/antagonist/monkey)
+
+/// Checks if the given mob is a nuclear operative
+#define IS_NUKE_OP(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/nukeop))
+
+#define IS_HERETIC(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic))
+
+#define IS_HERETIC_MONSTER(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic_monster))
+
+/// Checks if the given mob is a wizard
+#define IS_WIZARD(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/wizard))
+
+/// Checks if the given mob is a revolutionary. Will return TRUE for rev heads as well.
+#define IS_REVOLUTIONARY(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/rev))
+
+/// Checks if the given mob is a head revolutionary.
+#define IS_HEAD_REVOLUTIONARY(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/rev/head))
diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm
index 339eac16fe7..ec4329f9a63 100644
--- a/code/__DEFINES/role_preferences.dm
+++ b/code/__DEFINES/role_preferences.dm
@@ -43,31 +43,31 @@
#define ROLE_SYNDICATE_CYBERSUN "Cybersun Space Syndicate" //Ghost role syndi from Forgottenship ruin
#define ROLE_SYNDICATE_CYBERSUN_CAPTAIN "Cybersun Space Syndicate Captain" //Forgottenship captain syndie
-//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
-//The gamemode specific ones are just so the gamemodes can query whether a player is old enough
-//(in game days played) to play that role
+/// This defines the antagonists you can operate with in the settings.
+/// Keys are the antagonist, values are the number of days since the player's
+/// first connection in order to play.
GLOBAL_LIST_INIT(special_roles, list(
- ROLE_TRAITOR = /datum/game_mode/traitor,
- ROLE_BROTHER = /datum/game_mode/traitor/bros,
- ROLE_OPERATIVE = /datum/game_mode/nuclear,
- ROLE_CHANGELING = /datum/game_mode/changeling,
- ROLE_WIZARD = /datum/game_mode/wizard,
- ROLE_MALF,
- ROLE_REV = /datum/game_mode/revolution,
- ROLE_ALIEN,
- ROLE_PAI,
- ROLE_CULTIST = /datum/game_mode/cult,
- ROLE_BLOB,
- ROLE_NINJA,
- ROLE_OBSESSED,
- ROLE_SPACE_DRAGON,
- ROLE_MONKEY = /datum/game_mode/monkey,
- ROLE_REVENANT,
- ROLE_ABDUCTOR,
- ROLE_INTERNAL_AFFAIRS = /datum/game_mode/traitor/internal_affairs,
- ROLE_SENTIENCE,
- ROLE_FAMILIES = /datum/game_mode/gang,
- ROLE_HERETIC = /datum/game_mode/heretics
+ ROLE_TRAITOR = 0,
+ ROLE_BROTHER = 0,
+ ROLE_OPERATIVE = 14,
+ ROLE_CHANGELING = 0,
+ ROLE_WIZARD = 14,
+ ROLE_MALF = 0,
+ ROLE_REV = 14,
+ ROLE_ALIEN = 0,
+ ROLE_PAI = 0,
+ ROLE_CULTIST = 14,
+ ROLE_BLOB = 0,
+ ROLE_NINJA = 0,
+ ROLE_OBSESSED = 0,
+ ROLE_SPACE_DRAGON = 0,
+ ROLE_MONKEY = 0,
+ ROLE_REVENANT = 0,
+ ROLE_ABDUCTOR = 0,
+ ROLE_INTERNAL_AFFAIRS = 0,
+ ROLE_SENTIENCE = 0,
+ ROLE_FAMILIES = 0,
+ ROLE_HERETIC = 0,
))
//Job defines for what happens when you fail to qualify for any job during job selection
diff --git a/code/__DEFINES/uplink.dm b/code/__DEFINES/uplink.dm
new file mode 100644
index 00000000000..4aad3e6b886
--- /dev/null
+++ b/code/__DEFINES/uplink.dm
@@ -0,0 +1,10 @@
+// These are used in uplink_devices.dm to determine whether or not an item is purchasable.
+
+/// This item is purchasable to traitors
+#define UPLINK_TRAITORS (1 << 0)
+
+/// This item is purchasable to nuke ops
+#define UPLINK_NUKE_OPS (1 << 1)
+
+/// This item is purchasable to clown ops
+#define UPLINK_CLOWN_OPS (1 << 2)
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index b4e2f5b1925..600164cb3ce 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -410,7 +410,7 @@
else
candidates -= M
-/proc/pollGhostCandidates(Question, jobbanType, datum/game_mode/gametypeCheck, be_special_flag = 0, poll_time = 300, ignore_category = null, flashwindow = TRUE)
+/proc/pollGhostCandidates(Question, jobbanType, be_special_flag = 0, poll_time = 300, ignore_category = null, flashwindow = TRUE)
var/list/candidates = list()
if(!(GLOB.ghost_role_flags & GHOSTROLE_STATION_SENTIENCE))
return candidates
@@ -418,9 +418,9 @@
for(var/mob/dead/observer/G in GLOB.player_list)
candidates += G
- return pollCandidates(Question, jobbanType, gametypeCheck, be_special_flag, poll_time, ignore_category, flashwindow, candidates)
+ return pollCandidates(Question, jobbanType, be_special_flag, poll_time, ignore_category, flashwindow, candidates)
-/proc/pollCandidates(Question, jobbanType, datum/game_mode/gametypeCheck, be_special_flag = 0, poll_time = 300, ignore_category = null, flashwindow = TRUE, list/group = null)
+/proc/pollCandidates(Question, jobbanType, be_special_flag = 0, poll_time = 300, ignore_category = null, flashwindow = TRUE, list/group = null)
var/time_passed = world.time
if (!Question)
Question = "Would you like to be a special role?"
@@ -432,8 +432,9 @@
if(be_special_flag)
if(!(M.client.prefs) || !(be_special_flag in M.client.prefs.be_special))
continue
- if(gametypeCheck)
- if(!gametypeCheck.age_check(M.client))
+
+ var/required_time = GLOB.special_roles[be_special_flag] || 0
+ if (M.client && M.client.get_remaining_days(required_time) > 0)
continue
if(jobbanType)
if(is_banned_from(M.ckey, list(jobbanType, ROLE_SYNDICATE)) || QDELETED(M))
@@ -451,14 +452,14 @@
return result
-/proc/pollCandidatesForMob(Question, jobbanType, datum/game_mode/gametypeCheck, be_special_flag = 0, poll_time = 300, mob/M, ignore_category = null)
- var/list/L = pollGhostCandidates(Question, jobbanType, gametypeCheck, be_special_flag, poll_time, ignore_category)
+/proc/pollCandidatesForMob(Question, jobbanType, be_special_flag = 0, poll_time = 300, mob/M, ignore_category = null)
+ var/list/L = pollGhostCandidates(Question, jobbanType, be_special_flag, poll_time, ignore_category)
if(!M || QDELETED(M) || !M.loc)
return list()
return L
-/proc/pollCandidatesForMobs(Question, jobbanType, datum/game_mode/gametypeCheck, be_special_flag = 0, poll_time = 300, list/mobs, ignore_category = null)
- var/list/L = pollGhostCandidates(Question, jobbanType, gametypeCheck, be_special_flag, poll_time, ignore_category)
+/proc/pollCandidatesForMobs(Question, jobbanType, be_special_flag = 0, poll_time = 300, list/mobs, ignore_category = null)
+ var/list/L = pollGhostCandidates(Question, jobbanType, be_special_flag, poll_time, ignore_category)
var/i=1
for(var/v in mobs)
var/atom/A = v
diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm
index 93235a96101..54f405971cd 100644
--- a/code/controllers/configuration/configuration.dm
+++ b/code/controllers/configuration/configuration.dm
@@ -349,7 +349,7 @@ Example config:
var/ct = initial(M.config_tag)
if(ct && ct == mode_name)
return new T
- return new /datum/game_mode/extended()
+ return new /datum/game_mode/dynamic
/datum/controller/configuration/proc/get_runnable_modes()
var/list/datum/game_mode/runnable_modes = new
diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm
index 6339752a769..eeaeaa08418 100644
--- a/code/controllers/configuration/entries/general.dm
+++ b/code/controllers/configuration/entries/general.dm
@@ -108,8 +108,6 @@
/datum/config_entry/flag/allow_vote_restart // allow votes to restart
-/datum/config_entry/flag/allow_vote_mode // allow votes to change mode
-
/datum/config_entry/flag/allow_vote_map // allow votes to change map
/datum/config_entry/number/vote_delay // minimum time between voting sessions (deciseconds, 10 minute default)
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index da76fb2ecf6..0eae2ebc5a0 100755
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -695,11 +695,6 @@ SUBSYSTEM_DEF(ticker)
GLOB.master_mode = "extended"
log_game("Saved mode is '[GLOB.master_mode]'")
-/datum/controller/subsystem/ticker/proc/save_mode(the_mode)
- var/F = file("data/mode.txt")
- fdel(F)
- WRITE_FILE(F, the_mode)
-
/// Returns if either the master mode or the forced secret ruleset matches the mode name.
/datum/controller/subsystem/ticker/proc/is_mode(mode_name)
return GLOB.master_mode == mode_name || GLOB.secret_force_mode == mode_name
diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm
index c3757eb74ce..0500814e990 100644
--- a/code/controllers/subsystem/vote.dm
+++ b/code/controllers/subsystem/vote.dm
@@ -61,11 +61,6 @@ SUBSYSTEM_DEF(vote)
choices["Continue Playing"] += non_voters.len
if(choices["Continue Playing"] >= greatest_votes)
greatest_votes = choices["Continue Playing"]
- else if(mode == "gamemode")
- if(GLOB.master_mode in choices)
- choices[GLOB.master_mode] += non_voters.len
- if(choices[GLOB.master_mode] >= greatest_votes)
- greatest_votes = choices[GLOB.master_mode]
else if(mode == "map")
for (var/non_voter_ckey in non_voters)
var/client/C = non_voters[non_voter_ckey]
@@ -120,13 +115,6 @@ SUBSYSTEM_DEF(vote)
if("restart")
if(. == "Restart Round")
restart = TRUE
- if("gamemode")
- if(GLOB.master_mode != .)
- SSticker.save_mode(.)
- if(SSticker.HasRoundStarted())
- restart = TRUE
- else
- GLOB.master_mode = .
if("map")
SSmapping.changemap(global.config.maplist[.])
SSmapping.map_voted = TRUE
@@ -199,8 +187,6 @@ SUBSYSTEM_DEF(vote)
switch(vote_type)
if("restart")
choices.Add("Restart Round","Continue Playing")
- if("gamemode")
- choices.Add(config.votable_modes)
if("map")
if(!lower_admin && SSmapping.map_voted)
to_chat(usr, "The next map has already been selected.")
@@ -291,7 +277,6 @@ SUBSYSTEM_DEF(vote)
/datum/controller/subsystem/vote/ui_data(mob/user)
var/list/data = list(
"allow_vote_map" = CONFIG_GET(flag/allow_vote_map),
- "allow_vote_mode" = CONFIG_GET(flag/allow_vote_mode),
"allow_vote_restart" = CONFIG_GET(flag/allow_vote_restart),
"choices" = list(),
"lower_admin" = !!user.client?.holder,
@@ -333,18 +318,12 @@ SUBSYSTEM_DEF(vote)
if("toggle_restart")
if(usr.client.holder && upper_admin)
CONFIG_SET(flag/allow_vote_restart, !CONFIG_GET(flag/allow_vote_restart))
- if("toggle_gamemode")
- if(usr.client.holder && upper_admin)
- CONFIG_SET(flag/allow_vote_mode, !CONFIG_GET(flag/allow_vote_mode))
if("toggle_map")
if(usr.client.holder && upper_admin)
CONFIG_SET(flag/allow_vote_map, !CONFIG_GET(flag/allow_vote_map))
if("restart")
if(CONFIG_GET(flag/allow_vote_restart) || usr.client.holder)
initiate_vote("restart",usr.key)
- if("gamemode")
- if(CONFIG_GET(flag/allow_vote_mode) || usr.client.holder)
- initiate_vote("gamemode",usr.key)
if("map")
if(CONFIG_GET(flag/allow_vote_map) || usr.client.holder)
initiate_vote("map",usr.key)
diff --git a/code/datums/action.dm b/code/datums/action.dm
index 8bfe791c261..5ff07c7247c 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -481,7 +481,7 @@
background_icon_state = "bg_demon"
/datum/action/item_action/cult_dagger/Grant(mob/M)
- if(iscultist(M))
+ if(IS_CULTIST(M))
..()
button.screen_loc = "6:157,4:-2"
button.moved = "6:157,4:-2"
diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm
index 95aa6ae1e8f..1b2ec390de3 100644
--- a/code/datums/brain_damage/imaginary_friend.dm
+++ b/code/datums/brain_damage/imaginary_friend.dm
@@ -47,7 +47,7 @@
/datum/brain_trauma/special/imaginary_friend/proc/get_ghost()
set waitfor = FALSE
- var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner.real_name]'s imaginary friend?", ROLE_PAI, null, null, 75, friend, POLL_IGNORE_IMAGINARYFRIEND)
+ var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner.real_name]'s imaginary friend?", ROLE_PAI, null, 75, friend, POLL_IGNORE_IMAGINARYFRIEND)
if(LAZYLEN(candidates))
var/mob/dead/observer/C = pick(candidates)
friend.key = C.key
diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm
index c058173ba39..02f5fd6a5c4 100644
--- a/code/datums/brain_damage/split_personality.dm
+++ b/code/datums/brain_damage/split_personality.dm
@@ -33,7 +33,7 @@
/datum/brain_trauma/severe/split_personality/proc/get_ghost()
set waitfor = FALSE
- var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner.real_name]'s split personality?", ROLE_PAI, null, null, 75, stranger_backseat, POLL_IGNORE_SPLITPERSONALITY)
+ var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner.real_name]'s split personality?", ROLE_PAI, null, 75, stranger_backseat, POLL_IGNORE_SPLITPERSONALITY)
if(LAZYLEN(candidates))
var/mob/dead/observer/C = pick(candidates)
stranger_backseat.key = C.key
@@ -196,7 +196,7 @@
/datum/brain_trauma/severe/split_personality/brainwashing/get_ghost()
set waitfor = FALSE
- var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner.real_name]'s brainwashed mind?", null, null, null, 75, stranger_backseat)
+ var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner.real_name]'s brainwashed mind?", null, null, 75, stranger_backseat)
if(LAZYLEN(candidates))
var/mob/dead/observer/C = pick(candidates)
stranger_backseat.key = C.key
diff --git a/code/datums/components/gunpoint.dm b/code/datums/components/gunpoint.dm
index ebbfb8cf807..9e2ba76c874 100644
--- a/code/datums/components/gunpoint.dm
+++ b/code/datums/components/gunpoint.dm
@@ -45,7 +45,7 @@
target.apply_status_effect(STATUS_EFFECT_HELDUP, shooter)
if(istype(weapon, /obj/item/gun/ballistic/rocketlauncher) && weapon.chambered)
- if(target.stat == CONSCIOUS && is_nuclear_operative(shooter) && !is_nuclear_operative(target) && (locate(/obj/item/disk/nuclear) in target.get_contents()) && shooter.client)
+ if(target.stat == CONSCIOUS && IS_NUKE_OP(shooter) && !IS_NUKE_OP(target) && (locate(/obj/item/disk/nuclear) in target.get_contents()) && shooter.client)
shooter.client.give_award(/datum/award/achievement/misc/rocket_holdup, shooter)
target.do_alert_animation()
diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm
index f360b516dad..009ad1ecc90 100644
--- a/code/datums/components/uplink.dm
+++ b/code/datums/components/uplink.dm
@@ -17,7 +17,7 @@
var/telecrystals
var/selected_cat
var/owner = null
- var/datum/game_mode/gamemode
+ var/uplink_flag
var/datum/uplink_purchase_log/purchase_log
var/list/uplink_items
var/hidden_crystals = 0
@@ -29,7 +29,7 @@
var/list/previous_attempts
-/datum/component/uplink/Initialize(_owner, _lockable = TRUE, _enabled = FALSE, datum/game_mode/_gamemode, starting_tc = TELECRYSTALS_DEFAULT)
+/datum/component/uplink/Initialize(_owner, _lockable = TRUE, _enabled = FALSE, uplink_flag = UPLINK_TRAITORS, starting_tc = TELECRYSTALS_DEFAULT)
if(!isitem(parent))
return COMPONENT_INCOMPATIBLE
@@ -49,8 +49,6 @@
else if(istype(parent, /obj/item/pen))
RegisterSignal(parent, COMSIG_PEN_ROTATED, .proc/pen_rotation)
- update_items()
-
if(_owner)
owner = _owner
LAZYINITLIST(GLOB.uplink_purchase_logs_by_key)
@@ -60,7 +58,8 @@
purchase_log = new(owner, src)
lockable = _lockable
active = _enabled
- gamemode = _gamemode
+ src.uplink_flag = uplink_flag
+ update_items()
telecrystals = starting_tc
if(!lockable)
active = TRUE
@@ -71,20 +70,18 @@
/datum/component/uplink/InheritComponent(datum/component/uplink/U)
lockable |= U.lockable
active |= U.active
- if(!gamemode)
- gamemode = U.gamemode
+ uplink_flag |= U.uplink_flag
telecrystals += U.telecrystals
if(purchase_log && U.purchase_log)
purchase_log.MergeWithAndDel(U.purchase_log)
/datum/component/uplink/Destroy()
- gamemode = null
purchase_log = null
return ..()
/datum/component/uplink/proc/update_items()
var/updated_items
- updated_items = get_uplink_items(gamemode, TRUE, allow_restricted)
+ updated_items = get_uplink_items(uplink_flag, TRUE, allow_restricted)
update_sales(updated_items)
uplink_items = updated_items
@@ -104,10 +101,6 @@
TC.use(amt)
log_uplink("[key_name(user)] loaded [amt] telecrystals into [parent]'s uplink")
-/datum/component/uplink/proc/set_gamemode(_gamemode)
- gamemode = _gamemode
- update_items()
-
/datum/component/uplink/proc/OnAttackBy(datum/source, obj/item/I, mob/user)
SIGNAL_HANDLER
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index 4cacbd4414f..63c44cfa29b 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -83,7 +83,7 @@
/datum/disease/transformation/proc/replace_banned_player(mob/living/new_mob) // This can run well after the mob has been transferred, so need a handle on the new mob to kill it if needed.
set waitfor = FALSE
- var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [affected_mob.real_name]?", bantype, null, bantype, 50, affected_mob)
+ var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [affected_mob.real_name]?", bantype, bantype, 50, affected_mob)
if(LAZYLEN(candidates))
var/mob/dead/observer/C = pick(candidates)
to_chat(affected_mob, "Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!")
@@ -124,8 +124,8 @@
stage5 = list("You feel like monkeying around.")
/datum/disease/transformation/jungle_fever/do_disease_transformation(mob/living/carbon/affected_mob)
- if(affected_mob.mind && !is_monkey(affected_mob.mind))
- add_monkey(affected_mob.mind)
+ if(affected_mob.mind && !IS_INFECTED_MONKEY(affected_mob.mind))
+ affected_mob.mind.add_antag_datum(/datum/antagonist/monkey)
affected_mob.monkeyize()
ADD_TRAIT(affected_mob, TRAIT_VENTCRAWLER_ALWAYS, type)
@@ -149,7 +149,7 @@
/datum/disease/transformation/jungle_fever/cure()
- remove_monkey(affected_mob.mind)
+ affected_mob.mind.remove_antag_datum(/datum/antagonist/monkey)
..()
/datum/disease/transformation/jungle_fever/monkeymode
@@ -157,7 +157,7 @@
disease_flags = CAN_CARRY //no vaccines! no cure!
/datum/disease/transformation/jungle_fever/monkeymode/after_add()
- if(affected_mob && !is_monkey_leader(affected_mob.mind))
+ if(affected_mob && !IS_MONKEY_LEADER(affected_mob.mind))
visibility_flags = NONE
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 6de721c50a9..1386d26bdee 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -325,10 +325,6 @@
/datum/mind/proc/remove_traitor()
remove_antag_datum(/datum/antagonist/traitor)
-/datum/mind/proc/remove_brother()
- if(src in SSticker.mode.brothers)
- remove_antag_datum(/datum/antagonist/brother)
-
/datum/mind/proc/remove_nukeop()
var/datum/antagonist/nukeop/nuke = has_antag_datum(/datum/antagonist/nukeop,TRUE)
if(nuke)
@@ -339,12 +335,6 @@
remove_antag_datum(/datum/antagonist/wizard)
special_role = null
-/datum/mind/proc/remove_cultist()
- if(src in SSticker.mode.cult)
- SSticker.mode.remove_cultist(src, 0, 0)
- special_role = null
- remove_antag_equip()
-
/datum/mind/proc/remove_rev()
var/datum/antagonist/rev/rev = has_antag_datum(/datum/antagonist/rev)
if(rev)
@@ -359,14 +349,6 @@
if(O)
O.unlock_code = null
-/datum/mind/proc/remove_all_antag() //For the Lazy amongst us.
- remove_changeling()
- remove_traitor()
- remove_nukeop()
- remove_wizard()
- remove_cultist()
- remove_rev()
-
/datum/mind/proc/equip_traitor(employer = "The Syndicate", silent = FALSE, datum/antagonist/uplink_owner)
if(!current)
return
@@ -443,14 +425,14 @@
//Link a new mobs mind to the creator of said mob. They will join any team they are currently on, and will only switch teams when their creator does.
/datum/mind/proc/enslave_mind_to_creator(mob/living/creator)
- if(iscultist(creator))
- SSticker.mode.add_cultist(src)
+ if(IS_CULTIST(creator))
+ add_antag_datum(/datum/antagonist/cult)
- else if(is_revolutionary(creator))
+ else if(IS_REVOLUTIONARY(creator))
var/datum/antagonist/rev/converter = creator.mind.has_antag_datum(/datum/antagonist/rev,TRUE)
converter.add_revolutionary(src,FALSE)
- else if(is_nuclear_operative(creator))
+ else if(IS_NUKE_OP(creator))
var/datum/antagonist/nukeop/converter = creator.mind.has_antag_datum(/datum/antagonist/nukeop,TRUE)
var/datum/antagonist/nukeop/N = new()
N.send_to_spawnpoint = FALSE
@@ -724,14 +706,6 @@
assigned_role = ROLE_WIZARD
add_antag_datum(/datum/antagonist/wizard)
-
-/datum/mind/proc/make_Cultist()
- if(!has_antag_datum(/datum/antagonist/cult,TRUE))
- SSticker.mode.add_cultist(src,FALSE,equip=TRUE)
- special_role = ROLE_CULTIST
- to_chat(current, "You catch a glimpse of the Realm of Nar'Sie, The Geometer of Blood. You now see how flimsy your world is, you see that it should be open to the knowledge of Nar'Sie.")
- to_chat(current, "Assist your new brethren in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.")
-
/datum/mind/proc/make_Rev()
var/datum/antagonist/rev/head/head = new()
head.give_flash = TRUE
diff --git a/code/datums/saymode.dm b/code/datums/saymode.dm
index 87e12b1b2ee..d44abc2aadb 100644
--- a/code/datums/saymode.dm
+++ b/code/datums/saymode.dm
@@ -68,20 +68,20 @@
mode = MODE_MONKEY
/datum/saymode/monkey/handle_message(mob/living/user, message, datum/language/language)
- var/datum/mind = user.mind
+ var/datum/mind/mind = user.mind
if(!mind)
return TRUE
- if(is_monkey_leader(mind) || (ismonkey(user) && is_monkey(mind)))
+ if(IS_MONKEY_LEADER(mind) || (ismonkey(user) && IS_INFECTED_MONKEY(mind)))
user.log_talk(message, LOG_SAY, tag="monkey")
if(prob(75) && ismonkey(user))
user.visible_message("\The [user] chimpers.")
- var/msg = "\[[is_monkey_leader(mind) ? "Monkey Leader" : "Monkey"]\] [user]: [message]"
+ var/msg = "\[[IS_MONKEY_LEADER(mind) ? "Monkey Leader" : "Monkey"]\] [user]: [message]"
for(var/_M in GLOB.mob_list)
var/mob/M = _M
if(M in GLOB.dead_mob_list)
var/link = FOLLOW_LINK(M, user)
to_chat(M, "[link] [msg]")
- if((is_monkey_leader(M.mind) || ismonkey(M)) && (M.mind in SSticker.mode.ape_infectees))
+ if((IS_MONKEY_LEADER(M.mind) || ismonkey(M)) && IS_INFECTED_MONKEY(M.mind))
to_chat(M, msg)
return FALSE
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index 2c2d3a9e21d..87d23dacbd9 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -82,7 +82,7 @@
if(!QDELETED(GLOB.cult_narsie))
return //if Nar'Sie is alive, don't even worry about it
var/area/A = get_area(owner)
- for(var/datum/mind/B in SSticker.mode.cult)
+ for(var/datum/mind/B as anything in get_antag_minds(/datum/antagonist/cult))
if(isliving(B.current))
var/mob/living/M = B.current
SEND_SOUND(M, sound('sound/hallucinations/veryfar_noise.ogg'))
diff --git a/code/datums/voice_of_god_command.dm b/code/datums/voice_of_god_command.dm
index fe701822667..78a95653fe3 100644
--- a/code/datums/voice_of_god_command.dm
+++ b/code/datums/voice_of_god_command.dm
@@ -32,7 +32,7 @@ GLOBAL_LIST_INIT(voice_of_god_commands, init_voice_of_god_commands())
*/
/proc/voice_of_god(message, mob/living/user, list/span_list, base_multiplier = 1, include_speaker = FALSE, message_admins = TRUE)
var/log_message = uppertext(message)
- var/is_cultie = iscultist(user)
+ var/is_cultie = IS_CULTIST(user)
if(LAZYLEN(span_list))
if(is_cultie)
span_list = list("narsiesmall")
diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm
index 58ab325bb79..4d2ef3f7fc0 100644
--- a/code/datums/world_topic.dm
+++ b/code/datums/world_topic.dm
@@ -144,7 +144,6 @@
.["mode"] = GLOB.master_mode
.["respawn"] = config ? !CONFIG_GET(flag/norespawn) : FALSE
.["enter"] = GLOB.enter_allowed
- .["vote"] = CONFIG_GET(flag/allow_vote_mode)
.["ai"] = CONFIG_GET(flag/allow_ai)
.["host"] = world.host ? world.host : null
.["round_id"] = GLOB.round_id
diff --git a/code/game/alternate_appearance.dm b/code/game/alternate_appearance.dm
index 48dffe0746c..2153104c91c 100644
--- a/code/game/alternate_appearance.dm
+++ b/code/game/alternate_appearance.dm
@@ -140,7 +140,7 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances)
add_hud_to(mob)
/datum/atom_hud/alternate_appearance/basic/noncult/mobShouldSee(mob/M)
- if(!iscultist(M))
+ if(!IS_CULTIST(M))
return TRUE
return FALSE
@@ -153,7 +153,7 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances)
add_hud_to(mob)
/datum/atom_hud/alternate_appearance/basic/cult/mobShouldSee(mob/M)
- if(iscultist(M))
+ if(IS_CULTIST(M))
return TRUE
return FALSE
@@ -170,7 +170,7 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances)
return TRUE
if (istype(M, /mob/living/simple_animal/hostile/construct/wraith))
return TRUE
- if(isrevenant(M) || iswizard(M))
+ if(isrevenant(M) || IS_WIZARD(M))
return TRUE
return FALSE
diff --git a/code/game/gamemodes/brother/traitor_bro.dm b/code/game/gamemodes/brother/traitor_bro.dm
deleted file mode 100644
index 38330088531..00000000000
--- a/code/game/gamemodes/brother/traitor_bro.dm
+++ /dev/null
@@ -1,67 +0,0 @@
-/datum/game_mode
- var/list/datum/mind/brothers = list()
- var/list/datum/team/brother_team/brother_teams = list()
-
-/datum/game_mode/traitor/bros
- name = "traitor+brothers"
- config_tag = "traitorbro"
- restricted_jobs = list("Prisoner","AI", "Cyborg")
-
- announce_span = "danger"
- announce_text = "There are Syndicate agents and Blood Brothers on the station!\n\
- Traitors: Accomplish your objectives.\n\
- Blood Brothers: Accomplish your objectives.\n\
- Crew: Do not let the traitors or brothers succeed!"
-
- var/list/datum/team/brother_team/pre_brother_teams = list()
- var/const/team_amount = 2 //hard limit on brother teams if scaling is turned off
- var/const/min_team_size = 2
- traitors_required = FALSE //Only teams are possible
-
-/datum/game_mode/traitor/bros/pre_setup()
- if(CONFIG_GET(flag/protect_roles_from_antagonist))
- restricted_jobs += protected_jobs
- if(CONFIG_GET(flag/protect_assistant_from_antagonist))
- restricted_jobs += "Assistant"
-
- var/list/datum/mind/possible_brothers = get_players_for_role(ROLE_BROTHER)
-
- var/num_teams = team_amount
- var/bsc = CONFIG_GET(number/brother_scaling_coeff)
- if(bsc)
- num_teams = max(1, round(num_players() / bsc))
-
- for(var/j = 1 to num_teams)
- if(possible_brothers.len < min_team_size || antag_candidates.len <= required_enemies)
- break
- var/datum/team/brother_team/team = new
- var/team_size = prob(10) ? min(3, possible_brothers.len) : 2
- for(var/k = 1 to team_size)
- var/datum/mind/bro = antag_pick(possible_brothers)
- possible_brothers -= bro
- antag_candidates -= bro
- team.add_member(bro)
- bro.special_role = "brother"
- bro.restricted_roles = restricted_jobs
- log_game("[key_name(bro)] has been selected as a Brother")
- pre_brother_teams += team
- . = ..()
- if(.) //To ensure the game mode is going ahead
- for(var/teams in pre_brother_teams)
- for(var/antag in teams)
- GLOB.pre_setup_antags += antag
- return
-
-/datum/game_mode/traitor/bros/post_setup()
- for(var/datum/team/brother_team/team in pre_brother_teams)
- team.pick_meeting_area()
- team.forge_brother_objectives()
- for(var/datum/mind/M in team.members)
- M.add_antag_datum(/datum/antagonist/brother, team)
- GLOB.pre_setup_antags -= M
- team.update_name()
- brother_teams += pre_brother_teams
- return ..()
-
-/datum/game_mode/traitor/bros/generate_report()
- return "It's Syndicate recruiting season. Be alert for potential Syndicate infiltrators, but also watch out for disgruntled employees trying to defect. Unlike Nanotrasen, the Syndicate prides itself in teamwork and will only recruit pairs that share a brotherly trust."
diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm
index 683227076fb..148799deb8b 100644
--- a/code/game/gamemodes/dynamic/dynamic.dm
+++ b/code/game/gamemodes/dynamic/dynamic.dm
@@ -403,7 +403,8 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
var/mob/dead/new_player/player = i
if(player.ready == PLAYER_READY_TO_PLAY && player.mind)
roundstart_pop_ready++
- candidates.Add(player)
+ if(player.client.prefs.be_antag) //SKYRAT EDIT CHANGE
+ candidates.Add(player)
log_game("DYNAMIC: Listing [roundstart_rules.len] round start rulesets, and [candidates.len] players ready.")
if (candidates.len <= 0)
log_game("DYNAMIC: [candidates.len] candidates.")
@@ -686,15 +687,6 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
return TRUE
return FALSE
-/// Checks if client age is age or older.
-/datum/game_mode/dynamic/proc/check_age(client/C, age)
- enemy_minimum_age = age
- if(get_remaining_days(C) == 0)
- enemy_minimum_age = initial(enemy_minimum_age)
- return TRUE // Available in 0 days = available right now = player is old enough to play.
- enemy_minimum_age = initial(enemy_minimum_age)
- return FALSE
-
/datum/game_mode/dynamic/make_antag_chance(mob/living/carbon/human/newPlayer)
if (GLOB.dynamic_forced_extended)
return
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets.dm b/code/game/gamemodes/dynamic/dynamic_rulesets.dm
index 17da0a2b3fa..470da667b47 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets.dm
@@ -194,7 +194,7 @@
var/client/client = GET_CLIENT(P)
if (!client || !P.mind) // Are they connected?
candidates.Remove(P)
- else if(!mode.check_age(client, minimum_required_age))
+ else if(client.get_remaining_days(minimum_required_age) > 0)
candidates.Remove(P)
else if(P.mind.special_role) // We really don't want to give antag to an antag.
candidates.Remove(P)
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm
index 397db97388e..9b6ecdc6394 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm
@@ -8,7 +8,7 @@
for(var/mob/P in candidates)
if(!P.client || !P.mind || !P.mind.assigned_role) // Are they connected?
candidates.Remove(P)
- else if(!mode.check_age(P.client, minimum_required_age))
+ else if (P.client.get_remaining_days(minimum_required_age) > 0)
candidates.Remove(P)
else if(P.mind.assigned_role in restricted_roles) // Does their job allow for it?
candidates.Remove(P)
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
index 7df15e6d52d..049751a6f40 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
@@ -36,7 +36,7 @@
if (!M.client) // Are they connected?
trimmed_list.Remove(M)
continue
- if(!mode.check_age(M.client, minimum_required_age))
+ if(M.client.get_remaining_days(minimum_required_age) > 0)
trimmed_list.Remove(M)
continue
if(antag_flag_override)
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
index c535625d6fa..4528c7b34b5 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
@@ -87,7 +87,6 @@
M.add_antag_datum(/datum/antagonist/brother, team)
GLOB.pre_setup_antags -= M
team.update_name()
- mode.brother_teams += pre_brother_teams
return TRUE
//////////////////////////////////////////////
@@ -574,7 +573,7 @@
/datum/dynamic_ruleset/roundstart/monkey/execute()
for(var/datum/mind/carrier in assigned)
- var/datum/antagonist/monkey/M = add_monkey_leader(carrier)
+ var/datum/antagonist/monkey/M = carrier.add_antag_datum(/datum/antagonist/monkey/leader)
if(M)
monkey_team = M.monkey_team
return TRUE
diff --git a/code/game/gamemodes/extended/extended.dm b/code/game/gamemodes/extended/extended.dm
deleted file mode 100644
index 4d342dbf2dd..00000000000
--- a/code/game/gamemodes/extended/extended.dm
+++ /dev/null
@@ -1,35 +0,0 @@
-/datum/game_mode/extended
- name = "secret extended"
- config_tag = "secret_extended"
- report_type = "extended"
- false_report_weight = 5
- required_players = 0
-
- announce_span = "notice"
- announce_text = "Just have fun and enjoy the game!"
-
-/datum/game_mode/extended/pre_setup()
- return 1
-
-/datum/game_mode/extended/generate_report()
- return "The transmission mostly failed to mention your sector. It is possible that there is nothing in the Syndicate that could threaten your station during this shift."
-
-/datum/game_mode/extended/announced
- name = "extended"
- config_tag = "extended"
- false_report_weight = 0
-
-/datum/game_mode/extended/announced/generate_station_goals()
- for(var/T in subtypesof(/datum/station_goal))
- var/datum/station_goal/G = new T
- station_goals += G
- G.on_report()
-
-/datum/game_mode/extended/announced/send_intercept()
- var/greenshift_message = "Thanks to the tireless efforts of our security and intelligence divisions, there are currently no credible threats to [station_name()]. All station construction projects have been authorized. Have a secure shift!"
- . += "Central Command Status Summary
"
- . += greenshift_message
- . += generate_station_trait_report()
-
- print_command_report(., "Central Command Status Summary", announce = FALSE)
- priority_announce(greenshift_message, "Security Report", SSstation.announcer.get_rand_report_sound())
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 26d82896c7e..0e69c7b7240 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -99,7 +99,6 @@
if(!GLOB.Debug2)
if(playerC < required_players || (maximum_players >= 0 && playerC > maximum_players))
return FALSE
- antag_candidates = get_players_for_role(antag_flag)
if(!GLOB.Debug2)
if(antag_candidates.len < required_enemies)
return FALSE
@@ -414,66 +413,6 @@
WARNING("Something has gone terribly wrong. /datum/game_mode/proc/antag_pick failed to select a candidate. Falling back to pick()")
return pick(candidates)
-/datum/game_mode/proc/get_players_for_role(role)
- var/list/players = list()
- var/list/candidates = list()
- var/list/drafted = list()
- var/datum/mind/applicant = null
-
- // Ultimate randomizing code right here
- for(var/i in GLOB.new_player_list)
- var/mob/dead/new_player/player = i
- if(player.ready == PLAYER_READY_TO_PLAY && player.check_preferences())
- players += player
-
- // Shuffling, the players list is now ping-independent!!!
- // Goodbye antag dante
- players = shuffle(players)
-
- for(var/mob/dead/new_player/player in players)
- if(player.client && player.ready == PLAYER_READY_TO_PLAY && player.client.prefs.be_antag) //SKYRAT EDIT CHANGE
- if(role in player.client.prefs.be_special)
- if(!is_banned_from(player.ckey, list(role, ROLE_SYNDICATE)) && !QDELETED(player))
- if(age_check(player.client)) //Must be older than the minimum age
- candidates += player.mind // Get a list of all the people who want to be the antagonist for this round
-
- if(restricted_jobs)
- for(var/datum/mind/player in candidates)
- for(var/job in restricted_jobs) // Remove people who want to be antagonist but have a job already that precludes it
- if(player.assigned_role == job)
- candidates -= player
-
- if(candidates.len < recommended_enemies)
- for(var/mob/dead/new_player/player in players)
- if(player.client && player.ready == PLAYER_READY_TO_PLAY && player.client.prefs.be_antag) //SKYRAT EDIT CHANGE
- if(!(role in player.client.prefs.be_special)) // We don't have enough people who want to be antagonist, make a separate list of people who don't want to be one
- if(!is_banned_from(player.ckey, list(role, ROLE_SYNDICATE)) && !QDELETED(player))
- drafted += player.mind
-
- if(restricted_jobs)
- for(var/datum/mind/player in drafted) // Remove people who can't be an antagonist
- for(var/job in restricted_jobs)
- if(player.assigned_role == job)
- drafted -= player
-
- drafted = shuffle(drafted) // Will hopefully increase randomness, Donkie
-
- while(candidates.len < recommended_enemies) // Pick randomlly just the number of people we need and add them to our list of candidates
- if(drafted.len > 0)
- applicant = pick(drafted)
- if(applicant)
- candidates += applicant
- drafted.Remove(applicant)
-
- else // Not enough scrubs, ABORT ABORT ABORT
- break
-
- return candidates // Returns: The number of people who had the antagonist role set to yes, regardless of recomended_enemies, if that number is greater than recommended_enemies
- // recommended_enemies if the number of people with that role set to yes is less than recomended_enemies,
- // Less if there are not enough valid players in the game entirely to make recommended_enemies.
-
-
-
/datum/game_mode/proc/num_players()
. = 0
for(var/i in GLOB.new_player_list)
@@ -589,27 +528,8 @@
for (var/C in GLOB.admins)
to_chat(C, msg.Join())
-//If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1
-/datum/game_mode/proc/age_check(client/C)
- if(get_remaining_days(C) == 0)
- return 1 //Available in 0 days = available right now = player is old enough to play.
- return 0
-
-
-/datum/game_mode/proc/get_remaining_days(client/C)
- if(!C)
- return 0
- if(!CONFIG_GET(flag/use_age_restriction_for_jobs))
- return 0
- if(!isnum(C.player_age))
- return 0 //This is only a number if the db connection is established, otherwise it is text: "Requires database", meaning these restrictions cannot be enforced
- if(!isnum(enemy_minimum_age))
- return 0
-
- return max(0, enemy_minimum_age - C.player_age)
-
/datum/game_mode/proc/remove_antag_for_borging(datum/mind/newborgie)
- SSticker.mode.remove_cultist(newborgie, 0, 0)
+ newborgie.remove_antag_datum(/datum/antagonist/cult)
var/datum/antagonist/rev/rev = newborgie.has_antag_datum(/datum/antagonist/rev)
if(rev)
rev.remove_revolutionary(TRUE)
diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm
deleted file mode 100644
index eac455425ad..00000000000
--- a/code/game/gamemodes/meteor/meteor.dm
+++ /dev/null
@@ -1,60 +0,0 @@
-/datum/game_mode/meteor
- name = "meteor"
- config_tag = "meteor"
- report_type = "meteor"
- false_report_weight = 1
- var/meteordelay = 2000
- var/nometeors = 0
- var/rampupdelta = 5
- required_players = 0
-
- announce_span = "danger"
- announce_text = "A major meteor shower is bombarding the station! The crew needs to evacuate or survive the onslaught."
-
-
-/datum/game_mode/meteor/process()
- if(nometeors || meteordelay > world.time - SSticker.round_start_time)
- return
-
- var/list/wavetype = GLOB.meteors_normal
- var/meteorminutes = (world.time - SSticker.round_start_time - meteordelay) / 10 / 60
-
-
- if (prob(meteorminutes))
- wavetype = GLOB.meteors_threatening
-
- if (prob(meteorminutes/2))
- wavetype = GLOB.meteors_catastrophic
-
- var/ramp_up_final = clamp(round(meteorminutes/rampupdelta), 1, 10)
-
- spawn_meteors(ramp_up_final, wavetype)
-
-
-/datum/game_mode/meteor/special_report()
- var/survivors = 0
- var/list/survivor_list = list()
-
- for(var/mob/living/player in GLOB.player_list)
- if(player.stat != DEAD)
- ++survivors
-
- if(player.onCentCom())
- survivor_list += "[player.real_name] escaped to the safety of CentCom."
- else if(player.onSyndieBase())
- survivor_list += "[player.real_name] escaped to the (relative) safety of Syndicate Space."
- else
- survivor_list += "[player.real_name] survived but is stranded without any hope of rescue."
-
- if(survivors)
- return "
The following survived the meteor storm: [survivor_list.Join(" ")]
"
- else
- return "
Nobody survived the meteor storm!
"
-
-/datum/game_mode/meteor/set_round_result()
- ..()
- SSticker.mode_result = "end - evacuation"
-
-/datum/game_mode/meteor/generate_report()
- return "[pick("Asteroids have", "Meteors have", "Large rocks have", "Stellar minerals have", "Space hail has", "Debris has")] been detected near your station, and a collision is possible, \
- though unlikely. Be prepared for largescale impacts and destruction. Please note that the debris will prevent the escape shuttle from arriving quickly."
diff --git a/code/game/gamemodes/monkey/monkey.dm b/code/game/gamemodes/monkey/monkey.dm
deleted file mode 100644
index 64fe5e325e3..00000000000
--- a/code/game/gamemodes/monkey/monkey.dm
+++ /dev/null
@@ -1,134 +0,0 @@
-/datum/game_mode
- var/list/ape_infectees = list()
- var/list/ape_leaders = list()
-
-/datum/game_mode/monkey
- name = "monkey"
- config_tag = "monkey"
- report_type = "monkey"
- antag_flag = ROLE_MONKEY
- false_report_weight = 1
-
- required_players = 20
- required_enemies = 1
- recommended_enemies = 1
-
- restricted_jobs = list("Prisoner", "Cyborg", "AI")
-
- announce_span = "Monkey"
- announce_text = "One or more crewmembers have been infected with Jungle Fever! Crew: Contain the outbreak. None of the infected monkeys may escape alive to CentCom. Monkeys: Ensure that your kind lives on! Rise up against your captors!"
-
- var/carriers_to_make = 1
- var/list/carriers = list()
-
- var/monkeys_to_win = 1
- var/escaped_monkeys = 0
-
- var/players_per_carrier = 30
-
- var/datum/team/monkey/monkey_team
-
-
-
-/datum/game_mode/monkey/pre_setup()
- carriers_to_make = max(round(num_players()/players_per_carrier, 1), 1)
-
- for(var/j = 0, j < carriers_to_make, j++)
- if (!antag_candidates.len)
- break
- var/datum/mind/carrier = pick(antag_candidates)
- carriers += carrier
- carrier.special_role = "Monkey Leader"
- carrier.restricted_roles = restricted_jobs
- log_game("[key_name(carrier)] has been selected as a Jungle Fever carrier")
- antag_candidates -= carrier
-
- if(!carriers.len)
- setup_error = "No monkey candidates"
- return FALSE
- return TRUE
-
-/datum/game_mode/monkey/post_setup()
- for(var/datum/mind/carriermind in carriers)
- var/datum/antagonist/monkey/M = add_monkey_leader(carriermind, monkey_team)
- if(M)
- monkey_team = M.monkey_team
- return ..()
-
-/datum/game_mode/monkey/check_finished()
- if((SSshuttle.emergency.mode == SHUTTLE_ENDGAME) || station_was_nuked)
- return TRUE
-
- if(!round_converted)
- for(var/datum/mind/monkey_mind in ape_infectees)
- continuous_sanity_checked = TRUE
- if(monkey_mind.current && monkey_mind.current.stat != DEAD)
- return FALSE
-
- var/datum/disease/D = new /datum/disease/transformation/jungle_fever() //ugly but unfortunately needed
- for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
- if(!is_station_level(H.z))
- continue
- if(H.mind && H.client && H.stat != DEAD)
- if(H.HasDisease(D))
- return FALSE
-
- return ..()
-
-/datum/game_mode/monkey/proc/check_monkey_victory()
- if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME)
- return FALSE
- var/datum/disease/D = new /datum/disease/transformation/jungle_fever()
- for(var/mob/living/carbon/human/M in GLOB.alive_mob_list)
- if(!ismonkey(M))
- return
- if (M.HasDisease(D))
- if(M.onCentCom() || M.onSyndieBase())
- escaped_monkeys++
- if(escaped_monkeys >= monkeys_to_win)
- return TRUE
- else
- return FALSE
-
-
-/datum/game_mode/monkey/set_round_result()
- ..()
- if(check_monkey_victory())
- SSticker.mode_result = "win - monkey win"
- else
- SSticker.mode_result = "loss - staff stopped the monkeys"
-
-/datum/game_mode/monkey/special_report()
- if(check_monkey_victory())
- return "
The monkeys have overthrown their captors! Eeek eeeek!!
"
- else
- return "
The staff managed to contain the monkey infestation!
"
-
-/datum/game_mode/monkey/generate_report()
- return "Reports of an ancient [pick("retrovirus", "flesh eating bacteria", "disease", "magical curse blamed on viruses", "banana blight")] outbreak that turn humans into monkeys has been reported in your quadrant. Due to strain mutation, such infections are no longer curable by any known means. If an outbreak occurs, ensure the station is quarantined to prevent a largescale outbreak at CentCom."
-
-/proc/add_monkey_leader(datum/mind/monkey_mind)
- if(is_monkey_leader(monkey_mind))
- return FALSE
- var/datum/antagonist/monkey/leader/M = monkey_mind.add_antag_datum(/datum/antagonist/monkey/leader)
- return M
-
-/proc/add_monkey(datum/mind/monkey_mind)
- if(is_monkey(monkey_mind))
- return FALSE
- var/datum/antagonist/monkey/M = monkey_mind.add_antag_datum(/datum/antagonist/monkey)
- return M
-
-/proc/remove_monkey(datum/mind/monkey_mind)
- if(!is_monkey(monkey_mind))
- return FALSE
- var/datum/antagonist/monkey/M = monkey_mind.has_antag_datum(/datum/antagonist/monkey)
- M.on_removal()
- return TRUE
-
-/proc/is_monkey_leader(datum/mind/monkey_mind)
- return monkey_mind?.has_antag_datum(/datum/antagonist/monkey/leader)
-
-/proc/is_monkey(datum/mind/monkey_mind)
- return monkey_mind && (monkey_mind.has_antag_datum(/datum/antagonist/monkey) || is_monkey_leader(monkey_mind))
-
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
deleted file mode 100644
index 0adb40be6ba..00000000000
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ /dev/null
@@ -1,172 +0,0 @@
-/datum/game_mode/nuclear
- name = "nuclear emergency"
- config_tag = "nuclear"
- report_type = "nuclear"
- false_report_weight = 10
- required_players = 30 // 30 players - 3 players to be the nuke ops = 27 players remaining
- required_enemies = 2
- recommended_enemies = 5
- antag_flag = ROLE_OPERATIVE
- enemy_minimum_age = 14
-
- announce_span = "danger"
- announce_text = "Syndicate forces are approaching the station in an attempt to destroy it!\n\
- Operatives: Secure the nuclear authentication disk and use your nuke to destroy the station.\n\
- Crew: Defend the nuclear authentication disk and ensure that it leaves with you on the emergency shuttle."
-
- var/const/agents_possible = 5 //If we ever need more syndicate agents.
- var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer!
- var/list/pre_nukeops = list()
-
- var/datum/team/nuclear/nuke_team
-
- var/operative_antag_datum_type = /datum/antagonist/nukeop
- var/leader_antag_datum_type = /datum/antagonist/nukeop/leader
-
-/datum/game_mode/nuclear/pre_setup()
- var/n_agents = min(round(num_players() / 10), antag_candidates.len, agents_possible)
- if(n_agents >= required_enemies)
- for(var/i = 0, i < n_agents, ++i)
- var/datum/mind/new_op = pick_n_take(antag_candidates)
- pre_nukeops += new_op
- new_op.assigned_role = "Nuclear Operative"
- new_op.special_role = "Nuclear Operative"
- log_game("[key_name(new_op)] has been selected as a nuclear operative")
- return TRUE
- else
- setup_error = "Not enough nuke op candidates"
- return FALSE
-////////////////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////////////
-
-/datum/game_mode/nuclear/post_setup()
- //Assign leader
- var/datum/mind/leader_mind = pre_nukeops[1]
- var/datum/antagonist/nukeop/L = leader_mind.add_antag_datum(leader_antag_datum_type)
- nuke_team = L.nuke_team
- //Assign the remaining operatives
- for(var/i = 2 to pre_nukeops.len)
- var/datum/mind/nuke_mind = pre_nukeops[i]
- nuke_mind.add_antag_datum(operative_antag_datum_type)
- return ..()
-
-/datum/game_mode/nuclear/OnNukeExplosion(off_station)
- ..()
- nukes_left--
-
-/datum/game_mode/nuclear/check_finished()
- //Keep the round going if ops are dead but bomb is ticking.
- if(nuke_team.operatives_dead())
- for(var/obj/machinery/nuclearbomb/N in GLOB.nuke_list)
- if(N.proper_bomb && (N.timing || N.exploding))
- return FALSE
- return ..()
-
-/datum/game_mode/nuclear/set_round_result()
- ..()
- var/result = nuke_team.get_result()
- switch(result)
- if(NUKE_RESULT_FLUKE)
- SSticker.mode_result = "loss - syndicate nuked - disk secured"
- SSticker.news_report = NUKE_SYNDICATE_BASE
- if(NUKE_RESULT_NUKE_WIN)
- SSticker.mode_result = "win - syndicate nuke"
- SSticker.news_report = STATION_NUKED
- if(NUKE_RESULT_NOSURVIVORS)
- SSticker.mode_result = "halfwin - syndicate nuke - did not evacuate in time"
- SSticker.news_report = STATION_NUKED
- if(NUKE_RESULT_WRONG_STATION)
- SSticker.mode_result = "halfwin - blew wrong station"
- SSticker.news_report = NUKE_MISS
- if(NUKE_RESULT_WRONG_STATION_DEAD)
- SSticker.mode_result = "halfwin - blew wrong station - did not evacuate in time"
- SSticker.news_report = NUKE_MISS
- if(NUKE_RESULT_CREW_WIN_SYNDIES_DEAD)
- SSticker.mode_result = "loss - evacuation - disk secured - syndi team dead"
- SSticker.news_report = OPERATIVES_KILLED
- if(NUKE_RESULT_CREW_WIN)
- SSticker.mode_result = "loss - evacuation - disk secured"
- SSticker.news_report = OPERATIVES_KILLED
- if(NUKE_RESULT_DISK_LOST)
- SSticker.mode_result = "halfwin - evacuation - disk not secured"
- SSticker.news_report = OPERATIVE_SKIRMISH
- if(NUKE_RESULT_DISK_STOLEN)
- SSticker.mode_result = "halfwin - detonation averted"
- SSticker.news_report = OPERATIVE_SKIRMISH
- else
- SSticker.mode_result = "halfwin - interrupted"
- SSticker.news_report = OPERATIVE_SKIRMISH
-
-/datum/game_mode/nuclear/generate_report()
- return "One of Central Command's trading routes was recently disrupted by a raid carried out by the Gorlex Marauders. They seemed to only be after one ship - a highly-sensitive \
- transport containing a nuclear fission explosive, although it is useless without the proper code and authorization disk. While the code was likely found in minutes, the only disk that \
- can activate this explosive is on your station. Ensure that it is protected at all times, and remain alert for possible intruders."
-
-/proc/is_nuclear_operative(mob/M)
- return M && istype(M) && M.mind && M.mind.has_antag_datum(/datum/antagonist/nukeop)
-
-/datum/outfit/syndicate
- name = "Syndicate Operative - Basic"
-
- uniform = /obj/item/clothing/under/syndicate
- shoes = /obj/item/clothing/shoes/combat
- gloves = /obj/item/clothing/gloves/combat
- back = /obj/item/storage/backpack/fireproof
- ears = /obj/item/radio/headset/syndicate/alt
- l_pocket = /obj/item/modular_computer/tablet/nukeops
- id = /obj/item/card/id/advanced/chameleon
- belt = /obj/item/gun/ballistic/automatic/pistol
- backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\
- /obj/item/kitchen/knife/combat/survival)
-
- skillchips = list(/obj/item/skillchip/disk_verifier)
-
- var/tc = 25
- var/command_radio = FALSE
- var/uplink_type = /obj/item/uplink/nuclear
-
- id_trim = /datum/id_trim/chameleon/operative
-
-/datum/outfit/syndicate/leader
- name = "Syndicate Leader - Basic"
- gloves = /obj/item/clothing/gloves/krav_maga/combatglovesplus
- command_radio = TRUE
-
- id_trim = /datum/id_trim/chameleon/operative/nuke_leader
-
-/datum/outfit/syndicate/no_crystals
- name = "Syndicate Operative - Reinforcement"
- tc = 0
-
-/datum/outfit/syndicate/post_equip(mob/living/carbon/human/H)
- var/obj/item/radio/R = H.ears
- R.set_frequency(FREQ_SYNDICATE)
- R.freqlock = TRUE
- if(command_radio)
- R.command = TRUE
-
- if(ispath(uplink_type, /obj/item/uplink/nuclear) || tc) // /obj/item/uplink/nuclear understands 0 tc
- var/obj/item/U = new uplink_type(H, H.key, tc)
- H.equip_to_slot_or_del(U, ITEM_SLOT_BACKPACK)
-
- var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(H)
- W.implant(H)
- var/obj/item/implant/explosive/E = new/obj/item/implant/explosive(H)
- E.implant(H)
- H.faction |= ROLE_SYNDICATE
- H.update_icons()
-
-/datum/outfit/syndicate/full
- name = "Syndicate Operative - Full Kit"
-
- glasses = /obj/item/clothing/glasses/night
- mask = /obj/item/clothing/mask/gas/syndicate
- suit = /obj/item/clothing/suit/space/hardsuit/syndi
- r_pocket = /obj/item/tank/internals/emergency_oxygen/engi
- internals_slot = ITEM_SLOT_RPOCKET
- belt = /obj/item/storage/belt/military
- r_hand = /obj/item/gun/ballistic/shotgun/bulldog
- backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\
- /obj/item/tank/jetpack/oxygen/harness=1,\
- /obj/item/gun/ballistic/automatic/pistol=1,\
- /obj/item/kitchen/knife/combat/survival)
diff --git a/code/game/gamemodes/sandbox/airlock_maker.dm b/code/game/gamemodes/sandbox/airlock_maker.dm
deleted file mode 100644
index 92eafdf665a..00000000000
--- a/code/game/gamemodes/sandbox/airlock_maker.dm
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- This is for the sandbox for now,
- maybe useful later for an actual thing?
- -Sayu
-*/
-
-/obj/structure/door_assembly
- var/datum/airlock_maker/maker = null
-
-/obj/structure/door_assembly/attack_hand(mob/user, list/modifiers)
- . = ..()
- if(.)
- return
- if(maker)
- maker.interact()
-
-/datum/airlock_maker
- var/obj/structure/door_assembly/linked = null
-
- var/list/access_used = null
- var/require_all = 1
-
- var/paintjob = "none"
- var/glassdoor = FALSE
-
- var/doorname = "airlock"
-
-/datum/airlock_maker/New(atom/target_loc)
- linked = new(target_loc)
- linked.maker = src
- linked.set_anchored(FALSE)
- access_used = list()
-
- interact()
-
-/datum/airlock_maker/proc/linkpretty(href,desc,active)
- if(!desc)
- var/static/list/defaults = list("No","Yes")
- desc = defaults[active+1]
- if(active)
- return "[desc]"
- return "[desc]"
-
-/datum/airlock_maker/proc/interact()
- var/list/leftcolumn = list()
- var/list/rightcolumn = list()
- leftcolumn += "Required Access"
- var/list/all_station_access = SSid_access.get_region_access_list(list(REGION_ALL_STATION))
- for(var/access in all_station_access)
- leftcolumn += linkpretty("access=[access]",SSid_access.get_access_desc(access),access in access_used)
- leftcolumn += "Require all listed accesses: [linkpretty("reqall",null,require_all)]"
-
- rightcolumn += "Paintjob"
- for(var/option in list("none","engineering","atmos","security","command","medical","research","mining","maintenance","external","highsecurity"))
- rightcolumn += linkpretty("paint=[option]",option,option == paintjob)
- rightcolumn += "Glass door: " + linkpretty("glass",null,glassdoor) + "
"
- var/length = max(leftcolumn.len,rightcolumn.len)
-
- var/dat = "You may move the model airlock around. A new airlock will be built in its space when you click done, below. "
- dat += "Door name: \"[doorname]\""
- dat += "
"
- for(var/i=1; i<=length; i++)
- dat += "
"
- if(i<=leftcolumn.len)
- dat += leftcolumn[i]
- dat += "
"
- if(i<=rightcolumn.len)
- dat += rightcolumn[i]
- dat += "
"
-
- usr << browse(hsbinfo, "window=hsbpanel")
-
-/datum/h_sandbox/Topic(href, href_list)
- if(!usr || !src || !(src.owner == usr.ckey))
- if(usr)
- usr << browse(null,"window=sandbox")
- return
-
- if(href_list["hsb"])
- switch(href_list["hsb"])
- //
- // Admin: toggle spawning
- //
- if("hsbtobj")
- if(!admin) return
- if(GLOB.hsboxspawn)
- to_chat(world, "Sandbox:\black[usr.key] has disabled object spawning!")
- GLOB.hsboxspawn = FALSE
- return
- else
- to_chat(world, "Sandbox:\black[usr.key] has enabled object spawning!")
- GLOB.hsboxspawn = TRUE
- return
- //
- // Admin: Toggle auto-close
- //
- if("hsbtac")
- if(!admin) return
- var/sbac = CONFIG_GET(flag/sandbox_autoclose)
- if(sbac)
- to_chat(world, "Sandbox:\black [usr.key] has removed the object spawn limiter.")
- else
- to_chat(world, "Sandbox:\black [usr.key] has added a limiter to object spawning. The window will now auto-close after use.")
- CONFIG_SET(flag/sandbox_autoclose, !sbac)
- return
- //
- // Spacesuit with full air jetpack set as internals
- //
- if("hsbsuit")
- var/mob/living/carbon/human/P = usr
- if(!istype(P)) return
- if(P.wear_suit)
- P.wear_suit.forceMove(P.drop_location())
- P.wear_suit.layer = initial(P.wear_suit.layer)
- P.wear_suit.plane = initial(P.wear_suit.plane)
- P.wear_suit = null
- P.wear_suit = new/obj/item/clothing/suit/space(P)
- P.wear_suit.plane = ABOVE_HUD_PLANE
- P.update_inv_wear_suit()
- if(P.head)
- P.head.forceMove(P.drop_location())
- P.head.layer = initial(P.head.layer)
- P.head.plane = initial(P.head.plane)
- P.head = null
- P.head = new/obj/item/clothing/head/helmet/space(P)
- P.head.plane = ABOVE_HUD_PLANE
- P.update_inv_head()
- if(P.wear_mask)
- P.wear_mask.forceMove(P.drop_location())
- P.wear_mask.layer = initial(P.wear_mask.layer)
- P.wear_mask.plane = initial(P.wear_mask.plane)
- P.wear_mask = null
- P.wear_mask = new/obj/item/clothing/mask/gas(P)
- P.wear_mask.plane = ABOVE_HUD_PLANE
- P.update_inv_wear_mask()
- if(P.back)
- P.back.forceMove(P.drop_location())
- P.back.layer = initial(P.back.layer)
- P.back.plane = initial(P.back.plane)
- P.back = null
- P.back = new/obj/item/tank/jetpack/oxygen(P)
- P.back.plane = ABOVE_HUD_PLANE
- P.update_inv_back()
- P.internal = P.back
- P.update_internals_hud_icon(1)
-
- if("hsbscrubber") // This is beyond its normal capability but this is sandbox and you spawned one, I assume you need it
- var/obj/hsb = new/obj/machinery/portable_atmospherics/scrubber{volume_rate=50*ONE_ATMOSPHERE;on=1}(usr.loc)
- hsb.update_appearance() // hackish but it wasn't meant to be spawned I guess?
-
- //
- // Stacked Materials
- //
-
- if("hsbrglass")
- new/obj/item/stack/sheet/rglass{amount=50}(usr.loc)
-
- if("hsbmetal")
- new/obj/item/stack/sheet/iron/fifty(usr.loc)
-
- if("hsbplasteel")
- new/obj/item/stack/sheet/plasteel{amount=50}(usr.loc)
-
- if("hsbglass")
- new/obj/item/stack/sheet/glass{amount=50}(usr.loc)
-
- if("hsbwood")
- new/obj/item/stack/sheet/mineral/wood{amount=50}(usr.loc)
-
- //
- // All access ID
- //
- if("hsbaaid")
- var/obj/item/card/id/advanced/debug/ID = new(usr.loc)
- ID.registered_name = usr.real_name
- ID.update_label()
- ID.update_icon()
-
- //
- // RCD - starts with full clip
- // Spawn check due to grief potential (destroying floors, walls, etc)
- //
- if("hsbrcd")
- if(!GLOB.hsboxspawn) return
-
- new/obj/item/construction/rcd/combat(usr.loc)
-
- //
- // New sandbox airlock maker
- //
- if("hsbairlock")
- new /datum/airlock_maker(usr.loc)
-
- //
- // Object spawn window
- //
-
- // Clothing
- if("hsbcloth")
- if(!GLOB.hsboxspawn) return
-
- if(!clothinfo)
- clothinfo = "Clothing(Reagent Containers)(Other Items) "
- var/list/all_items = subtypesof(/obj/item/clothing)
- for(var/typekey in spawn_forbidden)
- all_items -= typesof(typekey)
- for(var/O in reverseRange(all_items))
- clothinfo += "[O] "
-
- usr << browse(clothinfo,"window=sandbox")
-
- // Reagent containers
- if("hsbreag")
- if(!GLOB.hsboxspawn) return
-
- if(!reaginfo)
- reaginfo = "Reagent Containers(Clothing)(Other Items) "
- var/list/all_items = subtypesof(/obj/item/reagent_containers)
- for(var/typekey in spawn_forbidden)
- all_items -= typesof(typekey)
- for(var/O in reverseRange(all_items))
- reaginfo += "[O] "
-
- usr << browse(reaginfo,"window=sandbox")
-
- // Other items
- if("hsbobj")
- if(!GLOB.hsboxspawn) return
-
- if(!objinfo)
- objinfo = "Other Items(Clothing)(Reagent Containers) "
- var/list/all_items = subtypesof(/obj/item/) - typesof(/obj/item/clothing) - typesof(/obj/item/reagent_containers)
- for(var/typekey in spawn_forbidden)
- all_items -= typesof(typekey)
-
- for(var/O in reverseRange(all_items))
- objinfo += "[O] "
-
- usr << browse(objinfo,"window=sandbox")
-
- //
- // Safespawn checks to see if spawning is disabled.
- //
- if("hsb_safespawn")
- if(!GLOB.hsboxspawn)
- usr << browse(null,"window=sandbox")
- return
-
- var/typepath = text2path(href_list["path"])
- if(!typepath)
- to_chat(usr, "Bad path: \"[href_list["path"]]\"")
- return
- new typepath(usr.loc)
-
- if(CONFIG_GET(flag/sandbox_autoclose))
- usr << browse(null,"window=sandbox")
- //
- // For everything else in the href list
- //
- if("hsbspawn")
- var/typepath = text2path(href_list["path"])
- if(!typepath)
- to_chat(usr, "Bad path: \"[href_list["path"]]\"")
- return
- new typepath(usr.loc)
-
- if(CONFIG_GET(flag/sandbox_autoclose))
- usr << browse(null,"window=sandbox")
-
-/// Simple helper trim for sandbox mode's ID cards. Comes with station AA.
-/datum/id_trim/sandbox
- assignment = "Sandbox"
- trim_state = "trim_captain"
-
-/datum/id_trim/sandbox/New()
- . = ..()
- access = SSid_access.get_region_access_list(list(REGION_ALL_STATION))
diff --git a/code/game/gamemodes/sandbox/sandbox.dm b/code/game/gamemodes/sandbox/sandbox.dm
deleted file mode 100644
index 8d4846d579e..00000000000
--- a/code/game/gamemodes/sandbox/sandbox.dm
+++ /dev/null
@@ -1,22 +0,0 @@
-/datum/game_mode/sandbox
- name = "sandbox"
- config_tag = "sandbox"
- report_type = "sandbox"
- required_players = 0
-
- announce_span = "info"
- announce_text = "Build your own station... or just shoot each other!"
-
- allow_persistence_save = FALSE
-
-/datum/game_mode/sandbox/pre_setup()
- for(var/mob/M in GLOB.player_list)
- M.CanBuild()
- return 1
-
-/datum/game_mode/sandbox/post_setup()
- ..()
- SSshuttle.registerHostileEnvironment(src)
-
-/datum/game_mode/sandbox/generate_report()
- return "Sensors indicate that crewmembers have been all given psychic powers from which they can manifest various objects.
This can only end poorly."
diff --git a/code/game/gamemodes/traitor/double_agents.dm b/code/game/gamemodes/traitor/double_agents.dm
deleted file mode 100644
index 7e3db6e86c4..00000000000
--- a/code/game/gamemodes/traitor/double_agents.dm
+++ /dev/null
@@ -1,83 +0,0 @@
-/datum/game_mode
- var/list/target_list = list()
- var/list/late_joining_list = list()
-
-/datum/game_mode/traitor/internal_affairs
- name = "Internal Affairs"
- config_tag = "internal_affairs"
- report_type = "internal_affairs"
- false_report_weight = 10
- required_players = 25
- required_enemies = 5
- recommended_enemies = 8
- reroll_friendly = 0
- traitor_name = "Nanotrasen Internal Affairs Agent"
- antag_flag = ROLE_INTERNAL_AFFAIRS
-
- traitors_possible = 10 //hard limit on traitors if scaling is turned off
- num_modifier = 4 // Four additional traitors
- antag_datum = /datum/antagonist/traitor/internal_affairs
-
- announce_text = "There are Nanotrasen Internal Affairs Agents trying to kill each other!\n\
- IAA: Eliminate your targets and protect yourself!\n\
- Crew: Stop the IAA agents before they can cause too much mayhem."
-
-
-
-/datum/game_mode/traitor/internal_affairs/post_setup()
- var/i = 0
- for(var/datum/mind/traitor in pre_traitors)
- i++
- if(i + 1 > pre_traitors.len)
- i = 0
- target_list[traitor] = pre_traitors[i+1]
- ..()
-
-
-/datum/game_mode/traitor/internal_affairs/add_latejoin_traitor(datum/mind/character)
-
- check_potential_agents()
-
- // As soon as we get 3 or 4 extra latejoin traitors, make them traitors and kill each other.
- if(late_joining_list.len >= rand(3, 4))
- // True randomness
- shuffle_inplace(late_joining_list)
- // Reset the target_list, it'll be used again in force_traitor_objectives
- target_list = list()
-
- // Basically setting the target_list for who is killing who
- var/i = 0
- for(var/datum/mind/traitor in late_joining_list)
- i++
- if(i + 1 > late_joining_list.len)
- i = 0
- target_list[traitor] = late_joining_list[i + 1]
- traitor.special_role = traitor_name
-
- // Now, give them their targets
- for(var/datum/mind/traitor in target_list)
- ..(traitor)
-
- late_joining_list = list()
- else
- late_joining_list += character
- return
-
-/datum/game_mode/traitor/internal_affairs/proc/check_potential_agents()
-
- for(var/M in late_joining_list)
- if(istype(M, /datum/mind))
- var/datum/mind/agent_mind = M
- if(ishuman(agent_mind.current))
- var/mob/living/carbon/human/H = agent_mind.current
- if(H.stat != DEAD)
- if(H.client)
- continue // It all checks out.
-
- // If any check fails, remove them from our list
- late_joining_list -= M
-
-
-/datum/game_mode/traitor/internal_affairs/generate_report()
- return "Nanotrasen denies any accusations of placing internal affairs agents onboard your station to eliminate inconvenient employees. Any further accusations against CentCom for such \
- actions will be met with a conversation with an official internal affairs agent."
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
deleted file mode 100644
index 809d107e40d..00000000000
--- a/code/game/gamemodes/wizard/wizard.dm
+++ /dev/null
@@ -1,82 +0,0 @@
-/datum/game_mode
- var/list/datum/mind/wizards = list()
- var/list/datum/mind/apprentices = list()
-
-/datum/game_mode/wizard
- name = "wizard"
- config_tag = "wizard"
- report_type = "wizard"
- antag_flag = ROLE_WIZARD
- false_report_weight = 10
- required_players = 20
- required_enemies = 1
- recommended_enemies = 1
- enemy_minimum_age = 14
- round_ends_with_antag_death = 1
- announce_span = "danger"
- announce_text = "There is a space wizard attacking the station!\n\
- Wizard: Accomplish your objectives and cause mayhem on the station.\n\
- Crew: Eliminate the wizard before they can succeed!"
- var/finished = 0
-
-/datum/game_mode/wizard/pre_setup()
- var/datum/mind/wizard = antag_pick(antag_candidates)
- wizards += wizard
- wizard.assigned_role = ROLE_WIZARD
- wizard.special_role = ROLE_WIZARD
- log_game("[key_name(wizard)] has been selected as a Wizard") //TODO: Move these to base antag datum
- if(GLOB.wizardstart.len == 0)
- setup_error = "No wizard starting location found"
- return FALSE
- for(var/datum/mind/wiz in wizards)
- wiz.current.forceMove(pick(GLOB.wizardstart))
- return TRUE
-
-
-/datum/game_mode/wizard/post_setup()
- for(var/datum/mind/wizard in wizards)
- wizard.add_antag_datum(/datum/antagonist/wizard)
- return ..()
-
-/datum/game_mode/wizard/generate_report()
- return "A dangerous Wizards' Federation individual by the name of [pick(GLOB.wizard_first)] [pick(GLOB.wizard_second)] has recently escaped confinement from an unlisted prison facility. This \
- man is a dangerous mutant with the ability to alter himself and the world around him by what he and his leaders believe to be magic. If this man attempts an attack on your station, \
- his execution is highly encouraged, as is the preservation of his body for later study."
-
-
-/datum/game_mode/wizard/are_special_antags_dead()
- for(var/datum/mind/wizard in wizards | apprentices)
- if(isliving(wizard.current) && wizard.current.stat!=DEAD)
- return FALSE
-
- for(var/obj/item/phylactery/P in GLOB.poi_list) //TODO : IsProperlyDead()
- if(P.mind && P.mind.has_antag_datum(/datum/antagonist/wizard))
- return FALSE
-
- if(SSevents.wizardmode) //If summon events was active, turn it off
- SSevents.toggleWizardmode()
- SSevents.resetFrequency()
-
- return TRUE
-
-/datum/game_mode/wizard/check_finished()
- . = ..()
- if(.)
- finished = TRUE
- else if(gamemode_ready && are_special_antags_dead() && !CONFIG_GET(keyed_list/continuous)[config_tag])
- finished = TRUE
- . = TRUE
-
-/datum/game_mode/wizard/set_round_result()
- ..()
- if(finished)
- SSticker.mode_result = "loss - wizard killed"
- SSticker.news_report = WIZARD_KILLED
-
-/datum/game_mode/wizard/special_report()
- if(finished)
- return "
The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!
"
-
-//returns whether the mob is a wizard (or apprentice)
-/proc/iswizard(mob/living/M)
- return M.mind && M.mind.has_antag_datum(/datum/antagonist/wizard,TRUE)
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
index 6d3ed6c06b1..3de50aa6274 100644
--- a/code/game/machinery/doors/airlock_types.dm
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -465,7 +465,7 @@
new openingoverlaytype(loc)
/obj/machinery/door/airlock/cult/canAIControl(mob/user)
- return (iscultist(user) && !isAllPowerCut())
+ return (IS_CULTIST(user) && !isAllPowerCut())
/obj/machinery/door/airlock/cult/on_break()
if(!panel_open)
@@ -480,7 +480,7 @@
/obj/machinery/door/airlock/cult/allowed(mob/living/L)
if(!density)
return TRUE
- if(friendly || iscultist(L) || istype(L, /mob/living/simple_animal/shade) || isconstruct(L))
+ if(friendly || IS_CULTIST(L) || istype(L, /mob/living/simple_animal/shade) || isconstruct(L))
if(!stealthy)
new openingoverlaytype(loc)
return TRUE
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index 38be0b99232..7b38f83dc09 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -80,7 +80,7 @@
parent_rune.attack_hand(user, modifiers)
/obj/structure/emergency_shield/cult/barrier/attack_animal(mob/living/simple_animal/user, list/modifiers)
- if(iscultist(user))
+ if(IS_CULTIST(user))
parent_rune.attack_animal(user)
else
..()
diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm
index 32207447593..d651b767468 100644
--- a/code/game/objects/effects/anomalies.dm
+++ b/code/game/objects/effects/anomalies.dm
@@ -307,7 +307,7 @@
var/datum/action/innate/slime/reproduce/A = new
A.Grant(S)
- var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as a pyroclastic anomaly slime?", ROLE_SENTIENCE, null, null, 100, S, POLL_IGNORE_PYROSLIME)
+ var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as a pyroclastic anomaly slime?", ROLE_SENTIENCE, null, 100, S, POLL_IGNORE_PYROSLIME)
if(LAZYLEN(candidates))
var/mob/dead/observer/chosen = pick(candidates)
S.key = chosen.key
diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm
index 6021d21ed97..4b285e7344e 100644
--- a/code/game/objects/items/granters.dm
+++ b/code/game/objects/items/granters.dm
@@ -125,7 +125,7 @@
for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list)
if(knownspell.type == spell)
if(user.mind)
- if(iswizard(user))
+ if(IS_WIZARD(user))
to_chat(user,"You're already far more versed in this spell than this flimsy how-to book can provide!")
else
to_chat(user,"You've already read this one!")
diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm
index 63088d442cd..85a5d78ed92 100644
--- a/code/game/objects/items/holy_weapons.dm
+++ b/code/game/objects/items/holy_weapons.dm
@@ -520,7 +520,7 @@
possessed = TRUE
- var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the spirit of [user.real_name]'s blade?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_POSSESSED_BLADE)
+ var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the spirit of [user.real_name]'s blade?", ROLE_PAI, FALSE, 100, POLL_IGNORE_POSSESSED_BLADE)
if(LAZYLEN(candidates))
var/mob/dead/observer/C = pick(candidates)
diff --git a/code/game/objects/items/implants/implant_mindshield.dm b/code/game/objects/items/implants/implant_mindshield.dm
index c42a037686c..3f953d9166d 100644
--- a/code/game/objects/items/implants/implant_mindshield.dm
+++ b/code/game/objects/items/implants/implant_mindshield.dm
@@ -39,7 +39,7 @@
deconverted = TRUE
rev.remove_revolutionary(FALSE, user)
if(!silent)
- if(target.mind in SSticker.mode.cult)
+ if(target.mind.has_antag_datum(/datum/antagonist/cult))
to_chat(target, "You feel something interfering with your mental conditioning, but you resist it!")
else
to_chat(target, "You feel a sense of peace and security. You are now protected from brainwashing.")
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index fc8b175cbc9..e2334df3ec0 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -542,7 +542,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \
has_unique_girder = TRUE
/obj/item/stack/sheet/runed_metal/attack_self(mob/living/user)
- if(!iscultist(user))
+ if(!IS_CULTIST(user))
to_chat(user, "Only one with forbidden knowledge could hope to work this metal...")
return
var/turf/T = get_turf(user) //we may have moved. adjust as needed...
diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm
index 07a54715e45..38c5561e738 100644
--- a/code/game/objects/items/storage/book.dm
+++ b/code/game/objects/items/storage/book.dm
@@ -210,7 +210,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning",
B.name = name
B.icon_state = icon_state
B.inhand_icon_state = inhand_icon_state
- if(istype(A, /obj/item/cult_bastard) && !iscultist(user))
+ if(istype(A, /obj/item/cult_bastard) && !IS_CULTIST(user))
var/obj/item/cult_bastard/sword = A
to_chat(user, "You begin to exorcise [sword].")
playsound(src,'sound/hallucinations/veryfar_noise.ogg',40,TRUE)
@@ -219,7 +219,11 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning",
for(var/obj/item/soulstone/SS in sword.contents)
SS.required_role = null
for(var/mob/living/simple_animal/shade/EX in SS)
- SSticker.mode.remove_cultist(EX.mind, 1, 0)
+ var/datum/antagonist/cult/cultist = EX.mind.has_antag_datum(/datum/antagonist/cult)
+ if (cultist)
+ cultist.silent = TRUE
+ cultist.on_removal()
+
EX.icon_state = "shade_holy"
EX.name = "Purified [EX.name]"
SS.release_shades(user)
@@ -227,7 +231,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning",
new /obj/item/nullrod/claymore(get_turf(sword))
user.visible_message("[user] purifies [sword]!")
qdel(sword)
- else if(istype(A, /obj/item/soulstone) && !iscultist(user))
+ else if(istype(A, /obj/item/soulstone) && !IS_CULTIST(user))
var/obj/item/soulstone/SS = A
if(SS.theme == THEME_HOLY)
return
@@ -241,8 +245,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning",
for(var/mob/M in SS.contents)
if(M.mind)
SS.icon_state = "purified_soulstone2"
- if(iscultist(M))
- SSticker.mode.remove_cultist(M.mind, FALSE, FALSE)
+ M.mind?.remove_antag_datum(/datum/antagonist/cult)
for(var/mob/living/simple_animal/shade/EX in SS)
EX.icon_state = "ghost1"
EX.name = "Purified [initial(EX.name)]"
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 00890bdfc17..39c865800f4 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -340,7 +340,7 @@
/obj/structure/girder/cult/attackby(obj/item/W, mob/user, params)
add_fingerprint(user)
- if(istype(W, /obj/item/melee/cultblade/dagger) && iscultist(user)) //Cultists can demolish cult girders instantly with their tomes
+ if(istype(W, /obj/item/melee/cultblade/dagger) && IS_CULTIST(user)) //Cultists can demolish cult girders instantly with their tomes
user.visible_message("[user] strikes [src] with [W]!", "You demolish [src].")
new /obj/item/stack/sheet/runed_metal(drop_location(), 1)
qdel(src)
diff --git a/code/game/world.dm b/code/game/world.dm
index f719a78bd04..78c01ae4791 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -293,8 +293,6 @@ GLOBAL_VAR(restart_counter)
if (server_name)
s += "[server_name] — "
features += "[CONFIG_GET(flag/norespawn) ? "no " : ""]respawn"
- if(CONFIG_GET(flag/allow_vote_mode))
- features += "vote"
if(CONFIG_GET(flag/allow_ai))
features += "AI allowed"
hostedby = CONFIG_GET(string/hostedby)
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 2f2c9f458df..6e9bcf38b6d 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -416,10 +416,7 @@
if(!check_rights(0))
return
- var/dat = {"
-