A Foundry VTT game system: Basic Roleplaying d100 in a drab British agency that deals with crossings, where reality keeps a record of what belongs where and can be made to get it wrong. Contents: - rules.mjs as the single authority for every rule formula, with 40 rules and 132 spot-checked values. Nothing may restate a formula it defines. - 25 postings, each with a key characteristic, trained skills, talents and its own kit; a 175-item catalogue across four eras; 231 generated icons. - Reaction Lanes initiative, re-rolled every round including the first. - Coherence, and the Quiet Arts, which only ever arrive from a crossing gone wrong. - Graded defences: only a critical stops a critical. - Borrowed Authority — access as a record rather than a hacking roll. - A case generator, and a rules journal generated from rules.mjs so the book cannot drift from the code. Built compendia are committed so a remote Foundry needs only the files. node_modules is not; `npm install` restores it for rebuilding content. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
100 lines
5.7 KiB
Handlebars
100 lines
5.7 KiB
Handlebars
<form class="ringbrp-sheet rb-npc" autocomplete="off">
|
|
<header class="rb-header">
|
|
<img class="rb-portrait" src="{{actor.img}}" data-edit="img" title="{{actor.name}}"/>
|
|
<div class="rb-headline">
|
|
<input class="rb-name" name="name" type="text" value="{{actor.name}}"/>
|
|
<input class="rb-role" name="system.role" type="text" value="{{sys.role}}" placeholder="{{localize 'RINGBRP.Sheet.Role'}}"/>
|
|
<div class="rb-origin">
|
|
<span class="rb-style-fixed">{{styleLabel}}</span>
|
|
</div>
|
|
</div>
|
|
<div class="rb-vitals">
|
|
<div class="rb-hp"><span class="rb-vital-label">{{localize "RINGBRP.Sheet.HP"}}</span>
|
|
<input type="number" name="system.hp.value" value="{{sys.hp.value}}"/><span class="rb-slash">/</span><span class="rb-max">{{sys.hp.max}}</span></div>
|
|
<div class="rb-mw"><span class="rb-vital-label">{{localize "RINGBRP.Sheet.MajorWound"}}</span><span class="rb-big">{{sys.majorWound.value}}</span></div>
|
|
<div class="rb-armour"><span class="rb-vital-label">{{localize "RINGBRP.Sheet.Armour"}}</span>
|
|
<input type="number" name="system.naturalArmour.value" value="{{sys.naturalArmour.value}}"/></div>
|
|
</div>
|
|
</header>
|
|
|
|
<section class="rb-characteristics">
|
|
{{#each sys.characteristics as |c key|}}
|
|
<div class="rb-char" data-characteristic="{{key}}">
|
|
<a class="rb-char-label" data-action="roll-characteristic">{{localize (rbConcat "RINGBRP.Char." key)}}</a>
|
|
<input type="number" name="system.characteristics.{{key}}.value" value="{{c.value}}"/>
|
|
<a class="rb-char-x5" data-action="roll-characteristic">{{rbTimes5 c.value}}</a></div>
|
|
{{/each}}
|
|
</section>
|
|
|
|
<section class="rb-derived">
|
|
<div class="rb-derived-group"><span class="rb-dl">{{localize "RINGBRP.Sheet.DamageMod"}}</span><span class="rb-dv">{{sys.damageModifier}}</span></div>
|
|
<div class="rb-derived-group"><span class="rb-dl">{{localize "RINGBRP.Sheet.MOV"}}</span><span class="rb-dv">{{sys.mov}}</span></div>
|
|
</section>
|
|
|
|
<nav class="sheet-tabs rb-tabs" data-group="primary">
|
|
<a class="item" data-tab="skills">{{localize "RINGBRP.Tab.Skills"}}</a>
|
|
<a class="item" data-tab="combat">{{localize "RINGBRP.Tab.Combat"}}</a>
|
|
<a class="item" data-tab="bio">{{localize "RINGBRP.Tab.Tactics"}}</a>
|
|
</nav>
|
|
|
|
<section class="sheet-body rb-body">
|
|
<div class="tab" data-group="primary" data-tab="skills">
|
|
{{#each RINGBRP.categories as |cat key|}}
|
|
{{#if (lookup ../skillsByCategory key).length}}
|
|
<div class="rb-cat">
|
|
<h3 class="rb-cat-head">{{localize cat.label}}<span class="rb-catbonus">+{{lookup ../sys.categoryBonus key}}</span>
|
|
<a class="rb-add" data-action="item-create" data-type="skill"><i class="fas fa-plus"></i></a></h3>
|
|
<ol class="rb-skills">
|
|
{{#each (lookup ../skillsByCategory key) as |sk|}}
|
|
<li class="rb-skill" data-item-id="{{sk.id}}">
|
|
<a class="rb-skill-name" data-action="roll-skill">{{sk.name}}</a>
|
|
<span class="rb-skill-val">{{sk.system.value}}%</span>
|
|
<a data-action="item-edit"><i class="fas fa-edit"></i></a>
|
|
<a data-action="item-delete"><i class="fas fa-trash"></i></a>
|
|
</li>
|
|
{{/each}}
|
|
</ol>
|
|
</div>
|
|
{{/if}}
|
|
{{/each}}
|
|
<a class="rb-add-wide" data-action="item-create" data-type="skill"><i class="fas fa-plus"></i> {{localize "RINGBRP.Sheet.AddSkill"}}</a>
|
|
</div>
|
|
|
|
<div class="tab" data-group="primary" data-tab="combat">
|
|
<h3 class="rb-cat-head">{{localize "RINGBRP.Tab.Weapons"}}
|
|
<a class="rb-add" data-action="item-create" data-type="weapon"><i class="fas fa-plus"></i></a></h3>
|
|
<table class="rb-table">
|
|
<thead><tr><th>{{localize "RINGBRP.Sheet.Weapon"}}</th><th>{{localize "RINGBRP.Sheet.Damage"}}</th><th>{{localize "RINGBRP.Sheet.Range"}}</th><th>{{localize "RINGBRP.Sheet.Ammo"}}</th><th></th></tr></thead>
|
|
<tbody>
|
|
{{#each weapons as |w|}}
|
|
<tr data-item-id="{{w.id}}">
|
|
<td><a data-action="roll-attack" class="rb-strong">{{w.name}}</a></td>
|
|
<td><a data-action="roll-damage">{{#if (rbEq w.system.damage.mode "byBand")}}{{w.system.damage.short}}/{{w.system.damage.medium}}/{{w.system.damage.long}}{{else}}{{w.system.damage.formula}}{{/if}}</a></td>
|
|
<td>{{w.system.rangeSummary}}</td>
|
|
<td>{{#if w.system.ammo.capacity}}{{w.system.ammo.loaded}}/{{w.system.ammo.capacity}}{{/if}}</td>
|
|
<td class="rb-actions"><a data-action="item-edit"><i class="fas fa-edit"></i></a><a data-action="item-delete"><i class="fas fa-trash"></i></a></td>
|
|
</tr>
|
|
{{/each}}
|
|
</tbody>
|
|
</table>
|
|
<ol class="rb-list">
|
|
{{#each armours as |a|}}
|
|
<li data-item-id="{{a.id}}">
|
|
<a class="rb-equip {{#if a.system.equipped}}on{{/if}}" data-action="toggle-equipped"><i class="fas fa-shield-halved"></i></a>
|
|
<span class="rb-strong">{{a.name}}</span><span class="rb-dim">{{a.system.points}}</span>
|
|
<a data-action="item-edit"><i class="fas fa-edit"></i></a><a data-action="item-delete"><i class="fas fa-trash"></i></a>
|
|
</li>
|
|
{{/each}}
|
|
</ol>
|
|
<a class="rb-add-wide" data-action="item-create" data-type="armour"><i class="fas fa-plus"></i> {{localize "RINGBRP.Tab.Armour"}}</a>
|
|
</div>
|
|
|
|
<div class="tab" data-group="primary" data-tab="bio">
|
|
<label class="rb-block">{{localize "RINGBRP.Sheet.Tactics"}}</label>
|
|
<textarea name="system.tactics" rows="6">{{sys.tactics}}</textarea>
|
|
<label class="rb-block">{{localize "RINGBRP.Sheet.Notes"}}</label>
|
|
{{editor notesHTML target="system.notes" button=true editable=editable engine="prosemirror"}}
|
|
</div>
|
|
</section>
|
|
</form>
|