From ffa9bb51cd7b234e4df727aaae64ee745572286b Mon Sep 17 00:00:00 2001 From: carnie Date: Sat, 10 Aug 2013 10:10:45 +0100 Subject: [PATCH] Helper proc /proc/find_record(field, value, list/L) It will search list/L for a /datum/data/record with fields[field] == value, and return it. This removes a vast amount of copypasta (there's still so much left in there though). It also removes all the locate(\ref[record]) I could find, which were normal used with topic(), meaning it was susceptible to abuse. Secbots, ed209s and turrets are now smarter with their record-checks. They now prefer to use our face-name rather than id-name. ICly, this is the bot using facial recognition. This fixes an issue where it'd try to use the name variable which could be in the format "Unknown (as their id name)" when they were disfigured, etc. causing record-lookup to fail. Additionally, these bots will treat those without a valid record in the security database, to be treated like criminals. --- code/__HELPERS/lists.dm | 7 +- code/__HELPERS/unsorted.dm | 6 +- code/datums/datacore.dm | 18 +-- code/game/jobs/access.dm | 16 +- code/game/machinery/bots/ed209bot.dm | 18 +-- code/game/machinery/bots/secbot.dm | 18 +-- code/game/machinery/computer/card.dm | 19 +-- code/game/machinery/computer/cloning.dm | 44 +++--- code/game/machinery/computer/medical.dm | 123 ++++++++-------- code/game/machinery/portable_turret.dm | 16 +- code/game/objects/items/devices/PDA/cart.dm | 48 +++--- .../game/objects/items/devices/radio/radio.dm | 6 +- code/modules/admin/topic.dm | 2 +- code/modules/admin/verbs/randomverbs.dm | 6 +- code/modules/clothing/glasses/hud.dm | 63 +++----- .../mob/living/carbon/human/examine.dm | 20 +-- code/modules/mob/living/carbon/human/human.dm | 101 +++++-------- code/modules/mob/living/silicon/ai/ai.dm | 8 +- code/modules/mob/living/silicon/pai/hud.dm | 47 ++---- .../mob/living/silicon/pai/software.dm | 137 ++++++++---------- code/modules/paperwork/filingcabinet.dm | 14 +- 21 files changed, 284 insertions(+), 453 deletions(-) diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index e2e25b07a80..09081948d13 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -343,4 +343,9 @@ proc/listclearnulls(list/list) for(var/T in L) if(istype(T, type)) i++ - return i \ No newline at end of file + return i + +/proc/find_record(field, value, list/L) + for(var/datum/data/record/R in L) + if(R.fields[field] == value) + return R \ No newline at end of file diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 31bbd631c65..9d4cfcb870b 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -252,10 +252,8 @@ Turf and target are seperate in case you want to teleport some distance from a t 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 + var/datum/data/record/R = find_record("name", oldname, L) + if(R) R.fields["name"] = newname //update our pda and id if we have them on our person var/list/searching = GetAllContents(searchDepth = 3) diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 32cd3ab752a..9fc8ff1b449 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -8,18 +8,11 @@ return /obj/effect/datacore/proc/manifest_modify(var/name, var/assignment) - var/datum/data/record/foundrecord - - for(var/datum/data/record/t in data_core.general) - if(t.fields["name"] == name) - foundrecord = t - break - + var/datum/data/record/foundrecord = find_record("name", name, data_core.general) if(foundrecord) foundrecord.fields["rank"] = assignment - - +var/record_id_num = 1001 /obj/effect/datacore/proc/manifest_inject(var/mob/living/carbon/human/H) if(H.mind && (H.mind.assigned_role != "MODE")) var/assignment @@ -30,8 +23,9 @@ else assignment = "Unassigned" - var/id = num2hex(rand(1, 1.6777215E7),6) //this was the best they could come up with? A large random number? *sigh* + var/id = num2hex(record_id_num++,6) + //These records should ~really~ be merged or something //General Record var/datum/data/record/G = new() G.fields["id"] = id @@ -75,9 +69,9 @@ //Locked Record var/datum/data/record/L = new() - L.fields["id"] = md5("[H.real_name][H.mind.assigned_role]") + 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"] = H.mind.assigned_role + L.fields["rank"] = H.mind.assigned_role L.fields["age"] = H.age L.fields["sex"] = H.gender L.fields["blood_type"] = H.blood_type diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 816c5eae8a2..4188f137dfb 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -416,18 +416,10 @@ proc/get_all_job_icons() //For all existing HUD icons /proc/get_all_centcom_jobs() return list("VIP Guest","Custodian","Thunderdome Overseer","Centcom Official","Medical Officer","Death Commando","Research Officer","Special Ops Officer","Admiral","Centcom Commander") -/obj/proc/GetJobName() //Used in secHUD icon generation - if (!istype(src, /obj/item/device/pda) && !istype(src,/obj/item/weapon/card/id)) - return - - var/jobName - - if(istype(src, /obj/item/device/pda)) - if(src:id) - jobName = src:id:assignment - if(istype(src, /obj/item/weapon/card/id)) - jobName = src:assignment - +/obj/item/proc/GetJobName() //Used in secHUD icon generation + var/obj/item/weapon/card/id/I = GetID() + if(!I) return + var/jobName = I.assignment if(jobName in get_all_job_icons()) //Check if the job has a hud icon return jobName if(jobName in get_all_centcom_jobs()) //Return with the NT logo if it is a Centcom job diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm index 6ef2df78f21..3ba51076e7f 100644 --- a/code/game/machinery/bots/ed209bot.dm +++ b/code/game/machinery/bots/ed209bot.dm @@ -715,19 +715,11 @@ Auto Patrol: []"}, if(istype(perp:belt, /obj/item/weapon/gun/energy/laser/bluetag)) threatcount += 2 - if(src.check_records) - for (var/datum/data/record/E in data_core.general) - var/perpname = perp.name - if(perp.wear_id) - var/obj/item/weapon/card/id/id = perp.wear_id.GetID() - if(id) - perpname = id.registered_name - - if(E.fields["name"] == perpname) - for (var/datum/data/record/R in data_core.security) - if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "*Arrest*")) - threatcount = 4 - break + if(check_records) //check if they are set to *Arrest* on records + var/perpname = perp.get_face_name(perp.get_id_name()) + var/datum/data/record/R = find_record("name", perpname, data_core.security) + if(!R || (R.fields["criminal"] == "*Arrest*")) + threatcount += 4 if((src.idcheck) && (src.allowed(perp)) && !(src.lasercolor)) threatcount = 0//Corrupt cops cannot exist beep boop diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm index 15b484f1b7b..972549eb159 100644 --- a/code/game/machinery/bots/secbot.dm +++ b/code/game/machinery/bots/secbot.dm @@ -628,19 +628,11 @@ Auto Patrol: []"}, if(perp.wear_id && istype(perp:wear_id.GetID(), /obj/item/weapon/card/id/syndicate)) threatcount -= 2 - if(src.check_records) - for (var/datum/data/record/E in data_core.general) - var/perpname = perp.name - if(perp.wear_id) - var/obj/item/weapon/card/id/id = perp.wear_id.GetID() - if(id) - perpname = id.registered_name - - if(E.fields["name"] == perpname) - for (var/datum/data/record/R in data_core.security) - if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "*Arrest*")) - threatcount = 4 - break + if(check_records) //check if they are set to *Arrest* on records + var/perpname = perp.get_face_name(perp.get_id_name()) + var/datum/data/record/R = find_record("name", perpname, data_core.security) + if(!R || (R.fields["criminal"] == "*Arrest*")) + threatcount += 4 return threatcount diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index a009273ba4b..a8aeeb7668f 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -104,16 +104,11 @@ user.set_machine(src) var/dat - if (!( ticker )) - return + if(!ticker) return if (mode == 1) // accessing crew manifest var/crew = "" - var/list/L = list() - for (var/datum/data/record/t in data_core.general) - var/R = t.fields["name"] + " - " + t.fields["rank"] - L += R - for(var/R in sortList(L)) - crew += "[R]
" + for(var/datum/data/record/t in sortRecord(data_core.general)) + crew += t.fields["name"] + " - " + t.fields["rank"] + "
" dat = "Crew Manifest:
Please use security record computer to modify entries.

[crew]Print

Access ID modification console.
" else if(mode == 2) @@ -407,12 +402,8 @@ sleep(50) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( loc ) var/t1 = "Crew Manifest:
" - var/list/L = list() - for (var/datum/data/record/t in data_core.general) - var/R = t.fields["name"] + " - " + t.fields["rank"] - L += R - for(var/R in sortList(L)) - t1 += "[R]
" + for(var/datum/data/record/t in sortRecord(data_core.general)) + t1 += t.fields["name"] + " - " + t.fields["rank"] + "
" P.info = t1 P.name = "paper- 'Crew Manifest'" printing = null diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 94f48f4d9b0..63e0ccdc73e 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -140,8 +140,8 @@ if(2) dat += "

Current records

" dat += "<< Back

" - for(var/datum/data/record/R in src.records) - dat += "

[R.fields["name"]]

Scan ID [R.fields["id"]] View Record" + for(var/datum/data/record/R in records) + dat += "

[R.fields["name"]]

Scan ID [R.fields["id"]] View Record" if(3) dat += "

Selected Record

" dat += "<< Back
" @@ -150,7 +150,7 @@ dat += "Record not found." else dat += "

[src.active_record.fields["name"]]

" - dat += "Scan ID [src.active_record.fields["id"]] Clone
" + dat += "Scan ID [src.active_record.fields["id"]] Clone
" var/obj/item/weapon/implant/health/H = locate(src.active_record.fields["imp"]) @@ -226,16 +226,16 @@ else src.scanner.locked = 0 - else if (href_list["view_rec"]) - src.active_record = locate(href_list["view_rec"]) - if(istype(src.active_record,/datum/data/record)) - if (!active_record.fields["ckey"]) - del(src.active_record) + else if(href_list["view_rec"]) + src.active_record = find_record("id", href_list["view_rec"], records) + if(active_record) + if(!active_record.fields["ckey"]) + records -= active_record + active_record = null src.temp = "Record Corrupt" else src.menu = 3 else - src.active_record = null src.temp = "Record missing." else if (href_list["del_rec"]) @@ -250,8 +250,8 @@ if (istype(C)||istype(C, /obj/item/device/pda)) if(src.check_access(C)) src.temp = "[src.active_record.fields["name"]] => Record deleted." - src.records.Remove(src.active_record) - del(src.active_record) + src.records.Remove(active_record) + active_record = null src.menu = 2 else src.temp = "Access Denied." @@ -290,9 +290,9 @@ src.updateUsrDialog() else if (href_list["clone"]) - var/datum/data/record/C = locate(href_list["clone"]) + var/datum/data/record/C = find_record("id", href_list["clone"], records) //Look for that player! They better be dead! - if(istype(C)) + if(C) //Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs. if(!pod1) temp = "No Clonepod detected." @@ -305,7 +305,8 @@ else if(pod1.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"])) temp = "[C.fields["name"]] => Cloning cycle in progress..." records.Remove(C) - del(C) + if(active_record == C) + active_record = null menu = 1 else temp = "[C.fields["name"]] => Initialisation failure." @@ -336,11 +337,11 @@ if (NOCLONE in subject.mutations) scantemp = "Mental interface failure." return - if (!isnull(find_record(subject.ckey))) + if (find_record("ckey", subject.ckey, records)) scantemp = "Subject already in database." return - var/datum/data/record/R = new /datum/data/record() + var/datum/data/record/R = new() if(subject.dna) R.fields["mrace"] = subject.dna.mutantrace else @@ -355,7 +356,7 @@ //Add an implant if needed var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject) - if (isnull(imp)) + if(!imp) imp = new /obj/item/weapon/implant/health(subject) imp.implanted = subject R.fields["imp"] = "\ref[imp]" @@ -369,15 +370,6 @@ src.records += R scantemp = "Subject successfully scanned." -//Find a specific record by key. -/obj/machinery/computer/cloning/proc/find_record(var/find_key) - var/selected_record = null - for(var/datum/data/record/R in src.records) - if (R.fields["ckey"] == find_key) - selected_record = R - break - return selected_record - /obj/machinery/computer/cloning/update_icon() if(stat & BROKEN) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 98ccb3990fa..1053e006a5e 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -10,8 +10,8 @@ var/authenticated = null var/rank = null var/screen = null - var/datum/data/record/active1 = null - var/datum/data/record/active2 = null + var/datum/data/record/active1 + var/datum/data/record/active2 var/a_id = null var/temp = null var/printing = null @@ -45,20 +45,20 @@ "} if(2.0) dat += "Record List:
" - if(!isnull(data_core.general)) + if(data_core.general) for(var/datum/data/record/R in sortRecord(data_core.general)) - dat += text("[]: []
", src, R, R.fields["id"], R.fields["name"]) + dat += "
[R.fields["id"]]: [R.fields["name"]]
" //Foreach goto(132) dat += text("
Back", src) if(3.0) dat += text("Records Maintenance
\nBackup To Disk
\nUpload From disk
\nDelete All Records
\n
\nBack", src, src, src, src) if(4.0) dat += "
Medical Record

