Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Injury Display

Know which limb is about to fail you — and how badly — without typing health between every swing.

What it’s for

HEALTH tells you everything, once, in a block of text that scrolls away. Mid-fight you don’t want everything. You want to know whether it’s your right arm or your left leg, and whether it’s the scratch you took two rooms ago or the thing that’s about to cost you the fight.

The injury display is a body, drawn once and updated as the game reports damage. Each part carries its own severity, so a glance answers “where” and “how bad” at the same time. Wounds and scars are shown apart, which matters because a scar is permanent and a wound is the one you can still do something about.

It is also the widget that changes the most between frontends, and deliberately so. In the desktop GUI it can be real artwork — a painted body that swaps to a different pose when you go down, with hand-drawn wounds that stack in place. In the terminal it’s a compact figure of characters that colors by severity. Both read the same game data; only the drawing differs.

Set it up

  1. Click Windows in the top toolbar, expand Character, and tick Injuries. Set the row’s zone to place it. (Typed equivalent: .addwindow injuries injuries 0 0 10 8.)
  2. Right-click the window. Its widget section is named Injury doll.
  3. Use Doll image to pick the art: Skin default takes whatever body your active skin ships, None draws the built-in vector body, and the rest are dolls installed in your image pool. Install more with .jinx list and .jinx install.
  4. Tick Grayscale doll art if you want the body desaturated. The wound and scar dots keep their colors regardless.
📷 screenshot pending
The injuries window's right-click Injury doll section, with the Doll image drop-down open on Skin default, None, and installed pool dolls, above the Grayscale doll art checkbox and Calibrate doll….

Expected result: a body appears in the window. Take a wound and that part changes — a colored dot at the part’s position, or its hand-drawn wound art if the doll has any. Hover a wounded part and a tooltip names it and its severity, like left arm: severe injury.

Common setups

A painted body that lies down when you do

This is the feature that makes the widget more than a picture, and it needs a skin with doll art. In your active skin’s skin.toml, the [injury_doll] table is the default body. Add a [[injury_doll.variants]] entry with a name, a when condition, and its own complete skin table:

[[injury_doll.variants]]
name = "downed"
when = { type = "indicator", id = "prone", active = true }

[injury_doll.variants.skin]
base = "doll/downed.png"

Then right-click the injuries window ▸ Injury dollCalibrate doll…, switch the Doll set drop-down from Default to downed, and click each body part on the prone art to place its dot. Click Save to skin.

You’ll see: your doll standing while you’re upright, and the whole body swapping to the prone painting the instant you’re knocked down — with every wound dot landing in the right place on the new pose, because you calibrated that set separately.

Dots that read at a glance instead of a squint

Open Calibrate doll… on the default set. The bottom rows style the generated dots: a Wound color, a Scar color, a dot size slider as a percentage of the doll’s height, and an opacity slider. Flip Preview: between wounds and scars and drag the rank slider from 1 to 3 to see each severity live on the art before you commit.

Push dot size up until the dots are unmistakable at your normal window size, then click Save to skin.

You’ll see: wounds as solid circles with their rank numeral inside and scars as rings, big enough to read from your seat — and the change takes effect on the very next frame rather than waiting for a skin reload.

A hand that disappears with the arm above it

For dolls with hand-drawn art, a part can suppress itself. Give the part a hidden_when condition in the manifest:

[injury_doll.leftHand]
hidden_when = { type = "injury", area = "leftArm", cmp = ">=", level = 3 }
healthy = "doll/hand_ok.png"

You’ll see: the left hand stop drawing entirely once the left arm hits severity 3 — no orphaned hand floating below a missing arm. The hand’s own wound still appears in the hover tooltip, so you don’t lose the information, only the drawing.

Tips & gotchas

⚠️ Scar 1 is level 4, not level 1. The scale runs 0 through 6: 0 is healthy, 13 are wounds, and 46 are scars. So a condition of Injury >= 4 means “any scar at all”, and Injury >= 1 means “anything wrong”. The editor labels (Scar1), the TOML color keys (scar1_color), and the skin art keys (scar1) all use the short name while the underlying level is 4. Counting scars from 1 in a condition is the most common way to write a rule that never fires.

⚠️ A variant replaces the doll wholesale — it does not layer on top. A matched variant brings its own base image, its own anchors, its own part art, and its own dot styling. That is the point: a prone body repositions every limb, so nothing from the standing set would land correctly. It also means a variant inherits nothing — a hidden_when you wrote on the default set does not apply while a variant is active. Author each set completely.

⚠️ The calibrator’s Doll set drop-down discards unsaved work when you switch. Changing from Default to a variant reseeds every anchor and dot value from the manifest. Click Save to skin before you switch sets, every time.

The window may appear on its own. The injuries window is bound to the game’s own injuries dialog, and windows bound that way are created for you the first time the game opens their dialog — that is how the GemStone IV experience window arrives. If a doll turns up unbidden, this is why, and .hidewindow injuries puts it away. It won’t duplicate: if you already have one, the existing window takes the feed.

