Adds photos and species to security and medical records, plus some other tweaking

This commit is contained in:
Lo6a4evskiy
2015-01-21 21:21:47 +04:00
parent bebee8ded9
commit a22d1ecfe2
9 changed files with 280 additions and 135 deletions

View File

@@ -190,6 +190,7 @@ var/record_id_num = 1001
assignment = "Unassigned" assignment = "Unassigned"
var/id = num2hex(record_id_num++,6) var/id = num2hex(record_id_num++,6)
var/image = get_id_photo(H)
//These records should ~really~ be merged or something //These records should ~really~ be merged or something
//General Record //General Record
@@ -198,12 +199,14 @@ var/record_id_num = 1001
G.fields["name"] = H.real_name G.fields["name"] = H.real_name
G.fields["rank"] = assignment G.fields["rank"] = assignment
G.fields["age"] = H.age 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["fingerprint"] = md5(H.dna.uni_identity)
G.fields["p_stat"] = "Active" G.fields["p_stat"] = "Active"
G.fields["m_stat"] = "Stable" G.fields["m_stat"] = "Stable"
G.fields["sex"] = H.gender G.fields["sex"] = H.gender
G.fields["photo_front"] = icon(get_id_photo(H), dir = SOUTH) G.fields["photo_front"] = icon(image, dir = SOUTH)
G.fields["photo_side"] = icon(get_id_photo(H), dir = WEST) G.fields["photo_side"] = icon(image, dir = WEST)
general += G general += G
//Medical Record //Medical Record
@@ -244,7 +247,7 @@ var/record_id_num = 1001
L.fields["b_dna"] = H.dna.unique_enzymes L.fields["b_dna"] = H.dna.unique_enzymes
L.fields["enzymes"] = H.dna.struc_enzymes L.fields["enzymes"] = H.dna.struc_enzymes
L.fields["identity"] = H.dna.uni_identity L.fields["identity"] = H.dna.uni_identity
L.fields["image"] = getFlatIcon(H) //This is god-awful L.fields["image"] = image
locked += L locked += L
return return
@@ -345,7 +348,7 @@ var/record_id_num = 1001
clothes_s = icon('icons/mob/uniform.dmi', "cmo_s") 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/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat_cmo"), ICON_OVERLAY) clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat_cmo"), ICON_OVERLAY)
if("Doctor") if("Medical Doctor")
clothes_s = icon('icons/mob/uniform.dmi', "medical_s") 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/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat"), ICON_OVERLAY) clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat"), ICON_OVERLAY)

View File