" - if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1))) + if(active1 in data_core.general) dat += text("Name: [] ID: []
\nSex: []
\nAge: []
\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", src.active1.fields["name"], src.active1.fields["id"], src, src.active1.fields["sex"], src, src.active1.fields["age"], src, src.active1.fields["fingerprint"], src, src.active1.fields["p_stat"], src, src.active1.fields["m_stat"]) else dat += "General Record Lost!
" - if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2))) + if(active2 in data_core.medical) dat += text("
\n
Medical Data

\nBlood Type: []
\nDNA: []
\n
\nMinor Disabilities: []
\nDetails: []
\n
\nMajor Disabilities: []
\nDetails: []
\n
\nAllergies: []
\nDetails: []
\n
\nCurrent Diseases: [] (per disease info placed in log/comment section)
\nDetails: []
\n
\nImportant Notes:
\n\t[]
\n
\n
Comments/Log

", src, src.active2.fields["blood_type"], src, src.active2.fields["b_dna"], src, src.active2.fields["mi_dis"], src, src.active2.fields["mi_dis_d"], src, src.active2.fields["ma_dis"], src, src.active2.fields["ma_dis_d"], src, src.active2.fields["alg"], src, src.active2.fields["alg_d"], src, src.active2.fields["cdi"], src, src.active2.fields["cdi_d"], src, src.active2.fields["notes"]) var/counter = 1 while(src.active2.fields[text("com_[]", counter)]) @@ -114,10 +114,11 @@ /obj/machinery/computer/med_data/Topic(href, href_list) if(..()) return - if (!( data_core.general.Find(src.active1) )) + if(!(active1 in data_core.general)) src.active1 = null - if (!( data_core.medical.Find(src.active2) )) + if(!(active2 in data_core.medical)) src.active2 = null + if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) usr.set_machine(src) if (href_list["temp"]) @@ -161,7 +162,7 @@ src.active1 = null src.active2 = null - if(href_list["vir"]) + else if(href_list["vir"]) var/type = href_list["vir"] var/datum/disease/Dis = new type(0) var/AfS = "" @@ -177,111 +178,108 @@

