diff --git a/code/_globalvars/station.dm b/code/_globalvars/station.dm index fe655216354..e8512549c1c 100644 --- a/code/_globalvars/station.dm +++ b/code/_globalvars/station.dm @@ -1,4 +1,4 @@ -var/global/obj/effect/datacore/data_core = null +var/global/datum/datacore/data_core = null //var/global/defer_powernet_rebuild = 0 // true if net rebuild will be called manually after an event //Noble idea, but doing this made GC fail. The gains from waiting on deffering are lost by using del() diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index e04adb83d04..4014d4eb0eb 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -1,6 +1,5 @@ -/obj/effect/datacore - name = "datacore" +/datum/datacore var/medical[] = list() var/medicalPrintCount = 0 var/general[] = list() @@ -25,7 +24,7 @@ var/time = "" var/dataId = 0 -/obj/effect/datacore/proc/createCrimeEntry(cname = "", cdetails = "", author = "", time = "") +/datum/datacore/proc/createCrimeEntry(cname = "", cdetails = "", author = "", time = "") var/datum/data/crime/c = new /datum/data/crime c.crimeName = cname c.crimeDetails = cdetails @@ -34,14 +33,14 @@ c.dataId = ++securityCrimeCounter return c -/obj/effect/datacore/proc/addMinorCrime(id = "", var/datum/data/crime/crime) +/datum/datacore/proc/addMinorCrime(id = "", var/datum/data/crime/crime) for(var/datum/data/record/R in security) if(R.fields["id"] == id) var/list/crimes = R.fields["mi_crim"] crimes |= crime return -/obj/effect/datacore/proc/removeMinorCrime(id, cDataId) +/datum/datacore/proc/removeMinorCrime(id, cDataId) for(var/datum/data/record/R in security) if(R.fields["id"] == id) var/list/crimes = R.fields["mi_crim"] @@ -50,7 +49,7 @@ crimes -= crime return -/obj/effect/datacore/proc/removeMajorCrime(id, cDataId) +/datum/datacore/proc/removeMajorCrime(id, cDataId) for(var/datum/data/record/R in security) if(R.fields["id"] == id) var/list/crimes = R.fields["ma_crim"] @@ -59,14 +58,14 @@ crimes -= crime return -/obj/effect/datacore/proc/addMajorCrime(id = "", var/datum/data/crime/crime) +/datum/datacore/proc/addMajorCrime(id = "", var/datum/data/crime/crime) for(var/datum/data/record/R in security) if(R.fields["id"] == id) var/list/crimes = R.fields["ma_crim"] crimes |= crime return -/obj/effect/datacore/proc/manifest(var/nosleep = 0) +/datum/datacore/proc/manifest(var/nosleep = 0) spawn() if(!nosleep) sleep(40) @@ -74,12 +73,12 @@ manifest_inject(H) return -/obj/effect/datacore/proc/manifest_modify(var/name, var/assignment) +/datum/datacore/proc/manifest_modify(var/name, var/assignment) var/datum/data/record/foundrecord = find_record("name", name, data_core.general) if(foundrecord) foundrecord.fields["rank"] = assignment -/obj/effect/datacore/proc/get_manifest(monochrome, OOC) +/datum/datacore/proc/get_manifest(monochrome, OOC) var/list/heads = list() var/list/sec = list() var/list/eng = list() @@ -135,49 +134,49 @@ misc[name] = rank if(heads.len > 0) dat += "Heads" - for(name in heads) + for(var/name in heads) dat += "[name][heads[name]]" even = !even if(sec.len > 0) dat += "Security" - for(name in sec) + for(var/name in sec) dat += "[name][sec[name]]" even = !even if(eng.len > 0) dat += "Engineering" - for(name in eng) + for(var/name in eng) dat += "[name][eng[name]]" even = !even if(med.len > 0) dat += "Medical" - for(name in med) + for(var/name in med) dat += "[name][med[name]]" even = !even if(sci.len > 0) dat += "Science" - for(name in sci) + for(var/name in sci) dat += "[name][sci[name]]" even = !even if(sup.len > 0) dat += "Supply" - for(name in sup) + for(var/name in sup) dat += "[name][sup[name]]" even = !even if(civ.len > 0) dat += "Civilian" - for(name in civ) + for(var/name in civ) dat += "[name][civ[name]]" even = !even // in case somebody is insane and added them to the manifest, why not if(bot.len > 0) dat += "Silicon" - for(name in bot) + for(var/name in bot) dat += "[name][bot[name]]" even = !even // misc guys if(misc.len > 0) dat += "Miscellaneous" - for(name in misc) + for(var/name in misc) dat += "[name][misc[name]]" even = !even @@ -188,7 +187,7 @@ var/record_id_num = 1001 -/obj/effect/datacore/proc/manifest_inject(var/mob/living/carbon/human/H) +/datum/datacore/proc/manifest_inject(var/mob/living/carbon/human/H) if(H.mind && (H.mind.assigned_role != "MODE")) var/assignment if(H.mind.assigned_role) @@ -199,6 +198,11 @@ var/record_id_num = 1001 assignment = "Unassigned" var/id = num2hex(record_id_num++,6) + var/image = get_id_photo(H) + var/obj/item/weapon/photo/photo_front = new() + var/obj/item/weapon/photo/photo_side = new() + photo_front.photocreate(null, icon(image, dir = SOUTH)) + photo_side.photocreate(null, icon(image, dir = WEST)) //These records should ~really~ be merged or something //General Record @@ -207,10 +211,14 @@ var/record_id_num = 1001 G.fields["name"] = H.real_name G.fields["rank"] = assignment G.fields["age"] = H.age + if(config.mutant_races) + G.fields["species"] = H.dna.species.name G.fields["fingerprint"] = md5(H.dna.uni_identity) G.fields["p_stat"] = "Active" G.fields["m_stat"] = "Stable" G.fields["sex"] = H.gender + G.fields["photo_front"] = photo_front + G.fields["photo_side"] = photo_side general += G //Medical Record @@ -251,7 +259,166 @@ var/record_id_num = 1001 L.fields["b_dna"] = H.dna.unique_enzymes L.fields["enzymes"] = H.dna.struc_enzymes L.fields["identity"] = H.dna.uni_identity - L.fields["image"] = getFlatIcon(H) //This is god-awful + L.fields["image"] = image locked += L return +/datum/datacore/proc/get_id_photo(var/mob/living/carbon/human/H) + var/icon/photo = null + var/g = (H.gender == FEMALE) ? "f" : "m" + if(!config.mutant_races || H.dna.species.use_skintones) + photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.skin_tone]_[g]_s") + else + photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.dna.species.id]_[g]_s") + photo.Blend("#[H.dna.mutant_color]", ICON_MULTIPLY) + + var/icon/eyes_s + if(EYECOLOR in H.dna.species.specflags) + eyes_s = icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "[H.dna.species.eyes]_s") + eyes_s.Blend("#[H.eye_color]", ICON_MULTIPLY) + + var/datum/sprite_accessory/S + S = hair_styles_list[H.hair_style] + if(S && (HAIR in H.dna.species.specflags)) + var/icon/hair_s = icon("icon" = S.icon, "icon_state" = "[S.icon_state]_s") + hair_s.Blend("#[H.hair_color]", ICON_MULTIPLY) + eyes_s.Blend(hair_s, ICON_OVERLAY) + + S = facial_hair_styles_list[H.facial_hair_style] + if(S && (FACEHAIR in H.dna.species.specflags)) + var/icon/facial_s = icon("icon" = S.icon, "icon_state" = "[S.icon_state]_s") + facial_s.Blend("#[H.facial_hair_color]", ICON_MULTIPLY) + eyes_s.Blend(facial_s, ICON_OVERLAY) + + if(eyes_s) + photo.Blend(eyes_s, ICON_OVERLAY) + + var/icon/clothes_s = null + switch(H.mind.assigned_role) + if("Assistant") + clothes_s = icon('icons/mob/uniform.dmi', "grey_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if("Scientist") + clothes_s = icon('icons/mob/uniform.dmi', "toxinswhite_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat_tox"), ICON_OVERLAY) + if("Station Engineer") + clothes_s = icon('icons/mob/uniform.dmi', "engine_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "orange"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) + if("Security Officer") + clothes_s = icon('icons/mob/uniform.dmi', "security_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/suit.dmi', "armor"), ICON_OVERLAY) + if("Medical Doctor") + clothes_s = icon('icons/mob/uniform.dmi', "medical_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat"), ICON_OVERLAY) + if("Cargo Technician") + clothes_s = icon('icons/mob/uniform.dmi', "cargo_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if("Shaft Miner") + clothes_s = icon('icons/mob/uniform.dmi', "miner_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if("Atmospheric Technician") + clothes_s = icon('icons/mob/uniform.dmi', "atmos_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) + if("Botanist") + clothes_s = icon('icons/mob/uniform.dmi', "hydroponics_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/hands.dmi', "ggloves"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/suit.dmi', "apron"), ICON_OVERLAY) + if("Chemist") + clothes_s = icon('icons/mob/uniform.dmi', "chemistrywhite_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat_chem"), ICON_OVERLAY) + if("Cook") + clothes_s = icon('icons/mob/uniform.dmi', "chef_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/suit.dmi', "chef"), ICON_OVERLAY) + if("Janitor") + clothes_s = icon('icons/mob/uniform.dmi', "janitor_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if("Geneticist") + clothes_s = icon('icons/mob/uniform.dmi', "geneticswhite_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat_gen"), ICON_OVERLAY) + if("Virologist") + clothes_s = icon('icons/mob/uniform.dmi', "virologywhite_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat_vir"), ICON_OVERLAY) + if("Roboticist") + clothes_s = icon('icons/mob/uniform.dmi', "robotics_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat"), ICON_OVERLAY) + if("Lawyer") + clothes_s = icon('icons/mob/uniform.dmi', "bluesuit_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/suit.dmi', "suitjacket_blue"), ICON_OVERLAY) + if("Clown") + clothes_s = icon('icons/mob/uniform.dmi', "clown_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "clown"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/mask.dmi', "clown"), ICON_OVERLAY) + if("Mime") + clothes_s = icon('icons/mob/uniform.dmi', "mime_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/hands.dmi', "lgloves"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/mask.dmi', "mime"), ICON_OVERLAY) + clothes_s.Blend(icon('icons/mob/suit.dmi', "suspenders"), ICON_OVERLAY) + if("Bartender") + clothes_s = icon('icons/mob/uniform.dmi', "ba_suit_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/suit.dmi', "armoralt"), ICON_OVERLAY) + if("Quartermaster") + clothes_s = icon('icons/mob/uniform.dmi', "qm_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + if("Chaplain") + clothes_s = icon('icons/mob/uniform.dmi', "chapblack_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if("Research Director") + clothes_s = icon('icons/mob/uniform.dmi', "director_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat"), ICON_OVERLAY) + if("Chief Medical Officer") + clothes_s = icon('icons/mob/uniform.dmi', "cmo_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat_cmo"), ICON_OVERLAY) + if("Captain") + clothes_s = icon('icons/mob/uniform.dmi', "captain_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/suit.dmi', "capcarapace"), ICON_OVERLAY) + if("Head of Security") + clothes_s = icon('icons/mob/uniform.dmi', "hos_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/suit.dmi', "hostrench"), ICON_OVERLAY) + if("Warden") + clothes_s = icon('icons/mob/uniform.dmi', "warden_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/suit.dmi', "warden_jacket"), ICON_OVERLAY) + if("Detective") + clothes_s = icon('icons/mob/uniform.dmi', "detective_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/mask.dmi', "cigaron"), ICON_OVERLAY) + clothes_s.Blend(icon('icons/mob/head.dmi', "detective"), ICON_OVERLAY) + clothes_s.Blend(icon('icons/mob/suit.dmi', "detective"), ICON_OVERLAY) + if("Chief Engineer") + clothes_s = icon('icons/mob/uniform.dmi', "chief_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + clothes_s.Blend(icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) + if("Head of Personnel") + clothes_s = icon('icons/mob/uniform.dmi', "hop_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + if("Librarian") + clothes_s = icon('icons/mob/uniform.dmi', "red_suit_s") + clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + + if(clothes_s) + photo.Blend(clothes_s, ICON_OVERLAY) + + return photo diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index d673cf214a5..45e0278b5df 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -32,11 +32,11 @@ if(..()) return var/dat - if (src.temp) + if(src.temp) dat = text("[src.temp]

