// Pretty much everything here is stolen from the dna scanner FYI /obj/machinery/bodyscanner var/mob/living/carbon/occupant var/locked name = "Body Scanner" icon = 'icons/obj/Cryogenic2.dmi' icon_state = "body_scanner_0" density = 1 anchored = 1 use_power = 1 idle_power_usage = 60 active_power_usage = 10000 //10 kW. It's a big all-body scanner. /*/obj/machinery/bodyscanner/allow_drop() return 0*/ /obj/machinery/bodyscanner/relaymove(mob/user as mob) if (user.stat) return src.go_out() return /obj/machinery/bodyscanner/verb/eject() set src in oview(1) set category = "Object" set name = "Eject Body Scanner" if (usr.stat != 0) return src.go_out() add_fingerprint(usr) return /obj/machinery/bodyscanner/verb/move_inside() set src in oview(1) set category = "Object" set name = "Enter Body Scanner" if (usr.stat != 0) return if (src.occupant) usr << "\blue The scanner is already occupied!" return if (usr.abiotic()) usr << "\blue Subject cannot have abiotic items on." return usr.pulling = null usr.client.perspective = EYE_PERSPECTIVE usr.client.eye = src usr.loc = src src.occupant = usr update_use_power(2) src.icon_state = "body_scanner_1" for(var/obj/O in src) //O = null del(O) //Foreach goto(124) src.add_fingerprint(usr) return /obj/machinery/bodyscanner/proc/go_out() if ((!( src.occupant ) || src.locked)) return for(var/obj/O in src) O.loc = src.loc //Foreach goto(30) if (src.occupant.client) src.occupant.client.eye = src.occupant.client.mob src.occupant.client.perspective = MOB_PERSPECTIVE src.occupant.loc = src.loc src.occupant = null update_use_power(1) src.icon_state = "body_scanner_0" return /obj/machinery/bodyscanner/attackby(obj/item/weapon/grab/G as obj, user as mob) if ((!( istype(G, /obj/item/weapon/grab) ) || !( ismob(G.affecting) ))) return if (src.occupant) user << "\blue The scanner is already occupied!" return if (G.affecting.abiotic()) user << "\blue Subject cannot have abiotic items on." return var/mob/M = G.affecting if (M.client) M.client.perspective = EYE_PERSPECTIVE M.client.eye = src M.loc = src src.occupant = M update_use_power(2) src.icon_state = "body_scanner_1" for(var/obj/O in src) O.loc = src.loc //Foreach goto(154) src.add_fingerprint(user) //G = null del(G) return /obj/machinery/bodyscanner/ex_act(severity) switch(severity) if(1.0) for(var/atom/movable/A as mob|obj in src) A.loc = src.loc ex_act(severity) //Foreach goto(35) //SN src = null del(src) return if(2.0) if (prob(50)) for(var/atom/movable/A as mob|obj in src) A.loc = src.loc ex_act(severity) //Foreach goto(108) //SN src = null del(src) return if(3.0) if (prob(25)) for(var/atom/movable/A as mob|obj in src) A.loc = src.loc ex_act(severity) //Foreach goto(181) //SN src = null del(src) return else return /obj/machinery/bodyscanner/blob_act() if(prob(50)) for(var/atom/movable/A as mob|obj in src) A.loc = src.loc del(src) /obj/machinery/body_scanconsole/ex_act(severity) switch(severity) if(1.0) //SN src = null del(src) return if(2.0) if (prob(50)) //SN src = null del(src) return else return /obj/machinery/body_scanconsole/blob_act() if(prob(50)) del(src) /obj/machinery/body_scanconsole/power_change() ..() if(stat & BROKEN) icon_state = "body_scannerconsole-p" else if (stat & NOPOWER) spawn(rand(0, 15)) src.icon_state = "body_scannerconsole-p" else icon_state = initial(icon_state) /obj/machinery/body_scanconsole var/obj/machinery/bodyscanner/connected var/known_implants = list(/obj/item/weapon/implant/chem, /obj/item/weapon/implant/death_alarm, /obj/item/weapon/implant/loyalty, /obj/item/weapon/implant/tracking) var/delete var/temphtml name = "Body Scanner Console" icon = 'icons/obj/Cryogenic2.dmi' icon_state = "body_scannerconsole" density = 1 anchored = 1 /obj/machinery/body_scanconsole/New() ..() spawn( 5 ) src.connected = locate(/obj/machinery/bodyscanner, get_step(src, WEST)) return return /* /obj/machinery/body_scanconsole/process() //not really used right now if(stat & (NOPOWER|BROKEN)) return //use_power(250) // power stuff // var/mob/M //occupant // if (!( src.status )) //remove this // return // if ((src.connected && src.connected.occupant)) //connected & occupant ok // M = src.connected.occupant // else // if (istype(M, /mob)) // //do stuff // else /// src.temphtml = "Process terminated due to lack of occupant in scanning chamber." // src.status = null // src.updateDialog() // return */ /obj/machinery/body_scanconsole/attack_ai(user as mob) return src.attack_hand(user) /obj/machinery/body_scanconsole/attack_hand(user as mob) if(..()) return if(stat & (NOPOWER|BROKEN)) return if(!connected || (connected.stat & (NOPOWER|BROKEN))) user << "\red This console is not connected to a functioning body scanner." return if(!ishuman(connected.occupant)) user << "\red This device can only scan compatible lifeforms." return var/dat if (src.delete && src.temphtml) //Window in buffer but its just simple message, so nothing src.delete = src.delete else if (!src.delete && src.temphtml) //Window in buffer - its a menu, dont add clear message dat = text("[]

