From 2dadf7fd21e46467dfad30978032d33bab07d918 Mon Sep 17 00:00:00 2001 From: Lohikar Date: Sun, 15 Jan 2017 13:37:44 -0600 Subject: [PATCH] Adv. Scanner Tweaks & General Fixes (#1573) Fixes #1419. Fixes #1551. Fixes #1516. Adv. Scanners now obey NO_SCAN species flags. Adv. Scanners now use NanoUI. Fixed a runtime from adv. scanners' consoles being deleted. --- baystation12.dme | 1 - code/_helpers/text.dm | 1 + code/datums/organs.dm | 0 code/game/machinery/adv_med.dm | 329 ++++++++++++++++++++-------- code/global.dm | 2 +- html/changelogs/lohikar-advscan.yml | 33 +++ maps/exodus-2.dmm | 2 +- nano/templates/med_diagnostics.tmpl | 183 ++++++++++++++++ 8 files changed, 453 insertions(+), 98 deletions(-) delete mode 100644 code/datums/organs.dm create mode 100644 html/changelogs/lohikar-advscan.yml create mode 100644 nano/templates/med_diagnostics.tmpl diff --git a/baystation12.dme b/baystation12.dme index 21cbe4995c6..0775de87e57 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -165,7 +165,6 @@ #include "code\datums\mind.dm" #include "code\datums\mixed.dm" #include "code\datums\modules.dm" -#include "code\datums\organs.dm" #include "code\datums\recipe.dm" #include "code\datums\server_greeting.dm" #include "code\datums\sun.dm" diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm index ae34f0138f9..6b2fb741258 100644 --- a/code/_helpers/text.dm +++ b/code/_helpers/text.dm @@ -420,4 +420,5 @@ proc/TextPreview(var/string,var/len=40) t = replacetext(t, "\[logo\]", "") t = replacetext(t, "\[time\]", "[worldtime2text()]") t = replacetext(t, "\[date\]", "[worlddate2text()]") + t = replacetext(t, "\[editorbr\]", "
") return t diff --git a/code/datums/organs.dm b/code/datums/organs.dm deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 144b17edf31..86f15dd2314 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -4,7 +4,19 @@ /obj/machinery/bodyscanner var/mob/living/carbon/occupant var/locked + var/obj/machinery/body_scanconsole/connected + var/list/allowed_species = list( + "Human", + "Skrell", + "Unathi", + "Tajara", + "M'sai Tajara", + "Zhan-Khazan Tajara", + "Vaurca Worker", + "Vaurca Warrior" + ) name = "Body Scanner" + desc = "A state-of-the-art medical diagnostics machine. Guaranteed detection of all your bodily ailments or your money back!" icon = 'icons/obj/Cryogenic2.dmi' icon_state = "body_scanner_0" density = 1 @@ -14,6 +26,11 @@ idle_power_usage = 60 active_power_usage = 10000 //10 kW. It's a big all-body scanner. +/obj/machinery/bodyscanner/Destroy() + // So the GC can qdel this. + src.connected.connected = null + return ..() + /obj/machinery/bodyscanner/relaymove(mob/user as mob) if (user.stat) return @@ -183,6 +200,14 @@ return else return + +/obj/machinery/bodyscanner/proc/check_species() + if (!occupant || !ishuman(occupant)) + return 1 + var/mob/living/carbon/human/O = occupant + if (!O) + return 1 + return !(O.get_species() in allowed_species) /obj/machinery/body_scanconsole/ex_act(severity) @@ -199,6 +224,10 @@ else return +/obj/machinery/body_scanconsole/Destroy() + src.connected.connected = null + return ..() + /obj/machinery/body_scanconsole/power_change() ..() if(stat & BROKEN) @@ -213,95 +242,225 @@ /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" + desc = "A control panel for some kind of medical device." icon = 'icons/obj/Cryogenic2.dmi' icon_state = "body_scannerconsole" density = 0 anchored = 1 - /obj/machinery/body_scanconsole/New() ..() - spawn( 5 ) + spawn(5) src.connected = locate(/obj/machinery/bodyscanner, get_step(src, WEST)) + src.connected.connected = src 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 << "This console is not connected to a functioning body scanner." - return - if(!ishuman(connected.occupant)) - user << "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 - + + ui_interact(user) /obj/machinery/body_scanconsole/Topic(href, href_list) - if (..()) - return + ..() + // shouldn't be reachable if occupant is invalid 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.set_content_unsafe("Scan ([occupant])", format_occupant_data(src.connected.get_occupant_data())) + R.set_content_unsafe("Scan ([src.connected.occupant])", format_occupant_data(src.connected.get_occupant_data())) + print(R, "[src] beeps, printing [R.name] after a moment.") + +/obj/machinery/body_scanconsole/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + var/list/data = list() + var/occupied = (src.connected && src.connected.occupant) + var/mob/living/carbon/human/occupant + if (src.connected) + occupant = src.connected.occupant + + data["noscan"] = src.connected.check_species() + data["nocons"] = !src.connected + data["occupied"] = occupied + data["invalid"] = src.connected && src.connected.check_species() + data["ipc"] = src.connected && occupant && isipc(occupant) + if (!data["invalid"]) + var/datum/reagents/R = occupant.bloodstr + var/datum/reagents/B = occupant.vessel + data["stat"] = occupant.stat + data["name"] = occupant.name + data["species"] = occupant.get_species() // mostly for fluff. + data["health"] = occupant.health + data["maxHealth"] = occupant.maxHealth + data["minHealth"] = config.health_threshold_dead + data["bruteLoss"] = occupant.getBruteLoss() + data["oxyLoss"] = occupant.getOxyLoss() + data["toxLoss"] = occupant.getToxLoss() + data["fireLoss"] = occupant.getFireLoss() + data["rads"] = occupant.total_radiation + data["cloneloss"] = occupant.getCloneLoss() + data["brainloss"] = occupant.getBrainLoss() + data["paralysis"] = occupant.paralysis + data["bodytemp"] = occupant.bodytemperature + data["occupant"] = occupant + data["bloodAmt"] = B.get_reagent_amount("blood") + data["bloodMax"] = 560 // You'd think this'd be defined somewhere. + data["bloodPerc"] = (data["bloodAmt"] / data["bloodMax"]) * 100 + data["bloodStatus"] = val2status(data["bloodAmt"], B.total_volume * 0.9, B.total_volume * 0.8, inverse = 1) + data["inaprovAmt"] = R.get_reagent_amount("inaprovaline") + data["soporAmt"] = R.get_reagent_amount("stoxin") + data["bicardAmt"] = R.get_reagent_amount("bicaridine") + data["dexAmt"] = R.get_reagent_amount("dexalin") + data["dermAmt"] = R.get_reagent_amount("dermaline") + data["otherAmt"] = R.total_volume - (data["soporAmt"] + data["dexAmt"] + data["bicardAmt"] + data["inaprovAmt"] + data["dermAmt"]) + data["brainDmgStatus"] = val2status(occupant.brainloss, 20, 50) + data["radStatus"] = val2status(occupant.total_radiation) + data["cloneDmgStatus"] = val2status(occupant.cloneloss, 10, 35) + data["bodyparts"] = get_organ_wound_data(occupant) + var/list/missing = get_missing_organs(occupant) + data["missingparts"] = missing + data["hasmissing"] = missing.len ? 1 : 0 + data["hasvirus"] = occupant.virus2.len || occupant.viruses.len + data["hastgvirus"] = occupant.viruses.len + data["tgvirus"] = occupant.viruses + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "med_diagnostics.tmpl", "Medical Diagnostics", 800, 500, state = state) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/obj/machinery/body_scanconsole/proc/get_missing_organs(var/mob/living/carbon/human/H) + var/list/missingOrgans = list() + var/list/species_organs = H.species.has_organ + for (var/organ_name in H.species.has_organ) + if (!locate(species_organs[organ_name]) in H.internal_organs) + missingOrgans += organ_name + return missingOrgans + +/obj/machinery/body_scanconsole/proc/get_organ_wound_data(var/mob/living/carbon/human/H) + var/list/organs = list() + + // Internal Organs. (Duh.) + for (var/obj/item/organ/O in H.internal_organs) + var/list/data = list() + data["name"] = O.name + var/list/wounds + switch (O.damtype) + if ("brute") + data["bruteDmg"] = O.damage + data["burnDmg"] = 0 + if ("burn") + data["burnDmg"] = O.damage + data["bruteDmg"] = 0 + + if (istype(O, /obj/item/organ/lungs) && H.is_lung_ruptured()) + wounds += "Shows symptoms of structural failure." + + if (istype(O, /obj/item/organ/brain) && H.has_brain_worms()) + wounds += "Has an abnormal growth." + + if (istype(O, H.species.vision_organ)) + if (H.sdisabilities & BLIND) + wounds += "Appears to have cataracts." + else if (H.disabilities & NEARSIGHTED) + wounds += "Appears to have misaligned retinas." + + if (O.germ_level) + wounds += get_infection_level(O.germ_level) + + if (O.rejecting) + wounds += "Shows symptoms of organ rejection." + + data["hasWounds"] = length(wounds) ? 1 : 0 + data["wounds"] = wounds + organs += list(data) + + // Limbs. + for (var/obj/item/organ/external/O in H.organs) + var/list/data = list() + data["burnDmg"] = O.burn_dam + data["bruteDmg"] = O.brute_dam + data["name"] = O.name + + var/list/wounds = list() + var/num_IB = 0 + for (var/datum/wound/W in O.wounds) + if (W.internal) + num_IB++ + + if (num_IB) + if (num_IB > 1) + wounds += "Shows signs of severe internal bleeding." + else + wounds += "Shows signs of internal bleeding." + + if (O.status & ORGAN_ROBOT) + wounds += "Appears to be composed of inorganic material." + if (O.status & ORGAN_SPLINTED) + wounds += "Splinted." + if (O.status & ORGAN_BLEEDING) + wounds += "Bleeding." + if (O.status & ORGAN_BROKEN) + wounds += "Is \a [O.broken_description]." + if (O.open) + wounds += "Has an open wound." + if (O.germ_level) + var/level = get_infection_level(O.germ_level) + if (level && level != "") + wounds += "Shows symptoms of \a [level] infection." + if (O.rejecting) + wounds += "Shows symptoms indicating limb rejection." + + if (O.implants.len) + var/unk = 0 + for (var/atom/movable/I in O.implants) + if (is_type_in_list(I, known_implants)) + wounds += "[I.name] present." + else + unk += 1 + if (unk) + wounds += "Has an abnormal mass present." + + data["hasWounds"] = length(wounds) ? 1 : 0 + data["wounds"] = wounds + organs += list(data) + + return organs + +/obj/machinery/body_scanconsole/proc/get_infection_level(var/level) + switch (level) + if (INFECTION_LEVEL_ONE to INFECTION_LEVEL_ONE + 200) + return "mild" + if (INFECTION_LEVEL_ONE + 200 to INFECTION_LEVEL_ONE + 300) + return "worsening mild" + if (INFECTION_LEVEL_ONE + 300 to INFECTION_LEVEL_ONE + 400) + return "borderline acute" + if (INFECTION_LEVEL_TWO to INFECTION_LEVEL_TWO + 200) + return "acute" + if (INFECTION_LEVEL_TWO + 200 to INFECTION_LEVEL_TWO + 300) + return "worsening acute" + if (INFECTION_LEVEL_TWO + 300 to INFECTION_LEVEL_TWO + 400) + return "borderline septic" + if (INFECTION_LEVEL_THREE to INFINITY) + return "septic" + + return "" + +/obj/machinery/body_scanconsole/proc/val2status(var/val, var/warn_threshold = 10, var/danger_threshold = 50, var/inverse = 0) + if (val < warn_threshold) + return inverse ? "bad" : "good" + if (val < danger_threshold) + return "average" + return inverse ? "good" : "bad" + + +// These are old procs used for printing. /obj/machinery/bodyscanner/proc/get_occupant_data() if (!occupant || !istype(occupant, /mob/living/carbon/human)) @@ -415,23 +574,12 @@ 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:" + var/infection = "[get_infection_level(e.germ_level)] infection" + if (infection == "") + infection = "None" if(e.rejecting) - infected += "(being rejected)" + infected += " (being rejected)" + if (e.implants.len) var/unknown_body = 0 for(var/I in e.implants) @@ -458,20 +606,11 @@ 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++:" + var/infection = get_infection_level(i.germ_level) + if (infection == "") + infection = "None" + else + infection = "[infection] infection" if(i.rejecting) infection += "(being rejected)" diff --git a/code/global.dm b/code/global.dm index 93da2ce5bd7..33257ccbbd9 100644 --- a/code/global.dm +++ b/code/global.dm @@ -40,7 +40,7 @@ var/const/company_name = "NanoTrasen" var/const/company_short = "NT" var/game_version = "Baystation12" var/changelog_hash = "" -var/game_year = (text2num(time2text(world.realtime, "YYYY")) + 544) +var/game_year = (text2num(time2text(world.realtime, "YYYY")) + 442) var/round_progressing = 1 var/master_mode = "extended" // "extended" diff --git a/html/changelogs/lohikar-advscan.yml b/html/changelogs/lohikar-advscan.yml new file mode 100644 index 00000000000..c6bd6af9d0e --- /dev/null +++ b/html/changelogs/lohikar-advscan.yml @@ -0,0 +1,33 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Lohikar +delete-after: True +changes: + - rscadd: "Added a fancy new UI to the medical advanced scanner." + - bugfix: "The medical advanced scanner can print once more." + - tweak: "Tweaked how the advanced scanner describes injuries and infections." + - rscdel: "You can no longer scan Dionae and IPCs with the adv. scanner." + - bugfix: "The in-game year should be lore-accurate again." + - bugfix: "Text-editors on consoles should no longer show [editorbr]." diff --git a/maps/exodus-2.dmm b/maps/exodus-2.dmm index 97f81258ab3..9d13442fdec 100644 --- a/maps/exodus-2.dmm +++ b/maps/exodus-2.dmm @@ -1404,7 +1404,7 @@ "AZ" = (/turf/unsimulated/wall,/area/syndicate_mothership{name = "\improper Raider Base"}) "Ba" = (/obj/machinery/vending/cola{name = "Robust Softdrinks"; prices = list()},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "Bb" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/centcom/holding) -"Bc" = (/obj/machinery/bodyscanner{dir = 8; icon_state = "body_scanner_0"; tag = "icon-body_scanner_0 (EAST)"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/skipjack_station/start) +"Bc" = (/obj/machinery/bodyscanner{allowed_species = list("Human","Skrell","Unathi","Tajara","M'sai Tajara","Zhan-Khazan Tajara","Vaurca Worker","Vaurca Warrior","Vox"); dir = 8; icon_state = "body_scanner_0"; tag = "icon-body_scanner_0 (EAST)"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/skipjack_station/start) "Bd" = (/turf/simulated/shuttle/wall{tag = "icon-swall_straight (WEST)"; icon_state = "swall_straight"; dir = 8},/area/shuttle/escape/centcom) "Be" = (/turf/simulated/shuttle/wall{tag = "icon-swall_t"; icon_state = "swall_t"},/area/shuttle/escape/centcom) "Bf" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/vending/cola{name = "hacked Robust Softdrinks"; prices = list()},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership{name = "\improper Raider Base"}) diff --git a/nano/templates/med_diagnostics.tmpl b/nano/templates/med_diagnostics.tmpl new file mode 100644 index 00000000000..8a4d2c54a89 --- /dev/null +++ b/nano/templates/med_diagnostics.tmpl @@ -0,0 +1,183 @@ +

Overall Health

+
+{{if data.invalid}} + {{if data.nocons}} +
Error: No scanner bed detected!
+ {{else !data.occupied}} +
No occupant detected.
+ {{else data.ipc}} +
Error: Object in scanner bed interfering with sensor array.
+ {{else data.noscan}} +
Error: No diagnostics profile installed for this species.
+ {{/if}} +{{else}} +
+ {{:data.name}} =>  + {{if data.stat == 0}} + Conscious + {{else data.stat == 1}} + Unconscious + {{else}} + DEAD + {{/if}} +
+
+
Species:
+
{{:data.species}}
+
+ {{if data.stat < 2}} +
+
Health:
+ {{if data.health >= 0}} + {{:helper.displayBar(data.health, 0, data.maxHealth, 'good')}} + {{else}} + {{:helper.displayBar(data.health, 0, data.minHealth, 'average alignRight')}} + {{/if}} +
{{:helper.round(data.health)}}
+
+
+
=> Brute Damage:
+ {{:helper.displayBar(data.bruteLoss, 0, data.maxHealth, 'bad')}} +
{{:helper.round(data.bruteLoss)}}
+
+
+
=> Resp. Damage:
+ {{:helper.displayBar(data.oxyLoss, 0, data.maxHealth, 'bad')}} +
{{:helper.round(data.oxyLoss)}}
+
+
+
=> Toxin Damage:
+ {{:helper.displayBar(data.toxLoss, 0, data.maxHealth, 'bad')}} +
{{:helper.round(data.toxLoss)}}
+
+
+
=> Burn Severity:
+ {{:helper.displayBar(data.fireLoss, 0, data.maxHealth, 'bad')}} +
{{:helper.round(data.fireLoss)}}
+
+ {{/if}} +
+
+
Radiation Lvl:
+
+ {{:data.rads}} rads +
+
+
+
Genetic Dmg:
+
+ {{:data.cloneloss}}% +
+
+
+
Est. Brain Dmg:
+
+ {{:data.brainloss}}% +
+
+
+
Est. Paralysis Lvl:
+
{{:data.paralysis}}%{{if data.paralysis}} ({{:helper.round(data.paralysis / 4)}} seconds left){{/if}}
+
+
+
Body Temperature:
+
{{:data.bodytemp}} K (~{{:helper.round(data.bodytemp - 273.15)}} C)
+
+
+
Viral Status:
+ {{if data.hasvirus}} +
Present
+ {{else data.hastgvirus}} + {{for data.tgvirus}} +
{{:value.form}} Detected
+
=> Name
+
{{:value.name}}
+
=> Type
+
{{:value.spread}}
+
=> Stage
+
{{:value.stage}} of {{:value.max_stages}}
+
=> Possible Cure
+
{{:value.cure}}
+ {{/for}} + {{else}} +
Not Detected
+ {{/if}} +
+
+

Blood Status

+
+
+
Blood Level:
+ {{:helper.displayBar(data.bloodAmt, 0, data.bloodMax, data.bloodStatus)}} +
{{:helper.round(data.bloodPerc)}}% ({{:helper.round(data.bloodAmt)}}u)
+
+
+
=> Inaprovaline:
+
{{:helper.round(data.inaprovAmt)}} unit(s)
+
+
+
=> Soporific:
+
{{:helper.round(data.soporAmt)}} unit(s)
+
+
+
=> Bicaridine:
+
{{:helper.round(data.bicardAmt)}} unit(s)
+
+
+
=> Dermaline:
+
{{:helper.round(data.dermAmt)}} unit(s)
+
+
+
=> Dexalin:
+
{{:helper.round(data.dexAmt)}} unit(s)
+
+
+
=> Other:
+
{{:helper.round(data.otherAmt)}} unit(s)
+
+
+

Body Status

+ {{if data.hasmissing}} +
+ Unable to locate the following organ(s). + +
+ {{/if}} +
+ {{for data.bodyparts}} +
+
+ {{:value.name}} +
+
+
=> Burn Dmg:
+
{{:helper.round(value.burnDmg)}}
+
+ +
+
=> Brute Dmg:
+
{{:helper.round(value.bruteDmg)}}
+
+ {{if value.hasWounds}} +
+
=> Information:
+
+
    + {{for value.wounds :wound:woundi}} +
  • {{:wound}}
  • + {{/for}} +
+
+
+ {{/if}} +
+
+ {{/for}} +
+

Actions

+ {{:helper.link('Print Report', '', {'print' : 1})}} +{{/if}}