Clear Screen") else dat = text("Confirm Identity: []
", src, (src.scan ? text("[]", src.scan.name) : "----------")) - if (src.authenticated) + if(src.authenticated) switch(src.screen) if(1.0) dat += {" @@ -73,7 +73,7 @@ var/blood_type = "" var/b_dna = "" for(var/datum/data/record/E in data_core.medical) - if ((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"])) + if((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"])) blood_type = E.fields["blood_type"] b_dna = E.fields["b_dna"] var/background @@ -105,10 +105,20 @@ dat += "" if(active1 in data_core.general) - dat += "" + if(istype(active1.fields["photo_front"], /obj/item/weapon/photo)) + var/obj/item/weapon/photo/P1 = active1.fields["photo_front"] + user << browse_rsc(P1.img, "photo_front") + if(istype(active1.fields["photo_side"], /obj/item/weapon/photo)) + var/obj/item/weapon/photo/P2 = active1.fields["photo_side"] + user << browse_rsc(P2.img, "photo_side") + dat += "" + dat += "" + dat += "" dat += "" dat += "" dat += "" + if(config.mutant_races) + dat += "" dat += "" dat += "" dat += "" @@ -185,33 +195,34 @@ return /obj/machinery/computer/med_data/Topic(href, href_list) - if(..()) - return + . = ..() + if(.) + return . if(!(active1 in data_core.general)) src.active1 = null 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))) + 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"]) + if(href_list["temp"]) src.temp = null - if (href_list["scan"]) - if (src.scan) + if(href_list["scan"]) + if(src.scan) src.scan.loc = src.loc src.scan = null else var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) + if(istype(I, /obj/item/weapon/card/id)) usr.drop_item() I.loc = src src.scan = I - else if (href_list["logout"]) + else if(href_list["logout"]) src.authenticated = null src.screen = null src.active1 = null src.active2 = null - else if (href_list["choice"]) + else if(href_list["choice"]) // SORTING! if(href_list["choice"] == "Sorting") // Reverse the order if clicked twice @@ -224,21 +235,21 @@ // New sorting order! sortBy = href_list["sort"] order = initial(order) - else if (href_list["login"]) - if (istype(usr, /mob/living/silicon)) + else if(href_list["login"]) + if(istype(usr, /mob/living/silicon)) src.active1 = null src.active2 = null src.authenticated = 1 src.rank = "AI" src.screen = 1 - else if (istype(src.scan, /obj/item/weapon/card/id)) + else if(istype(src.scan, /obj/item/weapon/card/id)) src.active1 = null src.active2 = null - if (src.check_access(src.scan)) + if(src.check_access(src.scan)) src.authenticated = src.scan.registered_name src.rank = src.scan.assignment src.screen = 1 - if (src.authenticated) + if(src.authenticated) if(href_list["screen"]) src.screen = text2num(href_list["screen"]) @@ -264,88 +275,94 @@

