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>
63 lines
2.6 KiB
Handlebars
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>
|