/* I hate to make this a todo, but I cannot possibly complete all of computer3 if I have to rearchitecture datacores and everything else that uses them right now. In the future the datacore should probably be a server, perhaps on station, perhaps on centcom, with data records as files probably. It's not difficult unless you're trying to do a million impossible things before breakfast. */ /obj/machinery/computer3/med_data default_prog = /datum/file/program/med_data spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/cardslot,/obj/item/part/computer/networking/radio) /obj/machinery/computer3/laptop/medical spawn_parts = list(/obj/item/part/computer/storage/hdd,/obj/item/part/computer/cardslot,/obj/item/part/computer/networking/radio) spawn_files = list(/datum/file/program/arcade,/datum/file/program/crew,/datum/file/program/med_data) /datum/file/program/med_data name = "Medical Records" desc = "This can be used to check medical records." active_state = "medcomp" req_one_access = list(access_medical, access_forensics_lockers) var/obj/item/weapon/card/id/scan = null var/obj/item/weapon/card/id/scan2 = null var/authenticated = null var/rank = null var/screen = null var/datum/data/record/active1 = null var/datum/data/record/active2 = null var/a_id = null var/temp = null var/printing = null proc/authenticate() if(access_medical in scan.access) return 1 if(istype(usr,/mob/living/silicon/ai)) return 1 return 0 interact() if(!computer.cardslot) computer.Crash(MISSING_PERIPHERAL) return usr.set_machine(src) scan = computer.cardslot.reader if(!interactable()) return if (computer.z > 6) usr << "\red Unable to establish a connection: \black You're too far away from the station!" return var/dat if (temp) dat = text("[src.temp]

Clear Screen") else dat = text("Confirm Identity (R): []
", src, (scan ? text("[]", scan.name) : "----------")) if (computer.cardslot.dualslot) dat += text("Check Identity (W): []
", src, (scan2 ? text("[]", scan2.name) : "----------")) if(scan2 && !scan) dat += text("
Insert card into reader slot to log in.

") if (src.authenticated) switch(src.screen) if(1.0) dat += {" Search Records
List Records

Virus Database
Medbot Tracking

Record Maintenance
{Log Out}
"} if(2.0) dat += "Record List:
" if(!isnull(data_core.general)) for(var/datum/data/record/R in sortRecord(data_core.general)) dat += text("[]: []
", src, R, R.fields["id"], R.fields["name"]) //Foreach goto(132) dat += text("
Back", src) if(3.0) dat += text("Records Maintenance
\nBackup To Disk
\nUpload From disk
\nDelete All Records
\n
\nBack", src, src, src, src) if(4.0) var/icon/front = active1.fields["photo_front"] var/icon/side = active1.fields["photo_side"] usr << browse_rsc(front, "front.png") usr << browse_rsc(side, "side.png") dat += "
Medical Record

" if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1))) dat += "
Name: [active1.fields["name"]] \ ID: [active1.fields["id"]]
\n \ Sex: [active1.fields["sex"]]
\n \ Age: [active1.fields["age"]]
\n \ Fingerprint: [active1.fields["fingerprint"]]
\n \ Physical Status: [active1.fields["p_stat"]]
\n \ Mental Status: [active1.fields["m_stat"]]
\ Photo:
" else dat += "General Record Lost!
" if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2))) dat += text("
\n
Medical Data

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

", src, src.active2.fields["b_type"], src, src.active2.fields["b_dna"], src, src.active2.fields["mi_dis"], src, src.active2.fields["mi_dis_d"], src, src.active2.fields["ma_dis"], src, src.active2.fields["ma_dis_d"], src, src.active2.fields["alg"], src, src.active2.fields["alg_d"], src, src.active2.fields["cdi"], src, src.active2.fields["cdi_d"], src, decode(src.active2.fields["notes"])) var/counter = 1 while(src.active2.fields[text("com_[]", counter)]) dat += text("[]
Delete Entry

", src.active2.fields[text("com_[]", counter)], src, counter) counter++ dat += text("Add Entry

", src) dat += text("Delete Record (Medical Only)

", src) else dat += "Medical Record Lost!
" dat += text("New Record

") dat += text("\nPrint Record
\nBack
", src, src) if(5.0) dat += "
Virus Database
" /* Advanced diseases is weak! Feeble! Glory to virus2! for(var/Dt in typesof(/datum/disease/)) var/datum/disease/Dis = new Dt(0) if(istype(Dis, /datum/disease/advance)) continue // TODO (tm): Add advance diseases to the virus database which no one uses. if(!Dis.desc) continue dat += "
[Dis.name]" */ for (var/ID in virusDB) var/datum/data/record/v = virusDB[ID] dat += "
[v.fields["name"]]" dat += "
Back" if(6.0) dat += "
Medical Robot Monitor
" dat += "Back" dat += "
Medical Robots:" var/bdat = null for(var/obj/machinery/bot/medbot/M in world) if(M.z != computer.z) continue //only find medibots on the same z-level as the computer var/turf/bl = get_turf(M) if(bl) //if it can't find a turf for the medibot, then it probably shouldn't be showing up bdat += "[M.name] - \[[bl.x],[bl.y]\] - [M.on ? "Online" : "Offline"]
" if((!isnull(M.reagent_glass)) && M.use_beaker) bdat += "Reservoir: \[[M.reagent_glass.reagents.total_volume]/[M.reagent_glass.reagents.maximum_volume]\]
" else bdat += "Using Internal Synthesizer.
" if(!bdat) dat += "
None detected
" else dat += "
[bdat]" else else dat += text("{Log In}", src) popup.width = 600 popup.height = 400 popup.set_content(dat) popup.set_title_image(usr.browse_rsc_icon(computer.icon, computer.icon_state)) popup.open() return Topic(href, href_list) if(!interactable() || !computer.cardslot || ..(href,href_list)) return if (!( data_core.general.Find(src.active1) )) src.active1 = null if (!( data_core.medical.Find(src.active2) )) src.active2 = null if (href_list["temp"]) src.temp = null if (href_list["cardr"]) if (scan) if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand()) computer.cardslot.remove(1) else scan.loc = get_turf(src) scan = null else var/obj/item/I = usr.get_active_hand() if (istype(I, /obj/item/weapon/card/id)) computer.cardslot.insert(I, 1) scan = I if (href_list["cardw"]) if (scan2) if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand()) computer.cardslot.remove(2) else scan2.loc = get_turf(src) scan2 = null else var/obj/item/I = usr.get_active_hand() if (istype(I, /obj/item/weapon/card/id)) computer.cardslot.insert(I, 2) scan2 = I else if (href_list["logout"]) src.authenticated = null src.screen = null src.active1 = null src.active2 = null else if (href_list["login"]) if (istype(usr, /mob/living/silicon/ai)) src.active1 = null src.active2 = null src.authenticated = usr.name src.rank = "AI" src.screen = 1 else if (istype(usr, /mob/living/silicon/robot)) src.active1 = null src.active2 = null src.authenticated = usr.name var/mob/living/silicon/robot/R = usr src.rank = "[R.modtype] [R.braintype]" src.screen = 1 else if (istype(src.scan, /obj/item/weapon/card/id)) src.active1 = null src.active2 = null if (src.check_access(src.scan)) src.authenticated = src.scan.registered_name src.rank = src.scan.assignment src.screen = 1 if (src.authenticated) if(href_list["screen"]) src.screen = text2num(href_list["screen"]) if(src.screen < 1) src.screen = 1 src.active1 = null src.active2 = null if(href_list["vir"]) var/datum/data/record/v = locate(href_list["vir"]) src.temp = "
GNAv2 based virus lifeform V-[v.fields["id"]]
" src.temp += "
Name: [v.fields["name"]]" src.temp += "
Antigen: [v.fields["antigen"]]" src.temp += "
Spread: [v.fields["spread type"]] " src.temp += "
Details:
[v.fields["description"]]" if (href_list["del_all"]) src.temp = text("Are you sure you wish to delete all records?
\n\tYes
\n\tNo
", src, src) if (href_list["del_all2"]) for(var/datum/data/record/R in data_core.medical) //R = null del(R) //Foreach goto(494) src.temp = "All records deleted." if (href_list["field"]) var/a1 = src.active1 var/a2 = src.active2 switch(href_list["field"]) if("fingerprint") if (istype(src.active1, /datum/data/record)) var/t1 = copytext(trim(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() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) return src.active1.fields["fingerprint"] = t1 if("sex") if (istype(src.active1, /datum/data/record)) if (src.active1.fields["sex"] == "Male") src.active1.fields["sex"] = "Female" else src.active1.fields["sex"] = "Male" if("age") if (istype(src.active1, /datum/data/record)) var/t1 = input("Please input age:", "Med. records", src.active1.fields["age"], null) as num if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) return src.active1.fields["age"] = t1 if("mi_dis") if (istype(src.active2, /datum/data/record)) var/t1 = copytext(trim(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() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["mi_dis"] = t1 if("mi_dis_d") if (istype(src.active2, /datum/data/record)) var/t1 = copytext(trim(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() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["mi_dis_d"] = t1 if("ma_dis") if (istype(src.active2, /datum/data/record)) var/t1 = copytext(trim(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() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["ma_dis"] = t1 if("ma_dis_d") if (istype(src.active2, /datum/data/record)) var/t1 = copytext(trim(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() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["ma_dis_d"] = t1 if("alg") if (istype(src.active2, /datum/data/record)) var/t1 = copytext(trim(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() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["alg"] = t1 if("alg_d") if (istype(src.active2, /datum/data/record)) var/t1 = copytext(trim(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() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["alg_d"] = t1 if("cdi") if (istype(src.active2, /datum/data/record)) var/t1 = copytext(trim(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() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["cdi"] = t1 if("cdi_d") if (istype(src.active2, /datum/data/record)) var/t1 = copytext(trim(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() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["cdi_d"] = t1 if("notes") if (istype(src.active2, /datum/data/record)) var/t1 = copytext(html_encode(trim(input("Please summarize notes:", "Med. records", html_decode(src.active2.fields["notes"]), null) as message)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["notes"] = t1 if("p_stat") if (istype(src.active1, /datum/data/record)) src.temp = text("Physical Condition:
\n\t*Deceased*
\n\t*SSD*
\n\tActive
\n\tPhysically Unfit
\n\tDisabled
", src, src, src, src, src) if("m_stat") if (istype(src.active1, /datum/data/record)) src.temp = text("Mental Condition:
\n\t*Insane*
\n\t*Unstable*
\n\t*Watch*
\n\tStable
", src, src, src, src) if("b_type") if (istype(src.active2, /datum/data/record)) src.temp = text("Blood Type:
\n\tA- A+
\n\tB- B+
\n\tAB- AB+
\n\tO- O+
", src, src, src, src, src, src, src, src) if("b_dna") if (istype(src.active2, /datum/data/record)) var/t1 = copytext(sanitize(trim(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() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return src.active2.fields["b_dna"] = t1 if("vir_name") var/datum/data/record/v = locate(href_list["edit_vir"]) if (v) var/t1 = copytext(trim(sanitize(input("Please input pathogen name:", "VirusDB", v.fields["name"], null) as text)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) return v.fields["name"] = t1 if("vir_desc") var/datum/data/record/v = locate(href_list["edit_vir"]) if (v) var/t1 = copytext(trim(sanitize(input("Please input information about pathogen:", "VirusDB", v.fields["description"], null) as message)),1,MAX_MESSAGE_LEN) if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1)) return v.fields["description"] = t1 else if (href_list["p_stat"]) if (src.active1) switch(href_list["p_stat"]) if("deceased") src.active1.fields["p_stat"] = "*Deceased*" if("ssd") src.active1.fields["p_stat"] = "*SSD*" if("active") src.active1.fields["p_stat"] = "Active" if("unfit") src.active1.fields["p_stat"] = "Physically Unfit" if("disabled") src.active1.fields["p_stat"] = "Disabled" if(PDA_Manifest.len) PDA_Manifest.Cut() if (href_list["m_stat"]) if (src.active1) switch(href_list["m_stat"]) if("insane") src.active1.fields["m_stat"] = "*Insane*" if("unstable") src.active1.fields["m_stat"] = "*Unstable*" if("watch") src.active1.fields["m_stat"] = "*Watch*" if("stable") src.active1.fields["m_stat"] = "Stable" if (href_list["b_type"]) if (src.active2) switch(href_list["b_type"]) if("an") src.active2.fields["b_type"] = "A-" if("bn") src.active2.fields["b_type"] = "B-" if("abn") src.active2.fields["b_type"] = "AB-" if("on") src.active2.fields["b_type"] = "O-" if("ap") src.active2.fields["b_type"] = "A+" if("bp") src.active2.fields["b_type"] = "B+" if("abp") src.active2.fields["b_type"] = "AB+" if("op") src.active2.fields["b_type"] = "O+" if (href_list["del_r"]) if (src.active2) src.temp = text("Are you sure you wish to delete the record (Medical Portion Only)?
\n\tYes
\n\tNo
", src, src) if (href_list["del_r2"]) if (src.active2) //src.active2 = null del(src.active2) if (href_list["d_rec"]) var/datum/data/record/R = locate(href_list["d_rec"]) var/datum/data/record/M = locate(href_list["d_rec"]) if (!( data_core.general.Find(R) )) src.temp = "Record Not Found!" return for(var/datum/data/record/E in data_core.medical) if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) M = E else //Foreach continue //goto(2540) src.active1 = R src.active2 = M src.screen = 4 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"] R.name = text("Medical Record #[]", R.fields["id"]) R.fields["b_type"] = "Unknown" R.fields["b_dna"] = "Unknown" R.fields["mi_dis"] = "None" R.fields["mi_dis_d"] = "No minor disabilities have been declared." R.fields["ma_dis"] = "None" R.fields["ma_dis_d"] = "No major disabilities have been diagnosed." R.fields["alg"] = "None" R.fields["alg_d"] = "No allergies have been detected in this patient." R.fields["cdi"] = "None" R.fields["cdi_d"] = "No diseases have been diagnosed at the moment." R.fields["notes"] = "No notes." data_core.medical += R src.active2 = R src.screen = 4 if (href_list["add_c"]) if (!( istype(src.active2, /datum/data/record) )) 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() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2)) return var/counter = 1 while(src.active2.fields[text("com_[]", counter)]) counter++ src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]
[t1]") if (href_list["del_c"]) if ((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])])) src.active2.fields[text("com_[]", href_list["del_c"])] = "Deleted" if (href_list["search"]) var/t1 = input("Search String: (Name, DNA, or ID)", "Med. records", null, null) as text if ((!( t1 ) || usr.stat || !( src.authenticated ) || usr.restrained() || ((!interactable()) && (!istype(usr, /mob/living/silicon))))) 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"]))) src.active2 = R else //Foreach continue //goto(3229) 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"])) src.active1 = E else //Foreach continue //goto(3334) src.screen = 4 if (href_list["print_p"]) if (!( src.printing )) src.printing = 1 var/datum/data/record/record1 = null var/datum/data/record/record2 = null if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1))) record1 = active1 if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2))) record2 = active2 sleep(50) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( computer.loc ) P.info = "
Medical Record

" if (record1) P.info += text("Name: [] ID: []
\nSex: []
\nAge: []
\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", record1.fields["name"], record1.fields["id"], record1.fields["sex"], record1.fields["age"], record1.fields["fingerprint"], record1.fields["p_stat"], record1.fields["m_stat"]) P.name = text("Medical Record ([])", record1.fields["name"]) else P.info += "General Record Lost!
" P.name = "Medical Record" if (record2) P.info += text("
\n
Medical Data

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

", record2.fields["b_type"], record2.fields["b_dna"], record2.fields["mi_dis"], record2.fields["mi_dis_d"], record2.fields["ma_dis"], record2.fields["ma_dis_d"], record2.fields["alg"], record2.fields["alg_d"], record2.fields["cdi"], record2.fields["cdi_d"], decode(record2.fields["notes"])) var/counter = 1 while(record2.fields[text("com_[]", counter)]) P.info += text("[]
", record2.fields[text("com_[]", counter)]) counter++ else P.info += "Medical Record Lost!
" P.info += "" src.printing = null interact() return