Main Menu", src.temphtml, src) else if (src.connected) //Is something connected? dat = format_occupant_data(src.connected.get_occupant_data()) dat += "
Print
" else dat = " Error: No Body Scanner connected." dat += text("
Close", user) user << browse(dat, "window=scanconsole;size=430x600") return /obj/machinery/body_scanconsole/Topic(href, href_list) if (..()) return if (href_list["print"]) if (!src.connected) usr << "\icon[src]Error: No body scanner connected." return var/mob/living/carbon/human/occupant = src.connected.occupant if (!src.connected.occupant) usr << "\icon[src]The body scanner is empty." return if (!istype(occupant,/mob/living/carbon/human)) usr << "\icon[src]The body scanner cannot scan that lifeform." return var/obj/item/weapon/paper/R = new(src.loc) R.name = "Body scan report" R.info = format_occupant_data(src.connected.get_occupant_data()) /obj/machinery/bodyscanner/proc/get_occupant_data() if (!occupant || !istype(occupant, /mob/living/carbon/human)) return var/mob/living/carbon/human/H = occupant var/list/occupant_data = list( "stationtime" = worldtime2text(), "stat" = H.stat, "health" = H.health, "virus_present" = H.virus2.len, "bruteloss" = H.getBruteLoss(), "fireloss" = H.getFireLoss(), "oxyloss" = H.getOxyLoss(), "toxloss" = H.getToxLoss(), "rads" = H.radiation, "cloneloss" = H.getCloneLoss(), "brainloss" = H.getBrainLoss(), "paralysis" = H.paralysis, "bodytemp" = H.bodytemperature, "borer_present" = H.has_brain_worms(), "inaprovaline_amount" = H.reagents.get_reagent_amount("inaprovaline"), "dexalin_amount" = H.reagents.get_reagent_amount("dexalin"), "stoxin_amount" = H.reagents.get_reagent_amount("stoxin"), "bicaridine_amount" = H.reagents.get_reagent_amount("bicaridine"), "dermaline_amount" = H.reagents.get_reagent_amount("dermaline"), "blood_amount" = H.vessel.get_reagent_amount("blood"), "disabilities" = H.sdisabilities, "tg_diseases_list" = H.viruses.Copy(), "lung_ruptured" = H.is_lung_ruptured(), "external_organs" = H.organs.Copy(), "internal_organs" = H.internal_organs.Copy(), "species_organs" = H.species.has_organ //Just pass a reference for this, it shouldn't ever be modified outside of the datum. ) return occupant_data /obj/machinery/body_scanconsole/proc/format_occupant_data(var/list/occ) var/dat = "Scan performed at [occ["stationtime"]]
" dat += "Occupant Statistics:
" var/aux switch (occ["stat"]) if(0) aux = "Conscious" if(1) aux = "Unconscious" else aux = "Dead" dat += text("[]\tHealth %: [] ([])
", (occ["health"] > 50 ? "" : ""), occ["health"], aux) if (occ["virus_present"]) dat += "Viral pathogen detected in blood stream.
" dat += text("[]\t-Brute Damage %: []

", (occ["bruteloss"] < 60 ? "" : ""), occ["bruteloss"]) dat += text("[]\t-Respiratory Damage %: []
", (occ["oxyloss"] < 60 ? "" : ""), occ["oxyloss"]) dat += text("[]\t-Toxin Content %: []
", (occ["toxloss"] < 60 ? "" : ""), occ["toxloss"]) dat += text("[]\t-Burn Severity %: []

", (occ["fireloss"] < 60 ? "" : ""), occ["fireloss"]) dat += text("[]\tRadiation Level %: []
", (occ["rads"] < 10 ?"" : ""), occ["rads"]) dat += text("[]\tGenetic Tissue Damage %: []
", (occ["cloneloss"] < 1 ?"" : ""), occ["cloneloss"]) dat += text("[]\tApprox. Brain Damage %: []
", (occ["brainloss"] < 1 ?"" : ""), occ["brainloss"]) dat += text("Paralysis Summary %: [] ([] seconds left!)
", occ["paralysis"], round(occ["paralysis"] / 4)) dat += text("Body Temperature: [occ["bodytemp"]-T0C]°C ([occ["bodytemp"]*1.8-459.67]°F)

