// 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 circuit = /obj/item/weapon/circuitboard/body_scanner use_power = USE_POWER_IDLE idle_power_usage = 60 active_power_usage = 10000 //10 kW. It's a big all-body scanner. light_color = "#00FF00" var/obj/machinery/body_scanconsole/console /obj/machinery/bodyscanner/Initialize() . = ..() default_apply_parts() /obj/machinery/bodyscanner/Destroy() if(console) console.scanner = null return ..() /obj/machinery/bodyscanner/power_change() ..() if(!(stat & (BROKEN|NOPOWER))) set_light(2) else set_light(0) /obj/machinery/bodyscanner/attackby(var/obj/item/G, user as mob) if(istype(G, /obj/item/weapon/grab)) var/obj/item/weapon/grab/H = G if(panel_open) to_chat(user, "Close the maintenance panel first.") return if(!ismob(H.affecting)) return if(!ishuman(H.affecting)) to_chat(user, "\The [src] is not designed for that organism!") return if(occupant) to_chat(user, "\The [src] is already occupied!") return if(H.affecting.has_buckled_mobs()) to_chat(user, span("warning", "\The [H.affecting] has other entities attached to it. Remove them first.")) return var/mob/M = H.affecting if(M.abiotic()) to_chat(user, "Subject cannot have abiotic items on.") return M.forceMove(src) occupant = M update_icon() //icon_state = "body_scanner_1" //VOREStation Edit - Health display for consoles with light and such. add_fingerprint(user) qdel(G) if(!occupant) if(default_deconstruction_screwdriver(user, G)) return if(default_deconstruction_crowbar(user, G)) return /obj/machinery/bodyscanner/MouseDrop_T(mob/living/carbon/O, mob/user as mob) if(!istype(O)) return 0 //not a mob if(user.incapacitated()) return 0 //user shouldn't be doing things if(O.anchored) return 0 //mob is anchored??? if(get_dist(user, src) > 1 || get_dist(user, O) > 1) return 0 //doesn't use adjacent() to allow for non-cardinal (fuck my life) if(!ishuman(user) && !isrobot(user)) return 0 //not a borg or human if(panel_open) to_chat(user, "Close the maintenance panel first.") return 0 //panel open if(occupant) to_chat(user, "\The [src] is already occupied.") return 0 //occupied if(O.buckled) return 0 if(O.abiotic()) to_chat(user, "Subject cannot have abiotic items on.") return 0 if(O.has_buckled_mobs()) to_chat(user, span("warning", "\The [O] has other entities attached to it. Remove them first.")) return if(O == user) visible_message("[user] climbs into \the [src].") else visible_message("[user] puts [O] into the body scanner.") O.forceMove(src) occupant = O update_icon() //icon_state = "body_scanner_1" //VOREStation Edit - Health display for consoles with light and such. add_fingerprint(user) /obj/machinery/bodyscanner/relaymove(mob/user as mob) if(user.incapacitated()) return 0 //maybe they should be able to get out with cuffs, but whatever go_out() /obj/machinery/bodyscanner/verb/eject() set src in oview(1) set category = "Object" set name = "Eject Body Scanner" if(usr.incapacitated()) return go_out() add_fingerprint(usr) /obj/machinery/bodyscanner/proc/go_out() if ((!(occupant) || src.locked)) return if (occupant.client) occupant.client.eye = occupant.client.mob occupant.client.perspective = MOB_PERSPECTIVE occupant.loc = src.loc occupant = null update_icon() //icon_state = "body_scanner_1" //VOREStation Edit - Health display for consoles with light and such. 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 qdel(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 qdel(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 qdel(src) return else return //Body Scan Console /obj/machinery/body_scanconsole var/obj/machinery/bodyscanner/scanner var/known_implants = list(/obj/item/weapon/implant/health, /obj/item/weapon/implant/chem, /obj/item/weapon/implant/death_alarm, /obj/item/weapon/implant/loyalty, /obj/item/weapon/implant/tracking, /obj/item/weapon/implant/language, /obj/item/weapon/implant/language/eal, /obj/item/weapon/implant/backup, /obj/item/device/nif) //VOREStation Add - Backup Implant, NIF var/delete var/temphtml name = "Body Scanner Console" icon = 'icons/obj/Cryogenic2.dmi' icon_state = "body_scannerconsole" dir = 8 density = 0 anchored = 1 circuit = /obj/item/weapon/circuitboard/scanner_console var/printing = null var/printing_text = null /obj/machinery/body_scanconsole/New() ..() findscanner() /obj/machinery/body_scanconsole/Destroy() if(scanner) scanner.console = null return ..() /obj/machinery/body_scanconsole/attackby(var/obj/item/I, var/mob/user) if(computer_deconstruction_screwdriver(user, I)) return else if(istype(I, /obj/item/device/multitool)) //Did you want to link it? var/obj/item/device/multitool/P = I if(P.connectable) if(istype(P.connectable, /obj/machinery/bodyscanner)) var/obj/machinery/bodyscanner/C = P.connectable scanner = C C.console = src to_chat(user, " You link the [src] to the [P.connectable]!") else to_chat(user, " You store the [src] in the [P]'s buffer!") P.connectable = src return else return attack_hand(user) /obj/machinery/body_scanconsole/power_change() /* VOREStation Removal if(stat & BROKEN) icon_state = "body_scannerconsole-p" else if(powered() && !panel_open) icon_state = initial(icon_state) stat &= ~NOPOWER else spawn(rand(0, 15)) icon_state = "body_scannerconsole-p" stat |= NOPOWER */ update_icon() //icon_state = "body_scanner_1" //VOREStation Edit - Health display for consoles with light and such. /obj/machinery/body_scanconsole/ex_act(severity) switch(severity) if(1.0) //SN src = null qdel(src) return if(2.0) if (prob(50)) //SN src = null qdel(src) return else return /obj/machinery/body_scanconsole/proc/findscanner() spawn(5) var/obj/machinery/bodyscanner/bodyscannernew = null // Loop through every direction for(dir in list(NORTH, EAST, SOUTH, WEST)) // Loop through every direction bodyscannernew = locate(/obj/machinery/bodyscanner, get_step(src, dir)) // Try to find a scanner in that direction if(bodyscannernew) scanner = bodyscannernew bodyscannernew.console = src set_dir(get_dir(src, bodyscannernew)) return return /obj/machinery/body_scanconsole/attack_ai(user as mob) return attack_hand(user) /obj/machinery/body_scanconsole/attack_ghost(user as mob) return attack_hand(user) /obj/machinery/body_scanconsole/attack_hand(user as mob) if(stat & (NOPOWER|BROKEN)) return if(!scanner) findscanner() if(!scanner) to_chat(user, "Scanner not found!") return if (scanner.panel_open) to_chat(user, "Close the maintenance panel first.") return if(scanner) return ui_interact(user) /obj/machinery/body_scanconsole/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) var/data[0] data["connected"] = scanner ? 1 : 0 if(scanner) data["occupied"] = scanner.occupant ? 1 : 0 var/occupantData[0] if(scanner.occupant && ishuman(scanner.occupant)) update_icon() //VOREStation Edit - Health display for consoles with light and such. var/mob/living/carbon/human/H = scanner.occupant occupantData["name"] = H.name occupantData["stat"] = H.stat occupantData["health"] = H.health occupantData["maxHealth"] = H.getMaxHealth() occupantData["hasVirus"] = H.virus2.len occupantData["bruteLoss"] = H.getBruteLoss() occupantData["oxyLoss"] = H.getOxyLoss() occupantData["toxLoss"] = H.getToxLoss() occupantData["fireLoss"] = H.getFireLoss() occupantData["radLoss"] = H.radiation occupantData["cloneLoss"] = H.getCloneLoss() occupantData["brainLoss"] = H.getBrainLoss() occupantData["paralysis"] = H.paralysis occupantData["paralysisSeconds"] = round(H.paralysis / 4) occupantData["bodyTempC"] = H.bodytemperature-T0C occupantData["bodyTempF"] = (((H.bodytemperature-T0C) * 1.8) + 32) occupantData["hasBorer"] = H.has_brain_worms() var/bloodData[0] if(H.vessel) var/blood_volume = round(H.vessel.get_reagent_amount("blood")) var/blood_max = H.species.blood_volume bloodData["volume"] = blood_volume bloodData["percent"] = round(((blood_volume / blood_max)*100)) occupantData["blood"] = bloodData var/reagentData[0] if(H.reagents.reagent_list.len >= 1) for(var/datum/reagent/R in H.reagents.reagent_list) reagentData[++reagentData.len] = list("name" = R.name, "amount" = R.volume) else reagentData = null occupantData["reagents"] = reagentData var/ingestedData[0] if(H.ingested.reagent_list.len >= 1) for(var/datum/reagent/R in H.ingested.reagent_list) ingestedData[++ingestedData.len] = list("name" = R.name, "amount" = R.volume) else ingestedData = null occupantData["ingested"] = ingestedData var/extOrganData[0] for(var/obj/item/organ/external/E in H.organs) var/organData[0] organData["name"] = E.name organData["open"] = E.open organData["germ_level"] = E.germ_level organData["bruteLoss"] = E.brute_dam organData["fireLoss"] = E.burn_dam var/implantData[0] for(var/obj/I in E.implants) var/implantSubData[0] implantSubData["name"] = I.name if(is_type_in_list(I, known_implants)) implantSubData["known"] = 1 implantData.Add(list(implantSubData)) organData["implants"] = implantData organData["implants_len"] = implantData.len var/organStatus[0] if(E.status & ORGAN_DESTROYED) organStatus["destroyed"] = 1 if(E.status & ORGAN_BROKEN) organStatus["broken"] = E.broken_description if(E.robotic >= ORGAN_ROBOT) organStatus["robotic"] = 1 if(E.splinted) organStatus["splinted"] = 1 if(E.status & ORGAN_BLEEDING) organStatus["bleeding"] = 1 if(E.status & ORGAN_DEAD) organStatus["dead"] = 1 for(var/datum/wound/W in E.wounds) if(W.internal) organStatus["internalBleeding"] = 1 break organData["status"] = organStatus if(istype(E, /obj/item/organ/external/chest) && H.is_lung_ruptured()) organData["lungRuptured"] = 1 extOrganData.Add(list(organData)) occupantData["extOrgan"] = extOrganData var/intOrganData[0] for(var/obj/item/organ/I in H.internal_organs) var/organData[0] organData["name"] = I.name if(I.status & ORGAN_ASSISTED) organData["desc"] = "Assisted" else if(I.robotic >= ORGAN_ROBOT) organData["desc"] = "Mechanical" else organData["desc"] = null organData["germ_level"] = I.germ_level organData["damage"] = I.damage intOrganData.Add(list(organData)) occupantData["intOrgan"] = intOrganData occupantData["blind"] = (H.sdisabilities & BLIND) occupantData["nearsighted"] = (H.disabilities & NEARSIGHTED) occupantData = attempt_vr(scanner,"get_occupant_data_vr",list(occupantData,H)) //VOREStation Insert data["occupant"] = occupantData ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "adv_med.tmpl", "Body Scanner", 690, 800) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) /obj/machinery/body_scanconsole/Topic(href, href_list) if(..()) return 1 if (href_list["print_p"]) generate_printing_text() if (!(printing) && printing_text) printing = 1 visible_message("\The [src] rattles and prints out a sheet of paper.") var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc) P.info = "
| Organ | " dat += "Burn Damage | " dat += "Brute Damage | " dat += "Other Wounds | " dat += "||||
|---|---|---|---|---|---|---|---|
| [e.name] | [e.burn_dam] | [e.brute_dam] | [robot][bled][AN][splint][open][infected][imp][internal_bleeding][lung_ruptured][o_dead] | " else dat += "[e.name] | - | - | Not Found | " dat += "
| [i.name] | N/A | [i.damage] | [infection]:[mech][i_dead] | " dat += " |