Severity: [Dis.severity]"} - if (href_list["del_all"]) + else if (href_list["del_all"]) src.temp = text("Are you sure you wish to delete all records?
\n\tYes
\n\tNo
", src, src) - if (href_list["del_all2"]) - for(var/datum/data/record/R in data_core.medical) - //R = null - del(R) - //Foreach goto(494) + else if (href_list["del_all2"]) + data_core.medical.Cut() src.temp = "All records deleted." - if (href_list["field"]) + else if (href_list["field"]) var/a1 = src.active1 var/a2 = src.active2 switch(href_list["field"]) if("fingerprint") - if (istype(src.active1, /datum/data/record)) + if(active1) var/t1 = copytext(sanitize(input("Please input fingerprint hash:", "Med. records", src.active1.fields["fingerprint"], null) as text),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) return src.active1.fields["fingerprint"] = t1 if("sex") - if (istype(src.active1, /datum/data/record)) + if(active1) if (src.active1.fields["sex"] == "Male") src.active1.fields["sex"] = "Female" else src.active1.fields["sex"] = "Male" if("age") - if (istype(src.active1, /datum/data/record)) + if(active1) var/t1 = input("Please input age:", "Med. records", src.active1.fields["age"], null) as num if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) return src.active1.fields["age"] = t1 if("mi_dis") - if (istype(src.active2, /datum/data/record)) + if(active2) var/t1 = copytext(sanitize(input("Please input minor disabilities list:", "Med. records", src.active2.fields["mi_dis"], null) as text),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["mi_dis"] = t1 if("mi_dis_d") - if (istype(src.active2, /datum/data/record)) + if(active2) var/t1 = copytext(sanitize(input("Please summarize minor dis.:", "Med. records", src.active2.fields["mi_dis_d"], null) as message),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["mi_dis_d"] = t1 if("ma_dis") - if (istype(src.active2, /datum/data/record)) + if(active2) var/t1 = copytext(sanitize(input("Please input major diabilities list:", "Med. records", src.active2.fields["ma_dis"], null) as text),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["ma_dis"] = t1 if("ma_dis_d") - if (istype(src.active2, /datum/data/record)) + if(active2) var/t1 = copytext(sanitize(input("Please summarize major dis.:", "Med. records", src.active2.fields["ma_dis_d"], null) as message),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["ma_dis_d"] = t1 if("alg") - if (istype(src.active2, /datum/data/record)) + if(active2) var/t1 = copytext(sanitize(input("Please state allergies:", "Med. records", src.active2.fields["alg"], null) as text),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["alg"] = t1 if("alg_d") - if (istype(src.active2, /datum/data/record)) + if(active2) var/t1 = copytext(sanitize(input("Please summarize allergies:", "Med. records", src.active2.fields["alg_d"], null) as message),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["alg_d"] = t1 if("cdi") - if (istype(src.active2, /datum/data/record)) + if(active2) var/t1 = copytext(sanitize(input("Please state diseases:", "Med. records", src.active2.fields["cdi"], null) as text),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["cdi"] = t1 if("cdi_d") - if (istype(src.active2, /datum/data/record)) + if(active2) var/t1 = copytext(sanitize(input("Please summarize diseases:", "Med. records", src.active2.fields["cdi_d"], null) as message),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["cdi_d"] = t1 if("notes") - if (istype(src.active2, /datum/data/record)) + if(active2) var/t1 = copytext(sanitize(input("Please summarize notes:", "Med. records", src.active2.fields["notes"], null) as message),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["notes"] = t1 if("p_stat") - if (istype(src.active1, /datum/data/record)) + if(active1) src.temp = text("Physical Condition:
\n\t*Deceased*
\n\t*Unconscious*
\n\tActive
\n\tPhysically Unfit
", src, src, src, src) if("m_stat") - if (istype(src.active1, /datum/data/record)) + if(active1) src.temp = text("Mental Condition:
\n\t*Insane*
\n\t*Unstable*
\n\t*Watch*
\n\tStable
", src, src, src, src) if("blood_type") - if (istype(src.active2, /datum/data/record)) + if(active2) src.temp = text("Blood Type:
\n\tA- A+
\n\tB- B+
\n\tAB- AB+
\n\tO- O+
", src, src, src, src, src, src, src, src) if("b_dna") - if (istype(src.active1, /datum/data/record)) + if(active1) var/t1 = copytext(sanitize(input("Please input DNA hash:", "Med. records", src.active1.fields["dna"], null) as text),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) return src.active1.fields["dna"] = t1 else - if (href_list["p_stat"]) - if (src.active1) + else if (href_list["p_stat"]) + if(active1) switch(href_list["p_stat"]) if("deceased") src.active1.fields["p_stat"] = "*Deceased*" @@ -292,8 +290,8 @@ if("unfit") src.active1.fields["p_stat"] = "Physically Unfit" - if (href_list["m_stat"]) - if (src.active1) + else if (href_list["m_stat"]) + if(active1) switch(href_list["m_stat"]) if("insane") src.active1.fields["m_stat"] = "*Insane*" @@ -305,8 +303,8 @@ src.active1.fields["m_stat"] = "Stable" - if (href_list["blood_type"]) - if (src.active2) + else if (href_list["blood_type"]) + if(active2) switch(href_list["blood_type"]) if("an") src.active2.fields["blood_type"] = "A-" @@ -326,31 +324,24 @@ src.active2.fields["blood_type"] = "O+" - if (href_list["del_r"]) - if (src.active2) + else if (href_list["del_r"]) + if(active2) src.temp = text("Are you sure you wish to delete the record (Medical Portion Only)?
\n\tYes
\n\tNo
", src, src) - if (href_list["del_r2"]) - if (src.active2) - //src.active2 = null - del(src.active2) + else if (href_list["del_r2"]) + if(active2) + data_core.medical -= active2 + active2 = null - if (href_list["d_rec"]) - var/datum/data/record/R = locate(href_list["d_rec"]) - var/datum/data/record/M = locate(href_list["d_rec"]) - if (!( data_core.general.Find(R) )) - src.temp = "Record Not Found!" - return - for(var/datum/data/record/E in data_core.medical) - if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) - M = E - else - //Foreach continue //goto(2540) - src.active1 = R - src.active2 = M - src.screen = 4 + else if (href_list["d_rec"]) + active1 = find_record("id", href_list["d_rec"], data_core.general) + if(active1) + active2 = find_record("id", href_list["d_rec"], data_core.medical) + if(!active2) + active1 = null + screen = 4 - if (href_list["new"]) + else if (href_list["new"]) if ((istype(src.active1, /datum/data/record) && !( istype(src.active2, /datum/data/record) ))) var/datum/data/record/R = new /datum/data/record( ) R.fields["name"] = src.active1.fields["name"] @@ -371,8 +362,8 @@ src.active2 = R src.screen = 4 - if (href_list["add_c"]) - if (!( istype(src.active2, /datum/data/record) )) + else if (href_list["add_c"]) + if(!(active2 in data_core.medical)) return var/a2 = src.active2 var/t1 = copytext(sanitize(input("Add Comment:", "Med. records", null, null) as message),1,MAX_MESSAGE_LEN) @@ -383,11 +374,11 @@ counter++ src.active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [], 2053
[]", src.authenticated, src.rank, time2text(world.realtime, "DDD MMM DD hh:mm:ss"), t1) - if (href_list["del_c"]) + else if (href_list["del_c"]) if ((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])])) src.active2.fields[text("com_[]", href_list["del_c"])] = "Deleted" - if (href_list["search"]) + else if (href_list["search"]) var/t1 = input("Search String: (Name, DNA, or ID)", "Med. records", null, null) as text if ((!( t1 ) || usr.stat || !( src.authenticated ) || usr.restrained() || ((!in_range(src, usr)) && (!istype(usr, /mob/living/silicon))))) return @@ -409,17 +400,17 @@ //Foreach continue //goto(3334) src.screen = 4 - if (href_list["print_p"]) + else if (href_list["print_p"]) if (!( src.printing )) src.printing = 1 sleep(50) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( src.loc ) P.info = "
Medical Record

