Files
RingBRP/tools/powers-water.mjs
T
slaguru666andClaude Opus 5 f68b98190f bestiary + check-powers: read the seam, and classify what that reveals
bestiary.mjs built the document from NPCS, so it described 47 creatures of
147 while check-bestiary agreed with it — two things agreeing is not
verification when both read the same wrong source. It reads collectSpecs()
now: 184 creatures across 5 sections, every one with a measured lethality
figure, which only works because check-lethality was fixed first.

Three faults surfaced fixing it:

  - a second NPCS reference in focusParagraph()
  - which then broke on `rows`, because focusParagraph declares its own
    local `rows` for focus-fire data and shadowed the creature list. Keyed
    lookup now, so the shadowing cannot bite again.
  - the document grouped on the raw role tag against a list of four, and
    `if (!group.length) continue` DROPS an unlisted tag rather than
    mis-filing it. Nine of the twelve tags were absent, so those creatures
    would not have appeared at all. Twelve tags now map onto five sections,
    with a new "Beasts and heraldry", and a completeness assertion counts
    every creature into a section and fails if one is unplaced.

check-powers was the fifth consumer bypassing all-specs.mjs. It reconciled
its counts against BESTIARY while reading NPCS, so it called the document
wrong when the document was right.

Reading the real population then demanded 101 classifications. All 101 are
done and NOT ONE was wired. That is the right answer, not a shortfall:
the three available effects describe the creature — its own attack rating,
the damage it takes, whether it feels defence stacking — and essentially
every power is conditional on a place, a posture, a round count, a weapon
type, an attacker count, a named agent, or Coherence. R-275 records what
wiring one anyway costs: 25.1% to 75.2% on a single creature.

The near-misses are the evidence the reluctance was applied, not recited:
tangie's "HALF damage" is edged-only and ends in open flame; the_heron is
+30% or -20% depending on movement the harness does not have, so which
branch applies is undecidable; mirrorline's halving lands on an AGENT, not
on the creature, so wiring it would have protected the wrong combatant;
yale's defence waiver is capped at two attackers and its written counter is
a fourth agent, which defenceStacking:"ignores" cannot express.

Classifications live in four band files and are spread into POWERS last, so
a hand-written entry always wins a collision. 142 classified: 2 wired, 78
beyond the harness with a reason, 62 not fight rules.

All 23 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 23:28:13 +01:00