Severity: [Dis.severity]"} - else 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) - else if (href_list["del_all2"]) + else if(href_list["del_all2"]) investigate_log("[usr.name] ([usr.key]) has deleted all medical records.", "records") data_core.medical.Cut() src.temp = "All records deleted." - else if (href_list["field"]) + else if(href_list["field"]) var/a1 = src.active1 var/a2 = src.active2 switch(href_list["field"]) if("fingerprint") 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)) + var/t1 = stripped_input("Please input fingerprint hash:", "Med. records", src.active1.fields["fingerprint"], null) + if(!canUseMedicalRecordsConsole(usr, t1, a1)) return src.active1.fields["fingerprint"] = t1 if("sex") if(active1) - if (src.active1.fields["sex"] == "Male") + if(src.active1.fields["sex"] == "Male") src.active1.fields["sex"] = "Female" else src.active1.fields["sex"] = "Male" if("age") 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)) + if(!canUseMedicalRecordsConsole(usr, t1, a1)) return src.active1.fields["age"] = t1 + if("species") + if(active1) + var/t1 = stripped_input("Please input species name", "Med. records", src.active1.fields["species"], null) + if(!canUseMedicalRecordsConsole(usr, t1, a1)) + return + active1.fields["species"] = t1 if("mi_dis") 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)) + var/t1 = stripped_input("Please input minor disabilities list:", "Med. records", src.active2.fields["mi_dis"], null) + if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return src.active2.fields["mi_dis"] = t1 if("mi_dis_d") 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)) + var/t1 = stripped_multiline_input("Please summarize minor dis.:", "Med. records", src.active2.fields["mi_dis_d"], null) + if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return src.active2.fields["mi_dis_d"] = t1 if("ma_dis") 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)) + var/t1 = stripped_input("Please input major diabilities list:", "Med. records", src.active2.fields["ma_dis"], null) + if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return src.active2.fields["ma_dis"] = t1 if("ma_dis_d") 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)) + var/t1 = stripped_multiline_input("Please summarize major dis.:", "Med. records", src.active2.fields["ma_dis_d"], null) + if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return src.active2.fields["ma_dis_d"] = t1 if("alg") 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)) + var/t1 = stripped_input("Please state allergies:", "Med. records", src.active2.fields["alg"], null) + if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return src.active2.fields["alg"] = t1 if("alg_d") 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)) + var/t1 = stripped_multiline_input("Please summarize allergies:", "Med. records", src.active2.fields["alg_d"], null) + if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return src.active2.fields["alg_d"] = t1 if("cdi") 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)) + var/t1 = stripped_input("Please state diseases:", "Med. records", src.active2.fields["cdi"], null) + if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return src.active2.fields["cdi"] = t1 if("cdi_d") 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)) + var/t1 = stripped_multiline_input("Please summarize diseases:", "Med. records", src.active2.fields["cdi_d"], null) + if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return src.active2.fields["cdi_d"] = t1 if("notes") 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)) + var/t1 = stripped_multiline_input("Please summarize notes:", "Med. records", src.active2.fields["notes"], null) + if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return src.active2.fields["notes"] = t1 if("p_stat") @@ -359,13 +376,25 @@ 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(active2) - var/t1 = copytext(sanitize(input("Please input DNA hash:", "Med. records", src.active2.fields["b_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.active2 != a2)) + var/t1 = stripped_input("Please input DNA hash:", "Med. records", src.active2.fields["b_dna"], null) + if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return src.active2.fields["b_dna"] = t1 + if("show_photo_front") + if(active1) + if(active1.fields["photo_front"]) + if(istype(active1.fields["photo_front"], /obj/item/weapon/photo)) + var/obj/item/weapon/photo/P = active1.fields["photo_front"] + P.show(usr) + if("show_photo_side") + if(active1) + if(active1.fields["photo_side"]) + if(istype(active1.fields["photo_side"], /obj/item/weapon/photo)) + var/obj/item/weapon/photo/P = active1.fields["photo_side"] + P.show(usr) else - else if (href_list["p_stat"]) + else if(href_list["p_stat"]) if(active1) switch(href_list["p_stat"]) if("deceased") @@ -377,7 +406,7 @@ if("unfit") src.active1.fields["p_stat"] = "Physically Unfit" - else if (href_list["m_stat"]) + else if(href_list["m_stat"]) if(active1) switch(href_list["m_stat"]) if("insane") @@ -390,7 +419,7 @@ src.active1.fields["m_stat"] = "Stable" - else if (href_list["blood_type"]) + else if(href_list["blood_type"]) if(active2) switch(href_list["blood_type"]) if("an") @@ -411,17 +440,17 @@ src.active2.fields["blood_type"] = "O+" - else if (href_list["del_r"]) + 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) - else if (href_list["del_r2"]) + else if(href_list["del_r2"]) investigate_log("[usr.name] ([usr.key]) has deleted the medical records for [active1.fields["name"]].", "records") if(active2) data_core.medical -= active2 active2 = null - else if (href_list["d_rec"]) + 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) @@ -429,8 +458,8 @@ active1 = null screen = 4 - else if (href_list["new"]) - if ((istype(src.active1, /datum/data/record) && !( istype(src.active2, /datum/data/record) ))) + 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"] R.fields["id"] = src.active1.fields["id"] @@ -450,46 +479,46 @@ src.active2 = R src.screen = 4 - else if (href_list["add_c"]) + 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) - if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) + var/t1 = stripped_multiline_input("Add Comment:", "Med. records", null, null) + if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return var/counter = 1 while(src.active2.fields[text("com_[]", counter)]) counter++ src.active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [] [], []
[]", src.authenticated, src.rank, worldtime2text(), time2text(world.realtime, "MMM DD"), year_integer+540, t1,) - else if (href_list["del_c"]) - if ((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", 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" - else if (href_list["search"]) + else if(href_list["search"]) var/t1 = stripped_input(usr, "Search String: (Name, DNA, or ID)", "Med. records") - if ((!( t1 ) || usr.stat || !( src.authenticated ) || usr.restrained() || ((!in_range(src, usr)) && (!istype(usr, /mob/living/silicon))))) + if(!canUseMedicalRecordsConsole(usr, t1)) return src.active1 = null src.active2 = null t1 = lowertext(t1) for(var/datum/data/record/R in data_core.medical) - if ((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]) || t1 == lowertext(R.fields["b_dna"]))) + if((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]) || t1 == lowertext(R.fields["b_dna"]))) src.active2 = R else //Foreach continue //goto(3229) - if (!( src.active2 )) + if(!( src.active2 )) src.temp = text("Could not locate record [].", t1) else for(var/datum/data/record/E in data_core.general) - if ((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"])) + if((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"])) src.active1 = E else //Foreach continue //goto(3334) src.screen = 4 - else if (href_list["print_p"]) - if (!( src.printing )) + else if(href_list["print_p"]) + if(!( src.printing )) src.printing = 1 data_core.medicalPrintCount++ playsound(loc, 'sound/items/poster_being_created.ogg', 100, 1) @@ -497,7 +526,10 @@ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( src.loc ) P.info = "
Medical Record - (MR-[data_core.medicalPrintCount])

" 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"]) + P.info += text("Name: [] ID: []
\nSex: []
\nAge: []
", src.active1.fields["name"], src.active1.fields["id"], src.active1.fields["sex"], src.active1.fields["age"]) + if(config.mutant_races) + P.info += "\nSpecies: [active1.fields["species"]]
" + P.info += text("\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", src.active1.fields["fingerprint"], src.active1.fields["p_stat"], src.active1.fields["m_stat"]) else P.info += "General Record Lost!
" if(active2 in data_core.medical) @@ -545,6 +577,15 @@ ..(severity) +/obj/machinery/computer/med_data/proc/canUseMedicalRecordsConsole(mob/user, message = 1, record1, record2) + if(user) + if(message) + if(authenticated) + if(user.canUseTopic(src)) + if(!record1 || record1 == active1) + if(!record2 || record2 == active2) + return 1 + return 0 /obj/machinery/computer/med_data/laptop name = "medical laptop" diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 6b4d124790f..480c87c5965 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -36,16 +36,16 @@ /obj/machinery/computer/secure_data/attack_hand(mob/user as mob) if(..()) return - if (src.z > 6) + if(src.z > 6) user << "Unable to establish a connection: \black You're too far away from the station!" return var/dat - if (temp) + if(temp) dat = text("[]

Clear Screen", temp, src) else dat = text("Confirm Identity: []
", src, (scan ? text("[]", scan.name) : "----------")) - if (authenticated) + if(authenticated) switch(screen) if(1.0) @@ -122,7 +122,7 @@ for(var/datum/data/record/R in sortRecord(data_core.general, sortBy, order)) var/crimstat = "" for(var/datum/data/record/E in data_core.security) - if ((E.fields["name"] == R.fields["name"]) && (E.fields["id"] == R.fields["id"])) + if((E.fields["name"] == R.fields["name"]) && (E.fields["id"] == R.fields["id"])) crimstat = E.fields["criminal"] var/background switch(crimstat) @@ -159,21 +159,34 @@ dat += "
Delete All Records

Back" if(3.0) dat += "Security Record
" - if ((istype(active1, /datum/data/record) && data_core.general.Find(active1))) - dat += {"
Medical Record
Name:[active1.fields["name"]]
Name:[active1.fields["name"]]
ID:[active1.fields["id"]]
Sex: [active1.fields["sex"]] 
Age: [active1.fields["age"]] 
Species: [active1.fields["species"]] 
Fingerprint: [active1.fields["fingerprint"]] 
Physical Status: [active1.fields["p_stat"]] 
Mental Status: [active1.fields["m_stat"]] 
+ if(istype(active1, /datum/data/record) && data_core.general.Find(active1)) + if(istype(active1.fields["photo_front"], /obj/item/weapon/photo)) + var/obj/item/weapon/photo/P1 = active1.fields["photo_front"] + user << browse_rsc(P1.img, "photo_front") + if(istype(active1.fields["photo_side"], /obj/item/weapon/photo)) + var/obj/item/weapon/photo/P2 = active1.fields["photo_side"] + user << browse_rsc(P2.img, "photo_side") + dat += {"
- - + "} + if(config.mutant_races) + dat += "" + dat += {" -
Name: [active1.fields["name"]] 
ID: [active1.fields["id"]] 
Sex: [active1.fields["sex"]] 
Age: [active1.fields["age"]] 
Rank: [active1.fields["rank"]] 
Age: [active1.fields["age"]] 
Species: [active1.fields["species"]] 
Rank: [active1.fields["rank"]] 
Fingerprint: [active1.fields["fingerprint"]] 
Physical Status: [active1.fields["p_stat"]] 
Mental Status: [active1.fields["m_stat"]] 
"} +
+ +

+ Update front photo

+ Update side photo
+ "} else - dat += "General Record Lost!
" - if ((istype(active2, /datum/data/record) && data_core.security.Find(active2))) - dat += "
Security Data" + dat += "
General Record Lost!
" + if((istype(active2, /datum/data/record) && data_core.security.Find(active2))) + dat += "Security Data" dat += "
Criminal Status: [active2.fields["criminal"]]" dat += "

Minor Crimes: Add New" @@ -244,13 +257,14 @@ I can't be bothered to look more of the actual code outside of switch but that probably needs revising too. What a mess.*/ /obj/machinery/computer/secure_data/Topic(href, href_list) - if(..()) - return - if (!( data_core.general.Find(active1) )) + . = ..() + if(.) + return . + if(!( data_core.general.Find(active1) )) active1 = null - if (!( data_core.security.Find(active2) )) + if(!( data_core.security.Find(active2) )) active2 = null - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon))) + if((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon))) usr.set_machine(src) switch(href_list["choice"]) // SORTING! @@ -269,13 +283,13 @@ What a mess.*/ if("Clear Screen") temp = null - if ("Return") + if("Return") screen = 1 active1 = null active2 = null if("Confirm Identity") - if (scan) + if(scan) if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand()) usr.put_in_hands(scan) else @@ -283,7 +297,7 @@ What a mess.*/ scan = null else var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) + if(istype(I, /obj/item/weapon/card/id)) usr.drop_item() I.loc = src scan = I @@ -295,14 +309,14 @@ What a mess.*/ active2 = null if("Log In") - if (istype(usr, /mob/living/silicon)) + if(istype(usr, /mob/living/silicon)) var/mob/living/silicon/borg = usr active1 = null active2 = null authenticated = borg.name rank = "AI" screen = 1 - else if (istype(scan, /obj/item/weapon/card/id)) + else if(istype(scan, /obj/item/weapon/card/id)) active1 = null active2 = null if(check_access(scan)) @@ -315,50 +329,53 @@ What a mess.*/ active1 = null active2 = null - if ("Browse Record") + if("Browse Record") var/datum/data/record/R = locate(href_list["d_rec"]) var/S = locate(href_list["d_rec"]) - if (!( data_core.general.Find(R) )) + if(!( data_core.general.Find(R) )) temp = "Record Not Found!" else for(var/datum/data/record/E in data_core.security) - if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) + if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) S = E active1 = R active2 = S screen = 3 -/* if ("Search Fingerprints") +/* if("Search Fingerprints") var/t1 = input("Search String: (Fingerprint)", "Secure. records", null, null) as text - if ((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || (!in_range(src, usr)) && (!istype(usr, /mob/living/silicon)))) + if((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || (!in_range(src, usr)) && (!istype(usr, /mob/living/silicon)))) return active1 = null active2 = null t1 = lowertext(t1) for(var/datum/data/record/R in data_core.general) - if (lowertext(R.fields["fingerprint"]) == t1) + if(lowertext(R.fields["fingerprint"]) == t1) active1 = R - if (!( active1 )) + if(!( active1 )) temp = text("Could not locate record [].", t1) else for(var/datum/data/record/E in data_core.security) - if ((E.fields["name"] == active1.fields["name"] || E.fields["id"] == active1.fields["id"])) + if((E.fields["name"] == active1.fields["name"] || E.fields["id"] == active1.fields["id"])) active2 = E screen = 3 */ - if ("Print Record") - if (!( printing )) + if("Print Record") + if(!( printing )) printing = 1 data_core.securityPrintCount++ playsound(loc, 'sound/items/poster_being_created.ogg', 100, 1) sleep(30) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( loc ) P.info = "
Security Record - (SR-[data_core.securityPrintCount])

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

\nCriminal Status: []", active2.fields["criminal"]) P.info += "
\n
\nMinor Crimes:
\n" @@ -406,49 +423,49 @@ What a mess.*/ P.info += "" printing = null //RECORD DELETE - if ("Delete All Records") + if("Delete All Records") temp = "" temp += "Are you sure you wish to delete all Security records?
" temp += "Yes
" temp += "No" - if ("Purge All Records") + if("Purge All Records") investigate_log("[usr.name] ([usr.key]) has purged all the security records.", "records") for(var/datum/data/record/R in data_core.security) del(R) data_core.security.Cut() temp = "All Security records deleted." - if ("Add Entry") - if (!( istype(active2, /datum/data/record) )) + if("Add Entry") + if(!( istype(active2, /datum/data/record) )) return var/a2 = active2 - var/t1 = copytext(sanitize(input("Add Comment:", "Secure. records", null, null) as message),1,MAX_MESSAGE_LEN) - if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2)) + var/t1 = stripped_multiline_input("Add Comment:", "Secure. records", null, null) + if(!canUseSecurityRecordsConsole(t1, usr, null, a2)) return var/counter = 1 while(active2.fields[text("com_[]", counter)]) counter++ active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [] [], []
[]", src.authenticated, src.rank, worldtime2text(), time2text(world.realtime, "MMM DD"), year_integer+540, t1,) - if ("Delete Record (ALL)") - if (active1) + if("Delete Record (ALL)") + if(active1) temp = "
Are you sure you wish to delete the record (ALL)?
" temp += "Yes
" temp += "No" - if ("Delete Record (Security)") - if (active2) + if("Delete Record (Security)") + if(active2) temp = "
Are you sure you wish to delete the record (Security Portion Only)?
" temp += "Yes
" temp += "No" - if ("Delete Entry") - if ((istype(active2, /datum/data/record) && active2.fields[text("com_[]", href_list["del_c"])])) + if("Delete Entry") + if((istype(active2, /datum/data/record) && active2.fields[text("com_[]", href_list["del_c"])])) active2.fields[text("com_[]", href_list["del_c"])] = "Deleted" //RECORD CREATE - if ("New Record (Security)") - if ((istype(active1, /datum/data/record) && !( istype(active2, /datum/data/record) ))) + if("New Record (Security)") + if((istype(active1, /datum/data/record) && !( istype(active2, /datum/data/record) ))) var/datum/data/record/R = new /datum/data/record() R.fields["name"] = active1.fields["name"] R.fields["id"] = active1.fields["id"] @@ -461,7 +478,7 @@ What a mess.*/ active2 = R screen = 3 - if ("New Record (General)") + if("New Record (General)") //General Record var/datum/data/record/G = new /datum/data/record() G.fields["name"] = "New Record" @@ -469,6 +486,10 @@ What a mess.*/ G.fields["rank"] = "Unassigned" G.fields["sex"] = "Male" G.fields["age"] = "Unknown" + if(config.mutant_races) + G.fields["species"] = "Human" + G.fields["photo_front"] = new /icon() + G.fields["photo_side"] = new /icon() G.fields["fingerprint"] = "?????" G.fields["p_stat"] = "Active" G.fields["m_stat"] = "Stable" @@ -507,15 +528,15 @@ What a mess.*/ //FIELD FUNCTIONS - if ("Edit Field") + if("Edit Field") var/a1 = active1 var/a2 = active2 switch(href_list["field"]) if("name") - if (istype(active1, /datum/data/record) || istype(active2, /datum/data/record)) + if(istype(active1, /datum/data/record) || istype(active2, /datum/data/record)) var/t1 = stripped_input(usr, "Please input name:", "Secure. records", active1.fields["name"], null) - if ((!( t1 ) || !length(trim(t1)) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon)))) || active1 != a1) + if(!canUseSecurityRecordsConsole(usr, t1, null, a1)) return if(istype(active1, /datum/data/record)) active1.fields["name"] = t1 @@ -523,67 +544,93 @@ What a mess.*/ active2.fields["name"] = t1 if("id") if(istype(active2,/datum/data/record) || istype(active1,/datum/data/record)) - var/t1 = copytext(sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text),1,MAX_MESSAGE_LEN) - if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1)) + var/t1 = stripped_input(usr, "Please input id:", "Secure. records", active1.fields["id"], null) + if(!canUseSecurityRecordsConsole(usr, t1, null, a1)) return if(istype(active1,/datum/data/record)) active1.fields["id"] = t1 if(istype(active2,/datum/data/record)) active2.fields["id"] = t1 if("fingerprint") - if (istype(active1, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text),1,MAX_MESSAGE_LEN) - if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1)) + if(istype(active1, /datum/data/record)) + var/t1 = stripped_input(usr, "Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) + if(!canUseSecurityRecordsConsole(usr, t1, null, a1)) return active1.fields["fingerprint"] = t1 if("sex") - if (istype(active1, /datum/data/record)) - if (active1.fields["sex"] == "Male") + if(istype(active1, /datum/data/record)) + if(active1.fields["sex"] == "Male") active1.fields["sex"] = "Female" else active1.fields["sex"] = "Male" if("age") - if (istype(active1, /datum/data/record)) - var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num - if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1)) + if(istype(active1, /datum/data/record)) + var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num + if(!canUseSecurityRecordsConsole(usr, null, null, a1) || !t1) return active1.fields["age"] = t1 + if("species") + if(istype(active1, /datum/data/record)) + var/t1 = input("Select a species", "Species Selection") as null|anything in roundstart_species + if(!canUseSecurityRecordsConsole(usr, t1, null, a1)) + return + active1.fields["species"] = t1 + if("show_photo_front") + if(active1.fields["photo_front"]) + if(istype(active1.fields["photo_front"], /obj/item/weapon/photo)) + var/obj/item/weapon/photo/P = active1.fields["photo_front"] + P.show(usr) + if("upd_photo_front") + var/icon/photo = get_photo(usr) + if(photo) + qdel(active1.fields["photo_front"]) + active1.fields["photo_front"] = photo + if("show_photo_side") + if(active1.fields["photo_side"]) + if(istype(active1.fields["photo_side"], /obj/item/weapon/photo)) + var/obj/item/weapon/photo/P = active1.fields["photo_side"] + P.show(usr) + if("upd_photo_side") + var/icon/photo = get_photo(usr) + if(photo) + qdel(active1.fields["photo_side"]) + active1.fields["photo_side"] = photo if("mi_crim_add") - if (istype(active1, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please input minor crime names:", "Secure. records", "", null) as text),1,MAX_MESSAGE_LEN) - var/t2 = copytext(sanitize(input("Please input minor crime details:", "Secure. records", "", null) as message),1,MAX_MESSAGE_LEN) - if ((!( t1 ) || !( t2 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2)) + if(istype(active1, /datum/data/record)) + var/t1 = stripped_input(usr, "Please input minor crime names:", "Secure. records", "", null) + var/t2 = stripped_multiline_input(usr, "Please input minor crime details:", "Secure. records", "", null) + if(!canUseSecurityRecordsConsole(usr, t1, t2, null, a2)) return var/crime = data_core.createCrimeEntry(t1, t2, authenticated, worldtime2text()) data_core.addMinorCrime(active1.fields["id"], crime) if("mi_crim_delete") - if (istype(active1, /datum/data/record)) - if (href_list["cdataid"]) - if ((!( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2)) + if(istype(active1, /datum/data/record)) + if(href_list["cdataid"]) + if(!canUseSecurityRecordsConsole(usr, null, null, a2)) return data_core.removeMinorCrime(active1.fields["id"], href_list["cdataid"]) if("ma_crim_add") - if (istype(active1, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please input major crime names:", "Secure. records", "", null) as text),1,MAX_MESSAGE_LEN) - var/t2 = copytext(sanitize(input("Please input major crime details:", "Secure. records", "", null) as message),1,MAX_MESSAGE_LEN) - if ((!( t1 ) || !( t2 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2)) + if(istype(active1, /datum/data/record)) + var/t1 = stripped_input(usr, "Please input major crime names:", "Secure. records", "", null) + var/t2 = stripped_multiline_input(usr, "Please input major crime details:", "Secure. records", "", null) + if(!canUseSecurityRecordsConsole(usr, t1, t2, a2)) return var/crime = data_core.createCrimeEntry(t1, t2, authenticated, worldtime2text()) data_core.addMajorCrime(active1.fields["id"], crime) if("ma_crim_delete") - if (istype(active1, /datum/data/record)) - if (href_list["cdataid"]) - if ((!( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2)) + if(istype(active1, /datum/data/record)) + if(href_list["cdataid"]) + if(!canUseSecurityRecordsConsole(usr, null, null, a2)) return data_core.removeMajorCrime(active1.fields["id"], href_list["cdataid"]) if("notes") - if (istype(active2, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please summarize notes:", "Secure. records", active2.fields["notes"], null) as message),1,MAX_MESSAGE_LEN) - if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2)) + if(istype(active2, /datum/data/record)) + var/t1 = stripped_input(usr, "Please summarize notes:", "Secure. records", active2.fields["notes"], null) + if(!canUseSecurityRecordsConsole(usr, t1, null, a2)) return active2.fields["notes"] = t1 if("criminal") - if (istype(active2, /datum/data/record)) + if(istype(active2, /datum/data/record)) temp = "
Criminal Status:
" temp += "
    " temp += "
  • None
  • " @@ -595,7 +642,7 @@ What a mess.*/ if("rank") var/list/L = list( "Head of Personnel", "Captain", "AI" ) //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N - if ((istype(active1, /datum/data/record) && L.Find(rank))) + if((istype(active1, /datum/data/record) && L.Find(rank))) temp = "
    Rank:
    " temp += "
      " for(var/rank in get_all_jobs()) @@ -607,14 +654,14 @@ What a mess.*/ else//To properly clear as per clear screen. temp=null switch(href_list["choice"]) - if ("Change Rank") - if (active1) + 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 ("Change Criminal Status") - if (active2) + if("Change Criminal Status") + if(active2) var/old_field = active2.fields["criminal"] switch(href_list["criminal2"]) if("none") @@ -630,24 +677,24 @@ What a mess.*/ investigate_log("[active1.fields["name"]] has been set from [old_field] to [active2.fields["criminal"]] by [usr.name] ([usr.key]).", "records") for(var/mob/living/carbon/human/H in mob_list) //thanks for forcing me to do this, whoever wrote this shitty records system H.sec_hud_set_security_status() - if ("Delete Record (Security) Execute") + if("Delete Record (Security) Execute") investigate_log("[usr.name] ([usr.key]) has deleted the security records for [active1.fields["name"]].", "records") - if (active2) + if(active2) data_core.security -= active2 del(active2) - if ("Delete Record (ALL) Execute") - if (active1) + if("Delete Record (ALL) Execute") + if(active1) investigate_log("[usr.name] ([usr.key]) has deleted all records for [active1.fields["name"]].", "records") for(var/datum/data/record/R in data_core.medical) - if ((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"])) + if((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"])) data_core.medical -= R del(R) break data_core.general -= active1 del(active1) - if (active2) + if(active2) data_core.security -= active2 del(active2) else @@ -657,6 +704,18 @@ What a mess.*/ updateUsrDialog() return +/obj/machinery/computer/secure_data/proc/get_photo(var/mob/user) + var/obj/item/weapon/photo/P = null + if(istype(user, /mob/living/silicon)) + var/mob/living/silicon/tempAI = user + var/datum/picture/selection = tempAI.GetPhoto() + if(selection) + P = new() + P.photocreate(selection.fields["icon"], selection.fields["img"], selection.fields["desc"]) + else if(istype(user.get_active_hand(), /obj/item/weapon/photo)) + P = user.get_active_hand() + return P + /obj/machinery/computer/secure_data/emp_act(severity) if(stat & (BROKEN|NOPOWER)) ..(severity) @@ -664,11 +723,11 @@ What a mess.*/ for(var/datum/data/record/R in data_core.security) if(prob(10/severity)) - switch(rand(1,6)) + switch(rand(1,8)) if(1) R.fields["name"] = "[pick(pick(first_names_male), pick(first_names_female))] [pick(last_names)]" if(2) - R.fields["sex"] = pick("Male", "Female") + R.fields["sex"] = pick("Male", "Female") if(3) R.fields["age"] = rand(5, 85) if(4) @@ -677,6 +736,12 @@ What a mess.*/ R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit") if(6) R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable") + if(7) + R.fields["species"] = pick(roundstart_species) + if(8) + var/datum/data/record/G = pick(data_core.general) + R.fields["photo_front"] = G.fields["photo_front"] + R.fields["photo_side"] = G.fields["photo_side"] continue else if(prob(1)) @@ -685,6 +750,17 @@ What a mess.*/ ..(severity) +/obj/machinery/computer/secure_data/proc/canUseSecurityRecordsConsole(mob/user, message1 = 1, message2 = 1, record1, record2) + if(user) + if(trim(message1)) + if(trim(message2)) + if(authenticated) + if(user.canUseTopic(src)) + if(!record1 || record1 == active1) + if(!record2 || record2 == active2) + return 1 + return 0 + /obj/machinery/computer/secure_data/detective_computer icon = 'icons/obj/computer.dmi' icon_state = "messyfiles" diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 79bda25cad5..e2290b92404 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -260,21 +260,37 @@ if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/H = user - if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/hud/security/sunglasses)) - if(!user.stat && user != src) //|| !user.canmove || user.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at. - var/criminal = "None" - - var/perpname = get_face_name(get_id_name("")) - if(perpname) - var/datum/data/record/R = find_record("name", perpname, data_core.security) + if(istype(H.glasses, /obj/item/clothing/glasses/hud)) + var/perpname = get_face_name(get_id_name("")) + if(perpname) + var/datum/data/record/R = find_record("name", perpname, data_core.general) + if(R) + msg += "Rank: [R.fields["rank"]]
      " + msg += "\[Front photo\] " + msg += "\[Side photo\]
      " + if(istype(H.glasses, /obj/item/clothing/glasses/hud/health)) if(R) - criminal = R.fields["criminal"] + var/health = R.fields["p_stat"] + msg += "\[[health]\]" + health = R.fields["m_stat"] + msg += "\[[health]\]
      " + R = find_record("name", perpname, data_core.medical) + if(R) + msg += "\[Medical evaluation\]
      " - msg += "Criminal status: \[[criminal]\]\n" - msg += "Security record: \[View\] " - msg += "\[Add crime\] " - msg += "\[View comment log\] " - msg += "\[Add comment\]\n" + if(istype(H.glasses, /obj/item/clothing/glasses/hud/security)) + if(!user.stat && user != src) //|| !user.canmove || user.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at. + var/criminal = "None" + + R = find_record("name", perpname, data_core.security) + if(R) + criminal = R.fields["criminal"] + + msg += "Criminal status: \[[criminal]\]\n" + msg += "Security record: \[View\] " + msg += "\[Add crime\] " + msg += "\[View comment log\] " + msg += "\[Add comment\]\n" msg += "*---------*" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 5463c2e2084..5af48151fba 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -249,7 +249,6 @@ siemens_coeff = G.siemens_coefficient return ..(shock_damage,source,siemens_coeff) - /mob/living/carbon/human/Topic(href, href_list) if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) if(href_list["item"]) @@ -295,113 +294,194 @@ ..() - if(href_list["criminal"]) +///////HUDs/////// + if(href_list["hud"]) if(istype(usr, /mob/living/carbon/human)) var/mob/living/carbon/human/H = usr - if(istype(H.glasses, /obj/item/clothing/glasses/hud/security)) - if(usr.stat || usr == src) //|| !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 - // Checks the user has security clearence before allowing them to change arrest status via hud, comment out to enable all access - var/allowed_access = null - var/obj/item/clothing/glasses/G = H.glasses - if (!G.emagged) - if(H.wear_id) - var/list/access = H.wear_id.GetAccess() - if(access_sec_doors in access) - allowed_access = H.get_authentification_name() - else - allowed_access = "@%&ERROR_%$*" - - - if(!allowed_access) - H << "ERROR: Invalid Access" - return - - var/perpname = get_face_name(get_id_name("")) - if(perpname) - var/datum/data/record/R = find_record("name", perpname, data_core.security) + var/perpname = get_face_name(get_id_name("")) + if(istype(H.glasses, /obj/item/clothing/glasses/hud)) + var/datum/data/record/R = find_record("name", perpname, data_core.general) + if(href_list["photo_front"] || href_list["photo_side"]) if(R) - if(href_list["status"]) - var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Parolled", "Discharged", "Cancel") + if(!H.canUseHUD()) return + else if(!istype(H.glasses, /obj/item/clothing/glasses/hud)) return + var/obj/item/weapon/photo/P = null + if(href_list["photo_front"]) + P = R.fields["photo_front"] + else if(href_list["photo_side"]) + P = R.fields["photo_side"] + if(P) + P.show(H) + + if(href_list["hud"] == "m") + if(istype(H.glasses, /obj/item/clothing/glasses/hud/health)) + if(href_list["p_stat"]) + var/health = input(usr, "Specify a new physical status for this person.", "Medical HUD", R.fields["p_stat"]) in list("Active", "Physically Unfit", "*Unconscious*", "*Deceased*", "Cancel") if(R) - if(istype(H.glasses, /obj/item/clothing/glasses/hud/security)) + if(!H.canUseHUD()) return + else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/health)) return + if(health && health != "Cancel") + R.fields["p_stat"] = health + return + if(href_list["m_stat"]) + var/health = input(usr, "Specify a new mental status for this person.", "Medical HUD", R.fields["m_stat"]) in list("Stable", "*Watch*", "*Unstable*", "*Insane*", "Cancel") + if(R) + if(!H.canUseHUD()) return + else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/health)) return + if(health && health != "Cancel") + R.fields["m_stat"] = health + return + if(href_list["evaluation"]) + if(!getBruteLoss() && !getFireLoss() && !getOxyLoss() && getToxLoss() < 20) + usr << "No external injuries detected.
      " + return + var/span = "notice" + var/status = "" + if(getBruteLoss()) + usr << "Physical trauma analysis:" + for(var/obj/item/organ/limb/org in organs) + var/brutedamage = org.brute_dam + if(brutedamage > 0) + status = "received minor physical injuries." + span = "notice" + if(brutedamage > 20) + status = "been seriously damaged." + span = "danger" + if(brutedamage > 40) + status = "sustained major trauma!" + span = "userdanger" + if(brutedamage) + usr << "The [org.getDisplayName()] appears to have [status]" + if(getFireLoss()) + usr << "Analysis of skin burns:" + for(var/obj/item/organ/limb/org in organs) + var/burndamage = org.burn_dam + if(burndamage > 0) + status = "signs of minor burns." + span = "notice" + if(burndamage > 20) + status = "serious burns." + span = "danger" + if(burndamage > 40) + status = "major burns!" + span = "userdanger" + if(burndamage) + usr << "The [org.getDisplayName()] appears to have [status]" + if(getOxyLoss()) + usr << "Patient has signs of suffocation, emergency treatment may be required!" + if(getToxLoss() > 20) + usr << "Gathered data is inconsistent with the analysis, possible cause: poisoning." + + if(href_list["hud"] == "s") + if(istype(H.glasses, /obj/item/clothing/glasses/hud/security)) + if(usr.stat || usr == src) //|| !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 + // Checks the user has security clearence before allowing them to change arrest status via hud, comment out to enable all access + var/allowed_access = null + var/obj/item/clothing/glasses/G = H.glasses + if (!G.emagged) + if(H.wear_id) + var/list/access = H.wear_id.GetAccess() + if(access_sec_doors in access) + allowed_access = H.get_authentification_name() + else + allowed_access = "@%&ERROR_%$*" + + + if(!allowed_access) + H << "ERROR: Invalid Access" + return + + if(perpname) + R = find_record("name", perpname, data_core.security) + if(R) + if(href_list["status"]) + var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Parolled", "Discharged", "Cancel") if(setcriminal != "Cancel") - investigate_log("[src.key] has been set from [R.fields["criminal"]] to [setcriminal] by [usr.name] ([usr.key]).", "records") - R.fields["criminal"] = setcriminal - sec_hud_set_security_status() - return - - if(href_list["view"]) - if(R) - if(usr.stat || H.weakened || H.stunned || H.restrained() || !istype(H.glasses, /obj/item/clothing/glasses/hud/security)) - return - usr << "Name: [R.fields["name"]] Criminal Status: [R.fields["criminal"]]" - usr << "Minor Crimes:" - for(var/datum/data/crime/c in R.fields["mi_crim"]) - usr << "Crime: [c.crimeName]" - usr << "Details: [c.crimeDetails]" - usr << "Added by [c.author] at [c.time]" - usr << "----------" - usr << "Major Crimes:" - for(var/datum/data/crime/c in R.fields["ma_crim"]) - usr << "Crime: [c.crimeName]" - usr << "Details: [c.crimeDetails]" - usr << "Added by [c.author] at [c.time]" - usr << "----------" - usr << "Notes: [R.fields["notes"]]" - return - - if(href_list["add_crime"]) - switch(alert("What crime would you like to add?","Security HUD","Minor Crime","Major Crime","Cancel")) - if("Minor Crime") - if(R) - var/t1 = copytext(sanitize(input("Please input minor crime names:", "Security HUD", "", null) as text),1,MAX_MESSAGE_LEN) - var/t2 = copytext(sanitize(input("Please input minor crime details:", "Security HUD", "", null) as message),1,MAX_MESSAGE_LEN) if(R) - if (!t1 || !t2 || !allowed_access || H.stat || H.weakened || H.stunned || H.restrained() || !istype(H.glasses, /obj/item/clothing/glasses/hud/security)) - return - var/crime = data_core.createCrimeEntry(t1, t2, allowed_access, worldtime2text()) - data_core.addMinorCrime(R.fields["id"], crime) - usr << "Successfully added a minor crime." - return - if("Major Crime") - if(R) - var/t1 = copytext(sanitize(input("Please input major crime names:", "Security HUD", "", null) as text),1,MAX_MESSAGE_LEN) - var/t2 = copytext(sanitize(input("Please input major crime details:", "Security HUD", "", null) as message),1,MAX_MESSAGE_LEN) - if(R) - if (!t1 || !t2 || !allowed_access || H.stat || H.weakened || H.stunned || H.restrained() || !istype(H.glasses, /obj/item/clothing/glasses/hud/security)) - return - var/crime = data_core.createCrimeEntry(t1, t2, allowed_access, worldtime2text()) - data_core.addMajorCrime(R.fields["id"], crime) - usr << "Successfully added a major crime." - return - else return - - if(href_list["view_comment"]) - if(R) - if(H.stat || H.weakened || H.stunned || H.restrained() || !istype(H.glasses, /obj/item/clothing/glasses/hud/security)) + if(H.canUseHUD()) + if(istype(H.glasses, /obj/item/clothing/glasses/hud/security)) + investigate_log("[src.key] has been set from [R.fields["criminal"]] to [setcriminal] by [usr.name] ([usr.key]).", "records") + R.fields["criminal"] = setcriminal + sec_hud_set_security_status() return - usr << "Comments/Log:" - var/counter = 1 - while(R.fields[text("com_[]", counter)]) - usr << R.fields[text("com_[]", counter)] - usr << "----------" - counter++ - return - if(href_list["add_comment"]) - if(R) - var/t1 = copytext(sanitize(input("Add Comment:", "Secure. records", null, null) as message),1,MAX_MESSAGE_LEN) - if(R) - if (!t1 || !allowed_access || H.stat || H.weakened || H.stunned || H.restrained() || !istype(H.glasses, /obj/item/clothing/glasses/hud/security)) + if(href_list["view"]) + if(R) + if(!H.canUseHUD()) return + else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security)) return + usr << "Name: [R.fields["name"]] Criminal Status: [R.fields["criminal"]]" + usr << "Minor Crimes:" + for(var/datum/data/crime/c in R.fields["mi_crim"]) + usr << "Crime: [c.crimeName]" + usr << "Details: [c.crimeDetails]" + usr << "Added by [c.author] at [c.time]" + usr << "----------" + usr << "Major Crimes:" + for(var/datum/data/crime/c in R.fields["ma_crim"]) + usr << "Crime: [c.crimeName]" + usr << "Details: [c.crimeDetails]" + usr << "Added by [c.author] at [c.time]" + usr << "----------" + usr << "Notes: [R.fields["notes"]]" + return + + if(href_list["add_crime"]) + switch(alert("What crime would you like to add?","Security HUD","Minor Crime","Major Crime","Cancel")) + if("Minor Crime") + if(R) + var/t1 = stripped_input("Please input minor crime names:", "Security HUD", "", null) + var/t2 = stripped_multiline_input("Please input minor crime details:", "Security HUD", "", null) + if(R) + if (!t1 || !t2 || !allowed_access) return + else if(!H.canUseHUD()) return + else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security)) return + var/crime = data_core.createCrimeEntry(t1, t2, allowed_access, worldtime2text()) + data_core.addMinorCrime(R.fields["id"], crime) + usr << "Successfully added a minor crime." + return + if("Major Crime") + if(R) + var/t1 = stripped_input("Please input major crime names:", "Security HUD", "", null) + var/t2 = stripped_multiline_input("Please input major crime details:", "Security HUD", "", null) + if(R) + if (!t1 || !t2 || !allowed_access) return + else if (!H.canUseHUD()) return + else if (!istype(H.glasses, /obj/item/clothing/glasses/hud/security)) return + var/crime = data_core.createCrimeEntry(t1, t2, allowed_access, worldtime2text()) + data_core.addMajorCrime(R.fields["id"], crime) + usr << "Successfully added a major crime." + return + + if(href_list["view_comment"]) + if(R) + if(!H.canUseHUD()) return + else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security)) return + usr << "Comments/Log:" + var/counter = 1 + while(R.fields[text("com_[]", counter)]) + usr << R.fields[text("com_[]", counter)] + usr << "----------" + counter++ return - var/counter = 1 - while(R.fields[text("com_[]", counter)]) - counter++ - R.fields[text("com_[]", counter)] = text("Made by [] on [] [], []
      []", allowed_access, worldtime2text(), time2text(world.realtime, "MMM DD"), year_integer+540, t1,) - usr << "Successfully added comment." - return - usr << "Unable to locate a data core entry for this person." + + if(href_list["add_comment"]) + if(R) + var/t1 = stripped_multiline_input("Add Comment:", "Secure. records", null, null) + if(R) + if (!t1 || !allowed_access) return + else if(!H.canUseHUD()) return + else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security)) return + var/counter = 1 + while(R.fields[text("com_[]", counter)]) + counter++ + R.fields[text("com_[]", counter)] = text("Made by [] on [] [], []
      []", allowed_access, worldtime2text(), time2text(world.realtime, "MMM DD"), year_integer+540, t1,) + usr << "Successfully added comment." + return + usr << "Unable to locate a data core entry for this person." + +/mob/living/carbon/human/proc/canUseHUD() + return !(src.stat || src.weakened || src.stunned || src.restrained()) /mob/living/carbon/human/proc/play_xylophone() if(!src.xylophone) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index f831e687de5..0f7e32324ba 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -34,7 +34,6 @@ var/list/ai_list = list() radiomod = ";" //AIs will, by default, state their laws on the internal radio. var/obj/item/device/pda/ai/aiPDA = null var/obj/item/device/multitool/aiMulti = null - var/obj/item/device/camera/siliconcam/aicamera = null var/obj/machinery/bot/Bot //MALFUNCTION diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index e69830054bc..570e6b320d2 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -56,7 +56,6 @@ var/obj/item/weapon/tank/internal = null //Hatred. Used if a borg has a jetpack. var/obj/item/robot_parts/robot_suit/robot_suit = null //Used for deconstruction to remember what the borg was constructed out of.. - var/obj/item/device/camera/siliconcam/aicamera = null //photography var/toner = 0 var/tonermax = 40 diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 4b6e2ae91e5..1d241afcca8 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -9,6 +9,7 @@ var/list/alarms_to_clear = list() var/designation = "" var/radiomod = "" //Radio character used before state laws/arrivals announce to allow department transmissions, default, or none at all. + var/obj/item/device/camera/siliconcam/aicamera = null //photography var/obj/item/device/radio/borg/radio = null //AIs dont use this but this is at the silicon level to advoid copypasta in say() @@ -413,4 +414,8 @@ return /mob/living/silicon/setEarDamage() - return \ No newline at end of file + return + +/mob/living/silicon/proc/GetPhoto() + if (aicamera) + return aicamera.selectpicture(aicamera) \ No newline at end of file diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index a3db1f6b3b7..247b0356c00 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -332,22 +332,22 @@ else injectaialbum(icon, img, desc, pixel_x, pixel_y, blueprintsinject) - -obj/item/device/camera/siliconcam/proc/viewpichelper(var/obj/item/device/camera/siliconcam/targetloc) +obj/item/device/camera/siliconcam/proc/selectpicture(var/obj/item/device/camera/siliconcam/targetloc) var/list/nametemp = list() var/find - var/datum/picture/selection if(targetloc.aipictures.len == 0) usr << "No images saved" return for(var/datum/picture/t in targetloc.aipictures) nametemp += t.fields["name"] find = input("Select image (numbered in order taken)") in nametemp - var/obj/item/weapon/photo/P = new/obj/item/weapon/photo() for(var/datum/picture/q in targetloc.aipictures) if(q.fields["name"] == find) - selection = q - break // just in case some AI decides to take 10 thousand pictures in a round + return q + +obj/item/device/camera/siliconcam/proc/viewpichelper(var/obj/item/device/camera/siliconcam/targetloc) + var/obj/item/weapon/photo/P = new/obj/item/weapon/photo() + var/datum/picture/selection = selectpicture(targetloc) P.photocreate(selection.fields["icon"], selection.fields["img"], selection.fields["desc"]) P.pixel_x = selection.fields["pixel_x"] P.pixel_y = selection.fields["pixel_y"] diff --git a/code/world.dm b/code/world.dm index 039a2c95545..1b0a3d17072 100644 --- a/code/world.dm +++ b/code/world.dm @@ -58,7 +58,7 @@ world.log << "Database connection established." - data_core = new /obj/effect/datacore() + data_core = new /datum/datacore() spawn(-1) diff --git a/config/admins.txt b/config/admins.txt index 3081f865151..dc149720d8b 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -77,3 +77,4 @@ thurgatar = Game Master xerux = Game Master dannno = Game Master allura = Game Master +lo6a4evskiy = Game Master diff --git a/html/changelogs/Lo6a4evskiy-PR-7257.yml b/html/changelogs/Lo6a4evskiy-PR-7257.yml new file mode 100644 index 00000000000..507f2478826 --- /dev/null +++ b/html/changelogs/Lo6a4evskiy-PR-7257.yml @@ -0,0 +1,39 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscdel (general adding of nice things) +# rscadd (general deleting of nice things) +# imageadd +# imagedel +# spellcheck (typo fixes) +# experiment +# tgs (TG-ported fixes?) +################################# + +# Your name. +author: Lo6a4evskiy + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in single (') or double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "General record now contains a species field and a photo of the crewmember. Security record consoles allow you to update it with a photo taken in-game (with detective's camera, for example, or AI's)." + - rscadd: "Expanded functionality of security HUDs to display rank and photos." + - rscadd: "Medical HUDs allow user to change others' mental and physical status. Currently has no gameplay effect other than changing records." + - rscadd: "Medical HUDs can perform an examination at the distance, similrarly to how attacking yourself with help intent works. Has limited ability to detect suffocation and toxin damage." \ No newline at end of file