DIvers rework de CSS/LESS et améliorations de messages/layout
This commit is contained in:
+805
-132
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
+4
-1
@@ -40,7 +40,9 @@
|
|||||||
"derivedOverview": "Synthèse",
|
"derivedOverview": "Synthèse",
|
||||||
"embeddedItems": "Objets embarqués",
|
"embeddedItems": "Objets embarqués",
|
||||||
"sourceData": "Données source",
|
"sourceData": "Données source",
|
||||||
"readOnlyCollection": "Cette liste est fournie par les données de référence du système."
|
"readOnlyCollection": "Cette liste est fournie par les données de référence du système.",
|
||||||
|
"edit": "Modifier",
|
||||||
|
"delete": "Retirer"
|
||||||
},
|
},
|
||||||
"rolls": {
|
"rolls": {
|
||||||
"roll": "Lancer",
|
"roll": "Lancer",
|
||||||
@@ -71,6 +73,7 @@
|
|||||||
"noDebt": "Aucune dette",
|
"noDebt": "Aucune dette",
|
||||||
"debtGain": "+1 dette de {type}",
|
"debtGain": "+1 dette de {type}",
|
||||||
"notEnoughResource": "{actor} n'a pas assez de {resource}.",
|
"notEnoughResource": "{actor} n'a pas assez de {resource}.",
|
||||||
|
"notEnoughResourceDetailed": "{actor} n'a pas assez de {resource} ({required} requis, {available} disponible(s)).",
|
||||||
"exploded": "12 explosif",
|
"exploded": "12 explosif",
|
||||||
"naturalOne": "1 naturel : échec automatique.",
|
"naturalOne": "1 naturel : échec automatique.",
|
||||||
"initiativeHint": "L'initiative utilise Rapidité / 0 puis arrondit le résultat final à la moitié supérieure, avec un plafond à 12.",
|
"initiativeHint": "L'initiative utilise Rapidité / 0 puis arrondit le résultat final à la moitié supérieure, avec un plafond à 12.",
|
||||||
|
|||||||
+935
-130
File diff suppressed because it is too large
Load Diff
@@ -3,7 +3,7 @@ import LesOubliesItemSheet from "./base-item-sheet.mjs"
|
|||||||
export default class LesOubliesArmeSheet extends LesOubliesItemSheet {
|
export default class LesOubliesArmeSheet extends LesOubliesItemSheet {
|
||||||
static PARTS = {
|
static PARTS = {
|
||||||
sheet: {
|
sheet: {
|
||||||
template: "systems/fvtt-les-oublies/templates/item-arme-sheet.hbs",
|
template: "systems/fvtt-les-oublies/templates/item-arme-sheet-v2.hbs",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,9 +32,11 @@ export default class LesOubliesActorSheet extends HandlebarsApplicationMixin(fou
|
|||||||
rollSkill: LesOubliesActorSheet.#onRollSkill,
|
rollSkill: LesOubliesActorSheet.#onRollSkill,
|
||||||
useWeapon: LesOubliesActorSheet.#onUseWeapon,
|
useWeapon: LesOubliesActorSheet.#onUseWeapon,
|
||||||
resolveWeaponDamage: LesOubliesActorSheet.#onResolveWeaponDamage,
|
resolveWeaponDamage: LesOubliesActorSheet.#onResolveWeaponDamage,
|
||||||
|
toggleEquipped: LesOubliesActorSheet.#onToggleEquipped,
|
||||||
useSpell: LesOubliesActorSheet.#onUseSpell,
|
useSpell: LesOubliesActorSheet.#onUseSpell,
|
||||||
openCombatPreset: LesOubliesActorSheet.#onOpenCombatPreset,
|
openCombatPreset: LesOubliesActorSheet.#onOpenCombatPreset,
|
||||||
openThreadHarvest: LesOubliesActorSheet.#onOpenThreadHarvest,
|
openThreadHarvest: LesOubliesActorSheet.#onOpenThreadHarvest,
|
||||||
|
openLinkedActor: LesOubliesActorSheet.#onOpenLinkedActor,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,6 +51,14 @@ export default class LesOubliesActorSheet extends HandlebarsApplicationMixin(fou
|
|||||||
}
|
}
|
||||||
|
|
||||||
async _prepareContext() {
|
async _prepareContext() {
|
||||||
|
const config = CONFIG.LESOUBLIES
|
||||||
|
const enriched = await LesOubliesUtility.prepareEnrichedHtml("Actor", this.document.type, this.document.system)
|
||||||
|
const choiceSets = {
|
||||||
|
profileOptions: config.profiles.map((profile) => ({ value: profile.id, label: profile.label })),
|
||||||
|
personnageSizeOptions: LesOubliesUtility.createRangeChoices(1, 4, config.sizes),
|
||||||
|
creatureSizeOptions: LesOubliesUtility.createRangeChoices(1, 8, config.sizes),
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
actor: this.document,
|
actor: this.document,
|
||||||
system: this.document.system,
|
system: this.document.system,
|
||||||
@@ -59,8 +69,10 @@ export default class LesOubliesActorSheet extends HandlebarsApplicationMixin(fou
|
|||||||
isEditMode: this.isEditMode,
|
isEditMode: this.isEditMode,
|
||||||
isPlayMode: this.isPlayMode,
|
isPlayMode: this.isPlayMode,
|
||||||
isGM: game.user.isGM,
|
isGM: game.user.isGM,
|
||||||
config: CONFIG.LESOUBLIES,
|
config,
|
||||||
enrichedDescription: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.biodata?.description ?? this.document.system.description ?? "", { async: true }),
|
choiceSets,
|
||||||
|
enriched,
|
||||||
|
enrichedDescription: foundry.utils.getProperty(enriched, "biodata.description") ?? foundry.utils.getProperty(enriched, "description") ?? "",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,6 +111,7 @@ export default class LesOubliesActorSheet extends HandlebarsApplicationMixin(fou
|
|||||||
static async #onEditImage(event, target) {
|
static async #onEditImage(event, target) {
|
||||||
const attr = target.dataset.edit
|
const attr = target.dataset.edit
|
||||||
const current = foundry.utils.getProperty(this.document, attr)
|
const current = foundry.utils.getProperty(this.document, attr)
|
||||||
|
const FilePicker = foundry.applications.apps.FilePicker.implementation
|
||||||
const fp = new FilePicker({
|
const fp = new FilePicker({
|
||||||
current,
|
current,
|
||||||
type: "image",
|
type: "image",
|
||||||
@@ -113,11 +126,17 @@ export default class LesOubliesActorSheet extends HandlebarsApplicationMixin(fou
|
|||||||
const type = target.dataset.type
|
const type = target.dataset.type
|
||||||
if (!type) return
|
if (!type) return
|
||||||
const label = game.i18n.localize(`TYPES.Item.${type}`)
|
const label = game.i18n.localize(`TYPES.Item.${type}`)
|
||||||
return this.document.createEmbeddedDocuments("Item", [{
|
const itemData = {
|
||||||
name: label,
|
name: label,
|
||||||
type,
|
type,
|
||||||
img: LesOubliesUtility.getDefaultItemImage(type),
|
img: LesOubliesUtility.getDefaultItemImage(type),
|
||||||
}])
|
}
|
||||||
|
if (type === "competence") {
|
||||||
|
itemData.system = {
|
||||||
|
profileKey: CONFIG.LESOUBLIES.profiles[0]?.id ?? "",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this.document.createEmbeddedDocuments("Item", [itemData])
|
||||||
}
|
}
|
||||||
|
|
||||||
static async #onEditItem(event, target) {
|
static async #onEditItem(event, target) {
|
||||||
@@ -168,6 +187,14 @@ export default class LesOubliesActorSheet extends HandlebarsApplicationMixin(fou
|
|||||||
await this.document.openDamageDialog({ itemId })
|
await this.document.openDamageDialog({ itemId })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async #onToggleEquipped(event, target) {
|
||||||
|
const itemId = target.dataset.itemId
|
||||||
|
if (!itemId) return
|
||||||
|
const item = this.document.items.get(itemId)
|
||||||
|
if (!item || !("equipped" in (item.system ?? {}))) return
|
||||||
|
await item.update({ "system.equipped": !item.system.equipped })
|
||||||
|
}
|
||||||
|
|
||||||
static async #onUseSpell(event, target) {
|
static async #onUseSpell(event, target) {
|
||||||
const itemId = target.dataset.itemId
|
const itemId = target.dataset.itemId
|
||||||
if (!itemId) return
|
if (!itemId) return
|
||||||
@@ -183,4 +210,11 @@ export default class LesOubliesActorSheet extends HandlebarsApplicationMixin(fou
|
|||||||
static async #onOpenThreadHarvest() {
|
static async #onOpenThreadHarvest() {
|
||||||
await this.document.openThreadHarvestDialog()
|
await this.document.openThreadHarvestDialog()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async #onOpenLinkedActor(event, target) {
|
||||||
|
const actorId = target.dataset.actorId
|
||||||
|
if (!actorId) return
|
||||||
|
const actor = game.actors.get(actorId)
|
||||||
|
if (actor) actor.sheet.render(true)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
const { HandlebarsApplicationMixin } = foundry.applications.api
|
const { HandlebarsApplicationMixin } = foundry.applications.api
|
||||||
|
|
||||||
|
import { LesOubliesUtility } from "../../les-oublies-utility.js"
|
||||||
|
|
||||||
export default class LesOubliesItemSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ItemSheetV2) {
|
export default class LesOubliesItemSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ItemSheetV2) {
|
||||||
static SHEET_MODES = { EDIT: 0, PLAY: 1 }
|
static SHEET_MODES = { EDIT: 0, PLAY: 1 }
|
||||||
|
|
||||||
@@ -33,6 +35,62 @@ export default class LesOubliesItemSheet extends HandlebarsApplicationMixin(foun
|
|||||||
}
|
}
|
||||||
|
|
||||||
async _prepareContext() {
|
async _prepareContext() {
|
||||||
|
const config = CONFIG.LESOUBLIES
|
||||||
|
const enriched = await LesOubliesUtility.prepareEnrichedHtml("Item", this.document.type, this.document.system)
|
||||||
|
const skillLabels = Object.fromEntries(Object.entries(config.skills).map(([key, skill]) => [key, skill.label]))
|
||||||
|
const choiceSets = {
|
||||||
|
profileOptions: config.profiles.map((profile) => ({ value: profile.id, label: profile.label })),
|
||||||
|
skillOptions: LesOubliesUtility.createChoices(Object.keys(config.skills), skillLabels),
|
||||||
|
spellSkillOptions: LesOubliesUtility.createChoices(["magie", "onirologie", "chimerisme"], skillLabels),
|
||||||
|
weaponCategoryOptions: LesOubliesUtility.ensureChoice(
|
||||||
|
LesOubliesUtility.createChoices(Object.keys(config.weaponCategoryLabels), config.weaponCategoryLabels),
|
||||||
|
this.document.system.category,
|
||||||
|
),
|
||||||
|
weaponOriginOptions: LesOubliesUtility.ensureChoice(
|
||||||
|
LesOubliesUtility.createChoices(Object.keys(config.weaponOriginLabels), config.weaponOriginLabels),
|
||||||
|
this.document.system.origin,
|
||||||
|
),
|
||||||
|
armorStateOptions: LesOubliesUtility.ensureChoice(
|
||||||
|
LesOubliesUtility.createChoices(Object.keys(config.armorStateLabels), config.armorStateLabels),
|
||||||
|
this.document.system.state,
|
||||||
|
),
|
||||||
|
equipmentCategoryOptions: LesOubliesUtility.ensureChoice(
|
||||||
|
LesOubliesUtility.createChoices(Object.keys(config.equipmentCategoryLabels), config.equipmentCategoryLabels),
|
||||||
|
this.document.system.category,
|
||||||
|
),
|
||||||
|
spellTraditionOptions: LesOubliesUtility.ensureChoice(
|
||||||
|
LesOubliesUtility.createChoices(Object.keys(config.spellTraditionLabels), config.spellTraditionLabels),
|
||||||
|
this.document.system.tradition,
|
||||||
|
),
|
||||||
|
polarityOptions: LesOubliesUtility.ensureChoice(
|
||||||
|
LesOubliesUtility.createChoices(Object.keys(config.polarityLabels), config.polarityLabels),
|
||||||
|
this.document.system.polarity,
|
||||||
|
),
|
||||||
|
stackingOptions: LesOubliesUtility.ensureChoice(
|
||||||
|
LesOubliesUtility.createChoices(Object.keys(config.stackingLabels), config.stackingLabels),
|
||||||
|
this.document.system.stacking,
|
||||||
|
),
|
||||||
|
companyPowerScopeOptions: LesOubliesUtility.ensureChoice(
|
||||||
|
LesOubliesUtility.createChoices(Object.keys(config.companyPowerScopeLabels), config.companyPowerScopeLabels),
|
||||||
|
this.document.system.scope,
|
||||||
|
),
|
||||||
|
companyPowerModeOptions: LesOubliesUtility.ensureChoice(
|
||||||
|
LesOubliesUtility.createChoices(Object.keys(config.companyPowerModeLabels), config.companyPowerModeLabels),
|
||||||
|
this.document.system.effectMode,
|
||||||
|
),
|
||||||
|
raceSizeOptions: LesOubliesUtility.ensureChoice(
|
||||||
|
LesOubliesUtility.createRangeChoices(1, 4, config.sizes),
|
||||||
|
this.document.system.size,
|
||||||
|
),
|
||||||
|
mainRaceOptions: LesOubliesUtility.ensureChoice(
|
||||||
|
LesOubliesUtility.sortByName(game.items.filter((item) => item.type === "race")).map((item) => ({
|
||||||
|
value: item.name,
|
||||||
|
label: item.name,
|
||||||
|
})),
|
||||||
|
this.document.system.mainRace,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
item: this.document,
|
item: this.document,
|
||||||
system: this.document.system,
|
system: this.document.system,
|
||||||
@@ -43,8 +101,10 @@ export default class LesOubliesItemSheet extends HandlebarsApplicationMixin(foun
|
|||||||
isEditMode: this.isEditMode,
|
isEditMode: this.isEditMode,
|
||||||
isPlayMode: this.isPlayMode,
|
isPlayMode: this.isPlayMode,
|
||||||
isGM: game.user.isGM,
|
isGM: game.user.isGM,
|
||||||
config: CONFIG.LESOUBLIES,
|
config,
|
||||||
enrichedDescription: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description ?? "", { async: true }),
|
choiceSets,
|
||||||
|
enriched,
|
||||||
|
enrichedDescription: foundry.utils.getProperty(enriched, "description") ?? "",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,14 @@
|
|||||||
import LesOubliesActorSheet from "./base-actor-sheet.mjs"
|
import LesOubliesActorSheet from "./base-actor-sheet.mjs"
|
||||||
|
import { LesOubliesUtility } from "../../les-oublies-utility.js"
|
||||||
|
|
||||||
export default class LesOubliesCompagnieSheet extends LesOubliesActorSheet {
|
export default class LesOubliesCompagnieSheet extends LesOubliesActorSheet {
|
||||||
static DEFAULT_OPTIONS = {
|
static DEFAULT_OPTIONS = {
|
||||||
...super.DEFAULT_OPTIONS,
|
...super.DEFAULT_OPTIONS,
|
||||||
classes: [...super.DEFAULT_OPTIONS.classes, "compagnie"],
|
classes: [...super.DEFAULT_OPTIONS.classes, "compagnie"],
|
||||||
|
actions: {
|
||||||
|
...super.DEFAULT_OPTIONS.actions,
|
||||||
|
switchTab: LesOubliesCompagnieSheet.#onSwitchTab,
|
||||||
|
},
|
||||||
window: {
|
window: {
|
||||||
...super.DEFAULT_OPTIONS.window,
|
...super.DEFAULT_OPTIONS.window,
|
||||||
title: "TYPES.Actor.compagnie",
|
title: "TYPES.Actor.compagnie",
|
||||||
@@ -12,12 +17,30 @@ export default class LesOubliesCompagnieSheet extends LesOubliesActorSheet {
|
|||||||
|
|
||||||
static PARTS = {
|
static PARTS = {
|
||||||
sheet: {
|
sheet: {
|
||||||
template: "systems/fvtt-les-oublies/templates/actor-compagnie-sheet.hbs",
|
template: "systems/fvtt-les-oublies/templates/actor-compagnie-sheet-v4.hbs",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_activeTab = "power"
|
||||||
|
|
||||||
|
#getTabs() {
|
||||||
|
const tabs = {
|
||||||
|
power: { id: "power", label: "Pouvoir", icon: "fa-solid fa-burst" },
|
||||||
|
members: { id: "members", label: "Membres & liens", icon: "fa-solid fa-people-group" },
|
||||||
|
notes: { id: "notes", label: "Notes", icon: "fa-solid fa-feather-pointed" },
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const tab of Object.values(tabs)) {
|
||||||
|
tab.active = this._activeTab === tab.id
|
||||||
|
tab.cssClass = tab.active ? "active" : ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return tabs
|
||||||
|
}
|
||||||
|
|
||||||
async _prepareContext() {
|
async _prepareContext() {
|
||||||
const context = await super._prepareContext()
|
const context = await super._prepareContext()
|
||||||
|
context.tabs = this.#getTabs()
|
||||||
context.members = (this.document.system.memberIds ?? []).map((id) => game.actors.get(id)).filter(Boolean)
|
context.members = (this.document.system.memberIds ?? []).map((id) => game.actors.get(id)).filter(Boolean)
|
||||||
context.captain = this.document.system.captainId ? game.actors.get(this.document.system.captainId) : null
|
context.captain = this.document.system.captainId ? game.actors.get(this.document.system.captainId) : null
|
||||||
context.shadow = this.document.system.ombreDuTourmentId ? game.actors.get(this.document.system.ombreDuTourmentId) : null
|
context.shadow = this.document.system.ombreDuTourmentId ? game.actors.get(this.document.system.ombreDuTourmentId) : null
|
||||||
@@ -28,6 +51,19 @@ export default class LesOubliesCompagnieSheet extends LesOubliesActorSheet {
|
|||||||
sourceLabel: game.actors.get(link.sourceId)?.name ?? link.sourceId,
|
sourceLabel: game.actors.get(link.sourceId)?.name ?? link.sourceId,
|
||||||
targetLabel: game.actors.get(link.targetId)?.name ?? link.targetId,
|
targetLabel: game.actors.get(link.targetId)?.name ?? link.targetId,
|
||||||
}))
|
}))
|
||||||
|
const actorChoices = LesOubliesUtility.sortByName(game.actors.filter((actor) => actor.type === "personnage")).map((actor) => ({
|
||||||
|
value: actor.id,
|
||||||
|
label: actor.name,
|
||||||
|
}))
|
||||||
|
context.choiceSets.captainOptions = LesOubliesUtility.ensureChoice(actorChoices, this.document.system.captainId, context.captain?.name)
|
||||||
|
context.choiceSets.shadowOptions = LesOubliesUtility.ensureChoice(actorChoices, this.document.system.ombreDuTourmentId, context.shadow?.name)
|
||||||
return context
|
return context
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static #onSwitchTab(event, target) {
|
||||||
|
const tab = target.dataset.tab
|
||||||
|
if (!tab || this._activeTab === tab) return
|
||||||
|
this._activeTab = tab
|
||||||
|
this.render()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,10 @@ export default class LesOubliesCreatureSheet extends LesOubliesActorSheet {
|
|||||||
static DEFAULT_OPTIONS = {
|
static DEFAULT_OPTIONS = {
|
||||||
...super.DEFAULT_OPTIONS,
|
...super.DEFAULT_OPTIONS,
|
||||||
classes: [...super.DEFAULT_OPTIONS.classes, "creature"],
|
classes: [...super.DEFAULT_OPTIONS.classes, "creature"],
|
||||||
|
actions: {
|
||||||
|
...super.DEFAULT_OPTIONS.actions,
|
||||||
|
switchTab: LesOubliesCreatureSheet.#onSwitchTab,
|
||||||
|
},
|
||||||
window: {
|
window: {
|
||||||
...super.DEFAULT_OPTIONS.window,
|
...super.DEFAULT_OPTIONS.window,
|
||||||
title: "TYPES.Actor.creature",
|
title: "TYPES.Actor.creature",
|
||||||
@@ -12,12 +16,31 @@ export default class LesOubliesCreatureSheet extends LesOubliesActorSheet {
|
|||||||
|
|
||||||
static PARTS = {
|
static PARTS = {
|
||||||
sheet: {
|
sheet: {
|
||||||
template: "systems/fvtt-les-oublies/templates/actor-creature-sheet.hbs",
|
template: "systems/fvtt-les-oublies/templates/actor-creature-sheet-v5.hbs",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_activeTab = "overview"
|
||||||
|
|
||||||
|
#getTabs() {
|
||||||
|
const tabs = {
|
||||||
|
overview: { id: "overview", label: "Aperçu", icon: "fa-solid fa-dragon" },
|
||||||
|
aptitudes: { id: "aptitudes", label: "Aptitudes", icon: "fa-solid fa-book-open" },
|
||||||
|
combat: { id: "combat", label: "Combat & équipement", icon: "fa-solid fa-shield-halved" },
|
||||||
|
notes: { id: "notes", label: "Notes", icon: "fa-solid fa-feather-pointed" },
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const tab of Object.values(tabs)) {
|
||||||
|
tab.active = this._activeTab === tab.id
|
||||||
|
tab.cssClass = tab.active ? "active" : ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return tabs
|
||||||
|
}
|
||||||
|
|
||||||
async _prepareContext() {
|
async _prepareContext() {
|
||||||
const context = await super._prepareContext()
|
const context = await super._prepareContext()
|
||||||
|
context.tabs = this.#getTabs()
|
||||||
context.derived = this.document.getDerivedOverview()
|
context.derived = this.document.getDerivedOverview()
|
||||||
context.skillGroups = this.document.getGroupedCompetences()
|
context.skillGroups = this.document.getGroupedCompetences()
|
||||||
context.spells = this.document.getEmbeddedItems("sortilege")
|
context.spells = this.document.getEmbeddedItems("sortilege")
|
||||||
@@ -26,4 +49,11 @@ export default class LesOubliesCreatureSheet extends LesOubliesActorSheet {
|
|||||||
context.equipment = this.document.getEmbeddedItems("equipement")
|
context.equipment = this.document.getEmbeddedItems("equipement")
|
||||||
return context
|
return context
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static #onSwitchTab(event, target) {
|
||||||
|
const tab = target.dataset.tab
|
||||||
|
if (!tab || this._activeTab === tab) return
|
||||||
|
this._activeTab = tab
|
||||||
|
this.render()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,17 @@
|
|||||||
import LesOubliesActorSheet from "./base-actor-sheet.mjs"
|
import LesOubliesActorSheet from "./base-actor-sheet.mjs"
|
||||||
|
import { LesOubliesUtility } from "../../les-oublies-utility.js"
|
||||||
|
|
||||||
export default class LesOubliesPersonnageSheet extends LesOubliesActorSheet {
|
export default class LesOubliesPersonnageSheet extends LesOubliesActorSheet {
|
||||||
|
static CREATION_DROP_TYPES = new Set(["race", "tribu", "metier"])
|
||||||
|
|
||||||
static DEFAULT_OPTIONS = {
|
static DEFAULT_OPTIONS = {
|
||||||
...super.DEFAULT_OPTIONS,
|
...super.DEFAULT_OPTIONS,
|
||||||
classes: [...super.DEFAULT_OPTIONS.classes, "personnage"],
|
classes: [...super.DEFAULT_OPTIONS.classes, "personnage"],
|
||||||
|
actions: {
|
||||||
|
...super.DEFAULT_OPTIONS.actions,
|
||||||
|
switchTab: LesOubliesPersonnageSheet.#onSwitchTab,
|
||||||
|
removeCreationItem: LesOubliesPersonnageSheet.#onRemoveCreationItem,
|
||||||
|
},
|
||||||
window: {
|
window: {
|
||||||
...super.DEFAULT_OPTIONS.window,
|
...super.DEFAULT_OPTIONS.window,
|
||||||
title: "TYPES.Actor.personnage",
|
title: "TYPES.Actor.personnage",
|
||||||
@@ -12,26 +20,121 @@ export default class LesOubliesPersonnageSheet extends LesOubliesActorSheet {
|
|||||||
|
|
||||||
static PARTS = {
|
static PARTS = {
|
||||||
sheet: {
|
sheet: {
|
||||||
template: "systems/fvtt-les-oublies/templates/actor-personnage-sheet.hbs",
|
template: "systems/fvtt-les-oublies/templates/actor-personnage-sheet-v14.hbs",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_activeTab = "overview"
|
||||||
|
|
||||||
|
#getTabs() {
|
||||||
|
const tabs = {
|
||||||
|
overview: { id: "overview", label: "Portrait", icon: "fa-solid fa-id-card" },
|
||||||
|
skills: { id: "skills", label: "Compétences", icon: "fa-solid fa-book-open" },
|
||||||
|
actions: { id: "actions", label: "Combat & magie", icon: "fa-solid fa-wand-sparkles" },
|
||||||
|
equipment: { id: "equipment", label: "Équipement", icon: "fa-solid fa-suitcase" },
|
||||||
|
notes: { id: "notes", label: "Notes", icon: "fa-solid fa-feather-pointed" },
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const tab of Object.values(tabs)) {
|
||||||
|
tab.active = this._activeTab === tab.id
|
||||||
|
tab.cssClass = tab.active ? "active" : ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return tabs
|
||||||
|
}
|
||||||
|
|
||||||
async _prepareContext() {
|
async _prepareContext() {
|
||||||
const context = await super._prepareContext()
|
const context = await super._prepareContext()
|
||||||
|
context.tabs = this.#getTabs()
|
||||||
context.derived = this.document.getDerivedOverview()
|
context.derived = this.document.getDerivedOverview()
|
||||||
context.creation = {
|
context.creation = {
|
||||||
race: this.document.getCreationItem("race"),
|
race: this.document.getCreationItem("race"),
|
||||||
tribu: this.document.getCreationItem("tribu"),
|
tribu: this.document.getCreationItem("tribu"),
|
||||||
metier: this.document.getCreationItem("metier"),
|
metier: this.document.getCreationItem("metier"),
|
||||||
}
|
}
|
||||||
context.profileEntries = this.document.system.profils
|
context.creationSlots = [
|
||||||
|
this.#buildCreationSlot("race", context.creation.race, "Glissez une race ici depuis un compendium ou le répertoire des objets."),
|
||||||
|
this.#buildCreationSlot("tribu", context.creation.tribu, "Glissez une tribu ici depuis un compendium ou le répertoire des objets."),
|
||||||
|
this.#buildCreationSlot("metier", context.creation.metier, "Glissez un métier ici depuis un compendium ou le répertoire des objets."),
|
||||||
|
]
|
||||||
context.skillGroups = this.document.getGroupedCompetences()
|
context.skillGroups = this.document.getGroupedCompetences()
|
||||||
|
const splitIndex = Math.ceil(context.skillGroups.length / 2)
|
||||||
|
context.skillColumns = [
|
||||||
|
context.skillGroups.slice(0, splitIndex),
|
||||||
|
context.skillGroups.slice(splitIndex),
|
||||||
|
]
|
||||||
context.spells = this.document.getEmbeddedItems("sortilege")
|
context.spells = this.document.getEmbeddedItems("sortilege")
|
||||||
context.weapons = this.document.getEmbeddedItems("arme")
|
context.weapons = this.document.getEmbeddedItems("arme")
|
||||||
|
context.equippedWeapons = context.weapons.filter((item) => item.system.equipped)
|
||||||
context.armors = this.document.getEmbeddedItems("armure")
|
context.armors = this.document.getEmbeddedItems("armure")
|
||||||
context.equipment = this.document.getEmbeddedItems("equipement")
|
context.equipment = this.document.getEmbeddedItems("equipement")
|
||||||
context.companyPowers = this.document.getEmbeddedItems("pouvoircompagnie")
|
context.companyPowers = this.document.getEmbeddedItems("pouvoircompagnie")
|
||||||
context.activeCompanyPower = context.derived.compagnie?.getEmbeddedItems?.("pouvoircompagnie")?.[0] ?? null
|
context.activeCompanyPower = context.derived.compagnie?.getEmbeddedItems?.("pouvoircompagnie")?.[0] ?? null
|
||||||
|
context.choiceSets.companyOptions = LesOubliesUtility.ensureChoice(
|
||||||
|
LesOubliesUtility.sortByName(game.actors.filter((actor) => actor.type === "compagnie")).map((actor) => ({
|
||||||
|
value: actor.id,
|
||||||
|
label: actor.name,
|
||||||
|
})),
|
||||||
|
this.document.system.references?.compagnieId,
|
||||||
|
context.derived.compagnie?.name,
|
||||||
|
)
|
||||||
return context
|
return context
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#buildCreationSlot(type, item, emptyHint) {
|
||||||
|
return {
|
||||||
|
type,
|
||||||
|
label: game.i18n.localize(`TYPES.Item.${type}`),
|
||||||
|
item,
|
||||||
|
emptyHint,
|
||||||
|
filledHint: "Déposez un autre élément du même type pour le remplacer.",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async _onDrop(event) {
|
||||||
|
const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event)
|
||||||
|
if (data.type !== "Item" || !data.uuid) return super._onDrop(event)
|
||||||
|
|
||||||
|
const item = await fromUuid(data.uuid)
|
||||||
|
if (!item) return
|
||||||
|
|
||||||
|
const slot = event.target?.closest?.("[data-drop-creation-type]")
|
||||||
|
const slotType = slot?.dataset?.dropCreationType ?? ""
|
||||||
|
const inCreationZone = Boolean(event.target?.closest?.("[data-creation-drop-zone]"))
|
||||||
|
|
||||||
|
if (!LesOubliesPersonnageSheet.CREATION_DROP_TYPES.has(item.type)) {
|
||||||
|
if (slot || inCreationZone) {
|
||||||
|
ui.notifications.warn("Seules les races, tribus et métiers peuvent être déposés dans cette zone.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return super._onDrop(event)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (slotType && slotType !== item.type) {
|
||||||
|
ui.notifications.warn(`Déposez ici un élément de type ${game.i18n.localize(`TYPES.Item.${slotType}`)}.`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (slot || inCreationZone) {
|
||||||
|
await this.document.assignCreationItem(item)
|
||||||
|
this.render()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return super._onDrop(event)
|
||||||
|
}
|
||||||
|
|
||||||
|
static #onSwitchTab(event, target) {
|
||||||
|
const tab = target.dataset.tab
|
||||||
|
if (!tab || this._activeTab === tab) return
|
||||||
|
this._activeTab = tab
|
||||||
|
this.render()
|
||||||
|
}
|
||||||
|
|
||||||
|
static async #onRemoveCreationItem(event, target) {
|
||||||
|
const type = target.dataset.type
|
||||||
|
if (!LesOubliesPersonnageSheet.CREATION_DROP_TYPES.has(type)) return
|
||||||
|
await this.document.clearCreationItem(type)
|
||||||
|
this.render()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ import { LesOubliesUtility } from "./les-oublies-utility.js"
|
|||||||
import { LesOubliesRolls } from "./les-oublies-rolls.js"
|
import { LesOubliesRolls } from "./les-oublies-rolls.js"
|
||||||
|
|
||||||
export class LesOubliesActor extends Actor {
|
export class LesOubliesActor extends Actor {
|
||||||
|
static CREATION_ITEM_TYPES = new Set(["race", "tribu", "metier"])
|
||||||
|
|
||||||
prepareDerivedData() {
|
prepareDerivedData() {
|
||||||
super.prepareDerivedData()
|
super.prepareDerivedData()
|
||||||
|
|
||||||
@@ -43,6 +45,12 @@ export class LesOubliesActor extends Actor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getCreationItem(type) {
|
getCreationItem(type) {
|
||||||
|
if (!LesOubliesActor.CREATION_ITEM_TYPES.has(type)) return this.items.find((item) => item.type === type) ?? null
|
||||||
|
const referenceId = this.system.references?.[`${type}Id`] ?? ""
|
||||||
|
if (referenceId) {
|
||||||
|
const referencedItem = this.items.get(referenceId)
|
||||||
|
if (referencedItem?.type === type) return referencedItem
|
||||||
|
}
|
||||||
return this.items.find((item) => item.type === type) ?? null
|
return this.items.find((item) => item.type === type) ?? null
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,6 +59,40 @@ export class LesOubliesActor extends Actor {
|
|||||||
return LesOubliesUtility.sortByName(items)
|
return LesOubliesUtility.sortByName(items)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async assignCreationItem(sourceItem) {
|
||||||
|
if (!sourceItem || !LesOubliesActor.CREATION_ITEM_TYPES.has(sourceItem.type)) return null
|
||||||
|
|
||||||
|
const itemData = sourceItem.toObject()
|
||||||
|
delete itemData._id
|
||||||
|
|
||||||
|
const existingIds = this.getEmbeddedItems(sourceItem.type).map((item) => item.id)
|
||||||
|
if (existingIds.length) {
|
||||||
|
await this.deleteEmbeddedDocuments("Item", existingIds, { renderSheet: false })
|
||||||
|
}
|
||||||
|
|
||||||
|
const [createdItem] = await this.createEmbeddedDocuments("Item", [itemData], { renderSheet: false })
|
||||||
|
if (!createdItem) return null
|
||||||
|
|
||||||
|
await this.update({
|
||||||
|
[`system.references.${sourceItem.type}Id`]: createdItem.id,
|
||||||
|
})
|
||||||
|
|
||||||
|
return createdItem
|
||||||
|
}
|
||||||
|
|
||||||
|
async clearCreationItem(type) {
|
||||||
|
if (!LesOubliesActor.CREATION_ITEM_TYPES.has(type)) return
|
||||||
|
|
||||||
|
const existingIds = this.getEmbeddedItems(type).map((item) => item.id)
|
||||||
|
if (existingIds.length) {
|
||||||
|
await this.deleteEmbeddedDocuments("Item", existingIds, { renderSheet: false })
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.update({
|
||||||
|
[`system.references.${type}Id`]: "",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
getCompagnie() {
|
getCompagnie() {
|
||||||
const compagnieId = this.system.references?.compagnieId
|
const compagnieId = this.system.references?.compagnieId
|
||||||
return compagnieId ? game.actors.get(compagnieId) ?? null : null
|
return compagnieId ? game.actors.get(compagnieId) ?? null : null
|
||||||
@@ -83,6 +125,7 @@ export class LesOubliesActor extends Actor {
|
|||||||
getGroupedCompetences() {
|
getGroupedCompetences() {
|
||||||
return LESOUBLIES_CONFIG.profiles.map((profile) => ({
|
return LESOUBLIES_CONFIG.profiles.map((profile) => ({
|
||||||
...profile,
|
...profile,
|
||||||
|
profileValue: this.getProfileValue(profile.id),
|
||||||
items: this.getCompetences().filter((entry) => entry.item.system.profileKey === profile.id),
|
items: this.getCompetences().filter((entry) => entry.item.system.profileKey === profile.id),
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,6 +59,67 @@ export const SIZE_LABELS = {
|
|||||||
4: "Grande",
|
4: "Grande",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const WEAPON_CATEGORY_LABELS = {
|
||||||
|
melee: "Mêlée",
|
||||||
|
tir: "Tir",
|
||||||
|
jet: "Jet",
|
||||||
|
}
|
||||||
|
|
||||||
|
export const WEAPON_ORIGIN_LABELS = {
|
||||||
|
geant: "Géant",
|
||||||
|
petitPeuple: "Petit Peuple",
|
||||||
|
}
|
||||||
|
|
||||||
|
export const WEAPON_SIZE_MODE_LABELS = {
|
||||||
|
fixe: "Fixe",
|
||||||
|
plage: "Plage",
|
||||||
|
variable: "Variable",
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ARMOR_STATE_LABELS = {
|
||||||
|
protege: "Protégé",
|
||||||
|
harnache: "Harnaché",
|
||||||
|
barde: "Bardé",
|
||||||
|
}
|
||||||
|
|
||||||
|
export const EQUIPMENT_CATEGORY_LABELS = {
|
||||||
|
butin: "Butin",
|
||||||
|
ecriture: "Écriture",
|
||||||
|
monture: "Monture",
|
||||||
|
soin: "Soin",
|
||||||
|
survie: "Survie",
|
||||||
|
voyage: "Voyage",
|
||||||
|
}
|
||||||
|
|
||||||
|
export const SPELL_TRADITION_LABELS = {
|
||||||
|
chimerisme: "Chimérisme",
|
||||||
|
farfadet: "Farfadet",
|
||||||
|
magie: "Magie",
|
||||||
|
onirologie: "Onirologie",
|
||||||
|
}
|
||||||
|
|
||||||
|
export const POLARITY_LABELS = {
|
||||||
|
cauchemar: "Cauchemar",
|
||||||
|
songes: "Songes",
|
||||||
|
}
|
||||||
|
|
||||||
|
export const STACKING_LABELS = {
|
||||||
|
"-": "—",
|
||||||
|
non: "Non",
|
||||||
|
oui: "Oui",
|
||||||
|
}
|
||||||
|
|
||||||
|
export const COMPANY_POWER_SCOPE_LABELS = {
|
||||||
|
compagnie: "Compagnie",
|
||||||
|
}
|
||||||
|
|
||||||
|
export const COMPANY_POWER_MODE_LABELS = {
|
||||||
|
passif: "Passif",
|
||||||
|
"préparation": "Préparation",
|
||||||
|
"réaction": "Réaction",
|
||||||
|
ressource: "Ressource",
|
||||||
|
}
|
||||||
|
|
||||||
export const ACTOR_IMAGES = {
|
export const ACTOR_IMAGES = {
|
||||||
personnage: "icons/svg/mystery-man.svg",
|
personnage: "icons/svg/mystery-man.svg",
|
||||||
compagnie: "icons/svg/book.svg",
|
compagnie: "icons/svg/book.svg",
|
||||||
@@ -84,6 +145,16 @@ export const LESOUBLIES_CONFIG = {
|
|||||||
profileLabels: PROFILE_LABELS,
|
profileLabels: PROFILE_LABELS,
|
||||||
skills: SKILLS,
|
skills: SKILLS,
|
||||||
sizes: SIZE_LABELS,
|
sizes: SIZE_LABELS,
|
||||||
|
weaponCategoryLabels: WEAPON_CATEGORY_LABELS,
|
||||||
|
weaponOriginLabels: WEAPON_ORIGIN_LABELS,
|
||||||
|
weaponSizeModeLabels: WEAPON_SIZE_MODE_LABELS,
|
||||||
|
armorStateLabels: ARMOR_STATE_LABELS,
|
||||||
|
equipmentCategoryLabels: EQUIPMENT_CATEGORY_LABELS,
|
||||||
|
spellTraditionLabels: SPELL_TRADITION_LABELS,
|
||||||
|
polarityLabels: POLARITY_LABELS,
|
||||||
|
stackingLabels: STACKING_LABELS,
|
||||||
|
companyPowerScopeLabels: COMPANY_POWER_SCOPE_LABELS,
|
||||||
|
companyPowerModeLabels: COMPANY_POWER_MODE_LABELS,
|
||||||
actorImages: ACTOR_IMAGES,
|
actorImages: ACTOR_IMAGES,
|
||||||
itemImages: ITEM_IMAGES,
|
itemImages: ITEM_IMAGES,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,8 +6,22 @@ import { LesOubliesRolls } from "./les-oublies-rolls.js"
|
|||||||
import * as models from "./models/index.mjs"
|
import * as models from "./models/index.mjs"
|
||||||
import * as sheets from "./applications/sheets/_module.mjs"
|
import * as sheets from "./applications/sheets/_module.mjs"
|
||||||
|
|
||||||
|
function ensureSystemStyles() {
|
||||||
|
const href = `systems/${game.system.id}/css/les-oublies.css`
|
||||||
|
const existingLink = document.querySelector(`link[href$="${href}"]`)
|
||||||
|
if (existingLink) return
|
||||||
|
|
||||||
|
const link = document.createElement("link")
|
||||||
|
link.rel = "stylesheet"
|
||||||
|
link.type = "text/css"
|
||||||
|
link.href = href
|
||||||
|
link.dataset.systemStyle = game.system.id
|
||||||
|
document.head.append(link)
|
||||||
|
}
|
||||||
|
|
||||||
Hooks.once("init", function () {
|
Hooks.once("init", function () {
|
||||||
console.info("Les Oubliés | Initialisation du système")
|
console.info("Les Oubliés | Initialisation du système")
|
||||||
|
ensureSystemStyles()
|
||||||
|
|
||||||
CONFIG.Actor.documentClass = LesOubliesActor
|
CONFIG.Actor.documentClass = LesOubliesActor
|
||||||
CONFIG.Actor.dataModels = {
|
CONFIG.Actor.dataModels = {
|
||||||
|
|||||||
+333
-60
@@ -1,3 +1,5 @@
|
|||||||
|
import { LesOubliesUtility } from "./les-oublies-utility.js"
|
||||||
|
|
||||||
const PRIME_DEFINITIONS = [
|
const PRIME_DEFINITIONS = [
|
||||||
{
|
{
|
||||||
id: "none",
|
id: "none",
|
||||||
@@ -187,6 +189,18 @@ const MOVEMENT_DIFFICULTIES = [
|
|||||||
{ value: -3, label: "Faire un détour (-3)" },
|
{ value: -3, label: "Faire un détour (-3)" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
const TEST_DIFFICULTIES = [
|
||||||
|
{ value: 12, label: "Exceptionnellement facile (+12)" },
|
||||||
|
{ value: 9, label: "Très facile (+9)" },
|
||||||
|
{ value: 6, label: "Facile (+6)" },
|
||||||
|
{ value: 3, label: "Avantageuse (+3)" },
|
||||||
|
{ value: 0, label: "Normale (+0)" },
|
||||||
|
{ value: -3, label: "Difficile (-3)" },
|
||||||
|
{ value: -6, label: "Très difficile (-6)" },
|
||||||
|
{ value: -9, label: "Extrêmement difficile (-9)" },
|
||||||
|
{ value: -12, label: "Presque impossible (-12)" },
|
||||||
|
]
|
||||||
|
|
||||||
const HARVEST_SIDE_EFFECTS = {
|
const HARVEST_SIDE_EFFECTS = {
|
||||||
1: "La main du personnage tremble plus ou moins violemment.",
|
1: "La main du personnage tremble plus ou moins violemment.",
|
||||||
2: "Le personnage n'arrive à trouver ni repos ni sommeil.",
|
2: "Le personnage n'arrive à trouver ni repos ni sommeil.",
|
||||||
@@ -250,6 +264,8 @@ const PRESET_ACTIONS = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class LesOubliesRolls {
|
export class LesOubliesRolls {
|
||||||
|
static #actorLocks = new Map()
|
||||||
|
|
||||||
static async openTestDialog(actor, preset = {}) {
|
static async openTestDialog(actor, preset = {}) {
|
||||||
const data = await this.#promptTestOptions(actor, preset)
|
const data = await this.#promptTestOptions(actor, preset)
|
||||||
if (!data || typeof data !== "object") return null
|
if (!data || typeof data !== "object") return null
|
||||||
@@ -284,7 +300,18 @@ export class LesOubliesRolls {
|
|||||||
static async openConfrontationDialog(actor, preset = {}) {
|
static async openConfrontationDialog(actor, preset = {}) {
|
||||||
const data = await this.#promptConfrontationOptions(actor, preset)
|
const data = await this.#promptConfrontationOptions(actor, preset)
|
||||||
if (!data || typeof data !== "object") return null
|
if (!data || typeof data !== "object") return null
|
||||||
return this.#createConfrontationMessage(actor, data, preset.actionData ?? null)
|
const defenderActor = this.#resolveDialogTargetActor(data.defenderActorId, preset.targetActor ?? this.#getTargetActor())
|
||||||
|
return this.#createConfrontationMessage(actor, {
|
||||||
|
...data,
|
||||||
|
defenderLabel: defenderActor?.name ?? data.defenderLabel,
|
||||||
|
defenderScore: defenderActor
|
||||||
|
? this.#getSkillScoreWithAlternatives(defenderActor, data.defenderSkill)
|
||||||
|
: Number(data.defenderScore ?? 0),
|
||||||
|
defenderSongesValue: defenderActor ? Number(defenderActor.system.songes?.value ?? 0) : Number(data.defenderSongesValue ?? 0),
|
||||||
|
defenderSongesPoints: defenderActor ? Number(defenderActor.system.songes?.points ?? 0) : Number(data.defenderSongesPoints ?? 0),
|
||||||
|
defenderCauchemarValue: defenderActor ? Number(defenderActor.system.cauchemar?.value ?? 0) : Number(data.defenderCauchemarValue ?? 0),
|
||||||
|
defenderCauchemarPoints: defenderActor ? Number(defenderActor.system.cauchemar?.points ?? 0) : Number(data.defenderCauchemarPoints ?? 0),
|
||||||
|
}, preset.actionData ?? null)
|
||||||
}
|
}
|
||||||
|
|
||||||
static async openAttackDialog(actor, { itemId = null, mode = null } = {}) {
|
static async openAttackDialog(actor, { itemId = null, mode = null } = {}) {
|
||||||
@@ -297,6 +324,11 @@ export class LesOubliesRolls {
|
|||||||
targetActor,
|
targetActor,
|
||||||
})
|
})
|
||||||
if (!data) return null
|
if (!data) return null
|
||||||
|
const defenderActor = this.#resolveDialogTargetActor(data.defenderActorId, targetActor)
|
||||||
|
if (!defenderActor) {
|
||||||
|
ui.notifications.info("Aucune cible sélectionnée : choisissez un adversaire avant de lancer une attaque.")
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
const modifiers = this.#resolveModifierSelection(data.primeId, data.penaltyId, attackMode === "ranged" ? "rangedAttack" : "meleeAttack")
|
const modifiers = this.#resolveModifierSelection(data.primeId, data.penaltyId, attackMode === "ranged" ? "rangedAttack" : "meleeAttack")
|
||||||
const reactionOptions = this.#getAttackReactionOptions(data.attackerSkill)
|
const reactionOptions = this.#getAttackReactionOptions(data.attackerSkill)
|
||||||
@@ -311,17 +343,17 @@ export class LesOubliesRolls {
|
|||||||
modifiers,
|
modifiers,
|
||||||
targetLabel: data.defenderLabel,
|
targetLabel: data.defenderLabel,
|
||||||
notes: data.notes?.trim() || "",
|
notes: data.notes?.trim() || "",
|
||||||
targetActor,
|
targetActor: defenderActor,
|
||||||
applyToTarget: Boolean(data.applyToTarget && targetActor),
|
applyToTarget: Boolean(data.applyToTarget && defenderActor),
|
||||||
damageRequest: {
|
damageRequest: {
|
||||||
actor,
|
actor,
|
||||||
weapon,
|
weapon,
|
||||||
baseDamage: Number(data.baseDamage ?? 0),
|
baseDamage: Number(data.baseDamage ?? 0),
|
||||||
baseLabel: String(data.baseDamageLabel || weapon?.system?.damage || data.baseDamage || "0"),
|
baseLabel: String(data.baseDamageLabel || weapon?.system?.damage || data.baseDamage || "0"),
|
||||||
targetProtection: Number(data.targetProtection ?? 0),
|
targetProtection: Number(data.targetProtection ?? 0),
|
||||||
targetLabel: String(data.defenderLabel || targetActor?.name || game.i18n.localize("LESOUBLIES.rolls.defender")),
|
targetLabel: String(data.defenderLabel || defenderActor?.name || game.i18n.localize("LESOUBLIES.rolls.defender")),
|
||||||
targetActor,
|
targetActor: defenderActor,
|
||||||
applyToTarget: Boolean(data.applyToTarget && targetActor),
|
applyToTarget: Boolean(data.applyToTarget && defenderActor),
|
||||||
modifiers,
|
modifiers,
|
||||||
},
|
},
|
||||||
extraContext: {
|
extraContext: {
|
||||||
@@ -339,17 +371,17 @@ export class LesOubliesRolls {
|
|||||||
attackerExtraDie: data.attackerExtraDie,
|
attackerExtraDie: data.attackerExtraDie,
|
||||||
attackerFinalModifier: modifiers.summary.finalModifier,
|
attackerFinalModifier: modifiers.summary.finalModifier,
|
||||||
defenderLabel: data.defenderLabel,
|
defenderLabel: data.defenderLabel,
|
||||||
defenderScore: targetActor
|
defenderScore: defenderActor
|
||||||
? this.#getSkillScoreWithAlternatives(targetActor, data.defenderSkill)
|
? this.#getSkillScoreWithAlternatives(defenderActor, data.defenderSkill)
|
||||||
: Number(data.defenderScore ?? 0),
|
: Number(data.defenderScore ?? 0),
|
||||||
defenderDifficulty: Number(data.defenderDifficulty ?? 0),
|
defenderDifficulty: Number(data.defenderDifficulty ?? 0),
|
||||||
defenderRollMode: data.defenderRollMode,
|
defenderRollMode: data.defenderRollMode,
|
||||||
defenderExtraDie: data.defenderExtraDie,
|
defenderExtraDie: data.defenderExtraDie,
|
||||||
defenderFinalModifier: modifiers.summary.opponentFinalModifier,
|
defenderFinalModifier: modifiers.summary.opponentFinalModifier,
|
||||||
defenderSongesValue: targetActor ? Number(targetActor.system.songes?.value ?? 0) : Number(data.defenderSongesValue ?? 0),
|
defenderSongesValue: defenderActor ? Number(defenderActor.system.songes?.value ?? 0) : Number(data.defenderSongesValue ?? 0),
|
||||||
defenderSongesPoints: targetActor ? Number(targetActor.system.songes?.points ?? 0) : Number(data.defenderSongesPoints ?? 0),
|
defenderSongesPoints: defenderActor ? Number(defenderActor.system.songes?.points ?? 0) : Number(data.defenderSongesPoints ?? 0),
|
||||||
defenderCauchemarValue: targetActor ? Number(targetActor.system.cauchemar?.value ?? 0) : Number(data.defenderCauchemarValue ?? 0),
|
defenderCauchemarValue: defenderActor ? Number(defenderActor.system.cauchemar?.value ?? 0) : Number(data.defenderCauchemarValue ?? 0),
|
||||||
defenderCauchemarPoints: targetActor ? Number(targetActor.system.cauchemar?.points ?? 0) : Number(data.defenderCauchemarPoints ?? 0),
|
defenderCauchemarPoints: defenderActor ? Number(defenderActor.system.cauchemar?.points ?? 0) : Number(data.defenderCauchemarPoints ?? 0),
|
||||||
}, actionData)
|
}, actionData)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -407,33 +439,40 @@ export class LesOubliesRolls {
|
|||||||
|
|
||||||
const data = await this.#promptSpellOptions(actor, spell)
|
const data = await this.#promptSpellOptions(actor, spell)
|
||||||
if (!data) return null
|
if (!data) return null
|
||||||
|
const activation = await this.#withActorLock(`spell:${actor.id}`, async () => {
|
||||||
const skill = actor.getCompetenceByKey?.(spell.system.skillKey) ?? null
|
const skill = actor.getCompetenceByKey?.(spell.system.skillKey) ?? null
|
||||||
const skillBase = Number(skill?.system?.base ?? 0)
|
const skillBase = Number(skill?.system?.base ?? 0)
|
||||||
if (skillBase < 1) {
|
if (skillBase < 1) {
|
||||||
ui.notifications.warn(`Il faut au moins une base de 1 en ${this.#getSkillLabel(spell.system.skillKey)} pour activer ce sortilège.`)
|
ui.notifications.warn(`Il faut au moins une base de 1 en ${this.#getSkillLabel(spell.system.skillKey)} pour activer ce sortilège.`)
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
const métierMatch = this.#actorMatchesSpellGrant(actor, spell)
|
|
||||||
const surcharge = !métierMatch && data.applyMetierSurcharge
|
|
||||||
const effectiveCost = Number(data.actualCost ?? 0) * (surcharge ? 2 : 1)
|
|
||||||
const paymentMode = String(data.paymentMode || "points")
|
|
||||||
if (paymentMode === "points") {
|
|
||||||
const resource = spell.system.polarity || "songes"
|
|
||||||
if (Number(actor.system?.[resource]?.points ?? 0) < effectiveCost) {
|
|
||||||
ui.notifications.warn(game.i18n.format("LESOUBLIES.rolls.notEnoughResource", {
|
|
||||||
resource: resource === "songes" ? game.i18n.localize("LESOUBLIES.ui.songes") : game.i18n.localize("LESOUBLIES.ui.cauchemar"),
|
|
||||||
actor: actor.name,
|
|
||||||
}))
|
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
if (effectiveCost > 0) {
|
|
||||||
await actor.update({
|
const métierMatch = this.#actorMatchesSpellGrant(actor, spell)
|
||||||
[`system.${resource}.points`]: Math.max(Number(actor.system?.[resource]?.points ?? 0) - effectiveCost, 0),
|
const surcharge = !métierMatch
|
||||||
})
|
const effectiveCost = Number(data.actualCost ?? 0) * (surcharge ? 2 : 1)
|
||||||
|
const paymentMode = String(data.paymentMode || "points")
|
||||||
|
if (paymentMode === "points") {
|
||||||
|
const resource = spell.system.polarity || "songes"
|
||||||
|
const available = Number(actor.system?.[resource]?.points ?? 0)
|
||||||
|
if (available < effectiveCost) {
|
||||||
|
ui.notifications.warn(game.i18n.format("LESOUBLIES.rolls.notEnoughResourceDetailed", {
|
||||||
|
resource: resource === "songes" ? game.i18n.localize("LESOUBLIES.ui.songes") : game.i18n.localize("LESOUBLIES.ui.cauchemar"),
|
||||||
|
actor: actor.name,
|
||||||
|
required: effectiveCost,
|
||||||
|
available,
|
||||||
|
}))
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
if (effectiveCost > 0) {
|
||||||
|
await actor.update({
|
||||||
|
[`system.${resource}.points`]: Math.max(available - effectiveCost, 0),
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
return { métierMatch, surcharge, effectiveCost, paymentMode }
|
||||||
|
})
|
||||||
|
if (!activation) return null
|
||||||
|
|
||||||
const content = await foundry.applications.handlebars.renderTemplate(
|
const content = await foundry.applications.handlebars.renderTemplate(
|
||||||
"systems/fvtt-les-oublies/templates/chat-spell-activation.hbs",
|
"systems/fvtt-les-oublies/templates/chat-spell-activation.hbs",
|
||||||
@@ -442,14 +481,14 @@ export class LesOubliesRolls {
|
|||||||
spell,
|
spell,
|
||||||
activation: {
|
activation: {
|
||||||
targetLabel: data.targetLabel?.trim() || "Sans cible précisée",
|
targetLabel: data.targetLabel?.trim() || "Sans cible précisée",
|
||||||
paymentMode,
|
paymentMode: activation.paymentMode,
|
||||||
actualCost: Number(data.actualCost ?? 0),
|
actualCost: Number(data.actualCost ?? 0),
|
||||||
effectiveCost,
|
effectiveCost: activation.effectiveCost,
|
||||||
costLabel: paymentMode === "points"
|
costLabel: activation.paymentMode === "points"
|
||||||
? `${effectiveCost} point${effectiveCost > 1 ? "s" : ""} de ${spell.system.polarity === "cauchemar" ? "Cauchemar" : "Songes"}`
|
? `${activation.effectiveCost} point${activation.effectiveCost > 1 ? "s" : ""} de ${spell.system.polarity === "cauchemar" ? "Cauchemar" : "Songes"}`
|
||||||
: `${effectiveCost} fil${effectiveCost > 1 ? "s" : ""} de ${spell.system.polarity === "cauchemar" ? "Cauchemar" : "Songes"}`,
|
: `${activation.effectiveCost} fil${activation.effectiveCost > 1 ? "s" : ""} de ${spell.system.polarity === "cauchemar" ? "Cauchemar" : "Songes"}`,
|
||||||
métierMatch,
|
métierMatch: activation.métierMatch,
|
||||||
surcharge,
|
surcharge: activation.surcharge,
|
||||||
notes: data.notes?.trim() || "",
|
notes: data.notes?.trim() || "",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -495,6 +534,7 @@ export class LesOubliesRolls {
|
|||||||
const targetActor = this.#getTargetActor()
|
const targetActor = this.#getTargetActor()
|
||||||
const data = await this.#promptPresetConfrontationOptions(actor, preset, targetActor)
|
const data = await this.#promptPresetConfrontationOptions(actor, preset, targetActor)
|
||||||
if (!data) return null
|
if (!data) return null
|
||||||
|
const defenderActor = this.#resolveDialogTargetActor(data.defenderActorId, targetActor)
|
||||||
|
|
||||||
const modifiers = this.#resolveModifierSelection(data.primeId, data.penaltyId, actionKey)
|
const modifiers = this.#resolveModifierSelection(data.primeId, data.penaltyId, actionKey)
|
||||||
const actionData = {
|
const actionData = {
|
||||||
@@ -504,8 +544,8 @@ export class LesOubliesRolls {
|
|||||||
hint: preset.hint,
|
hint: preset.hint,
|
||||||
modifiers,
|
modifiers,
|
||||||
notes: data.notes?.trim() || "",
|
notes: data.notes?.trim() || "",
|
||||||
targetLabel: data.defenderLabel,
|
targetLabel: defenderActor?.name ?? data.defenderLabel,
|
||||||
targetActor,
|
targetActor: defenderActor,
|
||||||
applyToTarget: false,
|
applyToTarget: false,
|
||||||
outcome: this.#buildPresetOutcome(actionKey, data),
|
outcome: this.#buildPresetOutcome(actionKey, data),
|
||||||
}
|
}
|
||||||
@@ -518,18 +558,18 @@ export class LesOubliesRolls {
|
|||||||
attackerRollMode: data.attackerRollMode,
|
attackerRollMode: data.attackerRollMode,
|
||||||
attackerExtraDie: data.attackerExtraDie,
|
attackerExtraDie: data.attackerExtraDie,
|
||||||
attackerFinalModifier: modifiers.summary.finalModifier,
|
attackerFinalModifier: modifiers.summary.finalModifier,
|
||||||
defenderLabel: data.defenderLabel,
|
defenderLabel: defenderActor?.name ?? data.defenderLabel,
|
||||||
defenderScore: targetActor
|
defenderScore: defenderActor
|
||||||
? this.#getSkillScoreWithAlternatives(targetActor, preset.defenderSkillKey)
|
? this.#getSkillScoreWithAlternatives(defenderActor, preset.defenderSkillKey)
|
||||||
: Number(data.defenderScore ?? 0),
|
: Number(data.defenderScore ?? 0),
|
||||||
defenderDifficulty: Number(data.defenderDifficulty ?? 0),
|
defenderDifficulty: Number(data.defenderDifficulty ?? 0),
|
||||||
defenderRollMode: data.defenderRollMode,
|
defenderRollMode: data.defenderRollMode,
|
||||||
defenderExtraDie: data.defenderExtraDie,
|
defenderExtraDie: data.defenderExtraDie,
|
||||||
defenderFinalModifier: modifiers.summary.opponentFinalModifier,
|
defenderFinalModifier: modifiers.summary.opponentFinalModifier,
|
||||||
defenderSongesValue: targetActor ? Number(targetActor.system.songes?.value ?? 0) : Number(data.defenderSongesValue ?? 0),
|
defenderSongesValue: defenderActor ? Number(defenderActor.system.songes?.value ?? 0) : Number(data.defenderSongesValue ?? 0),
|
||||||
defenderSongesPoints: targetActor ? Number(targetActor.system.songes?.points ?? 0) : Number(data.defenderSongesPoints ?? 0),
|
defenderSongesPoints: defenderActor ? Number(defenderActor.system.songes?.points ?? 0) : Number(data.defenderSongesPoints ?? 0),
|
||||||
defenderCauchemarValue: targetActor ? Number(targetActor.system.cauchemar?.value ?? 0) : Number(data.defenderCauchemarValue ?? 0),
|
defenderCauchemarValue: defenderActor ? Number(defenderActor.system.cauchemar?.value ?? 0) : Number(data.defenderCauchemarValue ?? 0),
|
||||||
defenderCauchemarPoints: targetActor ? Number(targetActor.system.cauchemar?.points ?? 0) : Number(data.defenderCauchemarPoints ?? 0),
|
defenderCauchemarPoints: defenderActor ? Number(defenderActor.system.cauchemar?.points ?? 0) : Number(data.defenderCauchemarPoints ?? 0),
|
||||||
}, actionData)
|
}, actionData)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -761,17 +801,19 @@ export class LesOubliesRolls {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static async #promptTestOptions(actor, preset = {}) {
|
static async #promptTestOptions(actor, preset = {}) {
|
||||||
|
const difficulty = Number(preset.difficulty ?? 0)
|
||||||
const content = await foundry.applications.handlebars.renderTemplate(
|
const content = await foundry.applications.handlebars.renderTemplate(
|
||||||
"systems/fvtt-les-oublies/templates/dialog-roll-test.hbs",
|
"systems/fvtt-les-oublies/templates/dialog-roll-test.hbs",
|
||||||
{
|
{
|
||||||
actor,
|
actor,
|
||||||
rollModes: this.getRollModes(),
|
rollModes: this.getRollModes(),
|
||||||
extraDieModes: this.getExtraDieModes(),
|
extraDieModes: this.getExtraDieModes(),
|
||||||
|
difficultyOptions: this.#getDifficultyOptions(TEST_DIFFICULTIES, difficulty),
|
||||||
resources: this.#getDialogResources(actor),
|
resources: this.#getDialogResources(actor),
|
||||||
values: {
|
values: {
|
||||||
label: preset.label ?? "",
|
label: preset.label ?? "",
|
||||||
score: Number(preset.score ?? 0),
|
score: Number(preset.score ?? 0),
|
||||||
difficulty: Number(preset.difficulty ?? 0),
|
difficulty,
|
||||||
rollMode: preset.rollMode ?? this.getDefaultRollMode(actor),
|
rollMode: preset.rollMode ?? this.getDefaultRollMode(actor),
|
||||||
extraDie: preset.extraDie ?? "",
|
extraDie: preset.extraDie ?? "",
|
||||||
},
|
},
|
||||||
@@ -816,10 +858,15 @@ export class LesOubliesRolls {
|
|||||||
|
|
||||||
static async #promptConfrontationOptions(actor, preset = {}) {
|
static async #promptConfrontationOptions(actor, preset = {}) {
|
||||||
const targetActor = preset.targetActor ?? this.#getTargetActor()
|
const targetActor = preset.targetActor ?? this.#getTargetActor()
|
||||||
|
const defenderSkill = preset.defenderSkill ?? "esquive"
|
||||||
const content = await foundry.applications.handlebars.renderTemplate(
|
const content = await foundry.applications.handlebars.renderTemplate(
|
||||||
"systems/fvtt-les-oublies/templates/dialog-roll-confrontation.hbs",
|
"systems/fvtt-les-oublies/templates/dialog-roll-confrontation.hbs",
|
||||||
{
|
{
|
||||||
actor,
|
actor,
|
||||||
|
targetActor,
|
||||||
|
targetStatus: this.#getConfrontationTargetStatus(targetActor),
|
||||||
|
targetOptions: this.#getConfrontationTargetOptions(actor, targetActor),
|
||||||
|
defenderSkillOptions: this.#getConfrontationSkillOptions(),
|
||||||
rollModes: this.getRollModes(),
|
rollModes: this.getRollModes(),
|
||||||
extraDieModes: this.getExtraDieModes(),
|
extraDieModes: this.getExtraDieModes(),
|
||||||
defaultRollMode: this.getDefaultRollMode(actor),
|
defaultRollMode: this.getDefaultRollMode(actor),
|
||||||
@@ -837,7 +884,11 @@ export class LesOubliesRolls {
|
|||||||
attackerRollMode: preset.attackerRollMode ?? this.getDefaultRollMode(actor),
|
attackerRollMode: preset.attackerRollMode ?? this.getDefaultRollMode(actor),
|
||||||
attackerExtraDie: preset.attackerExtraDie ?? "",
|
attackerExtraDie: preset.attackerExtraDie ?? "",
|
||||||
defenderLabel: targetActor?.name ?? preset.defenderLabel ?? game.i18n.localize("LESOUBLIES.rolls.defender"),
|
defenderLabel: targetActor?.name ?? preset.defenderLabel ?? game.i18n.localize("LESOUBLIES.rolls.defender"),
|
||||||
defenderScore: Number(preset.defenderScore ?? 0),
|
defenderActorId: targetActor?.id ?? "",
|
||||||
|
defenderSkill,
|
||||||
|
defenderScore: targetActor
|
||||||
|
? this.#getSkillScoreWithAlternatives(targetActor, defenderSkill)
|
||||||
|
: Number(preset.defenderScore ?? 0),
|
||||||
defenderDifficulty: Number(preset.defenderDifficulty ?? 0),
|
defenderDifficulty: Number(preset.defenderDifficulty ?? 0),
|
||||||
defenderRollMode: preset.defenderRollMode ?? this.getDefaultRollMode(targetActor ?? actor),
|
defenderRollMode: preset.defenderRollMode ?? this.getDefaultRollMode(targetActor ?? actor),
|
||||||
defenderExtraDie: preset.defenderExtraDie ?? "",
|
defenderExtraDie: preset.defenderExtraDie ?? "",
|
||||||
@@ -851,6 +902,13 @@ export class LesOubliesRolls {
|
|||||||
title: game.i18n.localize("LESOUBLIES.rolls.dialogs.confrontationTitle"),
|
title: game.i18n.localize("LESOUBLIES.rolls.dialogs.confrontationTitle"),
|
||||||
},
|
},
|
||||||
content,
|
content,
|
||||||
|
render: (_event, dialog) => {
|
||||||
|
this.#bindConfrontationTargetSelection(dialog, {
|
||||||
|
actor,
|
||||||
|
fallbackTargetActor: targetActor,
|
||||||
|
skillFieldName: "defenderSkill",
|
||||||
|
})
|
||||||
|
},
|
||||||
buttons: [
|
buttons: [
|
||||||
{
|
{
|
||||||
action: "roll",
|
action: "roll",
|
||||||
@@ -867,6 +925,8 @@ export class LesOubliesRolls {
|
|||||||
attackerDifficulty: Number(data.attackerDifficulty ?? 0),
|
attackerDifficulty: Number(data.attackerDifficulty ?? 0),
|
||||||
attackerRollMode: String(data.attackerRollMode || this.getDefaultRollMode(actor)),
|
attackerRollMode: String(data.attackerRollMode || this.getDefaultRollMode(actor)),
|
||||||
attackerExtraDie: String(data.attackerExtraDie || ""),
|
attackerExtraDie: String(data.attackerExtraDie || ""),
|
||||||
|
defenderActorId: String(data.defenderActorId || ""),
|
||||||
|
defenderSkill: String(data.defenderSkill || defenderSkill),
|
||||||
defenderLabel: String(data.defenderLabel || targetActor?.name || game.i18n.localize("LESOUBLIES.rolls.defender")).trim(),
|
defenderLabel: String(data.defenderLabel || targetActor?.name || game.i18n.localize("LESOUBLIES.rolls.defender")).trim(),
|
||||||
defenderScore: Number(data.defenderScore ?? 0),
|
defenderScore: Number(data.defenderScore ?? 0),
|
||||||
defenderDifficulty: Number(data.defenderDifficulty ?? 0),
|
defenderDifficulty: Number(data.defenderDifficulty ?? 0),
|
||||||
@@ -892,7 +952,7 @@ export class LesOubliesRolls {
|
|||||||
const baseDamage = this.#getWeaponBaseDamage(actor, weapon)
|
const baseDamage = this.#getWeaponBaseDamage(actor, weapon)
|
||||||
const baseDamageLabel = weapon?.system?.damage || String(baseDamage)
|
const baseDamageLabel = weapon?.system?.damage || String(baseDamage)
|
||||||
const content = await foundry.applications.handlebars.renderTemplate(
|
const content = await foundry.applications.handlebars.renderTemplate(
|
||||||
"systems/fvtt-les-oublies/templates/dialog-roll-attack.hbs",
|
"systems/fvtt-les-oublies/templates/dialog-roll-attack-v2.hbs",
|
||||||
{
|
{
|
||||||
actor,
|
actor,
|
||||||
weapon,
|
weapon,
|
||||||
@@ -905,6 +965,10 @@ export class LesOubliesRolls {
|
|||||||
cauchemarPoints: 0,
|
cauchemarPoints: 0,
|
||||||
},
|
},
|
||||||
targetActor,
|
targetActor,
|
||||||
|
targetStatus: this.#getConfrontationTargetStatus(targetActor, { requireTarget: true }),
|
||||||
|
targetOptions: this.#getConfrontationTargetOptions(actor, targetActor).map((entry, index) => (
|
||||||
|
index === 0 ? { ...entry, label: "— Sélectionner un adversaire —" } : entry
|
||||||
|
)),
|
||||||
rollModes: this.getRollModes(),
|
rollModes: this.getRollModes(),
|
||||||
extraDieModes: this.getExtraDieModes(),
|
extraDieModes: this.getExtraDieModes(),
|
||||||
attackSkills: this.#getAttackSkillOptions(attackMode),
|
attackSkills: this.#getAttackSkillOptions(attackMode),
|
||||||
@@ -917,6 +981,7 @@ export class LesOubliesRolls {
|
|||||||
attackerRollMode: this.getDefaultRollMode(actor),
|
attackerRollMode: this.getDefaultRollMode(actor),
|
||||||
attackerExtraDie: "",
|
attackerExtraDie: "",
|
||||||
defenderLabel: targetActor?.name ?? game.i18n.localize("LESOUBLIES.rolls.defender"),
|
defenderLabel: targetActor?.name ?? game.i18n.localize("LESOUBLIES.rolls.defender"),
|
||||||
|
defenderActorId: targetActor?.id ?? "",
|
||||||
defenderSkill: attackMode === "ranged" ? "esquive" : "esquive",
|
defenderSkill: attackMode === "ranged" ? "esquive" : "esquive",
|
||||||
defenderScore: 0,
|
defenderScore: 0,
|
||||||
defenderDifficulty: 0,
|
defenderDifficulty: 0,
|
||||||
@@ -940,6 +1005,14 @@ export class LesOubliesRolls {
|
|||||||
title: attackMode === "ranged" ? "Attaque à distance" : "Attaque de mêlée",
|
title: attackMode === "ranged" ? "Attaque à distance" : "Attaque de mêlée",
|
||||||
},
|
},
|
||||||
content,
|
content,
|
||||||
|
render: (_event, dialog) => {
|
||||||
|
this.#bindConfrontationTargetSelection(dialog, {
|
||||||
|
actor,
|
||||||
|
fallbackTargetActor: targetActor,
|
||||||
|
skillFieldName: "defenderSkill",
|
||||||
|
requireTarget: true,
|
||||||
|
})
|
||||||
|
},
|
||||||
buttons: [
|
buttons: [
|
||||||
{
|
{
|
||||||
action: "roll",
|
action: "roll",
|
||||||
@@ -949,12 +1022,19 @@ export class LesOubliesRolls {
|
|||||||
const form = this.#getDialogElement(dialog)?.querySelector("form")
|
const form = this.#getDialogElement(dialog)?.querySelector("form")
|
||||||
if (!form) return null
|
if (!form) return null
|
||||||
const data = this.#formToObject(form)
|
const data = this.#formToObject(form)
|
||||||
|
const defenderActor = this.#resolveDialogTargetActor(data.defenderActorId, targetActor)
|
||||||
|
if (!defenderActor) {
|
||||||
|
ui.notifications.info("Aucune cible sélectionnée : choisissez un adversaire avant de lancer une attaque.")
|
||||||
|
dialog.close()
|
||||||
|
return null
|
||||||
|
}
|
||||||
const difficultyPreset = Number(data.difficultyPreset ?? 0)
|
const difficultyPreset = Number(data.difficultyPreset ?? 0)
|
||||||
const customDifficulty = Number(data.customDifficulty ?? 0)
|
const customDifficulty = Number(data.customDifficulty ?? 0)
|
||||||
return {
|
return {
|
||||||
attackerSkill: String(data.attackerSkill || (attackMode === "ranged" ? "tir" : "melee")),
|
attackerSkill: String(data.attackerSkill || (attackMode === "ranged" ? "tir" : "melee")),
|
||||||
attackerRollMode: String(data.attackerRollMode || this.getDefaultRollMode(actor)),
|
attackerRollMode: String(data.attackerRollMode || this.getDefaultRollMode(actor)),
|
||||||
attackerExtraDie: String(data.attackerExtraDie || ""),
|
attackerExtraDie: String(data.attackerExtraDie || ""),
|
||||||
|
defenderActorId: String(data.defenderActorId || ""),
|
||||||
defenderLabel: String(data.defenderLabel || targetActor?.name || game.i18n.localize("LESOUBLIES.rolls.defender")).trim(),
|
defenderLabel: String(data.defenderLabel || targetActor?.name || game.i18n.localize("LESOUBLIES.rolls.defender")).trim(),
|
||||||
defenderSkill: String(data.defenderSkill || "esquive"),
|
defenderSkill: String(data.defenderSkill || "esquive"),
|
||||||
defenderScore: Number(data.defenderScore ?? 0),
|
defenderScore: Number(data.defenderScore ?? 0),
|
||||||
@@ -1044,17 +1124,22 @@ export class LesOubliesRolls {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static async #promptSpellOptions(actor, spell) {
|
static async #promptSpellOptions(actor, spell) {
|
||||||
|
const isMetierMatch = this.#actorMatchesSpellGrant(actor, spell)
|
||||||
|
const effectiveCost = Number(spell.system.cost ?? 0) * (isMetierMatch ? 1 : 2)
|
||||||
|
const polarityLabel = spell.system.polarity === "cauchemar"
|
||||||
|
? game.i18n.localize("LESOUBLIES.ui.cauchemar")
|
||||||
|
: game.i18n.localize("LESOUBLIES.ui.songes")
|
||||||
const content = await foundry.applications.handlebars.renderTemplate(
|
const content = await foundry.applications.handlebars.renderTemplate(
|
||||||
"systems/fvtt-les-oublies/templates/dialog-spell-activation.hbs",
|
"systems/fvtt-les-oublies/templates/dialog-spell-activation.hbs",
|
||||||
{
|
{
|
||||||
actor,
|
actor,
|
||||||
spell,
|
spell,
|
||||||
resources: this.#getDialogResources(actor),
|
resources: this.#getDialogResources(actor),
|
||||||
isMetierMatch: this.#actorMatchesSpellGrant(actor, spell),
|
isMetierMatch,
|
||||||
|
effectiveCostLabel: `${effectiveCost} point${effectiveCost > 1 ? "s" : ""} de ${polarityLabel}`,
|
||||||
values: {
|
values: {
|
||||||
actualCost: Number(spell.system.cost ?? 0),
|
actualCost: Number(spell.system.cost ?? 0),
|
||||||
paymentMode: "points",
|
paymentMode: "points",
|
||||||
applyMetierSurcharge: true,
|
|
||||||
targetLabel: "",
|
targetLabel: "",
|
||||||
notes: "",
|
notes: "",
|
||||||
},
|
},
|
||||||
@@ -1078,7 +1163,6 @@ export class LesOubliesRolls {
|
|||||||
return {
|
return {
|
||||||
actualCost: Number(data.actualCost ?? spell.system.cost ?? 0),
|
actualCost: Number(data.actualCost ?? spell.system.cost ?? 0),
|
||||||
paymentMode: String(data.paymentMode || "points"),
|
paymentMode: String(data.paymentMode || "points"),
|
||||||
applyMetierSurcharge: data.applyMetierSurcharge === "on",
|
|
||||||
targetLabel: String(data.targetLabel || ""),
|
targetLabel: String(data.targetLabel || ""),
|
||||||
notes: String(data.notes || ""),
|
notes: String(data.notes || ""),
|
||||||
}
|
}
|
||||||
@@ -1164,6 +1248,9 @@ export class LesOubliesRolls {
|
|||||||
title: preset.title,
|
title: preset.title,
|
||||||
hint: preset.hint,
|
hint: preset.hint,
|
||||||
targetActor,
|
targetActor,
|
||||||
|
targetStatus: this.#getConfrontationTargetStatus(targetActor),
|
||||||
|
defenderSkillLabel: this.#getSkillLabel(preset.defenderSkillKey),
|
||||||
|
targetOptions: this.#getConfrontationTargetOptions(actor, targetActor),
|
||||||
rollModes: this.getRollModes(),
|
rollModes: this.getRollModes(),
|
||||||
extraDieModes: this.getExtraDieModes(),
|
extraDieModes: this.getExtraDieModes(),
|
||||||
attackerResources: this.#getDialogResources(actor),
|
attackerResources: this.#getDialogResources(actor),
|
||||||
@@ -1178,12 +1265,15 @@ export class LesOubliesRolls {
|
|||||||
values: {
|
values: {
|
||||||
attackerDifficulty: Number(preset.difficulty ?? 0),
|
attackerDifficulty: Number(preset.difficulty ?? 0),
|
||||||
defenderLabel: targetActor?.name ?? game.i18n.localize("LESOUBLIES.rolls.defender"),
|
defenderLabel: targetActor?.name ?? game.i18n.localize("LESOUBLIES.rolls.defender"),
|
||||||
|
defenderActorId: targetActor?.id ?? "",
|
||||||
defenderDifficulty: 0,
|
defenderDifficulty: 0,
|
||||||
attackerRollMode: this.getDefaultRollMode(actor),
|
attackerRollMode: this.getDefaultRollMode(actor),
|
||||||
attackerExtraDie: "",
|
attackerExtraDie: "",
|
||||||
defenderRollMode: this.getDefaultRollMode(targetActor ?? actor),
|
defenderRollMode: this.getDefaultRollMode(targetActor ?? actor),
|
||||||
defenderExtraDie: "",
|
defenderExtraDie: "",
|
||||||
defenderScore: 0,
|
defenderScore: targetActor
|
||||||
|
? this.#getSkillScoreWithAlternatives(targetActor, preset.defenderSkillKey)
|
||||||
|
: 0,
|
||||||
primeId: "none",
|
primeId: "none",
|
||||||
penaltyId: "none",
|
penaltyId: "none",
|
||||||
outcomeChoice: "",
|
outcomeChoice: "",
|
||||||
@@ -1201,6 +1291,13 @@ export class LesOubliesRolls {
|
|||||||
title: preset.title,
|
title: preset.title,
|
||||||
},
|
},
|
||||||
content,
|
content,
|
||||||
|
render: (_event, dialog) => {
|
||||||
|
this.#bindConfrontationTargetSelection(dialog, {
|
||||||
|
actor,
|
||||||
|
fallbackTargetActor: targetActor,
|
||||||
|
skillKey: preset.defenderSkillKey,
|
||||||
|
})
|
||||||
|
},
|
||||||
buttons: [
|
buttons: [
|
||||||
{
|
{
|
||||||
action: "roll",
|
action: "roll",
|
||||||
@@ -1212,6 +1309,7 @@ export class LesOubliesRolls {
|
|||||||
const data = this.#formToObject(form)
|
const data = this.#formToObject(form)
|
||||||
return {
|
return {
|
||||||
attackerDifficulty: Number(data.attackerDifficulty ?? preset.difficulty ?? 0),
|
attackerDifficulty: Number(data.attackerDifficulty ?? preset.difficulty ?? 0),
|
||||||
|
defenderActorId: String(data.defenderActorId || ""),
|
||||||
defenderLabel: String(data.defenderLabel || targetActor?.name || game.i18n.localize("LESOUBLIES.rolls.defender")).trim(),
|
defenderLabel: String(data.defenderLabel || targetActor?.name || game.i18n.localize("LESOUBLIES.rolls.defender")).trim(),
|
||||||
defenderDifficulty: Number(data.defenderDifficulty ?? 0),
|
defenderDifficulty: Number(data.defenderDifficulty ?? 0),
|
||||||
attackerRollMode: String(data.attackerRollMode || this.getDefaultRollMode(actor)),
|
attackerRollMode: String(data.attackerRollMode || this.getDefaultRollMode(actor)),
|
||||||
@@ -1498,7 +1596,7 @@ export class LesOubliesRolls {
|
|||||||
|
|
||||||
static #getWeaponAttackMode(weapon) {
|
static #getWeaponAttackMode(weapon) {
|
||||||
const category = String(weapon?.system?.category || "").toLowerCase()
|
const category = String(weapon?.system?.category || "").toLowerCase()
|
||||||
if (["distance", "ranged", "tir", "projectile"].some((keyword) => category.includes(keyword))) return "ranged"
|
if (["distance", "ranged", "tir", "projectile", "jet"].some((keyword) => category.includes(keyword))) return "ranged"
|
||||||
return "melee"
|
return "melee"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1528,6 +1626,166 @@ export class LesOubliesRolls {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static #getConfrontationTargetOptions(actor, selectedActor = null) {
|
||||||
|
const choices = LesOubliesUtility.sortByName(
|
||||||
|
game.actors.filter((candidate) => (
|
||||||
|
["creature", "personnage"].includes(candidate.type)
|
||||||
|
&& candidate.id !== actor?.id
|
||||||
|
)),
|
||||||
|
).map((candidate) => ({
|
||||||
|
value: candidate.id,
|
||||||
|
label: `${candidate.name} — ${game.i18n.localize(`TYPES.Actor.${candidate.type}`)}`,
|
||||||
|
}))
|
||||||
|
|
||||||
|
return [
|
||||||
|
{ value: "", label: "Saisie manuelle" },
|
||||||
|
...LesOubliesUtility.ensureChoice(
|
||||||
|
choices,
|
||||||
|
selectedActor?.id,
|
||||||
|
selectedActor ? `${selectedActor.name} — ${game.i18n.localize(`TYPES.Actor.${selectedActor.type}`)}` : null,
|
||||||
|
),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
static #getConfrontationSkillOptions() {
|
||||||
|
const skills = CONFIG.LESOUBLIES?.config?.skills ?? CONFIG.LESOUBLIES?.skills ?? {}
|
||||||
|
return Object.entries(skills)
|
||||||
|
.map(([value, data]) => ({
|
||||||
|
value,
|
||||||
|
label: data.label ?? value,
|
||||||
|
}))
|
||||||
|
.sort((left, right) => left.label.localeCompare(right.label, "fr"))
|
||||||
|
}
|
||||||
|
|
||||||
|
static #resolveDialogTargetActor(actorId, fallbackTargetActor = null) {
|
||||||
|
if (actorId !== undefined && actorId !== null && actorId !== "") {
|
||||||
|
return game.actors.get(String(actorId)) ?? null
|
||||||
|
}
|
||||||
|
if (actorId === "") return null
|
||||||
|
return fallbackTargetActor ?? null
|
||||||
|
}
|
||||||
|
|
||||||
|
static #getConfrontationTargetStatus(targetActor = null, { requireTarget = false } = {}) {
|
||||||
|
if (!targetActor) {
|
||||||
|
return {
|
||||||
|
message: requireTarget
|
||||||
|
? "Aucune cible n'est actuellement sélectionnée. Sélectionnez un adversaire dans la liste ci-dessous pour lancer l'attaque."
|
||||||
|
: "Aucune cible n'est actuellement sélectionnée. Choisissez un adversaire dans la liste ci-dessous ou conservez la saisie manuelle.",
|
||||||
|
state: "empty",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
message: `Adversaire sélectionné : ${targetActor.name}. Ses valeurs de confrontation sont utilisées automatiquement.`,
|
||||||
|
state: "selected",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static #bindConfrontationTargetSelection(dialog, {
|
||||||
|
actor,
|
||||||
|
fallbackTargetActor = null,
|
||||||
|
skillFieldName = null,
|
||||||
|
skillKey = null,
|
||||||
|
requireTarget = false,
|
||||||
|
} = {}) {
|
||||||
|
const root = this.#getDialogElement(dialog)
|
||||||
|
const form = root?.querySelector("form")
|
||||||
|
if (!form) return
|
||||||
|
|
||||||
|
const actorField = form.elements.namedItem("defenderActorId")
|
||||||
|
if (!(actorField instanceof HTMLSelectElement)) return
|
||||||
|
|
||||||
|
const labelField = form.elements.namedItem("defenderLabel")
|
||||||
|
const scoreField = form.elements.namedItem("defenderScore")
|
||||||
|
const rollModeField = form.elements.namedItem("defenderRollMode")
|
||||||
|
const songesValueField = form.elements.namedItem("defenderSongesValue")
|
||||||
|
const songesPointsField = form.elements.namedItem("defenderSongesPoints")
|
||||||
|
const cauchemarValueField = form.elements.namedItem("defenderCauchemarValue")
|
||||||
|
const cauchemarPointsField = form.elements.namedItem("defenderCauchemarPoints")
|
||||||
|
const skillField = skillFieldName ? form.elements.namedItem(skillFieldName) : null
|
||||||
|
const targetStatusField = root.querySelector("[data-target-status]")
|
||||||
|
|
||||||
|
const defaultLabel = game.i18n.localize("LESOUBLIES.rolls.defender")
|
||||||
|
const getSelectedSkill = () => {
|
||||||
|
if (skillKey) return skillKey
|
||||||
|
if (skillField instanceof HTMLSelectElement) return String(skillField.value || "melee")
|
||||||
|
return "melee"
|
||||||
|
}
|
||||||
|
|
||||||
|
const updateTargetFields = ({ preserveRollMode = false } = {}) => {
|
||||||
|
const targetActor = this.#resolveDialogTargetActor(actorField.value, fallbackTargetActor)
|
||||||
|
const hasActor = Boolean(targetActor)
|
||||||
|
const currentSkill = getSelectedSkill()
|
||||||
|
|
||||||
|
if (targetStatusField instanceof HTMLElement) {
|
||||||
|
const targetStatus = this.#getConfrontationTargetStatus(targetActor, { requireTarget })
|
||||||
|
targetStatusField.textContent = targetStatus.message
|
||||||
|
targetStatusField.dataset.state = targetStatus.state
|
||||||
|
}
|
||||||
|
|
||||||
|
if (labelField instanceof HTMLInputElement) {
|
||||||
|
labelField.value = hasActor ? targetActor.name : (labelField.value || defaultLabel)
|
||||||
|
labelField.readOnly = hasActor
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scoreField instanceof HTMLInputElement) {
|
||||||
|
if (hasActor) {
|
||||||
|
scoreField.value = String(this.#getSkillScoreWithAlternatives(targetActor, currentSkill))
|
||||||
|
}
|
||||||
|
scoreField.readOnly = hasActor
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rollModeField instanceof HTMLSelectElement && hasActor && !preserveRollMode) {
|
||||||
|
rollModeField.value = this.getDefaultRollMode(targetActor)
|
||||||
|
}
|
||||||
|
|
||||||
|
const resourceValues = hasActor
|
||||||
|
? {
|
||||||
|
songesValue: Number(targetActor.system.songes?.value ?? 0),
|
||||||
|
songesPoints: Number(targetActor.system.songes?.points ?? 0),
|
||||||
|
cauchemarValue: Number(targetActor.system.cauchemar?.value ?? 0),
|
||||||
|
cauchemarPoints: Number(targetActor.system.cauchemar?.points ?? 0),
|
||||||
|
}
|
||||||
|
: null
|
||||||
|
|
||||||
|
const bindNumericField = (field, value) => {
|
||||||
|
if (!(field instanceof HTMLInputElement)) return
|
||||||
|
if (resourceValues) field.value = String(value)
|
||||||
|
field.readOnly = hasActor
|
||||||
|
}
|
||||||
|
|
||||||
|
bindNumericField(songesValueField, resourceValues?.songesValue ?? 0)
|
||||||
|
bindNumericField(songesPointsField, resourceValues?.songesPoints ?? 0)
|
||||||
|
bindNumericField(cauchemarValueField, resourceValues?.cauchemarValue ?? 0)
|
||||||
|
bindNumericField(cauchemarPointsField, resourceValues?.cauchemarPoints ?? 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
actorField.addEventListener("change", () => updateTargetFields())
|
||||||
|
if (skillField instanceof HTMLSelectElement) {
|
||||||
|
skillField.addEventListener("change", () => updateTargetFields({ preserveRollMode: true }))
|
||||||
|
}
|
||||||
|
updateTargetFields()
|
||||||
|
}
|
||||||
|
|
||||||
|
static async #withActorLock(lockKey, callback) {
|
||||||
|
const previous = this.#actorLocks.get(lockKey) ?? Promise.resolve()
|
||||||
|
let release
|
||||||
|
const current = new Promise((resolve) => {
|
||||||
|
release = resolve
|
||||||
|
})
|
||||||
|
const queued = previous.finally(() => current)
|
||||||
|
this.#actorLocks.set(lockKey, queued)
|
||||||
|
await previous
|
||||||
|
try {
|
||||||
|
return await callback()
|
||||||
|
} finally {
|
||||||
|
release()
|
||||||
|
if (this.#actorLocks.get(lockKey) === queued) {
|
||||||
|
this.#actorLocks.delete(lockKey)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static #getModifierOptions(type, actionType) {
|
static #getModifierOptions(type, actionType) {
|
||||||
const source = type === "prime" ? PRIME_DEFINITIONS : PENALTY_DEFINITIONS
|
const source = type === "prime" ? PRIME_DEFINITIONS : PENALTY_DEFINITIONS
|
||||||
return source
|
return source
|
||||||
@@ -1677,6 +1935,21 @@ export class LesOubliesRolls {
|
|||||||
return parts.length ? parts.join(" ") : "0"
|
return parts.length ? parts.join(" ") : "0"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static #getDifficultyOptions(options, selectedValue = 0) {
|
||||||
|
const normalizedValue = Number(selectedValue ?? 0)
|
||||||
|
const entries = options.map((entry) => ({
|
||||||
|
value: Number(entry.value ?? 0),
|
||||||
|
label: entry.label,
|
||||||
|
}))
|
||||||
|
if (!entries.some((entry) => entry.value === normalizedValue)) {
|
||||||
|
entries.push({
|
||||||
|
value: normalizedValue,
|
||||||
|
label: `Personnalisée (${normalizedValue > 0 ? "+" : ""}${normalizedValue})`,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return entries
|
||||||
|
}
|
||||||
|
|
||||||
static #getConfrontationOutcome(attacker, defender) {
|
static #getConfrontationOutcome(attacker, defender) {
|
||||||
const attackerSuccess = attacker.success
|
const attackerSuccess = attacker.success
|
||||||
const defenderSuccess = defender.success
|
const defenderSuccess = defender.success
|
||||||
|
|||||||
@@ -44,6 +44,29 @@ export class LesOubliesUtility {
|
|||||||
return ITEM_IMAGES[type] ?? "icons/svg/item-bag.svg"
|
return ITEM_IMAGES[type] ?? "icons/svg/item-bag.svg"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static createChoices(values = [], labels = {}) {
|
||||||
|
return values.map((value) => ({
|
||||||
|
value,
|
||||||
|
label: labels[value] ?? String(value),
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
static createRangeChoices(min, max, labels = {}) {
|
||||||
|
return Array.from({ length: Math.max(max - min + 1, 0) }, (_, index) => min + index).map((value) => ({
|
||||||
|
value,
|
||||||
|
label: labels[value] ?? String(value),
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
static ensureChoice(choices = [], value, label = null) {
|
||||||
|
if (value === undefined || value === null || value === "") return choices
|
||||||
|
if (choices.some((choice) => String(choice.value) === String(value))) return choices
|
||||||
|
return [{
|
||||||
|
value,
|
||||||
|
label: label ?? `${value} (personnalisé)`,
|
||||||
|
}, ...choices]
|
||||||
|
}
|
||||||
|
|
||||||
static createEmptyProfiles() {
|
static createEmptyProfiles() {
|
||||||
return PROFILE_KEYS.reduce((profiles, key) => {
|
return PROFILE_KEYS.reduce((profiles, key) => {
|
||||||
profiles[key] = 0
|
profiles[key] = 0
|
||||||
@@ -73,4 +96,17 @@ export class LesOubliesUtility {
|
|||||||
static sortByName(documents = []) {
|
static sortByName(documents = []) {
|
||||||
return [...documents].sort((left, right) => left.name.localeCompare(right.name, "fr"))
|
return [...documents].sort((left, right) => left.name.localeCompare(right.name, "fr"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async prepareEnrichedHtml(documentName, type, systemData) {
|
||||||
|
const htmlFields = game.system.documentTypes?.[documentName]?.[type]?.htmlFields ?? []
|
||||||
|
const enriched = {}
|
||||||
|
|
||||||
|
for (const path of htmlFields) {
|
||||||
|
const value = foundry.utils.getProperty(systemData, path) ?? ""
|
||||||
|
const html = await foundry.applications.ux.TextEditor.implementation.enrichHTML(value, { async: true })
|
||||||
|
foundry.utils.setProperty(enriched, path, html)
|
||||||
|
}
|
||||||
|
|
||||||
|
return enriched
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Generated
+153
-1
@@ -11,7 +11,8 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"gulp": "^5.0.0",
|
"gulp": "^5.0.0",
|
||||||
"gulp-less": "^5.0.0",
|
"gulp-less": "^5.0.0",
|
||||||
"gulp-sourcemaps": "^3.0.0"
|
"gulp-sourcemaps": "^3.0.0",
|
||||||
|
"level": "^10.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@gulp-sourcemaps/identity-map": {
|
"node_modules/@gulp-sourcemaps/identity-map": {
|
||||||
@@ -136,6 +137,24 @@
|
|||||||
"node": ">=10.13.0"
|
"node": ">=10.13.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/abstract-level": {
|
||||||
|
"version": "3.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-3.1.1.tgz",
|
||||||
|
"integrity": "sha512-CW2gKbJFTuX1feMvOrvsVMmijAOgI9kg2Ie9Dq3gOcMt/dVVoVmqNlLcEUCT13NxHFMEajcUcVBIplbyDroDiw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"buffer": "^6.0.3",
|
||||||
|
"is-buffer": "^2.0.5",
|
||||||
|
"level-supports": "^6.2.0",
|
||||||
|
"level-transcoder": "^1.0.1",
|
||||||
|
"maybe-combine-errors": "^1.0.0",
|
||||||
|
"module-error": "^1.0.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/acorn": {
|
"node_modules/acorn": {
|
||||||
"version": "6.4.2",
|
"version": "6.4.2",
|
||||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
|
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
|
||||||
@@ -407,6 +426,16 @@
|
|||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/browser-level": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/browser-level/-/browser-level-3.0.0.tgz",
|
||||||
|
"integrity": "sha512-kGXtLh29jMwqKaskz5xeDLtCtN1KBz/DbQSqmvH7QdJiyGRC7RAM8PPg6gvUiNMa+wVnaxS9eSmEtP/f5ajOVw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"abstract-level": "^3.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/buffer": {
|
"node_modules/buffer": {
|
||||||
"version": "6.0.3",
|
"version": "6.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
|
||||||
@@ -474,6 +503,23 @@
|
|||||||
"fsevents": "~2.3.2"
|
"fsevents": "~2.3.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/classic-level": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/classic-level/-/classic-level-3.0.0.tgz",
|
||||||
|
"integrity": "sha512-yGy8j8LjPbN0Bh3+ygmyYvrmskVita92pD/zCoalfcC9XxZj6iDtZTAnz+ot7GG8p9KLTG+MZ84tSA4AhkgVZQ==",
|
||||||
|
"dev": true,
|
||||||
|
"hasInstallScript": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"abstract-level": "^3.1.0",
|
||||||
|
"module-error": "^1.0.1",
|
||||||
|
"napi-macros": "^2.2.2",
|
||||||
|
"node-gyp-build": "^4.3.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/cliui": {
|
"node_modules/cliui": {
|
||||||
"version": "7.0.4",
|
"version": "7.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
|
||||||
@@ -1396,6 +1442,30 @@
|
|||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/is-buffer": {
|
||||||
|
"version": "2.0.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
|
||||||
|
"integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
|
||||||
|
"dev": true,
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/feross"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "patreon",
|
||||||
|
"url": "https://www.patreon.com/feross"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "consulting",
|
||||||
|
"url": "https://feross.org/support"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/is-core-module": {
|
"node_modules/is-core-module": {
|
||||||
"version": "2.16.1",
|
"version": "2.16.1",
|
||||||
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
|
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
|
||||||
@@ -1637,6 +1707,49 @@
|
|||||||
"source-map": "~0.6.0"
|
"source-map": "~0.6.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/level": {
|
||||||
|
"version": "10.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/level/-/level-10.0.0.tgz",
|
||||||
|
"integrity": "sha512-aZJvdfRr/f0VBbSRF5C81FHON47ZsC2TkGxbBezXpGGXAUEL/s6+GP73nnhAYRSCIqUNsmJjfeOF4lzRDKbUig==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"abstract-level": "^3.1.0",
|
||||||
|
"browser-level": "^3.0.0",
|
||||||
|
"classic-level": "^3.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/level"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/level-supports": {
|
||||||
|
"version": "6.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/level-supports/-/level-supports-6.2.0.tgz",
|
||||||
|
"integrity": "sha512-QNxVXP0IRnBmMsJIh+sb2kwNCYcKciQZJEt+L1hPCHrKNELllXhvrlClVHXBYZVT+a7aTSM6StgNXdAldoab3w==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=16"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/level-transcoder": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz",
|
||||||
|
"integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"buffer": "^6.0.3",
|
||||||
|
"module-error": "^1.0.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/liftoff": {
|
"node_modules/liftoff": {
|
||||||
"version": "5.0.1",
|
"version": "5.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/liftoff/-/liftoff-5.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/liftoff/-/liftoff-5.0.1.tgz",
|
||||||
@@ -1691,6 +1804,16 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/maybe-combine-errors": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/maybe-combine-errors/-/maybe-combine-errors-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-eefp6IduNPT6fVdwPp+1NgD0PML1NU5P6j1Mj5nz1nidX8/sWY7119WL8vTAHgqfsY74TzW0w1XPgdYEKkGZ5A==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/memoizee": {
|
"node_modules/memoizee": {
|
||||||
"version": "0.4.17",
|
"version": "0.4.17",
|
||||||
"resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz",
|
"resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz",
|
||||||
@@ -1739,6 +1862,16 @@
|
|||||||
"node": ">=4"
|
"node": ">=4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/module-error": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz",
|
||||||
|
"integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/ms": {
|
"node_modules/ms": {
|
||||||
"version": "2.1.3",
|
"version": "2.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
||||||
@@ -1756,6 +1889,13 @@
|
|||||||
"node": ">= 10.13.0"
|
"node": ">= 10.13.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/napi-macros": {
|
||||||
|
"version": "2.2.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz",
|
||||||
|
"integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/needle": {
|
"node_modules/needle": {
|
||||||
"version": "3.5.0",
|
"version": "3.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/needle/-/needle-3.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/needle/-/needle-3.5.0.tgz",
|
||||||
@@ -1781,6 +1921,18 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
|
"node_modules/node-gyp-build": {
|
||||||
|
"version": "4.8.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz",
|
||||||
|
"integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"bin": {
|
||||||
|
"node-gyp-build": "bin.js",
|
||||||
|
"node-gyp-build-optional": "optional.js",
|
||||||
|
"node-gyp-build-test": "build-test.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/normalize-path": {
|
"node_modules/normalize-path": {
|
||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
|
||||||
|
|||||||
+3
-1
@@ -5,7 +5,8 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "gulp build",
|
"build": "node scripts/build-compendiums.mjs && gulp build",
|
||||||
|
"build:packs": "node scripts/build-compendiums.mjs",
|
||||||
"watch": "gulp watch"
|
"watch": "gulp watch"
|
||||||
},
|
},
|
||||||
"author": "Copilot",
|
"author": "Copilot",
|
||||||
@@ -13,6 +14,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"gulp": "^5.0.0",
|
"gulp": "^5.0.0",
|
||||||
"gulp-less": "^5.0.0",
|
"gulp-less": "^5.0.0",
|
||||||
|
"level": "^10.0.0",
|
||||||
"gulp-sourcemaps": "^3.0.0"
|
"gulp-sourcemaps": "^3.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
[
|
|
||||||
{ "name": "Akinakas", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Lance belgfolk à pique traversant les alliages.</p>", "category": "melee", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": 0, "damage": "Taille +0", "range": "", "properties": ["Blessure précise"], "restrictedRace": "", "quantity": 1, "price": 900, "equipped": false } },
|
|
||||||
{ "name": "Arc", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "", "category": "tir", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": 0, "damage": "Taille +0", "range": "75", "properties": ["Encocher une nouvelle flèche est une action libre"], "restrictedRace": "", "quantity": 1, "price": 360, "equipped": false } },
|
|
||||||
{ "name": "Arbalète", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Arme de tir du Petit Peuple listée dans le tableau des armes, sans prix explicite dans les tables de tarifs du livre.</p>", "category": "tir", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": 1, "damage": "Taille +1", "range": "100", "properties": ["Encocher un nouveau carreau est une action unique"], "restrictedRace": "", "quantity": 1, "price": 0, "equipped": false } },
|
|
||||||
{ "name": "Dague de Songiam", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Dague kobolde fine et discrète.</p>", "category": "melee", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": -1, "damage": "Taille -1", "range": "", "properties": ["Discrétion +3 en cas de fouille", "Blessure précise"], "restrictedRace": "", "quantity": 1, "price": 270, "equipped": false } },
|
|
||||||
{ "name": "Espadon huvon", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Grande épée forgée pour la musculature des korrigans.</p>", "category": "melee", "origin": "petitPeuple", "sizeMode": "fixe", "sizeValue": 4, "sizeModifier": 0, "damage": "4", "range": "", "properties": ["Korrigans", "Force 1"], "restrictedRace": "Korrigan", "quantity": 1, "price": 900, "equipped": false } },
|
|
||||||
{ "name": "Grifdrachat", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Pointe de métal recourbée capable de se glisser dans les interstices des armures.</p>", "category": "melee", "origin": "geant", "sizeMode": "fixe", "sizeValue": 3, "sizeModifier": 0, "damage": "3", "range": "", "properties": ["Blessure précise"], "restrictedRace": "", "quantity": 1, "price": 540, "equipped": false } },
|
|
||||||
{ "name": "Lance plume", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Lance incrustée d'une plume taillée, conçue pour les charges.</p>", "category": "melee", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": 1, "damage": "Taille +1", "range": "", "properties": ["Charge"], "restrictedRace": "", "quantity": 1, "price": 270, "equipped": false } },
|
|
||||||
{ "name": "Poignard", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "", "category": "jet", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": -1, "damage": "Taille -1", "range": "Taille x 5", "properties": [], "restrictedRace": "", "quantity": 1, "price": 90, "equipped": false } }
|
|
||||||
]
|
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
[
|
||||||
|
{ "name": "Aiguille à coudre", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Objet de géant détourné en arme fine et redoutablement pointue.</p>", "notes": "", "category": "melee", "origin": "geant", "sizeMode": "fixe", "sizeValue": 2, "sizeModifier": 0, "damage": "2", "range": "", "properties": [], "restrictedRace": "", "quantity": 1, "price": 90, "equipped": false } },
|
||||||
|
{ "name": "Aiguille à tricoter", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Longue arme de géant reconvertie en lance massive. Le tableau lui accorde <em>Charge</em> et exige <em>Force 1</em>.</p>", "notes": "", "category": "melee", "origin": "geant", "sizeMode": "fixe", "sizeValue": 5, "sizeModifier": 0, "damage": "5", "range": "", "properties": ["Charge", "Force 1"], "restrictedRace": "", "quantity": 1, "price": 630, "equipped": false } },
|
||||||
|
{ "name": "Clef de géant", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Arme très prisée dans le milieu des mercenaires. Ces instruments d'acier de géant sont réputés d'une redoutable efficacité.</p>", "notes": "", "category": "melee", "origin": "geant", "sizeMode": "plage", "sizeValue": 3, "sizeModifier": 0, "damage": "3 à 5", "range": "", "properties": [], "restrictedRace": "", "quantity": 1, "price": 450, "equipped": false } },
|
||||||
|
{ "name": "Couteau de géant", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Grand couteau des géants utilisé comme arme longue du Petit Peuple.</p>", "notes": "", "category": "melee", "origin": "geant", "sizeMode": "fixe", "sizeValue": 5, "sizeModifier": 0, "damage": "5", "range": "", "properties": [], "restrictedRace": "", "quantity": 1, "price": 630, "equipped": false } },
|
||||||
|
{ "name": "Clou", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Simple clou de géant, efficace comme pointe ou pieu improvisé.</p>", "notes": "", "category": "melee", "origin": "geant", "sizeMode": "plage", "sizeValue": 2, "sizeModifier": 0, "damage": "2 à 5", "range": "", "properties": [], "restrictedRace": "", "quantity": 1, "price": 12, "equipped": false } },
|
||||||
|
{ "name": "Épingle à nourrice", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Broche de géant détournée en arme perçante. On en fait aussi parfois des grappins.</p>", "notes": "", "category": "melee", "origin": "geant", "sizeMode": "fixe", "sizeValue": 2, "sizeModifier": 0, "damage": "2", "range": "", "properties": [], "restrictedRace": "", "quantity": 1, "price": 360, "equipped": false } },
|
||||||
|
{ "name": "Fourchette", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Couvert de géant converti en arme d'estoc ou de hampe selon sa prise.</p>", "notes": "", "category": "melee", "origin": "geant", "sizeMode": "plage", "sizeValue": 4, "sizeModifier": 0, "damage": "4 à 5", "range": "", "properties": [], "restrictedRace": "", "quantity": 1, "price": 630, "equipped": false } },
|
||||||
|
{ "name": "Grifdrachat", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Pointe de métal recourbée en forme de griffe de drachat. Extrêmement pointue, elle peut se glisser dans la plupart des interstices des armures.</p>", "notes": "", "category": "melee", "origin": "geant", "sizeMode": "fixe", "sizeValue": 3, "sizeModifier": 0, "damage": "3", "range": "", "properties": ["Blessure précise"], "restrictedRace": "", "quantity": 1, "price": 540, "equipped": false } },
|
||||||
|
{ "name": "Hameçon des Marches", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Les vivitins utilisent volontiers ces gros hameçons de géants comme armes, tenus à la main ou montés au bout d'une hampe.</p>", "notes": "", "category": "melee", "origin": "geant", "sizeMode": "fixe", "sizeValue": 2, "sizeModifier": 0, "damage": "2", "range": "", "properties": [], "restrictedRace": "", "quantity": 1, "price": 21, "equipped": false } },
|
||||||
|
{ "name": "Marteau de tailleur", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Outil de géant lourd et massif, réemployé comme arme contondante. Le livre ne donne pas de tarif explicite pour cette entrée.</p>", "notes": "", "category": "melee", "origin": "geant", "sizeMode": "plage", "sizeValue": 4, "sizeModifier": 0, "damage": "4 à 5", "range": "", "properties": [], "restrictedRace": "", "quantity": 1, "price": 0, "equipped": false } },
|
||||||
|
{ "name": "Paire de ciseaux", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Grande paire de ciseaux de géant. Le tableau lui accorde <em>Attaque multiple</em> mais impose <em>Force 3</em>.</p>", "notes": "", "category": "melee", "origin": "geant", "sizeMode": "plage", "sizeValue": 4, "sizeModifier": 0, "damage": "4 à 5", "range": "", "properties": ["Attaque multiple", "Force 3"], "restrictedRace": "", "quantity": 1, "price": 540, "equipped": false } },
|
||||||
|
|
||||||
|
{ "name": "Akinakas", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Arme prisee par l'élite des gardes de Crinios. Les belgfolks fixent à leur lance les piques prélevées sur des veuves des mers ; l'akinakas est réputé traverser les alliages.</p>", "notes": "", "category": "melee", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": 0, "damage": "Taille +0", "range": "", "properties": ["Blessure précise"], "restrictedRace": "", "quantity": 1, "price": 900, "equipped": false } },
|
||||||
|
{ "name": "Arc", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Arme de tir du Petit Peuple. Encocher une nouvelle flèche est une action libre.</p>", "notes": "", "category": "tir", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": 0, "damage": "Taille +0", "range": "75", "properties": ["Encocher une nouvelle flèche est une action libre"], "restrictedRace": "", "quantity": 1, "price": 360, "equipped": false } },
|
||||||
|
{ "name": "Arbalète", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Arme de tir du Petit Peuple. Encocher un nouveau carreau est une action unique. Le livre ne donne pas de tarif explicite dans les tableaux de prix.</p>", "notes": "", "category": "tir", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": 1, "damage": "Taille +1", "range": "100", "properties": ["Encocher un nouveau carreau est une action unique"], "restrictedRace": "", "quantity": 1, "price": 0, "equipped": false } },
|
||||||
|
{ "name": "Bâton de marche", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Bâton robuste qui peut aussi servir d'arme d'appoint. Le tableau lui accorde la prime <em>Blessure non létale</em>.</p>", "notes": "", "category": "melee", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": 1, "damage": "Taille +1", "range": "", "properties": ["Blessure non létale"], "restrictedRace": "", "quantity": 1, "price": 10, "equipped": false } },
|
||||||
|
{ "name": "Coup de poing", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Ensemble de bagues reliées par une barre métallique. Arme de bagarreur qui laisse des marques durables.</p>", "notes": "", "category": "melee", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": -1, "damage": "Taille -1", "range": "", "properties": [], "restrictedRace": "", "quantity": 1, "price": 24, "equipped": false } },
|
||||||
|
{ "name": "Dague de Songiam", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Dague kobolde si fine et discrète qu'on peut la dissimuler sans éveiller les soupçons. On la surnomme la dague du dernier souffle.</p>", "notes": "", "category": "melee", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": -1, "damage": "Taille -1", "range": "", "properties": ["Discrétion +3 (en cas de fouille)", "Blessure précise"], "restrictedRace": "", "quantity": 1, "price": 270, "equipped": false } },
|
||||||
|
{ "name": "Dandegéant", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Masse d'arme à deux mains utilisée notamment par les Huvons, avec une dent de géant à son extrémité.</p>", "notes": "", "category": "melee", "origin": "petitPeuple", "sizeMode": "fixe", "sizeValue": 4, "sizeModifier": 0, "damage": "4", "range": "", "properties": [], "restrictedRace": "", "quantity": 1, "price": 720, "equipped": false } },
|
||||||
|
{ "name": "Épée", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Épée standard du Petit Peuple, listée sans particularité spéciale dans le tableau.</p>", "notes": "", "category": "melee", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": 0, "damage": "Taille +0", "range": "", "properties": [], "restrictedRace": "", "quantity": 1, "price": 360, "equipped": false } },
|
||||||
|
{ "name": "Espadon huvon", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Grande épée forgée par et pour les Korrigans des Huvons. Aussi longue qu'une aiguille à tricoter, elle réclame <em>Force 1</em>.</p>", "notes": "", "category": "melee", "origin": "petitPeuple", "sizeMode": "fixe", "sizeValue": 4, "sizeModifier": 0, "damage": "4", "range": "", "properties": ["Force 1"], "restrictedRace": "Korrigan", "quantity": 1, "price": 900, "equipped": false } },
|
||||||
|
{ "name": "Fronde", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Arme de tir simple du Petit Peuple.</p>", "notes": "", "category": "tir", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": -1, "damage": "Taille -1", "range": "50", "properties": [], "restrictedRace": "", "quantity": 1, "price": 5, "equipped": false } },
|
||||||
|
{ "name": "Glaive", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Arme de taille du Petit Peuple, listée sans propriété particulière.</p>", "notes": "", "category": "melee", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": 0, "damage": "Taille +0", "range": "", "properties": [], "restrictedRace": "", "quantity": 1, "price": 180, "equipped": false } },
|
||||||
|
{ "name": "Hache", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Hache standard du Petit Peuple.</p>", "notes": "", "category": "melee", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": 0, "damage": "Taille +0", "range": "", "properties": [], "restrictedRace": "", "quantity": 1, "price": 270, "equipped": false } },
|
||||||
|
{ "name": "Hachette", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Petite hache pouvant être lancée. Le tableau lui donne une portée de <em>Taille x 10</em>.</p>", "notes": "", "category": "jet", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": -1, "damage": "Taille -1", "range": "Taille x 10", "properties": [], "restrictedRace": "", "quantity": 1, "price": 180, "equipped": false } },
|
||||||
|
{ "name": "Hymalamort", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Gourdin hérissé de clous, sans doute l'arme issue de matériaux de géants la plus répandue. Brutale, elle demande de la force pour être arrachée du corps de l'adversaire.</p>", "notes": "", "category": "melee", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": 0, "damage": "Taille +0", "range": "", "properties": [], "restrictedRace": "", "quantity": 1, "price": 24, "equipped": false } },
|
||||||
|
{ "name": "Lame coup de poing", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Variante du coup de poing dotée d'une large lame dans le prolongement de la main, souvent vue dans les arènes de Ciméria.</p>", "notes": "", "category": "melee", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": 0, "damage": "Taille +0", "range": "", "properties": [], "restrictedRace": "", "quantity": 1, "price": 180, "equipped": false } },
|
||||||
|
{ "name": "Lame d’Ichtys", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Lame recourbée, symbole des Vivitins, remise aux prêtres d'Ichtys lors de leur intronisation. Les marins l'apprécient particulièrement.</p>", "notes": "", "category": "melee", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": 0, "damage": "Taille +0", "range": "", "properties": [], "restrictedRace": "", "quantity": 1, "price": 360, "equipped": false } },
|
||||||
|
{ "name": "Lance plume", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Lance ornée d'une plume taillée et incrustée. Si elle suit immédiatement un engagement, elle bénéficie gratuitement de la prime <em>Blessure grave</em> via <em>Charge</em>.</p>", "notes": "", "category": "melee", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": 1, "damage": "Taille +1", "range": "", "properties": ["Charge"], "restrictedRace": "", "quantity": 1, "price": 270, "equipped": false } },
|
||||||
|
{ "name": "Mains nues", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Entrée canonique du tableau des armes pour les attaques à mains nues.</p>", "notes": "", "category": "melee", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": -1, "damage": "Taille -1", "range": "", "properties": ["Blessure légère"], "restrictedRace": "", "quantity": 1, "price": 0, "equipped": false } },
|
||||||
|
{ "name": "Masse", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Masse standard du Petit Peuple. Le tableau de prix la nomme <em>Masse en os</em>.</p>", "notes": "", "category": "melee", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": 0, "damage": "Taille +0", "range": "", "properties": [], "restrictedRace": "", "quantity": 1, "price": 12, "equipped": false } },
|
||||||
|
{ "name": "Masse d’arme", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Masse d'arme du Petit Peuple, distincte de la simple masse.</p>", "notes": "", "category": "melee", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": 0, "damage": "Taille +0", "range": "", "properties": [], "restrictedRace": "", "quantity": 1, "price": 360, "equipped": false } },
|
||||||
|
{ "name": "Poignard", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Arme courte qui peut aussi être jetée. Le tableau lui donne une portée de <em>Taille x 5</em>.</p>", "notes": "", "category": "jet", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": -1, "damage": "Taille -1", "range": "Taille x 5", "properties": [], "restrictedRace": "", "quantity": 1, "price": 90, "equipped": false } },
|
||||||
|
{ "name": "Piolet", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Version martiale du piolet listée dans le tableau des armes. À distinguer du piolet de voyage vendu dans le matériel de voyage.</p>", "notes": "", "category": "melee", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": 0, "damage": "Taille +0", "range": "", "properties": [], "restrictedRace": "", "quantity": 1, "price": 270, "equipped": false } },
|
||||||
|
{ "name": "Sabre sixt", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Arme de prédilection de la noblesse des Sixts, souvent ornée de pierres précieuses et chargée de prestige.</p>", "notes": "", "category": "melee", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": 0, "damage": "Taille +0", "range": "", "properties": [], "restrictedRace": "", "quantity": 1, "price": 450, "equipped": false } },
|
||||||
|
{ "name": "Serpe", "type": "arme", "img": "icons/svg/sword.svg", "system": { "description": "<p>Petite lame courbe du Petit Peuple.</p>", "notes": "", "category": "melee", "origin": "petitPeuple", "sizeMode": "variable", "sizeValue": 0, "sizeModifier": -1, "damage": "Taille -1", "range": "", "properties": [], "restrictedRace": "", "quantity": 1, "price": 135, "equipped": false } }
|
||||||
|
]
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "Protégé",
|
||||||
|
"type": "armure",
|
||||||
|
"img": "icons/svg/shield.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>État d'armure légère du livre de base. Il correspond à un personnage équipé de quelques pièces défensives seulement : rondache, casque, bouton de géant, cuir léger ou pièces disparates.</p>",
|
||||||
|
"notes": "<p>Le chapitre 5 donne surtout une table de prix par pièce. Cette entrée sert de profil prêt à jouer fidèle à la règle : protection 1, malus physique 1, malus d'initiative 1.</p>",
|
||||||
|
"state": "protege",
|
||||||
|
"protection": 1,
|
||||||
|
"physicalPenalty": 1,
|
||||||
|
"initiativePenalty": 1,
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 0,
|
||||||
|
"equipped": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Harnaché",
|
||||||
|
"type": "armure",
|
||||||
|
"img": "icons/svg/shield.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>État d'armure intermédiaire du livre de base. Il représente un personnage réellement équipé : cuirasse, jambières, pavois ou ensemble cohérent de pièces de protection.</p>",
|
||||||
|
"notes": "<p>Le livre ne fixe pas de mécanique détaillée par pièce ; il donne un état global. Cette entrée correspond au profil standard de protection 2.</p>",
|
||||||
|
"state": "harnache",
|
||||||
|
"protection": 2,
|
||||||
|
"physicalPenalty": 2,
|
||||||
|
"initiativePenalty": 2,
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 0,
|
||||||
|
"equipped": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Bardé",
|
||||||
|
"type": "armure",
|
||||||
|
"img": "icons/svg/shield.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>État d'armure lourde du livre de base. Il correspond à un personnage abondamment protégé, jusqu'à l'armure complète.</p>",
|
||||||
|
"notes": "<p>Profil abstrait mais canonique : protection 3, malus physique 3, malus d'initiative 3. À utiliser pour refléter les personnages les plus couverts sans surdétailler chaque pièce.</p>",
|
||||||
|
"state": "barde",
|
||||||
|
"protection": 3,
|
||||||
|
"physicalPenalty": 3,
|
||||||
|
"initiativePenalty": 3,
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 0,
|
||||||
|
"equipped": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
+459
-27
@@ -1,29 +1,461 @@
|
|||||||
[
|
[
|
||||||
{ "name": "Arts", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "<p>Compétence à domaines artistiques.</p>", "key": "arts", "profileKey": "artiste", "base": 0, "closed": false, "domainSkill": true, "domains": [], "fixedDomains": [], "exampleDomains": ["Danse", "Musique", "Peinture", "Poésie", "Sculpture"] } },
|
{
|
||||||
{ "name": "Empathie", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "empathie", "profileKey": "artiste", "base": 0, "closed": false, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } },
|
"name": "Arts",
|
||||||
{ "name": "Séduction", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "seduction", "profileKey": "artiste", "base": 0, "closed": false, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } },
|
"type": "competence",
|
||||||
{ "name": "Athlétisme", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "athletisme", "profileKey": "athlete", "base": 0, "closed": false, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } },
|
"img": "icons/svg/book.svg",
|
||||||
{ "name": "Rapidité", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "rapidite", "profileKey": "athlete", "base": 0, "closed": false, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } },
|
"system": {
|
||||||
{ "name": "Volonté", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "volonte", "profileKey": "athlete", "base": 0, "closed": false, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } },
|
"description": "<p>Mesure l'affinité du personnage avec les domaines artistiques. Un test permet de créer une œuvre, en reconnaître les techniques, en estimer l'intérêt ou mobiliser l'histoire de l'art.</p>",
|
||||||
{ "name": "Sens", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "sens", "profileKey": "chasseur", "base": 0, "closed": false, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } },
|
"notes": "<p>Compétence à domaines : le nombre de domaines maîtrisés est égal à la base.</p>",
|
||||||
{ "name": "Survie", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "survie", "profileKey": "chasseur", "base": 0, "closed": false, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } },
|
"key": "arts",
|
||||||
{ "name": "Tir", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "tir", "profileKey": "chasseur", "base": 0, "closed": false, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } },
|
"profileKey": "artiste",
|
||||||
{ "name": "Artisanat", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "<p>Compétence à domaines techniques.</p>", "key": "artisanat", "profileKey": "faiseur", "base": 0, "closed": false, "domainSkill": true, "domains": [], "fixedDomains": [], "exampleDomains": ["Construction", "Forge", "Mécanique", "Menuiserie", "Taille de pierre"] } },
|
"base": 0,
|
||||||
{ "name": "Intellect", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "intellect", "profileKey": "faiseur", "base": 0, "closed": false, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } },
|
"closed": false,
|
||||||
{ "name": "Soins", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "soins", "profileKey": "faiseur", "base": 0, "closed": false, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } },
|
"domainSkill": true,
|
||||||
{ "name": "Commandement", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "commandement", "profileKey": "forceNature", "base": 0, "closed": false, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } },
|
"domains": [],
|
||||||
{ "name": "Endurance", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "endurance", "profileKey": "forceNature", "base": 0, "closed": false, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } },
|
"fixedDomains": [],
|
||||||
{ "name": "Force", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "force", "profileKey": "forceNature", "base": 0, "closed": false, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } },
|
"exampleDomains": ["Architecture", "Calligraphie", "Chant", "Danse", "Dessin", "Littérature", "Musique", "Peinture", "Poésie", "Sculpture", "Théâtre"]
|
||||||
{ "name": "Corps à corps", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "corpsacorps", "profileKey": "guerrier", "base": 0, "closed": false, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } },
|
}
|
||||||
{ "name": "Mêlée", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "melee", "profileKey": "guerrier", "base": 0, "closed": false, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } },
|
},
|
||||||
{ "name": "Montures", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "montures", "profileKey": "guerrier", "base": 0, "closed": false, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } },
|
{
|
||||||
{ "name": "Chimérisme", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "chimerisme", "profileKey": "mystique", "base": 0, "closed": true, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } },
|
"name": "Empathie",
|
||||||
{ "name": "Magie", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "magie", "profileKey": "mystique", "base": 0, "closed": true, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } },
|
"type": "competence",
|
||||||
{ "name": "Onirologie", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "onirologie", "profileKey": "mystique", "base": 0, "closed": true, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } },
|
"img": "icons/svg/book.svg",
|
||||||
{ "name": "Discrétion", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "discretion", "profileKey": "ombre", "base": 0, "closed": false, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } },
|
"system": {
|
||||||
{ "name": "Esquive", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "esquive", "profileKey": "ombre", "base": 0, "closed": false, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } },
|
"description": "<p>Permet de saisir les intentions de quelqu'un, ce qu'il ressent, s'il ment, ou encore l'état émotionnel d'un animal.</p>",
|
||||||
{ "name": "Subterfuge", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "subterfuge", "profileKey": "ombre", "base": 0, "closed": false, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } },
|
"notes": "",
|
||||||
{ "name": "Érudition", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "<p>Compétence fermée à domaines de savoir.</p>", "key": "erudition", "profileKey": "savant", "base": 0, "closed": true, "domainSkill": true, "domains": [], "fixedDomains": [], "exampleDomains": ["Edenia", "Histoire", "Légendes", "Lettres", "Terra Incognita"] } },
|
"key": "empathie",
|
||||||
{ "name": "Langues", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "<p>Compétence fermée à domaines linguistiques.</p>", "key": "langues", "profileKey": "savant", "base": 0, "closed": true, "domainSkill": true, "domains": [], "fixedDomains": [], "exampleDomains": ["Chimérique", "Jargon des likias", "Latin", "Oc", "Vieux lutin"] } },
|
"profileKey": "artiste",
|
||||||
{ "name": "Stratégie", "type": "competence", "img": "icons/svg/book.svg", "system": { "description": "", "key": "strategie", "profileKey": "savant", "base": 0, "closed": false, "domainSkill": false, "domains": [], "fixedDomains": [], "exampleDomains": [] } }
|
"base": 0,
|
||||||
|
"closed": false,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Séduction",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Régit le charme, les négociations, le marchandage, le mensonge et la persuasion par l'éloquence.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"key": "seduction",
|
||||||
|
"profileKey": "artiste",
|
||||||
|
"base": 0,
|
||||||
|
"closed": false,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Athlétisme",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Regroupe les actions physiques qui exigent coordination, agilité, équilibre et souffle, comme nager, courir ou sauter.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"key": "athletisme",
|
||||||
|
"profileKey": "athlete",
|
||||||
|
"base": 0,
|
||||||
|
"closed": false,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Rapidité",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Gouverne les réflexes, les courses de vitesse pure et toutes les actions où la célérité est essentielle. Elle sert aussi à déterminer l'initiative.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"key": "rapidite",
|
||||||
|
"profileKey": "athlete",
|
||||||
|
"base": 0,
|
||||||
|
"closed": false,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Volonté",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Mesure la capacité à affirmer sa personnalité, garder son sang-froid et résister à la peur.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"key": "volonte",
|
||||||
|
"profileKey": "athlete",
|
||||||
|
"base": 0,
|
||||||
|
"closed": false,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Sens",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Permet d'être à l'écoute de son environnement : entendre, repérer un danger avant qu'il ne surgisse, suivre quelqu'un sans le perdre ou déceler des signes faibles.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"key": "sens",
|
||||||
|
"profileKey": "chasseur",
|
||||||
|
"base": 0,
|
||||||
|
"closed": false,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Survie",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Englobe la vie autonome en milieu sauvage : orientation, raccourcis, escalade, exploration de ruines, navigation aux étoiles, chasse, lecture de carte et pistage.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"key": "survie",
|
||||||
|
"profileKey": "chasseur",
|
||||||
|
"base": 0,
|
||||||
|
"closed": false,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Tir",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Régit l'usage des armes à distance.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"key": "tir",
|
||||||
|
"profileKey": "chasseur",
|
||||||
|
"base": 0,
|
||||||
|
"closed": false,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Artisanat",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Mesure l'habileté du personnage avec ses mains et des outils simples, pour fabriquer, réparer ou juger la qualité d'un objet.</p>",
|
||||||
|
"notes": "<p>Compétence à domaines : le nombre de domaines maîtrisés est égal à la base.</p>",
|
||||||
|
"key": "artisanat",
|
||||||
|
"profileKey": "faiseur",
|
||||||
|
"base": 0,
|
||||||
|
"closed": false,
|
||||||
|
"domainSkill": true,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": ["Enluminure", "Forge", "Mécanique", "Menuiserie", "Peinture", "Restauration d’œuvres d’art", "Serrurerie", "Taille de pierre"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Intellect",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Regroupe les facultés de logique et de raisonnement. On l'utilise pour résoudre un problème, décrypter un message, jouer aux échecs ou démêler une énigme.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"key": "intellect",
|
||||||
|
"profileKey": "faiseur",
|
||||||
|
"base": 0,
|
||||||
|
"closed": false,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Soins",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Regroupe les premiers soins, les soins journaliers, le diagnostic des maladies, la prescription de remèdes et la chirurgie.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"key": "soins",
|
||||||
|
"profileKey": "faiseur",
|
||||||
|
"base": 0,
|
||||||
|
"closed": false,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Commandement",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Mesure l'aptitude à donner des ordres, inspirer loyauté ou peur, faire parler quelqu'un par intimidation ou soutenir un allié face à la peur.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"key": "commandement",
|
||||||
|
"profileKey": "forceNature",
|
||||||
|
"base": 0,
|
||||||
|
"closed": false,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Endurance",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Permet de résister à la fatigue, de maintenir un effort prolongé et de rester éveillé de longues périodes.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"key": "endurance",
|
||||||
|
"profileKey": "forceNature",
|
||||||
|
"base": 0,
|
||||||
|
"closed": false,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Force",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Régit les manifestations brutes de puissance physique : briser des liens, enfoncer une porte, soulever une charge ou tordre des barreaux.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"key": "force",
|
||||||
|
"profileKey": "forceNature",
|
||||||
|
"base": 0,
|
||||||
|
"closed": false,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Corps à corps",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Mesure la faculté d'utiliser mains, pieds, tête, coudes et prises pour blesser, immobiliser ou faire tomber un adversaire.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"key": "corpsacorps",
|
||||||
|
"profileKey": "guerrier",
|
||||||
|
"base": 0,
|
||||||
|
"closed": false,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Mêlée",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Mesure l'aptitude martiale avec une arme en main, qu'il s'agisse d'une lame, d'une arme d'hast ou d'une arme contondante.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"key": "melee",
|
||||||
|
"profileKey": "guerrier",
|
||||||
|
"base": 0,
|
||||||
|
"closed": false,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Montures",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Détermine la capacité à débourrer, dresser et conduire des montures. Un personnage ne peut guider que des montures dont la taille ne dépasse la sienne que de 1 point.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"key": "montures",
|
||||||
|
"profileKey": "guerrier",
|
||||||
|
"base": 0,
|
||||||
|
"closed": false,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Chimérisme",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Équivalent d'Érudition pour les sortilèges des doux rêveurs et des sœurs de l'effroi.</p>",
|
||||||
|
"notes": "<p>Compétence fermée : avec une base de 0, tout test impliquant cette compétence est automatiquement raté.</p>",
|
||||||
|
"key": "chimerisme",
|
||||||
|
"profileKey": "mystique",
|
||||||
|
"base": 0,
|
||||||
|
"closed": true,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Magie",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Équivalent d'Érudition pour les sortilèges des mages des Songes et des mages noirs.</p>",
|
||||||
|
"notes": "<p>Compétence fermée : avec une base de 0, tout test impliquant cette compétence est automatiquement raté.</p>",
|
||||||
|
"key": "magie",
|
||||||
|
"profileKey": "mystique",
|
||||||
|
"base": 0,
|
||||||
|
"closed": true,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Onirologie",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Équivalent d'Érudition pour les sortilèges des rêvirines et des sangfous, ainsi que pour la récolte de fils de Songes ou de Cauchemar et l'affrontement du Néphertine.</p>",
|
||||||
|
"notes": "<p>Compétence fermée : avec une base de 0, tout test impliquant cette compétence est automatiquement raté.</p>",
|
||||||
|
"key": "onirologie",
|
||||||
|
"profileKey": "mystique",
|
||||||
|
"base": 0,
|
||||||
|
"closed": true,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Discrétion",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Permet de se cacher, de dissimuler un objet ou de se déplacer sans se faire repérer, souvent en opposition à Sens.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"key": "discretion",
|
||||||
|
"profileKey": "ombre",
|
||||||
|
"base": 0,
|
||||||
|
"closed": false,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Esquive",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Met un personnage à l'abri des tirs ou des coups, aide à se libérer de liens et couvre cascades, acrobaties et voltige périlleuse.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"key": "esquive",
|
||||||
|
"profileKey": "ombre",
|
||||||
|
"base": 0,
|
||||||
|
"closed": false,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Subterfuge",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Art de faire prendre les apparences pour la réalité : déguisement, faux documents, pickpocket et tours de passe-passe.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"key": "subterfuge",
|
||||||
|
"profileKey": "ombre",
|
||||||
|
"base": 0,
|
||||||
|
"closed": false,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Érudition",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Regroupe les connaissances intellectuelles, leurs théories, leurs pratiques et leur histoire. Le domaine Lettres couvre la lecture, l'écriture et la recherche documentaire.</p>",
|
||||||
|
"notes": "<p>Compétence fermée et à domaines : le nombre de domaines maîtrisés est égal à la base.</p>",
|
||||||
|
"key": "erudition",
|
||||||
|
"profileKey": "savant",
|
||||||
|
"base": 0,
|
||||||
|
"closed": true,
|
||||||
|
"domainSkill": true,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": ["Catholicisme", "Culte de Dame Nature", "Géographie", "Histoire", "Judaïsme", "Légendes", "Lettres", "Protestantisme", "Terra Incognita"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Langues",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Rassemble les facultés de parler, traduire et contextualiser une ou plusieurs langues. Elle limite aussi les autres compétences dès qu'elles s'appliquent à un texte ou discours dans une langue connue.</p>",
|
||||||
|
"notes": "<p>Compétence fermée et à domaines : chaque langue est un domaine distinct, et le personnage est illettré par défaut hors domaine Lettres/formation appropriée.</p>",
|
||||||
|
"key": "langues",
|
||||||
|
"profileKey": "savant",
|
||||||
|
"base": 0,
|
||||||
|
"closed": true,
|
||||||
|
"domainSkill": true,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": ["Chimérique", "Jargon des likias", "Latin", "Lutin", "Oc", "Vieux lutin", "Velu nuton"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Stratégie",
|
||||||
|
"type": "competence",
|
||||||
|
"img": "icons/svg/book.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Science de la définition d'objectifs et des moyens pour les atteindre. Elle sert à planifier une action complexe et à comprendre les buts d'une organisation ou d'un adversaire.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"key": "strategie",
|
||||||
|
"profileKey": "savant",
|
||||||
|
"base": 0,
|
||||||
|
"closed": false,
|
||||||
|
"domainSkill": false,
|
||||||
|
"domains": [],
|
||||||
|
"fixedDomains": [],
|
||||||
|
"exampleDomains": []
|
||||||
|
}
|
||||||
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -0,0 +1,597 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "Lampe à fée des nuits",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Lampe inspirée des lanternes-tempête des géants. Elle diffuse une lumière froide sans chaleur grâce à une ou plusieurs fées des nuits capturées.</p>",
|
||||||
|
"notes": "<p>La lumière décroît à mesure que la créature enfermée dépérit.</p>",
|
||||||
|
"category": "voyage",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 360,
|
||||||
|
"bonus": "Éclaire sans produire de chaleur",
|
||||||
|
"usage": "Éclairage d'expédition",
|
||||||
|
"lifespan": "Quelques mois",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Dé à coudre (brasero)",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Dé à coudre en acier de géant utilisé comme brasero portatif, pratique pour ne laisser presque aucune trace de campement.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"category": "voyage",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 15,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Brasero de voyage",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Grappin",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Hameçon, épingle à nourrice ou broche de géant affûtée servant à l'escalade et, au besoin, au combat rapproché.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"category": "voyage",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 6,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Escalade, ancrage, franchissement",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Corde",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Segment de corde de haute qualité prélevé sur les cordages des navires des géants.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"category": "voyage",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 3,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Chaque segment mesure environ 50 à 70 cm",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Piolet de voyage",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Petite canne hérissée de piques, utile pour grimper sur les hauteurs du Giganti, dans les Drumes ou sur les poutres des maisons des géants.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"category": "voyage",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 60,
|
||||||
|
"bonus": "+3 aux tests d'escalade",
|
||||||
|
"usage": "Ascension et progression en terrain escarpé",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Rikilin",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Chaussures de marche à crampons métalliques conçues pour l'escalade de bois, de poutres ou de surfaces raides.</p>",
|
||||||
|
"notes": "<p>Elles sont lourdes et ne se portent en pratique que pour l'ascension.</p>",
|
||||||
|
"category": "voyage",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 0,
|
||||||
|
"bonus": "+3 aux tests d'escalade",
|
||||||
|
"usage": "Ascension d'armoires, meubles, poutres et surfaces similaires",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Trousse de premiers soins",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Petite sacoche de secours contenant bandages, toiles d'araignée cicatrisantes, plantes désinfectantes et huiles essentielles contre les parasites.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"category": "soin",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 0,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Premiers soins et traitement léger",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Nécessaire d’entretien d’armes",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Kit d'affûtage et de protection contre la corrosion, indispensable pour garder des armes fiables en Terra Incognita.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"category": "survie",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 0,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Entretien d'armes",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Nécessaire d’écriture / dessins",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Encre, plume et supports d'écriture pour prendre des notes, dessiner ou cartographier.</p>",
|
||||||
|
"notes": "<p>Le livre le décrit comme un peu d'encre dans une fiole bien fermée, des parchemins et parfois du papier volé aux géants.</p>",
|
||||||
|
"category": "ecriture",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 0,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Écriture, dessin, cartographie",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Bougie",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Bougie de géant, souvent plantée sur une lance ou une pique pour éclairer les voyages nocturnes.</p>",
|
||||||
|
"notes": "<p>Le livre insiste sur le risque d'incendie.</p>",
|
||||||
|
"category": "butin",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 180,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Éclairage",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Chandelle",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Source de lumière plus modeste que la bougie de géant, mais toujours utile en expédition.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"category": "butin",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 90,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Éclairage",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Dé à coudre de géant",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Dérobé aux géants, ce dé à coudre peut être revendu, détourné ou recyclé en brasero.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"category": "butin",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 24,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Contenant, brasero improvisé, bien de troc",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Bouton",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Bouton de géant récupéré comme bien de valeur, matériau ou future rondache improvisée.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"category": "butin",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 30,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Troc, artisanat, récupération",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Cordages",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Lot de bons cordages prélevés sur les navires des géants.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"category": "butin",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 27,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Réserve de corde de meilleure ampleur qu'un simple segment",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Morceaux de miroir",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Éclats de miroir géant, utiles autant pour l'artisanat que pour certains tours de lumière ou de repérage.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"category": "butin",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 90,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Troc, artisanat, signaux",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Morceaux de verre",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Éclats de verre géant récupérés pour la fabrication, le troc ou certaines improvisations dangereuses.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"category": "butin",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 150,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Troc, artisanat, découpe",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Mouchoirs en soie",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Morceaux de textile précieux dérobés aux géants, recherchés pour leur finesse et leur rareté.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"category": "butin",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 180,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Troc, vêtements, artisanat",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Morceaux de tissus",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Coupons de tissu géant particulièrement utiles pour la couture, le troc ou la fabrication d'abris improvisés.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"category": "butin",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 150,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Troc, couture, réparation",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Morceaux de parchemin",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Supports d'écriture volés aux géants, rares et précieux pour qui veut tenir journal, archives ou cartes.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"category": "ecriture",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 120,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Écriture, cartes, documents",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Plume",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Grande plume de géant pouvant servir à l'écriture, à l'apparat ou à certains bricolages.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"category": "ecriture",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 630,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Écriture, décoration, artisanat",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Encrier",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Encrier dérobé aux géants, précieux pour l'écriture et la cartographie.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"category": "ecriture",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 150,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Écriture et dessin",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Bague",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Bijou géant d'une valeur exceptionnelle dans l'économie du Petit Peuple.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"category": "butin",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 18000,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Trésor, rançon, signe de prestige",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Boucle d’oreille",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Parure géante extrêmement recherchée, autant comme richesse portable que comme matériau précieux.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"category": "butin",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 900,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Trésor, parure, matière première",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Bécasse des marais dressée",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Monture dressée utilisable par le Petit Peuple selon la table des prix.</p>",
|
||||||
|
"notes": "<p>Pré-créée comme équipement faute de type d'item dédié aux montures.</p>",
|
||||||
|
"category": "monture",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 5400,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Monture dressée",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Blaireau dressé",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Monture dressée listée dans la table des prix du chapitre 5.</p>",
|
||||||
|
"notes": "<p>Pré-créée comme équipement faute de type d'item dédié aux montures.</p>",
|
||||||
|
"category": "monture",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 118000,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Monture dressée",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Chauve-souris dressée",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Monture dressée volante de la table des prix.</p>",
|
||||||
|
"notes": "<p>Pré-créée comme équipement faute de type d'item dédié aux montures.</p>",
|
||||||
|
"category": "monture",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 5400,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Monture dressée",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Corbeau / choucas dressé",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Oiseau dressé mentionné dans la table des montures du livre de base.</p>",
|
||||||
|
"notes": "<p>Pré-créé comme équipement faute de type d'item dédié aux montures.</p>",
|
||||||
|
"category": "monture",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 6300,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Monture dressée",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Crapaud / grenouille dressé",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Amphibien dressé prévu par la table des montures.</p>",
|
||||||
|
"notes": "<p>Pré-créé comme équipement faute de type d'item dédié aux montures.</p>",
|
||||||
|
"category": "monture",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 4500,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Monture dressée",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Escuriel dressé",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Monture dressée listée dans le chapitre des prix.</p>",
|
||||||
|
"notes": "<p>Pré-créée comme équipement faute de type d'item dédié aux montures.</p>",
|
||||||
|
"category": "monture",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 7200,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Monture dressée",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fouine / belette dressée",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Petite monture nerveuse mentionnée dans la table des montures dressées.</p>",
|
||||||
|
"notes": "<p>Pré-créée comme équipement faute de type d'item dédié aux montures.</p>",
|
||||||
|
"category": "monture",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 6300,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Monture dressée",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Hibou dressé",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Monture dressée nocturne du chapitre 5.</p>",
|
||||||
|
"notes": "<p>Pré-créée comme équipement faute de type d'item dédié aux montures.</p>",
|
||||||
|
"category": "monture",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 3600,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Monture dressée",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Lézard dressé",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Monture dressée reptilienne listée dans les prix.</p>",
|
||||||
|
"notes": "<p>Pré-créée comme équipement faute de type d'item dédié aux montures.</p>",
|
||||||
|
"category": "monture",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 4500,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Monture dressée",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Pigeon dressé",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Petit oiseau dressé, peu coûteux relativement aux autres montures du tableau.</p>",
|
||||||
|
"notes": "<p>Pré-créé comme équipement faute de type d'item dédié aux montures.</p>",
|
||||||
|
"category": "monture",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 2700,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Monture dressée",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Rat dressé",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Monture dressée fréquente ou du moins familière dans la table du livre.</p>",
|
||||||
|
"notes": "<p>Pré-créée comme équipement faute de type d'item dédié aux montures.</p>",
|
||||||
|
"category": "monture",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 5400,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Monture dressée",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Souris / mulot / musaraigne dressé",
|
||||||
|
"type": "equipement",
|
||||||
|
"img": "icons/svg/chest.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Plus petite monture dressée de la table des prix.</p>",
|
||||||
|
"notes": "<p>Pré-créée comme équipement faute de type d'item dédié aux montures.</p>",
|
||||||
|
"category": "monture",
|
||||||
|
"quantity": 1,
|
||||||
|
"price": 900,
|
||||||
|
"bonus": "",
|
||||||
|
"usage": "Monture dressée",
|
||||||
|
"lifespan": "",
|
||||||
|
"equipped": false,
|
||||||
|
"consumable": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -1,10 +1,138 @@
|
|||||||
[
|
[
|
||||||
{ "name": "Ardeur belliqueuse", "type": "pouvoircompagnie", "img": "icons/svg/aura.svg", "system": { "description": "<p>Les attaques au corps à corps et en mêlée infligent 1 point de dégâts supplémentaire.</p>", "scope": "compagnie", "effectMode": "passif", "ruleText": "<p>Les dégâts des attaques au corps à corps et en mêlée augmentent de 1 point.</p>", "limitedUses": "Permanent", "resourceImpact": "", "activationCondition": "À portée de vue du capitaine ; le capitaine doit lui-même voir au moins un autre membre", "captainVisible": true, "captainNeedsWitness": true } },
|
{
|
||||||
{ "name": "Aube flamboyante", "type": "pouvoircompagnie", "img": "icons/svg/aura.svg", "system": { "description": "<p>La compagnie récupère plus vite ses Songes à l'aube.</p>", "scope": "compagnie", "effectMode": "passif", "ruleText": "<p>À l'aube, les Oubliés récupèrent 2 points de Songes au lieu de 1.</p>", "limitedUses": "À chaque aube", "resourceImpact": "Songes", "activationCondition": "À portée de vue du capitaine ; le capitaine doit lui-même voir au moins un autre membre", "captainVisible": true, "captainNeedsWitness": true } },
|
"name": "Ardeur belliqueuse",
|
||||||
{ "name": "Levier", "type": "pouvoircompagnie", "img": "icons/svg/aura.svg", "system": { "description": "<p>Permet des réussites spectaculaires quand les deux dés montrent le même nombre.</p>", "scope": "compagnie", "effectMode": "passif", "ruleText": "<p>Si les deux d12 montrent le même nombre, le résultat naturel s'obtient en les additionnant, sauf sur double 1.</p>", "limitedUses": "Permanent", "resourceImpact": "", "activationCondition": "À portée de vue du capitaine ; le capitaine doit lui-même voir au moins un autre membre", "captainVisible": true, "captainNeedsWitness": true } },
|
"type": "pouvoircompagnie",
|
||||||
{ "name": "Patience", "type": "pouvoircompagnie", "img": "icons/svg/aura.svg", "system": { "description": "<p>Concentration avant test pour améliorer le résultat.</p>", "scope": "compagnie", "effectMode": "action", "ruleText": "<p>Passer un round à se concentrer avant un test permet d'augmenter de 1 le résultat final.</p>", "limitedUses": "À volonté", "resourceImpact": "", "activationCondition": "À portée de vue du capitaine ; le capitaine doit lui-même voir au moins un autre membre", "captainVisible": true, "captainNeedsWitness": true } },
|
"img": "icons/svg/aura.svg",
|
||||||
{ "name": "Protection", "type": "pouvoircompagnie", "img": "icons/svg/aura.svg", "system": { "description": "<p>La compagnie bénéficie d'une armure naturelle.</p>", "scope": "compagnie", "effectMode": "passif", "ruleText": "<p>Le pouvoir accorde une armure naturelle de 2 points.</p>", "limitedUses": "Permanent", "resourceImpact": "", "activationCondition": "À portée de vue du capitaine ; le capitaine doit lui-même voir au moins un autre membre", "captainVisible": true, "captainNeedsWitness": true } },
|
"system": {
|
||||||
{ "name": "Resplendissance", "type": "pouvoircompagnie", "img": "icons/svg/aura.svg", "system": { "description": "<p>Transforme les réussites parfaites en succès éblouissants.</p>", "scope": "compagnie", "effectMode": "passif", "ruleText": "<p>Sur un 12, le dé est relancé mais le 12 remplace le nouveau résultat pour le calcul du résultat naturel.</p>", "limitedUses": "Permanent", "resourceImpact": "", "activationCondition": "À portée de vue du capitaine ; le capitaine doit lui-même voir au moins un autre membre", "captainVisible": true, "captainNeedsWitness": true } },
|
"description": "<p>Pouvoir de compagnie offensif favorisant les assauts du groupe.</p>",
|
||||||
{ "name": "Sauvegarde", "type": "pouvoircompagnie", "img": "icons/svg/aura.svg", "system": { "description": "<p>Permet de relancer un 1 naturel sur un test de compétence.</p>", "scope": "compagnie", "effectMode": "réaction", "ruleText": "<p>Un 1 naturel peut être relancé une fois. Si un nouveau 1 est obtenu, il doit être conservé.</p>", "limitedUses": "Permanent", "resourceImpact": "", "activationCondition": "À portée de vue du capitaine ; le capitaine doit lui-même voir au moins un autre membre", "captainVisible": true, "captainNeedsWitness": true } },
|
"notes": "",
|
||||||
{ "name": "Songes immanents", "type": "pouvoircompagnie", "img": "icons/svg/aura.svg", "system": { "description": "<p>La compagnie possède un point de Songes partagé.</p>", "scope": "compagnie", "effectMode": "ressource", "ruleText": "<p>La compagnie possède 1 point de Songes utilisable par un membre, régénéré à l'aube.</p>", "limitedUses": "1 par aube", "resourceImpact": "1 point de Songes partagé", "activationCondition": "À portée de vue du capitaine ; le capitaine doit lui-même voir au moins un autre membre", "captainVisible": true, "captainNeedsWitness": true } }
|
"scope": "compagnie",
|
||||||
|
"effectMode": "passif",
|
||||||
|
"ruleText": "<p>Les dégâts des attaques au corps à corps et en mêlée augmentent de 1 point.</p>",
|
||||||
|
"limitedUses": "",
|
||||||
|
"resourceImpact": "",
|
||||||
|
"activationCondition": "À portée de vue du capitaine ; le capitaine doit voir au moins un autre membre pour en bénéficier lui-même.",
|
||||||
|
"captainVisible": true,
|
||||||
|
"captainNeedsWitness": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Aube flamboyante",
|
||||||
|
"type": "pouvoircompagnie",
|
||||||
|
"img": "icons/svg/aura.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Pouvoir de compagnie axé sur la récupération de Songes.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"scope": "compagnie",
|
||||||
|
"effectMode": "passif",
|
||||||
|
"ruleText": "<p>À l'aube, les Oubliés de la compagnie récupèrent 2 points de Songes au lieu de 1 seul.</p>",
|
||||||
|
"limitedUses": "",
|
||||||
|
"resourceImpact": "+1 point de Songes récupéré à l'aube",
|
||||||
|
"activationCondition": "À portée de vue du capitaine ; le capitaine doit voir au moins un autre membre pour en bénéficier lui-même.",
|
||||||
|
"captainVisible": true,
|
||||||
|
"captainNeedsWitness": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Levier",
|
||||||
|
"type": "pouvoircompagnie",
|
||||||
|
"img": "icons/svg/aura.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Pouvoir de compagnie qui magnifie les doubles obtenus sur 2d12.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"scope": "compagnie",
|
||||||
|
"effectMode": "passif",
|
||||||
|
"ruleText": "<p>Lors d'un test réalisé avec 2d12, si les deux dés indiquent le même nombre, le résultat naturel est calculé en additionnant ces deux nombres, sauf sur deux 1 où le pouvoir reste sans effet.</p>",
|
||||||
|
"limitedUses": "",
|
||||||
|
"resourceImpact": "",
|
||||||
|
"activationCondition": "À portée de vue du capitaine ; le capitaine doit voir au moins un autre membre pour en bénéficier lui-même.",
|
||||||
|
"captainVisible": true,
|
||||||
|
"captainNeedsWitness": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Patience",
|
||||||
|
"type": "pouvoircompagnie",
|
||||||
|
"img": "icons/svg/aura.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Pouvoir de compagnie qui récompense la concentration avant l'action.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"scope": "compagnie",
|
||||||
|
"effectMode": "préparation",
|
||||||
|
"ruleText": "<p>Passer cinq secondes, soit un round en combat, à se concentrer avant un test de compétence permet d'augmenter de 1 le résultat final. Ce temps de concentration est une action unique réussie automatiquement.</p>",
|
||||||
|
"limitedUses": "",
|
||||||
|
"resourceImpact": "",
|
||||||
|
"activationCondition": "À portée de vue du capitaine ; le capitaine doit voir au moins un autre membre pour en bénéficier lui-même.",
|
||||||
|
"captainVisible": true,
|
||||||
|
"captainNeedsWitness": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Protection",
|
||||||
|
"type": "pouvoircompagnie",
|
||||||
|
"img": "icons/svg/aura.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Pouvoir de compagnie défensif accordant une armure naturelle.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"scope": "compagnie",
|
||||||
|
"effectMode": "passif",
|
||||||
|
"ruleText": "<p>Le pouvoir accorde une armure naturelle de 2 points.</p>",
|
||||||
|
"limitedUses": "",
|
||||||
|
"resourceImpact": "",
|
||||||
|
"activationCondition": "À portée de vue du capitaine ; le capitaine doit voir au moins un autre membre pour en bénéficier lui-même.",
|
||||||
|
"captainVisible": true,
|
||||||
|
"captainNeedsWitness": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Resplendissance",
|
||||||
|
"type": "pouvoircompagnie",
|
||||||
|
"img": "icons/svg/aura.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Pouvoir de compagnie qui sublime les réussites parfaites.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"scope": "compagnie",
|
||||||
|
"effectMode": "passif",
|
||||||
|
"ruleText": "<p>Lors d'un test, si le dé indique 12, le dé est relancé conformément aux règles habituelles. Cependant, le chiffre 12 remplace toujours le résultat obtenu au nouveau jet pour déterminer le résultat naturel. Si un nouveau 12 apparaît, le procédé continue jusqu'à obtention d'un autre chiffre.</p>",
|
||||||
|
"limitedUses": "",
|
||||||
|
"resourceImpact": "",
|
||||||
|
"activationCondition": "À portée de vue du capitaine ; le capitaine doit voir au moins un autre membre pour en bénéficier lui-même.",
|
||||||
|
"captainVisible": true,
|
||||||
|
"captainNeedsWitness": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Sauvegarde",
|
||||||
|
"type": "pouvoircompagnie",
|
||||||
|
"img": "icons/svg/aura.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Pouvoir de compagnie qui donne une seconde chance face au pire résultat naturel.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"scope": "compagnie",
|
||||||
|
"effectMode": "réaction",
|
||||||
|
"ruleText": "<p>Lors d'un test de compétence, le joueur qui obtient un résultat naturel de 1 peut relancer le dé. S'il obtient à nouveau un 1 naturel, il doit garder ce résultat.</p>",
|
||||||
|
"limitedUses": "",
|
||||||
|
"resourceImpact": "",
|
||||||
|
"activationCondition": "À portée de vue du capitaine ; le capitaine doit voir au moins un autre membre pour en bénéficier lui-même.",
|
||||||
|
"captainVisible": true,
|
||||||
|
"captainNeedsWitness": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Songes immanents",
|
||||||
|
"type": "pouvoircompagnie",
|
||||||
|
"img": "icons/svg/aura.svg",
|
||||||
|
"system": {
|
||||||
|
"description": "<p>Pouvoir de compagnie doté de sa propre réserve de Songes.</p>",
|
||||||
|
"notes": "",
|
||||||
|
"scope": "compagnie",
|
||||||
|
"effectMode": "ressource",
|
||||||
|
"ruleText": "<p>La compagnie possède 1 point de Songes. Un membre peut l'utiliser comme si c'était l'un des siens. Il n'est alors plus utilisable jusqu'à la prochaine aube où il se régénère.</p>",
|
||||||
|
"limitedUses": "1 point par aube",
|
||||||
|
"resourceImpact": "Réserve commune de 1 point de Songes",
|
||||||
|
"activationCondition": "À portée de vue du capitaine ; le capitaine doit voir au moins un autre membre pour en bénéficier lui-même.",
|
||||||
|
"captainVisible": true,
|
||||||
|
"captainNeedsWitness": true
|
||||||
|
}
|
||||||
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
[
|
|
||||||
{ "name": "Chevelure de sirène", "type": "sortilege", "img": "icons/svg/daze.svg", "system": { "description": "<p>Fouet scintillant qui gêne les adversaires touchés.</p>", "tradition": "magie", "skillKey": "magie", "polarity": "songes", "cost": 1, "costFormula": "", "variableCost": false, "preparation": "1 action libre", "duration": "1 combat", "range": "personnelle", "area": "-", "stacking": "non", "requiredDomains": [], "artsDomains": [], "effectsText": "<p>Confère la prime Facilité à chaque attaque ; n'inflige pas de dégâts mais applique Difficulté.</p>", "ruleTags": ["combat", "altération"] } },
|
|
||||||
{ "name": "Dôme scintillant", "type": "sortilege", "img": "icons/svg/daze.svg", "system": { "description": "<p>Dôme protecteur rendant les attaques à distance plus difficiles.</p>", "tradition": "magie", "skillKey": "magie", "polarity": "songes", "cost": 1, "costFormula": "", "variableCost": false, "preparation": "1 action gratuite", "duration": "1 combat", "range": "personnelle", "area": "10 cm", "stacking": "non", "requiredDomains": [], "artsDomains": [], "effectsText": "<p>Les attaques à distance visant l'intérieur subissent un malus de -3.</p>", "ruleTags": ["protection", "zone"] } },
|
|
||||||
{ "name": "Liens de Songes", "type": "sortilege", "img": "icons/svg/daze.svg", "system": { "description": "<p>Entrave lumineuse qui immobilise une cible.</p>", "tradition": "magie", "skillKey": "magie", "polarity": "songes", "cost": 2, "costFormula": "", "variableCost": false, "preparation": "1 action libre", "duration": "1 round", "range": "vue", "area": "cible", "stacking": "non", "requiredDomains": [], "artsDomains": [], "effectsText": "<p>La cible ne peut plus agir physiquement sauf test de Force / -6.</p>", "ruleTags": ["contrôle"] } },
|
|
||||||
{ "name": "Pluie d'étoiles", "type": "sortilege", "img": "icons/svg/daze.svg", "system": { "description": "<p>Nuée d'éclats infligeant des dégâts autour du mage.</p>", "tradition": "magie", "skillKey": "magie", "polarity": "songes", "cost": 1, "costFormula": "", "variableCost": false, "preparation": "1 action unique", "duration": "instantanée", "range": "personnelle", "area": "adversaires engagés", "stacking": "-", "requiredDomains": [], "artsDomains": [], "effectsText": "<p>Inflige 2 points de dégâts à tous les adversaires engagés, sans protection d'armure.</p>", "ruleTags": ["dégâts", "zone"] } },
|
|
||||||
{ "name": "Armure obscurine", "type": "sortilege", "img": "icons/svg/daze.svg", "system": { "description": "<p>L'ombre du mage absorbe les dégâts.</p>", "tradition": "magie", "skillKey": "magie", "polarity": "cauchemar", "cost": 1, "costFormula": "X", "variableCost": true, "preparation": "1 action unique", "duration": "1 combat", "range": "personnelle", "area": "-", "stacking": "oui", "requiredDomains": [], "artsDomains": [], "effectsText": "<p>Absorbe X points de dégâts jusqu'à dissipation de l'ombre.</p>", "ruleTags": ["protection", "cauchemar"] } },
|
|
||||||
{ "name": "Aspect cauchemardesque", "type": "sortilege", "img": "icons/svg/daze.svg", "system": { "description": "<p>Altère le visage pour intimider.</p>", "tradition": "magie", "skillKey": "magie", "polarity": "cauchemar", "cost": 1, "costFormula": "", "variableCost": false, "preparation": "1 action gratuite", "duration": "1 h", "range": "personnelle", "area": "-", "stacking": "non", "requiredDomains": [], "artsDomains": [], "effectsText": "<p>Octroie +3 aux tests de Commandement pour intimider.</p>", "ruleTags": ["social", "cauchemar"] } },
|
|
||||||
{ "name": "Hirond'ailes", "type": "sortilege", "img": "icons/svg/daze.svg", "system": { "description": "<p>Sortilège farfadet de vol personnel.</p>", "tradition": "farfadet", "skillKey": "magie", "polarity": "songes", "cost": 1, "costFormula": "", "variableCost": false, "preparation": "1 action unique", "duration": "utilisation", "range": "personnelle", "area": "-", "stacking": "non", "requiredDomains": [], "artsDomains": [], "effectsText": "<p>Fait apparaître des ailes permettant de voler avec un équipement léger.</p>", "ruleTags": ["déplacement", "farfadet"] } },
|
|
||||||
{ "name": "Seconde peau", "type": "sortilege", "img": "icons/svg/daze.svg", "system": { "description": "<p>Tatouage protecteur absorbant les blessures.</p>", "tradition": "farfadet", "skillKey": "magie", "polarity": "songes", "cost": 1, "costFormula": "X", "variableCost": true, "preparation": "1 action unique", "duration": "spéciale", "range": "toucher", "area": "1 être vivant", "stacking": "non", "requiredDomains": [], "artsDomains": [], "effectsText": "<p>Absorbe les 2X prochains dégâts jusqu'à disparition du tatouage.</p>", "ruleTags": ["protection", "farfadet"] } }
|
|
||||||
]
|
|
||||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000002
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
2026/05/03-20:13:00.428719 7f25c15fe6c0 Delete type=3 #1
|
||||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000002
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
2026/05/03-20:13:00.445629 7f2577fff6c0 Delete type=3 #1
|
||||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000002
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
2026/05/03-20:13:00.492466 7f25c15fe6c0 Delete type=3 #1
|
||||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000002
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
2026/05/03-20:13:00.461618 7f25c1dff6c0 Delete type=3 #1
|
||||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000002
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
2026/05/03-20:13:00.538848 7f25c0dfd6c0 Delete type=3 #1
|
||||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000002
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
2026/05/03-20:13:00.476671 7f25c0dfd6c0 Delete type=3 #1
|
||||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000002
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
2026/05/03-20:13:00.509155 7f2577fff6c0 Delete type=3 #1
|
||||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000002
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
2026/05/03-20:13:00.554628 7f25c15fe6c0 Delete type=3 #1
|
||||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000002
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
2026/05/03-20:13:00.523663 7f25c1dff6c0 Delete type=3 #1
|
||||||
Binary file not shown.
@@ -0,0 +1,132 @@
|
|||||||
|
import fs from "node:fs"
|
||||||
|
import path from "node:path"
|
||||||
|
import crypto from "node:crypto"
|
||||||
|
|
||||||
|
import { Level } from "level"
|
||||||
|
|
||||||
|
const rootDir = path.resolve(import.meta.dirname, "..")
|
||||||
|
const packageJson = JSON.parse(fs.readFileSync(path.join(rootDir, "package.json"), "utf8"))
|
||||||
|
const systemJson = JSON.parse(fs.readFileSync(path.join(rootDir, "system.json"), "utf8"))
|
||||||
|
|
||||||
|
const PACK_SOURCES = [
|
||||||
|
{
|
||||||
|
sourcePath: path.join(rootDir, "packs-src", "armes.json"),
|
||||||
|
outputPath: path.join(rootDir, "packs", "armes"),
|
||||||
|
type: "Item",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
sourcePath: path.join(rootDir, "packs-src", "armures.json"),
|
||||||
|
outputPath: path.join(rootDir, "packs", "armures"),
|
||||||
|
type: "Item",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
sourcePath: path.join(rootDir, "packs-src", "equipements.json"),
|
||||||
|
outputPath: path.join(rootDir, "packs", "equipements"),
|
||||||
|
type: "Item",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
sourcePath: path.join(rootDir, "packs-src", "pouvoirs-compagnie.json"),
|
||||||
|
outputPath: path.join(rootDir, "packs", "pouvoirs-compagnie"),
|
||||||
|
type: "Item",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
sourcePath: path.join(rootDir, "packs-src", "competences.json"),
|
||||||
|
outputPath: path.join(rootDir, "packs", "competences"),
|
||||||
|
type: "Item",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
sourcePath: path.join(rootDir, "packs-src", "races.json"),
|
||||||
|
outputPath: path.join(rootDir, "packs", "races"),
|
||||||
|
type: "Item",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
sourcePath: path.join(rootDir, "packs-src", "tribus.json"),
|
||||||
|
outputPath: path.join(rootDir, "packs", "tribus"),
|
||||||
|
type: "Item",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
sourcePath: path.join(rootDir, "packs-src", "metiers.json"),
|
||||||
|
outputPath: path.join(rootDir, "packs", "metiers"),
|
||||||
|
type: "Item",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
sourcePath: path.join(rootDir, "packs-src", "sortileges.json"),
|
||||||
|
outputPath: path.join(rootDir, "packs", "sortileges"),
|
||||||
|
type: "Item",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
const now = Date.now()
|
||||||
|
const systemId = systemJson.id
|
||||||
|
const systemVersion = packageJson.version
|
||||||
|
const coreVersion = String(systemJson.compatibility?.verified ?? systemJson.compatibility?.minimum ?? "")
|
||||||
|
|
||||||
|
function slugId(input) {
|
||||||
|
const hash = crypto.createHash("sha256").update(input).digest()
|
||||||
|
const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
|
||||||
|
let id = ""
|
||||||
|
for (let index = 0; id.length < 16; index += 1) {
|
||||||
|
id += alphabet[hash[index % hash.length] % alphabet.length]
|
||||||
|
}
|
||||||
|
return id
|
||||||
|
}
|
||||||
|
|
||||||
|
function toPackDocument(entry, index) {
|
||||||
|
const docId = slugId(`${entry.type}:${entry.name}`)
|
||||||
|
return {
|
||||||
|
name: entry.name,
|
||||||
|
type: entry.type,
|
||||||
|
img: entry.img ?? "icons/svg/item-bag.svg",
|
||||||
|
system: entry.system ?? {},
|
||||||
|
effects: Array.isArray(entry.effects) ? entry.effects : [],
|
||||||
|
flags: entry.flags ?? {},
|
||||||
|
_stats: {
|
||||||
|
systemId,
|
||||||
|
systemVersion,
|
||||||
|
coreVersion,
|
||||||
|
createdTime: now,
|
||||||
|
modifiedTime: now,
|
||||||
|
lastModifiedBy: "Copilot",
|
||||||
|
compendiumSource: null,
|
||||||
|
duplicateSource: null,
|
||||||
|
exportSource: null,
|
||||||
|
},
|
||||||
|
_id: docId,
|
||||||
|
folder: null,
|
||||||
|
sort: index * 1000,
|
||||||
|
ownership: {
|
||||||
|
default: 0,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function buildPack({ sourcePath, outputPath, type }) {
|
||||||
|
const source = JSON.parse(fs.readFileSync(sourcePath, "utf8"))
|
||||||
|
if (!Array.isArray(source)) {
|
||||||
|
throw new Error(`Pack source must be an array: ${sourcePath}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.rmSync(outputPath, { recursive: true, force: true })
|
||||||
|
fs.mkdirSync(outputPath, { recursive: true })
|
||||||
|
|
||||||
|
const db = new Level(outputPath, { valueEncoding: "utf8" })
|
||||||
|
|
||||||
|
try {
|
||||||
|
await db.open()
|
||||||
|
const batch = db.batch()
|
||||||
|
source.forEach((entry, index) => {
|
||||||
|
if (!entry.type) {
|
||||||
|
throw new Error(`Missing document type in ${sourcePath}: ${entry.name}`)
|
||||||
|
}
|
||||||
|
const doc = toPackDocument(entry, index)
|
||||||
|
batch.put(`!items!${doc._id}`, JSON.stringify(doc))
|
||||||
|
})
|
||||||
|
await batch.write()
|
||||||
|
} finally {
|
||||||
|
await db.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const pack of PACK_SOURCES) {
|
||||||
|
await buildPack(pack)
|
||||||
|
}
|
||||||
+133
@@ -2,6 +2,9 @@
|
|||||||
"id": "fvtt-les-oublies",
|
"id": "fvtt-les-oublies",
|
||||||
"title": "Les Oubliés",
|
"title": "Les Oubliés",
|
||||||
"description": "Système FoundryVTT AppV2 pour le jeu de role Les Oubliés.",
|
"description": "Système FoundryVTT AppV2 pour le jeu de role Les Oubliés.",
|
||||||
|
"manifest": "https://www.uberwald.me/gitea/public/fvtt-les-oublies/raw/branch/main/system.json",
|
||||||
|
"download": "#{DOWNLOAD}#",
|
||||||
|
"url": "https://www.uberwald.me/gitea/public/fvtt-les-oublies",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
@@ -61,6 +64,7 @@
|
|||||||
"race": {
|
"race": {
|
||||||
"htmlFields": [
|
"htmlFields": [
|
||||||
"description",
|
"description",
|
||||||
|
"appearance",
|
||||||
"specialRules",
|
"specialRules",
|
||||||
"notes"
|
"notes"
|
||||||
]
|
]
|
||||||
@@ -69,6 +73,7 @@
|
|||||||
"htmlFields": [
|
"htmlFields": [
|
||||||
"description",
|
"description",
|
||||||
"specialRules",
|
"specialRules",
|
||||||
|
"roleplayNotes",
|
||||||
"notes"
|
"notes"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -76,6 +81,7 @@
|
|||||||
"htmlFields": [
|
"htmlFields": [
|
||||||
"description",
|
"description",
|
||||||
"specialRules",
|
"specialRules",
|
||||||
|
"roleplayNotes",
|
||||||
"notes"
|
"notes"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -120,5 +126,132 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"primaryTokenAttribute": "system.hp.value",
|
"primaryTokenAttribute": "system.hp.value",
|
||||||
|
"packs": [
|
||||||
|
{
|
||||||
|
"type": "Item",
|
||||||
|
"label": "Armes",
|
||||||
|
"name": "armes",
|
||||||
|
"path": "packs/armes",
|
||||||
|
"system": "fvtt-les-oublies",
|
||||||
|
"flags": {},
|
||||||
|
"ownership": {
|
||||||
|
"PLAYER": "OBSERVER",
|
||||||
|
"ASSISTANT": "OWNER"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Item",
|
||||||
|
"label": "Armures",
|
||||||
|
"name": "armures",
|
||||||
|
"path": "packs/armures",
|
||||||
|
"system": "fvtt-les-oublies",
|
||||||
|
"flags": {},
|
||||||
|
"ownership": {
|
||||||
|
"PLAYER": "OBSERVER",
|
||||||
|
"ASSISTANT": "OWNER"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Item",
|
||||||
|
"label": "Équipement",
|
||||||
|
"name": "equipements",
|
||||||
|
"path": "packs/equipements",
|
||||||
|
"system": "fvtt-les-oublies",
|
||||||
|
"flags": {},
|
||||||
|
"ownership": {
|
||||||
|
"PLAYER": "OBSERVER",
|
||||||
|
"ASSISTANT": "OWNER"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Item",
|
||||||
|
"label": "Pouvoirs de compagnie",
|
||||||
|
"name": "pouvoirs-compagnie",
|
||||||
|
"path": "packs/pouvoirs-compagnie",
|
||||||
|
"system": "fvtt-les-oublies",
|
||||||
|
"flags": {},
|
||||||
|
"ownership": {
|
||||||
|
"PLAYER": "OBSERVER",
|
||||||
|
"ASSISTANT": "OWNER"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Item",
|
||||||
|
"label": "Compétences",
|
||||||
|
"name": "competences",
|
||||||
|
"path": "packs/competences",
|
||||||
|
"system": "fvtt-les-oublies",
|
||||||
|
"flags": {},
|
||||||
|
"ownership": {
|
||||||
|
"PLAYER": "OBSERVER",
|
||||||
|
"ASSISTANT": "OWNER"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Item",
|
||||||
|
"label": "Races",
|
||||||
|
"name": "races",
|
||||||
|
"path": "packs/races",
|
||||||
|
"system": "fvtt-les-oublies",
|
||||||
|
"flags": {},
|
||||||
|
"ownership": {
|
||||||
|
"PLAYER": "OBSERVER",
|
||||||
|
"ASSISTANT": "OWNER"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Item",
|
||||||
|
"label": "Tribus",
|
||||||
|
"name": "tribus",
|
||||||
|
"path": "packs/tribus",
|
||||||
|
"system": "fvtt-les-oublies",
|
||||||
|
"flags": {},
|
||||||
|
"ownership": {
|
||||||
|
"PLAYER": "OBSERVER",
|
||||||
|
"ASSISTANT": "OWNER"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Item",
|
||||||
|
"label": "Métiers",
|
||||||
|
"name": "metiers",
|
||||||
|
"path": "packs/metiers",
|
||||||
|
"system": "fvtt-les-oublies",
|
||||||
|
"flags": {},
|
||||||
|
"ownership": {
|
||||||
|
"PLAYER": "OBSERVER",
|
||||||
|
"ASSISTANT": "OWNER"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Item",
|
||||||
|
"label": "Sortilèges",
|
||||||
|
"name": "sortileges",
|
||||||
|
"path": "packs/sortileges",
|
||||||
|
"system": "fvtt-les-oublies",
|
||||||
|
"flags": {},
|
||||||
|
"ownership": {
|
||||||
|
"PLAYER": "OBSERVER",
|
||||||
|
"ASSISTANT": "OWNER"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"packFolders": [
|
||||||
|
{
|
||||||
|
"name": "Les Oubliés",
|
||||||
|
"sorting": "a",
|
||||||
|
"packs": [
|
||||||
|
"armes",
|
||||||
|
"armures",
|
||||||
|
"equipements",
|
||||||
|
"pouvoirs-compagnie",
|
||||||
|
"competences",
|
||||||
|
"races",
|
||||||
|
"tribus",
|
||||||
|
"metiers",
|
||||||
|
"sortileges"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
"flags": {}
|
"flags": {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,114 @@
|
|||||||
|
<section class="{{cssClass}} les-oublies-sheet compagnie-sheet" autocomplete="off">
|
||||||
|
<header class="sheet-header hero-banner">
|
||||||
|
<img class="profile-img" data-edit="img" data-action="editImage" src="{{actor.img}}" title="{{actor.name}}" />
|
||||||
|
<div class="header-fields hero-copy">
|
||||||
|
<h1 class="sheet-title"><input name="name" type="text" value="{{actor.name}}" placeholder="Nom de compagnie" {{#if isPlayMode}}disabled{{/if}} /></h1>
|
||||||
|
<p class="sheet-subtitle">Capitaine, pouvoir partagé et liens forgés dans l'Exil</p>
|
||||||
|
<button class="mode-button" type="button" data-action="toggleSheet">{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}</button>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
|
{{#each tabs as |tab|}}
|
||||||
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
|
<i class="{{tab.icon}}"></i>
|
||||||
|
<span>{{tab.label}}</span>
|
||||||
|
</button>
|
||||||
|
{{/each}}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.power.cssClass}}" data-tab="power">
|
||||||
|
<section class="sheet-card summary-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.pouvoir"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.powerName"}}</label>
|
||||||
|
<input name="system.power.name" type="text" value="{{system.power.name}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.reserveSongesCompagnie"}}</label>
|
||||||
|
<input name="system.power.sharedDreamPoints" type="number" value="{{system.power.sharedDreamPoints}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.activation"}}</label>
|
||||||
|
<input name="system.power.activationCondition" type="text" value="{{system.power.activationCondition}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaineVisible"}}</label>
|
||||||
|
<input name="system.power.captainVisible" type="checkbox" {{checked system.power.captainVisible}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaineTemoin"}}</label>
|
||||||
|
<input name="system.power.captainNeedsWitness" type="checkbox" {{checked system.power.captainNeedsWitness}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
{{formInput systemFields.power.fields.description enriched=enriched.power.description value=system.power.description name="system.power.description" toggled=true}}
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h3>Items de pouvoir</h3>
|
||||||
|
<button type="button" data-action="createItem" data-type="pouvoircompagnie">+ {{localize "TYPES.Item.pouvoircompagnie"}}</button>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each powers as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{item.system.activationCondition}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
{{#if primaryPower}}
|
||||||
|
<div class="help-text">{{primaryPower.name}} — {{primaryPower.system.activationCondition}}</div>
|
||||||
|
{{/if}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.members.cssClass}}" data-tab="members">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.membres"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaine"}}</label>
|
||||||
|
<select name="system.captainId" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
<option value="">—</option>
|
||||||
|
{{#each choiceSets.captainOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.captainId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ombreDuTourment"}}</label>
|
||||||
|
<select name="system.ombreDuTourmentId" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
<option value="">—</option>
|
||||||
|
{{#each choiceSets.shadowOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.ombreDuTourmentId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<p class="help-text">Sélectionnez le capitaine et l'ombre du tourment parmi les personnages du monde.</p>
|
||||||
|
{{#if captain}}<p><strong>Capitaine :</strong> {{captain.name}}</p>{{/if}}
|
||||||
|
{{#if shadow}}<p><strong>Ombre :</strong> {{shadow.name}}</p>{{/if}}
|
||||||
|
<ul class="reference-list">
|
||||||
|
{{#each members as |member|}}
|
||||||
|
<li>{{member.name}}</li>
|
||||||
|
{{/each}}
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.liensNarratifs"}}</h2>
|
||||||
|
<p class="help-text">{{localize "LESOUBLIES.ui.readOnlyCollection"}}</p>
|
||||||
|
<ul class="reference-list">
|
||||||
|
{{#each links as |link|}}
|
||||||
|
<li><strong>{{link.label}}</strong> — {{link.sourceLabel}} -> {{link.targetLabel}} {{link.details}}</li>
|
||||||
|
{{/each}}
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
|
<section class="sheet-card notes-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.description"}}</h2>
|
||||||
|
{{formInput systemFields.description enriched=enriched.description value=system.description name="system.description" toggled=true}}
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.notes"}}</h2>
|
||||||
|
{{formInput systemFields.notes enriched=enriched.notes value=system.notes name="system.notes" toggled=true}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
@@ -0,0 +1,113 @@
|
|||||||
|
<section class="{{cssClass}} les-oublies-sheet compagnie-sheet" autocomplete="off">
|
||||||
|
<header class="sheet-header hero-banner">
|
||||||
|
<img class="profile-img" data-edit="img" data-action="editImage" src="{{actor.img}}" title="{{actor.name}}" />
|
||||||
|
<div class="header-fields hero-copy">
|
||||||
|
<h1 class="sheet-title"><input name="name" type="text" value="{{actor.name}}" placeholder="Nom de compagnie" {{#if isPlayMode}}disabled{{/if}} /></h1>
|
||||||
|
<button class="mode-button" type="button" data-action="toggleSheet">{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}</button>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
|
{{#each tabs as |tab|}}
|
||||||
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
|
<i class="{{tab.icon}}"></i>
|
||||||
|
<span>{{tab.label}}</span>
|
||||||
|
</button>
|
||||||
|
{{/each}}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.power.cssClass}}" data-tab="power">
|
||||||
|
<section class="sheet-card summary-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.pouvoir"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.powerName"}}</label>
|
||||||
|
<input name="system.power.name" type="text" value="{{system.power.name}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.reserveSongesCompagnie"}}</label>
|
||||||
|
<input name="system.power.sharedDreamPoints" type="number" value="{{system.power.sharedDreamPoints}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.activation"}}</label>
|
||||||
|
<input name="system.power.activationCondition" type="text" value="{{system.power.activationCondition}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaineVisible"}}</label>
|
||||||
|
<input name="system.power.captainVisible" type="checkbox" {{checked system.power.captainVisible}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaineTemoin"}}</label>
|
||||||
|
<input name="system.power.captainNeedsWitness" type="checkbox" {{checked system.power.captainNeedsWitness}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
{{formInput systemFields.power.fields.description enriched=enriched.power.description value=system.power.description name="system.power.description" toggled=true}}
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h3>Items de pouvoir</h3>
|
||||||
|
<button type="button" data-action="createItem" data-type="pouvoircompagnie">+ {{localize "TYPES.Item.pouvoircompagnie"}}</button>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each powers as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{item.system.activationCondition}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
{{#if primaryPower}}
|
||||||
|
<div class="help-text">{{primaryPower.name}} — {{primaryPower.system.activationCondition}}</div>
|
||||||
|
{{/if}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.members.cssClass}}" data-tab="members">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.membres"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaine"}}</label>
|
||||||
|
<select name="system.captainId" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
<option value="">—</option>
|
||||||
|
{{#each choiceSets.captainOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.captainId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ombreDuTourment"}}</label>
|
||||||
|
<select name="system.ombreDuTourmentId" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
<option value="">—</option>
|
||||||
|
{{#each choiceSets.shadowOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.ombreDuTourmentId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<p class="help-text">Sélectionnez le capitaine et l'ombre du tourment parmi les personnages du monde.</p>
|
||||||
|
{{#if captain}}<p><strong>Capitaine :</strong> {{captain.name}}</p>{{/if}}
|
||||||
|
{{#if shadow}}<p><strong>Ombre :</strong> {{shadow.name}}</p>{{/if}}
|
||||||
|
<ul class="reference-list">
|
||||||
|
{{#each members as |member|}}
|
||||||
|
<li>{{member.name}}</li>
|
||||||
|
{{/each}}
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.liensNarratifs"}}</h2>
|
||||||
|
<p class="help-text">{{localize "LESOUBLIES.ui.readOnlyCollection"}}</p>
|
||||||
|
<ul class="reference-list">
|
||||||
|
{{#each links as |link|}}
|
||||||
|
<li><strong>{{link.label}}</strong> — {{link.sourceLabel}} -> {{link.targetLabel}} {{link.details}}</li>
|
||||||
|
{{/each}}
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
|
<section class="sheet-card notes-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.description"}}</h2>
|
||||||
|
{{formInput systemFields.description enriched=enriched.description value=system.description name="system.description" toggled=true}}
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.notes"}}</h2>
|
||||||
|
{{formInput systemFields.notes enriched=enriched.notes value=system.notes name="system.notes" toggled=true}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
@@ -0,0 +1,115 @@
|
|||||||
|
<section class="{{cssClass}} les-oublies-sheet compagnie-sheet" autocomplete="off">
|
||||||
|
<header class="sheet-header hero-banner">
|
||||||
|
<img class="profile-img" data-edit="img" data-action="editImage" src="{{actor.img}}" title="{{actor.name}}" />
|
||||||
|
<div class="header-fields hero-copy">
|
||||||
|
<button class="mode-button mode-button--icon" type="button" data-action="toggleSheet" title="{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}" aria-label="{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}">
|
||||||
|
<i class="fa-solid {{#if isEditMode}}fa-eye{{else}}fa-pen-to-square{{/if}}"></i>
|
||||||
|
</button>
|
||||||
|
<h1 class="sheet-title"><input name="name" type="text" value="{{actor.name}}" placeholder="Nom de compagnie" {{#if isPlayMode}}disabled{{/if}} /></h1>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
|
{{#each tabs as |tab|}}
|
||||||
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
|
<i class="{{tab.icon}}"></i>
|
||||||
|
<span>{{tab.label}}</span>
|
||||||
|
</button>
|
||||||
|
{{/each}}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.power.cssClass}}" data-tab="power">
|
||||||
|
<section class="sheet-card summary-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.pouvoir"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.powerName"}}</label>
|
||||||
|
<input name="system.power.name" type="text" value="{{system.power.name}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.reserveSongesCompagnie"}}</label>
|
||||||
|
<input name="system.power.sharedDreamPoints" type="number" value="{{system.power.sharedDreamPoints}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.activation"}}</label>
|
||||||
|
<input name="system.power.activationCondition" type="text" value="{{system.power.activationCondition}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaineVisible"}}</label>
|
||||||
|
<input name="system.power.captainVisible" type="checkbox" {{checked system.power.captainVisible}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaineTemoin"}}</label>
|
||||||
|
<input name="system.power.captainNeedsWitness" type="checkbox" {{checked system.power.captainNeedsWitness}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
{{formInput systemFields.power.fields.description enriched=enriched.power.description value=system.power.description name="system.power.description" toggled=true}}
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h3>Items de pouvoir</h3>
|
||||||
|
<button type="button" data-action="createItem" data-type="pouvoircompagnie">+ {{localize "TYPES.Item.pouvoircompagnie"}}</button>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each powers as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{item.system.activationCondition}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
{{#if primaryPower}}
|
||||||
|
<div class="help-text">{{primaryPower.name}} — {{primaryPower.system.activationCondition}}</div>
|
||||||
|
{{/if}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.members.cssClass}}" data-tab="members">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.membres"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaine"}}</label>
|
||||||
|
<select name="system.captainId" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
<option value="">—</option>
|
||||||
|
{{#each choiceSets.captainOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.captainId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ombreDuTourment"}}</label>
|
||||||
|
<select name="system.ombreDuTourmentId" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
<option value="">—</option>
|
||||||
|
{{#each choiceSets.shadowOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.ombreDuTourmentId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<p class="help-text">Sélectionnez le capitaine et l'ombre du tourment parmi les personnages du monde.</p>
|
||||||
|
{{#if captain}}<p><strong>Capitaine :</strong> {{captain.name}}</p>{{/if}}
|
||||||
|
{{#if shadow}}<p><strong>Ombre :</strong> {{shadow.name}}</p>{{/if}}
|
||||||
|
<ul class="reference-list">
|
||||||
|
{{#each members as |member|}}
|
||||||
|
<li>{{member.name}}</li>
|
||||||
|
{{/each}}
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.liensNarratifs"}}</h2>
|
||||||
|
<p class="help-text">{{localize "LESOUBLIES.ui.readOnlyCollection"}}</p>
|
||||||
|
<ul class="reference-list">
|
||||||
|
{{#each links as |link|}}
|
||||||
|
<li><strong>{{link.label}}</strong> — {{link.sourceLabel}} -> {{link.targetLabel}} {{link.details}}</li>
|
||||||
|
{{/each}}
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
|
<section class="sheet-card notes-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.description"}}</h2>
|
||||||
|
{{formInput systemFields.description enriched=enriched.description value=system.description name="system.description" toggled=true}}
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.notes"}}</h2>
|
||||||
|
{{formInput systemFields.notes enriched=enriched.notes value=system.notes name="system.notes" toggled=true}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
@@ -9,82 +9,107 @@
|
|||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<section class="sheet-card summary-card">
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
<h2>{{localize "LESOUBLIES.labels.pouvoir"}}</h2>
|
{{#each tabs as |tab|}}
|
||||||
<div class="field-row">
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
<label>{{localize "LESOUBLIES.labels.powerName"}}</label>
|
<i class="{{tab.icon}}"></i>
|
||||||
<input name="system.power.name" type="text" value="{{system.power.name}}" {{#if isPlayMode}}disabled{{/if}} />
|
<span>{{tab.label}}</span>
|
||||||
</div>
|
</button>
|
||||||
<div class="field-row">
|
{{/each}}
|
||||||
<label>{{localize "LESOUBLIES.labels.reserveSongesCompagnie"}}</label>
|
</nav>
|
||||||
<input name="system.power.sharedDreamPoints" type="number" value="{{system.power.sharedDreamPoints}}" {{#if isPlayMode}}disabled{{/if}} />
|
|
||||||
</div>
|
<section class="sheet-tab {{tabs.power.cssClass}}" data-tab="power">
|
||||||
<div class="field-row">
|
<section class="sheet-card summary-card">
|
||||||
<label>{{localize "LESOUBLIES.labels.activation"}}</label>
|
<h2>{{localize "LESOUBLIES.labels.pouvoir"}}</h2>
|
||||||
<input name="system.power.activationCondition" type="text" value="{{system.power.activationCondition}}" {{#if isPlayMode}}disabled{{/if}} />
|
<div class="field-row">
|
||||||
</div>
|
<label>{{localize "LESOUBLIES.labels.powerName"}}</label>
|
||||||
<div class="field-row">
|
<input name="system.power.name" type="text" value="{{system.power.name}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
<label>{{localize "LESOUBLIES.labels.capitaineVisible"}}</label>
|
</div>
|
||||||
<input name="system.power.captainVisible" type="checkbox" {{checked system.power.captainVisible}} {{#if isPlayMode}}disabled{{/if}} />
|
<div class="field-row">
|
||||||
</div>
|
<label>{{localize "LESOUBLIES.labels.reserveSongesCompagnie"}}</label>
|
||||||
<div class="field-row">
|
<input name="system.power.sharedDreamPoints" type="number" value="{{system.power.sharedDreamPoints}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
<label>{{localize "LESOUBLIES.labels.capitaineTemoin"}}</label>
|
</div>
|
||||||
<input name="system.power.captainNeedsWitness" type="checkbox" {{checked system.power.captainNeedsWitness}} {{#if isPlayMode}}disabled{{/if}} />
|
<div class="field-row">
|
||||||
</div>
|
<label>{{localize "LESOUBLIES.labels.activation"}}</label>
|
||||||
{{editor system.power.description target="system.power.description" button=true editable=isEditMode}}
|
<input name="system.power.activationCondition" type="text" value="{{system.power.activationCondition}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
<div class="section-title-row">
|
</div>
|
||||||
<h3>Items de pouvoir</h3>
|
<div class="field-row">
|
||||||
<button type="button" data-action="createItem" data-type="pouvoircompagnie">+ {{localize "TYPES.Item.pouvoircompagnie"}}</button>
|
<label>{{localize "LESOUBLIES.labels.capitaineVisible"}}</label>
|
||||||
</div>
|
<input name="system.power.captainVisible" type="checkbox" {{checked system.power.captainVisible}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
<div class="item-list">
|
</div>
|
||||||
{{#each powers as |item|}}
|
<div class="field-row">
|
||||||
<article class="item-card">
|
<label>{{localize "LESOUBLIES.labels.capitaineTemoin"}}</label>
|
||||||
<div><strong>{{item.name}}</strong><div>{{item.system.activationCondition}}</div></div>
|
<input name="system.power.captainNeedsWitness" type="checkbox" {{checked system.power.captainNeedsWitness}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
</div>
|
||||||
</article>
|
{{formInput systemFields.power.fields.description enriched=enriched.power.description value=system.power.description name="system.power.description" toggled=true}}
|
||||||
{{/each}}
|
<div class="section-title-row">
|
||||||
</div>
|
<h3>Items de pouvoir</h3>
|
||||||
{{#if primaryPower}}
|
<button type="button" data-action="createItem" data-type="pouvoircompagnie">+ {{localize "TYPES.Item.pouvoircompagnie"}}</button>
|
||||||
<div class="help-text">{{primaryPower.name}} — {{primaryPower.system.activationCondition}}</div>
|
</div>
|
||||||
{{/if}}
|
<div class="item-list">
|
||||||
|
{{#each powers as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{item.system.activationCondition}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
{{#if primaryPower}}
|
||||||
|
<div class="help-text">{{primaryPower.name}} — {{primaryPower.system.activationCondition}}</div>
|
||||||
|
{{/if}}
|
||||||
|
</section>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<div class="sheet-grid sheet-grid-2">
|
<section class="sheet-tab {{tabs.members.cssClass}}" data-tab="members">
|
||||||
<section class="sheet-card ledger-card">
|
<div class="sheet-grid sheet-grid-2">
|
||||||
<h2>{{localize "LESOUBLIES.ui.membres"}}</h2>
|
<section class="sheet-card ledger-card">
|
||||||
<div class="field-row">
|
<h2>{{localize "LESOUBLIES.ui.membres"}}</h2>
|
||||||
<label>{{localize "LESOUBLIES.labels.capitaine"}}</label>
|
<div class="field-row">
|
||||||
<input name="system.captainId" type="text" value="{{system.captainId}}" {{#if isPlayMode}}disabled{{/if}} />
|
<label>{{localize "LESOUBLIES.labels.capitaine"}}</label>
|
||||||
</div>
|
<select name="system.captainId" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
<div class="field-row">
|
<option value="">—</option>
|
||||||
<label>{{localize "LESOUBLIES.labels.ombreDuTourment"}}</label>
|
{{#each choiceSets.captainOptions as |option|}}
|
||||||
<input name="system.ombreDuTourmentId" type="text" value="{{system.ombreDuTourmentId}}" {{#if isPlayMode}}disabled{{/if}} />
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.captainId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
</div>
|
{{/each}}
|
||||||
<p class="help-text">{{localize "LESOUBLIES.labels.membresIds"}}</p>
|
</select>
|
||||||
{{#if captain}}<p><strong>Capitaine :</strong> {{captain.name}}</p>{{/if}}
|
</div>
|
||||||
{{#if shadow}}<p><strong>Ombre :</strong> {{shadow.name}}</p>{{/if}}
|
<div class="field-row">
|
||||||
<ul class="reference-list">
|
<label>{{localize "LESOUBLIES.labels.ombreDuTourment"}}</label>
|
||||||
{{#each members as |member|}}
|
<select name="system.ombreDuTourmentId" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
<li>{{member.name}}</li>
|
<option value="">—</option>
|
||||||
{{/each}}
|
{{#each choiceSets.shadowOptions as |option|}}
|
||||||
</ul>
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.ombreDuTourmentId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
</section>
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<p class="help-text">Sélectionnez le capitaine et l'ombre du tourment parmi les personnages du monde.</p>
|
||||||
|
{{#if captain}}<p><strong>Capitaine :</strong> {{captain.name}}</p>{{/if}}
|
||||||
|
{{#if shadow}}<p><strong>Ombre :</strong> {{shadow.name}}</p>{{/if}}
|
||||||
|
<ul class="reference-list">
|
||||||
|
{{#each members as |member|}}
|
||||||
|
<li>{{member.name}}</li>
|
||||||
|
{{/each}}
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
<section class="sheet-card ledger-card">
|
<section class="sheet-card ledger-card">
|
||||||
<h2>{{localize "LESOUBLIES.labels.liensNarratifs"}}</h2>
|
<h2>{{localize "LESOUBLIES.labels.liensNarratifs"}}</h2>
|
||||||
<p class="help-text">{{localize "LESOUBLIES.ui.readOnlyCollection"}}</p>
|
<p class="help-text">{{localize "LESOUBLIES.ui.readOnlyCollection"}}</p>
|
||||||
<ul class="reference-list">
|
<ul class="reference-list">
|
||||||
{{#each links as |link|}}
|
{{#each links as |link|}}
|
||||||
<li><strong>{{link.label}}</strong> — {{link.sourceLabel}} -> {{link.targetLabel}} {{link.details}}</li>
|
<li><strong>{{link.label}}</strong> — {{link.sourceLabel}} -> {{link.targetLabel}} {{link.details}}</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</ul>
|
</ul>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
<section class="sheet-card notes-card">
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
<h2>{{localize "LESOUBLIES.labels.description"}}</h2>
|
<section class="sheet-card notes-card">
|
||||||
{{editor system.description target="system.description" button=true editable=isEditMode}}
|
<h2>{{localize "LESOUBLIES.labels.description"}}</h2>
|
||||||
<h2>{{localize "LESOUBLIES.labels.notes"}}</h2>
|
{{formInput systemFields.description enriched=enriched.description value=system.description name="system.description" toggled=true}}
|
||||||
{{editor system.notes target="system.notes" button=true editable=isEditMode}}
|
<h2>{{localize "LESOUBLIES.labels.notes"}}</h2>
|
||||||
|
{{formInput systemFields.notes enriched=enriched.notes value=system.notes name="system.notes" toggled=true}}
|
||||||
|
</section>
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -0,0 +1,160 @@
|
|||||||
|
<section class="{{cssClass}} les-oublies-sheet creature-sheet" autocomplete="off">
|
||||||
|
<header class="sheet-header hero-banner">
|
||||||
|
<img class="profile-img" data-edit="img" data-action="editImage" src="{{actor.img}}" title="{{actor.name}}" />
|
||||||
|
<div class="header-fields hero-copy">
|
||||||
|
<h1 class="sheet-title"><input name="name" type="text" value="{{actor.name}}" placeholder="Nom" {{#if isPlayMode}}disabled{{/if}} /></h1>
|
||||||
|
<p class="sheet-subtitle">Créatures du Petit Peuple, du Cauchemar et des frontières</p>
|
||||||
|
<div class="sheet-actions">
|
||||||
|
<button type="button" data-action="openRoll">{{localize "LESOUBLIES.rolls.test"}}</button>
|
||||||
|
<button type="button" data-action="openConfrontation">{{localize "LESOUBLIES.rolls.confrontation"}}</button>
|
||||||
|
<button type="button" data-action="openInitiative">{{localize "LESOUBLIES.rolls.initiative"}}</button>
|
||||||
|
<button type="button" data-action="openThreadHarvest">Récolte de fils</button>
|
||||||
|
<button class="mode-button" type="button" data-action="toggleSheet">{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
|
{{#each tabs as |tab|}}
|
||||||
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
|
<i class="{{tab.icon}}"></i>
|
||||||
|
<span>{{tab.label}}</span>
|
||||||
|
</button>
|
||||||
|
{{/each}}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.overview.cssClass}}" data-tab="overview">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card summary-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.derivedOverview"}}</h2>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.categorie"}}</label><input name="system.biodata.categorie" type="text" value="{{system.biodata.categorie}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.taille"}}</label><select name="system.size.value" {{#if isPlayMode}}disabled{{/if}}>{{#each choiceSets.creatureSizeOptions as |option|}}<option value="{{option.value}}" {{#if (eq option.value @root.system.size.value)}}selected{{/if}}>{{option.label}}</option>{{/each}}</select><span>{{derived.sizeLabel}}</span></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.ui.vie"}}</label><input name="system.hp.value" type="number" value="{{system.hp.value}}" {{#if isPlayMode}}disabled{{/if}} /><span>/ {{derived.hpMax}}</span></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.hpAffichage"}}</label><input name="system.hp.display" type="text" value="{{system.hp.display}}" {{#if isPlayMode}}disabled{{/if}} /><span>{{derived.hpDisplay}}</span></div>
|
||||||
|
<div class="field-row"><label>Protection</label><input name="system.protection" type="number" value="{{system.protection}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.ui.songes"}}</label><input name="system.songes.value" type="number" value="{{system.songes.value}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.pointsSonges"}}</label><input name="system.songes.points" type="number" value="{{system.songes.points}}" {{#if isPlayMode}}disabled{{/if}} /><span>/ {{system.songes.max}}</span></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.ui.cauchemar"}}</label><input name="system.cauchemar.value" type="number" value="{{system.cauchemar.value}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.pointsCauchemar"}}</label><input name="system.cauchemar.points" type="number" value="{{system.cauchemar.points}}" {{#if isPlayMode}}disabled{{/if}} /><span>/ {{system.cauchemar.max}}</span></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.degats"}}</h2>
|
||||||
|
{{formInput systemFields.statblock.fields.damage enriched=enriched.statblock.damage value=system.statblock.damage name="system.statblock.damage" toggled=true}}
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.reglesSpeciales"}}</h2>
|
||||||
|
{{formInput systemFields.statblock.fields.special enriched=enriched.statblock.special value=system.statblock.special name="system.statblock.special" toggled=true}}
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.aptitudes.cssClass}}" data-tab="aptitudes">
|
||||||
|
<section class="sheet-card profiles-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.profilsOptionnels"}}</h2>
|
||||||
|
<div class="profile-grid">
|
||||||
|
{{#each system.profils as |value key|}}
|
||||||
|
<div class="profile-cell">
|
||||||
|
<button type="button" data-action="rollProfile" data-profile-key="{{key}}">{{profileLabel key}}</button>
|
||||||
|
<input name="system.profils.{{key}}" type="number" value="{{value}}" {{#if @root.isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.competences"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="competence">+ {{localize "TYPES.Item.competence"}}</button>
|
||||||
|
</div>
|
||||||
|
{{#each skillGroups as |group|}}
|
||||||
|
{{#if (count group.items)}}
|
||||||
|
<div class="group-block">
|
||||||
|
<h3>{{group.label}}</h3>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each group.items as |entry|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{entry.item.name}}</strong><div>{{localize "LESOUBLIES.labels.valeurFinale"}} {{entry.finalValue}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="rollSkill" data-item-id="{{entry.item.id}}">{{localize "LESOUBLIES.ui.roll"}}</button><button type="button" data-action="editItem" data-item-id="{{entry.item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{entry.item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
{{/each}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.combat.cssClass}}" data-tab="combat">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.sortilegesSonges"}}</h2>
|
||||||
|
{{formInput systemFields.statblock.fields.spellSonges enriched=enriched.statblock.spellSonges value=system.statblock.spellSonges name="system.statblock.spellSonges" toggled=true}}
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.sortilegesCauchemar"}}</h2>
|
||||||
|
{{formInput systemFields.statblock.fields.spellCauchemar enriched=enriched.statblock.spellCauchemar value=system.statblock.spellCauchemar name="system.statblock.spellCauchemar" toggled=true}}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.combat"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="encourager">Encourager</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="intimider">Intimider</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="evaluer">Évaluer</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="maitriser">Maîtriser</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="seDeplacer">Se déplacer</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.equipement"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="createItem" data-type="arme">+ {{localize "TYPES.Item.arme"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="armure">+ {{localize "TYPES.Item.armure"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="equipement">+ {{localize "TYPES.Item.equipement"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="sortilege">+ {{localize "TYPES.Item.sortilege"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each weapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{item.system.damage}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useWeapon" data-item-id="{{item.id}}">Attaque</button><button type="button" data-action="resolveWeaponDamage" data-item-id="{{item.id}}">Dégâts</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each armors as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>Prot {{item.system.protection}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each equipment as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.equipement"}} - {{item.system.category}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each spells as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{item.system.tradition}} / {{item.system.polarity}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useSpell" data-item-id="{{item.id}}">Activer</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
|
<section class="sheet-card notes-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.description"}}</h2>
|
||||||
|
{{formInput systemFields.biodata.fields.description enriched=enriched.biodata.description value=system.biodata.description name="system.biodata.description" toggled=true}}
|
||||||
|
<h2>Habitat</h2>
|
||||||
|
{{formInput systemFields.biodata.fields.habitat enriched=enriched.biodata.habitat value=system.biodata.habitat name="system.biodata.habitat" toggled=true}}
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.notes"}}</h2>
|
||||||
|
{{formInput systemFields.biodata.fields.notes enriched=enriched.biodata.notes value=system.biodata.notes name="system.biodata.notes" toggled=true}}
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.gmnotes"}}</h2>
|
||||||
|
{{formInput systemFields.biodata.fields.gmnotes enriched=enriched.biodata.gmnotes value=system.biodata.gmnotes name="system.biodata.gmnotes" toggled=true}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
@@ -0,0 +1,159 @@
|
|||||||
|
<section class="{{cssClass}} les-oublies-sheet creature-sheet" autocomplete="off">
|
||||||
|
<header class="sheet-header hero-banner">
|
||||||
|
<img class="profile-img" data-edit="img" data-action="editImage" src="{{actor.img}}" title="{{actor.name}}" />
|
||||||
|
<div class="header-fields hero-copy">
|
||||||
|
<h1 class="sheet-title"><input name="name" type="text" value="{{actor.name}}" placeholder="Nom" {{#if isPlayMode}}disabled{{/if}} /></h1>
|
||||||
|
<div class="sheet-actions">
|
||||||
|
<button type="button" data-action="openRoll">{{localize "LESOUBLIES.rolls.test"}}</button>
|
||||||
|
<button type="button" data-action="openConfrontation">{{localize "LESOUBLIES.rolls.confrontation"}}</button>
|
||||||
|
<button type="button" data-action="openInitiative">{{localize "LESOUBLIES.rolls.initiative"}}</button>
|
||||||
|
<button type="button" data-action="openThreadHarvest">Récolte de fils</button>
|
||||||
|
<button class="mode-button" type="button" data-action="toggleSheet">{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
|
{{#each tabs as |tab|}}
|
||||||
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
|
<i class="{{tab.icon}}"></i>
|
||||||
|
<span>{{tab.label}}</span>
|
||||||
|
</button>
|
||||||
|
{{/each}}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.overview.cssClass}}" data-tab="overview">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card summary-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.derivedOverview"}}</h2>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.categorie"}}</label><input name="system.biodata.categorie" type="text" value="{{system.biodata.categorie}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.taille"}}</label><select name="system.size.value" {{#if isPlayMode}}disabled{{/if}}>{{#each choiceSets.creatureSizeOptions as |option|}}<option value="{{option.value}}" {{#if (eq option.value @root.system.size.value)}}selected{{/if}}>{{option.label}}</option>{{/each}}</select><span>{{derived.sizeLabel}}</span></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.ui.vie"}}</label><input name="system.hp.value" type="number" value="{{system.hp.value}}" {{#if isPlayMode}}disabled{{/if}} /><span>/ {{derived.hpMax}}</span></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.hpAffichage"}}</label><input name="system.hp.display" type="text" value="{{system.hp.display}}" {{#if isPlayMode}}disabled{{/if}} /><span>{{derived.hpDisplay}}</span></div>
|
||||||
|
<div class="field-row"><label>Protection</label><input name="system.protection" type="number" value="{{system.protection}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.ui.songes"}}</label><input name="system.songes.value" type="number" value="{{system.songes.value}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.pointsSonges"}}</label><input name="system.songes.points" type="number" value="{{system.songes.points}}" {{#if isPlayMode}}disabled{{/if}} /><span>/ {{system.songes.max}}</span></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.ui.cauchemar"}}</label><input name="system.cauchemar.value" type="number" value="{{system.cauchemar.value}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.pointsCauchemar"}}</label><input name="system.cauchemar.points" type="number" value="{{system.cauchemar.points}}" {{#if isPlayMode}}disabled{{/if}} /><span>/ {{system.cauchemar.max}}</span></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.degats"}}</h2>
|
||||||
|
{{formInput systemFields.statblock.fields.damage enriched=enriched.statblock.damage value=system.statblock.damage name="system.statblock.damage" toggled=true}}
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.reglesSpeciales"}}</h2>
|
||||||
|
{{formInput systemFields.statblock.fields.special enriched=enriched.statblock.special value=system.statblock.special name="system.statblock.special" toggled=true}}
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.aptitudes.cssClass}}" data-tab="aptitudes">
|
||||||
|
<section class="sheet-card profiles-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.profilsOptionnels"}}</h2>
|
||||||
|
<div class="profile-grid">
|
||||||
|
{{#each system.profils as |value key|}}
|
||||||
|
<div class="profile-cell">
|
||||||
|
<button type="button" data-action="rollProfile" data-profile-key="{{key}}">{{profileLabel key}}</button>
|
||||||
|
<input name="system.profils.{{key}}" type="number" value="{{value}}" {{#if @root.isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.competences"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="competence">+ {{localize "TYPES.Item.competence"}}</button>
|
||||||
|
</div>
|
||||||
|
{{#each skillGroups as |group|}}
|
||||||
|
{{#if (count group.items)}}
|
||||||
|
<div class="group-block">
|
||||||
|
<h3>{{group.label}}</h3>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each group.items as |entry|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{entry.item.name}}</strong><div>{{localize "LESOUBLIES.labels.valeurFinale"}} {{entry.finalValue}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="rollSkill" data-item-id="{{entry.item.id}}">{{localize "LESOUBLIES.ui.roll"}}</button><button type="button" data-action="editItem" data-item-id="{{entry.item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{entry.item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
{{/each}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.combat.cssClass}}" data-tab="combat">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.sortilegesSonges"}}</h2>
|
||||||
|
{{formInput systemFields.statblock.fields.spellSonges enriched=enriched.statblock.spellSonges value=system.statblock.spellSonges name="system.statblock.spellSonges" toggled=true}}
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.sortilegesCauchemar"}}</h2>
|
||||||
|
{{formInput systemFields.statblock.fields.spellCauchemar enriched=enriched.statblock.spellCauchemar value=system.statblock.spellCauchemar name="system.statblock.spellCauchemar" toggled=true}}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.combat"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="encourager">Encourager</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="intimider">Intimider</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="evaluer">Évaluer</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="maitriser">Maîtriser</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="seDeplacer">Se déplacer</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.equipement"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="createItem" data-type="arme">+ {{localize "TYPES.Item.arme"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="armure">+ {{localize "TYPES.Item.armure"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="equipement">+ {{localize "TYPES.Item.equipement"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="sortilege">+ {{localize "TYPES.Item.sortilege"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each weapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{item.system.damage}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useWeapon" data-item-id="{{item.id}}">Attaque</button><button type="button" data-action="resolveWeaponDamage" data-item-id="{{item.id}}">Dégâts</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each armors as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>Prot {{item.system.protection}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each equipment as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.equipement"}} - {{item.system.category}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each spells as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{item.system.tradition}} / {{item.system.polarity}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useSpell" data-item-id="{{item.id}}">Activer</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
|
<section class="sheet-card notes-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.description"}}</h2>
|
||||||
|
{{formInput systemFields.biodata.fields.description enriched=enriched.biodata.description value=system.biodata.description name="system.biodata.description" toggled=true}}
|
||||||
|
<h2>Habitat</h2>
|
||||||
|
{{formInput systemFields.biodata.fields.habitat enriched=enriched.biodata.habitat value=system.biodata.habitat name="system.biodata.habitat" toggled=true}}
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.notes"}}</h2>
|
||||||
|
{{formInput systemFields.biodata.fields.notes enriched=enriched.biodata.notes value=system.biodata.notes name="system.biodata.notes" toggled=true}}
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.gmnotes"}}</h2>
|
||||||
|
{{formInput systemFields.biodata.fields.gmnotes enriched=enriched.biodata.gmnotes value=system.biodata.gmnotes name="system.biodata.gmnotes" toggled=true}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
@@ -0,0 +1,161 @@
|
|||||||
|
<section class="{{cssClass}} les-oublies-sheet creature-sheet" autocomplete="off">
|
||||||
|
<header class="sheet-header hero-banner">
|
||||||
|
<img class="profile-img" data-edit="img" data-action="editImage" src="{{actor.img}}" title="{{actor.name}}" />
|
||||||
|
<div class="header-fields hero-copy">
|
||||||
|
<button class="mode-button mode-button--icon" type="button" data-action="toggleSheet" title="{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}" aria-label="{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}">
|
||||||
|
<i class="fa-solid {{#if isEditMode}}fa-eye{{else}}fa-pen-to-square{{/if}}"></i>
|
||||||
|
</button>
|
||||||
|
<h1 class="sheet-title"><input name="name" type="text" value="{{actor.name}}" placeholder="Nom" {{#if isPlayMode}}disabled{{/if}} /></h1>
|
||||||
|
<div class="sheet-actions">
|
||||||
|
<button type="button" data-action="openRoll">{{localize "LESOUBLIES.rolls.test"}}</button>
|
||||||
|
<button type="button" data-action="openConfrontation">{{localize "LESOUBLIES.rolls.confrontation"}}</button>
|
||||||
|
<button type="button" data-action="openInitiative">{{localize "LESOUBLIES.rolls.initiative"}}</button>
|
||||||
|
<button type="button" data-action="openThreadHarvest">Récolte de fils</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
|
{{#each tabs as |tab|}}
|
||||||
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
|
<i class="{{tab.icon}}"></i>
|
||||||
|
<span>{{tab.label}}</span>
|
||||||
|
</button>
|
||||||
|
{{/each}}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.overview.cssClass}}" data-tab="overview">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card summary-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.derivedOverview"}}</h2>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.categorie"}}</label><input name="system.biodata.categorie" type="text" value="{{system.biodata.categorie}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.taille"}}</label><select name="system.size.value" {{#if isPlayMode}}disabled{{/if}}>{{#each choiceSets.creatureSizeOptions as |option|}}<option value="{{option.value}}" {{#if (eq option.value @root.system.size.value)}}selected{{/if}}>{{option.label}}</option>{{/each}}</select><span>{{derived.sizeLabel}}</span></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.ui.vie"}}</label><input name="system.hp.value" type="number" value="{{system.hp.value}}" {{#if isPlayMode}}disabled{{/if}} /><span>/ {{derived.hpMax}}</span></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.hpAffichage"}}</label><input name="system.hp.display" type="text" value="{{system.hp.display}}" {{#if isPlayMode}}disabled{{/if}} /><span>{{derived.hpDisplay}}</span></div>
|
||||||
|
<div class="field-row"><label>Protection</label><input name="system.protection" type="number" value="{{system.protection}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.ui.songes"}}</label><input name="system.songes.value" type="number" value="{{system.songes.value}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.pointsSonges"}}</label><input name="system.songes.points" type="number" value="{{system.songes.points}}" {{#if isPlayMode}}disabled{{/if}} /><span>/ {{system.songes.max}}</span></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.ui.cauchemar"}}</label><input name="system.cauchemar.value" type="number" value="{{system.cauchemar.value}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.pointsCauchemar"}}</label><input name="system.cauchemar.points" type="number" value="{{system.cauchemar.points}}" {{#if isPlayMode}}disabled{{/if}} /><span>/ {{system.cauchemar.max}}</span></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.degats"}}</h2>
|
||||||
|
{{formInput systemFields.statblock.fields.damage enriched=enriched.statblock.damage value=system.statblock.damage name="system.statblock.damage" toggled=true}}
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.reglesSpeciales"}}</h2>
|
||||||
|
{{formInput systemFields.statblock.fields.special enriched=enriched.statblock.special value=system.statblock.special name="system.statblock.special" toggled=true}}
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.aptitudes.cssClass}}" data-tab="aptitudes">
|
||||||
|
<section class="sheet-card profiles-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.profilsOptionnels"}}</h2>
|
||||||
|
<div class="profile-grid">
|
||||||
|
{{#each system.profils as |value key|}}
|
||||||
|
<div class="profile-cell">
|
||||||
|
<button type="button" data-action="rollProfile" data-profile-key="{{key}}">{{profileLabel key}}</button>
|
||||||
|
<input name="system.profils.{{key}}" type="number" value="{{value}}" {{#if @root.isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.competences"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="competence">+ {{localize "TYPES.Item.competence"}}</button>
|
||||||
|
</div>
|
||||||
|
{{#each skillGroups as |group|}}
|
||||||
|
{{#if (count group.items)}}
|
||||||
|
<div class="group-block">
|
||||||
|
<h3>{{group.label}}</h3>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each group.items as |entry|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{entry.item.name}}</strong><div>{{localize "LESOUBLIES.labels.valeurFinale"}} {{entry.finalValue}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="rollSkill" data-item-id="{{entry.item.id}}">{{localize "LESOUBLIES.ui.roll"}}</button><button type="button" data-action="editItem" data-item-id="{{entry.item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{entry.item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
{{/each}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.combat.cssClass}}" data-tab="combat">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.sortilegesSonges"}}</h2>
|
||||||
|
{{formInput systemFields.statblock.fields.spellSonges enriched=enriched.statblock.spellSonges value=system.statblock.spellSonges name="system.statblock.spellSonges" toggled=true}}
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.sortilegesCauchemar"}}</h2>
|
||||||
|
{{formInput systemFields.statblock.fields.spellCauchemar enriched=enriched.statblock.spellCauchemar value=system.statblock.spellCauchemar name="system.statblock.spellCauchemar" toggled=true}}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.combat"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="encourager">Encourager</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="intimider">Intimider</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="evaluer">Évaluer</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="maitriser">Maîtriser</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="seDeplacer">Se déplacer</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.equipement"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="createItem" data-type="arme">+ {{localize "TYPES.Item.arme"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="armure">+ {{localize "TYPES.Item.armure"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="equipement">+ {{localize "TYPES.Item.equipement"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="sortilege">+ {{localize "TYPES.Item.sortilege"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each weapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{item.system.damage}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useWeapon" data-item-id="{{item.id}}">Attaque</button><button type="button" data-action="resolveWeaponDamage" data-item-id="{{item.id}}">Dégâts</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each armors as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>Prot {{item.system.protection}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each equipment as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.equipement"}} - {{item.system.category}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each spells as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{item.system.tradition}} / {{item.system.polarity}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useSpell" data-item-id="{{item.id}}">Activer</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
|
<section class="sheet-card notes-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.description"}}</h2>
|
||||||
|
{{formInput systemFields.biodata.fields.description enriched=enriched.biodata.description value=system.biodata.description name="system.biodata.description" toggled=true}}
|
||||||
|
<h2>Habitat</h2>
|
||||||
|
{{formInput systemFields.biodata.fields.habitat enriched=enriched.biodata.habitat value=system.biodata.habitat name="system.biodata.habitat" toggled=true}}
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.notes"}}</h2>
|
||||||
|
{{formInput systemFields.biodata.fields.notes enriched=enriched.biodata.notes value=system.biodata.notes name="system.biodata.notes" toggled=true}}
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.gmnotes"}}</h2>
|
||||||
|
{{formInput systemFields.biodata.fields.gmnotes enriched=enriched.biodata.gmnotes value=system.biodata.gmnotes name="system.biodata.gmnotes" toggled=true}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
@@ -0,0 +1,159 @@
|
|||||||
|
<section class="{{cssClass}} les-oublies-sheet creature-sheet" autocomplete="off">
|
||||||
|
<header class="sheet-header hero-banner">
|
||||||
|
<img class="profile-img" data-edit="img" data-action="editImage" src="{{actor.img}}" title="{{actor.name}}" />
|
||||||
|
<div class="header-fields hero-copy">
|
||||||
|
<button class="mode-button mode-button--icon" type="button" data-action="toggleSheet" title="{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}" aria-label="{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}">
|
||||||
|
<i class="fa-solid {{#if isEditMode}}fa-eye{{else}}fa-pen-to-square{{/if}}"></i>
|
||||||
|
</button>
|
||||||
|
<h1 class="sheet-title"><input name="name" type="text" value="{{actor.name}}" placeholder="Nom" {{#if isPlayMode}}disabled{{/if}} /></h1>
|
||||||
|
<div class="sheet-actions">
|
||||||
|
<button type="button" data-action="openInitiative">{{localize "LESOUBLIES.rolls.initiative"}}</button>
|
||||||
|
<button type="button" data-action="openThreadHarvest">Récolte de fils</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
|
{{#each tabs as |tab|}}
|
||||||
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
|
<i class="{{tab.icon}}"></i>
|
||||||
|
<span>{{tab.label}}</span>
|
||||||
|
</button>
|
||||||
|
{{/each}}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.overview.cssClass}}" data-tab="overview">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card summary-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.derivedOverview"}}</h2>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.categorie"}}</label><input name="system.biodata.categorie" type="text" value="{{system.biodata.categorie}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.taille"}}</label><select name="system.size.value" {{#if isPlayMode}}disabled{{/if}}>{{#each choiceSets.creatureSizeOptions as |option|}}<option value="{{option.value}}" {{#if (eq option.value @root.system.size.value)}}selected{{/if}}>{{option.label}}</option>{{/each}}</select><span>{{derived.sizeLabel}}</span></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.ui.vie"}}</label><input name="system.hp.value" type="number" value="{{system.hp.value}}" {{#if isPlayMode}}disabled{{/if}} /><span>/ {{derived.hpMax}}</span></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.hpAffichage"}}</label><input name="system.hp.display" type="text" value="{{system.hp.display}}" {{#if isPlayMode}}disabled{{/if}} /><span>{{derived.hpDisplay}}</span></div>
|
||||||
|
<div class="field-row"><label>Protection</label><input name="system.protection" type="number" value="{{system.protection}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.ui.songes"}}</label><input name="system.songes.value" type="number" value="{{system.songes.value}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.pointsSonges"}}</label><input name="system.songes.points" type="number" value="{{system.songes.points}}" {{#if isPlayMode}}disabled{{/if}} /><span>/ {{system.songes.max}}</span></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.ui.cauchemar"}}</label><input name="system.cauchemar.value" type="number" value="{{system.cauchemar.value}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.pointsCauchemar"}}</label><input name="system.cauchemar.points" type="number" value="{{system.cauchemar.points}}" {{#if isPlayMode}}disabled{{/if}} /><span>/ {{system.cauchemar.max}}</span></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.degats"}}</h2>
|
||||||
|
{{formInput systemFields.statblock.fields.damage enriched=enriched.statblock.damage value=system.statblock.damage name="system.statblock.damage" toggled=true}}
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.reglesSpeciales"}}</h2>
|
||||||
|
{{formInput systemFields.statblock.fields.special enriched=enriched.statblock.special value=system.statblock.special name="system.statblock.special" toggled=true}}
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.aptitudes.cssClass}}" data-tab="aptitudes">
|
||||||
|
<section class="sheet-card profiles-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.profilsOptionnels"}}</h2>
|
||||||
|
<div class="profile-grid">
|
||||||
|
{{#each system.profils as |value key|}}
|
||||||
|
<div class="profile-cell">
|
||||||
|
<button type="button" data-action="rollProfile" data-profile-key="{{key}}">{{profileLabel key}}</button>
|
||||||
|
<input name="system.profils.{{key}}" type="number" value="{{value}}" {{#if @root.isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.competences"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="competence">+ {{localize "TYPES.Item.competence"}}</button>
|
||||||
|
</div>
|
||||||
|
{{#each skillGroups as |group|}}
|
||||||
|
{{#if (count group.items)}}
|
||||||
|
<div class="group-block">
|
||||||
|
<h3>{{group.label}}</h3>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each group.items as |entry|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{entry.item.name}}</strong><div>{{localize "LESOUBLIES.labels.valeurFinale"}} {{entry.finalValue}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="rollSkill" data-item-id="{{entry.item.id}}">{{localize "LESOUBLIES.ui.roll"}}</button><button type="button" data-action="editItem" data-item-id="{{entry.item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{entry.item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
{{/each}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.combat.cssClass}}" data-tab="combat">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.sortilegesSonges"}}</h2>
|
||||||
|
{{formInput systemFields.statblock.fields.spellSonges enriched=enriched.statblock.spellSonges value=system.statblock.spellSonges name="system.statblock.spellSonges" toggled=true}}
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.sortilegesCauchemar"}}</h2>
|
||||||
|
{{formInput systemFields.statblock.fields.spellCauchemar enriched=enriched.statblock.spellCauchemar value=system.statblock.spellCauchemar name="system.statblock.spellCauchemar" toggled=true}}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.combat"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="encourager">Encourager</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="intimider">Intimider</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="evaluer">Évaluer</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="maitriser">Maîtriser</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="seDeplacer">Se déplacer</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.equipement"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="createItem" data-type="arme">+ {{localize "TYPES.Item.arme"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="armure">+ {{localize "TYPES.Item.armure"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="equipement">+ {{localize "TYPES.Item.equipement"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="sortilege">+ {{localize "TYPES.Item.sortilege"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each weapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{item.system.damage}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useWeapon" data-item-id="{{item.id}}">Attaque</button><button type="button" data-action="resolveWeaponDamage" data-item-id="{{item.id}}">Dégâts</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each armors as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>Prot {{item.system.protection}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each equipment as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.equipement"}} - {{item.system.category}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each spells as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{item.system.tradition}} / {{item.system.polarity}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useSpell" data-item-id="{{item.id}}">Activer</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
|
<section class="sheet-card notes-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.description"}}</h2>
|
||||||
|
{{formInput systemFields.biodata.fields.description enriched=enriched.biodata.description value=system.biodata.description name="system.biodata.description" toggled=true}}
|
||||||
|
<h2>Habitat</h2>
|
||||||
|
{{formInput systemFields.biodata.fields.habitat enriched=enriched.biodata.habitat value=system.biodata.habitat name="system.biodata.habitat" toggled=true}}
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.notes"}}</h2>
|
||||||
|
{{formInput systemFields.biodata.fields.notes enriched=enriched.biodata.notes value=system.biodata.notes name="system.biodata.notes" toggled=true}}
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.gmnotes"}}</h2>
|
||||||
|
{{formInput systemFields.biodata.fields.gmnotes enriched=enriched.biodata.gmnotes value=system.biodata.gmnotes name="system.biodata.gmnotes" toggled=true}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
+122
-105
@@ -15,20 +15,40 @@
|
|||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div class="sheet-grid sheet-grid-2">
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
<section class="sheet-card summary-card">
|
{{#each tabs as |tab|}}
|
||||||
<h2>{{localize "LESOUBLIES.ui.derivedOverview"}}</h2>
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
<div class="field-row"><label>{{localize "LESOUBLIES.labels.categorie"}}</label><input name="system.biodata.categorie" type="text" value="{{system.biodata.categorie}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
<i class="{{tab.icon}}"></i>
|
||||||
<div class="field-row"><label>{{localize "LESOUBLIES.labels.taille"}}</label><input name="system.size.value" type="number" value="{{system.size.value}}" {{#if isPlayMode}}disabled{{/if}} /><span>{{derived.sizeLabel}}</span></div>
|
<span>{{tab.label}}</span>
|
||||||
<div class="field-row"><label>{{localize "LESOUBLIES.ui.vie"}}</label><input name="system.hp.value" type="number" value="{{system.hp.value}}" {{#if isPlayMode}}disabled{{/if}} /><span>/ {{derived.hpMax}}</span></div>
|
</button>
|
||||||
<div class="field-row"><label>{{localize "LESOUBLIES.labels.hpAffichage"}}</label><input name="system.hp.display" type="text" value="{{system.hp.display}}" {{#if isPlayMode}}disabled{{/if}} /><span>{{derived.hpDisplay}}</span></div>
|
{{/each}}
|
||||||
<div class="field-row"><label>Protection</label><input name="system.protection" type="number" value="{{system.protection}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
</nav>
|
||||||
<div class="field-row"><label>{{localize "LESOUBLIES.ui.songes"}}</label><input name="system.songes.value" type="number" value="{{system.songes.value}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
|
||||||
<div class="field-row"><label>{{localize "LESOUBLIES.labels.pointsSonges"}}</label><input name="system.songes.points" type="number" value="{{system.songes.points}}" {{#if isPlayMode}}disabled{{/if}} /><span>/ {{system.songes.max}}</span></div>
|
|
||||||
<div class="field-row"><label>{{localize "LESOUBLIES.ui.cauchemar"}}</label><input name="system.cauchemar.value" type="number" value="{{system.cauchemar.value}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
|
||||||
<div class="field-row"><label>{{localize "LESOUBLIES.labels.pointsCauchemar"}}</label><input name="system.cauchemar.points" type="number" value="{{system.cauchemar.points}}" {{#if isPlayMode}}disabled{{/if}} /><span>/ {{system.cauchemar.max}}</span></div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.overview.cssClass}}" data-tab="overview">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card summary-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.derivedOverview"}}</h2>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.categorie"}}</label><input name="system.biodata.categorie" type="text" value="{{system.biodata.categorie}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.taille"}}</label><select name="system.size.value" {{#if isPlayMode}}disabled{{/if}}>{{#each choiceSets.creatureSizeOptions as |option|}}<option value="{{option.value}}" {{#if (eq option.value @root.system.size.value)}}selected{{/if}}>{{option.label}}</option>{{/each}}</select><span>{{derived.sizeLabel}}</span></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.ui.vie"}}</label><input name="system.hp.value" type="number" value="{{system.hp.value}}" {{#if isPlayMode}}disabled{{/if}} /><span>/ {{derived.hpMax}}</span></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.hpAffichage"}}</label><input name="system.hp.display" type="text" value="{{system.hp.display}}" {{#if isPlayMode}}disabled{{/if}} /><span>{{derived.hpDisplay}}</span></div>
|
||||||
|
<div class="field-row"><label>Protection</label><input name="system.protection" type="number" value="{{system.protection}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.ui.songes"}}</label><input name="system.songes.value" type="number" value="{{system.songes.value}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.pointsSonges"}}</label><input name="system.songes.points" type="number" value="{{system.songes.points}}" {{#if isPlayMode}}disabled{{/if}} /><span>/ {{system.songes.max}}</span></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.ui.cauchemar"}}</label><input name="system.cauchemar.value" type="number" value="{{system.cauchemar.value}}" {{#if isPlayMode}}disabled{{/if}} /></div>
|
||||||
|
<div class="field-row"><label>{{localize "LESOUBLIES.labels.pointsCauchemar"}}</label><input name="system.cauchemar.points" type="number" value="{{system.cauchemar.points}}" {{#if isPlayMode}}disabled{{/if}} /><span>/ {{system.cauchemar.max}}</span></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.degats"}}</h2>
|
||||||
|
{{formInput systemFields.statblock.fields.damage enriched=enriched.statblock.damage value=system.statblock.damage name="system.statblock.damage" toggled=true}}
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.reglesSpeciales"}}</h2>
|
||||||
|
{{formInput systemFields.statblock.fields.special enriched=enriched.statblock.special value=system.statblock.special name="system.statblock.special" toggled=true}}
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.aptitudes.cssClass}}" data-tab="aptitudes">
|
||||||
<section class="sheet-card profiles-card">
|
<section class="sheet-card profiles-card">
|
||||||
<h2>{{localize "LESOUBLIES.labels.profilsOptionnels"}}</h2>
|
<h2>{{localize "LESOUBLIES.labels.profilsOptionnels"}}</h2>
|
||||||
<div class="profile-grid">
|
<div class="profile-grid">
|
||||||
@@ -40,105 +60,102 @@
|
|||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
|
||||||
|
|
||||||
<section class="sheet-card ledger-card">
|
<section class="sheet-card ledger-card">
|
||||||
<div class="section-title-row">
|
<div class="section-title-row">
|
||||||
<h2>{{localize "LESOUBLIES.ui.competences"}}</h2>
|
<h2>{{localize "LESOUBLIES.ui.competences"}}</h2>
|
||||||
<button type="button" data-action="createItem" data-type="competence">+ {{localize "TYPES.Item.competence"}}</button>
|
<button type="button" data-action="createItem" data-type="competence">+ {{localize "TYPES.Item.competence"}}</button>
|
||||||
</div>
|
</div>
|
||||||
{{#each skillGroups as |group|}}
|
{{#each skillGroups as |group|}}
|
||||||
{{#if (count group.items)}}
|
{{#if (count group.items)}}
|
||||||
<div class="group-block">
|
<div class="group-block">
|
||||||
<h3>{{group.label}}</h3>
|
<h3>{{group.label}}</h3>
|
||||||
<div class="item-list">
|
<div class="item-list">
|
||||||
{{#each group.items as |entry|}}
|
{{#each group.items as |entry|}}
|
||||||
<article class="item-card">
|
<article class="item-card">
|
||||||
<div><strong>{{entry.item.name}}</strong><div>{{localize "LESOUBLIES.labels.valeurFinale"}} {{entry.finalValue}}</div></div>
|
<div><strong>{{entry.item.name}}</strong><div>{{localize "LESOUBLIES.labels.valeurFinale"}} {{entry.finalValue}}</div></div>
|
||||||
<div class="item-controls"><button type="button" data-action="rollSkill" data-item-id="{{entry.item.id}}">{{localize "LESOUBLIES.ui.roll"}}</button><button type="button" data-action="editItem" data-item-id="{{entry.item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{entry.item.id}}">Delete</button></div>
|
<div class="item-controls"><button type="button" data-action="rollSkill" data-item-id="{{entry.item.id}}">{{localize "LESOUBLIES.ui.roll"}}</button><button type="button" data-action="editItem" data-item-id="{{entry.item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{entry.item.id}}">Delete</button></div>
|
||||||
</article>
|
</article>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
{{/each}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.combat.cssClass}}" data-tab="combat">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.sortilegesSonges"}}</h2>
|
||||||
|
{{formInput systemFields.statblock.fields.spellSonges enriched=enriched.statblock.spellSonges value=system.statblock.spellSonges name="system.statblock.spellSonges" toggled=true}}
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.sortilegesCauchemar"}}</h2>
|
||||||
|
{{formInput systemFields.statblock.fields.spellCauchemar enriched=enriched.statblock.spellCauchemar value=system.statblock.spellCauchemar name="system.statblock.spellCauchemar" toggled=true}}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.combat"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="encourager">Encourager</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="intimider">Intimider</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="evaluer">Évaluer</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="maitriser">Maîtriser</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="seDeplacer">Se déplacer</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
</section>
|
||||||
{{/each}}
|
</div>
|
||||||
</section>
|
|
||||||
|
|
||||||
<div class="sheet-grid sheet-grid-2">
|
|
||||||
<section class="sheet-card ledger-card">
|
|
||||||
<h2>{{localize "LESOUBLIES.labels.degats"}}</h2>
|
|
||||||
{{editor system.statblock.damage target="system.statblock.damage" button=true editable=isEditMode}}
|
|
||||||
<h2>{{localize "LESOUBLIES.labels.reglesSpeciales"}}</h2>
|
|
||||||
{{editor system.statblock.special target="system.statblock.special" button=true editable=isEditMode}}
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section class="sheet-card ledger-card">
|
<section class="sheet-card ledger-card">
|
||||||
<h2>{{localize "LESOUBLIES.labels.sortilegesSonges"}}</h2>
|
<div class="section-title-row">
|
||||||
{{editor system.statblock.spellSonges target="system.statblock.spellSonges" button=true editable=isEditMode}}
|
<h2>{{localize "LESOUBLIES.ui.equipement"}}</h2>
|
||||||
<h2>{{localize "LESOUBLIES.labels.sortilegesCauchemar"}}</h2>
|
<div class="embed-buttons">
|
||||||
{{editor system.statblock.spellCauchemar target="system.statblock.spellCauchemar" button=true editable=isEditMode}}
|
<button type="button" data-action="createItem" data-type="arme">+ {{localize "TYPES.Item.arme"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="armure">+ {{localize "TYPES.Item.armure"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="equipement">+ {{localize "TYPES.Item.equipement"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="sortilege">+ {{localize "TYPES.Item.sortilege"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each weapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{item.system.damage}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useWeapon" data-item-id="{{item.id}}">Attaque</button><button type="button" data-action="resolveWeaponDamage" data-item-id="{{item.id}}">Dégâts</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each armors as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>Prot {{item.system.protection}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each equipment as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.equipement"}} - {{item.system.category}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each spells as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{item.system.tradition}} / {{item.system.polarity}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useSpell" data-item-id="{{item.id}}">Activer</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
|
||||||
|
|
||||||
<section class="sheet-card ledger-card">
|
|
||||||
<div class="section-title-row">
|
|
||||||
<h2>{{localize "LESOUBLIES.ui.combat"}}</h2>
|
|
||||||
<div class="embed-buttons">
|
|
||||||
<button type="button" data-action="openCombatPreset" data-preset="encourager">Encourager</button>
|
|
||||||
<button type="button" data-action="openCombatPreset" data-preset="intimider">Intimider</button>
|
|
||||||
<button type="button" data-action="openCombatPreset" data-preset="evaluer">Évaluer</button>
|
|
||||||
<button type="button" data-action="openCombatPreset" data-preset="maitriser">Maîtriser</button>
|
|
||||||
<button type="button" data-action="openCombatPreset" data-preset="seDeplacer">Se déplacer</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="sheet-card ledger-card">
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
<div class="section-title-row">
|
<section class="sheet-card notes-card">
|
||||||
<h2>{{localize "LESOUBLIES.ui.equipement"}}</h2>
|
<h2>{{localize "LESOUBLIES.labels.description"}}</h2>
|
||||||
<div class="embed-buttons">
|
{{formInput systemFields.biodata.fields.description enriched=enriched.biodata.description value=system.biodata.description name="system.biodata.description" toggled=true}}
|
||||||
<button type="button" data-action="createItem" data-type="arme">+ {{localize "TYPES.Item.arme"}}</button>
|
<h2>Habitat</h2>
|
||||||
<button type="button" data-action="createItem" data-type="armure">+ {{localize "TYPES.Item.armure"}}</button>
|
{{formInput systemFields.biodata.fields.habitat enriched=enriched.biodata.habitat value=system.biodata.habitat name="system.biodata.habitat" toggled=true}}
|
||||||
<button type="button" data-action="createItem" data-type="equipement">+ {{localize "TYPES.Item.equipement"}}</button>
|
<h2>{{localize "LESOUBLIES.labels.notes"}}</h2>
|
||||||
<button type="button" data-action="createItem" data-type="sortilege">+ {{localize "TYPES.Item.sortilege"}}</button>
|
{{formInput systemFields.biodata.fields.notes enriched=enriched.biodata.notes value=system.biodata.notes name="system.biodata.notes" toggled=true}}
|
||||||
</div>
|
<h2>{{localize "LESOUBLIES.labels.gmnotes"}}</h2>
|
||||||
</div>
|
{{formInput systemFields.biodata.fields.gmnotes enriched=enriched.biodata.gmnotes value=system.biodata.gmnotes name="system.biodata.gmnotes" toggled=true}}
|
||||||
<div class="item-list">
|
</section>
|
||||||
{{#each weapons as |item|}}
|
|
||||||
<article class="item-card">
|
|
||||||
<div><strong>{{item.name}}</strong><div>{{item.system.damage}}</div></div>
|
|
||||||
<div class="item-controls"><button type="button" data-action="useWeapon" data-item-id="{{item.id}}">Attaque</button><button type="button" data-action="resolveWeaponDamage" data-item-id="{{item.id}}">Dégâts</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
|
||||||
</article>
|
|
||||||
{{/each}}
|
|
||||||
{{#each armors as |item|}}
|
|
||||||
<article class="item-card">
|
|
||||||
<div><strong>{{item.name}}</strong><div>Prot {{item.system.protection}}</div></div>
|
|
||||||
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
|
||||||
</article>
|
|
||||||
{{/each}}
|
|
||||||
{{#each equipment as |item|}}
|
|
||||||
<article class="item-card">
|
|
||||||
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.equipement"}} - {{item.system.category}}</div></div>
|
|
||||||
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
|
||||||
</article>
|
|
||||||
{{/each}}
|
|
||||||
{{#each spells as |item|}}
|
|
||||||
<article class="item-card">
|
|
||||||
<div><strong>{{item.name}}</strong><div>{{item.system.tradition}} / {{item.system.polarity}}</div></div>
|
|
||||||
<div class="item-controls"><button type="button" data-action="useSpell" data-item-id="{{item.id}}">Activer</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
|
||||||
</article>
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section class="sheet-card notes-card">
|
|
||||||
<h2>{{localize "LESOUBLIES.labels.description"}}</h2>
|
|
||||||
{{editor system.biodata.description target="system.biodata.description" button=true editable=isEditMode}}
|
|
||||||
<h2>Habitat</h2>
|
|
||||||
{{editor system.biodata.habitat target="system.biodata.habitat" button=true editable=isEditMode}}
|
|
||||||
<h2>{{localize "LESOUBLIES.labels.notes"}}</h2>
|
|
||||||
{{editor system.biodata.notes target="system.biodata.notes" button=true editable=isEditMode}}
|
|
||||||
<h2>{{localize "LESOUBLIES.labels.gmnotes"}}</h2>
|
|
||||||
{{editor system.biodata.gmnotes target="system.biodata.gmnotes" button=true editable=isEditMode owner=isGM}}
|
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -0,0 +1,279 @@
|
|||||||
|
<section class="{{cssClass}} les-oublies-sheet personnage-sheet" autocomplete="off">
|
||||||
|
<header class="sheet-header hero-banner">
|
||||||
|
<img class="profile-img" data-edit="img" data-action="editImage" src="{{actor.img}}" title="{{actor.name}}" />
|
||||||
|
<div class="header-fields hero-copy">
|
||||||
|
<button class="mode-button mode-button--icon" type="button" data-action="toggleSheet" title="{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}" aria-label="{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}">
|
||||||
|
<i class="fa-solid {{#if isEditMode}}fa-eye{{else}}fa-pen-to-square{{/if}}"></i>
|
||||||
|
</button>
|
||||||
|
<h1 class="sheet-title"><input name="name" type="text" value="{{actor.name}}" placeholder="Nom" {{#if isPlayMode}}disabled{{/if}} /></h1>
|
||||||
|
<div class="sheet-actions">
|
||||||
|
<button type="button" data-action="openInitiative">{{localize "LESOUBLIES.rolls.initiative"}}</button>
|
||||||
|
<button type="button" data-action="openThreadHarvest">Récolte de fils</button>
|
||||||
|
</div>
|
||||||
|
<div class="creation-slots creation-slots--header" data-creation-drop-zone>
|
||||||
|
{{#each creationSlots as |slot|}}
|
||||||
|
<article class="creation-slot creation-slot--compact {{#if slot.item}}is-filled{{else}}is-empty{{/if}}" data-drop-creation-type="{{slot.type}}">
|
||||||
|
<div class="creation-slot-header">
|
||||||
|
<div>
|
||||||
|
<p class="creation-slot-kicker">{{slot.label}}</p>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<strong class="creation-slot-name">{{slot.item.name}}</strong>
|
||||||
|
{{else}}
|
||||||
|
<strong class="creation-slot-name">Glisser ici</strong>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<div class="item-controls item-controls--compact">
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{slot.item.id}}">Mod.</button>
|
||||||
|
{{#unless @root.isPlayMode}}
|
||||||
|
<button type="button" data-action="removeCreationItem" data-type="{{slot.type}}">X</button>
|
||||||
|
{{/unless}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
|
{{#each tabs as |tab|}}
|
||||||
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
|
<i class="{{tab.icon}}"></i>
|
||||||
|
<span>{{tab.label}}</span>
|
||||||
|
</button>
|
||||||
|
{{/each}}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.overview.cssClass}}" data-tab="overview">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card summary-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.derivedOverview"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.taille"}}</label>
|
||||||
|
<select name="system.size.value" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
{{#each choiceSets.personnageSizeOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.size.value)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
<span>{{derived.sizeLabel}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.vie"}}</label>
|
||||||
|
<input name="system.hp.value" type="number" value="{{system.hp.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>/ {{derived.hpMax}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.songes"}}</label>
|
||||||
|
<input name="system.songes.value" type="number" value="{{system.songes.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.songes.points}} / {{system.songes.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteSonges"}}</label>
|
||||||
|
<input name="system.songes.debt" type="number" value="{{system.songes.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditSonges"}}</label>
|
||||||
|
<input name="system.songes.xpCredit" type="number" value="{{system.songes.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.cauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.value" type="number" value="{{system.cauchemar.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.cauchemar.points}} / {{system.cauchemar.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.debt" type="number" value="{{system.cauchemar.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.xpCredit" type="number" value="{{system.cauchemar.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.xp"}}</label>
|
||||||
|
<input name="system.experience.value" type="number" value="{{system.experience.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ecorces"}}</label>
|
||||||
|
<input name="system.money.ecorces" type="number" value="{{system.money.ecorces}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ombreDuTourment"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.ombreDuTourment" type="checkbox" {{checked system.flagsNarratifs.ombreDuTourment}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card creation-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.creation"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.compagnie"}}</label>
|
||||||
|
<select name="system.references.compagnieId" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
<option value="">—</option>
|
||||||
|
{{#each choiceSets.companyOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.references.compagnieId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<p class="help-text"><strong>{{localize "LESOUBLIES.labels.compagnie"}} :</strong> {{#if derived.compagnie}}{{derived.compagnie.name}}{{else}}—{{/if}}</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.skills.cssClass}}" data-tab="skills">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.competences"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="competence">+ {{localize "TYPES.Item.competence"}}</button>
|
||||||
|
</div>
|
||||||
|
{{#each skillGroups as |group|}}
|
||||||
|
<div class="group-block">
|
||||||
|
<div class="group-header">
|
||||||
|
<h3>{{group.label}}</h3>
|
||||||
|
<label class="profile-badge">
|
||||||
|
<span>{{localize "LESOUBLIES.labels.profil"}}</span>
|
||||||
|
<input name="system.profils.{{group.id}}" type="number" value="{{group.profileValue}}" {{#if @root.isPlayMode}}disabled{{/if}} />
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each group.items as |entry|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{entry.item.name}}</strong>
|
||||||
|
<div>Base {{entry.item.system.base}} + {{group.label}} {{group.profileValue}} - {{localize "LESOUBLIES.labels.valeurFinale"}} {{entry.finalValue}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="rollSkill" data-item-id="{{entry.item.id}}">{{localize "LESOUBLIES.ui.roll"}}</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{entry.item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{entry.item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.actions.cssClass}}" data-tab="actions">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.combat"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="encourager">Encourager</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="intimider">Intimider</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="evaluer">Évaluer</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="maitriser">Maîtriser</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="seDeplacer">Se déplacer</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#if equippedWeapons.length}}
|
||||||
|
{{#each equippedWeapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.arme"}} - {{item.system.damage}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useWeapon" data-item-id="{{item.id}}">Attaque</button><button type="button" data-action="resolveWeaponDamage" data-item-id="{{item.id}}">Dégâts</button><button type="button" data-action="toggleEquipped" data-item-id="{{item.id}}">Retirer</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{else}}
|
||||||
|
<p class="help-text">Aucune arme équipée.</p>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.magie"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="sortilege">+ {{localize "TYPES.Item.sortilege"}}</button>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each spells as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{item.name}}</strong>
|
||||||
|
<div>{{item.system.tradition}} / {{item.system.polarity}} / coût {{item.system.cost}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="useSpell" data-item-id="{{item.id}}">Activer</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.equipment.cssClass}}" data-tab="equipment">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.equipement"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="createItem" data-type="arme">+ {{localize "TYPES.Item.arme"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="armure">+ {{localize "TYPES.Item.armure"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="equipement">+ {{localize "TYPES.Item.equipement"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each weapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.arme"}} - {{item.system.damage}}{{#if item.system.equipped}} - Équipée{{/if}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="toggleEquipped" data-item-id="{{item.id}}">{{#if item.system.equipped}}Retirer{{else}}Équiper{{/if}}</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each armors as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.armure"}} - Prot {{item.system.protection}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each equipment as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.equipement"}} - {{item.system.category}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
|
<section class="sheet-card creation-card identity-card identity-card--compact">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.identite"}}</h2>
|
||||||
|
<div class="identity-grid">
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.age"}}</label>
|
||||||
|
<input name="system.biodata.age" type="number" value="{{system.biodata.age}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.sexe"}}</label>
|
||||||
|
<input name="system.biodata.sexe" type="text" value="{{system.biodata.sexe}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.motsCles"}}</label>
|
||||||
|
<input name="system.biodata.motscles" type="text" value="{{system.biodata.motscles}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaine"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.isCaptain" type="checkbox" {{checked system.flagsNarratifs.isCaptain}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="sheet-card notes-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.notes"}}</h2>
|
||||||
|
<label>{{localize "LESOUBLIES.labels.description"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.description enriched=enriched.biodata.description value=system.biodata.description name="system.biodata.description" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.notes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.notes enriched=enriched.biodata.notes value=system.biodata.notes name="system.biodata.notes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.gmnotes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.gmnotes enriched=enriched.biodata.gmnotes value=system.biodata.gmnotes name="system.biodata.gmnotes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.liensNarratifs"}}</label>
|
||||||
|
{{formInput systemFields.visions enriched=enriched.visions value=system.visions name="system.visions" toggled=true}}
|
||||||
|
{{#if activeCompanyPower}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.pouvoirCompagnieActif"}}</label>
|
||||||
|
<div class="help-text">{{activeCompanyPower.name}} — {{activeCompanyPower.system.activationCondition}}</div>
|
||||||
|
{{/if}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
@@ -0,0 +1,284 @@
|
|||||||
|
<section class="{{cssClass}} les-oublies-sheet personnage-sheet" autocomplete="off">
|
||||||
|
<header class="sheet-header hero-banner">
|
||||||
|
<img class="profile-img" data-edit="img" data-action="editImage" src="{{actor.img}}" title="{{actor.name}}" />
|
||||||
|
<div class="header-fields hero-copy">
|
||||||
|
<button class="mode-button mode-button--icon" type="button" data-action="toggleSheet" title="{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}" aria-label="{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}">
|
||||||
|
<i class="fa-solid {{#if isEditMode}}fa-eye{{else}}fa-pen-to-square{{/if}}"></i>
|
||||||
|
</button>
|
||||||
|
<h1 class="sheet-title"><input name="name" type="text" value="{{actor.name}}" placeholder="Nom" {{#if isPlayMode}}disabled{{/if}} /></h1>
|
||||||
|
<div class="sheet-actions">
|
||||||
|
<button type="button" data-action="openInitiative">{{localize "LESOUBLIES.rolls.initiative"}}</button>
|
||||||
|
<button type="button" data-action="openThreadHarvest">Récolte de fils</button>
|
||||||
|
</div>
|
||||||
|
<div class="creation-slots creation-slots--header" data-creation-drop-zone>
|
||||||
|
{{#each creationSlots as |slot|}}
|
||||||
|
<article class="creation-slot creation-slot--compact {{#if slot.item}}is-filled{{else}}is-empty{{/if}}" data-drop-creation-type="{{slot.type}}">
|
||||||
|
<div class="creation-slot-header">
|
||||||
|
<div>
|
||||||
|
<p class="creation-slot-kicker">{{slot.label}}</p>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<strong class="creation-slot-name">{{slot.item.name}}</strong>
|
||||||
|
{{else}}
|
||||||
|
<strong class="creation-slot-name">Glisser ici</strong>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<div class="item-controls item-controls--compact">
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{slot.item.id}}">Mod.</button>
|
||||||
|
{{#unless @root.isPlayMode}}
|
||||||
|
<button type="button" data-action="removeCreationItem" data-type="{{slot.type}}">X</button>
|
||||||
|
{{/unless}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
|
{{#each tabs as |tab|}}
|
||||||
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
|
<i class="{{tab.icon}}"></i>
|
||||||
|
<span>{{tab.label}}</span>
|
||||||
|
</button>
|
||||||
|
{{/each}}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.overview.cssClass}}" data-tab="overview">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card summary-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.derivedOverview"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.taille"}}</label>
|
||||||
|
<select name="system.size.value" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
{{#each choiceSets.personnageSizeOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.size.value)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
<span>{{derived.sizeLabel}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.vie"}}</label>
|
||||||
|
<input name="system.hp.value" type="number" value="{{system.hp.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>/ {{derived.hpMax}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.songes"}}</label>
|
||||||
|
<input name="system.songes.value" type="number" value="{{system.songes.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.songes.points}} / {{system.songes.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteSonges"}}</label>
|
||||||
|
<input name="system.songes.debt" type="number" value="{{system.songes.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditSonges"}}</label>
|
||||||
|
<input name="system.songes.xpCredit" type="number" value="{{system.songes.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.cauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.value" type="number" value="{{system.cauchemar.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.cauchemar.points}} / {{system.cauchemar.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.debt" type="number" value="{{system.cauchemar.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.xpCredit" type="number" value="{{system.cauchemar.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.xp"}}</label>
|
||||||
|
<input name="system.experience.value" type="number" value="{{system.experience.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ecorces"}}</label>
|
||||||
|
<input name="system.money.ecorces" type="number" value="{{system.money.ecorces}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ombreDuTourment"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.ombreDuTourment" type="checkbox" {{checked system.flagsNarratifs.ombreDuTourment}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card creation-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.compagnie"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.compagnie"}}</label>
|
||||||
|
<select name="system.references.compagnieId" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
<option value="">—</option>
|
||||||
|
{{#each choiceSets.companyOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.references.compagnieId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<p class="help-text"><strong>{{localize "LESOUBLIES.labels.compagnie"}} :</strong> {{#if derived.compagnie}}{{derived.compagnie.name}}{{else}}—{{/if}}</p>
|
||||||
|
{{#if derived.compagnie}}
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openLinkedActor" data-actor-id="{{derived.compagnie.id}}">Ouvrir la compagnie</button>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.skills.cssClass}}" data-tab="skills">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.competences"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="competence">+ {{localize "TYPES.Item.competence"}}</button>
|
||||||
|
</div>
|
||||||
|
{{#each skillGroups as |group|}}
|
||||||
|
<div class="group-block">
|
||||||
|
<div class="group-header">
|
||||||
|
<h3>{{group.label}}</h3>
|
||||||
|
<label class="profile-badge">
|
||||||
|
<span>{{localize "LESOUBLIES.labels.profil"}}</span>
|
||||||
|
<input name="system.profils.{{group.id}}" type="number" value="{{group.profileValue}}" {{#if @root.isPlayMode}}disabled{{/if}} />
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each group.items as |entry|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{entry.item.name}}</strong>
|
||||||
|
<div>Base {{entry.item.system.base}} + {{group.label}} {{group.profileValue}} - {{localize "LESOUBLIES.labels.valeurFinale"}} {{entry.finalValue}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="rollSkill" data-item-id="{{entry.item.id}}">{{localize "LESOUBLIES.ui.roll"}}</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{entry.item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{entry.item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.actions.cssClass}}" data-tab="actions">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.combat"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="encourager">Encourager</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="intimider">Intimider</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="evaluer">Évaluer</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="maitriser">Maîtriser</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="seDeplacer">Se déplacer</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#if equippedWeapons.length}}
|
||||||
|
{{#each equippedWeapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.arme"}} - {{item.system.damage}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useWeapon" data-item-id="{{item.id}}">Attaque</button><button type="button" data-action="resolveWeaponDamage" data-item-id="{{item.id}}">Dégâts</button><button type="button" data-action="toggleEquipped" data-item-id="{{item.id}}">Retirer</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{else}}
|
||||||
|
<p class="help-text">Aucune arme équipée.</p>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.magie"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="sortilege">+ {{localize "TYPES.Item.sortilege"}}</button>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each spells as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{item.name}}</strong>
|
||||||
|
<div>{{item.system.tradition}} / {{item.system.polarity}} / coût {{item.system.cost}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="useSpell" data-item-id="{{item.id}}">Activer</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.equipment.cssClass}}" data-tab="equipment">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.equipement"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="createItem" data-type="arme">+ {{localize "TYPES.Item.arme"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="armure">+ {{localize "TYPES.Item.armure"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="equipement">+ {{localize "TYPES.Item.equipement"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each weapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.arme"}} - {{item.system.damage}}{{#if item.system.equipped}} - Équipée{{/if}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="toggleEquipped" data-item-id="{{item.id}}">{{#if item.system.equipped}}Retirer{{else}}Équiper{{/if}}</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each armors as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.armure"}} - Prot {{item.system.protection}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each equipment as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.equipement"}} - {{item.system.category}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
|
<section class="sheet-card creation-card identity-card identity-card--compact">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.identite"}}</h2>
|
||||||
|
<div class="identity-grid">
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.age"}}</label>
|
||||||
|
<input name="system.biodata.age" type="number" value="{{system.biodata.age}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.sexe"}}</label>
|
||||||
|
<input name="system.biodata.sexe" type="text" value="{{system.biodata.sexe}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.motsCles"}}</label>
|
||||||
|
<input name="system.biodata.motscles" type="text" value="{{system.biodata.motscles}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaine"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.isCaptain" type="checkbox" {{checked system.flagsNarratifs.isCaptain}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="sheet-card notes-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.notes"}}</h2>
|
||||||
|
<label>{{localize "LESOUBLIES.labels.description"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.description enriched=enriched.biodata.description value=system.biodata.description name="system.biodata.description" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.notes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.notes enriched=enriched.biodata.notes value=system.biodata.notes name="system.biodata.notes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.gmnotes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.gmnotes enriched=enriched.biodata.gmnotes value=system.biodata.gmnotes name="system.biodata.gmnotes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.liensNarratifs"}}</label>
|
||||||
|
{{formInput systemFields.visions enriched=enriched.visions value=system.visions name="system.visions" toggled=true}}
|
||||||
|
{{#if activeCompanyPower}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.pouvoirCompagnieActif"}}</label>
|
||||||
|
<div class="help-text">{{activeCompanyPower.name}} — {{activeCompanyPower.system.activationCondition}}</div>
|
||||||
|
{{/if}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
@@ -0,0 +1,283 @@
|
|||||||
|
<section class="{{cssClass}} les-oublies-sheet personnage-sheet" autocomplete="off">
|
||||||
|
<header class="sheet-header hero-banner">
|
||||||
|
<img class="profile-img" data-edit="img" data-action="editImage" src="{{actor.img}}" title="{{actor.name}}" />
|
||||||
|
<div class="header-fields hero-copy">
|
||||||
|
<button class="mode-button mode-button--icon" type="button" data-action="toggleSheet" title="{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}" aria-label="{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}">
|
||||||
|
<i class="fa-solid {{#if isEditMode}}fa-eye{{else}}fa-pen-to-square{{/if}}"></i>
|
||||||
|
</button>
|
||||||
|
<h1 class="sheet-title"><input name="name" type="text" value="{{actor.name}}" placeholder="Nom" {{#if isPlayMode}}disabled{{/if}} /></h1>
|
||||||
|
<div class="sheet-actions">
|
||||||
|
<button type="button" data-action="openInitiative">{{localize "LESOUBLIES.rolls.initiative"}}</button>
|
||||||
|
<button type="button" data-action="openThreadHarvest">Récolte de fils</button>
|
||||||
|
</div>
|
||||||
|
<div class="creation-slots creation-slots--header" data-creation-drop-zone>
|
||||||
|
{{#each creationSlots as |slot|}}
|
||||||
|
<article class="creation-slot creation-slot--compact {{#if slot.item}}is-filled{{else}}is-empty{{/if}}" data-drop-creation-type="{{slot.type}}">
|
||||||
|
<div class="creation-slot-header">
|
||||||
|
<div>
|
||||||
|
<p class="creation-slot-kicker">{{slot.label}}</p>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<strong class="creation-slot-name">{{slot.item.name}}</strong>
|
||||||
|
{{else}}
|
||||||
|
<strong class="creation-slot-name">Glisser ici</strong>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<div class="item-controls item-controls--compact">
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{slot.item.id}}">Mod.</button>
|
||||||
|
{{#unless @root.isPlayMode}}
|
||||||
|
<button type="button" data-action="removeCreationItem" data-type="{{slot.type}}">X</button>
|
||||||
|
{{/unless}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
|
{{#each tabs as |tab|}}
|
||||||
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
|
<i class="{{tab.icon}}"></i>
|
||||||
|
<span>{{tab.label}}</span>
|
||||||
|
</button>
|
||||||
|
{{/each}}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.overview.cssClass}}" data-tab="overview">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card summary-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.derivedOverview"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.taille"}}</label>
|
||||||
|
<select name="system.size.value" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
{{#each choiceSets.personnageSizeOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.size.value)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
<span>{{derived.sizeLabel}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.vie"}}</label>
|
||||||
|
<input name="system.hp.value" type="number" value="{{system.hp.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>/ {{derived.hpMax}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.songes"}}</label>
|
||||||
|
<input name="system.songes.value" type="number" value="{{system.songes.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.songes.points}} / {{system.songes.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteSonges"}}</label>
|
||||||
|
<input name="system.songes.debt" type="number" value="{{system.songes.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditSonges"}}</label>
|
||||||
|
<input name="system.songes.xpCredit" type="number" value="{{system.songes.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.cauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.value" type="number" value="{{system.cauchemar.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.cauchemar.points}} / {{system.cauchemar.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.debt" type="number" value="{{system.cauchemar.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.xpCredit" type="number" value="{{system.cauchemar.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.xp"}}</label>
|
||||||
|
<input name="system.experience.value" type="number" value="{{system.experience.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ecorces"}}</label>
|
||||||
|
<input name="system.money.ecorces" type="number" value="{{system.money.ecorces}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ombreDuTourment"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.ombreDuTourment" type="checkbox" {{checked system.flagsNarratifs.ombreDuTourment}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card creation-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.compagnie"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.compagnie"}}</label>
|
||||||
|
<select name="system.references.compagnieId" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
<option value="">—</option>
|
||||||
|
{{#each choiceSets.companyOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.references.compagnieId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<p class="help-text"><strong>{{localize "LESOUBLIES.labels.compagnie"}} :</strong> {{#if derived.compagnie}}{{derived.compagnie.name}}{{else}}—{{/if}}</p>
|
||||||
|
{{#if activeCompanyPower}}
|
||||||
|
<p class="help-text"><strong>{{localize "LESOUBLIES.labels.pouvoirCompagnieActif"}} :</strong> {{activeCompanyPower.name}} — {{activeCompanyPower.system.activationCondition}}</p>
|
||||||
|
{{/if}}
|
||||||
|
{{#if derived.compagnie}}
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openLinkedActor" data-actor-id="{{derived.compagnie.id}}">Ouvrir la compagnie</button>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.skills.cssClass}}" data-tab="skills">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.competences"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="competence">+ {{localize "TYPES.Item.competence"}}</button>
|
||||||
|
</div>
|
||||||
|
{{#each skillGroups as |group|}}
|
||||||
|
<div class="group-block">
|
||||||
|
<div class="group-header">
|
||||||
|
<h3>{{group.label}}</h3>
|
||||||
|
<label class="profile-badge">
|
||||||
|
<span>{{localize "LESOUBLIES.labels.profil"}}</span>
|
||||||
|
<input name="system.profils.{{group.id}}" type="number" value="{{group.profileValue}}" {{#if @root.isPlayMode}}disabled{{/if}} />
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each group.items as |entry|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{entry.item.name}}</strong>
|
||||||
|
<div>Base {{entry.item.system.base}} + {{group.label}} {{group.profileValue}} - {{localize "LESOUBLIES.labels.valeurFinale"}} {{entry.finalValue}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="rollSkill" data-item-id="{{entry.item.id}}">{{localize "LESOUBLIES.ui.roll"}}</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{entry.item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{entry.item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.actions.cssClass}}" data-tab="actions">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.combat"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="encourager">Encourager</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="intimider">Intimider</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="evaluer">Évaluer</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="maitriser">Maîtriser</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="seDeplacer">Se déplacer</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#if equippedWeapons.length}}
|
||||||
|
{{#each equippedWeapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.arme"}} - {{item.system.damage}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useWeapon" data-item-id="{{item.id}}">Attaque</button><button type="button" data-action="resolveWeaponDamage" data-item-id="{{item.id}}">Dégâts</button><button type="button" data-action="toggleEquipped" data-item-id="{{item.id}}">Retirer</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{else}}
|
||||||
|
<p class="help-text">Aucune arme équipée.</p>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.magie"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="sortilege">+ {{localize "TYPES.Item.sortilege"}}</button>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each spells as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{item.name}}</strong>
|
||||||
|
<div>{{item.system.tradition}} / {{item.system.polarity}} / coût {{item.system.cost}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="useSpell" data-item-id="{{item.id}}">Activer</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.equipment.cssClass}}" data-tab="equipment">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.equipement"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="createItem" data-type="arme">+ {{localize "TYPES.Item.arme"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="armure">+ {{localize "TYPES.Item.armure"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="equipement">+ {{localize "TYPES.Item.equipement"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each weapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.arme"}} - {{item.system.damage}}{{#if item.system.equipped}} - Équipée{{/if}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="toggleEquipped" data-item-id="{{item.id}}">{{#if item.system.equipped}}Retirer{{else}}Équiper{{/if}}</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each armors as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.armure"}} - Prot {{item.system.protection}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each equipment as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.equipement"}} - {{item.system.category}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
|
<section class="sheet-card creation-card identity-card identity-card--compact">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.identite"}}</h2>
|
||||||
|
<div class="identity-grid">
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.age"}}</label>
|
||||||
|
<input name="system.biodata.age" type="number" value="{{system.biodata.age}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.sexe"}}</label>
|
||||||
|
<input name="system.biodata.sexe" type="text" value="{{system.biodata.sexe}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.motsCles"}}</label>
|
||||||
|
<input name="system.biodata.motscles" type="text" value="{{system.biodata.motscles}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaine"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.isCaptain" type="checkbox" {{checked system.flagsNarratifs.isCaptain}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="sheet-card notes-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.notes"}}</h2>
|
||||||
|
<label>{{localize "LESOUBLIES.labels.description"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.description enriched=enriched.biodata.description value=system.biodata.description name="system.biodata.description" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.notes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.notes enriched=enriched.biodata.notes value=system.biodata.notes name="system.biodata.notes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.gmnotes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.gmnotes enriched=enriched.biodata.gmnotes value=system.biodata.gmnotes name="system.biodata.gmnotes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.liensNarratifs"}}</label>
|
||||||
|
{{formInput systemFields.visions enriched=enriched.visions value=system.visions name="system.visions" toggled=true}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
@@ -0,0 +1,283 @@
|
|||||||
|
<section class="{{cssClass}} les-oublies-sheet personnage-sheet" autocomplete="off">
|
||||||
|
<header class="sheet-header hero-banner">
|
||||||
|
<img class="profile-img" data-edit="img" data-action="editImage" src="{{actor.img}}" title="{{actor.name}}" />
|
||||||
|
<div class="header-fields hero-copy">
|
||||||
|
<button class="mode-button mode-button--icon" type="button" data-action="toggleSheet" title="{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}" aria-label="{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}">
|
||||||
|
<i class="fa-solid {{#if isEditMode}}fa-eye{{else}}fa-pen-to-square{{/if}}"></i>
|
||||||
|
</button>
|
||||||
|
<h1 class="sheet-title"><input name="name" type="text" value="{{actor.name}}" placeholder="Nom" {{#if isPlayMode}}disabled{{/if}} /></h1>
|
||||||
|
<div class="sheet-actions">
|
||||||
|
<button type="button" data-action="openInitiative">{{localize "LESOUBLIES.rolls.initiative"}}</button>
|
||||||
|
<button type="button" data-action="openThreadHarvest">Récolte de fils</button>
|
||||||
|
</div>
|
||||||
|
<div class="creation-slots creation-slots--header" data-creation-drop-zone>
|
||||||
|
{{#each creationSlots as |slot|}}
|
||||||
|
<article class="creation-slot creation-slot--compact {{#if slot.item}}is-filled{{else}}is-empty{{/if}}" data-drop-creation-type="{{slot.type}}">
|
||||||
|
<div class="creation-slot-header">
|
||||||
|
<div>
|
||||||
|
<p class="creation-slot-kicker">{{slot.label}}</p>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<strong class="creation-slot-name">{{slot.item.name}}</strong>
|
||||||
|
{{else}}
|
||||||
|
<strong class="creation-slot-name">Glisser ici</strong>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<div class="item-controls item-controls--compact">
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{slot.item.id}}">Mod.</button>
|
||||||
|
{{#unless @root.isPlayMode}}
|
||||||
|
<button type="button" data-action="removeCreationItem" data-type="{{slot.type}}">X</button>
|
||||||
|
{{/unless}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
|
{{#each tabs as |tab|}}
|
||||||
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
|
<i class="{{tab.icon}}"></i>
|
||||||
|
<span>{{tab.label}}</span>
|
||||||
|
</button>
|
||||||
|
{{/each}}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.overview.cssClass}}" data-tab="overview">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card summary-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.derivedOverview"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.taille"}}</label>
|
||||||
|
<select name="system.size.value" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
{{#each choiceSets.personnageSizeOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.size.value)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
<span>{{derived.sizeLabel}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.vie"}}</label>
|
||||||
|
<input name="system.hp.value" type="number" value="{{system.hp.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>/ {{derived.hpMax}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.songes"}}</label>
|
||||||
|
<input name="system.songes.value" type="number" value="{{system.songes.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.songes.points}} / {{system.songes.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteSonges"}}</label>
|
||||||
|
<input name="system.songes.debt" type="number" value="{{system.songes.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditSonges"}}</label>
|
||||||
|
<input name="system.songes.xpCredit" type="number" value="{{system.songes.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.cauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.value" type="number" value="{{system.cauchemar.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.cauchemar.points}} / {{system.cauchemar.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.debt" type="number" value="{{system.cauchemar.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.xpCredit" type="number" value="{{system.cauchemar.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.xp"}}</label>
|
||||||
|
<input name="system.experience.value" type="number" value="{{system.experience.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ecorces"}}</label>
|
||||||
|
<input name="system.money.ecorces" type="number" value="{{system.money.ecorces}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ombreDuTourment"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.ombreDuTourment" type="checkbox" {{checked system.flagsNarratifs.ombreDuTourment}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card creation-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.compagnie"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.compagnie"}}</label>
|
||||||
|
<select name="system.references.compagnieId" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
<option value="">—</option>
|
||||||
|
{{#each choiceSets.companyOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.references.compagnieId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<p class="help-text"><strong>{{localize "LESOUBLIES.labels.compagnie"}} :</strong> {{#if derived.compagnie}}{{derived.compagnie.name}}{{else}}—{{/if}}</p>
|
||||||
|
{{#if activeCompanyPower}}
|
||||||
|
<p class="help-text"><strong>{{localize "LESOUBLIES.labels.pouvoirCompagnieActif"}} :</strong> {{activeCompanyPower.name}} — {{activeCompanyPower.system.activationCondition}}</p>
|
||||||
|
{{/if}}
|
||||||
|
{{#if derived.compagnie}}
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openLinkedActor" data-actor-id="{{derived.compagnie.id}}">Ouvrir la compagnie</button>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.skills.cssClass}}" data-tab="skills">
|
||||||
|
<section class="sheet-card ledger-card skills-ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.competences"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="competence">+ {{localize "TYPES.Item.competence"}}</button>
|
||||||
|
</div>
|
||||||
|
{{#each skillGroups as |group|}}
|
||||||
|
<div class="group-block skills-group">
|
||||||
|
<div class="group-header">
|
||||||
|
<h3>{{group.label}}</h3>
|
||||||
|
<label class="profile-badge">
|
||||||
|
<span>{{localize "LESOUBLIES.labels.profil"}}</span>
|
||||||
|
<input name="system.profils.{{group.id}}" type="number" value="{{group.profileValue}}" {{#if @root.isPlayMode}}disabled{{/if}} />
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="item-list skills-item-list">
|
||||||
|
{{#each group.items as |entry|}}
|
||||||
|
<article class="item-card skill-card">
|
||||||
|
<div class="skill-card-main">
|
||||||
|
<strong>{{entry.item.name}}</strong>
|
||||||
|
<span class="skill-summary">Base {{entry.item.system.base}} · {{group.label}} {{group.profileValue}} · {{localize "LESOUBLIES.labels.valeurFinale"}} {{entry.finalValue}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls skill-controls">
|
||||||
|
<button type="button" data-action="rollSkill" data-item-id="{{entry.item.id}}">{{localize "LESOUBLIES.ui.roll"}}</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{entry.item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{entry.item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.actions.cssClass}}" data-tab="actions">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.combat"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="encourager">Encourager</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="intimider">Intimider</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="evaluer">Évaluer</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="maitriser">Maîtriser</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="seDeplacer">Se déplacer</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#if equippedWeapons.length}}
|
||||||
|
{{#each equippedWeapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.arme"}} - {{item.system.damage}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useWeapon" data-item-id="{{item.id}}">Attaque</button><button type="button" data-action="resolveWeaponDamage" data-item-id="{{item.id}}">Dégâts</button><button type="button" data-action="toggleEquipped" data-item-id="{{item.id}}">Retirer</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{else}}
|
||||||
|
<p class="help-text">Aucune arme équipée.</p>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.magie"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="sortilege">+ {{localize "TYPES.Item.sortilege"}}</button>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each spells as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{item.name}}</strong>
|
||||||
|
<div>{{item.system.tradition}} / {{item.system.polarity}} / coût {{item.system.cost}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="useSpell" data-item-id="{{item.id}}">Activer</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.equipment.cssClass}}" data-tab="equipment">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.equipement"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="createItem" data-type="arme">+ {{localize "TYPES.Item.arme"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="armure">+ {{localize "TYPES.Item.armure"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="equipement">+ {{localize "TYPES.Item.equipement"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each weapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.arme"}} - {{item.system.damage}}{{#if item.system.equipped}} - Équipée{{/if}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="toggleEquipped" data-item-id="{{item.id}}">{{#if item.system.equipped}}Retirer{{else}}Équiper{{/if}}</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each armors as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.armure"}} - Prot {{item.system.protection}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each equipment as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.equipement"}} - {{item.system.category}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
|
<section class="sheet-card creation-card identity-card identity-card--compact">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.identite"}}</h2>
|
||||||
|
<div class="identity-grid">
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.age"}}</label>
|
||||||
|
<input name="system.biodata.age" type="number" value="{{system.biodata.age}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.sexe"}}</label>
|
||||||
|
<input name="system.biodata.sexe" type="text" value="{{system.biodata.sexe}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.motsCles"}}</label>
|
||||||
|
<input name="system.biodata.motscles" type="text" value="{{system.biodata.motscles}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaine"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.isCaptain" type="checkbox" {{checked system.flagsNarratifs.isCaptain}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="sheet-card notes-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.notes"}}</h2>
|
||||||
|
<label>{{localize "LESOUBLIES.labels.description"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.description enriched=enriched.biodata.description value=system.biodata.description name="system.biodata.description" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.notes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.notes enriched=enriched.biodata.notes value=system.biodata.notes name="system.biodata.notes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.gmnotes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.gmnotes enriched=enriched.biodata.gmnotes value=system.biodata.gmnotes name="system.biodata.gmnotes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.liensNarratifs"}}</label>
|
||||||
|
{{formInput systemFields.visions enriched=enriched.visions value=system.visions name="system.visions" toggled=true}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
@@ -0,0 +1,289 @@
|
|||||||
|
<section class="{{cssClass}} les-oublies-sheet personnage-sheet" autocomplete="off">
|
||||||
|
<header class="sheet-header hero-banner">
|
||||||
|
<img class="profile-img" data-edit="img" data-action="editImage" src="{{actor.img}}" title="{{actor.name}}" />
|
||||||
|
<div class="header-fields hero-copy">
|
||||||
|
<button class="mode-button mode-button--icon" type="button" data-action="toggleSheet" title="{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}" aria-label="{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}">
|
||||||
|
<i class="fa-solid {{#if isEditMode}}fa-eye{{else}}fa-pen-to-square{{/if}}"></i>
|
||||||
|
</button>
|
||||||
|
<h1 class="sheet-title"><input name="name" type="text" value="{{actor.name}}" placeholder="Nom" {{#if isPlayMode}}disabled{{/if}} /></h1>
|
||||||
|
<div class="sheet-actions">
|
||||||
|
<button type="button" data-action="openInitiative">{{localize "LESOUBLIES.rolls.initiative"}}</button>
|
||||||
|
<button type="button" data-action="openThreadHarvest">Récolte de fils</button>
|
||||||
|
</div>
|
||||||
|
<div class="creation-slots creation-slots--header" data-creation-drop-zone>
|
||||||
|
{{#each creationSlots as |slot|}}
|
||||||
|
<article class="creation-slot creation-slot--compact {{#if slot.item}}is-filled{{else}}is-empty{{/if}}" data-drop-creation-type="{{slot.type}}">
|
||||||
|
<div class="creation-slot-header">
|
||||||
|
<div>
|
||||||
|
<p class="creation-slot-kicker">{{slot.label}}</p>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<strong class="creation-slot-name">{{slot.item.name}}</strong>
|
||||||
|
{{else}}
|
||||||
|
<strong class="creation-slot-name">Glisser ici</strong>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<div class="item-controls item-controls--compact">
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{slot.item.id}}">Mod.</button>
|
||||||
|
{{#unless @root.isPlayMode}}
|
||||||
|
<button type="button" data-action="removeCreationItem" data-type="{{slot.type}}">X</button>
|
||||||
|
{{/unless}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
|
{{#each tabs as |tab|}}
|
||||||
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
|
<i class="{{tab.icon}}"></i>
|
||||||
|
<span>{{tab.label}}</span>
|
||||||
|
</button>
|
||||||
|
{{/each}}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.overview.cssClass}}" data-tab="overview">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card summary-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.derivedOverview"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.taille"}}</label>
|
||||||
|
<select name="system.size.value" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
{{#each choiceSets.personnageSizeOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.size.value)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
<span>{{derived.sizeLabel}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.vie"}}</label>
|
||||||
|
<input name="system.hp.value" type="number" value="{{system.hp.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>/ {{derived.hpMax}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.songes"}}</label>
|
||||||
|
<input name="system.songes.value" type="number" value="{{system.songes.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.songes.points}} / {{system.songes.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteSonges"}}</label>
|
||||||
|
<input name="system.songes.debt" type="number" value="{{system.songes.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditSonges"}}</label>
|
||||||
|
<input name="system.songes.xpCredit" type="number" value="{{system.songes.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.cauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.value" type="number" value="{{system.cauchemar.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.cauchemar.points}} / {{system.cauchemar.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.debt" type="number" value="{{system.cauchemar.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.xpCredit" type="number" value="{{system.cauchemar.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.xp"}}</label>
|
||||||
|
<input name="system.experience.value" type="number" value="{{system.experience.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ecorces"}}</label>
|
||||||
|
<input name="system.money.ecorces" type="number" value="{{system.money.ecorces}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ombreDuTourment"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.ombreDuTourment" type="checkbox" {{checked system.flagsNarratifs.ombreDuTourment}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card creation-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.compagnie"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.compagnie"}}</label>
|
||||||
|
<select name="system.references.compagnieId" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
<option value="">—</option>
|
||||||
|
{{#each choiceSets.companyOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.references.compagnieId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<p class="help-text"><strong>{{localize "LESOUBLIES.labels.compagnie"}} :</strong> {{#if derived.compagnie}}{{derived.compagnie.name}}{{else}}—{{/if}}</p>
|
||||||
|
{{#if activeCompanyPower}}
|
||||||
|
<p class="help-text"><strong>{{localize "LESOUBLIES.labels.pouvoirCompagnieActif"}} :</strong> {{activeCompanyPower.name}} — {{activeCompanyPower.system.activationCondition}}</p>
|
||||||
|
{{/if}}
|
||||||
|
{{#if derived.compagnie}}
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openLinkedActor" data-actor-id="{{derived.compagnie.id}}">Ouvrir la compagnie</button>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.skills.cssClass}}" data-tab="skills">
|
||||||
|
<section class="sheet-card ledger-card skills-ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.competences"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="competence">+ {{localize "TYPES.Item.competence"}}</button>
|
||||||
|
</div>
|
||||||
|
<div class="skills-columns">
|
||||||
|
{{#each skillColumns as |column|}}
|
||||||
|
<div class="skills-column">
|
||||||
|
{{#each column as |group|}}
|
||||||
|
<div class="group-block skills-group">
|
||||||
|
<div class="group-header">
|
||||||
|
<h3>{{group.label}}</h3>
|
||||||
|
<label class="profile-badge">
|
||||||
|
<span>{{localize "LESOUBLIES.labels.profil"}}</span>
|
||||||
|
<input name="system.profils.{{group.id}}" type="number" value="{{group.profileValue}}" {{#if @root.isPlayMode}}disabled{{/if}} />
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="item-list skills-item-list">
|
||||||
|
{{#each group.items as |entry|}}
|
||||||
|
<article class="item-card skill-card">
|
||||||
|
<div class="skill-card-main">
|
||||||
|
<strong>{{entry.item.name}}</strong>
|
||||||
|
<span class="skill-summary">Base {{entry.item.system.base}} · {{group.label}} {{group.profileValue}} · {{localize "LESOUBLIES.labels.valeurFinale"}} {{entry.finalValue}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls skill-controls">
|
||||||
|
<button type="button" data-action="rollSkill" data-item-id="{{entry.item.id}}">{{localize "LESOUBLIES.ui.roll"}}</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{entry.item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{entry.item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.actions.cssClass}}" data-tab="actions">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.combat"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="encourager">Encourager</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="intimider">Intimider</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="evaluer">Évaluer</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="maitriser">Maîtriser</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="seDeplacer">Se déplacer</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#if equippedWeapons.length}}
|
||||||
|
{{#each equippedWeapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.arme"}} - {{item.system.damage}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useWeapon" data-item-id="{{item.id}}">Attaque</button><button type="button" data-action="resolveWeaponDamage" data-item-id="{{item.id}}">Dégâts</button><button type="button" data-action="toggleEquipped" data-item-id="{{item.id}}">Retirer</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{else}}
|
||||||
|
<p class="help-text">Aucune arme équipée.</p>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.magie"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="sortilege">+ {{localize "TYPES.Item.sortilege"}}</button>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each spells as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{item.name}}</strong>
|
||||||
|
<div>{{item.system.tradition}} / {{item.system.polarity}} / coût {{item.system.cost}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="useSpell" data-item-id="{{item.id}}">Activer</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.equipment.cssClass}}" data-tab="equipment">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.equipement"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="createItem" data-type="arme">+ {{localize "TYPES.Item.arme"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="armure">+ {{localize "TYPES.Item.armure"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="equipement">+ {{localize "TYPES.Item.equipement"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each weapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.arme"}} - {{item.system.damage}}{{#if item.system.equipped}} - Équipée{{/if}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="toggleEquipped" data-item-id="{{item.id}}">{{#if item.system.equipped}}Retirer{{else}}Équiper{{/if}}</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each armors as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.armure"}} - Prot {{item.system.protection}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each equipment as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.equipement"}} - {{item.system.category}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
|
<section class="sheet-card creation-card identity-card identity-card--compact">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.identite"}}</h2>
|
||||||
|
<div class="identity-grid">
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.age"}}</label>
|
||||||
|
<input name="system.biodata.age" type="number" value="{{system.biodata.age}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.sexe"}}</label>
|
||||||
|
<input name="system.biodata.sexe" type="text" value="{{system.biodata.sexe}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.motsCles"}}</label>
|
||||||
|
<input name="system.biodata.motscles" type="text" value="{{system.biodata.motscles}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaine"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.isCaptain" type="checkbox" {{checked system.flagsNarratifs.isCaptain}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="sheet-card notes-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.notes"}}</h2>
|
||||||
|
<label>{{localize "LESOUBLIES.labels.description"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.description enriched=enriched.biodata.description value=system.biodata.description name="system.biodata.description" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.notes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.notes enriched=enriched.biodata.notes value=system.biodata.notes name="system.biodata.notes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.gmnotes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.gmnotes enriched=enriched.biodata.gmnotes value=system.biodata.gmnotes name="system.biodata.gmnotes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.liensNarratifs"}}</label>
|
||||||
|
{{formInput systemFields.visions enriched=enriched.visions value=system.visions name="system.visions" toggled=true}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
@@ -0,0 +1,274 @@
|
|||||||
|
<section class="{{cssClass}} les-oublies-sheet personnage-sheet" autocomplete="off">
|
||||||
|
<header class="sheet-header hero-banner">
|
||||||
|
<img class="profile-img" data-edit="img" data-action="editImage" src="{{actor.img}}" title="{{actor.name}}" />
|
||||||
|
<div class="header-fields hero-copy">
|
||||||
|
<p class="sheet-kicker">Chronique d'un Oublié</p>
|
||||||
|
<h1 class="sheet-title"><input name="name" type="text" value="{{actor.name}}" placeholder="Nom" {{#if isPlayMode}}disabled{{/if}} /></h1>
|
||||||
|
<p class="sheet-subtitle">Petit Peuple, Songes, Cauchemar et destin de compagnie</p>
|
||||||
|
<div class="sheet-actions">
|
||||||
|
<button type="button" data-action="openInitiative">{{localize "LESOUBLIES.rolls.initiative"}}</button>
|
||||||
|
<button type="button" data-action="openThreadHarvest">Récolte de fils</button>
|
||||||
|
<button class="mode-button" type="button" data-action="toggleSheet">{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
|
{{#each tabs as |tab|}}
|
||||||
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
|
<i class="{{tab.icon}}"></i>
|
||||||
|
<span>{{tab.label}}</span>
|
||||||
|
</button>
|
||||||
|
{{/each}}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.overview.cssClass}}" data-tab="overview">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card summary-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.derivedOverview"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.taille"}}</label>
|
||||||
|
<select name="system.size.value" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
{{#each choiceSets.personnageSizeOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.size.value)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
<span>{{derived.sizeLabel}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.vie"}}</label>
|
||||||
|
<input name="system.hp.value" type="number" value="{{system.hp.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>/ {{derived.hpMax}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.songes"}}</label>
|
||||||
|
<input name="system.songes.value" type="number" value="{{system.songes.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.songes.points}} / {{system.songes.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteSonges"}}</label>
|
||||||
|
<input name="system.songes.debt" type="number" value="{{system.songes.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditSonges"}}</label>
|
||||||
|
<input name="system.songes.xpCredit" type="number" value="{{system.songes.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.cauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.value" type="number" value="{{system.cauchemar.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.cauchemar.points}} / {{system.cauchemar.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.debt" type="number" value="{{system.cauchemar.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.xpCredit" type="number" value="{{system.cauchemar.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.xp"}}</label>
|
||||||
|
<input name="system.experience.value" type="number" value="{{system.experience.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ecorces"}}</label>
|
||||||
|
<input name="system.money.ecorces" type="number" value="{{system.money.ecorces}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ombreDuTourment"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.ombreDuTourment" type="checkbox" {{checked system.flagsNarratifs.ombreDuTourment}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card creation-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.identite"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.age"}}</label>
|
||||||
|
<input name="system.biodata.age" type="number" value="{{system.biodata.age}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.sexe"}}</label>
|
||||||
|
<input name="system.biodata.sexe" type="text" value="{{system.biodata.sexe}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.motsCles"}}</label>
|
||||||
|
<input name="system.biodata.motscles" type="text" value="{{system.biodata.motscles}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaine"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.isCaptain" type="checkbox" {{checked system.flagsNarratifs.isCaptain}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card creation-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.creation"}}</h2>
|
||||||
|
<div class="creation-slots" data-creation-drop-zone>
|
||||||
|
{{#each creationSlots as |slot|}}
|
||||||
|
<article class="creation-slot {{#if slot.item}}is-filled{{else}}is-empty{{/if}}" data-drop-creation-type="{{slot.type}}">
|
||||||
|
<div class="creation-slot-header">
|
||||||
|
<div>
|
||||||
|
<p class="creation-slot-kicker">{{slot.label}}</p>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<strong class="creation-slot-name">{{slot.item.name}}</strong>
|
||||||
|
{{else}}
|
||||||
|
<strong class="creation-slot-name">—</strong>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{slot.item.id}}">{{localize "LESOUBLIES.ui.edit"}}</button>
|
||||||
|
{{#unless @root.isPlayMode}}
|
||||||
|
<button type="button" data-action="removeCreationItem" data-type="{{slot.type}}">{{localize "LESOUBLIES.ui.delete"}}</button>
|
||||||
|
{{/unless}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
<div class="creation-slot-body">
|
||||||
|
{{#if slot.item}}
|
||||||
|
<img class="creation-slot-image" src="{{slot.item.img}}" alt="{{slot.item.name}}" />
|
||||||
|
<p class="help-text">{{slot.filledHint}}</p>
|
||||||
|
{{else}}
|
||||||
|
<p class="help-text">{{slot.emptyHint}}</p>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.compagnie"}}</label>
|
||||||
|
<select name="system.references.compagnieId" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
<option value="">—</option>
|
||||||
|
{{#each choiceSets.companyOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.references.compagnieId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<p class="help-text"><strong>{{localize "LESOUBLIES.labels.compagnie"}} :</strong> {{#if derived.compagnie}}{{derived.compagnie.name}}{{else}}—{{/if}}</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.skills.cssClass}}" data-tab="skills">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.competences"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="competence">+ {{localize "TYPES.Item.competence"}}</button>
|
||||||
|
</div>
|
||||||
|
{{#each skillGroups as |group|}}
|
||||||
|
<div class="group-block">
|
||||||
|
<div class="group-header">
|
||||||
|
<h3>{{group.label}}</h3>
|
||||||
|
<label class="profile-badge">
|
||||||
|
<span>{{localize "LESOUBLIES.labels.profil"}}</span>
|
||||||
|
<input name="system.profils.{{group.id}}" type="number" value="{{group.profileValue}}" {{#if @root.isPlayMode}}disabled{{/if}} />
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each group.items as |entry|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{entry.item.name}}</strong>
|
||||||
|
<div>Base {{entry.item.system.base}} + {{group.label}} {{group.profileValue}} - {{localize "LESOUBLIES.labels.valeurFinale"}} {{entry.finalValue}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="rollSkill" data-item-id="{{entry.item.id}}">{{localize "LESOUBLIES.ui.roll"}}</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{entry.item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{entry.item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.actions.cssClass}}" data-tab="actions">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.combat"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="encourager">Encourager</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="intimider">Intimider</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="evaluer">Évaluer</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="maitriser">Maîtriser</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="seDeplacer">Se déplacer</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.magie"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="sortilege">+ {{localize "TYPES.Item.sortilege"}}</button>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each spells as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{item.name}}</strong>
|
||||||
|
<div>{{item.system.tradition}} / {{item.system.polarity}} / coût {{item.system.cost}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="useSpell" data-item-id="{{item.id}}">Activer</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.equipment.cssClass}}" data-tab="equipment">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.equipement"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="createItem" data-type="arme">+ {{localize "TYPES.Item.arme"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="armure">+ {{localize "TYPES.Item.armure"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="equipement">+ {{localize "TYPES.Item.equipement"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each weapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.arme"}} - {{item.system.damage}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useWeapon" data-item-id="{{item.id}}">Attaque</button><button type="button" data-action="resolveWeaponDamage" data-item-id="{{item.id}}">Dégâts</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each armors as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.armure"}} - Prot {{item.system.protection}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each equipment as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.equipement"}} - {{item.system.category}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
|
<section class="sheet-card notes-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.notes"}}</h2>
|
||||||
|
<label>{{localize "LESOUBLIES.labels.description"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.description enriched=enriched.biodata.description value=system.biodata.description name="system.biodata.description" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.notes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.notes enriched=enriched.biodata.notes value=system.biodata.notes name="system.biodata.notes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.gmnotes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.gmnotes enriched=enriched.biodata.gmnotes value=system.biodata.gmnotes name="system.biodata.gmnotes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.liensNarratifs"}}</label>
|
||||||
|
{{formInput systemFields.visions enriched=enriched.visions value=system.visions name="system.visions" toggled=true}}
|
||||||
|
{{#if activeCompanyPower}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.pouvoirCompagnieActif"}}</label>
|
||||||
|
<div class="help-text">{{activeCompanyPower.name}} — {{activeCompanyPower.system.activationCondition}}</div>
|
||||||
|
{{/if}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
@@ -0,0 +1,274 @@
|
|||||||
|
<section class="{{cssClass}} les-oublies-sheet personnage-sheet" autocomplete="off">
|
||||||
|
<header class="sheet-header hero-banner">
|
||||||
|
<img class="profile-img" data-edit="img" data-action="editImage" src="{{actor.img}}" title="{{actor.name}}" />
|
||||||
|
<div class="header-fields hero-copy">
|
||||||
|
<p class="sheet-kicker">Chronique d'un Oublié</p>
|
||||||
|
<h1 class="sheet-title"><input name="name" type="text" value="{{actor.name}}" placeholder="Nom" {{#if isPlayMode}}disabled{{/if}} /></h1>
|
||||||
|
<p class="sheet-subtitle">Petit Peuple, Songes, Cauchemar et destin de compagnie</p>
|
||||||
|
<div class="sheet-actions">
|
||||||
|
<button type="button" data-action="openInitiative">{{localize "LESOUBLIES.rolls.initiative"}}</button>
|
||||||
|
<button type="button" data-action="openThreadHarvest">Récolte de fils</button>
|
||||||
|
<button class="mode-button" type="button" data-action="toggleSheet">{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
|
{{#each tabs as |tab|}}
|
||||||
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
|
<i class="{{tab.icon}}"></i>
|
||||||
|
<span>{{tab.label}}</span>
|
||||||
|
</button>
|
||||||
|
{{/each}}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.overview.cssClass}}" data-tab="overview">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card summary-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.derivedOverview"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.taille"}}</label>
|
||||||
|
<select name="system.size.value" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
{{#each choiceSets.personnageSizeOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.size.value)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
<span>{{derived.sizeLabel}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.vie"}}</label>
|
||||||
|
<input name="system.hp.value" type="number" value="{{system.hp.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>/ {{derived.hpMax}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.songes"}}</label>
|
||||||
|
<input name="system.songes.value" type="number" value="{{system.songes.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.songes.points}} / {{system.songes.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteSonges"}}</label>
|
||||||
|
<input name="system.songes.debt" type="number" value="{{system.songes.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditSonges"}}</label>
|
||||||
|
<input name="system.songes.xpCredit" type="number" value="{{system.songes.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.cauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.value" type="number" value="{{system.cauchemar.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.cauchemar.points}} / {{system.cauchemar.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.debt" type="number" value="{{system.cauchemar.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.xpCredit" type="number" value="{{system.cauchemar.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.xp"}}</label>
|
||||||
|
<input name="system.experience.value" type="number" value="{{system.experience.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ecorces"}}</label>
|
||||||
|
<input name="system.money.ecorces" type="number" value="{{system.money.ecorces}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ombreDuTourment"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.ombreDuTourment" type="checkbox" {{checked system.flagsNarratifs.ombreDuTourment}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card creation-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.identite"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.age"}}</label>
|
||||||
|
<input name="system.biodata.age" type="number" value="{{system.biodata.age}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.sexe"}}</label>
|
||||||
|
<input name="system.biodata.sexe" type="text" value="{{system.biodata.sexe}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.motsCles"}}</label>
|
||||||
|
<input name="system.biodata.motscles" type="text" value="{{system.biodata.motscles}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaine"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.isCaptain" type="checkbox" {{checked system.flagsNarratifs.isCaptain}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card creation-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.creation"}}</h2>
|
||||||
|
<div class="creation-slots" data-creation-drop-zone>
|
||||||
|
{{#each creationSlots as |slot|}}
|
||||||
|
<article class="creation-slot {{#if slot.item}}is-filled{{else}}is-empty{{/if}}" data-drop-creation-type="{{slot.type}}">
|
||||||
|
<div class="creation-slot-header">
|
||||||
|
<div>
|
||||||
|
<p class="creation-slot-kicker">{{slot.label}}</p>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<strong class="creation-slot-name">{{slot.item.name}}</strong>
|
||||||
|
{{else}}
|
||||||
|
<strong class="creation-slot-name">—</strong>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{slot.item.id}}">{{localize "LESOUBLIES.ui.edit"}}</button>
|
||||||
|
{{#unless @root.isPlayMode}}
|
||||||
|
<button type="button" data-action="removeCreationItem" data-type="{{slot.type}}">{{localize "LESOUBLIES.ui.delete"}}</button>
|
||||||
|
{{/unless}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
<div class="creation-slot-body">
|
||||||
|
{{#if slot.item}}
|
||||||
|
<img class="creation-slot-image" src="{{slot.item.img}}" alt="{{slot.item.name}}" />
|
||||||
|
<p class="help-text">{{slot.filledHint}}</p>
|
||||||
|
{{else}}
|
||||||
|
<p class="help-text">{{slot.emptyHint}}</p>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.compagnie"}}</label>
|
||||||
|
<select name="system.references.compagnieId" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
<option value="">—</option>
|
||||||
|
{{#each choiceSets.companyOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.references.compagnieId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<p class="help-text"><strong>{{localize "LESOUBLIES.labels.compagnie"}} :</strong> {{#if derived.compagnie}}{{derived.compagnie.name}}{{else}}—{{/if}}</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.skills.cssClass}}" data-tab="skills">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.competences"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="competence">+ {{localize "TYPES.Item.competence"}}</button>
|
||||||
|
</div>
|
||||||
|
{{#each skillGroups as |group|}}
|
||||||
|
<div class="group-block">
|
||||||
|
<div class="group-header">
|
||||||
|
<h3>{{group.label}}</h3>
|
||||||
|
<label class="profile-badge">
|
||||||
|
<span>{{localize "LESOUBLIES.labels.profil"}}</span>
|
||||||
|
<input name="system.profils.{{group.id}}" type="number" value="{{group.profileValue}}" {{#if @root.isPlayMode}}disabled{{/if}} />
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each group.items as |entry|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{entry.item.name}}</strong>
|
||||||
|
<div>Base {{entry.item.system.base}} + {{group.label}} {{group.profileValue}} - {{localize "LESOUBLIES.labels.valeurFinale"}} {{entry.finalValue}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="rollSkill" data-item-id="{{entry.item.id}}">{{localize "LESOUBLIES.ui.roll"}}</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{entry.item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{entry.item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.actions.cssClass}}" data-tab="actions">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.combat"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="encourager">Encourager</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="intimider">Intimider</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="evaluer">Évaluer</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="maitriser">Maîtriser</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="seDeplacer">Se déplacer</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.magie"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="sortilege">+ {{localize "TYPES.Item.sortilege"}}</button>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each spells as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{item.name}}</strong>
|
||||||
|
<div>{{item.system.tradition}} / {{item.system.polarity}} / coût {{item.system.cost}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="useSpell" data-item-id="{{item.id}}">Activer</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.equipment.cssClass}}" data-tab="equipment">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.equipement"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="createItem" data-type="arme">+ {{localize "TYPES.Item.arme"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="armure">+ {{localize "TYPES.Item.armure"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="equipement">+ {{localize "TYPES.Item.equipement"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each weapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.arme"}} - {{item.system.damage}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useWeapon" data-item-id="{{item.id}}">Attaque</button><button type="button" data-action="resolveWeaponDamage" data-item-id="{{item.id}}">Dégâts</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each armors as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.armure"}} - Prot {{item.system.protection}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each equipment as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.equipement"}} - {{item.system.category}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
|
<section class="sheet-card notes-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.notes"}}</h2>
|
||||||
|
<label>{{localize "LESOUBLIES.labels.description"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.description enriched=enriched.biodata.description value=system.biodata.description name="system.biodata.description" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.notes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.notes enriched=enriched.biodata.notes value=system.biodata.notes name="system.biodata.notes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.gmnotes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.gmnotes enriched=enriched.biodata.gmnotes value=system.biodata.gmnotes name="system.biodata.gmnotes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.liensNarratifs"}}</label>
|
||||||
|
{{formInput systemFields.visions enriched=enriched.visions value=system.visions name="system.visions" toggled=true}}
|
||||||
|
{{#if activeCompanyPower}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.pouvoirCompagnieActif"}}</label>
|
||||||
|
<div class="help-text">{{activeCompanyPower.name}} — {{activeCompanyPower.system.activationCondition}}</div>
|
||||||
|
{{/if}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
@@ -0,0 +1,273 @@
|
|||||||
|
<section class="{{cssClass}} les-oublies-sheet personnage-sheet" autocomplete="off">
|
||||||
|
<header class="sheet-header hero-banner">
|
||||||
|
<img class="profile-img" data-edit="img" data-action="editImage" src="{{actor.img}}" title="{{actor.name}}" />
|
||||||
|
<div class="header-fields hero-copy">
|
||||||
|
<h1 class="sheet-title"><input name="name" type="text" value="{{actor.name}}" placeholder="Nom" {{#if isPlayMode}}disabled{{/if}} /></h1>
|
||||||
|
<p class="sheet-subtitle">Petit Peuple, Songes, Cauchemar et destin de compagnie</p>
|
||||||
|
<div class="sheet-actions">
|
||||||
|
<button type="button" data-action="openInitiative">{{localize "LESOUBLIES.rolls.initiative"}}</button>
|
||||||
|
<button type="button" data-action="openThreadHarvest">Récolte de fils</button>
|
||||||
|
<button class="mode-button" type="button" data-action="toggleSheet">{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
|
{{#each tabs as |tab|}}
|
||||||
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
|
<i class="{{tab.icon}}"></i>
|
||||||
|
<span>{{tab.label}}</span>
|
||||||
|
</button>
|
||||||
|
{{/each}}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.overview.cssClass}}" data-tab="overview">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card summary-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.derivedOverview"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.taille"}}</label>
|
||||||
|
<select name="system.size.value" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
{{#each choiceSets.personnageSizeOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.size.value)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
<span>{{derived.sizeLabel}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.vie"}}</label>
|
||||||
|
<input name="system.hp.value" type="number" value="{{system.hp.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>/ {{derived.hpMax}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.songes"}}</label>
|
||||||
|
<input name="system.songes.value" type="number" value="{{system.songes.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.songes.points}} / {{system.songes.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteSonges"}}</label>
|
||||||
|
<input name="system.songes.debt" type="number" value="{{system.songes.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditSonges"}}</label>
|
||||||
|
<input name="system.songes.xpCredit" type="number" value="{{system.songes.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.cauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.value" type="number" value="{{system.cauchemar.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.cauchemar.points}} / {{system.cauchemar.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.debt" type="number" value="{{system.cauchemar.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.xpCredit" type="number" value="{{system.cauchemar.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.xp"}}</label>
|
||||||
|
<input name="system.experience.value" type="number" value="{{system.experience.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ecorces"}}</label>
|
||||||
|
<input name="system.money.ecorces" type="number" value="{{system.money.ecorces}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ombreDuTourment"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.ombreDuTourment" type="checkbox" {{checked system.flagsNarratifs.ombreDuTourment}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card creation-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.identite"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.age"}}</label>
|
||||||
|
<input name="system.biodata.age" type="number" value="{{system.biodata.age}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.sexe"}}</label>
|
||||||
|
<input name="system.biodata.sexe" type="text" value="{{system.biodata.sexe}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.motsCles"}}</label>
|
||||||
|
<input name="system.biodata.motscles" type="text" value="{{system.biodata.motscles}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaine"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.isCaptain" type="checkbox" {{checked system.flagsNarratifs.isCaptain}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card creation-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.creation"}}</h2>
|
||||||
|
<div class="creation-slots" data-creation-drop-zone>
|
||||||
|
{{#each creationSlots as |slot|}}
|
||||||
|
<article class="creation-slot {{#if slot.item}}is-filled{{else}}is-empty{{/if}}" data-drop-creation-type="{{slot.type}}">
|
||||||
|
<div class="creation-slot-header">
|
||||||
|
<div>
|
||||||
|
<p class="creation-slot-kicker">{{slot.label}}</p>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<strong class="creation-slot-name">{{slot.item.name}}</strong>
|
||||||
|
{{else}}
|
||||||
|
<strong class="creation-slot-name">—</strong>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{slot.item.id}}">{{localize "LESOUBLIES.ui.edit"}}</button>
|
||||||
|
{{#unless @root.isPlayMode}}
|
||||||
|
<button type="button" data-action="removeCreationItem" data-type="{{slot.type}}">{{localize "LESOUBLIES.ui.delete"}}</button>
|
||||||
|
{{/unless}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
<div class="creation-slot-body">
|
||||||
|
{{#if slot.item}}
|
||||||
|
<img class="creation-slot-image" src="{{slot.item.img}}" alt="{{slot.item.name}}" />
|
||||||
|
<p class="help-text">{{slot.filledHint}}</p>
|
||||||
|
{{else}}
|
||||||
|
<p class="help-text">{{slot.emptyHint}}</p>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.compagnie"}}</label>
|
||||||
|
<select name="system.references.compagnieId" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
<option value="">—</option>
|
||||||
|
{{#each choiceSets.companyOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.references.compagnieId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<p class="help-text"><strong>{{localize "LESOUBLIES.labels.compagnie"}} :</strong> {{#if derived.compagnie}}{{derived.compagnie.name}}{{else}}—{{/if}}</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.skills.cssClass}}" data-tab="skills">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.competences"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="competence">+ {{localize "TYPES.Item.competence"}}</button>
|
||||||
|
</div>
|
||||||
|
{{#each skillGroups as |group|}}
|
||||||
|
<div class="group-block">
|
||||||
|
<div class="group-header">
|
||||||
|
<h3>{{group.label}}</h3>
|
||||||
|
<label class="profile-badge">
|
||||||
|
<span>{{localize "LESOUBLIES.labels.profil"}}</span>
|
||||||
|
<input name="system.profils.{{group.id}}" type="number" value="{{group.profileValue}}" {{#if @root.isPlayMode}}disabled{{/if}} />
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each group.items as |entry|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{entry.item.name}}</strong>
|
||||||
|
<div>Base {{entry.item.system.base}} + {{group.label}} {{group.profileValue}} - {{localize "LESOUBLIES.labels.valeurFinale"}} {{entry.finalValue}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="rollSkill" data-item-id="{{entry.item.id}}">{{localize "LESOUBLIES.ui.roll"}}</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{entry.item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{entry.item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.actions.cssClass}}" data-tab="actions">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.combat"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="encourager">Encourager</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="intimider">Intimider</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="evaluer">Évaluer</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="maitriser">Maîtriser</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="seDeplacer">Se déplacer</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.magie"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="sortilege">+ {{localize "TYPES.Item.sortilege"}}</button>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each spells as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{item.name}}</strong>
|
||||||
|
<div>{{item.system.tradition}} / {{item.system.polarity}} / coût {{item.system.cost}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="useSpell" data-item-id="{{item.id}}">Activer</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.equipment.cssClass}}" data-tab="equipment">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.equipement"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="createItem" data-type="arme">+ {{localize "TYPES.Item.arme"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="armure">+ {{localize "TYPES.Item.armure"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="equipement">+ {{localize "TYPES.Item.equipement"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each weapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.arme"}} - {{item.system.damage}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useWeapon" data-item-id="{{item.id}}">Attaque</button><button type="button" data-action="resolveWeaponDamage" data-item-id="{{item.id}}">Dégâts</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each armors as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.armure"}} - Prot {{item.system.protection}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each equipment as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.equipement"}} - {{item.system.category}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
|
<section class="sheet-card notes-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.notes"}}</h2>
|
||||||
|
<label>{{localize "LESOUBLIES.labels.description"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.description enriched=enriched.biodata.description value=system.biodata.description name="system.biodata.description" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.notes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.notes enriched=enriched.biodata.notes value=system.biodata.notes name="system.biodata.notes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.gmnotes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.gmnotes enriched=enriched.biodata.gmnotes value=system.biodata.gmnotes name="system.biodata.gmnotes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.liensNarratifs"}}</label>
|
||||||
|
{{formInput systemFields.visions enriched=enriched.visions value=system.visions name="system.visions" toggled=true}}
|
||||||
|
{{#if activeCompanyPower}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.pouvoirCompagnieActif"}}</label>
|
||||||
|
<div class="help-text">{{activeCompanyPower.name}} — {{activeCompanyPower.system.activationCondition}}</div>
|
||||||
|
{{/if}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
@@ -0,0 +1,272 @@
|
|||||||
|
<section class="{{cssClass}} les-oublies-sheet personnage-sheet" autocomplete="off">
|
||||||
|
<header class="sheet-header hero-banner">
|
||||||
|
<img class="profile-img" data-edit="img" data-action="editImage" src="{{actor.img}}" title="{{actor.name}}" />
|
||||||
|
<div class="header-fields hero-copy">
|
||||||
|
<h1 class="sheet-title"><input name="name" type="text" value="{{actor.name}}" placeholder="Nom" {{#if isPlayMode}}disabled{{/if}} /></h1>
|
||||||
|
<div class="sheet-actions">
|
||||||
|
<button type="button" data-action="openInitiative">{{localize "LESOUBLIES.rolls.initiative"}}</button>
|
||||||
|
<button type="button" data-action="openThreadHarvest">Récolte de fils</button>
|
||||||
|
<button class="mode-button" type="button" data-action="toggleSheet">{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
|
{{#each tabs as |tab|}}
|
||||||
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
|
<i class="{{tab.icon}}"></i>
|
||||||
|
<span>{{tab.label}}</span>
|
||||||
|
</button>
|
||||||
|
{{/each}}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.overview.cssClass}}" data-tab="overview">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card summary-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.derivedOverview"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.taille"}}</label>
|
||||||
|
<select name="system.size.value" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
{{#each choiceSets.personnageSizeOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.size.value)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
<span>{{derived.sizeLabel}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.vie"}}</label>
|
||||||
|
<input name="system.hp.value" type="number" value="{{system.hp.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>/ {{derived.hpMax}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.songes"}}</label>
|
||||||
|
<input name="system.songes.value" type="number" value="{{system.songes.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.songes.points}} / {{system.songes.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteSonges"}}</label>
|
||||||
|
<input name="system.songes.debt" type="number" value="{{system.songes.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditSonges"}}</label>
|
||||||
|
<input name="system.songes.xpCredit" type="number" value="{{system.songes.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.cauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.value" type="number" value="{{system.cauchemar.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.cauchemar.points}} / {{system.cauchemar.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.debt" type="number" value="{{system.cauchemar.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.xpCredit" type="number" value="{{system.cauchemar.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.xp"}}</label>
|
||||||
|
<input name="system.experience.value" type="number" value="{{system.experience.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ecorces"}}</label>
|
||||||
|
<input name="system.money.ecorces" type="number" value="{{system.money.ecorces}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ombreDuTourment"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.ombreDuTourment" type="checkbox" {{checked system.flagsNarratifs.ombreDuTourment}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card creation-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.identite"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.age"}}</label>
|
||||||
|
<input name="system.biodata.age" type="number" value="{{system.biodata.age}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.sexe"}}</label>
|
||||||
|
<input name="system.biodata.sexe" type="text" value="{{system.biodata.sexe}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.motsCles"}}</label>
|
||||||
|
<input name="system.biodata.motscles" type="text" value="{{system.biodata.motscles}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaine"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.isCaptain" type="checkbox" {{checked system.flagsNarratifs.isCaptain}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card creation-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.creation"}}</h2>
|
||||||
|
<div class="creation-slots" data-creation-drop-zone>
|
||||||
|
{{#each creationSlots as |slot|}}
|
||||||
|
<article class="creation-slot {{#if slot.item}}is-filled{{else}}is-empty{{/if}}" data-drop-creation-type="{{slot.type}}">
|
||||||
|
<div class="creation-slot-header">
|
||||||
|
<div>
|
||||||
|
<p class="creation-slot-kicker">{{slot.label}}</p>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<strong class="creation-slot-name">{{slot.item.name}}</strong>
|
||||||
|
{{else}}
|
||||||
|
<strong class="creation-slot-name">—</strong>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{slot.item.id}}">{{localize "LESOUBLIES.ui.edit"}}</button>
|
||||||
|
{{#unless @root.isPlayMode}}
|
||||||
|
<button type="button" data-action="removeCreationItem" data-type="{{slot.type}}">{{localize "LESOUBLIES.ui.delete"}}</button>
|
||||||
|
{{/unless}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
<div class="creation-slot-body">
|
||||||
|
{{#if slot.item}}
|
||||||
|
<img class="creation-slot-image" src="{{slot.item.img}}" alt="{{slot.item.name}}" />
|
||||||
|
<p class="help-text">{{slot.filledHint}}</p>
|
||||||
|
{{else}}
|
||||||
|
<p class="help-text">{{slot.emptyHint}}</p>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.compagnie"}}</label>
|
||||||
|
<select name="system.references.compagnieId" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
<option value="">—</option>
|
||||||
|
{{#each choiceSets.companyOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.references.compagnieId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<p class="help-text"><strong>{{localize "LESOUBLIES.labels.compagnie"}} :</strong> {{#if derived.compagnie}}{{derived.compagnie.name}}{{else}}—{{/if}}</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.skills.cssClass}}" data-tab="skills">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.competences"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="competence">+ {{localize "TYPES.Item.competence"}}</button>
|
||||||
|
</div>
|
||||||
|
{{#each skillGroups as |group|}}
|
||||||
|
<div class="group-block">
|
||||||
|
<div class="group-header">
|
||||||
|
<h3>{{group.label}}</h3>
|
||||||
|
<label class="profile-badge">
|
||||||
|
<span>{{localize "LESOUBLIES.labels.profil"}}</span>
|
||||||
|
<input name="system.profils.{{group.id}}" type="number" value="{{group.profileValue}}" {{#if @root.isPlayMode}}disabled{{/if}} />
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each group.items as |entry|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{entry.item.name}}</strong>
|
||||||
|
<div>Base {{entry.item.system.base}} + {{group.label}} {{group.profileValue}} - {{localize "LESOUBLIES.labels.valeurFinale"}} {{entry.finalValue}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="rollSkill" data-item-id="{{entry.item.id}}">{{localize "LESOUBLIES.ui.roll"}}</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{entry.item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{entry.item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.actions.cssClass}}" data-tab="actions">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.combat"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="encourager">Encourager</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="intimider">Intimider</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="evaluer">Évaluer</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="maitriser">Maîtriser</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="seDeplacer">Se déplacer</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.magie"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="sortilege">+ {{localize "TYPES.Item.sortilege"}}</button>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each spells as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{item.name}}</strong>
|
||||||
|
<div>{{item.system.tradition}} / {{item.system.polarity}} / coût {{item.system.cost}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="useSpell" data-item-id="{{item.id}}">Activer</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.equipment.cssClass}}" data-tab="equipment">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.equipement"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="createItem" data-type="arme">+ {{localize "TYPES.Item.arme"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="armure">+ {{localize "TYPES.Item.armure"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="equipement">+ {{localize "TYPES.Item.equipement"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each weapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.arme"}} - {{item.system.damage}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useWeapon" data-item-id="{{item.id}}">Attaque</button><button type="button" data-action="resolveWeaponDamage" data-item-id="{{item.id}}">Dégâts</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each armors as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.armure"}} - Prot {{item.system.protection}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each equipment as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.equipement"}} - {{item.system.category}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
|
<section class="sheet-card notes-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.notes"}}</h2>
|
||||||
|
<label>{{localize "LESOUBLIES.labels.description"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.description enriched=enriched.biodata.description value=system.biodata.description name="system.biodata.description" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.notes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.notes enriched=enriched.biodata.notes value=system.biodata.notes name="system.biodata.notes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.gmnotes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.gmnotes enriched=enriched.biodata.gmnotes value=system.biodata.gmnotes name="system.biodata.gmnotes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.liensNarratifs"}}</label>
|
||||||
|
{{formInput systemFields.visions enriched=enriched.visions value=system.visions name="system.visions" toggled=true}}
|
||||||
|
{{#if activeCompanyPower}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.pouvoirCompagnieActif"}}</label>
|
||||||
|
<div class="help-text">{{activeCompanyPower.name}} — {{activeCompanyPower.system.activationCondition}}</div>
|
||||||
|
{{/if}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
@@ -0,0 +1,264 @@
|
|||||||
|
<section class="{{cssClass}} les-oublies-sheet personnage-sheet" autocomplete="off">
|
||||||
|
<header class="sheet-header hero-banner">
|
||||||
|
<img class="profile-img" data-edit="img" data-action="editImage" src="{{actor.img}}" title="{{actor.name}}" />
|
||||||
|
<div class="header-fields hero-copy">
|
||||||
|
<h1 class="sheet-title"><input name="name" type="text" value="{{actor.name}}" placeholder="Nom" {{#if isPlayMode}}disabled{{/if}} /></h1>
|
||||||
|
<div class="sheet-actions">
|
||||||
|
<button type="button" data-action="openInitiative">{{localize "LESOUBLIES.rolls.initiative"}}</button>
|
||||||
|
<button type="button" data-action="openThreadHarvest">Récolte de fils</button>
|
||||||
|
<button class="mode-button" type="button" data-action="toggleSheet">{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}</button>
|
||||||
|
</div>
|
||||||
|
<div class="creation-slots creation-slots--header" data-creation-drop-zone>
|
||||||
|
{{#each creationSlots as |slot|}}
|
||||||
|
<article class="creation-slot creation-slot--compact {{#if slot.item}}is-filled{{else}}is-empty{{/if}}" data-drop-creation-type="{{slot.type}}">
|
||||||
|
<div class="creation-slot-header">
|
||||||
|
<div>
|
||||||
|
<p class="creation-slot-kicker">{{slot.label}}</p>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<strong class="creation-slot-name">{{slot.item.name}}</strong>
|
||||||
|
{{else}}
|
||||||
|
<strong class="creation-slot-name">Glisser ici</strong>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<div class="item-controls item-controls--compact">
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{slot.item.id}}">Mod.</button>
|
||||||
|
{{#unless @root.isPlayMode}}
|
||||||
|
<button type="button" data-action="removeCreationItem" data-type="{{slot.type}}">X</button>
|
||||||
|
{{/unless}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
|
{{#each tabs as |tab|}}
|
||||||
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
|
<i class="{{tab.icon}}"></i>
|
||||||
|
<span>{{tab.label}}</span>
|
||||||
|
</button>
|
||||||
|
{{/each}}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.overview.cssClass}}" data-tab="overview">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card summary-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.derivedOverview"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.taille"}}</label>
|
||||||
|
<select name="system.size.value" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
{{#each choiceSets.personnageSizeOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.size.value)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
<span>{{derived.sizeLabel}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.vie"}}</label>
|
||||||
|
<input name="system.hp.value" type="number" value="{{system.hp.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>/ {{derived.hpMax}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.songes"}}</label>
|
||||||
|
<input name="system.songes.value" type="number" value="{{system.songes.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.songes.points}} / {{system.songes.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteSonges"}}</label>
|
||||||
|
<input name="system.songes.debt" type="number" value="{{system.songes.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditSonges"}}</label>
|
||||||
|
<input name="system.songes.xpCredit" type="number" value="{{system.songes.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.cauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.value" type="number" value="{{system.cauchemar.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.cauchemar.points}} / {{system.cauchemar.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.debt" type="number" value="{{system.cauchemar.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.xpCredit" type="number" value="{{system.cauchemar.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.xp"}}</label>
|
||||||
|
<input name="system.experience.value" type="number" value="{{system.experience.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ecorces"}}</label>
|
||||||
|
<input name="system.money.ecorces" type="number" value="{{system.money.ecorces}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ombreDuTourment"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.ombreDuTourment" type="checkbox" {{checked system.flagsNarratifs.ombreDuTourment}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card creation-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.identite"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.age"}}</label>
|
||||||
|
<input name="system.biodata.age" type="number" value="{{system.biodata.age}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.sexe"}}</label>
|
||||||
|
<input name="system.biodata.sexe" type="text" value="{{system.biodata.sexe}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.motsCles"}}</label>
|
||||||
|
<input name="system.biodata.motscles" type="text" value="{{system.biodata.motscles}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaine"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.isCaptain" type="checkbox" {{checked system.flagsNarratifs.isCaptain}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card creation-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.creation"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.compagnie"}}</label>
|
||||||
|
<select name="system.references.compagnieId" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
<option value="">—</option>
|
||||||
|
{{#each choiceSets.companyOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.references.compagnieId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<p class="help-text"><strong>{{localize "LESOUBLIES.labels.compagnie"}} :</strong> {{#if derived.compagnie}}{{derived.compagnie.name}}{{else}}—{{/if}}</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.skills.cssClass}}" data-tab="skills">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.competences"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="competence">+ {{localize "TYPES.Item.competence"}}</button>
|
||||||
|
</div>
|
||||||
|
{{#each skillGroups as |group|}}
|
||||||
|
<div class="group-block">
|
||||||
|
<div class="group-header">
|
||||||
|
<h3>{{group.label}}</h3>
|
||||||
|
<label class="profile-badge">
|
||||||
|
<span>{{localize "LESOUBLIES.labels.profil"}}</span>
|
||||||
|
<input name="system.profils.{{group.id}}" type="number" value="{{group.profileValue}}" {{#if @root.isPlayMode}}disabled{{/if}} />
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each group.items as |entry|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{entry.item.name}}</strong>
|
||||||
|
<div>Base {{entry.item.system.base}} + {{group.label}} {{group.profileValue}} - {{localize "LESOUBLIES.labels.valeurFinale"}} {{entry.finalValue}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="rollSkill" data-item-id="{{entry.item.id}}">{{localize "LESOUBLIES.ui.roll"}}</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{entry.item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{entry.item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.actions.cssClass}}" data-tab="actions">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.combat"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="encourager">Encourager</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="intimider">Intimider</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="evaluer">Évaluer</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="maitriser">Maîtriser</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="seDeplacer">Se déplacer</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.magie"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="sortilege">+ {{localize "TYPES.Item.sortilege"}}</button>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each spells as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{item.name}}</strong>
|
||||||
|
<div>{{item.system.tradition}} / {{item.system.polarity}} / coût {{item.system.cost}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="useSpell" data-item-id="{{item.id}}">Activer</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.equipment.cssClass}}" data-tab="equipment">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.equipement"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="createItem" data-type="arme">+ {{localize "TYPES.Item.arme"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="armure">+ {{localize "TYPES.Item.armure"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="equipement">+ {{localize "TYPES.Item.equipement"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each weapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.arme"}} - {{item.system.damage}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useWeapon" data-item-id="{{item.id}}">Attaque</button><button type="button" data-action="resolveWeaponDamage" data-item-id="{{item.id}}">Dégâts</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each armors as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.armure"}} - Prot {{item.system.protection}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each equipment as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.equipement"}} - {{item.system.category}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
|
<section class="sheet-card notes-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.notes"}}</h2>
|
||||||
|
<label>{{localize "LESOUBLIES.labels.description"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.description enriched=enriched.biodata.description value=system.biodata.description name="system.biodata.description" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.notes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.notes enriched=enriched.biodata.notes value=system.biodata.notes name="system.biodata.notes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.gmnotes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.gmnotes enriched=enriched.biodata.gmnotes value=system.biodata.gmnotes name="system.biodata.gmnotes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.liensNarratifs"}}</label>
|
||||||
|
{{formInput systemFields.visions enriched=enriched.visions value=system.visions name="system.visions" toggled=true}}
|
||||||
|
{{#if activeCompanyPower}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.pouvoirCompagnieActif"}}</label>
|
||||||
|
<div class="help-text">{{activeCompanyPower.name}} — {{activeCompanyPower.system.activationCondition}}</div>
|
||||||
|
{{/if}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
@@ -0,0 +1,266 @@
|
|||||||
|
<section class="{{cssClass}} les-oublies-sheet personnage-sheet" autocomplete="off">
|
||||||
|
<header class="sheet-header hero-banner">
|
||||||
|
<img class="profile-img" data-edit="img" data-action="editImage" src="{{actor.img}}" title="{{actor.name}}" />
|
||||||
|
<div class="header-fields hero-copy">
|
||||||
|
<button class="mode-button mode-button--icon" type="button" data-action="toggleSheet" title="{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}" aria-label="{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}">
|
||||||
|
<i class="fa-solid {{#if isEditMode}}fa-eye{{else}}fa-pen-to-square{{/if}}"></i>
|
||||||
|
</button>
|
||||||
|
<h1 class="sheet-title"><input name="name" type="text" value="{{actor.name}}" placeholder="Nom" {{#if isPlayMode}}disabled{{/if}} /></h1>
|
||||||
|
<div class="sheet-actions">
|
||||||
|
<button type="button" data-action="openInitiative">{{localize "LESOUBLIES.rolls.initiative"}}</button>
|
||||||
|
<button type="button" data-action="openThreadHarvest">Récolte de fils</button>
|
||||||
|
</div>
|
||||||
|
<div class="creation-slots creation-slots--header" data-creation-drop-zone>
|
||||||
|
{{#each creationSlots as |slot|}}
|
||||||
|
<article class="creation-slot creation-slot--compact {{#if slot.item}}is-filled{{else}}is-empty{{/if}}" data-drop-creation-type="{{slot.type}}">
|
||||||
|
<div class="creation-slot-header">
|
||||||
|
<div>
|
||||||
|
<p class="creation-slot-kicker">{{slot.label}}</p>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<strong class="creation-slot-name">{{slot.item.name}}</strong>
|
||||||
|
{{else}}
|
||||||
|
<strong class="creation-slot-name">Glisser ici</strong>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<div class="item-controls item-controls--compact">
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{slot.item.id}}">Mod.</button>
|
||||||
|
{{#unless @root.isPlayMode}}
|
||||||
|
<button type="button" data-action="removeCreationItem" data-type="{{slot.type}}">X</button>
|
||||||
|
{{/unless}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
|
{{#each tabs as |tab|}}
|
||||||
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
|
<i class="{{tab.icon}}"></i>
|
||||||
|
<span>{{tab.label}}</span>
|
||||||
|
</button>
|
||||||
|
{{/each}}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.overview.cssClass}}" data-tab="overview">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card summary-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.derivedOverview"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.taille"}}</label>
|
||||||
|
<select name="system.size.value" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
{{#each choiceSets.personnageSizeOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.size.value)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
<span>{{derived.sizeLabel}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.vie"}}</label>
|
||||||
|
<input name="system.hp.value" type="number" value="{{system.hp.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>/ {{derived.hpMax}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.songes"}}</label>
|
||||||
|
<input name="system.songes.value" type="number" value="{{system.songes.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.songes.points}} / {{system.songes.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteSonges"}}</label>
|
||||||
|
<input name="system.songes.debt" type="number" value="{{system.songes.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditSonges"}}</label>
|
||||||
|
<input name="system.songes.xpCredit" type="number" value="{{system.songes.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.cauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.value" type="number" value="{{system.cauchemar.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.cauchemar.points}} / {{system.cauchemar.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.debt" type="number" value="{{system.cauchemar.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.xpCredit" type="number" value="{{system.cauchemar.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.xp"}}</label>
|
||||||
|
<input name="system.experience.value" type="number" value="{{system.experience.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ecorces"}}</label>
|
||||||
|
<input name="system.money.ecorces" type="number" value="{{system.money.ecorces}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ombreDuTourment"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.ombreDuTourment" type="checkbox" {{checked system.flagsNarratifs.ombreDuTourment}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card creation-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.identite"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.age"}}</label>
|
||||||
|
<input name="system.biodata.age" type="number" value="{{system.biodata.age}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.sexe"}}</label>
|
||||||
|
<input name="system.biodata.sexe" type="text" value="{{system.biodata.sexe}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.motsCles"}}</label>
|
||||||
|
<input name="system.biodata.motscles" type="text" value="{{system.biodata.motscles}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaine"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.isCaptain" type="checkbox" {{checked system.flagsNarratifs.isCaptain}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card creation-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.creation"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.compagnie"}}</label>
|
||||||
|
<select name="system.references.compagnieId" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
<option value="">—</option>
|
||||||
|
{{#each choiceSets.companyOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.references.compagnieId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<p class="help-text"><strong>{{localize "LESOUBLIES.labels.compagnie"}} :</strong> {{#if derived.compagnie}}{{derived.compagnie.name}}{{else}}—{{/if}}</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.skills.cssClass}}" data-tab="skills">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.competences"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="competence">+ {{localize "TYPES.Item.competence"}}</button>
|
||||||
|
</div>
|
||||||
|
{{#each skillGroups as |group|}}
|
||||||
|
<div class="group-block">
|
||||||
|
<div class="group-header">
|
||||||
|
<h3>{{group.label}}</h3>
|
||||||
|
<label class="profile-badge">
|
||||||
|
<span>{{localize "LESOUBLIES.labels.profil"}}</span>
|
||||||
|
<input name="system.profils.{{group.id}}" type="number" value="{{group.profileValue}}" {{#if @root.isPlayMode}}disabled{{/if}} />
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each group.items as |entry|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{entry.item.name}}</strong>
|
||||||
|
<div>Base {{entry.item.system.base}} + {{group.label}} {{group.profileValue}} - {{localize "LESOUBLIES.labels.valeurFinale"}} {{entry.finalValue}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="rollSkill" data-item-id="{{entry.item.id}}">{{localize "LESOUBLIES.ui.roll"}}</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{entry.item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{entry.item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.actions.cssClass}}" data-tab="actions">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.combat"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="encourager">Encourager</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="intimider">Intimider</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="evaluer">Évaluer</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="maitriser">Maîtriser</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="seDeplacer">Se déplacer</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.magie"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="sortilege">+ {{localize "TYPES.Item.sortilege"}}</button>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each spells as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{item.name}}</strong>
|
||||||
|
<div>{{item.system.tradition}} / {{item.system.polarity}} / coût {{item.system.cost}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="useSpell" data-item-id="{{item.id}}">Activer</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.equipment.cssClass}}" data-tab="equipment">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.equipement"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="createItem" data-type="arme">+ {{localize "TYPES.Item.arme"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="armure">+ {{localize "TYPES.Item.armure"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="equipement">+ {{localize "TYPES.Item.equipement"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each weapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.arme"}} - {{item.system.damage}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useWeapon" data-item-id="{{item.id}}">Attaque</button><button type="button" data-action="resolveWeaponDamage" data-item-id="{{item.id}}">Dégâts</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each armors as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.armure"}} - Prot {{item.system.protection}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each equipment as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.equipement"}} - {{item.system.category}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
|
<section class="sheet-card notes-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.notes"}}</h2>
|
||||||
|
<label>{{localize "LESOUBLIES.labels.description"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.description enriched=enriched.biodata.description value=system.biodata.description name="system.biodata.description" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.notes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.notes enriched=enriched.biodata.notes value=system.biodata.notes name="system.biodata.notes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.gmnotes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.gmnotes enriched=enriched.biodata.gmnotes value=system.biodata.gmnotes name="system.biodata.gmnotes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.liensNarratifs"}}</label>
|
||||||
|
{{formInput systemFields.visions enriched=enriched.visions value=system.visions name="system.visions" toggled=true}}
|
||||||
|
{{#if activeCompanyPower}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.pouvoirCompagnieActif"}}</label>
|
||||||
|
<div class="help-text">{{activeCompanyPower.name}} — {{activeCompanyPower.system.activationCondition}}</div>
|
||||||
|
{{/if}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
@@ -0,0 +1,278 @@
|
|||||||
|
<section class="{{cssClass}} les-oublies-sheet personnage-sheet" autocomplete="off">
|
||||||
|
<header class="sheet-header hero-banner">
|
||||||
|
<img class="profile-img" data-edit="img" data-action="editImage" src="{{actor.img}}" title="{{actor.name}}" />
|
||||||
|
<div class="header-fields hero-copy">
|
||||||
|
<button class="mode-button mode-button--icon" type="button" data-action="toggleSheet" title="{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}" aria-label="{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}">
|
||||||
|
<i class="fa-solid {{#if isEditMode}}fa-eye{{else}}fa-pen-to-square{{/if}}"></i>
|
||||||
|
</button>
|
||||||
|
<h1 class="sheet-title"><input name="name" type="text" value="{{actor.name}}" placeholder="Nom" {{#if isPlayMode}}disabled{{/if}} /></h1>
|
||||||
|
<div class="sheet-actions">
|
||||||
|
<button type="button" data-action="openInitiative">{{localize "LESOUBLIES.rolls.initiative"}}</button>
|
||||||
|
<button type="button" data-action="openThreadHarvest">Récolte de fils</button>
|
||||||
|
</div>
|
||||||
|
<div class="creation-slots creation-slots--header" data-creation-drop-zone>
|
||||||
|
{{#each creationSlots as |slot|}}
|
||||||
|
<article class="creation-slot creation-slot--compact {{#if slot.item}}is-filled{{else}}is-empty{{/if}}" data-drop-creation-type="{{slot.type}}">
|
||||||
|
<div class="creation-slot-header">
|
||||||
|
<div>
|
||||||
|
<p class="creation-slot-kicker">{{slot.label}}</p>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<strong class="creation-slot-name">{{slot.item.name}}</strong>
|
||||||
|
{{else}}
|
||||||
|
<strong class="creation-slot-name">Glisser ici</strong>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<div class="item-controls item-controls--compact">
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{slot.item.id}}">Mod.</button>
|
||||||
|
{{#unless @root.isPlayMode}}
|
||||||
|
<button type="button" data-action="removeCreationItem" data-type="{{slot.type}}">X</button>
|
||||||
|
{{/unless}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
|
{{#each tabs as |tab|}}
|
||||||
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
|
<i class="{{tab.icon}}"></i>
|
||||||
|
<span>{{tab.label}}</span>
|
||||||
|
</button>
|
||||||
|
{{/each}}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.overview.cssClass}}" data-tab="overview">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card summary-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.derivedOverview"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.taille"}}</label>
|
||||||
|
<select name="system.size.value" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
{{#each choiceSets.personnageSizeOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.size.value)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
<span>{{derived.sizeLabel}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.vie"}}</label>
|
||||||
|
<input name="system.hp.value" type="number" value="{{system.hp.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>/ {{derived.hpMax}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.songes"}}</label>
|
||||||
|
<input name="system.songes.value" type="number" value="{{system.songes.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.songes.points}} / {{system.songes.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteSonges"}}</label>
|
||||||
|
<input name="system.songes.debt" type="number" value="{{system.songes.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditSonges"}}</label>
|
||||||
|
<input name="system.songes.xpCredit" type="number" value="{{system.songes.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.cauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.value" type="number" value="{{system.cauchemar.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.cauchemar.points}} / {{system.cauchemar.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.debt" type="number" value="{{system.cauchemar.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.xpCredit" type="number" value="{{system.cauchemar.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.xp"}}</label>
|
||||||
|
<input name="system.experience.value" type="number" value="{{system.experience.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ecorces"}}</label>
|
||||||
|
<input name="system.money.ecorces" type="number" value="{{system.money.ecorces}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ombreDuTourment"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.ombreDuTourment" type="checkbox" {{checked system.flagsNarratifs.ombreDuTourment}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card creation-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.identite"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.age"}}</label>
|
||||||
|
<input name="system.biodata.age" type="number" value="{{system.biodata.age}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.sexe"}}</label>
|
||||||
|
<input name="system.biodata.sexe" type="text" value="{{system.biodata.sexe}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.motsCles"}}</label>
|
||||||
|
<input name="system.biodata.motscles" type="text" value="{{system.biodata.motscles}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaine"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.isCaptain" type="checkbox" {{checked system.flagsNarratifs.isCaptain}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card creation-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.creation"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.compagnie"}}</label>
|
||||||
|
<select name="system.references.compagnieId" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
<option value="">—</option>
|
||||||
|
{{#each choiceSets.companyOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.references.compagnieId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<p class="help-text"><strong>{{localize "LESOUBLIES.labels.compagnie"}} :</strong> {{#if derived.compagnie}}{{derived.compagnie.name}}{{else}}—{{/if}}</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.skills.cssClass}}" data-tab="skills">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.competences"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="competence">+ {{localize "TYPES.Item.competence"}}</button>
|
||||||
|
</div>
|
||||||
|
{{#each skillGroups as |group|}}
|
||||||
|
<div class="group-block">
|
||||||
|
<div class="group-header">
|
||||||
|
<h3>{{group.label}}</h3>
|
||||||
|
<label class="profile-badge">
|
||||||
|
<span>{{localize "LESOUBLIES.labels.profil"}}</span>
|
||||||
|
<input name="system.profils.{{group.id}}" type="number" value="{{group.profileValue}}" {{#if @root.isPlayMode}}disabled{{/if}} />
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each group.items as |entry|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{entry.item.name}}</strong>
|
||||||
|
<div>Base {{entry.item.system.base}} + {{group.label}} {{group.profileValue}} - {{localize "LESOUBLIES.labels.valeurFinale"}} {{entry.finalValue}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="rollSkill" data-item-id="{{entry.item.id}}">{{localize "LESOUBLIES.ui.roll"}}</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{entry.item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{entry.item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.actions.cssClass}}" data-tab="actions">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.combat"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="encourager">Encourager</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="intimider">Intimider</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="evaluer">Évaluer</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="maitriser">Maîtriser</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="seDeplacer">Se déplacer</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#if equippedWeapons.length}}
|
||||||
|
{{#each equippedWeapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.arme"}} - {{item.system.damage}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useWeapon" data-item-id="{{item.id}}">Attaque</button><button type="button" data-action="resolveWeaponDamage" data-item-id="{{item.id}}">Dégâts</button><button type="button" data-action="toggleEquipped" data-item-id="{{item.id}}">Retirer</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{else}}
|
||||||
|
<p class="help-text">Aucune arme équipée.</p>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.magie"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="sortilege">+ {{localize "TYPES.Item.sortilege"}}</button>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each spells as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{item.name}}</strong>
|
||||||
|
<div>{{item.system.tradition}} / {{item.system.polarity}} / coût {{item.system.cost}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="useSpell" data-item-id="{{item.id}}">Activer</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.equipment.cssClass}}" data-tab="equipment">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.equipement"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="createItem" data-type="arme">+ {{localize "TYPES.Item.arme"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="armure">+ {{localize "TYPES.Item.armure"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="equipement">+ {{localize "TYPES.Item.equipement"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each weapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.arme"}} - {{item.system.damage}}{{#if item.system.equipped}} - Équipée{{/if}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="toggleEquipped" data-item-id="{{item.id}}">{{#if item.system.equipped}}Retirer{{else}}Équiper{{/if}}</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each armors as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.armure"}} - Prot {{item.system.protection}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each equipment as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.equipement"}} - {{item.system.category}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
|
<section class="sheet-card notes-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.notes"}}</h2>
|
||||||
|
<label>{{localize "LESOUBLIES.labels.description"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.description enriched=enriched.biodata.description value=system.biodata.description name="system.biodata.description" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.notes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.notes enriched=enriched.biodata.notes value=system.biodata.notes name="system.biodata.notes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.gmnotes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.gmnotes enriched=enriched.biodata.gmnotes value=system.biodata.gmnotes name="system.biodata.gmnotes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.liensNarratifs"}}</label>
|
||||||
|
{{formInput systemFields.visions enriched=enriched.visions value=system.visions name="system.visions" toggled=true}}
|
||||||
|
{{#if activeCompanyPower}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.pouvoirCompagnieActif"}}</label>
|
||||||
|
<div class="help-text">{{activeCompanyPower.name}} — {{activeCompanyPower.system.activationCondition}}</div>
|
||||||
|
{{/if}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
@@ -0,0 +1,277 @@
|
|||||||
|
<section class="{{cssClass}} les-oublies-sheet personnage-sheet" autocomplete="off">
|
||||||
|
<header class="sheet-header hero-banner">
|
||||||
|
<img class="profile-img" data-edit="img" data-action="editImage" src="{{actor.img}}" title="{{actor.name}}" />
|
||||||
|
<div class="header-fields hero-copy">
|
||||||
|
<button class="mode-button mode-button--icon" type="button" data-action="toggleSheet" title="{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}" aria-label="{{#if isEditMode}}{{localize "LESOUBLIES.ui.playMode"}}{{else}}{{localize "LESOUBLIES.ui.editMode"}}{{/if}}">
|
||||||
|
<i class="fa-solid {{#if isEditMode}}fa-eye{{else}}fa-pen-to-square{{/if}}"></i>
|
||||||
|
</button>
|
||||||
|
<h1 class="sheet-title"><input name="name" type="text" value="{{actor.name}}" placeholder="Nom" {{#if isPlayMode}}disabled{{/if}} /></h1>
|
||||||
|
<div class="sheet-actions">
|
||||||
|
<button type="button" data-action="openInitiative">{{localize "LESOUBLIES.rolls.initiative"}}</button>
|
||||||
|
<button type="button" data-action="openThreadHarvest">Récolte de fils</button>
|
||||||
|
</div>
|
||||||
|
<div class="creation-slots creation-slots--header" data-creation-drop-zone>
|
||||||
|
{{#each creationSlots as |slot|}}
|
||||||
|
<article class="creation-slot creation-slot--compact {{#if slot.item}}is-filled{{else}}is-empty{{/if}}" data-drop-creation-type="{{slot.type}}">
|
||||||
|
<div class="creation-slot-header">
|
||||||
|
<div>
|
||||||
|
<p class="creation-slot-kicker">{{slot.label}}</p>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<strong class="creation-slot-name">{{slot.item.name}}</strong>
|
||||||
|
{{else}}
|
||||||
|
<strong class="creation-slot-name">Glisser ici</strong>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<div class="item-controls item-controls--compact">
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{slot.item.id}}">Mod.</button>
|
||||||
|
{{#unless @root.isPlayMode}}
|
||||||
|
<button type="button" data-action="removeCreationItem" data-type="{{slot.type}}">X</button>
|
||||||
|
{{/unless}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
|
{{#each tabs as |tab|}}
|
||||||
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
|
<i class="{{tab.icon}}"></i>
|
||||||
|
<span>{{tab.label}}</span>
|
||||||
|
</button>
|
||||||
|
{{/each}}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.overview.cssClass}}" data-tab="overview">
|
||||||
|
<div class="sheet-grid sheet-grid-2">
|
||||||
|
<section class="sheet-card summary-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.derivedOverview"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.taille"}}</label>
|
||||||
|
<select name="system.size.value" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
{{#each choiceSets.personnageSizeOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.size.value)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
<span>{{derived.sizeLabel}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.vie"}}</label>
|
||||||
|
<input name="system.hp.value" type="number" value="{{system.hp.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>/ {{derived.hpMax}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.songes"}}</label>
|
||||||
|
<input name="system.songes.value" type="number" value="{{system.songes.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.songes.points}} / {{system.songes.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteSonges"}}</label>
|
||||||
|
<input name="system.songes.debt" type="number" value="{{system.songes.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditSonges"}}</label>
|
||||||
|
<input name="system.songes.xpCredit" type="number" value="{{system.songes.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.cauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.value" type="number" value="{{system.cauchemar.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.cauchemar.points}} / {{system.cauchemar.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.debt" type="number" value="{{system.cauchemar.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.xpCredit" type="number" value="{{system.cauchemar.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.xp"}}</label>
|
||||||
|
<input name="system.experience.value" type="number" value="{{system.experience.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ecorces"}}</label>
|
||||||
|
<input name="system.money.ecorces" type="number" value="{{system.money.ecorces}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ombreDuTourment"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.ombreDuTourment" type="checkbox" {{checked system.flagsNarratifs.ombreDuTourment}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card creation-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.creation"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.compagnie"}}</label>
|
||||||
|
<select name="system.references.compagnieId" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
<option value="">—</option>
|
||||||
|
{{#each choiceSets.companyOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.references.compagnieId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<p class="help-text"><strong>{{localize "LESOUBLIES.labels.compagnie"}} :</strong> {{#if derived.compagnie}}{{derived.compagnie.name}}{{else}}—{{/if}}</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.skills.cssClass}}" data-tab="skills">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.competences"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="competence">+ {{localize "TYPES.Item.competence"}}</button>
|
||||||
|
</div>
|
||||||
|
{{#each skillGroups as |group|}}
|
||||||
|
<div class="group-block">
|
||||||
|
<div class="group-header">
|
||||||
|
<h3>{{group.label}}</h3>
|
||||||
|
<label class="profile-badge">
|
||||||
|
<span>{{localize "LESOUBLIES.labels.profil"}}</span>
|
||||||
|
<input name="system.profils.{{group.id}}" type="number" value="{{group.profileValue}}" {{#if @root.isPlayMode}}disabled{{/if}} />
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each group.items as |entry|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{entry.item.name}}</strong>
|
||||||
|
<div>Base {{entry.item.system.base}} + {{group.label}} {{group.profileValue}} - {{localize "LESOUBLIES.labels.valeurFinale"}} {{entry.finalValue}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="rollSkill" data-item-id="{{entry.item.id}}">{{localize "LESOUBLIES.ui.roll"}}</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{entry.item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{entry.item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.actions.cssClass}}" data-tab="actions">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.combat"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="encourager">Encourager</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="intimider">Intimider</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="evaluer">Évaluer</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="maitriser">Maîtriser</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="seDeplacer">Se déplacer</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#if equippedWeapons.length}}
|
||||||
|
{{#each equippedWeapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.arme"}} - {{item.system.damage}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useWeapon" data-item-id="{{item.id}}">Attaque</button><button type="button" data-action="resolveWeaponDamage" data-item-id="{{item.id}}">Dégâts</button><button type="button" data-action="toggleEquipped" data-item-id="{{item.id}}">Retirer</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{else}}
|
||||||
|
<p class="help-text">Aucune arme équipée.</p>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.magie"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="sortilege">+ {{localize "TYPES.Item.sortilege"}}</button>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each spells as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{item.name}}</strong>
|
||||||
|
<div>{{item.system.tradition}} / {{item.system.polarity}} / coût {{item.system.cost}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="useSpell" data-item-id="{{item.id}}">Activer</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.equipment.cssClass}}" data-tab="equipment">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.equipement"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="createItem" data-type="arme">+ {{localize "TYPES.Item.arme"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="armure">+ {{localize "TYPES.Item.armure"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="equipement">+ {{localize "TYPES.Item.equipement"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each weapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.arme"}} - {{item.system.damage}}{{#if item.system.equipped}} - Équipée{{/if}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="toggleEquipped" data-item-id="{{item.id}}">{{#if item.system.equipped}}Retirer{{else}}Équiper{{/if}}</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each armors as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.armure"}} - Prot {{item.system.protection}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each equipment as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.equipement"}} - {{item.system.category}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
|
<section class="sheet-card creation-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.labels.identite"}}</h2>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.age"}}</label>
|
||||||
|
<input name="system.biodata.age" type="number" value="{{system.biodata.age}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.sexe"}}</label>
|
||||||
|
<input name="system.biodata.sexe" type="text" value="{{system.biodata.sexe}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.motsCles"}}</label>
|
||||||
|
<input name="system.biodata.motscles" type="text" value="{{system.biodata.motscles}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaine"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.isCaptain" type="checkbox" {{checked system.flagsNarratifs.isCaptain}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="sheet-card notes-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.notes"}}</h2>
|
||||||
|
<label>{{localize "LESOUBLIES.labels.description"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.description enriched=enriched.biodata.description value=system.biodata.description name="system.biodata.description" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.notes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.notes enriched=enriched.biodata.notes value=system.biodata.notes name="system.biodata.notes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.gmnotes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.gmnotes enriched=enriched.biodata.gmnotes value=system.biodata.gmnotes name="system.biodata.gmnotes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.liensNarratifs"}}</label>
|
||||||
|
{{formInput systemFields.visions enriched=enriched.visions value=system.visions name="system.visions" toggled=true}}
|
||||||
|
{{#if activeCompanyPower}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.pouvoirCompagnieActif"}}</label>
|
||||||
|
<div class="help-text">{{activeCompanyPower.name}} — {{activeCompanyPower.system.activationCondition}}</div>
|
||||||
|
{{/if}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
@@ -15,214 +15,267 @@
|
|||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div class="sheet-grid sheet-grid-2">
|
<nav class="sheet-tabs" aria-label="Navigation de la fiche">
|
||||||
<section class="sheet-card summary-card">
|
{{#each tabs as |tab|}}
|
||||||
<h2>{{localize "LESOUBLIES.ui.derivedOverview"}}</h2>
|
<button type="button" class="sheet-tab-button {{tab.cssClass}}" data-action="switchTab" data-tab="{{tab.id}}">
|
||||||
<div class="field-row">
|
<i class="{{tab.icon}}"></i>
|
||||||
<label>{{localize "LESOUBLIES.labels.taille"}}</label>
|
<span>{{tab.label}}</span>
|
||||||
<input name="system.size.value" type="number" value="{{system.size.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
</button>
|
||||||
<span>{{derived.sizeLabel}}</span>
|
{{/each}}
|
||||||
</div>
|
</nav>
|
||||||
<div class="field-row">
|
|
||||||
<label>{{localize "LESOUBLIES.ui.vie"}}</label>
|
|
||||||
<input name="system.hp.value" type="number" value="{{system.hp.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
|
||||||
<span>/ {{derived.hpMax}}</span>
|
|
||||||
</div>
|
|
||||||
<div class="field-row">
|
|
||||||
<label>{{localize "LESOUBLIES.ui.songes"}}</label>
|
|
||||||
<input name="system.songes.value" type="number" value="{{system.songes.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
|
||||||
<span>{{system.songes.points}} / {{system.songes.max}} pts</span>
|
|
||||||
</div>
|
|
||||||
<div class="field-row">
|
|
||||||
<label>{{localize "LESOUBLIES.labels.detteSonges"}}</label>
|
|
||||||
<input name="system.songes.debt" type="number" value="{{system.songes.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
|
||||||
</div>
|
|
||||||
<div class="field-row">
|
|
||||||
<label>{{localize "LESOUBLIES.labels.creditSonges"}}</label>
|
|
||||||
<input name="system.songes.xpCredit" type="number" value="{{system.songes.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
|
||||||
</div>
|
|
||||||
<div class="field-row">
|
|
||||||
<label>{{localize "LESOUBLIES.ui.cauchemar"}}</label>
|
|
||||||
<input name="system.cauchemar.value" type="number" value="{{system.cauchemar.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
|
||||||
<span>{{system.cauchemar.points}} / {{system.cauchemar.max}} pts</span>
|
|
||||||
</div>
|
|
||||||
<div class="field-row">
|
|
||||||
<label>{{localize "LESOUBLIES.labels.detteCauchemar"}}</label>
|
|
||||||
<input name="system.cauchemar.debt" type="number" value="{{system.cauchemar.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
|
||||||
</div>
|
|
||||||
<div class="field-row">
|
|
||||||
<label>{{localize "LESOUBLIES.labels.creditCauchemar"}}</label>
|
|
||||||
<input name="system.cauchemar.xpCredit" type="number" value="{{system.cauchemar.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
|
||||||
</div>
|
|
||||||
<div class="field-row">
|
|
||||||
<label>{{localize "LESOUBLIES.labels.xp"}}</label>
|
|
||||||
<input name="system.experience.value" type="number" value="{{system.experience.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
|
||||||
</div>
|
|
||||||
<div class="field-row">
|
|
||||||
<label>{{localize "LESOUBLIES.labels.ecorces"}}</label>
|
|
||||||
<input name="system.money.ecorces" type="number" value="{{system.money.ecorces}}" {{#if isPlayMode}}disabled{{/if}} />
|
|
||||||
</div>
|
|
||||||
<div class="field-row">
|
|
||||||
<label>{{localize "LESOUBLIES.labels.ombreDuTourment"}}</label>
|
|
||||||
<input name="system.flagsNarratifs.ombreDuTourment" type="checkbox" {{checked system.flagsNarratifs.ombreDuTourment}} {{#if isPlayMode}}disabled{{/if}} />
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section class="sheet-card creation-card">
|
<section class="sheet-tab {{tabs.overview.cssClass}}" data-tab="overview">
|
||||||
<h2>{{localize "LESOUBLIES.labels.identite"}}</h2>
|
<div class="sheet-grid sheet-grid-2">
|
||||||
<div class="field-row">
|
<section class="sheet-card summary-card">
|
||||||
<label>{{localize "LESOUBLIES.labels.age"}}</label>
|
<h2>{{localize "LESOUBLIES.ui.derivedOverview"}}</h2>
|
||||||
<input name="system.biodata.age" type="number" value="{{system.biodata.age}}" {{#if isPlayMode}}disabled{{/if}} />
|
<div class="field-row">
|
||||||
</div>
|
<label>{{localize "LESOUBLIES.labels.taille"}}</label>
|
||||||
<div class="field-row">
|
<select name="system.size.value" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
<label>{{localize "LESOUBLIES.labels.sexe"}}</label>
|
{{#each choiceSets.personnageSizeOptions as |option|}}
|
||||||
<input name="system.biodata.sexe" type="text" value="{{system.biodata.sexe}}" {{#if isPlayMode}}disabled{{/if}} />
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.size.value)}}selected{{/if}}>{{option.label}}</option>
|
||||||
</div>
|
{{/each}}
|
||||||
<div class="field-row">
|
</select>
|
||||||
<label>{{localize "LESOUBLIES.labels.motsCles"}}</label>
|
<span>{{derived.sizeLabel}}</span>
|
||||||
<input name="system.biodata.motscles" type="text" value="{{system.biodata.motscles}}" {{#if isPlayMode}}disabled{{/if}} />
|
|
||||||
</div>
|
|
||||||
<div class="field-row">
|
|
||||||
<label>{{localize "LESOUBLIES.labels.capitaine"}}</label>
|
|
||||||
<input name="system.flagsNarratifs.isCaptain" type="checkbox" {{checked system.flagsNarratifs.isCaptain}} {{#if isPlayMode}}disabled{{/if}} />
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section class="sheet-card creation-card">
|
|
||||||
<h2>{{localize "LESOUBLIES.ui.creation"}}</h2>
|
|
||||||
<ul class="reference-list">
|
|
||||||
<li><strong>{{localize "LESOUBLIES.labels.race"}} :</strong> {{#if creation.race}}{{creation.race.name}}{{else}}—{{/if}}</li>
|
|
||||||
<li><strong>{{localize "LESOUBLIES.labels.tribu"}} :</strong> {{#if creation.tribu}}{{creation.tribu.name}}{{else}}—{{/if}}</li>
|
|
||||||
<li><strong>{{localize "LESOUBLIES.labels.metier"}} :</strong> {{#if creation.metier}}{{creation.metier.name}}{{else}}—{{/if}}</li>
|
|
||||||
<li><strong>{{localize "LESOUBLIES.labels.compagnie"}} :</strong> {{#if derived.compagnie}}{{derived.compagnie.name}}{{else}}—{{/if}}</li>
|
|
||||||
</ul>
|
|
||||||
<div class="embed-buttons">
|
|
||||||
<button type="button" data-action="createItem" data-type="race">+ {{localize "TYPES.Item.race"}}</button>
|
|
||||||
<button type="button" data-action="createItem" data-type="tribu">+ {{localize "TYPES.Item.tribu"}}</button>
|
|
||||||
<button type="button" data-action="createItem" data-type="metier">+ {{localize "TYPES.Item.metier"}}</button>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<section class="sheet-card profiles-card">
|
|
||||||
<h2>{{localize "LESOUBLIES.ui.profils"}}</h2>
|
|
||||||
<div class="profile-grid">
|
|
||||||
{{#each system.profils as |value key|}}
|
|
||||||
<div class="profile-cell">
|
|
||||||
<button type="button" data-action="rollProfile" data-profile-key="{{key}}">{{profileLabel key}}</button>
|
|
||||||
<input name="system.profils.{{key}}" type="number" value="{{value}}" {{#if @root.isPlayMode}}disabled{{/if}} />
|
|
||||||
</div>
|
</div>
|
||||||
{{/each}}
|
<div class="field-row">
|
||||||
</div>
|
<label>{{localize "LESOUBLIES.ui.vie"}}</label>
|
||||||
</section>
|
<input name="system.hp.value" type="number" value="{{system.hp.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>/ {{derived.hpMax}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.songes"}}</label>
|
||||||
|
<input name="system.songes.value" type="number" value="{{system.songes.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.songes.points}} / {{system.songes.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteSonges"}}</label>
|
||||||
|
<input name="system.songes.debt" type="number" value="{{system.songes.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditSonges"}}</label>
|
||||||
|
<input name="system.songes.xpCredit" type="number" value="{{system.songes.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.cauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.value" type="number" value="{{system.cauchemar.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
<span>{{system.cauchemar.points}} / {{system.cauchemar.max}} pts</span>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.detteCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.debt" type="number" value="{{system.cauchemar.debt}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.creditCauchemar"}}</label>
|
||||||
|
<input name="system.cauchemar.xpCredit" type="number" value="{{system.cauchemar.xpCredit}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.xp"}}</label>
|
||||||
|
<input name="system.experience.value" type="number" value="{{system.experience.value}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ecorces"}}</label>
|
||||||
|
<input name="system.money.ecorces" type="number" value="{{system.money.ecorces}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.ombreDuTourment"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.ombreDuTourment" type="checkbox" {{checked system.flagsNarratifs.ombreDuTourment}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
<section class="sheet-card ledger-card">
|
<section class="sheet-card creation-card">
|
||||||
<div class="section-title-row">
|
<h2>{{localize "LESOUBLIES.labels.identite"}}</h2>
|
||||||
<h2>{{localize "LESOUBLIES.ui.competences"}}</h2>
|
<div class="field-row">
|
||||||
<button type="button" data-action="createItem" data-type="competence">+ {{localize "TYPES.Item.competence"}}</button>
|
<label>{{localize "LESOUBLIES.labels.age"}}</label>
|
||||||
</div>
|
<input name="system.biodata.age" type="number" value="{{system.biodata.age}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
{{#each skillGroups as |group|}}
|
</div>
|
||||||
<div class="group-block">
|
<div class="field-row">
|
||||||
<h3>{{group.label}}</h3>
|
<label>{{localize "LESOUBLIES.labels.sexe"}}</label>
|
||||||
<div class="item-list">
|
<input name="system.biodata.sexe" type="text" value="{{system.biodata.sexe}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
{{#each group.items as |entry|}}
|
</div>
|
||||||
<article class="item-card">
|
<div class="field-row">
|
||||||
<div>
|
<label>{{localize "LESOUBLIES.labels.motsCles"}}</label>
|
||||||
<strong>{{entry.item.name}}</strong>
|
<input name="system.biodata.motscles" type="text" value="{{system.biodata.motscles}}" {{#if isPlayMode}}disabled{{/if}} />
|
||||||
<div>Base {{entry.item.system.base}} - {{localize "LESOUBLIES.labels.valeurFinale"}} {{entry.finalValue}}</div>
|
</div>
|
||||||
{{#if (count entry.item.system.domains)}}<div>{{localize "LESOUBLIES.labels.domaines}} : {{join entry.item.system.domains}}</div>{{/if}}
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.capitaine"}}</label>
|
||||||
|
<input name="system.flagsNarratifs.isCaptain" type="checkbox" {{checked system.flagsNarratifs.isCaptain}} {{#if isPlayMode}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card creation-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.creation"}}</h2>
|
||||||
|
<div class="creation-slots" data-creation-drop-zone>
|
||||||
|
{{#each creationSlots as |slot|}}
|
||||||
|
<article class="creation-slot {{#if slot.item}}is-filled{{else}}is-empty{{/if}}" data-drop-creation-type="{{slot.type}}">
|
||||||
|
<div class="creation-slot-header">
|
||||||
|
<div>
|
||||||
|
<p class="creation-slot-kicker">{{slot.label}}</p>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<strong class="creation-slot-name">{{slot.item.name}}</strong>
|
||||||
|
{{else}}
|
||||||
|
<strong class="creation-slot-name">—</strong>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
{{#if slot.item}}
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{slot.item.id}}">{{localize "LESOUBLIES.ui.edit"}}</button>
|
||||||
|
{{#unless @root.isPlayMode}}
|
||||||
|
<button type="button" data-action="removeCreationItem" data-type="{{slot.type}}">{{localize "LESOUBLIES.ui.delete"}}</button>
|
||||||
|
{{/unless}}
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
<div class="item-controls">
|
<div class="creation-slot-body">
|
||||||
<button type="button" data-action="rollSkill" data-item-id="{{entry.item.id}}">{{localize "LESOUBLIES.ui.roll"}}</button>
|
{{#if slot.item}}
|
||||||
<button type="button" data-action="editItem" data-item-id="{{entry.item.id}}">Edit</button>
|
<img class="creation-slot-image" src="{{slot.item.img}}" alt="{{slot.item.name}}" />
|
||||||
<button type="button" data-action="deleteItem" data-item-id="{{entry.item.id}}">Delete</button>
|
<p class="help-text">{{slot.filledHint}}</p>
|
||||||
|
{{else}}
|
||||||
|
<p class="help-text">{{slot.emptyHint}}</p>
|
||||||
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="field-row">
|
||||||
{{/each}}
|
<label>{{localize "LESOUBLIES.labels.compagnie"}}</label>
|
||||||
</section>
|
<select name="system.references.compagnieId" {{#if isPlayMode}}disabled{{/if}}>
|
||||||
|
<option value="">—</option>
|
||||||
<section class="sheet-card ledger-card">
|
{{#each choiceSets.companyOptions as |option|}}
|
||||||
<div class="section-title-row">
|
<option value="{{option.value}}" {{#if (eq option.value @root.system.references.compagnieId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
<h2>{{localize "LESOUBLIES.ui.combat"}}</h2>
|
{{/each}}
|
||||||
<div class="embed-buttons">
|
</select>
|
||||||
<button type="button" data-action="openCombatPreset" data-preset="encourager">Encourager</button>
|
</div>
|
||||||
<button type="button" data-action="openCombatPreset" data-preset="intimider">Intimider</button>
|
<p class="help-text"><strong>{{localize "LESOUBLIES.labels.compagnie"}} :</strong> {{#if derived.compagnie}}{{derived.compagnie.name}}{{else}}—{{/if}}</p>
|
||||||
<button type="button" data-action="openCombatPreset" data-preset="evaluer">Évaluer</button>
|
</section>
|
||||||
<button type="button" data-action="openCombatPreset" data-preset="maitriser">Maîtriser</button>
|
|
||||||
<button type="button" data-action="openCombatPreset" data-preset="seDeplacer">Se déplacer</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</section>
|
|
||||||
|
|
||||||
<section class="sheet-card ledger-card">
|
<section class="sheet-card profiles-card">
|
||||||
<div class="section-title-row">
|
<h2>{{localize "LESOUBLIES.ui.profils"}}</h2>
|
||||||
<h2>{{localize "LESOUBLIES.ui.magie"}}</h2>
|
<div class="profile-grid">
|
||||||
<button type="button" data-action="createItem" data-type="sortilege">+ {{localize "TYPES.Item.sortilege"}}</button>
|
{{#each system.profils as |value key|}}
|
||||||
</div>
|
<div class="profile-cell">
|
||||||
<div class="item-list">
|
<button type="button" data-action="rollProfile" data-profile-key="{{key}}">{{profileLabel key}}</button>
|
||||||
{{#each spells as |item|}}
|
<input name="system.profils.{{key}}" type="number" value="{{value}}" {{#if @root.isPlayMode}}disabled{{/if}} />
|
||||||
<article class="item-card">
|
|
||||||
<div>
|
|
||||||
<strong>{{item.name}}</strong>
|
|
||||||
<div>{{item.system.tradition}} / {{item.system.polarity}} / coût {{item.system.cost}}</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="item-controls">
|
{{/each}}
|
||||||
<button type="button" data-action="useSpell" data-item-id="{{item.id}}">Activer</button>
|
|
||||||
<button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button>
|
|
||||||
<button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button>
|
|
||||||
</div>
|
|
||||||
</article>
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section class="sheet-card ledger-card">
|
|
||||||
<div class="section-title-row">
|
|
||||||
<h2>{{localize "LESOUBLIES.ui.equipement"}}</h2>
|
|
||||||
<div class="embed-buttons">
|
|
||||||
<button type="button" data-action="createItem" data-type="arme">+ {{localize "TYPES.Item.arme"}}</button>
|
|
||||||
<button type="button" data-action="createItem" data-type="armure">+ {{localize "TYPES.Item.armure"}}</button>
|
|
||||||
<button type="button" data-action="createItem" data-type="equipement">+ {{localize "TYPES.Item.equipement"}}</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</section>
|
||||||
<div class="item-list">
|
|
||||||
{{#each weapons as |item|}}
|
|
||||||
<article class="item-card">
|
|
||||||
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.arme"}} - {{item.system.damage}}</div></div>
|
|
||||||
<div class="item-controls"><button type="button" data-action="useWeapon" data-item-id="{{item.id}}">Attaque</button><button type="button" data-action="resolveWeaponDamage" data-item-id="{{item.id}}">Dégâts</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
|
||||||
</article>
|
|
||||||
{{/each}}
|
|
||||||
{{#each armors as |item|}}
|
|
||||||
<article class="item-card">
|
|
||||||
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.armure"}} - Prot {{item.system.protection}}</div></div>
|
|
||||||
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
|
||||||
</article>
|
|
||||||
{{/each}}
|
|
||||||
{{#each equipment as |item|}}
|
|
||||||
<article class="item-card">
|
|
||||||
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.equipement"}} - {{item.system.category}}</div></div>
|
|
||||||
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
|
||||||
</article>
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="sheet-card notes-card">
|
<section class="sheet-tab {{tabs.skills.cssClass}}" data-tab="skills">
|
||||||
<h2>{{localize "LESOUBLIES.ui.notes"}}</h2>
|
<section class="sheet-card ledger-card">
|
||||||
<label>{{localize "LESOUBLIES.labels.description"}}</label>
|
<div class="section-title-row">
|
||||||
{{editor system.biodata.description target="system.biodata.description" button=true editable=isEditMode}}
|
<h2>{{localize "LESOUBLIES.ui.competences"}}</h2>
|
||||||
<label>{{localize "LESOUBLIES.labels.notes"}}</label>
|
<button type="button" data-action="createItem" data-type="competence">+ {{localize "TYPES.Item.competence"}}</button>
|
||||||
{{editor system.biodata.notes target="system.biodata.notes" button=true editable=isEditMode}}
|
</div>
|
||||||
<label>{{localize "LESOUBLIES.labels.gmnotes"}}</label>
|
{{#each skillGroups as |group|}}
|
||||||
{{editor system.biodata.gmnotes target="system.biodata.gmnotes" button=true editable=isEditMode owner=isGM}}
|
<div class="group-block">
|
||||||
<label>{{localize "LESOUBLIES.labels.liensNarratifs"}}</label>
|
<h3>{{group.label}}</h3>
|
||||||
{{editor system.visions target="system.visions" button=true editable=isEditMode}}
|
<div class="item-list">
|
||||||
{{#if activeCompanyPower}}
|
{{#each group.items as |entry|}}
|
||||||
<label>{{localize "LESOUBLIES.labels.pouvoirCompagnieActif"}}</label>
|
<article class="item-card">
|
||||||
<div class="help-text">{{activeCompanyPower.name}} — {{activeCompanyPower.system.activationCondition}}</div>
|
<div>
|
||||||
{{/if}}
|
<strong>{{entry.item.name}}</strong>
|
||||||
|
<div>Base {{entry.item.system.base}} - {{localize "LESOUBLIES.labels.valeurFinale"}} {{entry.finalValue}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="rollSkill" data-item-id="{{entry.item.id}}">{{localize "LESOUBLIES.ui.roll"}}</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{entry.item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{entry.item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.actions.cssClass}}" data-tab="actions">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.combat"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="encourager">Encourager</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="intimider">Intimider</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="evaluer">Évaluer</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="maitriser">Maîtriser</button>
|
||||||
|
<button type="button" data-action="openCombatPreset" data-preset="seDeplacer">Se déplacer</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.magie"}}</h2>
|
||||||
|
<button type="button" data-action="createItem" data-type="sortilege">+ {{localize "TYPES.Item.sortilege"}}</button>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each spells as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div>
|
||||||
|
<strong>{{item.name}}</strong>
|
||||||
|
<div>{{item.system.tradition}} / {{item.system.polarity}} / coût {{item.system.cost}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-controls">
|
||||||
|
<button type="button" data-action="useSpell" data-item-id="{{item.id}}">Activer</button>
|
||||||
|
<button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button>
|
||||||
|
<button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.equipment.cssClass}}" data-tab="equipment">
|
||||||
|
<section class="sheet-card ledger-card">
|
||||||
|
<div class="section-title-row">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.equipement"}}</h2>
|
||||||
|
<div class="embed-buttons">
|
||||||
|
<button type="button" data-action="createItem" data-type="arme">+ {{localize "TYPES.Item.arme"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="armure">+ {{localize "TYPES.Item.armure"}}</button>
|
||||||
|
<button type="button" data-action="createItem" data-type="equipement">+ {{localize "TYPES.Item.equipement"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item-list">
|
||||||
|
{{#each weapons as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.arme"}} - {{item.system.damage}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="useWeapon" data-item-id="{{item.id}}">Attaque</button><button type="button" data-action="resolveWeaponDamage" data-item-id="{{item.id}}">Dégâts</button><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each armors as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.armure"}} - Prot {{item.system.protection}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
{{#each equipment as |item|}}
|
||||||
|
<article class="item-card">
|
||||||
|
<div><strong>{{item.name}}</strong><div>{{localize "TYPES.Item.equipement"}} - {{item.system.category}}</div></div>
|
||||||
|
<div class="item-controls"><button type="button" data-action="editItem" data-item-id="{{item.id}}">Edit</button><button type="button" data-action="deleteItem" data-item-id="{{item.id}}">Delete</button></div>
|
||||||
|
</article>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-tab {{tabs.notes.cssClass}}" data-tab="notes">
|
||||||
|
<section class="sheet-card notes-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.ui.notes"}}</h2>
|
||||||
|
<label>{{localize "LESOUBLIES.labels.description"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.description enriched=enriched.biodata.description value=system.biodata.description name="system.biodata.description" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.notes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.notes enriched=enriched.biodata.notes value=system.biodata.notes name="system.biodata.notes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.gmnotes"}}</label>
|
||||||
|
{{formInput systemFields.biodata.fields.gmnotes enriched=enriched.biodata.gmnotes value=system.biodata.gmnotes name="system.biodata.gmnotes" toggled=true}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.liensNarratifs"}}</label>
|
||||||
|
{{formInput systemFields.visions enriched=enriched.visions value=system.visions name="system.visions" toggled=true}}
|
||||||
|
{{#if activeCompanyPower}}
|
||||||
|
<label>{{localize "LESOUBLIES.labels.pouvoirCompagnieActif"}}</label>
|
||||||
|
<div class="help-text">{{activeCompanyPower.name}} — {{activeCompanyPower.system.activationCondition}}</div>
|
||||||
|
{{/if}}
|
||||||
|
</section>
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -1,13 +1,17 @@
|
|||||||
<div class="les-oublies-chat-card confrontation-card">
|
<div class="les-oublies-chat-card confrontation-card">
|
||||||
<header class="chat-card-header">
|
<header class="chat-card-header chat-card-header--confrontation">
|
||||||
<div class="chat-card-banner">
|
<div class="chat-card-banner chat-card-banner--confrontation">
|
||||||
<img class="chat-card-portrait" src="{{actor.img}}" alt="{{actor.name}}" />
|
<img class="chat-card-portrait" src="{{actor.img}}" alt="{{actor.name}}" />
|
||||||
<div class="chat-card-heading">
|
<div class="chat-card-heading">
|
||||||
<p class="chat-card-kicker">{{localize "LESOUBLIES.rolls.confrontation"}}</p>
|
<div class="chat-card-meta-row">
|
||||||
|
<span class="chat-card-pill">{{localize "LESOUBLIES.rolls.confrontation"}}</span>
|
||||||
|
<span class="chat-card-pill chat-card-pill--soft">{{localize "LESOUBLIES.rolls.confrontationType"}} · {{confrontationType}}</span>
|
||||||
|
</div>
|
||||||
<h3>{{attacker.label}} · {{defender.label}}</h3>
|
<h3>{{attacker.label}} · {{defender.label}}</h3>
|
||||||
<p class="chat-card-subtitle">{{localize "LESOUBLIES.rolls.confrontationType"}} · {{confrontationType}}</p>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="chat-card-badge neutral">{{outcomeLabel}}</div>
|
<div class="chat-card-outcome">
|
||||||
|
<div class="chat-card-badge neutral">{{outcomeLabel}}</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<form class="les-oublies-roll-dialog">
|
<div class="les-oublies-roll-dialog">
|
||||||
<section class="sheet-card">
|
<section class="sheet-card">
|
||||||
<div class="field-row">
|
<div class="field-row">
|
||||||
<label>Source</label>
|
<label>Source</label>
|
||||||
@@ -46,4 +46,4 @@
|
|||||||
</div>
|
</div>
|
||||||
<p class="help-text">Les dégâts standards ne se lancent pas aux dés : ils se résolvent à partir de l'arme, de la protection et des modificateurs choisis.</p>
|
<p class="help-text">Les dégâts standards ne se lancent pas aux dés : ils se résolvent à partir de l'arme, de la protection et des modificateurs choisis.</p>
|
||||||
</section>
|
</section>
|
||||||
</form>
|
</div>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<form class="les-oublies-roll-dialog">
|
<div class="les-oublies-roll-dialog">
|
||||||
<section class="sheet-card">
|
<section class="sheet-card">
|
||||||
<h2>{{title}}</h2>
|
<h2>{{title}}</h2>
|
||||||
<div class="field-row">
|
<div class="field-row">
|
||||||
@@ -73,4 +73,4 @@
|
|||||||
<p class="help-text">{{hint}}</p>
|
<p class="help-text">{{hint}}</p>
|
||||||
<p class="help-text">{{localize "LESOUBLIES.rolls.resourceState"}} : Songes {{resources.songesPoints}} / {{resources.songesValue}} · Cauchemar {{resources.cauchemarPoints}} / {{resources.cauchemarValue}}</p>
|
<p class="help-text">{{localize "LESOUBLIES.rolls.resourceState"}} : Songes {{resources.songesPoints}} / {{resources.songesValue}} · Cauchemar {{resources.cauchemarPoints}} / {{resources.cauchemarValue}}</p>
|
||||||
</section>
|
</section>
|
||||||
</form>
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,156 @@
|
|||||||
|
<div class="les-oublies-roll-dialog les-oublies-roll-dialog--attack">
|
||||||
|
<div class="sheet-grid sheet-grid-2 attack-dialog-grid">
|
||||||
|
<section class="sheet-card">
|
||||||
|
<h2>{{attackTitle}}</h2>
|
||||||
|
<div class="dialog-field-grid dialog-field-grid--attack">
|
||||||
|
<div class="field-row field-row--wide">
|
||||||
|
<label>Arme</label>
|
||||||
|
<input type="text" value="{{#if weapon}}{{weapon.name}}{{else}}Arme improvisée{{/if}}" disabled />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>Compétence</label>
|
||||||
|
<select name="attackerSkill">
|
||||||
|
{{#each attackSkills as |skill|}}
|
||||||
|
<option value="{{skill.value}}" {{#if (eq skill.value @root.values.attackerSkill)}}selected{{/if}}>{{skill.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>Circonstance</label>
|
||||||
|
<select name="difficultyPreset">
|
||||||
|
<option value="0">Aucune (0)</option>
|
||||||
|
{{#each difficultyOptions as |entry|}}
|
||||||
|
<option value="{{entry.value}}">{{entry.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>Ajustement libre</label>
|
||||||
|
<input name="customDifficulty" type="number" value="{{values.customDifficulty}}" />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.rolls.rollMode"}}</label>
|
||||||
|
<select name="attackerRollMode">
|
||||||
|
{{#each rollModes as |mode|}}
|
||||||
|
<option value="{{mode.value}}" {{#if (eq mode.value @root.values.attackerRollMode)}}selected{{/if}}>{{mode.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.rolls.extraDie"}}</label>
|
||||||
|
<select name="attackerExtraDie">
|
||||||
|
{{#each extraDieModes as |mode|}}
|
||||||
|
<option value="{{mode.value}}" {{#if (eq mode.value @root.values.attackerExtraDie)}}selected{{/if}}>{{mode.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>Prime</label>
|
||||||
|
<select name="primeId">
|
||||||
|
{{#each primeOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.values.primeId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>Pénalité</label>
|
||||||
|
<select name="penaltyId">
|
||||||
|
{{#each penaltyOptions as |option|}}
|
||||||
|
<option value="{{option.value}}" {{#if (eq option.value @root.values.penaltyId)}}selected{{/if}}>{{option.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p class="help-text">{{localize "LESOUBLIES.rolls.resourceState"}} : Songes {{attackerResources.songesPoints}} / {{attackerResources.songesValue}} · Cauchemar {{attackerResources.cauchemarPoints}} / {{attackerResources.cauchemarValue}}</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="sheet-card">
|
||||||
|
<h2>{{localize "LESOUBLIES.rolls.defender"}}</h2>
|
||||||
|
<p class="help-text target-status" data-target-status data-state="{{targetStatus.state}}">{{targetStatus.message}}</p>
|
||||||
|
<div class="dialog-field-grid dialog-field-grid--defender">
|
||||||
|
<div class="field-row field-row--wide">
|
||||||
|
<label>Adversaire</label>
|
||||||
|
<select name="defenderActorId">
|
||||||
|
{{#each targetOptions as |entry|}}
|
||||||
|
<option value="{{entry.value}}" {{#if (eq entry.value @root.values.defenderActorId)}}selected{{/if}}>{{entry.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="field-row field-row--wide">
|
||||||
|
<label>Cible</label>
|
||||||
|
<input name="defenderLabel" type="text" value="{{values.defenderLabel}}" />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>Réaction</label>
|
||||||
|
<select name="defenderSkill">
|
||||||
|
{{#each reactionSkills as |skill|}}
|
||||||
|
<option value="{{skill.value}}" {{#if (eq skill.value @root.values.defenderSkill)}}selected{{/if}}>{{skill.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>Score défense</label>
|
||||||
|
<input name="defenderScore" type="number" value="{{values.defenderScore}}" {{#if targetActor}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>Difficulté défense</label>
|
||||||
|
<input name="defenderDifficulty" type="number" value="{{values.defenderDifficulty}}" />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.rolls.rollMode"}}</label>
|
||||||
|
<select name="defenderRollMode">
|
||||||
|
{{#each rollModes as |mode|}}
|
||||||
|
<option value="{{mode.value}}" {{#if (eq mode.value @root.values.defenderRollMode)}}selected{{/if}}>{{mode.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.rolls.extraDie"}}</label>
|
||||||
|
<select name="defenderExtraDie">
|
||||||
|
{{#each extraDieModes as |mode|}}
|
||||||
|
<option value="{{mode.value}}" {{#if (eq mode.value @root.values.defenderExtraDie)}}selected{{/if}}>{{mode.label}}</option>
|
||||||
|
{{/each}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>Protection</label>
|
||||||
|
<input name="targetProtection" type="number" value="{{values.targetProtection}}" />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>Dégâts de base</label>
|
||||||
|
<input name="baseDamage" type="number" value="{{values.baseDamage}}" />
|
||||||
|
</div>
|
||||||
|
<div class="field-row field-row--wide">
|
||||||
|
<label>Libellé dégâts</label>
|
||||||
|
<input name="baseDamageLabel" type="text" value="{{values.baseDamageLabel}}" />
|
||||||
|
</div>
|
||||||
|
<div class="field-row field-row--wide field-row--toggle">
|
||||||
|
<label>Appliquer à la cible</label>
|
||||||
|
<input name="applyToTarget" type="checkbox" {{checked values.applyToTarget}} {{#unless targetActor}}disabled{{/unless}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row field-row--wide">
|
||||||
|
<label>Notes</label>
|
||||||
|
<input name="notes" type="text" value="{{values.notes}}" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="dialog-field-grid dialog-field-grid--resources">
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.songes"}}</label>
|
||||||
|
<input name="defenderSongesValue" type="number" value="{{defenderResources.songesValue}}" {{#if targetActor}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.pointsSonges"}}</label>
|
||||||
|
<input name="defenderSongesPoints" type="number" value="{{defenderResources.songesPoints}}" {{#if targetActor}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.ui.cauchemar"}}</label>
|
||||||
|
<input name="defenderCauchemarValue" type="number" value="{{defenderResources.cauchemarValue}}" {{#if targetActor}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
<div class="field-row">
|
||||||
|
<label>{{localize "LESOUBLIES.labels.pointsCauchemar"}}</label>
|
||||||
|
<input name="defenderCauchemarPoints" type="number" value="{{defenderResources.cauchemarPoints}}" {{#if targetActor}}disabled{{/if}} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
<form class="les-oublies-roll-dialog">
|
<div class="les-oublies-roll-dialog">
|
||||||
<div class="sheet-grid sheet-grid-2">
|
<div class="sheet-grid sheet-grid-2">
|
||||||
<section class="sheet-card">
|
<section class="sheet-card">
|
||||||
<h2>{{attackTitle}}</h2>
|
<h2>{{attackTitle}}</h2>
|
||||||
@@ -138,4 +138,4 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</div>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user