diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 3a763818771b6..96bba3a97a2dd 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -775,6 +775,25 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) return TRUE return FALSE +/// Special handler for cyborg naming to check if cyborg name preferences match a name that has already been used. Returns TRUE if preferences are good to use and FALSE if not. +/mob/proc/check_cyborg_name(client/C, obj/item/mmi/mmi) + var/name = C?.prefs?.read_character_preference(/datum/preference/name/cyborg) + + //Name is original, add it to the list to prevent it from being used again and return TRUE + if(!(name in GLOB.cyborg_name_list)) + GLOB.cyborg_name_list += name + mmi.original_name = name + return TRUE + + //Name is not original, but is this the original user of the name? If so we still return TRUE but do not need to add it to the list + else if(name == mmi.original_name) + return TRUE + + //This name has already been taken and this is not the original user, return FALSE + else + to_chat(C.mob, "Cyborg name already used this round by another character, your name has been randomized") + return FALSE + /proc/view_or_range(distance = world.view , center = usr , type) switch(type) if("view") diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 73b9a2c418b4a..4daa7b969bfd6 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -52,7 +52,7 @@ GLOBAL_LIST_EMPTY(mob_config_movespeed_type_lookup) GLOBAL_LIST_EMPTY(emote_list) -GLOBAL_LIST_EMPTY(posi_key_list) +GLOBAL_LIST_EMPTY(cyborg_name_list) GLOBAL_LIST_INIT(construct_radial_images, list( CONSTRUCT_JUGGERNAUT = image(icon = 'icons/mob/cult.dmi', icon_state = "juggernaut"), diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 39545f1901143..7f4ca8766fdcc 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -504,5 +504,5 @@ mmi.brainmob.real_name = organic_name //the name of the brain inside the cyborg is the robotized human's name. mmi.brainmob.name = organic_name // If this checks fails, then the name will have been handled during initialization. - if(player_client.prefs.read_character_preference(/datum/preference/name/cyborg) != DEFAULT_CYBORG_NAME) + if(player_client.prefs.read_character_preference(/datum/preference/name/cyborg) != DEFAULT_CYBORG_NAME && check_cyborg_name(player_client, mmi)) apply_pref_name(/datum/preference/name/cyborg, player_client) diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index 143c013c4aefa..3c44231a81026 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -13,6 +13,8 @@ var/datum/ai_laws/laws = new() var/force_replace_ai_name = FALSE var/overrides_aicore_laws = FALSE // Whether the laws on the MMI, if any, override possible pre-existing laws loaded on the AI core. + ///Used to reserve an "original" cyborg name. When this mmi first becomes a cyborg, their name will be stored here in case of deconstruction. + var/original_name /obj/item/mmi/Initialize(mapload) . = ..() diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm index 826fade383784..4fba144a59161 100644 --- a/code/modules/mob/living/brain/posibrain.dm +++ b/code/modules/mob/living/brain/posibrain.dm @@ -94,9 +94,6 @@ GLOBAL_VAR(posibrain_notify_cooldown) return FALSE if(is_occupied() || QDELETED(brainmob) || QDELETED(src) || QDELETED(user)) return FALSE - if(user.ckey in GLOB.posi_key_list) - to_chat(user, "Positronic brain spawns limited to 1 per round.") - return FALSE if(!(GLOB.ghost_role_flags & GHOSTROLE_SILICONS)) to_chat(user, "Central Command has temporarily outlawed posibrain sentience in this sector...") return FALSE @@ -108,9 +105,7 @@ GLOBAL_VAR(posibrain_notify_cooldown) return FALSE if(brainmob.suiciding) //clear suicide status if the old occupant suicided. brainmob.set_suicide(FALSE) - var/ckey = user.ckey - if(transfer_personality(user)) - GLOB.posi_key_list += ckey + transfer_personality(user) var/datum/job/posibrain/pj = SSjob.GetJob(JOB_NAME_POSIBRAIN) pj.remove_posi_slot(src) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 39a1031d85993..b5152215a9b0a 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -297,8 +297,12 @@ if(custom_name) changed_name = custom_name if(changed_name == "" && C && C.prefs.read_character_preference(/datum/preference/name/cyborg) != DEFAULT_CYBORG_NAME) - if(apply_pref_name(/datum/preference/name/cyborg, C)) - return //built in camera handled in proc + if(check_cyborg_name(C, mmi)) + if(apply_pref_name(/datum/preference/name/cyborg, C)) + return //built in camera handled in proc + else + //Failed the vibe check on name theft, time to randomize it + changed_name = get_standard_name() if(!changed_name) changed_name = get_standard_name()