99 lines
7.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* WATER, COAST AND THE DROWNED — what each of those POWERs does in a fight.
*
* The water band's share of the classification described in the header of tools/powers.mjs,
* merged into POWERS there. Same three kinds, same rule: `wired` only where the power maps
* exactly onto one of the three effects the simulator understands AND applies in any fight
* without condition.
*
* Nothing in this band is wired, and the reason is the whole character of the file. Water
* creatures kill by holding a subject under, and their powers hand off to the ASPHYXIA
* rules — which are conditional on being in or near water, and the harness has no water,
* exactly as it has no ground. R-275 is what wiring a conditional power looks like: the
* supporter's half damage was applied unconditionally and moved its wipe rate 25.1% to
* 75.2%. A damageFactor standing in for drowning would be the same mistake with a wetter
* name. Where a power here reads like one of the three effects — the tangie's half damage,
* the heron's double damage, the eel mother's +20% — a condition sits in front of it that
* the harness cannot evaluate, so it is notSimulable and the condition is named.
*/
export const POWERS_WATER = {
/* ---- notSimulable: fight rules the harness cannot express ---- */
sea_mare: { name: "THE TIDE IT CAME IN ON", kind: "notSimulable",
why: "half damage and 2 hit points a round back only below the high-water mark, and the harness "
+ "has no tide line — the same place-conditional shape as the supporter's ground, R-275" },
tangie: { name: "WEED", kind: "notSimulable",
why: "half damage to edged and piercing weapons only, full to blunt, and gone after a round of "
+ "open flame — conditional on the attacker's weapon and on the wrack not being burnt off" },
wrack_gull: { name: "BY ACCLAMATION", kind: "notSimulable",
why: "−30% to the subject's own Dodge and Athletics while the flock is on them; the harness has "
+ "no effect that penalises a target's skills, only the creature's own three" },
shellycoat: { name: "SOMETHING OF YOURS", kind: "notSimulable",
why: "takes one carried object a round, GM's pick of the useful one, and the harness has no "
+ "inventory to take from" },
peg_powler: { name: "UNDER", kind: "notSimulable",
why: "a STR 23 grapple from the pool into the ASPHYXIA rules, and only against someone within "
+ "two metres of the water's edge — the harness has no water and no edge to stand back from" },
greenteeth: { name: "IT LOOKS LIKE GROUND", kind: "notSimulable",
why: "holds whoever steps onto the weed and runs the ASPHYXIA rules from the second round under; "
+ "no damage exchange at all and the harness has no surface to step through" },
fen_hound: { name: "OFF THE PATH", kind: "notSimulable",
why: "only fires on a subject who runs — a walk needs no roll — and its effect is chest-deep "
+ "water and a dropped item, none of which the harness has" },
wrackman: { name: "FLOOD LINE", kind: "notSimulable",
why: "heals 3 hit points a round while standing in standing water, and fire is exempt; regeneration "
+ "is not one of the three effects and the condition is a place the harness cannot see" },
hulk_haunt: { name: "WATERTIGHT", kind: "notSimulable",
why: "shuts one door, hatch or scuttle a round against agents inside the hull, and the harness has "
+ "no interior, no doors and no wedges" },
drowned_crew: { name: "ALL HANDS", kind: "notSimulable",
why: "a POWx5 to not join the watch, at −10% per body still upright; the harness rolls no "
+ "characteristics and has no vessel to be aboard" },
lock_keeper: { name: "THE CHAMBER", kind: "notSimulable",
why: "only reaches someone inside the lock, and resolves as hull damage or an Athletics roll into "
+ "the ASPHYXIA rules — conditional on a place, and he will not touch anyone on the bank" },
the_undertow: { name: "SET", kind: "notSimulable",
why: "moves and holds under anybody in the water and runs the ASPHYXIA rules; armour and weapons "
+ "do nothing to it, and it does not exist at slack water" },
the_fathom: { name: "SOUNDING", kind: "notSimulable",
why: "once a scene, 1d4 with no roll and no armour to everyone in the water above it, reduced to "
+ "1 by ear defenders — conditional on being in the water and on what the party was issued" },
eelmother: { name: "THE ROLL", kind: "notSimulable",
why: "a manoeuvre that only follows a bite which held, ending in the ASPHYXIA rules, and its +20% "
+ "needs blood in the water first — conditional on a prior hit and on the water itself" },
lamprey_host: { name: "IT COMES APART", kind: "notSimulable",
why: "a single hit of 8 or more splits it into two hosts sharing its hit points; the harness cannot "
+ "add a combatant mid-fight or divide one" },
washland_cattle: { name: "DRIVEN", kind: "notSimulable",
why: "the whole herd going at once for 2d6 and a knockdown, with no roll to avoid in water above "
+ "the knee and the ASPHYXIA rules under eleven animals; the harness has one creature and no water" },
the_heron: { name: "THE STRIKE", kind: "notSimulable",
why: "+30% and double damage against a target that did not move on its previous turn, −20% against "
+ "one that did, and the harness has no movement — so which branch applies is undecidable" },
/* ---- outOfCombat: not fight rules ---- */
harbour_dog: { name: "HEEL", kind: "outOfCombat",
why: "a POWx5 at the end of every scene in sight of the harbour that walks the subject to the quay; "
+ "it is friendly until somebody is between it and the water" },
selkie: { name: "THE SKIN IS THE CONTRACT", kind: "outOfCombat",
why: "its own entry says a Borrowed Authority and bargain problem, not a combat, and the price is "
+ "Coherence" },
sea_crow: { name: "THE COUNT", kind: "outOfCombat",
why: "it is harmless and one bird; the power is a list of the drowned that costs Coherence to hear, "
+ "ended by salvage and burial" },
cut_walker: { name: "PASSING PLACE", kind: "outOfCombat",
why: "it does not chase, hurry or turn round — the power is giving ground on a towpath, and only "
+ "someone still in its path is affected" },
net_mender: { name: "UNPICKED", kind: "outOfCombat",
why: "unmakes the record and the memory of a named person's return; she dies like a woman of sixty "
+ "and her price is another name" },
mudlark_child: { name: "COME AND SEE", kind: "outOfCombat",
why: "it never touches anybody — a real clue placed out on the foreshore, soft mud and an incoming "
+ "tide, cancelled by a line thrown from hard ground" },
the_sump: { name: "DRAWDOWN", kind: "outOfCombat",
why: "its own entry says nothing here is a combat unless the agents dive; the power is a dusk POWx5 "
+ "gated on reservoir capacity, and the case is a conversation with the water company" },
drowned_parish: { name: "THE SERVICE IS AT SIX", kind: "outOfCombat",
why: "a clock, not a fight — they will not strike first and cannot be dispersed by force; a formal "
+ "deconsecration read aloud ends it" }
};