From 85cfccf2d9f1a58f9f57fe7a7a5c53a2d0340563 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Fri, 19 Feb 2016 20:33:45 -0500 Subject: [PATCH] Refactors renaming so it works consistently --- code/__HELPERS/unsorted.dm | 102 --------- code/datums/datumvars.dm | 2 +- code/game/machinery/computer/ai_core.dm | 2 +- .../game/objects/items/devices/radio/radio.dm | 2 +- code/game/objects/items/robot/robot_parts.dm | 2 +- .../objects/items/robot/robot_upgrades.dm | 2 +- code/modules/mob/living/carbon/superheroes.dm | 4 +- code/modules/mob/living/silicon/ai/ai.dm | 32 ++- .../mob/living/silicon/ai/freelook/eye.dm | 4 +- .../mob/living/silicon/robot/drone/drone.dm | 14 +- .../modules/mob/living/silicon/robot/robot.dm | 215 +++++++++--------- code/modules/mob/living/silicon/silicon.dm | 9 +- code/modules/mob/mob_helpers.dm | 83 ++++++- code/modules/mob/transform_procs.dm | 2 +- 14 files changed, 228 insertions(+), 247 deletions(-) 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