@@ -105,10 +105,13 @@
dat += "<table><tr><td><b><font size='4'>Medical Record</font></b></td></tr>" dat += "<table><tr><td><b><font size='4'>Medical Record</font></b></td></tr>"
if(active1 in data_core.general) if(active1 in data_core.general)
dat += "<tr><td>Name:</td><td>[active1.fields["name"]]</td></tr>" user << browse_rsc(active1.fields["photo_front"], "photo_front")
user << browse_rsc(active1.fields["photo_side"], "photo_side")
dat += "<tr><td>Name:</td><td>[active1.fields["name"]]</td><td><img src=photo_front height=80 width=80 border=4></td><td><img src=photo_side height=80 width=80 border=4></td></tr>"
dat += "<tr><td>ID:</td><td>[active1.fields["id"]]</td></tr>" dat += "<tr><td>ID:</td><td>[active1.fields["id"]]</td></tr>"
dat += "<tr><td>Sex:</td><td><A href='?src=\ref[src];field=sex'>&nbsp;[active1.fields["sex"]]&nbsp;</A></td></tr>" dat += "<tr><td>Sex:</td><td><A href='?src=\ref[src];field=sex'>&nbsp;[active1.fields["sex"]]&nbsp;</A></td></tr>"
dat += "<tr><td>Age:</td><td><A href='?src=\ref[src];field=age'>&nbsp;[active1.fields["age"]]&nbsp;</A></td></tr>" dat += "<tr><td>Age:</td><td><A href='?src=\ref[src];field=age'>&nbsp;[active1.fields["age"]]&nbsp;</A></td></tr>"
dat += "<tr><td>Species:</td><td><A href='?src=\ref[src];field=species'>&nbsp;[active1.fields["species"]]&nbsp;</A></td></tr>"
dat += "<tr><td>Fingerprint:</td><td><A href='?src=\ref[src];field=fingerprint'>&nbsp;[active1.fields["fingerprint"]]&nbsp;</A></td></tr>" dat += "<tr><td>Fingerprint:</td><td><A href='?src=\ref[src];field=fingerprint'>&nbsp;[active1.fields["fingerprint"]]&nbsp;</A></td></tr>"
dat += "<tr><td>Physical Status:</td><td><A href='?src=\ref[src];field=p_stat'>&nbsp;[active1.fields["p_stat"]]&nbsp;</A></td></tr>" dat += "<tr><td>Physical Status:</td><td><A href='?src=\ref[src];field=p_stat'>&nbsp;[active1.fields["p_stat"]]&nbsp;</A></td></tr>"
dat += "<tr><td>Mental Status:</td><td><A href='?src=\ref[src];field=m_stat'>&nbsp;[active1.fields["m_stat"]]&nbsp;</A></td></tr>" dat += "<tr><td>Mental Status:</td><td><A href='?src=\ref[src];field=m_stat'>&nbsp;[active1.fields["m_stat"]]&nbsp;</A></td></tr>"
@@ -294,6 +297,12 @@
if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
return return
src.active1.fields["age"] = t1 src.active1.fields["age"] = t1
if("species")
if(active1)
var/t1 = input("Select a species", "Species Selection") as null|anything in roundstart_species
if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
return
active1.fields["species"] = t1
if("mi_dis") if("mi_dis")
if(active2) 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) var/t1 = copytext(sanitize(input("Please input minor disabilities list:", "Med. records", src.active2.fields["mi_dis"], null) as text),1,MAX_MESSAGE_LEN)

View File

