Files
b92700172a File cleanup for autotraitor.dm (#25326)
* cleanup for autotraitor.dm

* Removed spawn for addtimer

* Indentation fix

* added timer to post round setup call for tot check

* Update code/game/gamemodes/autotraitor/autotraitor.dm

Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
Signed-off-by: Burzah <116982774+Burzah@users.noreply.github.com>

---------

Signed-off-by: Burzah <116982774+Burzah@users.noreply.github.com>
Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
2024-05-03 22:29:52 +00:00

140 lines
4.7 KiB
Plaintext

/datum/game_mode/traitor/autotraitor
name = "AutoTraitor"
config_tag = "extend-a-traitormongous"
var/list/possible_traitors
var/num_players = 0
/datum/game_mode/traitor/autotraitor/announce()
..()
to_chat(world, "<b>Game mode is AutoTraitor. Traitors will be added to the round automagically as needed.</b>")
/datum/game_mode/traitor/autotraitor/pre_setup()
if(GLOB.configuration.gamemode.prevent_mindshield_antags)
restricted_jobs += protected_jobs
possible_traitors = get_players_for_role(ROLE_TRAITOR)
for(var/mob/new_player/P in world)
if(P.client && P.ready)
num_players++
var/num_traitors = 1
var/max_traitors = 1
var/traitor_prob = 0
max_traitors = round(num_players / 10) + 1
traitor_prob = (num_players - (max_traitors - 1) * 10) * 10
// Stop setup if no possible traitors
if(!length(possible_traitors))
return FALSE
if(GLOB.configuration.gamemode.traitor_scaling)
num_traitors = max_traitors - 1 + prob(traitor_prob)
log_game("Number of traitors: [num_traitors]")
message_admins("Players counted: [num_players] Number of traitors chosen: [num_traitors]")
else
num_traitors = max(1, min(num_players(), traitors_possible))
for(var/i in 1 to num_traitors)
var/datum/mind/traitor = pick(possible_traitors)
pre_traitors += traitor
possible_traitors.Remove(traitor)
for(var/datum/mind/traitor in pre_traitors)
if(!traitor || !istype(traitor))
pre_traitors.Remove(traitor)
continue
if(istype(traitor))
traitor.special_role = SPECIAL_ROLE_TRAITOR
traitor.restricted_roles = restricted_jobs
return TRUE
/datum/game_mode/traitor/autotraitor/post_setup()
..()
addtimer(CALLBACK(src, PROC_REF(traitor_check_loop)), 15 MINUTES)
/datum/game_mode/traitor/autotraitor/proc/traitor_check_loop()
if(SSshuttle.emergency.mode >= SHUTTLE_ESCAPE)
return
var/player_count = 0
var/traitor_count = 0
var/list/possible_traitors = list()
for(var/mob/living/player in GLOB.mob_list)
if(player.client && player.stat != DEAD)
player_count += 1
if(!player.mind)
continue
if(player.mind.special_role)
traitor_count += 1
continue
if(ishuman(player) || isAI(player))
if((ROLE_TRAITOR in player.client.prefs.be_special) && !player.client.skip_antag && !jobban_isbanned(player, ROLE_TRAITOR) && !jobban_isbanned(player, ROLE_SYNDICATE))
possible_traitors += player.mind
for(var/datum/mind/player in possible_traitors)
for(var/job in restricted_jobs)
if(player.assigned_role == job)
possible_traitors -= player
if(!player.current || !ishuman(player.current)) // Remove mindshield-implanted mobs from the list
continue
var/mob/living/carbon/human/H = player.current
for(var/obj/item/bio_chip/mindshield/I in H.contents)
if(I && I.implanted)
possible_traitors -= player
if(!H.job || H.mind.offstation_role) //Golems, special events stuff, etc.
possible_traitors -= player
var/max_traitors = 1
var/traitor_prob = 0
max_traitors = round(player_count / 10) + 1
traitor_prob = (player_count - (max_traitors - 1) * 10) * 5
if(traitor_count < max_traitors - 1)
traitor_prob += 50
if(traitor_count < max_traitors)
if(prob(traitor_prob))
message_admins("Making a new Traitor.")
if(!length(possible_traitors))
message_admins("No potential traitors. Cancelling new traitor.")
addtimer(CALLBACK(src, PROC_REF(traitor_check_loop)), 15 MINUTES)
return
var/datum/mind/new_traitor_mind = pick(possible_traitors)
var/mob/living/new_traitor = new_traitor_mind.current
to_chat(new_traitor, "<span class='danger'>ATTENTION:</span> It is time to pay your debt to the Syndicate...")
new_traitor.mind.add_antag_datum(/datum/antagonist/traitor)
addtimer(CALLBACK(src, PROC_REF(traitor_check_loop)), 15 MINUTES)
/datum/game_mode/traitor/autotraitor/latespawn(mob/living/carbon/human/character)
..()
if(SSshuttle.emergency.mode >= SHUTTLE_ESCAPE)
return
if(character.client && (ROLE_TRAITOR in character.client.prefs.be_special) && !character.client.skip_antag && !jobban_isbanned(character, ROLE_TRAITOR) && !jobban_isbanned(character, ROLE_SYNDICATE))
var/player_count = 0
var/traitor_count = 0
for(var/mob/living/player in GLOB.mob_list)
if(player.client && player.stat != DEAD)
player_count += 1
if(player.mind && player.mind.special_role)
traitor_count += 1
var/max_traitors = 2
var/traitor_prob = 0
max_traitors = round(player_count / 10) + 1
traitor_prob = (player_count - (max_traitors - 1) * 10) * 5
if(traitor_count < max_traitors - 1)
traitor_prob += 50
if(traitor_count < max_traitors)
for(var/job in restricted_jobs)
if(character.mind.assigned_role == job || !ishuman(character))
return
if(prob(traitor_prob))
message_admins("New traitor roll passed. Making a new Traitor.")
character.mind.make_Traitor()