diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index d6b0cf70932..773572cc0fc 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -272,108 +272,6 @@ Turf and target are seperate in case you want to teleport some distance from a t
user << "[target] is empty!"
return
-//This will update a mob's name, real_name, mind.name, data_core records, pda and id
-//Calling this proc without an oldname will only update the mob and skip updating the pda, id and records ~Carn
-/mob/proc/fully_replace_character_name(var/oldname,var/newname)
- if(!newname) return 0
- real_name = newname
- name = newname
- if(mind)
- mind.name = newname
- if(dna)
- dna.real_name = real_name
-
- if(isrobot(src))
- var/mob/living/silicon/robot/R = src
- if(oldname != real_name)
- R.notify_ai(3, oldname, newname)
- R.custom_name = newname
- R.updatename()
- if(oldname)
- //update the datacore records! This is goig to be a bit costly.
- for(var/list/L in list(data_core.general,data_core.medical,data_core.security,data_core.locked))
- for(var/datum/data/record/R in L)
- if(R.fields["name"] == oldname)
- R.fields["name"] = newname
- break
-
- //update our pda and id if we have them on our person
- var/list/searching = GetAllContents(searchDepth = 3)
- var/search_id = 1
- var/search_pda = 1
-
- for(var/A in searching)
- if( search_id && istype(A,/obj/item/weapon/card/id) )
- var/obj/item/weapon/card/id/ID = A
- if(ID.registered_name == oldname)
- ID.registered_name = newname
- ID.name = "[newname]'s ID Card ([ID.assignment])"
- if(!search_pda) break
- search_id = 0
-
- else if( search_pda && istype(A,/obj/item/device/pda) )
- var/obj/item/device/pda/PDA = A
- if(PDA.owner == oldname)
- PDA.owner = newname
- PDA.name = "PDA-[newname] ([PDA.ownjob])"
- if(!search_id) break
- search_pda = 0
-
- //Fixes renames not being reflected in objective text
- var/list/O = subtypesof(/datum/objective)
- var/length
- var/pos
- for(var/datum/objective/objective in O)
- if(objective.target != mind) continue
- length = lentext(oldname)
- pos = findtextEx(objective.explanation_text, oldname)
- objective.explanation_text = copytext(objective.explanation_text, 1, pos)+newname+copytext(objective.explanation_text, pos+length)
- return 1
-
-
-
-//Generalised helper proc for letting mobs rename themselves. Used to be clname() and ainame()
-//Last modified by Carn
-/mob/proc/rename_self(var/role, var/allow_numbers=0)
- spawn(0)
- var/oldname = real_name
-
- var/time_passed = world.time
- var/newname
-
- for(var/i=1,i<=3,i++) //we get 3 attempts to pick a suitable name.
- newname = input(src,"You are a [role]. Would you like to change your name to something else?", "Name change",oldname) as text
- if((world.time-time_passed)>300)
- return //took too long
- newname = reject_bad_name(newname,allow_numbers) //returns null if the name doesn't meet some basic requirements. Tidies up a few other things like bad-characters.
-
- for(var/mob/living/M in player_list)
- if(M == src)
- continue
- if(!newname || M.real_name == newname)
- newname = null
- break
- if(newname)
- break //That's a suitable name!
- src << "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken."
-
- if(!newname) //we'll stick with the oldname then
- return
-
- if(cmptext("ai",role))
- if(isAI(src))
- var/mob/living/silicon/ai/A = src
- oldname = null//don't bother with the records update crap
- //world << "[newname] is the AI!"
- //world << sound('sound/AI/newAI.ogg')
- // Set eyeobj name
- A.SetName(newname)
-
-
- fully_replace_character_name(oldname,newname)
-
-
-
//Picks a string of symbols to display as the law number for hacked or ion laws
/proc/ionnum()
return "[pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")]"
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index 89f4a277796..03cfa12f96d 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -450,7 +450,7 @@ client
if( !new_name || !M ) return
message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].")
- M.fully_replace_character_name(M.real_name,new_name)
+ M.rename_character(M.real_name, new_name)
href_list["datumrefresh"] = href_list["rename"]
else if(href_list["varnameedit"] && href_list["datumedit"])
diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm
index 59e6e6db8eb..147901907bd 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/machinery/computer/ai_core.dm
@@ -176,7 +176,7 @@
else
var/mob/living/silicon/ai/A = new /mob/living/silicon/ai ( loc, laws, brain )
if(A) //if there's no brain, the mob is deleted and a structure/AIcore is created
- A.rename_self("ai", 1)
+ A.rename_self("AI", 1)
feedback_inc("cyborg_ais_created",1)
qdel(src)
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 2ee3d7e88ac..078a3f3d58d 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -250,7 +250,7 @@ var/global/list/default_medbay_channels = list(
return
var/mob/living/silicon/ai/A = new /mob/living/silicon/ai(src, null, null, 1)
- A.SetName(from)
+ A.rename_character(A.real_name, from)
Broadcast_Message(connection, A,
0, "*garbled automated announcement*", src,
message, from, "Automated Announcement", from, "synthesized voice",
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 0471f0db1eb..44f2081d387 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -234,7 +234,7 @@
O.invisibility = 0
//Transfer debug settings to new mob
O.custom_name = created_name
- O.updatename("Default")
+ O.rename_character(O.real_name, O.get_default_name())
O.locked = panel_locked
if(!aisync)
lawsync = 0
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index a97ee46ea63..a650029b0e1 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -31,7 +31,7 @@
qdel(R.module)
R.module = null
R.camera.network.Remove(list("Engineering","Medical","Mining Outpost"))
- R.updatename("Default")
+ R.rename_character(R.real_name, R.get_default_name("Default"))
R.status_flags |= CANPUSH
R.languages = list()
R.speech_synthesizer_langs = list()
diff --git a/code/modules/mob/living/carbon/superheroes.dm b/code/modules/mob/living/carbon/superheroes.dm
index d98a72f8e98..f3f5fe13006 100644
--- a/code/modules/mob/living/carbon/superheroes.dm
+++ b/code/modules/mob/living/carbon/superheroes.dm
@@ -17,7 +17,7 @@
assign_id(H)
/datum/superheroes/proc/equip(var/mob/living/carbon/human/H)
- H.fully_replace_character_name(H.real_name, name)
+ H.rename_character(H.real_name, name)
for(var/obj/item/W in H)
if(istype(W,/obj/item/organ)) continue
H.unEquip(W)
@@ -218,7 +218,7 @@
for(var/obj/item/W in target)
if(istype(W,/obj/item/organ)) continue
target.unEquip(W)
- target.fully_replace_character_name(target.real_name, "Generic Henchman ([rand(1, 1000)])")
+ target.rename_character(target.real_name, "Generic Henchman ([rand(1, 1000)])")
target.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey/greytide(target), slot_w_uniform)
target.equip_to_slot_or_del(new /obj/item/clothing/shoes/black/greytide(target), slot_shoes)
target.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical/greytide(target), slot_l_hand)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index a9e4703a8ad..8509d59e547 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -114,7 +114,7 @@ var/list/ai_verbs_default = list(
pickedName = null
aiPDA = new/obj/item/device/pda/ai(src)
- SetName(pickedName)
+ rename_character(null, pickedName)
anchored = 1
canmove = 0
density = 1
@@ -204,19 +204,21 @@ var/list/ai_verbs_default = list(
job = "AI"
-/mob/living/silicon/ai/SetName(pickedName as text)
- ..()
+/mob/living/silicon/ai/rename_character(oldname, newname)
+ if(!..(oldname, newname))
+ return 0
- announcement.announcer = name
+ if(oldname != real_name)
+ announcement.announcer = name
- if(eyeobj)
- eyeobj.name = "[pickedName] (AI Eye)"
+ if(eyeobj)
+ eyeobj.name = "[newname] (AI Eye)"
- // Set ai pda name
- if(aiPDA)
- aiPDA.ownjob = "AI"
- aiPDA.owner = pickedName
- aiPDA.name = pickedName + " (" + aiPDA.ownjob + ")"
+ // Set ai pda name
+ if(aiPDA)
+ aiPDA.set_name_and_job(newname, "AI")
+
+ return 1
/mob/living/silicon/ai/Destroy()
ai_list -= src
@@ -998,3 +1000,11 @@ var/list/ai_verbs_default = list(
var/obj/item/weapon/rig/rig = src.get_rig()
if(rig)
rig.force_rest(src)
+
+/mob/living/silicon/ai/switch_to_camera(var/obj/machinery/camera/C)
+ if(!C.can_use() || !is_in_chassis())
+ return 0
+
+ eyeobj.setLoc(get_turf(C))
+ client.eye = eyeobj
+ return 1
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm
index ef0e1f712f8..6162ca31b33 100644
--- a/code/modules/mob/living/silicon/ai/freelook/eye.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm
@@ -139,9 +139,9 @@
if(!src.eyeobj)
src << "ERROR: Eyeobj not found. Creating new eye..."
- src.eyeobj = new(src.loc)
+ src.eyeobj = new(loc)
src.eyeobj.ai = src
- src.SetName(src.name)
+ src.rename_character(null, real_name)
if(client && client.eye)
client.eye = src
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index 005b1194821..c7ba0de8a64 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -82,18 +82,14 @@
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
//Redefining some robot procs...
-/mob/living/silicon/robot/drone/SetName(pickedName as text)
- // Would prefer to call the grandparent proc but this isn't possible, so..
- real_name = pickedName
- name = real_name
+/mob/living/silicon/robot/drone/rename_character(oldname, newname)
+ // force it to not actually change most things
+ return ..(newname, newname)
-//Redefining some robot procs...
-/mob/living/silicon/robot/drone/updatename()
- real_name = "maintenance drone ([rand(100,999)])"
- name = real_name
+/mob/living/silicon/robot/drone/get_default_name()
+ return "maintenance drone ([rand(100,999)])"
/mob/living/silicon/robot/drone/update_icons()
-
overlays.Cut()
if(stat == 0)
overlays += "eyes-[icon_state]"
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index a05c39f8c97..34ecf876574 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -101,7 +101,7 @@ var/list/robot_verbs_default = list(
robot_modules_background.icon_state = "block"
robot_modules_background.layer = 19 //Objects that appear on screen are on layer 20, UI should be just below it.
ident = rand(1, 999)
- updatename("Default")
+ rename_character(null, get_default_name())
update_icons()
update_headlamp()
@@ -159,9 +159,61 @@ var/list/robot_verbs_default = list(
playsound(loc, 'sound/voice/liveagain.ogg', 75, 1)
-/mob/living/silicon/robot/SetName(pickedName as text)
- custom_name = pickedName
- updatename()
+/mob/living/silicon/robot/rename_character(oldname, newname)
+ if(!..(oldname, newname))
+ return 0
+
+ if(oldname != real_name)
+ notify_ai(3, oldname, newname)
+ custom_name = (newname != get_default_name()) ? newname : null
+ setup_PDA()
+
+ //We also need to update name of internal camera.
+ if (camera)
+ camera.c_tag = newname
+
+ //Check for custom sprite
+ if(!custom_sprite)
+ var/file = file2text("config/custom_sprites.txt")
+ var/lines = text2list(file, "\n")
+
+ for(var/line in lines)
+ // split & clean up
+ var/list/Entry = text2list(line, ";")
+ for(var/i = 1 to Entry.len)
+ Entry[i] = trim(Entry[i])
+
+ if(Entry.len < 2)
+ continue;
+
+ if(Entry[1] == src.ckey && Entry[2] == src.real_name) //They're in the list? Custom sprite time, var and icon change required
+ custom_sprite = 1
+ icon = 'icons/mob/custom-synthetic.dmi'
+
+ return 1
+
+/mob/living/silicon/robot/proc/get_default_name(var/prefix as text)
+ if(prefix)
+ modtype = prefix
+ if(mmi)
+ if(istype(mmi, /obj/item/device/mmi/posibrain))
+ braintype = "Android"
+ else
+ braintype = "Cyborg"
+ else
+ braintype = "Robot"
+
+ if(custom_name)
+ return custom_name
+ else
+ return "[modtype] [braintype]-[num2text(ident)]"
+
+/mob/living/silicon/robot/verb/Namepick()
+ set category = "Robot Commands"
+ if(custom_name)
+ return 0
+
+ rename_self(braintype, 1)
/mob/living/silicon/robot/proc/sync()
if(lawupdate && connected_ai)
@@ -172,7 +224,7 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/proc/setup_PDA()
if (!rbPDA)
rbPDA = new/obj/item/device/pda/ai(src)
- rbPDA.set_name_and_job(custom_name,braintype)
+ rbPDA.set_name_and_job(real_name, braintype)
if(scrambledcodes)
var/datum/data/pda/app/messenger/M = rbPDA.find_program(/datum/data/pda/app/messenger)
if(M)
@@ -300,13 +352,12 @@ var/list/robot_verbs_default = list(
icon_state = "droidcombat"
if("Peacekeeper")
- module= new /obj/item/weapon/robot_module/peacekeeper(src)
+ module = new /obj/item/weapon/robot_module/peacekeeper(src)
icon_state = "droidpeace"
module.channels = list()
icon_state = "droidpeace"
if("Hunter")
- updatename(module)
module = new /obj/item/weapon/robot_module/alien/hunter(src)
hands.icon_state = "standard"
icon = "icons/mob/alien.dmi"
@@ -326,7 +377,7 @@ var/list/robot_verbs_default = list(
hands.icon_state = lowertext(modtype)
feedback_inc("cyborg_[lowertext(modtype)]",1)
- updatename()
+ rename_character(real_name, get_default_name())
if(modtype == "Medical" || modtype == "Security" || modtype == "Combat" || modtype == "Peacekeeper")
status_flags &= ~CANPUSH
@@ -335,64 +386,6 @@ var/list/robot_verbs_default = list(
radio.config(module.channels)
notify_ai(2)
-/mob/living/silicon/robot/proc/updatename(var/prefix as text)
- if(prefix)
- modtype = prefix
- if(mmi)
- if(istype(mmi, /obj/item/device/mmi/posibrain))
- braintype = "Android"
- else
- braintype = "Cyborg"
- else
- braintype = "Robot"
-
- var/changed_name = ""
- if(custom_name)
- changed_name = custom_name
- else
- changed_name = "[modtype] [braintype]-[num2text(ident)]"
- real_name = changed_name
- name = real_name
-
- // if we've changed our name, we also need to update the display name for our PDA
- setup_PDA()
-
- //We also need to update name of internal camera.
- if (camera)
- camera.c_tag = changed_name
-
- if(!custom_sprite) //Check for custom sprite
- var/file = file2text("config/custom_sprites.txt")
- var/lines = text2list(file, "\n")
-
- for(var/line in lines)
- // split & clean up
- var/list/Entry = text2list(line, ";")
- for(var/i = 1 to Entry.len)
- Entry[i] = trim(Entry[i])
-
- if(Entry.len < 2)
- continue;
-
- if(Entry[1] == src.ckey && Entry[2] == src.real_name) //They're in the list? Custom sprite time, var and icon change required
- custom_sprite = 1
- icon = 'icons/mob/custom-synthetic.dmi'
-
-/mob/living/silicon/robot/verb/Namepick()
- set category = "Robot Commands"
- if(custom_name)
- return 0
-
- spawn(0)
- var/newname
- newname = sanitize(copytext(input(src,"You are a robot. Enter a name, or leave blank for the default name.", "Name change","") as text,1,MAX_NAME_LEN))
- if (newname != "")
- notify_ai(3, name, newname)
- custom_name = newname
-
- updatename()
- update_icons()
-
//for borg hotkeys, here module refers to borg inv slot, not core module
/mob/living/silicon/robot/verb/cmd_toggle_module(module as num)
set name = "Toggle Module"
@@ -1303,7 +1296,37 @@ var/list/robot_verbs_default = list(
else
src << "Your icon has been set. You now require a module reset to change it."
+/mob/living/silicon/robot/proc/notify_ai(var/notifytype, var/oldname, var/newname)
+ if(!connected_ai)
+ return
+ switch(notifytype)
+ if(1) //New Cyborg
+ connected_ai << "
NOTICE - New cyborg connection detected: [name]
"
+ if(2) //New Module
+ connected_ai << "
NOTICE - Cyborg module change detected: [name] has loaded the [designation] module.
"
+ if(3) //New Name
+ connected_ai << "
NOTICE - Cyborg reclassification detected: [oldname] is now designated as [newname].
"
+
+/mob/living/silicon/robot/proc/disconnect_from_ai()
+ if(connected_ai)
+ sync() // One last sync attempt
+ connected_ai.connected_robots -= src
+ connected_ai = null
+
+/mob/living/silicon/robot/proc/connect_to_ai(var/mob/living/silicon/ai/AI)
+ if(AI && AI != connected_ai)
+ disconnect_from_ai()
+ connected_ai = AI
+ connected_ai.connected_robots |= src
+ notify_ai(1)
+ sync()
+
+/mob/living/silicon/robot/adjustOxyLoss(var/amount)
+ if (suiciding)
+ ..()
+
/mob/living/silicon/robot/deathsquad
+ base_icon = "nano_bloodhound"
icon_state = "nano_bloodhound"
lawupdate = 0
scrambledcodes = 1
@@ -1350,10 +1373,10 @@ var/list/robot_verbs_default = list(
return
/mob/living/silicon/robot/syndicate
+ base_icon = "syndie_bloodhound"
icon_state = "syndie_bloodhound"
lawupdate = 0
scrambledcodes = 1
- modtype = "Synd"
faction = list("syndicate")
designation = "Syndicate Assault"
modtype = "Syndicate"
@@ -1384,7 +1407,9 @@ var/list/robot_verbs_default = list(
playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0)
/mob/living/silicon/robot/syndicate/medical
+ base_icon = "syndi-medi"
icon_state = "syndi-medi"
+ modtype = "Syndicate Medical"
designation = "Syndicate Medical"
playstyle_string = "You are a Syndicate medical cyborg!
\
You are armed with powerful medical tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
@@ -1397,68 +1422,40 @@ var/list/robot_verbs_default = list(
..()
module = new /obj/item/weapon/robot_module/syndicate_medical(src)
-/mob/living/silicon/robot/proc/notify_ai(var/notifytype, var/oldname, var/newname)
- if(!connected_ai)
- return
- switch(notifytype)
- if(1) //New Cyborg
- connected_ai << "
NOTICE - New cyborg connection detected: [name]
"
- if(2) //New Module
- connected_ai << "
NOTICE - Cyborg module change detected: [name] has loaded the [designation] module.
"
- if(3) //New Name
- connected_ai << "
NOTICE - Cyborg reclassification detected: [oldname] is now designated as [newname].
"
-
-/mob/living/silicon/robot/proc/disconnect_from_ai()
- if(connected_ai)
- sync() // One last sync attempt
- connected_ai.connected_robots -= src
- connected_ai = null
-
-/mob/living/silicon/robot/proc/connect_to_ai(var/mob/living/silicon/ai/AI)
- if(AI && AI != connected_ai)
- disconnect_from_ai()
- connected_ai = AI
- connected_ai.connected_robots |= src
- notify_ai(1)
- sync()
-
-
-/mob/living/silicon/robot/combat/New()
- ..()
- module = new /obj/item/weapon/robot_module/combat(src)
- module.channels = list("Security" = 1)
+/mob/living/silicon/robot/combat
base_icon = "droidcombat"
icon_state = "droidcombat"
modtype = "Combat"
+ designation = "Combat"
+
+/mob/living/silicon/robot/combat/init()
+ ..()
+ module = new /obj/item/weapon/robot_module/combat(src)
+ module.channels = list("Security" = 1)
//languages
module.add_languages(src)
//subsystems
module.add_subsystems(src)
- updatename()
-
status_flags &= ~CANPUSH
radio.config(module.channels)
notify_ai(2)
-/mob/living/silicon/robot/peacekeeper/New()
- ..()
- module = new /obj/item/weapon/robot_module/peacekeeper(src)
+/mob/living/silicon/robot/peacekeeper
base_icon = "droidpeace"
icon_state = "droidpeace"
modtype = "Peacekeeper"
+ designation = "Peacekeeper"
+
+/mob/living/silicon/robot/peacekeeper/init()
+ ..()
+ module = new /obj/item/weapon/robot_module/peacekeeper(src)
//languages
module.add_languages(src)
//subsystems
module.add_subsystems(src)
- updatename()
-
status_flags &= ~CANPUSH
- notify_ai(2)
-
-/mob/living/silicon/robot/adjustOxyLoss(var/amount)
- if (suiciding)
- ..()
+ notify_ai(2)
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 0ca8b27c852..992f846c524 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -50,9 +50,14 @@
AH.unregister(src)
return ..()
-/mob/living/silicon/proc/SetName(pickedName as text)
- real_name = pickedName
+/mob/living/silicon/rename_character(oldname, newname)
+ // we actually don't want it changing minds and stuff
+ if(!newname)
+ return 0
+
+ real_name = newname
name = real_name
+ return 1
/mob/living/silicon/proc/show_laws()
return
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 5b432ddfd56..7f142bde81f 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -557,10 +557,85 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM)
check_eye(src)
return 1
-/mob/living/silicon/ai/switch_to_camera(var/obj/machinery/camera/C)
- if(!C.can_use() || !is_in_chassis())
+//This will update a mob's name, real_name, mind.name, data_core records, pda and id
+//Calling this proc without an oldname will only update the mob and skip updating the pda, id and records ~Carn
+/mob/proc/rename_character(oldname, newname)
+ if(!newname)
return 0
+ real_name = newname
+ name = newname
+ if(mind)
+ mind.name = newname
+ if(dna)
+ dna.real_name = real_name
- eyeobj.setLoc(get_turf(C))
- client.eye = eyeobj
+ if(oldname)
+ //update the datacore records! This is goig to be a bit costly.
+ for(var/list/L in list(data_core.general,data_core.medical,data_core.security,data_core.locked))
+ for(var/datum/data/record/R in L)
+ if(R.fields["name"] == oldname)
+ R.fields["name"] = newname
+ break
+
+ //update our pda and id if we have them on our person
+ var/list/searching = GetAllContents(searchDepth = 3)
+ var/search_id = 1
+ var/search_pda = 1
+
+ for(var/A in searching)
+ if( search_id && istype(A,/obj/item/weapon/card/id) )
+ var/obj/item/weapon/card/id/ID = A
+ if(ID.registered_name == oldname)
+ ID.registered_name = newname
+ ID.name = "[newname]'s ID Card ([ID.assignment])"
+ if(!search_pda) break
+ search_id = 0
+
+ else if( search_pda && istype(A,/obj/item/device/pda) )
+ var/obj/item/device/pda/PDA = A
+ if(PDA.owner == oldname)
+ PDA.owner = newname
+ PDA.name = "PDA-[newname] ([PDA.ownjob])"
+ if(!search_id) break
+ search_pda = 0
+
+ //Fixes renames not being reflected in objective text
+ var/list/O = subtypesof(/datum/objective)
+ var/length
+ var/pos
+ for(var/datum/objective/objective in O)
+ if(objective.target != mind) continue
+ length = lentext(oldname)
+ pos = findtextEx(objective.explanation_text, oldname)
+ objective.explanation_text = copytext(objective.explanation_text, 1, pos)+newname+copytext(objective.explanation_text, pos+length)
return 1
+
+//Generalised helper proc for letting mobs rename themselves. Used to be clname() and ainame()
+//Last modified by Carn
+/mob/proc/rename_self(var/role, var/allow_numbers=0)
+ spawn(0)
+ var/oldname = real_name
+
+ var/time_passed = world.time
+ var/newname
+
+ for(var/i=1,i<=3,i++) //we get 3 attempts to pick a suitable name.
+ newname = input(src,"You are a [role]. Would you like to change your name to something else?", "Name change",oldname) as text
+ if((world.time-time_passed)>300)
+ return //took too long
+ newname = reject_bad_name(newname,allow_numbers) //returns null if the name doesn't meet some basic requirements. Tidies up a few other things like bad-characters.
+
+ for(var/mob/living/M in player_list)
+ if(M == src)
+ continue
+ if(!newname || M.real_name == newname)
+ newname = null
+ break
+ if(newname)
+ break //That's a suitable name!
+ src << "Sorry, that [role]-name wasn't appropriate, please try another. It's possibly too long/short, has bad characters or is already taken."
+
+ if(!newname) //we'll stick with the oldname then
+ return
+
+ rename_character(oldname, newname)
\ No newline at end of file
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index f31b76639ed..26e2497ac0c 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -64,7 +64,7 @@
O.add_ai_verbs()
- O.rename_self("ai",1)
+ O.rename_self("AI",1)
spawn
qdel(src)
return O