@@ -162,20 +162,25 @@
if ((istype(active1, /datum/data/record) && data_core.general.Find(active1))) if ((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
user << browse_rsc(active1.fields["photo_front"], "photo_front") user << browse_rsc(active1.fields["photo_front"], "photo_front")
user << browse_rsc(active1.fields["photo_side"], "photo_side") user << browse_rsc(active1.fields["photo_side"], "photo_side")
dat += {"<table> dat += {"<table><tr><td><table>
<tr><td>Name:</td><td><A href='?src=\ref[src];choice=Edit Field;field=name'>&nbsp;[active1.fields["name"]]&nbsp;</A></td></tr> <tr><td>Name:</td><td><A href='?src=\ref[src];choice=Edit Field;field=name'>&nbsp;[active1.fields["name"]]&nbsp;</A></td></tr>
<tr><td>ID:</td><td><A href='?src=\ref[src];choice=Edit Field;field=id'>&nbsp;[active1.fields["id"]]&nbsp;</A></td></tr> <tr><td>ID:</td><td><A href='?src=\ref[src];choice=Edit Field;field=id'>&nbsp;[active1.fields["id"]]&nbsp;</A></td></tr>
<tr><td>Sex:</td><td><A href='?src=\ref[src];choice=Edit Field;field=sex'>&nbsp;[active1.fields["sex"]]&nbsp;</A></td></tr> <tr><td>Sex:</td><td><A href='?src=\ref[src];choice=Edit Field;field=sex'>&nbsp;[active1.fields["sex"]]&nbsp;</A></td></tr>
<tr><td>Age:</td><td><A href='?src=\ref[src];choice=Edit Field;field=age'>&nbsp;[active1.fields["age"]]&nbsp;</A></td></tr> <tr><td>Age:</td><td><A href='?src=\ref[src];choice=Edit Field;field=age'>&nbsp;[active1.fields["age"]]&nbsp;</A></td></tr>"}
<tr><td>Rank:</td><td><A href='?src=\ref[src];choice=Edit Field;field=rank'>&nbsp;[active1.fields["rank"]]&nbsp;</A></td></tr> if (config.mutant_races)
dat += "<tr><td>Species:</td><td><A href ='?src=\ref[src];choice=Edit Field;field=species'>&nbsp;[active1.fields["species"]]&nbsp;</A></td></tr>"
dat += {"<tr><td>Rank:</td><td><A href='?src=\ref[src];choice=Edit Field;field=rank'>&nbsp;[active1.fields["rank"]]&nbsp;</A></td></tr>
<tr><td>Fingerprint:</td><td><A href='?src=\ref[src];choice=Edit Field;field=fingerprint'>&nbsp;[active1.fields["fingerprint"]]&nbsp;</A></td></tr> <tr><td>Fingerprint:</td><td><A href='?src=\ref[src];choice=Edit Field;field=fingerprint'>&nbsp;[active1.fields["fingerprint"]]&nbsp;</A></td></tr>
<tr><td>Physical Status:</td><td>&nbsp;[active1.fields["p_stat"]]&nbsp;</td></tr> <tr><td>Physical Status:</td><td>&nbsp;[active1.fields["p_stat"]]&nbsp;</td></tr>
<tr><td>Mental Status:</td><td>&nbsp;[active1.fields["m_stat"]]&nbsp;</td></tr> <tr><td>Mental Status:</td><td>&nbsp;[active1.fields["m_stat"]]&nbsp;</td></tr>
</table><div class='statusDisplay'><center><img src=photo_front height=64 width=64><img src=photo_side height=64 width=64></center></div>"} </table></td>
<td><table><td align = center><img src=photo_front height=80 width=80 border=4><br><a href='?src=\ref[src];choice=Edit Field;field=photo front'>Update front photo</a></td>
<td align = center><img src=photo_side height=80 width=80 border=4><br><a href='?src=\ref[src];choice=Edit Field;field=photo side'>Update side photo</a></td></table>
</td></tr></table></td></tr></table>"}
else else
dat += "General Record Lost!<br>" dat += "<br>General Record Lost!<br>"
if ((istype(active2, /datum/data/record) && data_core.security.Find(active2))) if ((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
dat += "<br><font size='4'><b>Security Data</b></font>" dat += "<font size='4'><b>Security Data</b></font>"
dat += "<br>Criminal Status: <A href='?src=\ref[src];choice=Edit Field;field=criminal'>[active2.fields["criminal"]]</A>" dat += "<br>Criminal Status: <A href='?src=\ref[src];choice=Edit Field;field=criminal'>[active2.fields["criminal"]]</A>"
dat += "<br><br>Minor Crimes: <A href='?src=\ref[src];choice=Edit Field;field=mi_crim_add'>Add New</A>" dat += "<br><br>Minor Crimes: <A href='?src=\ref[src];choice=Edit Field;field=mi_crim_add'>Add New</A>"
@@ -357,7 +362,10 @@ What a mess.*/
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( loc ) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( loc )
P.info = "<CENTER><B>Security Record - (SR-[data_core.securityPrintCount])</B></CENTER><BR>" P.info = "<CENTER><B>Security Record - (SR-[data_core.securityPrintCount])</B></CENTER><BR>"
if ((istype(active1, /datum/data/record) && data_core.general.Find(active1))) if ((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
P.info += text("Name: [] ID: []<BR>\nSex: []<BR>\nAge: []<BR>\nFingerprint: []<BR>\nPhysical Status: []<BR>\nMental Status: []<BR>", active1.fields["name"], active1.fields["id"], active1.fields["sex"], active1.fields["age"], active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"]) P.info += text("Name: [] ID: []<BR>\nSex: []<BR>\nAge: []<BR>", active1.fields["name"], active1.fields["id"], active1.fields["sex"], active1.fields["age"])
if (config.mutant_races)
P.info += "\nSpecies: [active1.fields["species"]]<BR>"
P.info += text("\nFingerprint: []<BR>\nPhysical Status: []<BR>\nMental Status: []<BR>", active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"])
else else
P.info += "<B>General Record Lost!</B><BR>" P.info += "<B>General Record Lost!</B><BR>"
if ((istype(active2, /datum/data/record) && data_core.security.Find(active2))) if ((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
@@ -471,6 +479,10 @@ What a mess.*/
G.fields["rank"] = "Unassigned" G.fields["rank"] = "Unassigned"
G.fields["sex"] = "Male" G.fields["sex"] = "Male"
G.fields["age"] = "Unknown" 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["fingerprint"] = "?????"
G.fields["p_stat"] = "Active" G.fields["p_stat"] = "Active"
G.fields["m_stat"] = "Stable" G.fields["m_stat"] = "Stable"
@@ -550,6 +562,20 @@ What a mess.*/
if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1)) if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
return return
active1.fields["age"] = t1 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 ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
return
active1.fields["species"] = t1
if("photo front")
var/icon/photo = get_photo(usr)
if(photo)
active1.fields["photo_front"] = photo
if("photo side")
var/icon/photo = get_photo(usr)
if(photo)
active1.fields["photo_side"] = photo
if("mi_crim_add") if("mi_crim_add")
if (istype(active1, /datum/data/record)) 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/t1 = copytext(sanitize(input("Please input minor crime names:", "Secure. records", "", null) as text),1,MAX_MESSAGE_LEN)
@@ -659,6 +685,16 @@ What a mess.*/
updateUsrDialog() updateUsrDialog()
return return
/obj/machinery/computer/secure_data/proc/get_photo(var/mob/user)
if (istype(user.get_active_hand(), /obj/item/weapon/photo))
var/obj/item/weapon/photo/photo = user.get_active_hand()
return photo.img
if (istype(user, /mob/living/silicon))
var/mob/living/silicon/tempAI = user
var/datum/picture/selection = tempAI.GetPhoto()
if (selection)
return selection.fields["img"]
/obj/machinery/computer/secure_data/emp_act(severity) /obj/machinery/computer/secure_data/emp_act(severity)
if(stat & (BROKEN|NOPOWER)) if(stat & (BROKEN|NOPOWER))
..(severity) ..(severity)
@@ -666,11 +702,11 @@ What a mess.*/
for(var/datum/data/record/R in data_core.security) for(var/datum/data/record/R in data_core.security)
if(prob(10/severity)) if(prob(10/severity))
switch(rand(1,6)) switch(rand(1,8))
if(1) if(1)
R.fields["name"] = "[pick(pick(first_names_male), pick(first_names_female))] [pick(last_names)]" R.fields["name"] = "[pick(pick(first_names_male), pick(first_names_female))] [pick(last_names)]"
if(2) if(2)
R.fields["sex"] = pick("Male", "Female") R.fields["sex"] = pick("Male", "Female")
if(3) if(3)
R.fields["age"] = rand(5, 85) R.fields["age"] = rand(5, 85)
if(4) if(4)
@@ -679,6 +715,12 @@ What a mess.*/
R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit") R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit")
if(6) if(6)
R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable") 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 continue
else if(prob(1)) else if(prob(1))

View File

@@ -252,21 +252,37 @@
if(istype(user, /mob/living/carbon/human)) if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user 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(istype(H.glasses, /obj/item/clothing/glasses/hud))
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/perpname = get_face_name(get_id_name(""))
var/criminal = "None" if(perpname)
var/datum/data/record/R = find_record("name", perpname, data_core.general)
var/perpname = get_face_name(get_id_name("")) if(R)
if(perpname) msg += "<span class = 'deptradio'>Rank:</span> [R.fields["rank"]]<br>"
var/datum/data/record/R = find_record("name", perpname, data_core.security) msg += "<a href='?src=\ref[src];hud=1;photo_front=1'>\[Front photo\]</a> "
msg += "<a href='?src=\ref[src];hud=1;photo_side=1'>\[Side photo\]</a><br>"
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
if(R) if(R)
criminal = R.fields["criminal"] var/health = R.fields["p_stat"]
msg += "<a href='?src=\ref[src];hud=m;p_stat=1'>\[[health]\]</a>"
health = R.fields["m_stat"]
msg += "<a href='?src=\ref[src];hud=m;m_stat=1'>\[[health]\]</a><br>"
R = find_record("name", perpname, data_core.medical)
if(R)
msg += "<a href='?src=\ref[src];hud=m;evaluation=1'>\[Medical evaluation\]</a><br>"
msg += "<span class = 'deptradio'>Criminal status:</span> <a href='?src=\ref[src];criminal=1;status=1'>\[[criminal]\]</a>\n" if(istype(H.glasses, /obj/item/clothing/glasses/hud/security))
msg += "<span class = 'deptradio'>Security record:</span> <a href='?src=\ref[src];criminal=1;view=1'>\[View\]</a> " 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.
msg += "<a href='?src=\ref[src];criminal=1;add_crime=1'>\[Add crime\]</a> " var/criminal = "None"
msg += "<a href='?src=\ref[src];criminal=1;view_comment=1'>\[View comment log\]</a> "
msg += "<a href='?src=\ref[src];criminal=1;add_comment=1'>\[Add comment\]</a>\n" R = find_record("name", perpname, data_core.security)
if(R)
criminal = R.fields["criminal"]
msg += "<span class = 'deptradio'>Criminal status:</span> <a href='?src=\ref[src];hud=s;status=1'>\[[criminal]\]</a>\n"
msg += "<span class = 'deptradio'>Security record:</span> <a href='?src=\ref[src];hud=s;view=1'>\[View\]</a> "
msg += "<a href='?src=\ref[src];hud=s;add_crime=1'>\[Add crime\]</a> "
msg += "<a href='?src=\ref[src];hud=s;view_comment=1'>\[View comment log\]</a> "
msg += "<a href='?src=\ref[src];hud=s;add_comment=1'>\[Add comment\]</a>\n"
msg += "*---------*</span>" msg += "*---------*</span>"

View File

@@ -306,114 +306,186 @@
..() ..()
///////HUDs///////
if(href_list["criminal"]) if(href_list["hud"])
if(istype(usr, /mob/living/carbon/human)) if(istype(usr, /mob/living/carbon/human))
var/mob/living/carbon/human/H = usr var/mob/living/carbon/human/H = usr
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security)) var/perpname = get_face_name(get_id_name(""))
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. if(istype(H.glasses, /obj/item/clothing/glasses/hud))
return //Non-fluff: This allows sec to set people to arrest as they get disarmed or beaten var/datum/data/record/R = find_record("name", perpname, data_core.general)
// Checks the user has security clearence before allowing them to change arrest status via hud, comment out to enable all access if(R)
var/allowed_access = null if(usr.stat || H.weakened || H.stunned || H.restrained() || !istype(H.glasses, /obj/item/clothing/glasses/hud))
var/obj/item/clothing/glasses/G = H.glasses return
if (!G.emagged) var/icon/img = null
if(H.wear_id) if(href_list["photo_front"])
var/list/access = H.wear_id.GetAccess() img = R.fields["photo_front"]
if(access_sec_doors in access) if(href_list["photo_side"])
allowed_access = H.get_authentification_name() img = R.fields["photo_side"]
else if(img)
allowed_access = "@%&ERROR_%$*" usr << browse_rsc(img, "photo")
usr << browse("<img src='photo' height=80 width=80 border=4>", "window=photo;size=120x120")
if(href_list["hud"] == "m")
if(!allowed_access) if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
H << "<span class='warning'>ERROR: Invalid Access</span>" if(usr.stat || H.weakened || H.stunned || H.restrained() || !istype(H.glasses, /obj/item/clothing/glasses/hud/health))
return return
if(href_list["p_stat"])
var/perpname = get_face_name(get_id_name("")) 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(perpname) if(usr.stat || H.weakened || H.stunned || H.restrained() || !istype(H.glasses, /obj/item/clothing/glasses/hud/health))
var/datum/data/record/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(R)
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security))
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 return
if(health != "Cancel")
if(href_list["view"]) R.fields["p_stat"] = health
if(R) if(href_list["m_stat"])
if(usr.stat || H.weakened || H.stunned || H.restrained() || !istype(H.glasses, /obj/item/clothing/glasses/hud/security)) 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")
return if(usr.stat || H.weakened || H.stunned || H.restrained() || !istype(H.glasses, /obj/item/clothing/glasses/hud/health))
usr << "<b>Name:</b> [R.fields["name"]] <b>Criminal Status:</b> [R.fields["criminal"]]"
usr << "<b>Minor Crimes:</b>"
for(var/datum/data/crime/c in R.fields["mi_crim"])
usr << "<b>Crime:</b> [c.crimeName]"
usr << "<b>Details:</b> [c.crimeDetails]"
usr << "Added by [c.author] at [c.time]"
usr << "----------"
usr << "<b>Major Crimes:</b>"
for(var/datum/data/crime/c in R.fields["ma_crim"])
usr << "<b>Crime:</b> [c.crimeName]"
usr << "<b>Details:</b> [c.crimeDetails]"
usr << "Added by [c.author] at [c.time]"
usr << "----------"
usr << "<b>Notes:</b> [R.fields["notes"]]"
return return
if(health != "Cancel")
R.fields["m_stat"] = health
if(href_list["evaluation"])
if(!getBruteLoss() && !getFireLoss() && !getOxyLoss() && getToxLoss() < 20)
usr << "<span class='notice'>No external injuries detected.</span><br>"
return
var/span = "notice"
var/status = ""
if(getBruteLoss())
usr << "<b>Physical trauma analysis:</b>"
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 << "<span class='[span]'>The [org.getDisplayName()] appears to have [status]</span>"
if(getFireLoss())
usr << "<b>Analysis of skin burns:</b>"
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 << "<span class='[span]'>The [org.getDisplayName()] appears to have [status]</span>"
if(getOxyLoss())
usr << "<span class='danger'>Patient has signs of suffocation, emergency treatment may be required!</span>"
if(getToxLoss() > 20)
usr << "<span class='danger'>Gathered data is inconsistent with the analysis, possible cause: intoxication.</span>"
if(href_list["add_crime"]) if(href_list["hud"] == "s")
switch(alert("What crime would you like to add?","Security HUD","Minor Crime","Major Crime","Cancel")) if(istype(H.glasses, /obj/item/clothing/glasses/hud/security))
if("Minor Crime") 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 << "<span class='warning'>ERROR: Invalid Access</span>"
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(R) if(R)
var/t1 = copytext(sanitize(input("Please input minor crime names:", "Security HUD", "", null) as text),1,MAX_MESSAGE_LEN) if(istype(H.glasses, /obj/item/clothing/glasses/hud/security))
var/t2 = copytext(sanitize(input("Please input minor crime details:", "Security HUD", "", null) as message),1,MAX_MESSAGE_LEN) if(setcriminal != "Cancel")
if(R) investigate_log("[src.key] has been set from [R.fields["criminal"]] to [setcriminal] by [usr.name] ([usr.key]).", "records")
if (!t1 || !t2 || !allowed_access || H.stat || H.weakened || H.stunned || H.restrained() || !istype(H.glasses, /obj/item/clothing/glasses/hud/security)) R.fields["criminal"] = setcriminal
return sec_hud_set_security_status()
var/crime = data_core.createCrimeEntry(t1, t2, allowed_access, worldtime2text())
data_core.addMinorCrime(R.fields["id"], crime)
usr << "<span class='notice'>Successfully added a minor crime.</span>"
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 << "<span class='notice'>Successfully added a major crime.</span>"
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))
return
usr << "<b>Comments/Log:</b>"
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))
return return
var/counter = 1
while(R.fields[text("com_[]", counter)]) if(href_list["view"])
counter++ if(R)
R.fields[text("com_[]", counter)] = text("Made by [] on [] [], []<BR>[]", allowed_access, worldtime2text(), time2text(world.realtime, "MMM DD"), year_integer+540, t1,) if(usr.stat || H.weakened || H.stunned || H.restrained() || !istype(H.glasses, /obj/item/clothing/glasses/hud/security))
usr << "<span class='notice'>Successfully added comment.</span>" return
return usr << "<b>Name:</b> [R.fields["name"]] <b>Criminal Status:</b> [R.fields["criminal"]]"
usr << "<span class='warning'>Unable to locate a data core entry for this person.</span>" usr << "<b>Minor Crimes:</b>"
for(var/datum/data/crime/c in R.fields["mi_crim"])
usr << "<b>Crime:</b> [c.crimeName]"
usr << "<b>Details:</b> [c.crimeDetails]"
usr << "Added by [c.author] at [c.time]"
usr << "----------"
usr << "<b>Major Crimes:</b>"
for(var/datum/data/crime/c in R.fields["ma_crim"])
usr << "<b>Crime:</b> [c.crimeName]"
usr << "<b>Details:</b> [c.crimeDetails]"
usr << "Added by [c.author] at [c.time]"
usr << "----------"
usr << "<b>Notes:</b> [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 << "<span class='notice'>Successfully added a minor crime.</span>"
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 << "<span class='notice'>Successfully added a major crime.</span>"
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))
return
usr << "<b>Comments/Log:</b>"
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))
return
var/counter = 1
while(R.fields[text("com_[]", counter)])
counter++
R.fields[text("com_[]", counter)] = text("Made by [] on [] [], []<BR>[]", allowed_access, worldtime2text(), time2text(world.realtime, "MMM DD"), year_integer+540, t1,)
usr << "<span class='notice'>Successfully added comment.</span>"
return
usr << "<span class='warning'>Unable to locate a data core entry for this person.</span>"
/mob/living/carbon/human/proc/play_xylophone() /mob/living/carbon/human/proc/play_xylophone()
if(!src.xylophone) if(!src.xylophone)