" - if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1))) + if(active1 in data_core.general) P.info += text("Name: [] ID: []
\nSex: []
\nAge: []
\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", src.active1.fields["name"], src.active1.fields["id"], src.active1.fields["sex"], src.active1.fields["age"], src.active1.fields["fingerprint"], src.active1.fields["p_stat"], src.active1.fields["m_stat"]) else P.info += "General Record Lost!
" - if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2))) + if(active2 in data_core.medical) P.info += text("
\n
Medical Data

\nBlood Type: []
\nDNA: []
\n
\nMinor Disabilities: []
\nDetails: []
\n
\nMajor Disabilities: []
\nDetails: []
\n
\nAllergies: []
\nDetails: []
\n
\nCurrent Diseases: [] (per disease info placed in log/comment section)
\nDetails: []
\n
\nImportant Notes:
\n\t[]
\n
\n
Comments/Log

", src.active2.fields["blood_type"], src.active2.fields["b_dna"], src.active2.fields["mi_dis"], src.active2.fields["mi_dis_d"], src.active2.fields["ma_dis"], src.active2.fields["ma_dis_d"], src.active2.fields["alg"], src.active2.fields["alg_d"], src.active2.fields["cdi"], src.active2.fields["cdi_d"], src.active2.fields["notes"]) var/counter = 1 while(src.active2.fields[text("com_[]", counter)]) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 0c2a6ed6b07..0baa0912377 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -552,18 +552,10 @@ threatcount += 2 if(check_records) //if the turret can check the records, check if they are set to *Arrest* on records - for(var/datum/data/record/E in data_core.general) - var/perpname = perp.name - if(perp.wear_id) - var/obj/item/weapon/card/id/id = perp.wear_id.GetID() - if(id) - perpname = id.registered_name - - if(E.fields["name"] == perpname) - for(var/datum/data/record/R in data_core.security) - if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "*Arrest*")) - threatcount = 4 - break + var/perpname = perp.get_face_name(perp.get_id_name()) + var/datum/data/record/R = find_record("name", perpname, data_core.security) + if(!R || (R.fields["criminal"] == "*Arrest*")) + threatcount += 4 return threatcount diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index bcb0becb287..6b947bedfed 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -273,7 +273,7 @@ Code: menu = "

Crew Manifest

" menu += "Entries cannot be modified from this terminal.

" - if(!isnull(data_core.general)) + if(data_core.general) for (var/datum/data/record/t in sortRecord(data_core.general)) menu += "[t.fields["name"]] - [t.fields["rank"]]
" menu += "
" @@ -347,14 +347,14 @@ Code: if (44) //medical records //This thing only displays a single screen so it's hard to really get the sub-menu stuff working. menu = "

Medical Record List

" - if(!isnull(data_core.general)) - for (var/datum/data/record/R in sortRecord(data_core.general)) - menu += "[R.fields["id"]]: [R.fields["name"]]
" + if(data_core.general) + for(var/datum/data/record/R in sortRecord(data_core.general)) + menu += "
[R.fields["id"]]: [R.fields["name"]]
" menu += "
" if(441) menu = "

Medical Record

" - if (istype(active1, /datum/data/record) && (active1 in data_core.general)) + if(active1 in data_core.general) menu += "Name: [active1.fields["name"]] ID: [active1.fields["id"]]
" menu += "Sex: [active1.fields["sex"]]
" menu += "Age: [active1.fields["age"]]
" @@ -368,7 +368,7 @@ Code: menu += "
" menu += "

Medical Data

" - if (istype(active2, /datum/data/record) && (active2 in data_core.medical)) + if(active2 in data_core.medical) menu += "Blood Type: [active2.fields["blood_type"]]

