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 += "| Medical Record |
"
if(active1 in data_core.general)
- dat += "| Name: | [active1.fields["name"]] |
"
+ 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 += "| Name: | [active1.fields["name"]] | "
+ dat += " | "
+ dat += " |
"
dat += "| ID: | [active1.fields["id"]] |
"
dat += "| Sex: | [active1.fields["sex"]] |
"
dat += "| Age: | [active1.fields["age"]] |
"
+ if(config.mutant_races)
+ dat += "| Species: | [active1.fields["species"]] |
"
dat += "| Fingerprint: | [active1.fields["fingerprint"]] |
"
dat += "| Physical Status: | [active1.fields["p_stat"]] |
"
dat += "| Mental Status: | [active1.fields["m_stat"]] |
"
@@ -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 += {"
+ 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 += {"
+ |
+ |
"}
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("
\nSecurity 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