fix wounded: only applies when first gaining dying, not on increases

Wounded adds to the initial dying value when knocked to 0 HP, but
does not affect recovery check failures or damage taken while
already dying. Fix simulator logic, diagram labels, and reference
text accordingly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
main
Matthew Huntington 1 month ago
parent c4160befa6
commit bf2301f04d

@ -215,7 +215,7 @@
<!-- Flow Chart Tab -->
<div id="flowchart" class="tab-panel">
<h2>Dying Flow Chart</h2>
<p class="subtitle">State transitions for player characters &mdash; <strong>W</strong> = Wounded value added to every dying increase</p>
<p class="subtitle">State transitions for player characters &mdash; <strong>W</strong> = Wounded value added only when first gaining the Dying condition</p>
<div class="legend">
<div class="legend-item"><div class="legend-dot" style="background:var(--c-alive);border-color:var(--c-alive-hi)"></div> Alive</div>
@ -246,9 +246,9 @@ flowchart TD
DX -->|"Crit Success \n· dying2 \n· +Wounded"| UNC
DX -->|"Success \n· dying1 \n· +Wounded"| UNC
DX -->|"Failure \n· dying+1+W"| DX
DX -->|"Crit Fail \n· dying+2+W"| DX
DX -->|"Take dmg \n· dying+1+W or +2+W"| DX
DX -->|"Failure \n· dying+1"| DX
DX -->|"Crit Fail \n· dying+2"| DX
DX -->|"Take dmg \n· dying+1 or +2"| DX
DX -->|"dying ≥ threshold"| DEAD
DX -->|"Healing 1+ HP \n· +Wounded"| ALIVE
DX -->|"Hero Points \n· Wounded unchanged"| UNC
@ -262,7 +262,7 @@ flowchart TD
<h3>Key Rules</h3>
<ul>
<li><strong>Recovery Check</strong> is a flat check (no modifiers) with DC = 10 + current dying value, made at the start of each turn while dying.</li>
<li><strong>Wounded</strong> is added to <em>every</em> dying value increase &mdash; being Wounded 2 and failing a recovery check means dying increases by 3 (1+2).</li>
<li><strong>Wounded</strong> is added only when you <em>first gain</em> the dying condition &mdash; being Wounded 2 when knocked to 0 HP means you start at Dying 3 (1+2). It does not affect recovery check failures or damage taken while already dying.</li>
<li><strong>Doomed X</strong> reduces your death threshold from 4 to (4&minus;X). Doomed 1 means dying 3 kills you. Decreases by 1 per full night&rsquo;s rest.</li>
<li><strong>Heroic Recovery:</strong> Spend all Hero Points at the start of your turn or when dying would increase. You lose the dying condition and stabilize at 0 HP. Wounded does <em>not</em> increase from this.</li>
<li><strong>Nonlethal KO:</strong> Reduced to 0 HP by a nonlethal attack causes Unconscious with no dying condition. You wake naturally after 10+ minutes.</li>
@ -471,34 +471,30 @@ flowchart TD
function recoveryWorsen(base) {
var old = simDying;
var total = base + simWounded;
var newDying = old + total;
var newDying = old + base;
var threshold = deathThreshold();
var wNote = simWounded > 0 ? ' (+' + simWounded + 'W&nbsp;= +' + total + ' total)' : '';
if (newDying >= threshold) {
simState = 'DEAD'; simDying = 0;
simHistory.push({ state: 'DEAD', dying: 0, via: 'Recovery Check Failed' });
return { msg: 'Dying ' + old + ' + ' + total + wNote + ' = Dying ' + newDying + ', reaching the death threshold of ' + threshold + '. You die.' };
return { msg: 'Dying ' + old + ' + ' + base + ' = Dying ' + newDying + ', reaching the death threshold of ' + threshold + '. You die.' };
}
simDying = newDying;
simHistory.push({ state: 'DYING', dying: newDying, via: 'Recovery Check Failed' });
return { msg: 'Dying ' + old + ' + ' + total + wNote + ' = Dying ' + newDying + '. Recovery DC is now ' + (10 + newDying) + '.' };
return { msg: 'Dying ' + old + ' + ' + base + ' = Dying ' + newDying + '. Recovery DC is now ' + (10 + newDying) + '.' };
}
function dyingWorsen(base, label) {
var old = simDying;
var total = base + simWounded;
var newDying = old + total;
var newDying = old + base;
var threshold = deathThreshold();
var wNote = simWounded > 0 ? ' (+' + simWounded + 'W&nbsp;= +' + total + ' total)' : '';
if (newDying >= threshold) {
simState = 'DEAD'; simDying = 0;
simHistory.push({ state: 'DEAD', dying: 0, via: label });
return { msg: 'Dying ' + old + ' + ' + total + wNote + ' = Dying ' + newDying + ', reaching the death threshold of ' + threshold + '. You die.' };
return { msg: 'Dying ' + old + ' + ' + base + ' = Dying ' + newDying + ', reaching the death threshold of ' + threshold + '. You die.' };
}
simDying = newDying;
simHistory.push({ state: 'DYING', dying: newDying, via: label });
return { msg: 'Dying ' + old + ' + ' + total + wNote + ' = Dying ' + newDying + '.' };
return { msg: 'Dying ' + old + ' + ' + base + ' = Dying ' + newDying + '.' };
}
// ── Actions ───────────────────────────────────────────────────
@ -618,8 +614,7 @@ flowchart TD
getOutcomes: function() {
var t = deathThreshold();
var csR = simDying - 2, sR = simDying - 1;
var fR = simDying + 1 + simWounded, cfR = simDying + 2 + simWounded;
var wL = simWounded > 0 ? '+' + simWounded + 'W' : '';
var fR = simDying + 1, cfR = simDying + 2;
var dead = ' <strong style="color:var(--c-dead-hi)">\u2192 Death</strong>';
var stable = ' <strong style="color:var(--c-alive-hi)">\u2192 Stabilize</strong>';
return [
@ -627,27 +622,26 @@ flowchart TD
action: function() { return recoveryImprove(2); } },
{ label: '&#x2713; Success \u2014 dying&minus;1 = Dying ' + Math.max(0,sR) + (sR <= 0 ? stable : ''),
action: function() { return recoveryImprove(1); } },
{ label: '&#x2717; Failure \u2014 dying+1' + (wL ? '+' + wL : '') + ' = Dying ' + fR + (fR >= t ? dead : ''),
{ label: '&#x2717; Failure \u2014 dying+1 = Dying ' + fR + (fR >= t ? dead : ''),
action: function() { return recoveryWorsen(1); } },
{ label: '&#x2717;&#x2717; Critical Failure \u2014 dying+2' + (wL ? '+' + wL : '') + ' = Dying ' + cfR + (cfR >= t ? dead : ''),
{ label: '&#x2717;&#x2717; Critical Failure \u2014 dying+2 = Dying ' + cfR + (cfR >= t ? dead : ''),
action: function() { return recoveryWorsen(2); } },
];
},
},
{
name: 'Take Damage While Dying',
hint: 'Any damage while dying increases dying value (+W)',
hint: 'Any damage while dying increases dying value',
needsRoll: true,
rollLabel: 'Was the hit a critical?',
getOutcomes: function() {
var t = deathThreshold();
var nR = simDying + 1 + simWounded, cR = simDying + 2 + simWounded;
var wL = simWounded > 0 ? '+' + simWounded + 'W' : '';
var nR = simDying + 1, cR = simDying + 2;
var dead = ' <strong style="color:var(--c-dead-hi)">\u2192 Death</strong>';
return [
{ label: 'Normal hit \u2014 dying+1' + (wL ? '+' + wL : '') + ' = Dying ' + nR + (nR >= t ? dead : ''),
{ label: 'Normal hit \u2014 dying+1 = Dying ' + nR + (nR >= t ? dead : ''),
action: function() { return dyingWorsen(1, 'Take Damage'); } },
{ label: 'Critical hit or critical failure \u2014 dying+2' + (wL ? '+' + wL : '') + ' = Dying ' + cR + (cR >= t ? dead : ''),
{ label: 'Critical hit or critical failure \u2014 dying+2 = Dying ' + cR + (cR >= t ? dead : ''),
action: function() { return dyingWorsen(2, 'Critical Hit'); } },
];
},

Loading…
Cancel
Save