diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm
index d991cd4825..604c9cb1ff 100644
--- a/code/modules/client/preference_setup/general/01_basic.dm
+++ b/code/modules/client/preference_setup/general/01_basic.dm
@@ -12,6 +12,7 @@ datum/preferences/proc/set_biological_gender(var/gender)
/datum/category_item/player_setup_item/general/basic/load_character(var/savefile/S)
S["real_name"] >> pref.real_name
+ S["nickname"] >> pref.nickname
S["name_is_always_random"] >> pref.be_random_name
S["gender"] >> pref.biological_gender
S["id_gender"] >> pref.identifying_gender
@@ -21,6 +22,7 @@ datum/preferences/proc/set_biological_gender(var/gender)
/datum/category_item/player_setup_item/general/basic/save_character(var/savefile/S)
S["real_name"] << pref.real_name
+ S["nickname"] << pref.nickname
S["name_is_always_random"] << pref.be_random_name
S["gender"] << pref.biological_gender
S["id_gender"] << pref.identifying_gender
@@ -35,6 +37,7 @@ datum/preferences/proc/set_biological_gender(var/gender)
pref.real_name = sanitize_name(pref.real_name, pref.species, is_FBP())
if(!pref.real_name)
pref.real_name = random_name(pref.identifying_gender, pref.species)
+ pref.nickname = sanitize_name(pref.nickname)
pref.spawnpoint = sanitize_inlist(pref.spawnpoint, spawntypes, initial(pref.spawnpoint))
pref.be_random_name = sanitize_integer(pref.be_random_name, 0, 1, initial(pref.be_random_name))
@@ -53,6 +56,8 @@ datum/preferences/proc/set_biological_gender(var/gender)
if(character.dna)
character.dna.real_name = character.real_name
+ character.nickname = pref.nickname
+
character.gender = pref.biological_gender
character.identifying_gender = pref.identifying_gender
character.age = pref.age
@@ -62,7 +67,9 @@ datum/preferences/proc/set_biological_gender(var/gender)
. += "Name: "
. += "[pref.real_name]
"
. += "Randomize Name
"
- . += "Always Random Name: [pref.be_random_name ? "Yes" : "No"]"
+ . += "Always Random Name: [pref.be_random_name ? "Yes" : "No"]
"
+ . += "Nickname: "
+ . += "[pref.nickname]"
. += "
"
. += "Biological Gender: [gender2text(pref.biological_gender)]
"
. += "Gender Identity: [gender2text(pref.identifying_gender)]
"
@@ -92,6 +99,17 @@ datum/preferences/proc/set_biological_gender(var/gender)
pref.be_random_name = !pref.be_random_name
return TOPIC_REFRESH
+ else if(href_list["nickname"])
+ var/raw_nickname = input(user, "Choose your character's nickname:", "Character Nickname") as text|null
+ if (!isnull(raw_nickname) && CanUseTopic(user))
+ var/new_nickname = sanitize_name(raw_nickname, pref.species, is_FBP())
+ if(new_nickname)
+ pref.nickname = new_nickname
+ return TOPIC_REFRESH
+ else
+ user << "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and ."
+ return TOPIC_NOACTION
+
else if(href_list["bio_gender"])
var/new_gender = input(user, "Choose your character's biological gender:", "Character Preference", pref.biological_gender) as null|anything in get_genders()
if(new_gender && CanUseTopic(user))
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 4709fb3e81..23ad2d7409 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -25,6 +25,7 @@ datum/preferences
//character preferences
var/real_name //our character's name
var/be_random_name = 0 //whether we are a random name every round
+ var/nickname //our character's nickname
var/age = 30 //age of character
var/spawnpoint = "Arrivals Shuttle" //where this character will spawn (0-2).
var/b_type = "A+" //blood type (not-chooseable)
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index 3a451bff44..c2a7b5668a 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -88,6 +88,8 @@
// Checks if the mob's own name is included inside message. Handles both first and last names.
/mob/proc/check_mentioned(var/message)
var/list/valid_names = splittext(real_name, " ") // Should output list("John", "Doe") as an example.
+ var/list/nicknames = splittext(nickname, " ")
+ valid_names += nicknames
valid_names += special_mentions()
for(var/name in valid_names)
if(findtext(message, regex("\\b[name]\\b", "i"))) // This is to stop 'ai' from triggering if someone says 'wait'.
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index e296db2ab9..716a5d62c2 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -67,6 +67,7 @@
var/stuttering = null //Carbon
var/slurring = null //Carbon
var/real_name = null
+ var/nickname = null
var/flavor_text = ""
var/med_record = ""
var/sec_record = ""