" menu += "Minor Disabilities: [active2.fields["mi_dis"]]
" @@ -390,15 +390,15 @@ Code: menu += "
" if (45) //security records menu = "

Security Record List

" - if(!isnull(data_core.general)) + if(data_core.general) for (var/datum/data/record/R in sortRecord(data_core.general)) - menu += "
[R.fields["id"]]: [R.fields["name"]]
" + menu += "
[R.fields["id"]]: [R.fields["name"]]
" menu += "
" if(451) menu = "

Security Record

" - if (istype(active1, /datum/data/record) && (active1 in data_core.general)) + if(active1 in data_core.general) menu += "Name: [active1.fields["name"]] ID: [active1.fields["id"]]
" menu += "Sex: [active1.fields["sex"]]
" menu += "Age: [active1.fields["age"]]
" @@ -412,7 +412,7 @@ Code: menu += "
" menu += "

Security Data

" - if (istype(active3, /datum/data/record) && (active3 in data_core.security)) + if(active3 in data_core.security) menu += "Criminal Status: [active3.fields["criminal"]]
" menu += "Minor Crimes: [active3.fields["mi_crim"]]
" @@ -624,30 +624,22 @@ Code: switch(href_list["choice"]) if("Medical Records") - var/datum/data/record/R = locate(href_list["target"]) - var/datum/data/record/M = locate(href_list["target"]) + active1 = find_record("id", href_list["target"], data_core.general) + if(active1) + active2 = find_record("id", href_list["target"], data_core.medical) loc:mode = 441 mode = 441 - if (R in data_core.general) - for (var/datum/data/record/E in data_core.medical) - if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) - M = E - break - active1 = R - active2 = M + if(!active2) + active1 = null if("Security Records") - var/datum/data/record/R = locate(href_list["target"]) - var/datum/data/record/S = locate(href_list["target"]) + active1 = find_record("id", href_list["target"], data_core.general) + if(active1) + active3 = find_record("id", href_list["target"], data_core.security) loc:mode = 451 mode = 451 - if (R in data_core.general) - for (var/datum/data/record/E in data_core.security) - if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) - S = E - break - active1 = R - active3 = S + if(!active3) + active1 = null if("Send Signal") spawn( 0 ) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 1a0ffa821f6..ba3f735f151 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -262,11 +262,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use // --- Human: use their job as seen on the crew manifest - makes it unneeded to carry an ID for an AI to see their job if (ishuman(M)) var/voice = M.GetVoice() // Why reinvent the wheel when there is a proc that does nice things already - var/datum/data/record/findjob - for (var/datum/data/record/t in data_core.general) - if(t.fields["name"] == voice) - findjob = t - break + var/datum/data/record/findjob = find_record("name", voice, data_core.general) if(voice != real_name) displayname = voice diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index d0e4d15b2ba..fe69df3e180 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2082,7 +2082,7 @@ var/dat = "Showing Crew Manifest.
" dat += "" for(var/datum/data/record/t in data_core.general) - dat += text("", t.fields["name"], t.fields["rank"]) + dat += "" dat += "
NamePosition
[][]
[t.fields["name"]][t.fields["rank"]]
" usr << browse(dat, "window=manifest;size=440x410") if("DNA") diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 8d4119c0da4..dcd267b8a63 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -297,10 +297,8 @@ Traitors and the like can also be revived with the previous role mostly intact. /*Try and locate a record for the person being respawned through data_core. This isn't an exact science but it does the trick more often than not.*/ var/id = md5("[G_found.real_name][G_found.mind.assigned_role]") - for(var/datum/data/record/t in data_core.locked) - if(t.fields["id"]==id) - record_found = t//We shall now reference the record. - break + + record_found = find_record("id", id, data_core.locked) if(record_found)//If they have a record we can determine a few things. new_character.real_name = record_found.fields["name"] diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 1561bf2ab0d..ca72119dc57 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -104,55 +104,38 @@ var/client/C = M.client var/image/holder for(var/mob/living/carbon/human/perp in view(M)) - if(!C) continue - var/perpname = "wot" holder = perp.hud_list[ID_HUD] + holder.icon_state = "hudno_id" if(perp.wear_id) - var/obj/item/weapon/card/id/I = perp.wear_id.GetID() - if(I) - perpname = I.registered_name - holder.icon_state = "hud[ckey(I.GetJobName())]" - C.images += holder - else - perpname = perp.name - holder.icon_state = "hudno_id" - C.images += holder - else - perpname = perp.name - holder.icon_state = "hudno_id" - C.images += holder + holder.icon_state = "hud[ckey(perp.wear_id.GetJobName())]" + C.images += holder + - for(var/datum/data/record/E in data_core.general) - if(E.fields["name"] == perpname) - holder = perp.hud_list[WANTED_HUD] - for (var/datum/data/record/R in data_core.security) - if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "*Arrest*")) - holder.icon_state = "hudwanted" - C.images += holder - break - else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Incarcerated")) - holder.icon_state = "hudincarcerated" - C.images += holder - break - else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Parolled")) - holder.icon_state = "hudparolled" - C.images += holder - break - else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Released")) - holder.icon_state = "hudreleased" - C.images += holder - break for(var/obj/item/weapon/implant/I in perp) if(I.implanted) if(istype(I,/obj/item/weapon/implant/tracking)) holder = perp.hud_list[IMPTRACK_HUD] holder.icon_state = "hud_imp_tracking" - C.images += holder - if(istype(I,/obj/item/weapon/implant/loyalty)) + else if(istype(I,/obj/item/weapon/implant/loyalty)) holder = perp.hud_list[IMPLOYAL_HUD] holder.icon_state = "hud_imp_loyal" - C.images += holder - if(istype(I,/obj/item/weapon/implant/chem)) + else if(istype(I,/obj/item/weapon/implant/chem)) holder = perp.hud_list[IMPCHEM_HUD] holder.icon_state = "hud_imp_chem" - C.images += holder \ No newline at end of file + else + continue + C.images += holder + + var/perpname = perp.get_face_name(perp.get_id_name("")) + if(perpname) + var/datum/data/record/R = find_record("name", perpname, data_core.security) + if(R) + holder = perp.hud_list[WANTED_HUD] + switch(R.fields["criminal"]) + if("*Arrest*") holder.icon_state = "hudwanted" + if("Incarcerated") holder.icon_state = "hudincarcerated" + if("Parolled") holder.icon_state = "hudparolled" + if("Released") holder.icon_state = "hudreleased" + else + return + C.images += holder \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index e292afcceed..608cef17e34 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -276,25 +276,13 @@ if(usr.stat || H != usr) //|| !usr.canmove || usr.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at. return //Non-fluff: This allows sec to set people to arrest as they get disarmed or beaten - var/perpname = "wot" var/criminal = "None" - if(wear_id) - var/obj/item/weapon/card/id/I = wear_id.GetID() - if(I) - perpname = I.registered_name - else - perpname = name - else - perpname = name - + var/perpname = H.get_face_name(H.get_id_name("")) if(perpname) - for (var/datum/data/record/E in data_core.general) - if(E.fields["name"] == perpname) - for (var/datum/data/record/R in data_core.security) - if(R.fields["id"] == E.fields["id"]) - criminal = R.fields["criminal"] - + var/datum/data/record/R = find_record("name", perpname, data_core.security) + if(R) + criminal = R.fields["criminal"] msg += "Criminal status:
\[[criminal]\]\n" //msg += "\[Set Hostile Identification\]\n" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index fa14e72d7b6..3262f5e2df2 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -396,74 +396,65 @@ //gets assignment from ID or ID inside PDA or PDA itself //Useful when player do something with computers /mob/living/carbon/human/proc/get_assignment(var/if_no_id = "No id", var/if_no_job = "No job") - var/obj/item/device/pda/pda = wear_id - var/obj/item/weapon/card/id/id = wear_id - if (istype(pda)) - if (pda.id && istype(pda.id, /obj/item/weapon/card/id)) - . = pda.id.assignment - else - . = pda.ownjob - else if (istype(id)) + var/obj/item/weapon/card/id/id = get_idcard() + if(id) . = id.assignment else - return if_no_id - if (!.) - . = if_no_job - return + var/obj/item/device/pda/pda = wear_id + if(istype(pda)) + . = pda.ownjob + else + return if_no_id + if(!.) + return if_no_job //gets name from ID or ID inside PDA or PDA itself //Useful when player do something with computers /mob/living/carbon/human/proc/get_authentification_name(var/if_no_id = "Unknown") + var/obj/item/weapon/card/id/id = get_idcard() + if(id) + return id.registered_name var/obj/item/device/pda/pda = wear_id - var/obj/item/weapon/card/id/id = wear_id - if (istype(pda)) - if (pda.id) - . = pda.id.registered_name - else - . = pda.owner - else if (istype(id)) - . = id.registered_name - else - return if_no_id - return + if(istype(pda)) + return pda.owner + return if_no_id //repurposed proc. Now it combines get_id_name() and get_face_name() to determine a mob's name variable. Made into a seperate proc as it'll be useful elsewhere /mob/living/carbon/human/proc/get_visible_name() - if( wear_mask && (wear_mask.flags_inv&HIDEFACE) ) //Wearing a mask which hides our face, use id-name if possible - return get_id_name("Unknown") - if( head && (head.flags_inv&HIDEFACE) ) - return get_id_name("Unknown") //Likewise for hats var/face_name = get_face_name() var/id_name = get_id_name("") + if(id_name && (id_name != face_name)) return "[face_name] (as [id_name])" return face_name //Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable -/mob/living/carbon/human/proc/get_face_name() +/mob/living/carbon/human/proc/get_face_name(if_no_face="Unknown") + if( wear_mask && (wear_mask.flags_inv&HIDEFACE) ) //Wearing a mask which hides our face, use id-name if possible + return if_no_face + if( head && (head.flags_inv&HIDEFACE) ) + return if_no_face //Likewise for hats var/datum/limb/O = get_organ("head") if( (status_flags&DISFIGURED) || (O.brutestate+O.burnstate)>2 || cloneloss>50 || !real_name ) //disfigured. use id-name if possible - return "Unknown" + return if_no_face return real_name //gets name from ID or PDA itself, ID inside PDA doesn't matter //Useful when player is being seen by other mobs /mob/living/carbon/human/proc/get_id_name(var/if_no_id = "Unknown") + var/obj/item/weapon/storage/wallet/wallet = wear_id var/obj/item/device/pda/pda = wear_id var/obj/item/weapon/card/id/id = wear_id - if(istype(pda)) . = pda.owner - else if(istype(id)) . = id.registered_name - if(!.) . = if_no_id //to prevent null-names making the mob unclickable + if(istype(wallet)) id = wallet.front_id + if(istype(id)) . = id.registered_name + else if(istype(pda)) . = pda.owner + if(!.) . = if_no_id //to prevent null-names making the mob unclickable return //gets ID card object from special clothes slot or null. /mob/living/carbon/human/proc/get_idcard() - var/obj/item/weapon/card/id/id = wear_id - var/obj/item/device/pda/pda = wear_id - if (istype(pda) && pda.id) - id = pda.id - if (istype(id)) - return id + if(wear_id) + return wear_id.GetID() //Added a safety check in case you want to shock a human mob directly through electrocute_act. /mob/living/carbon/human/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/safety = 0) @@ -535,31 +526,19 @@ var/modified = 0 - var/perpname = "wot" - if(wear_id) - var/obj/item/weapon/card/id/I = wear_id.GetID() - if(I) - perpname = I.registered_name - else - perpname = name - else - perpname = name - + var/perpname = H.get_face_name(H.get_id_name("")) if(perpname) - for (var/datum/data/record/E in data_core.general) - if (E.fields["name"] == perpname) - for (var/datum/data/record/R in data_core.security) - if (R.fields["id"] == E.fields["id"]) + var/datum/data/record/R = find_record("name", perpname, data_core.security) + if(R) + var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Parolled", "Released", "Cancel") + if(R) + if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud)) + if(setcriminal != "Cancel") + R.fields["criminal"] = setcriminal + modified = 1 - var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Parolled", "Released", "Cancel") - - if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud)) - if(setcriminal != "Cancel") - R.fields["criminal"] = setcriminal - modified = 1 - - spawn() - H.handle_regular_hud_updates() + spawn() + H.handle_regular_hud_updates() if(!modified) usr << "\red Unable to locate a data core entry for this person." diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index eb051aca74a..4a1efcfe614 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -214,12 +214,8 @@ var/list/ai_list = list() set name = "Show Crew Manifest" var/dat = "Crew RosterCrew Roster:

" - var/list/L = list() - for (var/datum/data/record/t in data_core.general) - var/R = t.fields["name"] + " - " + t.fields["rank"] - L += R - for(var/R in sortList(L)) - dat += "[R]
" + for(var/datum/data/record/t in sortRecord(data_core.general)) + dat += t.fields["name"] + " - " + t.fields["rank"] + "
" dat += "" src << browse(dat, "window=airoster") diff --git a/code/modules/mob/living/silicon/pai/hud.dm b/code/modules/mob/living/silicon/pai/hud.dm index f374aebbc78..07ea2fbc9e1 100644 --- a/code/modules/mob/living/silicon/pai/hud.dm +++ b/code/modules/mob/living/silicon/pai/hud.dm @@ -9,42 +9,25 @@ var/image/holder var/turf/T = get_turf(src.loc) for(var/mob/living/carbon/human/perp in view(T)) - var/perpname = "wot" holder = perp.hud_list[ID_HUD] + holder.icon_state = "hudno_id" if(perp.wear_id) - var/obj/item/weapon/card/id/I = perp.wear_id.GetID() - if(I) - perpname = I.registered_name - holder.icon_state = "hud[ckey(perp:wear_id:GetJobName())]" - client.images += holder - else - perpname = perp.name - holder.icon_state = "hudno_id" - client.images += holder - else - holder.icon_state = "hudno_id" - client.images += holder + holder.icon_state = "hud[ckey(perp:wear_id:GetJobName())]" + client.images += holder - for(var/datum/data/record/E in data_core.general) - if(E.fields["name"] == perpname) + var/perpname = perp.get_face_name(perp.get_id_name("")) + if(perpname) + var/datum/data/record/R = find_record("name", perpname, data_core.security) + if(R) holder = perp.hud_list[WANTED_HUD] - for (var/datum/data/record/R in data_core.security) - if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "*Arrest*")) - holder.icon_state = "hudwanted" - client.images += holder - break - else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Incarcerated")) - holder.icon_state = "hudincarcerated" - client.images += holder - break - else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Parolled")) - holder.icon_state = "hudparolled" - client.images += holder - break - else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Released")) - holder.icon_state = "hudreleased" - client.images += holder - break + switch(R.fields["criminal"]) + if("*Arrest*") holder.icon_state = "hudwanted" + if("Incarcerated") holder.icon_state = "hudincarcerated" + if("Parolled") holder.icon_state = "hudparolled" + if("Released") holder.icon_state = "hudreleased" + else + return + client.images += holder /mob/living/silicon/pai/proc/medicalHUD() if(client) diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 3d076b547d8..544e8fe5610 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -218,33 +218,22 @@ // Accessing medical records if("medicalrecord") - if(src.subscreen == 1) - var/datum/data/record/record = locate(href_list["med_rec"]) - if(record) - var/datum/data/record/R = record - var/datum/data/record/M = record - if (!( data_core.general.Find(R) )) - src.temp = "Unable to locate requested medical record. Record may have been deleted, or never have existed." - else - for(var/datum/data/record/E in data_core.medical) - if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) - M = E - src.medicalActive1 = R - src.medicalActive2 = M + if(subscreen == 1) + medicalActive1 = find_record("id", href_list["med_rec"], data_core.general) + if(medicalActive1) + medicalActive2 = find_record("id", href_list["med_rec"], data_core.medical) + if(!medicalActive2) + medicalActive1 = null + temp = "Unable to locate requested security record. Record may have been deleted, or never have existed." + if("securityrecord") - if(src.subscreen == 1) - var/datum/data/record/record = locate(href_list["sec_rec"]) - if(record) - var/datum/data/record/R = record - var/datum/data/record/M = record - if (!( data_core.general.Find(R) )) - src.temp = "Unable to locate requested security record. Record may have been deleted, or never have existed." - else - for(var/datum/data/record/E in data_core.security) - if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) - M = E - src.securityActive1 = R - src.securityActive2 = M + if(subscreen == 1) + securityActive1 = find_record("id", href_list["sec_rec"], data_core.general) + if(securityActive1) + securityActive2 = find_record("id", href_list["sec_rec"], data_core.security) + if(!securityActive2) + securityActive1 = null + temp = "Unable to locate requested security record. Record may have been deleted, or never have existed." if("securityhud") if(href_list["toggle"]) src.secHUD = !src.secHUD @@ -410,70 +399,64 @@ // Crew Manifest /mob/living/silicon/pai/proc/softwareManifest() - var/dat = "" - dat += "