View File

@@ -34,7 +34,6 @@ var/list/ai_list = list()
radiomod = ";" //AIs will, by default, state their laws on the internal radio. radiomod = ";" //AIs will, by default, state their laws on the internal radio.
var/obj/item/device/pda/ai/aiPDA = null var/obj/item/device/pda/ai/aiPDA = null
var/obj/item/device/multitool/aiMulti = null var/obj/item/device/multitool/aiMulti = null
var/obj/item/device/camera/siliconcam/aicamera = null
var/obj/machinery/bot/Bot var/obj/machinery/bot/Bot
//MALFUNCTION //MALFUNCTION

View File

@@ -56,7 +56,6 @@
var/obj/item/weapon/tank/internal = null //Hatred. Used if a borg has a jetpack. 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/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/toner = 0
var/tonermax = 40 var/tonermax = 40

View File

@@ -9,6 +9,7 @@
var/list/alarms_to_clear = list() var/list/alarms_to_clear = list()
var/designation = "" var/designation = ""
var/radiomod = "" //Radio character used before state laws/arrivals announce to allow department transmissions, default, or none at all. 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() var/obj/item/device/radio/borg/radio = null //AIs dont use this but this is at the silicon level to advoid copypasta in say()
@@ -408,3 +409,7 @@
visible_message("<span class='danger'>[M] punches [src], but doesn't leave a dent.</span>", \ visible_message("<span class='danger'>[M] punches [src], but doesn't leave a dent.</span>", \
"<span class='userdanger'>[M] punches [src], but doesn't leave a dent.!</span>") "<span class='userdanger'>[M] punches [src], but doesn't leave a dent.!</span>")
return 0 return 0
/mob/living/silicon/proc/GetPhoto()
if (aicamera)
return aicamera.selectpicture(aicamera)

