feat: fiche véhicule (caractéristiques) et capacités de totem de groupe
Release Creation / build (release) Failing after 1m24s
Release Creation / build (release) Failing after 1m24s
- véhicule : fiabilité 1-10, type véhicule/monture, distance, vitesse (croisière/pointe), entretien, réserve d'effort - nettoyage du tableau d'entretien à la soumission - fiche de groupe : section capacités de totem (création type totem + liste)
This commit is contained in:
@@ -11,7 +11,8 @@ export default class VermineGroupSheetV2 extends VermineBaseActorSheet {
|
|||||||
deleteMember: VermineGroupSheetV2.#onDeleteMember,
|
deleteMember: VermineGroupSheetV2.#onDeleteMember,
|
||||||
deleteEncounter: VermineGroupSheetV2.#onDeleteEncounter,
|
deleteEncounter: VermineGroupSheetV2.#onDeleteEncounter,
|
||||||
deleteObjective: VermineGroupSheetV2.#onDeleteObjective,
|
deleteObjective: VermineGroupSheetV2.#onDeleteObjective,
|
||||||
addObjective: VermineGroupSheetV2.#onAddObjective
|
addObjective: VermineGroupSheetV2.#onAddObjective,
|
||||||
|
createTotemAbility: VermineGroupSheetV2.#onCreateTotemAbility
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,7 +68,8 @@ export default class VermineGroupSheetV2 extends VermineBaseActorSheet {
|
|||||||
case "main": break
|
case "main": break
|
||||||
case "info":
|
case "info":
|
||||||
context.tab = context.tabs.info
|
context.tab = context.tabs.info
|
||||||
context.abilities = doc.itemTypes.ability
|
context.abilities = doc.itemTypes.ability.filter(i => i.system.type !== "totem")
|
||||||
|
context.totem_abilities = doc.itemTypes.ability.filter(i => i.system.type === "totem")
|
||||||
context.specialties = doc.itemTypes.specialty
|
context.specialties = doc.itemTypes.specialty
|
||||||
context.backgrounds = doc.itemTypes.background
|
context.backgrounds = doc.itemTypes.background
|
||||||
context.traumas = doc.itemTypes.trauma
|
context.traumas = doc.itemTypes.trauma
|
||||||
@@ -135,4 +137,9 @@ export default class VermineGroupSheetV2 extends VermineBaseActorSheet {
|
|||||||
objectives[type].push("")
|
objectives[type].push("")
|
||||||
this.document.update({ "system.objectives": objectives })
|
this.document.update({ "system.objectives": objectives })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async #onCreateTotemAbility(event, target) {
|
||||||
|
const name = game.i18n.localize("ITEMS.new_ability")
|
||||||
|
await this.document.createEmbeddedDocuments("Item", [{ name, type: "ability", system: { type: "totem" } }])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,28 @@ export class VermineDefenseSheetV2 extends VermineBaseItemSheet {
|
|||||||
export class VermineVehicleSheetV2 extends VermineBaseItemSheet {
|
export class VermineVehicleSheetV2 extends VermineBaseItemSheet {
|
||||||
static DEFAULT_OPTIONS = { classes: ["vehicle"], position: { width: 520 } }
|
static DEFAULT_OPTIONS = { classes: ["vehicle"], position: { width: 520 } }
|
||||||
static PARTS = { main: { template: "systems/vermine2047/templates/item/item-vehicle-sheet.hbs", scrollable: [""] } }
|
static PARTS = { main: { template: "systems/vermine2047/templates/item/item-vehicle-sheet.hbs", scrollable: [""] } }
|
||||||
|
|
||||||
|
async _prepareContext() {
|
||||||
|
const context = await super._prepareContext()
|
||||||
|
// Compétences d'Entretien possibles (mécanique, technologie, artisanat, animalisme…)
|
||||||
|
const maintenanceKeys = ["mecanical", "technology", "crafting", "animalism", "environment", "wildlife", "flora", "repulsion", "toxics"]
|
||||||
|
const current = this.document.system.maintenance || []
|
||||||
|
context.maintenanceSkills = maintenanceKeys.map(key => ({
|
||||||
|
key,
|
||||||
|
label: game.i18n.localize("SKILLS." + key + ".name"),
|
||||||
|
checked: current.includes(key)
|
||||||
|
}))
|
||||||
|
return context
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @override - nettoie le tableau d'Entretien (retire les cases non cochées). */
|
||||||
|
_prepareSubmitData(event, form, formData, updateData) {
|
||||||
|
const result = super._prepareSubmitData(event, form, formData, updateData)
|
||||||
|
if (Array.isArray(result?.system?.maintenance)) {
|
||||||
|
result.system.maintenance = result.system.maintenance.filter(v => typeof v === "string" && v.trim() !== "")
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── Capacité ──────────────────────────────────────────────────────────
|
// ── Capacité ──────────────────────────────────────────────────────────
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
import { baseItemSchema } from "./_shared.mjs"
|
import { baseItemSchema } from "./_shared.mjs"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DataModel pour les items de type "vehicle" (véhicules).
|
* DataModel pour les items de type "vehicle" (véhicules et montures).
|
||||||
|
* Caractéristiques : Rareté, Fiabilité, Distance, Vitesse (croisière/pointe),
|
||||||
|
* Entretien (compétences) et Réserve d'Effort (montures).
|
||||||
* @augments {foundry.abstract.TypeDataModel}
|
* @augments {foundry.abstract.TypeDataModel}
|
||||||
*/
|
*/
|
||||||
export default class VermineVehicleData extends foundry.abstract.TypeDataModel {
|
export default class VermineVehicleData extends foundry.abstract.TypeDataModel {
|
||||||
@@ -14,6 +16,27 @@ export default class VermineVehicleData extends foundry.abstract.TypeDataModel {
|
|||||||
const reqInt = { required: true, nullable: false, integer: true }
|
const reqInt = { required: true, nullable: false, integer: true }
|
||||||
return {
|
return {
|
||||||
...baseItemSchema(),
|
...baseItemSchema(),
|
||||||
|
// Fiabilité étendue (1-10) pour les véhicules
|
||||||
|
reliability: new fields.NumberField({ ...reqInt, initial: 5, min: 1, max: 10 }),
|
||||||
|
// Type : "vehicle" (véhicule) ou "mount" (monture)
|
||||||
|
kind: new fields.StringField({ required: true, nullable: false, initial: "vehicle" }),
|
||||||
|
// Distance : km parcourus avec un "plein"
|
||||||
|
distance: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }),
|
||||||
|
// Vitesse : croisière / pointe (durée de la pointe)
|
||||||
|
speed: new fields.SchemaField({
|
||||||
|
cruise: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }),
|
||||||
|
top: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }),
|
||||||
|
topDuration: new fields.StringField({ required: true, nullable: false, initial: "10 min" })
|
||||||
|
}),
|
||||||
|
// Entretien : compétences nécessaires (clés de CONFIG.VERMINE.skills)
|
||||||
|
maintenance: new fields.ArrayField(new fields.StringField({ required: true, nullable: false, initial: "" })),
|
||||||
|
// Réserve d'Effort (montures)
|
||||||
|
effortReserve: new fields.SchemaField({
|
||||||
|
value: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }),
|
||||||
|
min: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }),
|
||||||
|
max: new fields.NumberField({ ...reqInt, initial: 0, min: 0 })
|
||||||
|
}),
|
||||||
|
// Mobilité (héritée)
|
||||||
mobility: new fields.NumberField({ ...reqInt, initial: 3, min: 0 })
|
mobility: new fields.NumberField({ ...reqInt, initial: 3, min: 0 })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
</h4>
|
</h4>
|
||||||
<ol class="list-item">
|
<ol class="list-item">
|
||||||
{{#each abilities as |item id|}}
|
{{#each abilities as |item id|}}
|
||||||
{{#if (ne item.type 'totem')}}
|
{{#if (ne item.system.type 'totem')}}
|
||||||
<li class="item flexrow" data-item-id="{{item._id}}">
|
<li class="item flexrow" data-item-id="{{item._id}}">
|
||||||
<div class="item-name" style="flex:4;">
|
<div class="item-name" style="flex:4;">
|
||||||
<a class="item-control item-edit" data-action="edit" data-item-id="{{item._id}}" title="{{ localize 'UI.effect_edit' }}">{{item.name}}</a>
|
<a class="item-control item-edit" data-action="edit" data-item-id="{{item._id}}" title="{{ localize 'UI.effect_edit' }}">{{item.name}}</a>
|
||||||
@@ -60,6 +60,32 @@
|
|||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{{!-- Group Totem Abilities --}}
|
||||||
|
<div class="grid-span-2">
|
||||||
|
<h4>
|
||||||
|
<span>{{ localize 'VERMINE.totem_abilities' }}</span>
|
||||||
|
{{#if isEditMode}}
|
||||||
|
<a class="item-control item-create" data-action="createTotemAbility" title="{{ localize 'ITEMS.new_ability' }}"><i class="fas fa-plus"></i></a>
|
||||||
|
{{/if}}
|
||||||
|
</h4>
|
||||||
|
<ol class="list-item">
|
||||||
|
{{#each totem_abilities as |item id|}}
|
||||||
|
<li class="item flexrow" data-item-id="{{item._id}}">
|
||||||
|
<div class="item-name" style="flex:4;">
|
||||||
|
<a class="item-control item-edit" data-action="edit" data-item-id="{{item._id}}" title="{{ localize 'UI.effect_edit' }}">{{item.name}}</a>
|
||||||
|
<span class="hexa" title="{{ localize 'VERMINE.level' }}">{{item.system.level.value}}</span>
|
||||||
|
<span title="{{ localize 'VERMINE.learning' }}">{{item.system.learn.threshold}}/{{item.system.learn.hindrance}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls flexrow">
|
||||||
|
{{#if @root.isEditMode}}
|
||||||
|
<a class="item-control item-delete" data-action="delete" data-item-id="{{item._id}}" title="{{ localize 'UI.effect_delete' }}"><i class="fas fa-trash"></i></a>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{{/each}}
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
|
|
||||||
{{!-- Specialties --}}
|
{{!-- Specialties --}}
|
||||||
<div>
|
<div>
|
||||||
<h4>
|
<h4>
|
||||||
|
|||||||
@@ -1,23 +1,64 @@
|
|||||||
<div class="{{cssClass}}">
|
<div class="{{cssClass}}">
|
||||||
{{> "systems/vermine2047/templates/item/partials/header.hbs"}}
|
{{> "systems/vermine2047/templates/item/partials/header.hbs"}}
|
||||||
|
|
||||||
|
<section class="sheet-body">
|
||||||
|
{{> "systems/vermine2047/templates/item/partials/traits.hbs"}}
|
||||||
|
|
||||||
<section class="sheet-body">
|
<section class="vehicle-fields">
|
||||||
{{> "systems/vermine2047/templates/item/partials/traits.hbs"}}
|
<h3>{{ localize "VERMINE.vehicle_specs" }}</h3>
|
||||||
|
|
||||||
|
<div class="flexrow">
|
||||||
|
<div class="resource align-center flexcol">
|
||||||
|
<label class="resource-label">{{ localize "VERMINE.kind" }}</label>
|
||||||
|
<select name="system.kind" data-dtype="String">
|
||||||
|
<option value="vehicle" {{#ife system.kind "vehicle"}}selected{{/ife}}>{{ localize "VERMINE.kind_vehicle" }}</option>
|
||||||
|
<option value="mount" {{#ife system.kind "mount"}}selected{{/ife}}>{{ localize "VERMINE.kind_mount" }}</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="resource align-center flexcol">
|
||||||
|
<label class="resource-label">{{ localize "VERMINE.distance" }}</label>
|
||||||
|
<div class="hexa"><input type="number" name="system.distance" value="{{system.distance}}" data-dtype="Number" /></div>
|
||||||
|
<span class="unit">km</span>
|
||||||
|
</div>
|
||||||
|
<div class="resource align-center flexcol">
|
||||||
|
<label class="resource-label">{{ localize "VERMINE.speed" }}</label>
|
||||||
|
<div class="flexrow align-center">
|
||||||
|
<input type="number" name="system.speed.cruise" value="{{system.speed.cruise}}" data-dtype="Number" />
|
||||||
|
<span>/</span>
|
||||||
|
<input type="number" name="system.speed.top" value="{{system.speed.top}}" data-dtype="Number" />
|
||||||
|
</div>
|
||||||
|
<input type="text" name="system.speed.topDuration" value="{{system.speed.topDuration}}" placeholder="{{ localize 'VERMINE.speed_duration_ph' }}" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="flexrow">
|
<div class="flexrow">
|
||||||
<div class="resource flexrow align-center">
|
<div class="resource align-center flexcol">
|
||||||
<label class="resource-label">{{ localize "VERMINE.mobility"}}</label>
|
<label class="resource-label">{{ localize "VERMINE.effort_reserve" }}</label>
|
||||||
<div class="hexa">
|
<div class="flexrow align-center">
|
||||||
<input type="number" name="system.mobility" value="{{system.mobility}}" data-dtype="Number"/>
|
<div class="hexa"><input type="number" name="system.effortReserve.value" value="{{system.effortReserve.value}}" data-dtype="Number" /></div>
|
||||||
</div>
|
<span>/</span>
|
||||||
</div>
|
<div class="hexa"><input type="number" name="system.effortReserve.max" value="{{system.effortReserve.max}}" data-dtype="Number" /></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="resource align-center flexcol">
|
||||||
|
<label class="resource-label">{{ localize "VERMINE.mobility" }}</label>
|
||||||
|
<div class="hexa"><input type="number" name="system.mobility" value="{{system.mobility}}" data-dtype="Number" /></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="maintenance">
|
||||||
|
<label class="resource-label">{{ localize "VERMINE.maintenance" }}</label>
|
||||||
|
<div class="flexrow flex-wrap">
|
||||||
|
{{#each maintenanceSkills}}
|
||||||
|
<label class="flexrow align-center">
|
||||||
|
<input type="checkbox" name="system.maintenance" value="{{ this.key }}" {{#if this.checked}}checked{{/if}} />
|
||||||
|
<span>{{ this.label }}</span>
|
||||||
|
</label>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
</div>
|
{{> "systems/vermine2047/templates/item/partials/physicalItems.hbs"}}
|
||||||
{{> "systems/vermine2047/templates/item/partials/physicalItems.hbs"}}
|
</section>
|
||||||
|
|
||||||
|
|
||||||
</section>
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user