Files
tevansandClaude Opus 5 e2d1de2fb8 Themes are pluggable; add Castle; validate packs
Groundwork for many themes, plus the first new one.

A pack validator enforces every structural rule this project learned the hard
way: situations that render as broken English, decisions that gate progress with
no alternative, motifs too thin to fill six areas without repeating, rosters
that do not say what harms them. Fifteen packs cannot be hand-checked; this
checks them in a second.

Themes are now discovered from content/index.json rather than hardcoded, so the
CLI takes --theme and --themes, the Foundry dropdown fills itself, and packs
load on demand instead of all at once.

Castle: four appetites — to be feared, never to give ground, to be obeyed at
once, the name to go on — over barrow geometry, since a keep is rooms and
corridors. 168 kernels from its own claimants and accommodations.

Fixed a bug the second theme exposed: the question the bottom problem asks was
hardcoded against barrow's appetite ids, so every other theme fell through to a
generic "Well?". It lives on the appetite in the pack now, and the validator
requires it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-05 16:14:33 +01:00

63 lines
2.6 KiB
Handlebars

<div class="delve-forge">
<p class="hint">Generates a complete dungeon — fiction, areas, maps, encounters, hoards and a
journal you can read cold — and drops it into this world in one folder.</p>
<div class="delve-grid">
<label>Theme
<select name="theme">
{{#each themes}}<option value="{{this.id}}" {{#if (eq this.id ../v.theme)}}selected{{/if}}>{{this.label}}</option>{{/each}}
</select>
</label>
<label>Areas
<input type="number" name="areas" value="{{v.areas}}" min="3" max="12" step="1">
</label>
<label>Depth
<select name="depth">
{{#each picks.depth}}<option value="{{this}}" {{#if (eq this ../v.depth)}}selected{{/if}}>{{this}}</option>{{/each}}
</select>
</label>
<label>Heroes
<select name="party">
{{#each picks.party}}<option value="{{this}}" {{#if (eq this ../v.party)}}selected{{/if}}>{{this}}</option>{{/each}}
</select>
</label>
<label>Deadliness
<select name="deadliness">
{{#each picks.deadliness}}<option value="{{this}}" {{#if (eq this ../v.deadliness)}}selected{{/if}}>{{this}}</option>{{/each}}
</select>
</label>
<label>Density
<select name="density">
{{#each picks.density}}<option value="{{this}}" {{#if (eq this ../v.density)}}selected{{/if}}>{{this}}</option>{{/each}}
</select>
</label>
<label>Greed
<select name="greed">
{{#each picks.greed}}<option value="{{this}}" {{#if (eq this ../v.greed)}}selected{{/if}}>{{this}}</option>{{/each}}
</select>
</label>
<label>Clock
<select name="clock">
{{#each picks.clock}}<option value="{{this}}" {{#if (eq this ../v.clock)}}selected{{/if}}>{{this}}</option>{{/each}}
</select>
</label>
<label>Ending
<select name="ending">
{{#each picks.ending}}<option value="{{this}}" {{#if (eq this ../v.ending)}}selected{{/if}}>{{this}}</option>{{/each}}
</select>
</label>
<label>Seed <span class="sub">blank = random</span>
<input type="text" name="seed" value="{{v.seed}}" placeholder="gilded-court-404">
</label>
</div>
<div class="delve-toggles">
<label class="checkbox"><input type="checkbox" name="maps" {{#if v.maps}}checked{{/if}}> Build the maps <span class="sub">(slower — about a second per area)</span></label>
<label class="checkbox"><input type="checkbox" name="populate" {{#if v.populate}}checked{{/if}}> Roll the encounters</label>
</div>
<footer class="delve-actions">
<button type="submit" class="bright"><i class="fas fa-mountain"></i> Raise the dungeon</button>
</footer>
</div>