Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 46 additions & 3 deletions code/game/gamemodes/traitor/traitor.dm
Original file line number Diff line number Diff line change
Expand Up @@ -76,15 +76,15 @@

/datum/game_mode/traitor/post_setup()
for(var/datum/mind/traitor in pre_traitors)
var/datum/antagonist/traitor/new_antag = new antag_datum()
addtimer(CALLBACK(traitor, /datum/mind.proc/add_antag_datum, new_antag), rand(10,100))
addtimer(CALLBACK(src, /datum/game_mode/traitor.proc/add_traitor_delayed, traitor), rand(3 MINUTES, (5 MINUTES + 10 SECONDS)))

if(!exchange_blue)
exchange_blue = -1 //Block latejoiners from getting exchange objectives
..()

//We're not actually ready until all traitors are assigned.
gamemode_ready = FALSE
addtimer(VARSET_CALLBACK(src, gamemode_ready, TRUE), 101)
addtimer(VARSET_CALLBACK(src, gamemode_ready, TRUE), (5 MINUTES + 11 SECONDS))
return TRUE

/datum/game_mode/traitor/make_antag_chance(mob/living/carbon/human/character) //Assigns traitor to latejoiners
Expand All @@ -99,6 +99,49 @@
if(!(character.job in restricted_jobs))
add_latejoin_traitor(character.mind)

/datum/game_mode/traitor/proc/add_traitor_delayed(datum/mind/traitor)
if(!traitor || !traitor.current || !traitor.current.client || (traitor.current.stat != CONSCIOUS) || istype(traitor.current.loc, /obj/machinery/cryopod))
create_new_traitor()
return
var/datum/antagonist/traitor/new_antag = new antag_datum()
traitor.add_antag_datum(new_antag)

/datum/game_mode/traitor/proc/create_new_traitor()
var/list/potential_candidates = list()
for(var/mob/living/carbon/human/applicant in GLOB.player_list)
if(!applicant.client)
continue
if(!applicant.mind)
continue
if(!applicant.stat != CONSCIOUS)
continue
if(applicant.mind.assigned_role in protected_jobs)
continue
if(applicant.mind.assigned_role in restricted_jobs)
continue
if(!(applicant.mind.assigned_role in GLOB.command_positions + GLOB.engineering_positions + GLOB.medical_positions + GLOB.science_positions + GLOB.supply_positions + GLOB.civilian_positions + GLOB.security_positions + list("AI", "Cyborg")))
continue
if(applicant.mind.quiet_round)
continue
if(HAS_TRAIT(applicant, TRAIT_MINDSHIELD))
continue
if(is_banned_from(applicant.ckey, list(antag_flag, ROLE_SYNDICATE)))
continue
if(!(antag_flag in applicant.client.prefs.be_special))
continue
if(!age_check(applicant.client))
continue
potential_candidates += applicant
if(!potential_candidates)
message_admins("Failed to find new antag after original one left! Check the antag balance please.")
return
var/mob/living/carbon/human/picked = pick(potential_candidates)
if(!picked || !picked.client)
return
var/datum/antagonist/traitor/new_antag = new antag_datum()
picked.mind.add_antag_datum(new_antag)
picked.mind.special_role = traitor_name

/datum/game_mode/traitor/proc/add_latejoin_traitor(datum/mind/character)
var/datum/antagonist/traitor/new_antag = new antag_datum()
character.add_antag_datum(new_antag)
Expand Down