Crew Manifest



" - var/list/L = list() - if(!isnull(data_core.general)) - for (var/datum/data/record/t in sortRecord(data_core.general)) - var/R = t.fields["name"] + " - " + t.fields["rank"] - L += R - for(var/R in sortList(L)) - dat += "[R]
" - dat += "" - return dat + . += "

Crew Manifest



" + if(data_core.general) + for(var/datum/data/record/t in sortRecord(data_core.general)) + . += "[t.fields["name"]] - [t.fields["rank"]]" + . += "" + return . // Medical Records /mob/living/silicon/pai/proc/softwareMedicalRecord() - var/dat = "" - if(src.subscreen == 0) - dat += "

Medical Records


" - if(!isnull(data_core.general)) - for(var/datum/data/record/R in sortRecord(data_core.general)) - dat += text("[]: []
", src, R, R.fields["id"], R.fields["name"]) - //dat += text("
Back", src) - if(src.subscreen == 1) - dat += "
Medical Record

" - if ((istype(src.medicalActive1, /datum/data/record) && data_core.general.Find(src.medicalActive1))) - dat += text("Name: [] ID: []
\nSex: []
\nAge: []
\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", - src.medicalActive1.fields["name"], src.medicalActive1.fields["id"], src.medicalActive1.fields["sex"], src.medicalActive1.fields["age"], src.medicalActive1.fields["fingerprint"], src.medicalActive1.fields["p_stat"], src.medicalActive1.fields["m_stat"]) - else - dat += "
Requested medical record not found.

" - if ((istype(src.medicalActive2, /datum/data/record) && data_core.medical.Find(src.medicalActive2))) - dat += text("
\n
Medical Data

\nBlood Type: []
\nDNA: []
\n
\nMinor Disabilities: []
\nDetails: []
\n
\nMajor Disabilities: []
\nDetails: []
\n
\nAllergies: []
\nDetails: []
\n
\nCurrent Diseases: [] (per disease info placed in log/comment section)
\nDetails: []
\n
\nImportant Notes:
\n\t[]
\n
\n
Comments/Log

", src, src.medicalActive2.fields["blood_type"], src, src.medicalActive2.fields["b_dna"], src, src.medicalActive2.fields["mi_dis"], src, src.medicalActive2.fields["mi_dis_d"], src, src.medicalActive2.fields["ma_dis"], src, src.medicalActive2.fields["ma_dis_d"], src, src.medicalActive2.fields["alg"], src, src.medicalActive2.fields["alg_d"], src, src.medicalActive2.fields["cdi"], src, src.medicalActive2.fields["cdi_d"], src, src.medicalActive2.fields["notes"]) - else - dat += "
Requested medical record not found.

" - dat += text("
\nBack
", src) - return dat + switch(subscreen) + if(0) + . += "

Medical Records


" + if(data_core.general) + for(var/datum/data/record/R in sortRecord(data_core.general)) + . += "[R.fields["id"]]: [R.fields["name"]]
" + if(1) + . += "
Medical Record

