// Pretty much everything here is stolen from the dna scanner FYI /obj/machinery/bodyscanner var/mob/living/carbon/human/occupant var/locked name = "Body Scanner" icon = 'icons/obj/Cryogenic2.dmi' icon_state = "body_scanner_0" density = TRUE anchored = TRUE unacidable = TRUE 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 var/printing_text = null /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. playsound(src, 'sound/machines/medbayscanner1.ogg', 50) // Beepboop you're being scanned. <3 add_fingerprint(user) qdel(G) SStgui.update_uis(src) if(!occupant) if(default_deconstruction_screwdriver(user, G)) return if(default_deconstruction_crowbar(user, G)) return /obj/machinery/bodyscanner/MouseDrop_T(mob/living/carbon/human/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. playsound(src, 'sound/machines/medbayscanner1.ogg', 50) // Beepboop you're being scanned. <3 add_fingerprint(user) SStgui.update_uis(src) /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. SStgui.update_uis(src) 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 /obj/machinery/bodyscanner/tgui_host(mob/user) if(user == occupant) return src return console ? console : src /obj/machinery/bodyscanner/tgui_interact(mob/user, datum/tgui/ui = null) ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "BodyScanner", "Body Scanner") ui.open() /obj/machinery/bodyscanner/tgui_data(mob/user) var/list/data = list() data["occupied"] = occupant ? TRUE : FALSE var/occupantData[0] if(occupant && ishuman(occupant)) update_icon() //VOREStation Edit - Health display for consoles with light and such. var/mob/living/carbon/human/H = 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, "overdose" = (R.overdose && R.volume > R.overdose) ? TRUE : FALSE, ) 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, "overdose" = (R.overdose && R.volume > R.overdose) ? TRUE : FALSE, ) 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 organData["totalLoss"] = E.brute_dam + E.burn_dam organData["maxHealth"] = E.max_damage organData["bruised"] = E.min_bruised_damage organData["broken"] = E.min_broken_damage var/implantData[0] for(var/obj/thing in E.implants) var/implantSubData[0] var/obj/item/weapon/implant/I = thing //VOREStation Block Edit Start var/obj/item/device/nif/N = thing if(istype(I)) implantSubData["name"] = I.name implantSubData["known"] = istype(I) && I.known_implant implantData.Add(list(implantSubData)) else implantSubData["name"] = N.name implantSubData["known"] = istype(N) && N.known_implant implantData.Add(list(implantSubData)) //VOREStation Block Edit End 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 organData["status"] = organStatus if(istype(E, /obj/item/organ/external/chest) && H.is_lung_ruptured()) organData["lungRuptured"] = 1 for(var/datum/wound/W in E.wounds) if(W.internal) organData["internalBleeding"] = 1 break 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 organData["maxHealth"] = I.max_damage organData["bruised"] = I.min_bruised_damage organData["broken"] = I.min_broken_damage organData["robotic"] = (I.robotic >= ORGAN_ROBOT) organData["dead"] = (I.status & ORGAN_DEAD) if(istype(I, /obj/item/organ/internal/appendix)) var/obj/item/organ/internal/appendix/A = I organData["inflamed"] = A.inflamed intOrganData.Add(list(organData)) occupantData["intOrgan"] = intOrganData occupantData["blind"] = (H.sdisabilities & BLIND) occupantData["nearsighted"] = (H.disabilities & NEARSIGHTED) occupantData = attempt_vr(src, "get_occupant_data_vr", list(occupantData, H)) //VOREStation Insert data["occupant"] = occupantData return data /obj/machinery/bodyscanner/tgui_act(action, params) if(..()) return TRUE . = TRUE switch(action) if("ejectify") eject() if("print_p") var/atom/target = console ? console : src visible_message("[target] rattles and prints out a sheet of paper.") playsound(src, 'sound/machines/printer.ogg', 50, 1) var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(target)) var/name = occupant ? occupant.name : "Unknown" 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 += " |