subsystem antag (#19338)

* antag subsystem

* antag subsystem
This commit is contained in:
Kashargul
2026-03-27 02:06:54 +01:00
committed by GitHub
parent 6be4771fef
commit a64992c509
47 changed files with 233 additions and 241 deletions
+2 -2
View File
@@ -34,8 +34,8 @@
/datum/tgui_ban_panel/tgui_static_data(mob/user)
var/list/bantypes = list("traitor","changeling","operative","revolutionary","cultist","wizard") //For legacy bans.
for(var/antag_type in GLOB.all_antag_types) // Grab other bans.
var/datum/antagonist/antag = GLOB.all_antag_types[antag_type]
for(var/antag_type in SSantag_job.all_antag_types) // Grab other bans.
var/datum/antagonist/antag = SSantag_job.all_antag_types[antag_type]
bantypes |= antag.bantype
var/list/data = list(
+3 -3
View File
@@ -1262,12 +1262,12 @@ ADMIN_VERB(force_antag_latespawn, R_ADMIN|R_EVENT|R_FUN, "Force Template Spawn",
to_chat(user, span_warning("Mode has not started."))
return
var/antag_type = tgui_input_list(user, "Choose a template.","Force Latespawn", GLOB.all_antag_types)
if(!antag_type || !GLOB.all_antag_types[antag_type])
var/antag_type = tgui_input_list(user, "Choose a template.","Force Latespawn", SSantag_job.all_antag_types)
if(!antag_type || !SSantag_job.all_antag_types[antag_type])
to_chat(user, span_warning("Aborting."))
return
var/datum/antagonist/antag = GLOB.all_antag_types[antag_type]
var/datum/antagonist/antag = SSantag_job.all_antag_types[antag_type]
message_admins("[key_name(user)] attempting to force latespawn with template [antag.id].")
antag.attempt_late_spawn()
+2 -2
View File
@@ -412,8 +412,8 @@
dat += "<a href='byond://?src=\ref[src];[HrefToken()];delay_round_end=1'>[SSticker.delay_end ? "End Round Normally" : "Delay Round End"]</a><br>"
dat += "<hr>"
for(var/antag_type in GLOB.all_antag_types)
var/datum/antagonist/A = GLOB.all_antag_types[antag_type]
for(var/antag_type in SSantag_job.all_antag_types)
var/datum/antagonist/A = SSantag_job.all_antag_types[antag_type]
dat += A.get_check_antag_output(src)
dat += "</body></html>"
user << browse(dat, "window=roundstatus;size=400x500")
+3 -3
View File
@@ -485,11 +485,11 @@
counter = 0
var/isbanned_dept = jobban_isbanned(M, JOB_SYNDICATE)
jobs += "<table cellpadding='1' cellspacing='0' width='100%'>"
jobs += "<tr bgcolor='ffeeaa'><th colspan='[length(GLOB.all_antag_types)]'><a href='byond://?src=\ref[src];[HrefToken()];jobban3=Syndicate;jobban4=\ref[M]'>Antagonist Positions</a></th></tr><tr align='center'>"
jobs += "<tr bgcolor='ffeeaa'><th colspan='[length(SSantag_job.all_antag_types)]'><a href='byond://?src=\ref[src];[HrefToken()];jobban3=Syndicate;jobban4=\ref[M]'>Antagonist Positions</a></th></tr><tr align='center'>"
// Antagonists.
for(var/antag_type in GLOB.all_antag_types)
var/datum/antagonist/antag = GLOB.all_antag_types[antag_type]
for(var/antag_type in SSantag_job.all_antag_types)
var/datum/antagonist/antag = SSantag_job.all_antag_types[antag_type]
if(!antag || !antag.bantype)
continue
+2 -2
View File
@@ -11,7 +11,7 @@
return
else if(is_antag && !is_admin) // Is an antag, and not an admin, meaning we need to check if their antag type allows AOOC.
var/datum/antagonist/A = get_antag_data(src.mob.mind.special_role)
var/datum/antagonist/A = SSantag_job.get_antag_data(src.mob.mind.special_role)
if(!A || !A.can_speak_aooc || !A.can_hear_aooc)
to_chat(src, span_warning("Sorry, but your antagonist type is not allowed to speak in AOOC."))
return
@@ -35,7 +35,7 @@
else if(M.client) // Players can only see AOOC if observing, or if they are an antag type allowed to use AOOC.
var/datum/antagonist/A = null
if(M.mind) // Observers don't have minds, but they should still see AOOC.
A = get_antag_data(M.mind.special_role)
A = SSantag_job.get_antag_data(M.mind.special_role)
if((M.mind && M.mind.special_role && A && A.can_hear_aooc) || isobserver(M)) // Antags must have their type be allowed to AOOC to see AOOC. This prevents, say, ERT from seeing AOOC.
to_chat(M, span_ooc(span_aooc("[create_text_tag("aooc", "Antag-OOC:", M.client)] <EM>[player_display]:</EM> " + span_message("[msg]"))))
+1 -1
View File
@@ -499,7 +499,7 @@ ADMIN_VERB(respawn_character, (R_ADMIN|R_REJUVINATE), "Spawn Character", "(Re)Sp
new_character.key = player_key
//Were they any particular special role? If so, copy.
if(new_character.mind)
var/datum/antagonist/antag_data = get_antag_data(new_character.mind.special_role)
var/datum/antagonist/antag_data = SSantag_job.get_antag_data(new_character.mind.special_role)
if(antag_data)
antag_data.add_antagonist(new_character.mind)
antag_data.place_mob(new_character)
+1 -1
View File
@@ -34,7 +34,7 @@ GLOBAL_LIST_EMPTY(current_pending_diseases)
var/list/candidates = list()
for(var/mob/living/carbon/human/G in GLOB.human_mob_list)
if(G.mind && G.stat != DEAD && G.is_client_active(5) && !player_is_antag(G.mind))
if(G.mind && G.stat != DEAD && G.is_client_active(5) && !SSantag_job.player_is_antag(G.mind))
var/area/A = get_area(G)
if(!A)
continue
+1 -1
View File
@@ -26,7 +26,7 @@
/datum/event/ionstorm/start()
for (var/mob/living/carbon/human/player in GLOB.player_list)
if( !player.mind || player_is_antag(player.mind, only_offstation_roles = 1) || player.client.inactivity > 10 MINUTES)
if( !player.mind || SSantag_job.player_is_antag(player.mind, only_offstation_roles = 1) || player.client.inactivity > 10 MINUTES)
continue
players += player.real_name
+2 -2
View File
@@ -4,8 +4,8 @@
/datum/event/random_antag/start()
var/list/valid_types = list()
for(var/antag_type in GLOB.all_antag_types)
var/datum/antagonist/antag = GLOB.all_antag_types[antag_type]
for(var/antag_type in SSantag_job.all_antag_types)
var/datum/antagonist/antag = SSantag_job.all_antag_types[antag_type]
if(antag.flags & ANTAG_RANDSPAWN)
valid_types |= antag
if(valid_types.len)
@@ -22,8 +22,8 @@
// The random spawn proc on the antag datum will handle announcing the spawn and whatnot, in theory.
/datum/event2/event/random_antagonist/start()
var/list/valid_types = list()
for(var/antag_type in GLOB.all_antag_types)
var/datum/antagonist/antag = GLOB.all_antag_types[antag_type]
for(var/antag_type in SSantag_job.all_antag_types)
var/datum/antagonist/antag = SSantag_job.all_antag_types[antag_type]
if(antag.flags & ANTAG_RANDSPAWN)
valid_types |= antag
if(valid_types.len)
@@ -23,7 +23,7 @@
continue
// Or antags / bellied.
if(player_is_antag(H.mind) || isbelly(H.loc))
if(SSantag_job.player_is_antag(H.mind) || isbelly(H.loc))
continue
// Or doctors (otherwise it could be possible for the only surgeon to need surgery).
+1 -1
View File
@@ -59,7 +59,7 @@
/datum/metric/proc/get_all_antags(cutoff = 75)
. = list()
for(var/mob/living/L in GLOB.player_list)
if(L.mind && player_is_antag(L.mind) && assess_player_activity(L) >= cutoff)
if(L.mind && SSantag_job.player_is_antag(L.mind) && assess_player_activity(L) >= cutoff)
. += L
/datum/metric/proc/count_all_antags(cutoff = 75)
+1 -1
View File
@@ -4,7 +4,7 @@
mind_initialize() //updates the mind (or creates and initializes one if one doesn't exist)
mind.active = 1 //indicates that the mind is currently synced with a client
//If they're SSD, remove it so they can wake back up.
update_antag_icons(mind)
SSantag_job.update_antag_icons(mind)
client.screen |= GLOB.global_hud.darksight
client.images |= dsoverlay
+1 -1
View File
@@ -137,7 +137,7 @@
var/list/players = list()
for(var/mob/living/carbon/human/player in GLOB.player_list)
if(!player.mind || player_is_antag(player.mind, only_offstation_roles = 1) || player.client.inactivity > 10 MINUTES)
if(!player.mind || SSantag_job.player_is_antag(player.mind, only_offstation_roles = 1) || player.client.inactivity > 10 MINUTES)
continue
players += player.real_name
+1 -1
View File
@@ -415,7 +415,7 @@
qdel(mind.objectives)
mind.special_role = null
clear_antag_roles(mind)
SSantag_job.clear_antag_roles(mind)
ghostize(0)
qdel(src)
+2 -2
View File
@@ -189,9 +189,9 @@ ADMIN_VERB(call_drop_pod, R_FUN, "Call Drop Pod", "Call an immediate drop pod on
// Equip them, if they are human and it is desirable.
if(ishuman(spawned_mob))
var/antag_type = tgui_input_list(user, "Select an equipment template to use or cancel for nude.", GLOB.all_antag_types)
var/antag_type = tgui_input_list(user, "Select an equipment template to use or cancel for nude.", SSantag_job.all_antag_types)
if(antag_type)
var/datum/antagonist/A = GLOB.all_antag_types[antag_type]
var/datum/antagonist/A = SSantag_job.all_antag_types[antag_type]
A.equip(spawned_mob)
if(tgui_alert(user, "Are you SURE you wish to deploy this drop pod? It will cause a sizable explosion and gib anyone underneath it.","Danger!",list("No","Yes")) != "Yes")
+1 -1
View File
@@ -181,7 +181,7 @@ GLOBAL_LIST_EMPTY(active_autoresleevers)
if(new_character.mind)
new_character.mind.loaded_from_ckey = picked_ckey
new_character.mind.loaded_from_slot = picked_slot
var/datum/antagonist/antag_data = get_antag_data(new_character.mind.special_role)
var/datum/antagonist/antag_data = SSantag_job.get_antag_data(new_character.mind.special_role)
if(antag_data)
antag_data.add_antagonist(new_character.mind)
antag_data.place_mob(new_character)
+1 -1
View File
@@ -499,7 +499,7 @@
if(occupant.mind)
if(occupant.original_player && ckey(occupant.mind.key) != occupant.original_player)
log_and_message_admins("is now a cross-sleeved character. Body originally belonged to [occupant.real_name]. Mind is now [occupant.mind.name].",occupant)
var/datum/antagonist/antag_data = get_antag_data(occupant.mind.special_role)
var/datum/antagonist/antag_data = SSantag_job.get_antag_data(occupant.mind.special_role)
if(antag_data)
antag_data.add_antagonist(occupant.mind)
antag_data.place_mob(occupant)
+1 -1
View File
@@ -85,7 +85,7 @@
new_character.initialize_vessel()
new_character.key = player_key
if(new_character.mind)
var/datum/antagonist/antag_data = get_antag_data(new_character.mind.special_role)
var/datum/antagonist/antag_data = SSantag_job.get_antag_data(new_character.mind.special_role)
if(antag_data)
antag_data.add_antagonist(new_character.mind)
antag_data.place_mob(new_character)