diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index a6eb199322..f131046cac 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -1,7 +1,3 @@
-/datum/game_mode
- var/list/datum/mind/syndicates = list()
- var/nukeops_lastname = ""
-
/datum/game_mode/nuclear
name = "nuclear emergency"
config_tag = "nuclear"
@@ -18,12 +14,11 @@
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/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station
- var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level
var/list/pre_nukeops = list()
+ var/datum/team/nuclear/nuke_team
+
/datum/game_mode/nuclear/pre_setup()
var/n_agents = min(round(num_players() / 10), antag_candidates.len, agents_possible)
for(var/i = 0, i < n_agents, ++i)
@@ -33,120 +28,23 @@
new_op.special_role = "Nuclear Operative"
log_game("[new_op.key] (ckey) has been selected as a nuclear operative")
return TRUE
-
-////////////////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////////////
-/datum/game_mode/proc/update_synd_icons_added(datum/mind/synd_mind)
- var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS]
- opshud.join_hud(synd_mind.current)
- set_antag_hud(synd_mind.current, "synd")
-
-/datum/game_mode/proc/update_synd_icons_removed(datum/mind/synd_mind)
- var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS]
- opshud.leave_hud(synd_mind.current)
- set_antag_hud(synd_mind.current, null)
-
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
/datum/game_mode/nuclear/post_setup()
- var/nuke_code = random_nukecode()
- var/agent_number = 1
- var/datum/mind/leader = pick(pre_nukeops)
- syndicates += pre_nukeops
- for(var/i = 1 to pre_nukeops.len)
- var/datum/mind/op = pre_nukeops[i]
-
- forge_syndicate_objectives(op)
- greet_syndicate(op)
- equip_syndicate(op.current)
-
- if(nuke_code)
- op.store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0)
- to_chat(op.current, "The nuclear authorization code is: [nuke_code]")
-
- if(op == leader)
- op.current.forceMove(pick(GLOB.nukeop_leader_start))
- prepare_syndicate_leader(op, nuke_code)
- else
- op.current.forceMove(GLOB.nukeop_start[((i - 1) % GLOB.nukeop_start.len) + 1])
- op.current.real_name = "[syndicate_name()] Operative #[agent_number++]"
-
- update_synd_icons_added(op)
- op.current.playsound_local(get_turf(op.current), 'sound/ambience/antag/ops.ogg',100,0)
-
- var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list
- if(nuke)
- nuke.r_code = nuke_code
+ //Assign leader
+ var/datum/mind/leader_mind = pre_nukeops[1]
+ var/datum/antagonist/nukeop/L = leader_mind.add_antag_datum(/datum/antagonist/nukeop/leader)
+ 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(/datum/antagonist/nukeop,nuke_team)
return ..()
-/datum/game_mode/proc/prepare_syndicate_leader(datum/mind/synd_mind, nuke_code)
- var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")
- addtimer(CALLBACK(src, .proc/nuketeam_name_assign, synd_mind), 1)
- synd_mind.current.real_name = "[syndicate_name()] [leader_title]"
- to_chat(synd_mind.current, "You are the Syndicate [leader_title] for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors.")
- to_chat(synd_mind.current, "If you feel you are not up to this task, give your ID to another operative.")
- to_chat(synd_mind.current, "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.")
-
- var/obj/item/device/nuclear_challenge/challenge = new /obj/item/device/nuclear_challenge
- synd_mind.current.put_in_hands(challenge, TRUE)
-
- var/static/id_cache = typecacheof(/obj/item/card/id)
- var/list/foundIDs = typecache_filter_list(synd_mind.current.GetAllContents(), id_cache)
- if(foundIDs.len)
- for(var/i in 1 to foundIDs.len)
- var/obj/item/card/id/ID = foundIDs[i]
- ID.name = "lead agent card"
- ID.access += ACCESS_SYNDICATE_LEADER
- else
- message_admins("Warning: Nuke Ops spawned without access to leave their spawn area!")
-
- var/obj/item/device/radio/headset/syndicate/alt/A = locate() in synd_mind.current
- if(A)
- A.command = TRUE
-
- if(nuke_code)
- var/obj/item/paper/P = new
- P.info = "The nuclear authorization code is: [nuke_code]"
- P.name = "nuclear bomb code"
- var/mob/living/carbon/human/H = synd_mind.current
- H.put_in_hands(P, TRUE)
- H.update_icons()
- else
- nuke_code = "code will be provided later"
- return
-
-/datum/game_mode/proc/nuketeam_name_assign(datum/mind/synd_mind)
- nukeops_lastname = nukelastname(synd_mind.current)
- NukeNameAssign(nukeops_lastname, syndicates)
-
-
-/datum/game_mode/proc/forge_syndicate_objectives(datum/mind/syndicate)
- var/datum/objective/nuclear/syndobj = new
- syndobj.owner = syndicate
- syndicate.objectives += syndobj
-
-
-/datum/game_mode/proc/greet_syndicate(datum/mind/syndicate, you_are=1)
- if(you_are)
- to_chat(syndicate.current, "You are a [syndicate_name()] agent!")
- syndicate.announce_objectives()
-
-/datum/game_mode/proc/equip_syndicate(mob/living/carbon/human/synd_mob, telecrystals = TRUE)
- synd_mob.set_species(/datum/species/human) //Plasamen burn up otherwise, and lizards are vulnerable to asimov AIs
-
- if(telecrystals)
- synd_mob.equipOutfit(/datum/outfit/syndicate)
- else
- synd_mob.equipOutfit(/datum/outfit/syndicate/no_crystals)
- return TRUE
-
/datum/game_mode/nuclear/OnNukeExplosion(off_station)
..()
nukes_left--
- var/obj/docking_port/mobile/Shuttle = SSshuttle.getShuttle("syndicate")
- syndies_didnt_escape = (Shuttle && (Shuttle.z == ZLEVEL_CENTCOM || Shuttle.z == ZLEVEL_TRANSIT)) ? 0 : 1
- nuke_off_station = off_station
/datum/game_mode/nuclear/check_win()
if (nukes_left == 0)
@@ -154,8 +52,8 @@
return ..()
/datum/game_mode/proc/are_operatives_dead()
- for(var/datum/mind/operative_mind in syndicates)
- if(ishuman(operative_mind.current) && (operative_mind.current.stat!=2))
+ for(var/datum/mind/operative_mind in get_antagonists(/datum/antagonist/nukeop))
+ if(ishuman(operative_mind.current) && (operative_mind.current.stat != DEAD))
return FALSE
return TRUE
@@ -164,7 +62,7 @@
return replacementmode.check_finished()
if((SSshuttle.emergency.mode == SHUTTLE_ENDGAME) || station_was_nuked)
return TRUE
- if(are_operatives_dead())
+ if(nuke_team.operatives_dead())
var/obj/machinery/nuclearbomb/N
pass(N) //suppress unused warning
if(N.bomb_set) //snaaaaaaaaaake! It's not over yet!
@@ -172,6 +70,7 @@
..()
/datum/game_mode/nuclear/set_round_result()
+ ..()
var result = nuke_team.get_result()
switch(result)
if(NUKE_RESULT_FLUKE)
@@ -204,7 +103,6 @@
else
SSticker.mode_result = "halfwin - interrupted"
SSticker.news_report = OPERATIVE_SKIRMISH
- return ..()
/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 \
@@ -212,7 +110,7 @@
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 && SSticker && SSticker.mode && M.mind in SSticker.mode.syndicates
+ return M && istype(M) && M.mind && M.mind.has_antag_datum(/datum/antagonist/nukeop)
/datum/outfit/syndicate
name = "Syndicate Operative - Basic"
@@ -225,18 +123,28 @@
l_pocket = /obj/item/pinpointer/nuke/syndicate
id = /obj/item/card/id/syndicate
belt = /obj/item/gun/ballistic/automatic/pistol
- backpack_contents = list(/obj/item/storage/box/syndie=1)
+ backpack_contents = list(/obj/item/storage/box/syndie=1,\
+ /obj/item/kitchen/knife/combat/survival)
var/tc = 25
+ var/command_radio = FALSE
+
+
+/datum/outfit/syndicate/leader
+ name = "Syndicate Leader - Basic"
+ id = /obj/item/card/id/syndicate/nuke_leader
+ r_hand = /obj/item/device/nuclear_challenge
+ command_radio = TRUE
/datum/outfit/syndicate/no_crystals
tc = 0
-
/datum/outfit/syndicate/post_equip(mob/living/carbon/human/H)
var/obj/item/device/radio/R = H.ears
- R.set_frequency(GLOB.SYND_FREQ)
- R.freqlock = 1
+ R.set_frequency(FREQ_SYNDICATE)
+ R.freqlock = TRUE
+ if(command_radio)
+ R.command = TRUE
if(tc)
var/obj/item/device/radio/uplink/nuclear/U = new(H, H.key, tc)
@@ -261,4 +169,5 @@
r_hand = /obj/item/gun/ballistic/automatic/shotgun/bulldog
backpack_contents = list(/obj/item/storage/box/syndie=1,\
/obj/item/tank/jetpack/oxygen/harness=1,\
- /obj/item/gun/ballistic/automatic/pistol=1)
+ /obj/item/gun/ballistic/automatic/pistol=1,\
+ /obj/item/kitchen/knife/combat/survival)