" + if(medicalActive1 in data_core.general) + . += "Name: [medicalActive1.fields["name"]] ID: [medicalActive1.fields["id"]]
\nSex: [medicalActive1.fields["sex"]]
\nAge: [medicalActive1.fields["age"]]
\nFingerprint: [medicalActive1.fields["fingerprint"]]
\nPhysical Status: [medicalActive1.fields["p_stat"]]
\nMental Status: [medicalActive1.fields["m_stat"]]
" + else + . += "
Requested medical record not found.

" + if(medicalActive2 in data_core.medical) + . += "
\n
Medical Data

\nBlood Type:
[medicalActive2.fields["blood_type"]]
\nDNA: [medicalActive2.fields["b_dna"]]
\n
\nMinor Disabilities: [medicalActive2.fields["mi_dis"]]
\nDetails: [medicalActive2.fields["mi_dis_d"]]
\n
\nMajor Disabilities: [medicalActive2.fields["ma_dis"]]
\nDetails: [medicalActive2.fields["ma_dis_d"]]
\n
\nAllergies: [medicalActive2.fields["alg"]]
\nDetails: [medicalActive2.fields["alg_d"]]
\n
\nCurrent Diseases: [medicalActive2.fields["cdi"]] (per disease info placed in log/comment section)
\nDetails: [medicalActive2.fields["cdi_d"]]
\n
\nImportant Notes:
\n\t[medicalActive2.fields["notes"]]
\n
\n
Comments/Log

" + else + . += "
Requested medical record not found.

" + . += "
\nBack
" + return . // Security Records /mob/living/silicon/pai/proc/softwareSecurityRecord() - var/dat = "" - if(src.subscreen == 0) - dat += "

Security Records


" - if(!isnull(data_core.general)) - for(var/datum/data/record/R in sortRecord(data_core.general)) - dat += text("[]: []
", src, R, R.fields["id"], R.fields["name"]) - if(src.subscreen == 1) - dat += "

Security Record

" - if ((istype(src.securityActive1, /datum/data/record) && data_core.general.Find(src.securityActive1))) - dat += text("Name:
[] ID: []
\nSex: []
\nAge: []
\nRank: []
\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", src, src.securityActive1.fields["name"], src, src.securityActive1.fields["id"], src, src.securityActive1.fields["sex"], src, src.securityActive1.fields["age"], src, src.securityActive1.fields["rank"], src, src.securityActive1.fields["fingerprint"], src.securityActive1.fields["p_stat"], src.securityActive1.fields["m_stat"]) - else - dat += "
Requested security record not found,

" - if ((istype(src.securityActive2, /datum/data/record) && data_core.security.Find(src.securityActive2))) - dat += text("
\nSecurity Data
\nCriminal Status: []
\n
\nMinor Crimes: []
\nDetails: []
\n
\nMajor Crimes: []
\nDetails: []
\n
\nImportant Notes:
\n\t[]
\n
\n
Comments/Log

", src.securityActive2.fields["criminal"], src, src.securityActive2.fields["mi_crim"], src, src.securityActive2.fields["mi_crim_d"], src, src.securityActive2.fields["ma_crim"], src, src.securityActive2.fields["ma_crim_d"], src, src.securityActive2.fields["notes"]) - else - dat += "
Requested security record not found,

" - dat += text("
\nBack
", src) - return dat + . = "" + switch(subscreen) + if(0) + . += "

Security Records


" + if(data_core.general) + for(var/datum/data/record/R in sortRecord(data_core.general)) + . += "[R.fields["id"]]: [R.fields["name"]]
" + if(1) + . += "

Security Record

" + if(securityActive1 in data_core.general) + . += "Name:
[securityActive1.fields["name"]] ID: [securityActive1.fields["id"]]
\nSex: [securityActive1.fields["sex"]]
\nAge: [securityActive1.fields["age"]]
\nRank: [securityActive1.fields["rank"]]
\nFingerprint: [securityActive1.fields["fingerprint"]]
\nPhysical Status: [securityActive1.fields["p_stat"]]
\nMental Status: [securityActive1.fields["m_stat"]]
" + else + . += "
Requested security record not found,

" + if(securityActive2 in data_core.security) + . += "
\nSecurity Data
\nCriminal Status: [securityActive2.fields["criminal"]]
\n
\nMinor Crimes: [securityActive2.fields["mi_crim"]]
\nDetails: [securityActive2.fields["mi_crim_d"]]
\n
\nMajor Crimes: [securityActive2.fields["ma_crim"]]
\nDetails: [securityActive2.fields["ma_crim_d"]]
\n
\nImportant Notes:
\n\t[securityActive2.fields["notes"]]
\n
\n
Comments/Log

" + else + . += "
Requested security record not found,

" + . += text("
\nBack
", src) + return . // Universal Translator /mob/living/silicon/pai/proc/softwareTranslator() - var/dat = {"

Universal Translator


+ . = {"

Universal Translator


When enabled, this device will automatically convert all spoken and written language into a format that any known recipient can understand.

The device is currently [ (src.universal_speak) ? "en" : "dis" ]abled.
Toggle Device
"} - return dat + return . // Security HUD /mob/living/silicon/pai/proc/facialRecognition() diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index cf8b0e2cff8..4d662aea876 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -91,11 +91,8 @@ /obj/structure/filingcabinet/security/attack_hand(mob/user) if(virgin) for(var/datum/data/record/G in data_core.general) - var/datum/data/record/S - for(var/datum/data/record/R in data_core.security) - if((R.fields["name"] == G.fields["name"] || R.fields["id"] == G.fields["id"])) - S = R - break + var/datum/data/record/S = find_record("name", G.fields["name"], data_core.security) + if(!S) continue var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src) P.info = "
Security Record

" P.info += "Name: [G.fields["name"]] ID: [G.fields["id"]]
\nSex: [G.fields["sex"]]
\nAge: [G.fields["age"]]
\nFingerprint: [G.fields["fingerprint"]]
\nPhysical Status: [G.fields["p_stat"]]
\nMental Status: [G.fields["m_stat"]]
" @@ -120,11 +117,8 @@ /obj/structure/filingcabinet/medical/attack_hand(mob/user) if(virgin) for(var/datum/data/record/G in data_core.general) - var/datum/data/record/M - for(var/datum/data/record/R in data_core.medical) - if((R.fields["name"] == G.fields["name"] || R.fields["id"] == G.fields["id"])) - M = R - break + var/datum/data/record/M = find_record("name", G.fields["name"], data_core.medical) + if(!M) continue var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src) P.info = "
Medical Record

" P.info += "Name: [G.fields["name"]] ID: [G.fields["id"]]
\nSex: [G.fields["sex"]]
\nAge: [G.fields["age"]]
\nFingerprint: [G.fields["fingerprint"]]
\nPhysical Status: [G.fields["p_stat"]]
\nMental Status: [G.fields["m_stat"]]
"