A pool doll and a skin doll are not the same thing. A doll picked from Doll image is a single flat image with a sidecar file beside it holding its anchors and dot styling — that’s all. Pool dolls carry no pose variants and no hidden parts, because those live in a skin’s manifest. Choose Skin default if you want variants. Calibrating a pool doll writes to its sidecar, so the calibration travels with the artwork and a shared doll can arrive already calibrated.

A part with hand-drawn art never gets a dot, and that’s a feature. Once any severity key is authored for a part, that part is fully hand-drawn: at a level with no art the base shows through. Skins that paint the worst case into the base rely on this — “no overlay” is a deliberate reveal, like the hole where a severed limb was. Parts with no art at all keep their generated dots, so one doll can mix both approaches freely.

The nervous system draws underneath everything else. It’s a full-body underlay rather than a badge, so limb wounds and dots paint over it instead of being covered by it.

The tooltip only appears when something is wrong. Hovering a healthy GUI doll says nothing at all — an “uninjured” tooltip read as a stray badge, so it was removed. If you get no tooltip, you have no wounds.

Grayscale is built on demand. Ticking Grayscale doll art generates desaturated copies of the art at that moment and drops them when you untick it. Skins can’t ship pre-made grayscale files; the client makes its own.

Clicking another player can open their doll in a popup. The game sends a separate per-player injuries dialog, and both desktop frontends draw it as a floating window titled with that player’s name — the terminal closes it with Esc, the GUI with its window close button. That popup always uses the default doll set and the default palette: variants and hidden parts read your state, so your own prone flag must never reshape someone else’s body.

Your severity colors don’t reach the phone. The phone ships the same seven default colors, so an unmodified setup matches everywhere — but per-window injury*_color overrides are not forwarded, so a recolored desktop doll and the phone’s doll will differ.

See also

Config reference (TOML)

widget_type = "injury_doll". Both injuries and injury_doll are accepted as the type string, and as the .addwindow type argument. Set the colors through .editwindow in the terminal; art and calibration are GUI-only.

Watch the type string. An unrecognized widget type does not error — it silently falls back to a plain text window. A typo like injurydoll or injury-doll gets you an empty text window, not a warning.

Window fields

FieldTypeDefaultWhat it does
injury_default_colorstring#333333Level 0 — an uninjured part
injury1_colorstring#aa5500Level 1 wound
injury2_colorstring#ff8800Level 2 wound
injury3_colorstring#ff0000Level 3 wound
scar1_colorstring#999999Level 4 — scar 1
scar2_colorstring#777777Level 5 — scar 2
scar3_colorstring#555555Level 6 — scar 3

A blank or whitespace value falls back to the default. The preset ships 8 rows by 10 columns with a minimum of 6 by 8.

Body parts

Fourteen parts, in the calibrator’s click-through order: head, leftEye, rightEye, neck, chest, abdomen, back, leftArm, rightArm, leftHand, rightHand, leftLeg, rightLeg, nsys. These same names are the vocabulary of the Injury condition in hotbars, indicators, and hand icons.

Skin doll art (skin.toml, GUI only)

KeyTypeDefaultWhat it does
[injury_doll] basestringnoneThe body image. Relative to the skin folder, or a pool path, or absolute.
[injury_doll.anchors]tablebuilt-inpart = [x, y] as fractions of the base image. Written by the calibrator.
[injury_doll.dots] wound_colorstring#e02020Solid wound dot color
[injury_doll.dots] scar_colorstring#b8b8b8Scar ring color
[injury_doll.dots] opacityfloat0.9Dot opacity, clamped 0–1
[injury_doll.dots] diameterfloat0.07Dot size as a fraction of the drawn doll height

Any other table under [injury_doll] is a body part. A part table takes hidden_when (a condition) plus per-severity image keys: healthy, injury1, injury2, injury3, scar1, scar2, scar3. Those key names are exact — an unrecognized one is logged and ignored.

[injury_doll]
base = "doll/body.png"

[injury_doll.dots]
wound_color = "#e02020"
scar_color = "#b8b8b8"
diameter = 0.07

[injury_doll.leftArm]
healthy = "doll/arm_ok.png"
injury1 = "doll/arm_i1.png"
injury3 = "doll/arm_severed.png"

[injury_doll.leftHand]
hidden_when = { type = "injury", area = "leftArm", cmp = ">=", level = 3 }

[[injury_doll.variants]]
name = "downed"
when = { type = "indicator", id = "prone", active = true }

[injury_doll.variants.skin]
base = "doll/downed.png"

A variant’s skin table has the same shape as [injury_doll] minus variants — variants do not nest, and attempting it is a parse error. The first variant whose when matches wins, in declaration order.

Window TOML

[[windows]]
name = "injuries"
widget_type = "injury_doll"
title = "Injuries"
row = 0
col = 0
rows = 8
cols = 10
show_border = true
border_style = "rounded"
content_align = "center"
injury1_color = "#aa5500"
injury2_color = "#ff8800"
injury3_color = "#ff0000"
scar1_color = "#999999"
scar2_color = "#777777"
scar3_color = "#555555"