diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 2b1252eb504..ebc0e0b028e 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -489,3 +489,9 @@ GLOBAL_LIST_INIT(pda_styles, sortList(list(MONO, VT, ORBITRON, SHARE)))
// The alpha we give to stuff under tiles, if they want it
#define ALPHA_UNDERTILE 128
+
+// Anonymous names defines (used in the secrets panel)
+
+#define ANON_DISABLED "" //so it's falsey
+#define ANON_RANDOMNAMES "Random Default"
+#define ANON_EMPLOYEENAMES "Employees"
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 0eb7648be14..753ca500975 100755
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -27,7 +27,11 @@ SUBSYSTEM_DEF(ticker)
var/admin_delay_notice = "" //a message to display to anyone who tries to restart the world after a delay
var/ready_for_reboot = FALSE //all roundend preparation done with, all that's left is reboot
- var/triai = 0 //Global holder for Triumvirate
+ ///If not set to ANON_DISABLED then people spawn with a themed anon name (see anonymousnames.dm)
+ var/anonymousnames = ANON_DISABLED
+ ///Boolean to see if the game needs to set up a triumvirate ai (see tripAI.dm)
+ var/triai = FALSE
+
var/tipped = 0 //Did we broadcast the tip of the day yet?
var/selected_tip // What will be the tip of the day?
@@ -472,6 +476,7 @@ SUBSYSTEM_DEF(ticker)
delay_end = SSticker.delay_end
+ anonymousnames = SSticker.anonymousnames
triai = SSticker.triai
tipped = SSticker.tipped
selected_tip = SSticker.selected_tip
diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm
index bac573b6e08..3a51fa91ad8 100644
--- a/code/modules/admin/secrets.dm
+++ b/code/modules/admin/secrets.dm
@@ -51,6 +51,7 @@
Make all areas powered
Make all areas unpowered
Power all SMES
+ Anonymous Names (needs to be used in the lobby)
Triple AI mode (needs to be used in the lobby)
Everyone is the traitor
Summon Guns
@@ -304,6 +305,12 @@
var/mob/living/carbon/human/H = i
H.set_species(newtype)
+ if("anon_name")
+ if(!check_rights(R_FUN))
+ return
+ usr.client.anon_names()
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Anonymous Names"))
+
if("tripleAI")
if(!check_rights(R_FUN))
return
diff --git a/code/modules/admin/verbs/anonymousnames.dm b/code/modules/admin/verbs/anonymousnames.dm
new file mode 100644
index 00000000000..9b36e887f01
--- /dev/null
+++ b/code/modules/admin/verbs/anonymousnames.dm
@@ -0,0 +1,65 @@
+/client/proc/anon_names()
+ set category = "Admin - Events"
+ set name = "Setup Anonymous Names"
+
+
+ if(SSticker.current_state > GAME_STATE_PREGAME)
+ to_chat(usr, "This option is currently only usable during pregame.")
+ return
+
+ if(SSticker.anonymousnames)
+ SSticker.anonymousnames = ANON_DISABLED
+ to_chat(usr, "Disabled anonymous names.")
+ message_admins("[key_name_admin(usr)] has disabled anonymous names.")
+ return
+ var/list/names = list("Cancel", ANON_RANDOMNAMES, ANON_EMPLOYEENAMES)
+ var/result = input(usr, "Choose an anonymous theme","going dark") as null|anything in names
+ if(!usr || !result || result == "Cancel")
+ return
+ if(SSticker.current_state > GAME_STATE_PREGAME)
+ to_chat(usr, "You took too long! The game has started.")
+ return
+
+ SSticker.anonymousnames = result
+ to_chat(usr, "Enabled anonymous names. THEME: [SSticker.anonymousnames].")
+ message_admins("[key_name_admin(usr)] has enabled anonymous names. THEME: [SSticker.anonymousnames].")
+
+/**
+ * anonymous_name: generates a corporate random name. used in admin event tool anonymous names
+ *
+ * first letter is always a letter
+ * Example name = "Employee Q5460Z"
+ * Arguments:
+ * * M - mob for preferences and gender
+ */
+/proc/anonymous_name(mob/M)
+ switch(SSticker.anonymousnames)
+ if(ANON_RANDOMNAMES)
+ return M.client.prefs.pref_species.random_name(M.gender,1)
+ if(ANON_EMPLOYEENAMES)
+ var/name = "Employee "
+
+ for(var/i in 1 to 6)
+ if(prob(30) || i == 1)
+ name += ascii2text(rand(65, 90)) //A - Z
+ else
+ name += ascii2text(rand(48, 57)) //0 - 9
+ return name
+
+/**
+ * anonymous_ai_name: generates a corporate random name (but for sillycones). used in admin event tool anonymous names
+ *
+ * first letter is always a letter
+ * Example name = "Employee Assistant Assuming Delta"
+ * Arguments:
+ * * is_ai - boolean to decide whether the name has "Core" (AI) or "Assistant" (Cyborg)
+ */
+/proc/anonymous_ai_name(is_ai = FALSE)
+ switch(SSticker.anonymousnames)
+ if(ANON_RANDOMNAMES)
+ return pick(GLOB.ai_names)
+ if(ANON_EMPLOYEENAMES)
+ var/verbs = capitalize(pick(GLOB.ing_verbs))
+ var/phonetic = pick(GLOB.phonetic_alphabet)
+
+ return "Employee [is_ai ? "Core" : "Assistant"] [verbs] [phonetic]"
diff --git a/code/modules/admin/verbs/tripAI.dm b/code/modules/admin/verbs/tripAI.dm
index c74bc7b13d1..5efa306e317 100644
--- a/code/modules/admin/verbs/tripAI.dm
+++ b/code/modules/admin/verbs/tripAI.dm
@@ -1,20 +1,15 @@
-/client/proc/triple_ai()
- set category = "Admin - Events"
- set name = "Create AI Triumvirate"
-
- if(SSticker.current_state > GAME_STATE_PREGAME)
- to_chat(usr, "This option is currently only usable during pregame. This may change at a later date.", confidential = TRUE)
- return
-
- var/datum/job/job = SSjob.GetJob("AI")
- if(!job)
- to_chat(usr, "Unable to locate the AI job", confidential = TRUE)
- return
- if(SSticker.triai)
- SSticker.triai = 0
- to_chat(usr, "Only one AI will be spawned at round start.", confidential = TRUE)
- message_admins("[key_name_admin(usr)] has toggled off triple AIs at round start.")
- else
- SSticker.triai = 1
- to_chat(usr, "There will be an AI Triumvirate at round start.", confidential = TRUE)
- message_admins("[key_name_admin(usr)] has toggled on triple AIs at round start.")
+/client/proc/triple_ai()
+ set category = "Admin - Events"
+ set name = "Toggle AI Triumvirate"
+
+ if(SSticker.current_state > GAME_STATE_PREGAME)
+ to_chat(usr, "This option is currently only usable during pregame. This may change at a later date.", confidential = TRUE)
+ return
+
+ var/datum/job/job = SSjob.GetJob("AI")
+ if(!job)
+ to_chat(usr, "Unable to locate the AI job", confidential = TRUE)
+ return
+ SSticker.triai = !SSticker.triai
+ to_chat(usr, "There will [SSticker.triai ? "" : "not"] be an AI Triumvirate at round start.")
+ message_admins("[key_name_admin(usr)] has toggled [SSticker.triai ? "on" : "off"] triple AIs at round start.")
diff --git a/code/modules/jobs/job_types/ai.dm b/code/modules/jobs/job_types/ai.dm
index 0eca408139e..ccd18dd72a6 100644
--- a/code/modules/jobs/job_types/ai.dm
+++ b/code/modules/jobs/job_types/ai.dm
@@ -35,7 +35,10 @@
H.forceMove(lateJoinCore.loc)
qdel(lateJoinCore)
var/mob/living/silicon/ai/AI = H
- AI.apply_pref_name("ai", M.client) //If this runtimes oh well jobcode is fucked.
+ if(SSticker.anonymousnames)
+ AI.fully_replace_character_name(AI.real_name, anonymous_ai_name(is_ai = TRUE))
+ else
+ AI.apply_pref_name("ai", M.client) //If this runtimes oh well jobcode is fucked. //what is this no energy attitude man
AI.set_core_display_icon(null, M.client)
//we may have been created after our borg
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 1d4886e6609..ad3ebb912fb 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -476,6 +476,7 @@
var/mob/living/carbon/human/H = new(loc)
var/frn = CONFIG_GET(flag/force_random_names)
+ var/admin_anon_names = SSticker.anonymousnames
if(!frn)
frn = is_banned_from(ckey, "Appearance")
if(QDELETED(src))
@@ -484,6 +485,10 @@
client.prefs.random_character()
client.prefs.real_name = client.prefs.pref_species.random_name(gender,1)
+ if(admin_anon_names)//overrides random name because it achieves the same effect and is an admin enabled event tool
+ client.prefs.random_character()
+ client.prefs.real_name = anonymous_name(src)
+
var/is_antag
if(mind in GLOB.pre_setup_antags)
is_antag = TRUE
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 675c2953644..706c3c891e1 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -229,9 +229,11 @@
var/changed_name = ""
if(custom_name)
changed_name = custom_name
- if(changed_name == "" && C && C.prefs.custom_names["cyborg"] != DEFAULT_CYBORG_NAME)
- if(apply_pref_name("cyborg", C))
- return //built in camera handled in proc
+ if(SSticker.anonymousnames) //only robotic renames will allow for anything other than the anonymous one
+ changed_name = anonymous_ai_name(is_ai = FALSE)
+ if(!changed_name && C && C.prefs.custom_names["cyborg"] != DEFAULT_CYBORG_NAME)
+ apply_pref_name("cyborg", C)
+ return //built in camera handled in proc
if(!changed_name)
changed_name = get_standard_name()
diff --git a/tgstation.dme b/tgstation.dme
index fe374a6f6f9..646e0adef1c 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1288,6 +1288,7 @@
#include "code\modules\admin\verbs\adminjump.dm"
#include "code\modules\admin\verbs\adminpm.dm"
#include "code\modules\admin\verbs\adminsay.dm"
+#include "code\modules\admin\verbs\anonymousnames.dm"
#include "code\modules\admin\verbs\atmosdebug.dm"
#include "code\modules\admin\verbs\beakerpanel.dm"
#include "code\modules\admin\verbs\bluespacearty.dm"