View File

@@ -332,22 +332,22 @@
else else
injectaialbum(icon, img, desc, pixel_x, pixel_y, blueprintsinject) injectaialbum(icon, img, desc, pixel_x, pixel_y, blueprintsinject)
obj/item/device/camera/siliconcam/proc/selectpicture(var/obj/item/device/camera/siliconcam/targetloc)
obj/item/device/camera/siliconcam/proc/viewpichelper(var/obj/item/device/camera/siliconcam/targetloc)
var/list/nametemp = list() var/list/nametemp = list()
var/find var/find
var/datum/picture/selection
if(targetloc.aipictures.len == 0) if(targetloc.aipictures.len == 0)
usr << "<span class='userdanger'>No images saved</span>" usr << "<span class='userdanger'>No images saved</span>"
return return
for(var/datum/picture/t in targetloc.aipictures) for(var/datum/picture/t in targetloc.aipictures)
nametemp += t.fields["name"] nametemp += t.fields["name"]
find = input("Select image (numbered in order taken)") in nametemp 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) for(var/datum/picture/q in targetloc.aipictures)
if(q.fields["name"] == find) if(q.fields["name"] == find)
selection = q return q
break // just in case some AI decides to take 10 thousand pictures in a round
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.photocreate(selection.fields["icon"], selection.fields["img"], selection.fields["desc"])
P.pixel_x = selection.fields["pixel_x"] P.pixel_x = selection.fields["pixel_x"]
P.pixel_y = selection.fields["pixel_y"] P.pixel_y = selection.fields["pixel_y"]