") if(occ["borer_present"]) dat += "Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.
" dat += text("[]\tBlood Level %: [] ([] units)

", (occ["blood_amount"] > 448 ?"" : ""), occ["blood_amount"]*100 / 560, occ["blood_amount"]) dat += text("Inaprovaline: [] units
", occ["inaprovaline_amount"]) dat += text("Soporific: [] units
", occ["stoxin_amount"]) dat += text("[]\tDermaline: [] units

", (occ["dermaline_amount"] < 30 ? "" : ""), occ["dermaline_amount"]) dat += text("[]\tBicaridine: [] units
", (occ["bicaridine_amount"] < 30 ? "" : ""), occ["bicaridine_amount"]) dat += text("[]\tDexalin: [] units
", (occ["dexalin_amount"] < 30 ? "" : ""), occ["dexalin_amount"]) for(var/datum/disease/D in occ["tg_diseases_list"]) if(!D.hidden[SCANNER]) dat += text("Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]
") dat += "
" dat += "" dat += "" dat += "" dat += "" dat += "" dat += "" for(var/datum/organ/external/e in occ["external_organs"]) var/AN = "" var/open = "" var/infected = "" var/imp = "" var/bled = "" var/robot = "" var/splint = "" var/internal_bleeding = "" var/lung_ruptured = "" dat += "" for(var/datum/wound/W in e.wounds) if(W.internal) internal_bleeding = "
Internal bleeding" break if(istype(e, /datum/organ/external/chest) && occ["lung_ruptured"]) lung_ruptured = "Lung ruptured:" if(e.status & ORGAN_SPLINTED) splint = "Splinted:" if(e.status & ORGAN_BLEEDING) bled = "Bleeding:" if(e.status & ORGAN_BROKEN) AN = "[e.broken_description]:" if(e.status & ORGAN_ROBOT) robot = "Prosthetic:" if(e.open) open = "Open:" switch (e.germ_level) if (INFECTION_LEVEL_ONE to INFECTION_LEVEL_ONE + 200) infected = "Mild Infection:" if (INFECTION_LEVEL_ONE + 200 to INFECTION_LEVEL_ONE + 300) infected = "Mild Infection+:" if (INFECTION_LEVEL_ONE + 300 to INFECTION_LEVEL_ONE + 400) infected = "Mild Infection++:" if (INFECTION_LEVEL_TWO to INFECTION_LEVEL_TWO + 200) infected = "Acute Infection:" if (INFECTION_LEVEL_TWO + 200 to INFECTION_LEVEL_TWO + 300) infected = "Acute Infection+:" if (INFECTION_LEVEL_TWO + 300 to INFECTION_LEVEL_TWO + 400) infected = "Acute Infection++:" if (INFECTION_LEVEL_THREE to INFINITY) infected = "Septic:" if (e.implants.len) var/unknown_body = 0 for(var/I in e.implants) if(is_type_in_list(I,known_implants)) imp += "[I] implanted:" else unknown_body++ if(unknown_body || e.hidden) imp += "Unknown body present:" if(!AN && !open && !infected & !imp) AN = "None:" if(!(e.status & ORGAN_DESTROYED)) dat += "" else dat += "" dat += "" for(var/datum/organ/internal/i in occ["internal_organs"]) var/mech = "" if(i.robotic == 1) mech = "Assisted:" if(i.robotic == 2) mech = "Mechanical:" var/infection = "None" switch (i.germ_level) if (1 to INFECTION_LEVEL_ONE + 200) infection = "Mild Infection:" if (INFECTION_LEVEL_ONE + 200 to INFECTION_LEVEL_ONE + 300) infection = "Mild Infection+:" if (INFECTION_LEVEL_ONE + 300 to INFECTION_LEVEL_ONE + 400) infection = "Mild Infection++:" if (INFECTION_LEVEL_TWO to INFECTION_LEVEL_TWO + 200) infection = "Acute Infection:" if (INFECTION_LEVEL_TWO + 200 to INFECTION_LEVEL_TWO + 300) infection = "Acute Infection+:" if (INFECTION_LEVEL_TWO + 300 to INFINITY) infection = "Acute Infection++:" dat += "" dat += "" dat += "" dat += "
OrganBurn DamageBrute DamageOther Wounds
[e.display_name][e.burn_dam][e.brute_dam][robot][bled][AN][splint][open][infected][imp][internal_bleeding][lung_ruptured][e.display_name]--Not Found
[i.name]N/A[i.damage][infection]:[mech]
" var/list/species_organs = occ["species_organs"] for(var/organ_name in species_organs) if(!locate(species_organs[organ_name]) in occ["internal_organs"]) dat += text("No [organ_name] detected.
") if(occ["sdisabilities"] & BLIND) dat += text("Cataracts detected.
") if(occ["sdisabilities"] & NEARSIGHTED) dat += text("Retinal misalignment detected.
") return dat