diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 51f34cf712..867c6a9594 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -142,18 +142,14 @@
var/static/list/show_directions = list(SOUTH, WEST)
if(H.mind && (H.mind.assigned_role != H.mind.special_role) && (H.mind.assigned_role != "Stowaway"))
var/assignment
- var/displayed_rank
if(H.mind.assigned_role)
assignment = H.mind.assigned_role
else if(H.job)
assignment = H.job
else
assignment = "Unassigned"
- if(C && C.prefs && C.prefs.alt_titles_preferences[assignment])
- assignment = C.prefs.alt_titles_preferences[assignment]
-
- if(assignment)
- displayed_rank = C.prefs.alt_titles_preferences[assignment]
+ if(C && C.prefs && C.prefs.alt_titles_preferences[assignment])
+ assignment = C.prefs.alt_titles_preferences[assignment]
var/static/record_id_num = 1001
var/id = num2hex(record_id_num++,6)
@@ -176,10 +172,8 @@
var/datum/data/record/G = new()
G.fields["id"] = id
G.fields["name"] = H.real_name
- if(!displayed_rank)
- G.fields["rank"] = assignment
- else
- G.fields["rank"] = "[displayed_rank], [assignment]"
+ G.fields["rank"] = assignment
+ G.fields["real_rank"] = GetJobName(assignment)
G.fields["age"] = H.age
G.fields["species"] = H.dna.species.name
G.fields["fingerprint"] = md5(H.dna.uni_identity)
@@ -226,7 +220,8 @@
var/datum/data/record/L = new()
L.fields["id"] = md5("[H.real_name][H.mind.assigned_role]") //surely this should just be id, like the others?
L.fields["name"] = H.real_name
- L.fields["rank"] = displayed_rank
+ L.fields["rank"] = assignment
+ L.fields["real_rank"] = GetJobName(assignment)
L.fields["age"] = H.age
if(H.gender == MALE)
G.fields["gender"] = "Male"
diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm
index e7d8afd1f1..45046e3070 100644
--- a/code/datums/world_topic.dm
+++ b/code/datums/world_topic.dm
@@ -26,7 +26,7 @@
var/require_comms_key = FALSE
/datum/world_topic/proc/TryRun(list/input, addr)
- key_valid = config && (CONFIG_GET(string/comms_key) == input["key"])
+ key_valid = (CONFIG_GET(string/comms_key) == input["key"]) && CONFIG_GET(string/comms_key) && input["key"]
if(require_comms_key && !key_valid)
return "Bad Key"
input -= "key"
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 6322bbf7e9..4e462a7ebf 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -175,7 +175,12 @@
| Gender: | [active1.fields["gender"]] |
| Age: | [active1.fields["age"]] |
"}
dat += "| Species: | [active1.fields["species"]] |
"
- dat += {"| Rank: | [active1.fields["rank"]] |
+ var/record_rank = GetJobName(active1.fields["rank"])
+ var/datum/job/job_datum = SSjob.name_occupations[record_rank]
+ var/how_many_alts = job_datum ? length(job_datum.alt_titles) : null
+ dat += {"| Rank: | [active1.fields["rank"]]
+
+ Change title ([how_many_alts + 1] options) |
| Fingerprint: | [active1.fields["fingerprint"]] |
| Physical Status: | [active1.fields["p_stat"]] |
| Mental Status: | [active1.fields["m_stat"]] |
@@ -692,23 +697,44 @@ What a mess.*/
temp += "Discharged"
temp += ""
if("rank")
- if(istype(active1, /datum/data/record) && ((ACCESS_CAPTAIN in logged_access) || (ACCESS_HOP in logged_access)))
+ if(istype(active1, /datum/data/record) && ((ACCESS_CAPTAIN in logged_access) || (ACCESS_HOP in logged_access) || (ACCESS_CENT_GENERAL in logged_access)))
temp = "Rank:
"
temp += ""
for(var/rank in get_all_jobs())
- temp += "- [rank]
"
+ temp += "- [rank]"
+ var/datum/job/job_datum = SSjob.name_occupations[rank]
+ if(job_datum && length(job_datum.alt_titles))
+ var/how_many_alts = length(job_datum.alt_titles)
+ temp += "Use Title ([how_many_alts + 1] options)"
+ temp += "
"
temp += "
"
else
alert(usr, "You do not have the required rank to do this!")
+ if("alt_title")
+ if(istype(active1, /datum/data/record) && ((ACCESS_CAPTAIN in logged_access) || (ACCESS_HOP in logged_access) || (ACCESS_CENT_GENERAL in logged_access)))
+ temp = "Rank Title:
"
+ temp += ""
+ var/chosen_rank = href_list["rank"]
+ temp += "- [chosen_rank]
"
+ var/datum/job/job_datum = SSjob.name_occupations[chosen_rank]
+ if(job_datum && length(job_datum.alt_titles))
+ for(var/rank in job_datum.alt_titles)
+ temp += "- [rank]
"
+ else
+ temp += "- We're very sorry, there was an internal error fetching titles. Report to centcom error: null_job_or_no_titles
"
+ temp += "
"
+ else
+ alert(usr, "You do not have the required rank to do this!")
+
//TEMPORARY MENU FUNCTIONS
else//To properly clear as per clear screen.
temp=null
switch(href_list["choice"])
if("Change Rank")
if(active1)
- active1.fields["rank"] = href_list["rank"]
- if(href_list["rank"] in get_all_jobs())
- active1.fields["real_rank"] = href_list["real_rank"]
+ if(GetJobName(href_list["rank"]) != "Unknown" && GetJobName(href_list["rank"]) != "Centcom") // hi hello you looking, stop trying to exploit html
+ active1.fields["rank"] = href_list["rank"]
+ active1.fields["real_rank"] = GetJobName(href_list["rank"])
if("Change Criminal Status")
if(active2)
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 2ab86e349c..2834486643 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -1014,7 +1014,7 @@
log_admin("[key_name(usr)] stuffed [frommob.key] into [tomob.name].")
SSblackbox.record_feedback("tally", "admin_verb", 1, "Ghost Drag Control")
- tomob.ckey = frommob.ckey
+ tomob.key = frommob.key
qdel(frommob)
return TRUE
diff --git a/code/modules/mob/dead/observer/respawn.dm b/code/modules/mob/dead/observer/respawn.dm
index bf7ed9658f..10b20291ea 100644
--- a/code/modules/mob/dead/observer/respawn.dm
+++ b/code/modules/mob/dead/observer/respawn.dm
@@ -190,5 +190,5 @@
client.view_size.resetToDefault()
var/mob/dead/new_player/M = new /mob/dead/new_player
- M.ckey = ckey
+ M.key = key
return M
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 44f8236aac..3ccc6e6c4b 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -1032,7 +1032,7 @@
if(GLOB.announcement_systems.len)
// Sends an announcement the AI has cryoed.
var/obj/machinery/announcement_system/announcer = pick(GLOB.announcement_systems)
- announcer.announce("CRYOSTORAGE", src.real_name, announce_rank, announce_rank, list())
+ announcer.announce("CRYOSTORAGE", real_name, announce_rank, announce_rank, list())
new /obj/structure/ai_core/latejoin_inactive(loc)
if(src.mind)
//Handle job slot/tater cleanup.
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index fcf9b0fa8c..7c4f0fd510 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -538,7 +538,7 @@
client.prefs.chat_toggles ^= CHAT_OOC
if (!(client.prefs.chat_toggles & CHAT_OOC) && isdead(new_mob))
client.prefs.chat_toggles ^= CHAT_OOC
- new_mob.ckey = ckey
+ new_mob.key = key
if(send_signal)
SEND_SIGNAL(src, COMSIG_MOB_KEY_CHANGE, new_mob, src)
//splurt changeh
diff --git a/html/changelogs/archive/2024-12.yml b/html/changelogs/archive/2024-12.yml
index fbbb750665..d2af91f493 100644
--- a/html/changelogs/archive/2024-12.yml
+++ b/html/changelogs/archive/2024-12.yml
@@ -36,3 +36,10 @@
- bugfix: Misc things, like removing the bombs
- rscadd: Medical patient rooms, for "fun"
- rscadd: A work-around fix for medical having issues monitoring crew
+2024-12-04:
+ SandPoot:
+ - rscadd: Higher staff can now set titles for you on the manifest using the security
+ console.
+ - bugfix: Manifest will no longer have people with null jobs.
+ - bugfix: High security vulnerability, you can no longer set your rank to be anything
+ (see pr for info).