diff --git a/code/__HELPERS/trait_helpers.dm b/code/__HELPERS/trait_helpers.dm
index 48feea04b4e..e8e7aaead06 100644
--- a/code/__HELPERS/trait_helpers.dm
+++ b/code/__HELPERS/trait_helpers.dm
@@ -396,6 +396,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define STATION_TRAIT_FORESTED "station_trait_forested"
#define STATION_TRAIT_VENDING_SHORTAGE "station_trait_vending_shortage"
#define STATION_TRAIT_MESSY "station_trait_messy"
+#define STATION_TRAIT_TRIAI "station_trait_triai"
//***** TURF TRAITS *****//
/// Removes slowdown while walking on these tiles.
diff --git a/code/controllers/subsystem/SSticker.dm b/code/controllers/subsystem/SSticker.dm
index bc19b6c93fd..08b385df6e1 100644
--- a/code/controllers/subsystem/SSticker.dm
+++ b/code/controllers/subsystem/SSticker.dm
@@ -284,6 +284,12 @@ SUBSYSTEM_DEF(ticker)
Master.SetRunLevel(RUNLEVEL_GAME)
// Generate the list of empty playable AI cores in the world
+ if(HAS_TRAIT(SSstation, STATION_TRAIT_TRIAI))
+ for(var/obj/effect/landmark/tripai in GLOB.landmarks_list)
+ if(tripai.name == "tripai")
+ if(locate(/mob/living) in get_turf(tripai))
+ continue
+ GLOB.empty_playable_ai_cores += new /obj/structure/AIcore/deactivated(get_turf(tripai))
for(var/obj/effect/landmark/start/ai/A in GLOB.landmarks_list)
if(locate(/mob/living) in get_turf(A))
continue
diff --git a/code/datums/station_traits/neutral_traits.dm b/code/datums/station_traits/neutral_traits.dm
index 4661f5efed8..370ef497779 100644
--- a/code/datums/station_traits/neutral_traits.dm
+++ b/code/datums/station_traits/neutral_traits.dm
@@ -64,3 +64,19 @@
/datum/station_trait/hangover/revert()
. = ..()
SSjobs.drunken_spawning = FALSE
+
+/datum/station_trait/triple_ai
+ name = "AI Triumvirate"
+ trait_type = STATION_TRAIT_NEUTRAL
+ weight = 1
+ show_in_report = TRUE
+ report_message = "As part of Operation Magi, your station has been equipped with three Nanotrasen Artificial Intelligence models. Please try not to break them."
+ trait_to_give = STATION_TRAIT_TRIAI
+
+/datum/station_trait/triple_ai/New()
+ . = ..()
+ SSticker.triai = TRUE
+
+/datum/station_trait/triple_ai/revert()
+ . = ..()
+ SSticker.triai = FALSE
diff --git a/code/modules/admin/verbs/tripAI.dm b/code/modules/admin/verbs/tripAI.dm
index 5eedd9f2811..4fc6b4aade3 100644
--- a/code/modules/admin/verbs/tripAI.dm
+++ b/code/modules/admin/verbs/tripAI.dm
@@ -11,12 +11,16 @@
if(!job)
to_chat(usr, "Unable to locate the AI job")
return
+ if(HAS_TRAIT(SSstation, STATION_TRAIT_TRIAI))
+ to_chat(usr, "The triple AI station trait is now enabled. This trait can be disabled in the Modify Station Traits menu.")
+ return
+
if(SSticker.triai)
- SSticker.triai = 0
+ SSticker.triai = FALSE
to_chat(usr, "Only one AI will be spawned at round start.")
message_admins("[key_name_admin(usr)] has toggled off triple AIs at round start.", 1)
else
- SSticker.triai = 1
+ SSticker.triai = TRUE
to_chat(usr, "There will be an AI Triumvirate at round start.")
message_admins("[key_name_admin(usr)] has toggled on triple AIs at round start.", 1)
return