Three fail-open classifiers, each reading a field that is not where the
bestiary keeps the answer. Found by generating one creature before
spending the allowance on forty-eight; art/creatures/gryphon-u1.png is a
WINGLESS gryphon, from a spec whose bodyPlan is "winged".
1. anatomyWords() read `species`. Shape lives in `bodyPlan` — that is the
field selecting the hit-location table. 44 of the 100 new creatures are
species "baseline" with bodyPlan quadruped or winged, so every one fell
to the silent branch and asked for no shape at all.
2. isPersonSpec() ended `if (tag) return true` — an unrecognised role tag
means person. MONSTER_TAGS listed three tags; the bestiary uses twelve,
so 43 creatures were prompted as "portrait of X, waist-up portrait".
Now bodyPlan decides first, structurally, because a tag list is free
text that grows and bodyPlan is enforced by the engine.
3. ROLE_CLASS knew the same three tags, so HERALDRY fell through to
"carries nothing manufactured and armour >= 4 -> anomalous". Six
centuries of carved stone were classed as far-side machinery, and the
armour clause duly asked for a mech. ROLE_CLASS now carries all twelve,
and the heavy-armour wording follows era: machinery for future and
anomalous, "hide and scale thick as carved stone" for the rest.
Also in this commit: all 100 creatures re-pointed onto the natural attacks
added in 3feac39 — 41 of 100 changed, the rest keeping grasp or punch
because that is genuinely what they do. Three manoeuvres stay as prose and
say so explicitly: dun_cow's and bull_azure's charge, gryphon's stoop and
drop, tup's blind side. Portraits redrawn, since era decides their hue.
All 23 guards pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2.8 KiB
2.8 KiB