Ajout des commandes de creation de rencontre/NJ
This commit is contained in:
299
templates/commerce-dialog.hbs
Normal file
299
templates/commerce-dialog.hbs
Normal file
@@ -0,0 +1,299 @@
|
||||
<form class="mgt2-commerce-form">
|
||||
|
||||
{{!-- Onglets de navigation --}}
|
||||
<nav class="tabs" data-group="primary">
|
||||
<a class="item active" data-tab="passengers">
|
||||
<i class="fas fa-users"></i> Passagers
|
||||
</a>
|
||||
<a class="item" data-tab="cargo">
|
||||
<i class="fas fa-boxes"></i> Cargaison
|
||||
</a>
|
||||
<a class="item" data-tab="trade">
|
||||
<i class="fas fa-balance-scale"></i> Commerce spéculatif
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
<section class="tab-content">
|
||||
|
||||
{{!-- ══════════════════════════════════════════ --}}
|
||||
{{!-- Onglet 1 : Passagers --}}
|
||||
{{!-- ══════════════════════════════════════════ --}}
|
||||
<div class="tab active" data-tab="passengers">
|
||||
<h3><i class="fas fa-users"></i> Transport de passagers</h3>
|
||||
|
||||
<div class="worlds-row">
|
||||
|
||||
{{!-- Bloc Départ --}}
|
||||
<div class="world-block">
|
||||
<div class="world-block-title"><i class="fas fa-rocket"></i> Monde de départ</div>
|
||||
<div class="world-search-widget" data-uwp-target="pax.uwpDep" data-zone-target="pax.zoneDep" data-parsecs-target="pax.parsecs" data-role="dep">
|
||||
<div class="world-search-row">
|
||||
<input type="text" class="world-search-input" placeholder="Rechercher le monde…" autocomplete="off">
|
||||
<button type="button" class="btn-world-search" title="Rechercher sur Traveller Map">
|
||||
<i class="fas fa-globe"></i> Chercher
|
||||
</button>
|
||||
</div>
|
||||
<ul class="world-search-results"></ul>
|
||||
</div>
|
||||
<div class="uwp-zone-row">
|
||||
<div class="form-group uwp-field">
|
||||
<label for="pax-uwp-dep">UWP <span class="hint">(ex. A788899-C)</span></label>
|
||||
<input id="pax-uwp-dep" name="pax.uwpDep" type="text" placeholder="A788899-C" value="{{pax.uwpDep}}">
|
||||
</div>
|
||||
<div class="form-group zone-field">
|
||||
<label for="pax-zone-dep">Zone</label>
|
||||
<select id="pax-zone-dep" name="pax.zoneDep">
|
||||
<option value="normal" {{#if (eq pax.zoneDep "normal")}}selected{{/if}}>Normale</option>
|
||||
<option value="amber" {{#if (eq pax.zoneDep "amber")}}selected{{/if}}>Ambre</option>
|
||||
<option value="red" {{#if (eq pax.zoneDep "red")}}selected{{/if}}>Rouge</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{!-- Séparateur parsecs --}}
|
||||
<div class="parsecs-separator">
|
||||
<i class="fas fa-arrow-right"></i>
|
||||
<div class="form-group">
|
||||
<label for="pax-parsecs">Parsecs</label>
|
||||
<input id="pax-parsecs" name="pax.parsecs" type="number" min="1" max="6" value="{{pax.parsecs}}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{!-- Bloc Destination --}}
|
||||
<div class="world-block">
|
||||
<div class="world-block-title"><i class="fas fa-flag-checkered"></i> Monde de destination</div>
|
||||
<div class="world-search-widget" data-uwp-target="pax.uwpDest" data-zone-target="pax.zoneDest" data-parsecs-target="pax.parsecs" data-role="dest">
|
||||
<div class="world-search-row">
|
||||
<input type="text" class="world-search-input" placeholder="Rechercher le monde…" autocomplete="off">
|
||||
<button type="button" class="btn-world-search" title="Rechercher sur Traveller Map">
|
||||
<i class="fas fa-globe"></i> Chercher
|
||||
</button>
|
||||
</div>
|
||||
<ul class="world-search-results"></ul>
|
||||
</div>
|
||||
<div class="uwp-zone-row">
|
||||
<div class="form-group uwp-field">
|
||||
<label for="pax-uwp-dest">UWP</label>
|
||||
<input id="pax-uwp-dest" name="pax.uwpDest" type="text" placeholder="B456789-A" value="{{pax.uwpDest}}">
|
||||
</div>
|
||||
<div class="form-group zone-field">
|
||||
<label for="pax-zone-dest">Zone</label>
|
||||
<select id="pax-zone-dest" name="pax.zoneDest">
|
||||
<option value="normal" {{#if (eq pax.zoneDest "normal")}}selected{{/if}}>Normale</option>
|
||||
<option value="amber" {{#if (eq pax.zoneDest "amber")}}selected{{/if}}>Ambre</option>
|
||||
<option value="red" {{#if (eq pax.zoneDest "red")}}selected{{/if}}>Rouge</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>{{!-- /.worlds-row --}}
|
||||
|
||||
<fieldset>
|
||||
<legend>Modificateurs des Voyageurs</legend>
|
||||
<div class="form-group-row">
|
||||
<div class="form-group">
|
||||
<label for="pax-skill-effect">
|
||||
Effet du test <span class="hint">(Mondanités / Courtier / Sens de rue — Moy. 8+)</span>
|
||||
</label>
|
||||
{{modSelect "pax-skill-effect" "pax.skillEffect" pax.skillEffect -3 5}}
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="pax-steward">Niveau Intendant (chef de bord)</label>
|
||||
{{modSelect "pax-steward" "pax.stewardLevel" pax.stewardLevel 0 5}}
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<div class="form-footer">
|
||||
<button type="button" class="btn-calculate" data-action="calculate-passengers">
|
||||
<i class="fas fa-dice-d6"></i> Calculer les passagers
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{!-- ══════════════════════════════════════════ --}}
|
||||
{{!-- Onglet 2 : Cargaison --}}
|
||||
{{!-- ══════════════════════════════════════════ --}}
|
||||
<div class="tab" data-tab="cargo">
|
||||
<h3><i class="fas fa-boxes"></i> Transport de cargaison</h3>
|
||||
|
||||
<div class="worlds-row">
|
||||
|
||||
<div class="world-block">
|
||||
<div class="world-block-title"><i class="fas fa-rocket"></i> Monde de départ</div>
|
||||
<div class="world-search-widget" data-uwp-target="cargo.uwpDep" data-zone-target="cargo.zoneDep" data-parsecs-target="cargo.parsecs" data-role="dep">
|
||||
<div class="world-search-row">
|
||||
<input type="text" class="world-search-input" placeholder="Rechercher le monde…" autocomplete="off">
|
||||
<button type="button" class="btn-world-search" title="Rechercher sur Traveller Map">
|
||||
<i class="fas fa-globe"></i> Chercher
|
||||
</button>
|
||||
</div>
|
||||
<ul class="world-search-results"></ul>
|
||||
</div>
|
||||
<div class="uwp-zone-row">
|
||||
<div class="form-group uwp-field">
|
||||
<label for="cargo-uwp-dep">UWP</label>
|
||||
<input id="cargo-uwp-dep" name="cargo.uwpDep" type="text" placeholder="A788899-C" value="{{cargo.uwpDep}}">
|
||||
</div>
|
||||
<div class="form-group zone-field">
|
||||
<label for="cargo-zone-dep">Zone</label>
|
||||
<select id="cargo-zone-dep" name="cargo.zoneDep">
|
||||
<option value="normal" {{#if (eq cargo.zoneDep "normal")}}selected{{/if}}>Normale</option>
|
||||
<option value="amber" {{#if (eq cargo.zoneDep "amber")}}selected{{/if}}>Ambre</option>
|
||||
<option value="red" {{#if (eq cargo.zoneDep "red")}}selected{{/if}}>Rouge</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="parsecs-separator">
|
||||
<i class="fas fa-arrow-right"></i>
|
||||
<div class="form-group">
|
||||
<label for="cargo-parsecs">Parsecs</label>
|
||||
<input id="cargo-parsecs" name="cargo.parsecs" type="number" min="1" max="6" value="{{cargo.parsecs}}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="world-block">
|
||||
<div class="world-block-title"><i class="fas fa-flag-checkered"></i> Monde de destination</div>
|
||||
<div class="world-search-widget" data-uwp-target="cargo.uwpDest" data-zone-target="cargo.zoneDest" data-parsecs-target="cargo.parsecs" data-role="dest">
|
||||
<div class="world-search-row">
|
||||
<input type="text" class="world-search-input" placeholder="Rechercher le monde…" autocomplete="off">
|
||||
<button type="button" class="btn-world-search" title="Rechercher sur Traveller Map">
|
||||
<i class="fas fa-globe"></i> Chercher
|
||||
</button>
|
||||
</div>
|
||||
<ul class="world-search-results"></ul>
|
||||
</div>
|
||||
<div class="uwp-zone-row">
|
||||
<div class="form-group uwp-field">
|
||||
<label for="cargo-uwp-dest">UWP</label>
|
||||
<input id="cargo-uwp-dest" name="cargo.uwpDest" type="text" placeholder="B456789-A" value="{{cargo.uwpDest}}">
|
||||
</div>
|
||||
<div class="form-group zone-field">
|
||||
<label for="cargo-zone-dest">Zone</label>
|
||||
<select id="cargo-zone-dest" name="cargo.zoneDest">
|
||||
<option value="normal" {{#if (eq cargo.zoneDest "normal")}}selected{{/if}}>Normale</option>
|
||||
<option value="amber" {{#if (eq cargo.zoneDest "amber")}}selected{{/if}}>Ambre</option>
|
||||
<option value="red" {{#if (eq cargo.zoneDest "red")}}selected{{/if}}>Rouge</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>{{!-- /.worlds-row --}}
|
||||
|
||||
<fieldset>
|
||||
<legend>Modificateurs des Voyageurs</legend>
|
||||
<div class="form-group-row">
|
||||
<div class="form-group">
|
||||
<label for="cargo-skill-effect">
|
||||
Effet du test <span class="hint">(Courtier / Sens de rue — Moy. 8+)</span>
|
||||
</label>
|
||||
{{modSelect "cargo-skill-effect" "cargo.skillEffect" cargo.skillEffect -3 5}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group-row">
|
||||
<div class="form-group">
|
||||
<label for="cargo-navy-rank">Rang Marine</label>
|
||||
{{modSelect "cargo-navy-rank" "cargo.navyRank" cargo.navyRank 0 6}}
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="cargo-scout-rank">Rang Éclaireurs</label>
|
||||
{{modSelect "cargo-scout-rank" "cargo.scoutRank" cargo.scoutRank 0 6}}
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="cargo-soc-mod">MD SOC</label>
|
||||
{{modSelect "cargo-soc-mod" "cargo.socMod" cargo.socMod -3 3}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group checkbox-group">
|
||||
<label>
|
||||
<input type="checkbox" name="cargo.armed" {{#if cargo.armed}}checked{{/if}}>
|
||||
Vaisseau armé (−1)
|
||||
</label>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<div class="form-footer">
|
||||
<button type="button" class="btn-calculate" data-action="calculate-cargo">
|
||||
<i class="fas fa-dice-d6"></i> Calculer la cargaison
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{!-- ══════════════════════════════════════════ --}}
|
||||
{{!-- Onglet 3 : Commerce spéculatif --}}
|
||||
{{!-- ══════════════════════════════════════════ --}}
|
||||
<div class="tab" data-tab="trade">
|
||||
<h3><i class="fas fa-balance-scale"></i> Commerce spéculatif</h3>
|
||||
|
||||
<div class="world-block world-block-full">
|
||||
<div class="world-block-title"><i class="fas fa-store"></i> Monde fournisseur</div>
|
||||
<div class="world-search-widget" data-uwp-target="trade.uwp" data-zone-target="trade.zone">
|
||||
<div class="world-search-row">
|
||||
<input type="text" class="world-search-input" placeholder="Rechercher le monde…" autocomplete="off">
|
||||
<button type="button" class="btn-world-search" title="Rechercher sur Traveller Map">
|
||||
<i class="fas fa-globe"></i> Chercher
|
||||
</button>
|
||||
</div>
|
||||
<ul class="world-search-results"></ul>
|
||||
</div>
|
||||
<div class="uwp-zone-row">
|
||||
<div class="form-group uwp-field">
|
||||
<label for="trade-uwp">UWP <span class="hint">(ex. A788899-C)</span></label>
|
||||
<input id="trade-uwp" name="trade.uwp" type="text" placeholder="A788899-C" value="{{trade.uwp}}">
|
||||
</div>
|
||||
<div class="form-group zone-field">
|
||||
<label for="trade-zone">Zone</label>
|
||||
<select id="trade-zone" name="trade.zone">
|
||||
<option value="normal" {{#if (eq trade.zone "normal")}}selected{{/if}}>Normale</option>
|
||||
<option value="amber" {{#if (eq trade.zone "amber")}}selected{{/if}}>Ambre</option>
|
||||
<option value="red" {{#if (eq trade.zone "red")}}selected{{/if}}>Rouge</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<fieldset>
|
||||
<legend>Modificateurs des Voyageurs</legend>
|
||||
<div class="form-group-row">
|
||||
<div class="form-group">
|
||||
<label for="trade-broker">Compétence Courtier</label>
|
||||
{{modSelect "trade-broker" "trade.brokerSkill" trade.brokerSkill 0 5}}
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="trade-attempts">Tentatives précédentes (ce mois)</label>
|
||||
{{modSelect "trade-attempts" "trade.previousAttempts" trade.previousAttempts 0 10}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group checkbox-group">
|
||||
<label>
|
||||
<input type="checkbox" name="trade.blackMarket" {{#if trade.blackMarket}}checked{{/if}}>
|
||||
Marché noir (marchandises illégales)
|
||||
</label>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<div class="form-footer">
|
||||
<button type="button" class="btn-calculate" data-action="find-goods">
|
||||
<i class="fas fa-search"></i> Trouver un fournisseur & marchandises
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{{!-- Zone de résultats inline (remplie par JS) --}}
|
||||
<div class="trade-goods-result" style="display:none;">
|
||||
<h4>Marchandises disponibles</h4>
|
||||
<div class="trade-goods-list"></div>
|
||||
<div class="form-footer">
|
||||
<button type="button" class="btn-calculate" data-action="calculate-buy-prices">
|
||||
<i class="fas fa-tag"></i> Calculer les prix d'achat
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
</form>
|
||||
216
templates/commerce-result.hbs
Normal file
216
templates/commerce-result.hbs
Normal file
@@ -0,0 +1,216 @@
|
||||
<div class="mgt2-commerce-result">
|
||||
|
||||
{{!-- En-tête --}}
|
||||
<div class="commerce-header">
|
||||
<h3>
|
||||
{{#if (eq type "passengers")}}
|
||||
<i class="fas fa-users"></i> Résultats – Passagers
|
||||
{{else if (eq type "cargo")}}
|
||||
<i class="fas fa-boxes"></i> Résultats – Cargaison
|
||||
{{else if (eq type "trade-goods")}}
|
||||
<i class="fas fa-search"></i> Marchandises disponibles
|
||||
{{else if (eq type "buy-prices")}}
|
||||
<i class="fas fa-tag"></i> Prix d'achat
|
||||
{{else if (eq type "sell-prices")}}
|
||||
<i class="fas fa-hand-holding-usd"></i> Prix de vente
|
||||
{{/if}}
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
{{!-- ══════════════════════════════════════ --}}
|
||||
{{!-- Passagers --}}
|
||||
{{!-- ══════════════════════════════════════ --}}
|
||||
{{#if (eq type "passengers")}}
|
||||
|
||||
<div class="commerce-section">
|
||||
<p class="route">
|
||||
<span class="route-uwp">{{dep.uwp}}</span>
|
||||
<i class="fas fa-arrow-right route-arrow"></i>
|
||||
<span class="route-uwp">{{dest.uwp}}</span>
|
||||
<span class="route-parsecs">{{parsecs}} parsec{{#if (gt parsecs 1)}}s{{/if}}</span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<table class="commerce-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="col-label">Catégorie</th>
|
||||
<th class="col-dice" data-tip="Résultat final (2D6 + MD). Le MD inclut : distance, zones, compétences, rang Social et niveau Intendant. Consulte la table p.238.">Total <i class="fas fa-info-circle tip-icon"></i></th>
|
||||
<th class="col-main" data-tip="Nombre de passagers disponibles pour embarquement sur cette route.">Passagers</th>
|
||||
<th class="col-main" data-tip="Prix du billet par passager selon la catégorie et la distance.">Tarif</th>
|
||||
<th class="col-revenue" data-tip="Revenu potentiel = Nombre de passagers × Tarif unitaire.">Revenu</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#each categories}}
|
||||
<tr class="{{#if count}}has-passengers{{/if}}">
|
||||
<td class="col-label">{{label}}</td>
|
||||
<td class="col-dice" title="2D6 ({{diceResult}}) + MD ({{#if (gte modifiers 0)}}+{{/if}}{{modifiers}}) = {{trafficTotal}}">{{trafficTotal}}</td>
|
||||
<td class="col-main"><strong>{{count}}</strong></td>
|
||||
<td class="col-main">{{formatCredits pricePerPax}}</td>
|
||||
<td class="col-revenue">{{formatCredits revenue}}</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="total-revenue-bar">
|
||||
<span>Revenu total potentiel</span>
|
||||
<strong>{{formatCredits totalRevenue}}</strong>
|
||||
</div>
|
||||
|
||||
{{/if}}
|
||||
|
||||
{{!-- ══════════════════════════════════════ --}}
|
||||
{{!-- Cargaison --}}
|
||||
{{!-- ══════════════════════════════════════ --}}
|
||||
{{#if (eq type "cargo")}}
|
||||
|
||||
<div class="commerce-section">
|
||||
<p class="route">
|
||||
<span class="route-uwp">{{dep.uwp}}</span>
|
||||
<i class="fas fa-arrow-right route-arrow"></i>
|
||||
<span class="route-uwp">{{dest.uwp}}</span>
|
||||
<span class="route-parsecs">{{parsecs}} parsec{{#if (gt parsecs 1)}}s{{/if}}</span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<table class="commerce-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="col-label">Type</th>
|
||||
<th class="col-dice" data-tip="Résultat final (2D6 + MD). Le MD inclut : distance, zones, rang Marine/Éclaireurs, SOC, vaisseau armé. Consulte la table p.240.">Total <i class="fas fa-info-circle tip-icon"></i></th>
|
||||
<th class="col-main" data-tip="Nombre de lots de cargaison disponibles.">Lots</th>
|
||||
<th class="col-main" data-tip="Tonnage par lot selon le type (Majeure : 10 t, Mineure : 5 t, Irrégulière : 1 t).">T/lot</th>
|
||||
<th class="col-main" data-tip="Tarif de fret par tonne selon la catégorie et la distance en parsecs.">Tarif/t</th>
|
||||
<th class="col-revenue" data-tip="Revenu potentiel = Lots × Tonnes/lot × Tarif/t.">Revenu</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#each lots}}
|
||||
<tr>
|
||||
<td class="col-label">{{label}}</td>
|
||||
<td class="col-dice" title="2D6 ({{diceResult}}) + MD ({{#if (gte modifiers 0)}}+{{/if}}{{modifiers}}) = {{trafficTotal}}">{{trafficTotal}}</td>
|
||||
<td class="col-main"><strong>{{count}}</strong></td>
|
||||
<td class="col-main">{{tonsPerLot}} t</td>
|
||||
<td class="col-main">{{formatCredits ratePerTon}}</td>
|
||||
<td class="col-revenue">{{formatCredits revenue}}</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="total-revenue-bar">
|
||||
<span>Sous-total cargaison</span>
|
||||
<strong>{{formatCredits cargoRevenue}}</strong>
|
||||
</div>
|
||||
</table>
|
||||
|
||||
<div class="commerce-section mail-section">
|
||||
<i class="fas fa-envelope"></i>
|
||||
<strong>Courrier :</strong>
|
||||
{{#if mail.available}}
|
||||
<span class="mail-available">
|
||||
{{mail.count}} conteneur{{#if (gt mail.count 1)}}s{{/if}}
|
||||
× 25 000 Cr = <strong>{{formatCredits mail.revenue}}</strong>
|
||||
</span>
|
||||
{{else}}
|
||||
<span class="mail-none">Aucun courrier disponible</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
<div class="total-revenue-bar">
|
||||
<span>Revenu total potentiel</span>
|
||||
<strong>{{formatCredits totalRevenue}}</strong>
|
||||
</div>
|
||||
|
||||
{{/if}}
|
||||
|
||||
{{!-- ══════════════════════════════════════ --}}
|
||||
{{!-- Marchandises disponibles (trade-goods) --}}
|
||||
{{!-- ══════════════════════════════════════ --}}
|
||||
{{#if (eq type "trade-goods")}}
|
||||
|
||||
<div class="commerce-section">
|
||||
<p>
|
||||
<strong>Monde :</strong> <span class="route-uwp">{{world.uwp}}</span>
|
||||
|
|
||||
<strong>Codes :</strong>
|
||||
{{#if world.tradeCodes.length}}
|
||||
<span class="trade-codes">{{join world.tradeCodes " "}}</span>
|
||||
{{else}}
|
||||
<em>Aucun</em>
|
||||
{{/if}}
|
||||
</p>
|
||||
{{#if supplierRoll}}
|
||||
<p class="supplier-roll">
|
||||
<i class="fas fa-dice"></i>
|
||||
<strong>Recherche fournisseur :</strong>
|
||||
<span class="dice-detail">{{supplierRoll.dice}} + {{supplierRoll.mod}}</span>
|
||||
= <strong class="dice-total">{{supplierRoll.total}}</strong>
|
||||
</p>
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
{{#if goods.length}}
|
||||
<table class="commerce-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="col-d66" data-tip="Code de table D66 : lancer 2D6, lire le 1er dé comme dizaine et le 2e comme unité (ex : 3 et 2 → 32). Résultat entre 11 et 66.">D66</th>
|
||||
<th class="col-label">Marchandise</th>
|
||||
<th class="col-main" data-tip="Quantité disponible chez ce fournisseur. Résultat d'un jet de dés × multiplicateur de la table.">Dispo</th>
|
||||
<th class="col-main" data-tip="Prix de référence par tonne selon la table des marchandises (p.244). Le prix réel est calculé lors de l'achat.">Prix base/t</th>
|
||||
<th class="col-mod" data-tip="Modificateur de Dé à l'achat. S'ajoute au jet 3D : positif = prix réduit (moins cher), négatif = prix augmenté (plus cher).">MD achat <i class="fas fa-info-circle tip-icon"></i></th>
|
||||
<th class="col-mod" data-tip="Modificateur de Dé à la vente. S'ajoute au jet 3D : positif = prix augmenté (plus cher), négatif = prix réduit (moins cher).">MD vente <i class="fas fa-info-circle tip-icon"></i></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#each goods}}
|
||||
<tr {{#if illegal}}class="illegal-good"{{/if}}>
|
||||
<td class="col-d66">{{d66}}</td>
|
||||
<td class="col-label">{{name}}{{#if illegal}} <i class="fas fa-skull" title="Marchandise illégale — marché noir uniquement"></i>{{/if}}</td>
|
||||
<td class="col-main">{{tons}} t</td>
|
||||
<td class="col-main">{{formatCredits basePrice}}</td>
|
||||
<td class="col-mod {{modClass buyMod}}">{{#if (gt buyMod 0)}}+{{/if}}{{buyMod}}</td>
|
||||
<td class="col-mod {{modClass sellMod}}">{{#if (gt sellMod 0)}}+{{/if}}{{sellMod}}</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
</tbody>
|
||||
</table>
|
||||
{{else}}
|
||||
<p class="no-goods"><em>Aucune marchandise disponible sur ce monde.</em></p>
|
||||
{{/if}}
|
||||
|
||||
{{/if}}
|
||||
|
||||
{{!-- ══════════════════════════════════════ --}}
|
||||
{{!-- Prix d'achat / vente --}}
|
||||
{{!-- ══════════════════════════════════════ --}}
|
||||
{{#if (eq type "buy-prices")}}
|
||||
<table class="commerce-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="col-label">Marchandise</th>
|
||||
<th class="col-main" data-tip="Tonnage acheté.">Tonnes</th>
|
||||
<th class="col-dice" data-tip="Résultat final (3D6 + MD). Le MD inclut les codes commerciaux du monde et la compétence Courtier. Consulte la table des prix p.246.">Total <i class="fas fa-info-circle tip-icon"></i></th>
|
||||
<th class="col-mod" data-tip="Pourcentage du prix de base appliqué au calcul du prix d'achat réel (ex : 80% = 20% de réduction).">% <i class="fas fa-info-circle tip-icon"></i></th>
|
||||
<th class="col-revenue" data-tip="Coût total pour toutes les tonnes = Prix de base × % × Tonnes.">Coût total</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#each prices}}
|
||||
<tr>
|
||||
<td class="col-label" title="Base : {{formatCredits basePrice}}/t — Prix/t : {{formatCredits actualPrice}}">{{name}}</td>
|
||||
<td class="col-main">{{tons}} t</td>
|
||||
<td class="col-dice {{modClass modifier}}" title="3D6 ({{diceResult}}) + MD ({{#if (gte modifier 0)}}+{{/if}}{{modifier}}) = {{total}}">{{total}}</td>
|
||||
<td class="col-mod">{{percent}}%</td>
|
||||
<td class="col-revenue"><strong>{{formatCredits totalCost}}</strong></td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="total-revenue-bar">
|
||||
<span>Coût d'achat total</span>
|
||||
<strong>{{formatCredits grandTotal}}</strong>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
</div>
|
||||
124
templates/npc-dialog.hbs
Normal file
124
templates/npc-dialog.hbs
Normal file
@@ -0,0 +1,124 @@
|
||||
<form class="mgt2-npc-form">
|
||||
|
||||
<nav class="tabs" data-group="primary">
|
||||
<a class="item active" data-tab="npc">
|
||||
<i class="fas fa-user"></i> PNJ rapide
|
||||
</a>
|
||||
<a class="item" data-tab="encounter">
|
||||
<i class="fas fa-random"></i> Rencontre
|
||||
</a>
|
||||
<a class="item" data-tab="mission">
|
||||
<i class="fas fa-briefcase"></i> Client & mission
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
<section class="tab-content">
|
||||
<div class="tab active" data-tab="npc">
|
||||
<h3><i class="fas fa-user"></i> Générateur de PNJ rapide</h3>
|
||||
<p class="npc-intro">Génère un rôle, une particularité et un niveau d’expérience jouable en quelques secondes.</p>
|
||||
|
||||
<fieldset>
|
||||
<legend>Cadre du PNJ</legend>
|
||||
<div class="form-group-row">
|
||||
<div class="form-group">
|
||||
<label for="npc-relation">Relation aux Voyageurs</label>
|
||||
<select id="npc-relation" name="npc.relation">
|
||||
{{#each relations}}
|
||||
<option value="{{key}}" {{#if (eq ../npc.relation key)}}selected{{/if}}>{{label}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="npc-experience-bias">Type d’expérience</label>
|
||||
<select id="npc-experience-bias" name="npc.experienceBias">
|
||||
<option value="random" {{#if (eq npc.experienceBias "random")}}selected{{/if}}>Aléatoire</option>
|
||||
<option value="noncombatant" {{#if (eq npc.experienceBias "noncombatant")}}selected{{/if}}>Non-combattant</option>
|
||||
<option value="combatant" {{#if (eq npc.experienceBias "combatant")}}selected{{/if}}>Combattant</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>Création de fiche</legend>
|
||||
<div class="form-group checkbox-group">
|
||||
<label>
|
||||
<input type="checkbox" name="npc.createActor" {{#if npc.createActor}}checked{{/if}}>
|
||||
Créer aussi une fiche PNJ dans les Acteurs
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-group-row">
|
||||
<div class="form-group">
|
||||
<label for="npc-actor-name">Nom de la fiche <span class="hint">(facultatif)</span></label>
|
||||
<input id="npc-actor-name" name="npc.actorName" type="text" value="{{npc.actorName}}" placeholder="PNJ — Médecin">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group checkbox-group">
|
||||
<label>
|
||||
<input type="checkbox" name="npc.openCreatedActor" {{#if npc.openCreatedActor}}checked{{/if}}>
|
||||
Ouvrir automatiquement la fiche créée
|
||||
</label>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<div class="form-footer">
|
||||
<button type="button" class="btn-calculate" data-action="generate-npc">
|
||||
<i class="fas fa-dice-d6"></i> Générer le PNJ
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tab" data-tab="encounter">
|
||||
<h3><i class="fas fa-random"></i> Rencontre aléatoire</h3>
|
||||
<p class="npc-intro">Utilise les tables d’astroport, de campagne ou d’environnement urbain.</p>
|
||||
|
||||
<fieldset>
|
||||
<legend>Contexte</legend>
|
||||
<div class="form-group-row">
|
||||
<div class="form-group">
|
||||
<label for="encounter-context">Lieu de la rencontre</label>
|
||||
<select id="encounter-context" name="encounter.context">
|
||||
<option value="starport" {{#if (eq encounter.context "starport")}}selected{{/if}}>Astroport</option>
|
||||
<option value="rural" {{#if (eq encounter.context "rural")}}selected{{/if}}>Rural</option>
|
||||
<option value="urban" {{#if (eq encounter.context "urban")}}selected{{/if}}>Urbain</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group checkbox-group">
|
||||
<label>
|
||||
<input type="checkbox" name="encounter.includeFollowUp" {{#if encounter.includeFollowUp}}checked{{/if}}>
|
||||
Ajouter automatiquement les détails liés si la table appelle un client ou un PNJ
|
||||
</label>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<div class="form-footer">
|
||||
<button type="button" class="btn-calculate" data-action="generate-encounter">
|
||||
<i class="fas fa-dice-d6"></i> Générer la rencontre
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tab" data-tab="mission">
|
||||
<h3><i class="fas fa-briefcase"></i> Client & mission</h3>
|
||||
<p class="npc-intro">Tire un client, une mission, une cible et une opposition pour lancer une intrigue.</p>
|
||||
|
||||
<fieldset>
|
||||
<legend>Sortie générée</legend>
|
||||
<div class="npc-checklist">
|
||||
<div><i class="fas fa-check"></i> Client aléatoire (D66)</div>
|
||||
<div><i class="fas fa-check"></i> Mission aléatoire (D66)</div>
|
||||
<div><i class="fas fa-check"></i> Cible (D66)</div>
|
||||
<div><i class="fas fa-check"></i> Opposition / complication (D66)</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<div class="form-footer">
|
||||
<button type="button" class="btn-calculate" data-action="generate-mission">
|
||||
<i class="fas fa-dice-d6"></i> Générer le contrat
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</form>
|
||||
115
templates/npc-result.hbs
Normal file
115
templates/npc-result.hbs
Normal file
@@ -0,0 +1,115 @@
|
||||
<div class="mgt2-npc-result">
|
||||
|
||||
<div class="npc-header">
|
||||
<h3>
|
||||
{{#if (eq type "npc")}}
|
||||
<i class="fas fa-user"></i> PNJ rapide
|
||||
{{else if (eq type "encounter")}}
|
||||
<i class="fas fa-random"></i> Rencontre aléatoire
|
||||
{{else if (eq type "client-mission")}}
|
||||
<i class="fas fa-briefcase"></i> Client & mission
|
||||
{{/if}}
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
{{#if (eq type "npc")}}
|
||||
<div class="npc-pill-row">
|
||||
<span class="npc-pill">{{relation.label}}</span>
|
||||
<span class="npc-pill npc-pill-muted">{{experience.profile.label}}</span>
|
||||
</div>
|
||||
|
||||
<div class="npc-card-grid">
|
||||
<div class="npc-card-block">
|
||||
<div class="npc-card-title">Profession / rôle</div>
|
||||
<div class="npc-roll-line">D66 {{role.total}}</div>
|
||||
<div class="npc-card-value">{{role.entry.text}}</div>
|
||||
</div>
|
||||
<div class="npc-card-block">
|
||||
<div class="npc-card-title">Particularité</div>
|
||||
<div class="npc-roll-line">D66 {{quirk.total}}</div>
|
||||
<div class="npc-card-value">{{quirk.entry.text}}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="npc-section">
|
||||
<div class="npc-section-title">Résumé jouable</div>
|
||||
<p><strong>Relation :</strong> {{relation.summary}}</p>
|
||||
<p><strong>Compétences-types :</strong> {{join experience.profile.skills ", "}}</p>
|
||||
<p><strong>Niveau moyen de compétence :</strong> {{experience.profile.skillLevel}}</p>
|
||||
<p><strong>Bonus de caractéristiques :</strong>
|
||||
{{#if experience.profile.characteristicBonuses.length}}
|
||||
{{join experience.profile.characteristicBonuses ", "}}
|
||||
{{else}}
|
||||
Aucun
|
||||
{{/if}}
|
||||
</p>
|
||||
{{#if createdActor}}
|
||||
<p><strong>Fiche créée :</strong> {{createdActor.name}}</p>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if (eq type "client-mission")}}
|
||||
<div class="npc-card-grid">
|
||||
<div class="npc-card-block">
|
||||
<div class="npc-card-title">Client</div>
|
||||
<div class="npc-roll-line">D66 {{client.total}}</div>
|
||||
<div class="npc-card-value">{{client.entry.text}}</div>
|
||||
</div>
|
||||
<div class="npc-card-block">
|
||||
<div class="npc-card-title">Mission</div>
|
||||
<div class="npc-roll-line">D66 {{mission.total}}</div>
|
||||
<div class="npc-card-value">{{mission.entry.text}}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table class="npc-table">
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Cible</th>
|
||||
<td>
|
||||
<strong>D66 {{target.total}}</strong> — {{target.entry.text}}
|
||||
{{#if targetResolution}}
|
||||
<div class="npc-subline">{{targetResolution.label}} : {{targetResolution.text}}</div>
|
||||
{{/if}}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Opposition</th>
|
||||
<td><strong>D66 {{opposition.total}}</strong> — {{opposition.entry.text}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<div class="npc-note">
|
||||
<strong>Rémunération :</strong> {{rewardGuidance}}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if (eq type "encounter")}}
|
||||
<div class="npc-pill-row">
|
||||
<span class="npc-pill">{{context.label}}</span>
|
||||
<span class="npc-pill npc-pill-muted">D66 {{encounter.total}}</span>
|
||||
</div>
|
||||
|
||||
<div class="npc-highlight">
|
||||
{{encounter.entry.text}}
|
||||
</div>
|
||||
|
||||
{{#if followUp}}
|
||||
<div class="npc-section">
|
||||
<div class="npc-section-title">Détail généré automatiquement</div>
|
||||
|
||||
{{#if (eq followUp.type "client-mission")}}
|
||||
<p><strong>Client :</strong> {{followUp.client.entry.text}} <span class="npc-inline-roll">(D66 {{followUp.client.total}})</span></p>
|
||||
<p><strong>Mission :</strong> {{followUp.mission.entry.text}} <span class="npc-inline-roll">(D66 {{followUp.mission.total}})</span></p>
|
||||
<p><strong>Cible :</strong> {{followUp.target.entry.text}} <span class="npc-inline-roll">(D66 {{followUp.target.total}})</span></p>
|
||||
{{else if (eq followUp.type "npc")}}
|
||||
<p><strong>PNJ :</strong> {{followUp.role.entry.text}} <span class="npc-inline-roll">(D66 {{followUp.role.total}})</span></p>
|
||||
<p><strong>Particularité :</strong> {{followUp.quirk.entry.text}} <span class="npc-inline-roll">(D66 {{followUp.quirk.total}})</span></p>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
||||
</div>
|
||||
Reference in New Issue
Block a user