Movement types (Climb, Cling, Fly, Phase, Swim) now use boolean toggles instead of separate speed values, matching RAW where all special movement uses base speed. Changes: - Update NPC and Character data models with movement schema - Add movement section to NPC stats template (grid layout) - Add movement section to character biography template - Add localization strings with tooltip hints for each type - Style movement grid to match senses section pattern - Add rollable # Appearing label for NPC sheets - Fix NPC sheet scrollbar visibility 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
160 lines
5.2 KiB
Handlebars
160 lines
5.2 KiB
Handlebars
{{!-- NPC Sheet Stats Section --}}
|
|
<section class="npc-stats">
|
|
<div class="stats-row">
|
|
{{!-- Zone --}}
|
|
<div class="stat-group zone">
|
|
<label>{{localize "VAGABOND.Zone"}}</label>
|
|
<select name="system.zone">
|
|
{{#each zoneOptions}}
|
|
<option value="{{@key}}" {{#if (eq @key ../zone)}}selected{{/if}}>
|
|
{{localize this}}
|
|
</option>
|
|
{{/each}}
|
|
</select>
|
|
<p class="zone-hint">{{zoneBehavior}}</p>
|
|
</div>
|
|
|
|
{{!-- Speed --}}
|
|
<div class="stat-group speed">
|
|
<label>{{localize "VAGABOND.Speed"}}</label>
|
|
<div class="speed-value">
|
|
<input type="number" name="system.speed.value" value="{{speed}}" min="0" />
|
|
<span class="unit">ft</span>
|
|
</div>
|
|
</div>
|
|
|
|
{{!-- Size & Type --}}
|
|
<div class="stat-group type">
|
|
<div class="type-field">
|
|
<label>{{localize "VAGABOND.Size"}}</label>
|
|
<select name="system.size">
|
|
{{#each sizeOptions}}
|
|
<option value="{{@key}}" {{#if (eq @key ../size)}}selected{{/if}}>
|
|
{{localize this}}
|
|
</option>
|
|
{{/each}}
|
|
</select>
|
|
</div>
|
|
<div class="type-field">
|
|
<label>{{localize "VAGABOND.BeingType"}}</label>
|
|
<select name="system.beingType">
|
|
{{#each beingTypeOptions}}
|
|
<option value="{{@key}}" {{#if (eq @key ../beingType)}}selected{{/if}}>
|
|
{{localize this}}
|
|
</option>
|
|
{{/each}}
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
{{!-- Appearing --}}
|
|
<div class="stat-group appearing">
|
|
<label class="rollable" data-action="rollAppearing" data-tooltip="{{localize 'VAGABOND.RollAppearing'}}">
|
|
<i class="fa-solid fa-dice"></i>
|
|
{{localize "VAGABOND.Appearing"}}
|
|
</label>
|
|
<input type="text" name="system.appearing" value="{{appearing}}" placeholder="1d6" />
|
|
</div>
|
|
</div>
|
|
|
|
{{!-- Movement Types --}}
|
|
<div class="biography-section movement">
|
|
<h2 class="section-header">{{localize "VAGABOND.Movement"}}</h2>
|
|
<div class="movement-grid">
|
|
<div class="movement-field">
|
|
<label data-tooltip="{{localize 'VAGABOND.MovementClimbHint'}}">
|
|
<input type="checkbox" name="system.movement.climb" {{#if movement.climb}}checked{{/if}} />
|
|
{{localize "VAGABOND.Climb"}}
|
|
</label>
|
|
</div>
|
|
<div class="movement-field">
|
|
<label data-tooltip="{{localize 'VAGABOND.MovementClingHint'}}">
|
|
<input type="checkbox" name="system.movement.cling" {{#if movement.cling}}checked{{/if}} />
|
|
{{localize "VAGABOND.Cling"}}
|
|
</label>
|
|
</div>
|
|
<div class="movement-field">
|
|
<label data-tooltip="{{localize 'VAGABOND.MovementFlyHint'}}">
|
|
<input type="checkbox" name="system.movement.fly" {{#if movement.fly}}checked{{/if}} />
|
|
{{localize "VAGABOND.Fly"}}
|
|
</label>
|
|
</div>
|
|
<div class="movement-field">
|
|
<label data-tooltip="{{localize 'VAGABOND.MovementPhaseHint'}}">
|
|
<input type="checkbox" name="system.movement.phase" {{#if movement.phase}}checked{{/if}} />
|
|
{{localize "VAGABOND.Phase"}}
|
|
</label>
|
|
</div>
|
|
<div class="movement-field">
|
|
<label data-tooltip="{{localize 'VAGABOND.MovementSwimHint'}}">
|
|
<input type="checkbox" name="system.movement.swim" {{#if movement.swim}}checked{{/if}} />
|
|
{{localize "VAGABOND.Swim"}}
|
|
</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{{!-- Senses --}}
|
|
{{#if hasSenses}}
|
|
<div class="senses-row">
|
|
<label>{{localize "VAGABOND.Senses"}}:</label>
|
|
{{#if senses.allsight}}
|
|
<span class="sense-tag">{{localize "VAGABOND.Allsight"}}</span>
|
|
{{/if}}
|
|
{{#if senses.blindsight}}
|
|
<span class="sense-tag">{{localize "VAGABOND.Blindsight"}}</span>
|
|
{{/if}}
|
|
{{#if senses.darkvision}}
|
|
<span class="sense-tag">{{localize "VAGABOND.Darkvision"}}</span>
|
|
{{/if}}
|
|
{{#if senses.echolocation}}
|
|
<span class="sense-tag">{{localize "VAGABOND.Echolocation"}}</span>
|
|
{{/if}}
|
|
{{#if senses.seismicsense}}
|
|
<span class="sense-tag">{{localize "VAGABOND.Seismicsense"}}</span>
|
|
{{/if}}
|
|
{{#if senses.telepathy}}
|
|
<span class="sense-tag">{{localize "VAGABOND.Telepathy"}}</span>
|
|
{{/if}}
|
|
</div>
|
|
{{/if}}
|
|
|
|
{{!-- Damage Modifiers --}}
|
|
{{#if hasDamageModifiers}}
|
|
<div class="damage-modifiers">
|
|
{{#if immunities.length}}
|
|
<div class="modifier-row immunities">
|
|
<label>{{localize "VAGABOND.Immunities"}}:</label>
|
|
<div class="modifier-tags">
|
|
{{#each immunities}}
|
|
<span class="modifier-tag immune">{{this}}</span>
|
|
{{/each}}
|
|
</div>
|
|
</div>
|
|
{{/if}}
|
|
|
|
{{#if resistances.length}}
|
|
<div class="modifier-row resistances">
|
|
<label>{{localize "VAGABOND.Resistances"}}:</label>
|
|
<div class="modifier-tags">
|
|
{{#each resistances}}
|
|
<span class="modifier-tag resist">{{this}}</span>
|
|
{{/each}}
|
|
</div>
|
|
</div>
|
|
{{/if}}
|
|
|
|
{{#if weaknesses.length}}
|
|
<div class="modifier-row weaknesses">
|
|
<label>{{localize "VAGABOND.Weaknesses"}}:</label>
|
|
<div class="modifier-tags">
|
|
{{#each weaknesses}}
|
|
<span class="modifier-tag weak">{{this}}</span>
|
|
{{/each}}
|
|
</div>
|
|
</div>
|
|
{{/if}}
|
|
</div>
|
|
{{/if}}
|
|
</section>
|