diff --git a/_maps/templates/lazy_templates/nukie_base.dmm b/_maps/templates/lazy_templates/nukie_base.dmm
index 63c0fc2b168..059d27000d0 100644
--- a/_maps/templates/lazy_templates/nukie_base.dmm
+++ b/_maps/templates/lazy_templates/nukie_base.dmm
@@ -152,6 +152,10 @@
},
/turf/open/floor/plating,
/area/centcom/syndicate_mothership/control)
+"bZ" = (
+/obj/effect/decal/cleanable/fuel_pool,
+/turf/open/floor/mineral/plastitanium/red,
+/area/centcom/syndicate_mothership)
"cl" = (
/turf/open/lava/plasma/ice_moon,
/area/centcom/syndicate_mothership/control)
@@ -349,6 +353,15 @@
},
/turf/open/floor/iron/dark/textured_large,
/area/centcom/syndicate_mothership/control)
+"dZ" = (
+/obj/machinery/light/small/directional/north,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/structure/closet/crate/bin,
+/obj/effect/decal/cleanable/fuel_pool,
+/obj/item/binoculars,
+/obj/item/stack/sheet/animalhide/carp/five,
+/turf/open/floor/mineral/plastitanium/red,
+/area/centcom/syndicate_mothership)
"ec" = (
/obj/structure/sign/poster/contraband/cc64k_ad,
/turf/closed/indestructible/syndicate,
@@ -485,9 +498,27 @@
/turf/open/floor/iron/freezer,
/area/centcom/syndicate_mothership/control)
"fw" = (
-/obj/item/kirbyplants/random,
+/obj/structure/frame/computer,
+/obj/effect/decal/cleanable/cobweb,
+/obj/structure/sign/poster/contraband/syndiemoth/directional/north,
/turf/open/floor/mineral/plastitanium,
/area/centcom/syndicate_mothership)
+"fx" = (
+/obj/machinery/light/small/dim/directional/west,
+/obj/structure/rack,
+/obj/effect/turf_decal/box/white,
+/obj/item/stack/cable_coil/thirty{
+ pixel_x = 4;
+ pixel_y = -2
+ },
+/obj/item/circuitboard/computer/stationalert{
+ pixel_y = 1;
+ pixel_x = 3
+ },
+/obj/item/stack/cable_coil/thirty,
+/obj/item/circuitboard/computer/advanced_camera,
+/turf/open/floor/mineral/plastitanium/red,
+/area/centcom/syndicate_mothership)
"fy" = (
/obj/structure/lattice/catwalk,
/obj/effect/turf_decal/stripes/line{
@@ -536,6 +567,8 @@
/obj/structure/frame/computer{
dir = 1
},
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/computer/security/telescreen/entertainment/directional/south,
/turf/open/floor/mineral/plastitanium,
/area/centcom/syndicate_mothership)
"gf" = (
@@ -740,6 +773,20 @@
/obj/item/melee/powerfist,
/turf/open/floor/mineral/plastitanium/red,
/area/centcom/syndicate_mothership/expansion_bombthreat)
+"id" = (
+/obj/structure/extinguisher_cabinet/directional/south,
+/obj/item/storage/fancy/donut_box,
+/obj/structure/rack,
+/obj/item/food/syndicake{
+ pixel_x = -1;
+ pixel_y = -1
+ },
+/obj/item/food/syndicake{
+ pixel_x = 1;
+ pixel_y = 1
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/centcom/syndicate_mothership)
"ig" = (
/obj/effect/turf_decal/siding/wideplating{
dir = 1
@@ -1033,6 +1080,10 @@
/obj/structure/sign/poster/contraband/power/directional/north,
/turf/open/floor/mineral/plastitanium,
/area/centcom/syndicate_mothership/expansion_chemicalwarfare)
+"lx" = (
+/obj/machinery/light/small/dim/directional/east,
+/turf/open/floor/mineral/plastitanium/red,
+/area/centcom/syndicate_mothership)
"lA" = (
/obj/machinery/door/window/survival_pod/left/directional/west{
name = "Toilet Door"
@@ -1281,6 +1332,22 @@
dir = 8
},
/area/centcom/syndicate_mothership/control)
+"oN" = (
+/obj/structure/rack,
+/obj/item/poster/random_contraband{
+ pixel_x = 3;
+ pixel_y = 4
+ },
+/obj/item/poster/random_contraband{
+ pixel_x = 3;
+ pixel_y = 8
+ },
+/obj/item/poster/random_contraband{
+ pixel_x = 1
+ },
+/obj/effect/decal/cleanable/cobweb,
+/turf/open/floor/mineral/plastitanium/red,
+/area/centcom/syndicate_mothership)
"oR" = (
/obj/structure/table/wood,
/obj/item/storage/box/donkpockets,
@@ -1367,6 +1434,7 @@
/obj/structure/chair/greyscale{
dir = 4
},
+/obj/effect/landmark/start/nukeop_overwatch,
/turf/open/floor/mineral/plastitanium,
/area/centcom/syndicate_mothership)
"pU" = (
@@ -1641,6 +1709,7 @@
/area/centcom/syndicate_mothership/control)
"sv" = (
/obj/machinery/light/small/directional/north,
+/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/mineral/plastitanium,
/area/centcom/syndicate_mothership)
"sE" = (
@@ -1731,6 +1800,17 @@
/obj/machinery/portable_atmospherics/scrubber,
/turf/open/floor/mineral/plastitanium/red,
/area/centcom/syndicate_mothership/expansion_bombthreat)
+"tB" = (
+/obj/effect/turf_decal/siding/wideplating{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wideplating,
+/obj/machinery/door/airlock/hatch{
+ name = "Workout Room"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/turf/open/floor/mineral/plastitanium,
+/area/centcom/syndicate_mothership)
"tJ" = (
/obj/effect/light_emitter{
set_cap = 1;
@@ -2046,6 +2126,10 @@
dir = 8
},
/area/centcom/syndicate_mothership/control)
+"yA" = (
+/obj/effect/decal/cleanable/insectguts,
+/turf/open/floor/mineral/plastitanium/red,
+/area/centcom/syndicate_mothership)
"yB" = (
/obj/machinery/light/small/directional/north,
/turf/open/misc/asteroid/snow/icemoon,
@@ -2100,12 +2184,12 @@
/area/centcom/syndicate_mothership/control)
"zy" = (
/obj/structure/table/reinforced/plasmarglass,
-/obj/item/pen{
- pixel_x = 6;
- pixel_y = 5
+/obj/item/flashlight/lamp/green{
+ pixel_y = 9;
+ pixel_x = 5
},
-/obj/item/folder/red{
- pixel_x = -5
+/obj/item/circuitboard/computer/overwatch{
+ pixel_x = -2
},
/turf/open/floor/mineral/plastitanium,
/area/centcom/syndicate_mothership)
@@ -3037,6 +3121,10 @@
},
/turf/open/floor/mineral/plastitanium/red,
/area/centcom/syndicate_mothership/expansion_bioterrorism)
+"Jx" = (
+/obj/effect/decal/cleanable/plastic,
+/turf/open/floor/mineral/plastitanium/red,
+/area/centcom/syndicate_mothership)
"JJ" = (
/obj/effect/turf_decal/siding/thinplating_new/dark{
dir = 5
@@ -3318,6 +3406,19 @@
/obj/structure/noticeboard/directional/east,
/turf/open/floor/mineral/plastitanium,
/area/centcom/syndicate_mothership/expansion_bioterrorism)
+"MA" = (
+/obj/item/stack/sheet/iron/fifty{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/structure/rack,
+/obj/item/stack/sheet/glass/fifty{
+ pixel_y = 3;
+ pixel_x = 5
+ },
+/obj/item/storage/toolbox/mechanical,
+/turf/open/floor/mineral/plastitanium/red,
+/area/centcom/syndicate_mothership)
"MD" = (
/obj/machinery/door/airlock/maintenance/external{
name = "Bunk Room 1"
@@ -3483,6 +3584,14 @@
pixel_x = -2;
pixel_y = 6
},
+/obj/item/paper/fluff/overwatch{
+ pixel_y = 8;
+ pixel_x = -2
+ },
+/obj/item/toy/figure/syndie{
+ pixel_x = 5
+ },
+/obj/structure/sign/clock/directional/north,
/turf/open/floor/mineral/plastitanium,
/area/centcom/syndicate_mothership)
"Ov" = (
@@ -3706,6 +3815,14 @@
/obj/effect/turf_decal/tile/bar/opposingcorners,
/turf/open/floor/iron,
/area/centcom/syndicate_mothership/control)
+"QD" = (
+/obj/item/flashlight{
+ pixel_y = 6
+ },
+/obj/structure/rack,
+/obj/item/flashlight,
+/turf/open/floor/mineral/plastitanium/red,
+/area/centcom/syndicate_mothership)
"QJ" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -3728,10 +3845,39 @@
},
/turf/open/misc/asteroid/snow/icemoon,
/area/centcom/syndicate_mothership/control)
+"QS" = (
+/obj/item/soap/syndie,
+/obj/structure/rack,
+/obj/item/storage/fancy/cigarettes/cigpack_syndicate{
+ pixel_x = 5;
+ pixel_y = 2
+ },
+/obj/effect/spawner/random/entertainment/lighter,
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/mineral/plastitanium/red,
+/area/centcom/syndicate_mothership)
"Rd" = (
/obj/structure/cable,
/turf/open/floor/catwalk_floor/iron,
/area/centcom/syndicate_mothership/control)
+"Rn" = (
+/obj/item/circuitboard/computer/syndicate_shuttle{
+ pixel_x = 2;
+ pixel_y = 3
+ },
+/obj/structure/rack,
+/obj/item/stack/cable_coil/thirty{
+ pixel_x = -2;
+ pixel_y = -1
+ },
+/obj/effect/turf_decal/box/white,
+/obj/item/circuitboard/computer/syndicate_shuttle_docker,
+/turf/open/floor/mineral/plastitanium/red,
+/area/centcom/syndicate_mothership)
+"Rr" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/mineral/plastitanium/red,
+/area/centcom/syndicate_mothership)
"Rs" = (
/obj/effect/turf_decal/siding/thinplating_new/dark{
dir = 1
@@ -3830,6 +3976,11 @@
},
/turf/open/floor/mineral/plastitanium/red,
/area/centcom/syndicate_mothership/expansion_bombthreat)
+"St" = (
+/obj/effect/decal/cleanable/fuel_pool,
+/obj/machinery/light_switch/directional/east,
+/turf/open/floor/mineral/plastitanium/red,
+/area/centcom/syndicate_mothership)
"Su" = (
/obj/structure/chair/stool/bar/directional/west,
/obj/effect/turf_decal/siding/thinplating/dark{
@@ -4276,6 +4427,11 @@
/obj/machinery/light/cold/directional/east,
/turf/open/floor/catwalk_floor/iron_dark,
/area/centcom/syndicate_mothership/control)
+"XO" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/fuel_pool,
+/turf/open/floor/mineral/plastitanium/red,
+/area/centcom/syndicate_mothership)
"XQ" = (
/obj/effect/turf_decal/siding/wideplating/dark,
/obj/effect/turf_decal/siding/wideplating/dark{
@@ -4375,6 +4531,14 @@
},
/turf/open/misc/asteroid/snow/icemoon,
/area/centcom/syndicate_mothership/control)
+"YT" = (
+/obj/structure/rack,
+/obj/effect/turf_decal/box/white,
+/obj/item/storage/medkit/emergency,
+/obj/item/tank/internals/emergency_oxygen/double,
+/obj/item/clothing/mask/gas/syndicate,
+/turf/open/floor/mineral/plastitanium/red,
+/area/centcom/syndicate_mothership)
"YX" = (
/obj/structure/railing{
dir = 6
@@ -4491,6 +4655,7 @@
/turf/open/floor/plating/snowed/icemoon,
/area/centcom/syndicate_mothership/control)
"ZX" = (
+/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/mineral/plastitanium,
/area/centcom/syndicate_mothership)
"ZZ" = (
@@ -5254,9 +5419,9 @@ sU
sU
sU
sU
-sU
-sU
-sU
+Ye
+Ye
+Ye
Ye
Ye
Ye
@@ -5356,13 +5521,13 @@ sU
sU
sU
sU
-sU
-sU
Ye
Ye
Kq
Kq
Kq
+Kq
+Kq
Ye
KU
KU
@@ -5458,12 +5623,12 @@ sU
sU
sU
sU
-sU
-Ye
Ye
Kq
Kq
-Xk
+YT
+fx
+Rn
Kq
Kq
KU
@@ -5561,12 +5726,12 @@ sU
sU
sU
Ye
-Ye
Kq
-Kq
-Xk
-Xk
+oN
+Jx
Xk
+Rr
+MA
Kq
Kq
uT
@@ -5664,12 +5829,12 @@ sU
sU
Ye
Kq
-Kq
-Xk
-Xk
-Xk
+QS
Xk
Xk
+bZ
+Rr
+id
Kq
Kq
uT
@@ -5766,12 +5931,12 @@ sU
sU
Ye
Kq
-Xk
-Xk
-Xk
-Xk
-Xk
-Xk
+QD
+Rr
+lx
+bZ
+St
+XO
Xk
Kq
Kq
@@ -5871,12 +6036,12 @@ Kq
Kq
Kq
Kq
-lg
+tB
Kq
+dZ
Xk
-Xk
-Xk
-Kq
+yA
+tO
uT
ds
HW
diff --git a/code/__DEFINES/cameranets.dm b/code/__DEFINES/cameranets.dm
index 1dea0cd18ae..15b4493738e 100644
--- a/code/__DEFINES/cameranets.dm
+++ b/code/__DEFINES/cameranets.dm
@@ -26,3 +26,4 @@
#define CAMERANET_NETWORK_BAR "bar"
#define CAMERANET_NETWORK_INTERROGATION "interrogation"
#define CAMERANET_NETWORK_ABDUCTOR "abductor"
+#define OPERATIVE_CAMERA_NET "operative"
diff --git a/code/__DEFINES/dcs/signals/signals_operatives.dm b/code/__DEFINES/dcs/signals/signals_operatives.dm
new file mode 100644
index 00000000000..12a3bed4668
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/signals_operatives.dm
@@ -0,0 +1,2 @@
+/// For when a new teammate is added to a nukie team
+#define COMSIG_NUKE_TEAM_ADDITION "nuke_team_addition"
diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm
index abc272d0482..270b997e367 100644
--- a/code/__DEFINES/role_preferences.dm
+++ b/code/__DEFINES/role_preferences.dm
@@ -89,6 +89,7 @@
#define ROLE_WIZARD_APPRENTICE "apprentice"
#define ROLE_SYNDICATE_MONKEY "Syndicate Monkey Agent"
#define ROLE_CONTRACTOR_SUPPORT "Contractor Support Unit"
+#define ROLE_OPERATIVE_OVERWATCH "Operative Overwatch Agent"
#define ROLE_SYNDICATE_SABOBORG "Syndicate Sabotage Cyborg"
#define ROLE_SYNDICATE_MEDBORG "Syndicate Medical Cyborg"
#define ROLE_SYNDICATE_ASSAULTBORG "Syndicate Assault Cyborg"
diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm
index 8719f45f18f..45f59fb4475 100644
--- a/code/_globalvars/lists/mapping.dm
+++ b/code/_globalvars/lists/mapping.dm
@@ -111,6 +111,7 @@ GLOBAL_LIST_EMPTY(gorilla_start)
GLOBAL_LIST_EMPTY(wizardstart)
GLOBAL_LIST_EMPTY(nukeop_start)
GLOBAL_LIST_EMPTY(nukeop_leader_start)
+GLOBAL_LIST_EMPTY(nukeop_overwatch_start)
GLOBAL_LIST_EMPTY(newplayer_start)
GLOBAL_LIST_EMPTY(prisonwarp) //admin prisoners go to these
GLOBAL_LIST_EMPTY(holdingfacility) //captured people go here (ninja energy net)
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index ac0d756e5fa..76522819d08 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -298,6 +298,16 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark)
GLOB.nukeop_leader_start += loc
return INITIALIZE_HINT_QDEL
+/obj/effect/landmark/start/nukeop_overwatch
+ name = "nukeop overwatch"
+ icon = 'icons/effects/landmarks_static.dmi'
+ icon_state = "snukeop_leader_spawn"
+
+/obj/effect/landmark/start/nukeop_overwatch/Initialize(mapload)
+ ..()
+ GLOB.nukeop_overwatch_start += loc
+ return INITIALIZE_HINT_QDEL
+
// Must be immediate because players will
// join before SSatom initializes everything.
INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm
index 2719c576a5e..8be6abe98ea 100644
--- a/code/modules/antagonists/_common/antag_spawner.dm
+++ b/code/modules/antagonists/_common/antag_spawner.dm
@@ -103,11 +103,13 @@
/// The applied outfit
var/datum/outfit/syndicate/outfit = /datum/outfit/syndicate/reinforcement
/// The antag datum applied
- var/datum/antagonist/nukeop/reinforcement/antag_datum = /datum/antagonist/nukeop/reinforcement
+ var/antag_datum = /datum/antagonist/nukeop/reinforcement
/// Style used by the droppod
var/pod_style = STYLE_SYNDICATE
/// Do we use a random subtype of the outfit?
var/use_subtypes = TRUE
+ /// Where do we land our pod?
+ var/turf/spawn_location
/obj/item/antag_spawner/nuke_ops/proc/check_usability(mob/user)
if(used)
@@ -143,7 +145,6 @@
/obj/item/antag_spawner/nuke_ops/spawn_antag(client/our_client, turf/T, kind, datum/mind/user)
var/mob/living/carbon/human/nukie = new()
- var/obj/structure/closet/supplypod/pod = setup_pod()
our_client.prefs.safe_transfer_prefs_to(nukie, is_antag = TRUE)
nukie.ckey = our_client.key
var/datum/mind/op_mind = nukie.mind
@@ -152,15 +153,33 @@
else
nukie.forceMove(locate(1,1,1))
- antag_datum = new()
-
- antag_datum.nukeop_outfit = use_subtypes ? pick(subtypesof(outfit)) : outfit
+ var/new_datum = new antag_datum()
var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop, TRUE)
- op_mind.add_antag_datum(antag_datum, creator_op ? creator_op.get_team() : null)
+ op_mind.add_antag_datum(new_datum, creator_op ? creator_op.get_team() : null)
op_mind.special_role = special_role_name
+
+ if(outfit)
+ var/datum/antagonist/nukeop/nukie_datum = op_mind.has_antag_datum(antag_datum)
+ nukie_datum.nukeop_outfit = use_subtypes ? pick(subtypesof(outfit)) : outfit
+
+ var/obj/structure/closet/supplypod/pod = setup_pod()
nukie.forceMove(pod)
- new /obj/effect/pod_landingzone(get_turf(src), pod)
+ new /obj/effect/pod_landingzone(spawn_location ? spawn_location : get_turf(src), pod)
+
+/obj/item/antag_spawner/nuke_ops/overwatch
+ name = "overwatch support beacon"
+ desc = "Assigns an Overwatch Intelligence Agent to your operation. Stationed at their own remote outpost, they can view station cameras, alarms, and even move the Infiltrator shuttle! \
+ Also, all members of your operation will recieve body cameras that they can view your progress from."
+ special_role_name = ROLE_OPERATIVE_OVERWATCH
+ outfit = /datum/outfit/syndicate/support
+ use_subtypes = FALSE
+ antag_datum = /datum/antagonist/nukeop/support
+
+/obj/item/antag_spawner/nuke_ops/overwatch/Initialize(mapload)
+ . = ..()
+ if(length(GLOB.nukeop_overwatch_start)) //Otherwise, it will default to the datum's spawn point anyways
+ spawn_location = pick(GLOB.nukeop_overwatch_start)
//////CLOWN OP
/obj/item/antag_spawner/nuke_ops/clown
diff --git a/code/modules/antagonists/nukeop/datums/operative.dm b/code/modules/antagonists/nukeop/datums/operative.dm
index 516108c5725..3b4c9fa4da7 100644
--- a/code/modules/antagonists/nukeop/datums/operative.dm
+++ b/code/modules/antagonists/nukeop/datums/operative.dm
@@ -46,7 +46,6 @@
var/datum/component/uplink/uplink = owner.find_syndicate_uplink()
if (uplink)
uplink.uplink_handler.add_telecrystals(extra_tc)
-
var/datum/component/uplink/uplink = owner.find_syndicate_uplink()
if(uplink)
var/datum/team/nuclear/nuke_team = get_team()
diff --git a/code/modules/antagonists/nukeop/datums/operative_support.dm b/code/modules/antagonists/nukeop/datums/operative_support.dm
new file mode 100644
index 00000000000..c9ea12b63c5
--- /dev/null
+++ b/code/modules/antagonists/nukeop/datums/operative_support.dm
@@ -0,0 +1,54 @@
+/datum/antagonist/nukeop/support
+ name = ROLE_OPERATIVE_OVERWATCH
+ show_to_ghosts = TRUE
+ send_to_spawnpoint = TRUE
+ nukeop_outfit = /datum/outfit/syndicate/support
+
+/datum/antagonist/nukeop/support/greet()
+ owner.current.playsound_local(get_turf(owner.current), 'sound/machines/printer.ogg', 100, 0, use_reverb = FALSE)
+ to_chat(owner, span_big("You are a [name]! You've been temporarily assigned to provide camera overwatch and manage communications for a nuclear operative team!"))
+ to_chat(owner, span_red("Use your tools to set up your equipment however you like, but do NOT attempt to leave your outpost."))
+ owner.announce_objectives()
+
+/datum/antagonist/nukeop/support/on_gain()
+ ..()
+ for(var/datum/mind/teammate_mind in nuke_team.members)
+ var/mob/living/our_teammate = teammate_mind.current
+ our_teammate.AddComponent( \
+ /datum/component/simple_bodycam, \
+ camera_name = "operative bodycam", \
+ c_tag = "[our_teammate.real_name]", \
+ network = OPERATIVE_CAMERA_NET, \
+ emp_proof = FALSE, \
+ )
+ our_teammate.playsound_local(get_turf(owner.current), 'sound/weapons/egloves.ogg', 100, 0)
+ to_chat(our_teammate, span_notice("A Syndicate Overwatch Intelligence Agent has been assigned to your team. Smile, you're on camera!"))
+
+ RegisterSignal(nuke_team, COMSIG_NUKE_TEAM_ADDITION, PROC_REF(late_bodycam))
+
+ owner.current.grant_language(/datum/language/codespeak)
+
+/datum/antagonist/nukeop/support/get_spawnpoint()
+ return pick(GLOB.nukeop_overwatch_start)
+
+/datum/antagonist/nukeop/support/forge_objectives()
+ var/datum/objective/overwatch/objective = new
+ objective.owner = owner
+ objectives += objective
+
+/datum/antagonist/nukeop/support/proc/late_bodycam(datum/source, mob/living/new_teammate)
+ SIGNAL_HANDLER
+ new_teammate.AddComponent( \
+ /datum/component/simple_bodycam, \
+ camera_name = "operative bodycam", \
+ c_tag = "[new_teammate.real_name]", \
+ network = OPERATIVE_CAMERA_NET, \
+ emp_proof = FALSE, \
+ )
+ to_chat(new_teammate, span_notice("You have been equipped with a bodycam, viewable by your Overwatch Intelligence Agent. Make sure to show them a good performance!"))
+
+/datum/objective/overwatch
+ explanation_text = "Provide intelligence support and overwatch to your operative team!"
+
+/datum/objective/overwatch/check_completion()
+ return GLOB.station_was_nuked
diff --git a/code/modules/antagonists/nukeop/datums/operative_team.dm b/code/modules/antagonists/nukeop/datums/operative_team.dm
index 9bec3b0fcf0..3345f3cf4d2 100644
--- a/code/modules/antagonists/nukeop/datums/operative_team.dm
+++ b/code/modules/antagonists/nukeop/datums/operative_team.dm
@@ -313,5 +313,9 @@
return TRUE
return FALSE
+/datum/team/nuclear/add_member(datum/mind/new_member)
+ ..()
+ SEND_SIGNAL(src, COMSIG_NUKE_TEAM_ADDITION, new_member.current)
+
#undef SPAWN_AT_BASE
#undef SPAWN_AT_INFILTRATOR
diff --git a/code/modules/antagonists/nukeop/equipment/overwatch_tools.dm b/code/modules/antagonists/nukeop/equipment/overwatch_tools.dm
new file mode 100644
index 00000000000..852c0d7d32f
--- /dev/null
+++ b/code/modules/antagonists/nukeop/equipment/overwatch_tools.dm
@@ -0,0 +1,46 @@
+///One of the special items that spawns in the overwatch agent's room.
+/obj/item/paper/fluff/overwatch
+ name = "OVERWATCH NOTES #1"
+ color = COLOR_RED
+ desc = "A note from Syndicate leadership regarding your new job. You should read this!"
+ default_raw_text = @{"
+Congratulations! You have been picked to be the Sole Survivor of an anti-Nanotrasen suicide mission!
+We're kidding of course, these types of missions tend to have abnormally high survival rates. I guess that says a lot about who your team will be going up against.
+
+You've been assigned to provide intelligence support to the ground-pounders carrying out the operation.
+Each operative has been equipped with a bodycam that can be accessed via your Overwatch Camera Console.
+Additionally, you have been given the boards to access station alerts, cameras, and remotely control the infiltrator shuttle.
+
+Feel free to set up your workplace however you like. We've provided the tools and boards in your backroom.
+
+Happy hunting!
+ "}
+
+/obj/machinery/computer/security/overwatch
+ name = "overwatch camera console"
+ desc = "Allows you to view members of your operative team via their bodycam feeds. We call them 'bodycams', but they're actually a swarm of tiny, near-imperceptible camera drones that follow each target. \
+ It is believed that adversaries either don't notice the drones, or avoid attacking them in hopes that they'll capture footage of their combat prowess against our operatives."
+ icon_screen = "commsyndie"
+ icon_keyboard = "syndie_key"
+ network = list(OPERATIVE_CAMERA_NET)
+ circuit = /obj/item/circuitboard/computer/overwatch
+
+/obj/item/circuitboard/computer/overwatch
+ name = "Overwatch Body Cameras"
+ build_path = /obj/machinery/computer/security/overwatch
+ greyscale_colors = CIRCUIT_COLOR_SECURITY
+
+/obj/item/circuitboard/computer/syndicate_shuttle_docker
+ name = "Shuttle Controller"
+ build_path = /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate
+ greyscale_colors = CIRCUIT_COLOR_SECURITY
+
+/obj/item/clothing/glasses/overwatch
+ name = "intelligence glasses"
+ desc = "A set of incredibly advanced sunglasses, providing you with an array of different sensor scans and visual readouts for pretty much anything you look at. \
+ It's kind of overwhelming, actually. Wearing this for a few hours will probably give you a migrane."
+ icon_state = "sunhudmed"
+ flags_cover = GLASSESCOVERSEYES
+ flash_protect = FLASH_PROTECTION_WELDER
+ clothing_traits = list(TRAIT_REAGENT_SCANNER)
+ var/list/hudlist = list(DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC_ADVANCED, DATA_HUD_SECURITY_ADVANCED)
diff --git a/code/modules/antagonists/nukeop/outfits.dm b/code/modules/antagonists/nukeop/outfits.dm
index 80360f56360..eb251bcc363 100644
--- a/code/modules/antagonists/nukeop/outfits.dm
+++ b/code/modules/antagonists/nukeop/outfits.dm
@@ -114,6 +114,17 @@
r_hand = /obj/item/tank/internals/plasmaman/belt/full
tc = 0
+/datum/outfit/syndicate/support/plasmaman
+ name = "Nuclear Operative Overwatch Agent (Plasmaman)"
+ back = /obj/item/storage/backpack/satchel
+ head = /obj/item/clothing/head/helmet/space/plasmaman/syndie
+ uniform = /obj/item/clothing/under/plasmaman/syndicate
+ glasses = /obj/item/clothing/glasses/overwatch
+ suit = /obj/item/clothing/suit/jacket/letterman_syndie
+ r_hand = /obj/item/tank/internals/plasmaman/belt/full
+ command_radio = TRUE
+ tc = 0
+
/datum/outfit/syndicate/reinforcement/gorlex
name = "Syndicate Operative - Gorlex Reinforcement"
suit = /obj/item/clothing/suit/armor/vest/alt
@@ -191,3 +202,13 @@
var/obj/item/shield/energy/shield = locate() in H.held_items
shield.icon_state = "[shield.base_icon_state]1"
H.update_held_items()
+
+/datum/outfit/syndicate/support
+ name = "Nuclear Operative Overwatch Agent"
+ back = /obj/item/storage/backpack/satchel
+ uniform = /obj/item/clothing/under/syndicate/tacticool
+ glasses = /obj/item/clothing/glasses/overwatch
+ suit = /obj/item/clothing/suit/jacket/letterman_syndie
+ shoes = /obj/item/clothing/shoes/sandal
+ command_radio = TRUE
+ tc = 0
diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
index 1cf8b67db5d..ba6e9619a2f 100644
--- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
@@ -62,6 +62,7 @@
/datum/outfit/syndicate/reinforcement/interdyne = /datum/outfit/syndicate/reinforcement/plasmaman,
/datum/outfit/syndicate/reinforcement/mi13 = /datum/outfit/syndicate/reinforcement/plasmaman,
/datum/outfit/syndicate/reinforcement/waffle = /datum/outfit/syndicate/reinforcement/plasmaman,
+ /datum/outfit/syndicate/support = /datum/outfit/syndicate/support/plasmaman,
)
/// If the bones themselves are burning clothes won't help you much
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index ad8f8695a05..9d5fb6d241f 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -637,6 +637,9 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri
/obj/item/stack/cable_coil/five
amount = 5
+/obj/item/stack/cable_coil/thirty
+ amount = 30
+
/obj/item/stack/cable_coil/cut
amount = null
icon_state = "coil2"
diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm
index f08446b650d..402a87bf6d4 100644
--- a/code/modules/shuttle/syndicate.dm
+++ b/code/modules/shuttle/syndicate.dm
@@ -64,5 +64,6 @@
y_offset = -1
whitelist_turfs = list(/turf/open/space, /turf/open/floor/plating, /turf/open/lava, /turf/closed/mineral, /turf/open/openspace, /turf/open/misc)
see_hidden = TRUE
+ circuit = /obj/item/circuitboard/computer/syndicate_shuttle_docker
#undef SYNDICATE_CHALLENGE_TIMER
diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm
index 975424923cb..f663ea0dc9d 100644
--- a/code/modules/uplink/uplink_items/nukeops.dm
+++ b/code/modules/uplink/uplink_items/nukeops.dm
@@ -475,6 +475,14 @@
Its chameleon projector lets it disguise itself as a Nanotrasen cyborg, on top it has thermal vision and a pinpointer."
item = /obj/item/antag_spawner/nuke_ops/borg_tele/saboteur
+/datum/uplink_item/reinforcements/overwatch_agent
+ name = "Overwatch Intelligence Agent"
+ desc = "An Overwatch Intelligence Agent is assigned to your operation. They can view your progress and help coordinate using your \
+ operative team's body-cams. They can also pilot the shuttle remotely and view the station's camera net. \
+ If you're a meathead who's just here to kill people and don't care about strategising or intel, you'll still have someone to bear witness to your murder-spree!"
+ item = /obj/item/antag_spawner/nuke_ops/overwatch
+ cost = 12
+
// ~~ Disposable Sentry Gun ~~
// Technically not a spawn but it is a kind of reinforcement...I guess.
diff --git a/tgstation.dme b/tgstation.dme
index 8cc33ca517d..3a4cee73008 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -336,6 +336,7 @@
#include "code\__DEFINES\dcs\signals\signals_music.dm"
#include "code\__DEFINES\dcs\signals\signals_object.dm"
#include "code\__DEFINES\dcs\signals\signals_operating_computer.dm"
+#include "code\__DEFINES\dcs\signals\signals_operatives.dm"
#include "code\__DEFINES\dcs\signals\signals_painting.dm"
#include "code\__DEFINES\dcs\signals\signals_proxmonitor.dm"
#include "code\__DEFINES\dcs\signals\signals_radiation.dm"
@@ -3251,10 +3252,12 @@
#include "code\modules\antagonists\nukeop\datums\operative_leader.dm"
#include "code\modules\antagonists\nukeop\datums\operative_lone.dm"
#include "code\modules\antagonists\nukeop\datums\operative_reinforcement.dm"
+#include "code\modules\antagonists\nukeop\datums\operative_support.dm"
#include "code\modules\antagonists\nukeop\datums\operative_team.dm"
#include "code\modules\antagonists\nukeop\equipment\borgchameleon.dm"
#include "code\modules\antagonists\nukeop\equipment\nuclear_authentication_disk.dm"
#include "code\modules\antagonists\nukeop\equipment\nuclear_challenge.dm"
+#include "code\modules\antagonists\nukeop\equipment\overwatch_tools.dm"
#include "code\modules\antagonists\nukeop\equipment\pinpointer.dm"
#include "code\modules\antagonists\nukeop\equipment\nuclear_bomb\_nuclear_bomb.dm"
#include "code\modules\antagonists\nukeop\equipment\nuclear_bomb\beer_nuke.dm"