Ajout entrainements
Some checks failed
Release Creation / build (release) Failing after 51s

This commit is contained in:
2026-04-19 19:06:47 +02:00
parent 1d6e6dd44e
commit 6883cc1020
37 changed files with 335 additions and 227 deletions

View File

@@ -37,6 +37,7 @@ export default class DonjonEtCieActorSheet extends HandlebarsApplicationMixin(fo
rollDamage: DonjonEtCieActorSheet.#onRollDamage,
rollSpell: DonjonEtCieActorSheet.#onRollSpell,
rollUsage: DonjonEtCieActorSheet.#onRollUsage,
resetUsage: DonjonEtCieActorSheet.#onResetUsage,
useFavorService: DonjonEtCieActorSheet.#onUseFavorService,
postItem: DonjonEtCieActorSheet.#onPostItem,
adjustCounter: DonjonEtCieActorSheet.#onAdjustCounter
@@ -216,6 +217,11 @@ export default class DonjonEtCieActorSheet extends HandlebarsApplicationMixin(fo
return this.document.rollUsage(target.closest("[data-item-id]")?.dataset.itemId);
}
static async #onResetUsage(event, target) {
event.preventDefault();
return this.document.resetUsage(target.closest("[data-item-id]")?.dataset.itemId);
}
static async #onUseFavorService(event, target) {
event.preventDefault();
return this.document.useFavorService(target.dataset.department);

View File

@@ -29,7 +29,8 @@ export default class DonjonEtCieItemSheet extends HandlebarsApplicationMixin(fou
editImage: DonjonEtCieItemSheet.#onEditImage,
postItem: DonjonEtCieItemSheet.#onPostItem,
rollItem: DonjonEtCieItemSheet.#onRollItem,
rollDamageItem: DonjonEtCieItemSheet.#onRollDamageItem
rollDamageItem: DonjonEtCieItemSheet.#onRollDamageItem,
resetUsageItem: DonjonEtCieItemSheet.#onResetUsageItem
}
};
@@ -49,12 +50,14 @@ export default class DonjonEtCieItemSheet extends HandlebarsApplicationMixin(fou
isWeapon: item.type === "arme",
isArmor: item.type === "armure",
isConsumable: item.type === "consommable",
isTraining: item.type === "entrainement",
isSpell: item.type === "sortilege",
canRollDamage: Boolean(item.system.degats),
isEquipment: item.type === "equipement",
isCapacity: item.type === "capacite",
isLanguage: item.type === "langue",
isTrait: item.type === "trait",
canResetUsage: item.type === "entrainement" && Number(item.system.deltaMax ?? 0) > 0 && Number(item.system.delta ?? 0) !== Number(item.system.deltaMax ?? 0),
armorProtectionDisplay: Number(item.system.resultatProtection ?? 0) > 0 ? item.system.resultatProtection : "—",
weaponCharacteristicLabel: item.type === "arme" ? DonjonEtCieUtility.getWeaponCharacteristicLabel(item.system.categorie) : null,
enrichedDescription: await foundry.applications.ux.TextEditor.implementation.enrichHTML(item.system.description ?? "", { async: true }),
@@ -119,4 +122,9 @@ export default class DonjonEtCieItemSheet extends HandlebarsApplicationMixin(fou
event.preventDefault();
return this.document.rollDamage();
}
static async #onResetUsageItem(event) {
event.preventDefault();
return this.document.resetUsageDie();
}
}

View File

@@ -43,7 +43,7 @@ export default class DonjonEtCieEmployeSheet extends DonjonEtCieActorSheet {
combatSections: ["armes", "armures", "consommables", "equipements"].map(getSection),
spellSection: getSection("sortileges"),
capacitySection: getSection("capacites"),
profileSections: ["langues"].map(getSection)
profileSections: ["langues", "entrainements"].map(getSection)
};
}
}

View File

@@ -158,6 +158,11 @@ export class DonjonEtCieActor extends Actor {
if (item) return DonjonEtCieRollDialog.createUsage(item);
}
async resetUsage(itemId) {
const item = this.items.get(itemId);
if (item?.type === "entrainement") return item.resetUsageDie();
}
#createPnjResourceProxy({ label, deltaPath, protectionPath = null }) {
const delta = Number(foundry.utils.getProperty(this, deltaPath) ?? 0);
const protection = protectionPath ? Number(foundry.utils.getProperty(this, protectionPath) ?? 0) : 0;

View File

@@ -114,7 +114,8 @@ export const DONJON_ET_CIE = {
armes: { label: "Armes", createType: "arme" },
armures: { label: "Armures", createType: "armure" },
equipements: { label: "Equipements", createType: "equipement" },
consommables: { label: "Consommables", createType: "consommable" }
consommables: { label: "Consommables", createType: "consommable" },
entrainements: { label: "Entrainements", createType: "entrainement" }
},
sectionTypes: {
traits: ["trait"],
@@ -124,6 +125,7 @@ export const DONJON_ET_CIE = {
armes: ["arme"],
armures: ["armure"],
equipements: ["equipement"],
consommables: ["consommable"]
consommables: ["consommable"],
entrainements: ["entrainement"]
}
};

View File

@@ -27,10 +27,18 @@ export class DonjonEtCieItem extends Item {
return Number(this.system.delta ?? 0);
}
get usageDieMax() {
return Number(this.system.deltaMax ?? this.system.delta ?? 0);
}
async roll() {
if (this.type === "arme") return DonjonEtCieRollDialog.createWeapon(this.actor, this);
if (this.type === "sortilege") return DonjonEtCieRollDialog.createSpell(this.actor, this);
if (this.usageDie) return DonjonEtCieRollDialog.createUsage(this);
if (this.type === "entrainement" && this.usageDieMax > 0) {
ui.notifications.warn(game.i18n.localize("DNC.Warn.TrainingExhausted"));
return null;
}
return this.postToChat();
}
@@ -54,4 +62,11 @@ export class DonjonEtCieItem extends Item {
content
});
}
async resetUsageDie() {
if (this.type !== "entrainement") return this;
const deltaMax = this.usageDieMax;
if (!deltaMax) return this;
return this.update({ "system.delta": deltaMax });
}
}

View File

@@ -97,7 +97,8 @@ Hooks.once("init", async () => {
arme: models.ArmeDataModel,
armure: models.ArmureDataModel,
equipement: models.EquipementDataModel,
consommable: models.ConsommableDataModel
consommable: models.ConsommableDataModel,
entrainement: models.EntrainementDataModel
};
game.system.donjonEtCie = {
@@ -114,7 +115,7 @@ Hooks.once("init", async () => {
foundry.documents.collections.Actors.registerSheet("fvtt-donjon-et-cie", sheets.DonjonEtCiePNJSheet, { types: ["pnj"], makeDefault: true });
foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet);
for (const type of ["trait", "langue", "capacite", "sortilege", "arme", "armure", "equipement", "consommable"]) {
for (const type of ["trait", "langue", "capacite", "sortilege", "arme", "armure", "equipement", "consommable", "entrainement"]) {
foundry.documents.collections.Items.registerSheet("fvtt-donjon-et-cie", sheets.DonjonEtCieItemSheet, { types: [type], makeDefault: true });
}
});

View File

@@ -19,6 +19,7 @@ export class DonjonEtCieUtility {
trait: "systems/fvtt-donjon-et-cie/assets/icons/system/items/trait.svg",
sortilege: "systems/fvtt-donjon-et-cie/assets/icons/system/items/sortilege.svg",
equipement: "systems/fvtt-donjon-et-cie/assets/icons/system/items/equipement.svg",
entrainement: "systems/fvtt-donjon-et-cie/assets/icons/system/items/capacite.svg",
other: "systems/fvtt-donjon-et-cie/assets/icons/system/items/autre.svg"
};
@@ -167,6 +168,13 @@ export class DonjonEtCieUtility {
static enrichItemForSheet(item) {
const system = item.system;
const delta = Number(system.delta ?? 0);
const deltaMax = Number(system.deltaMax ?? delta ?? 0);
const usageLabel = item.type === "entrainement" && deltaMax > 0
? `${this.formatUsageDie(delta)} / ${this.formatUsageDie(deltaMax)}`
: delta > 0
? this.formatUsageDie(delta)
: null;
return {
id: item.id,
name: item.name,
@@ -174,7 +182,7 @@ export class DonjonEtCieUtility {
img: item.img,
system,
uuid: item.uuid,
usageLabel: delta > 0 ? this.formatUsageDie(delta) : null,
usageLabel,
protectionLabel: item.type === "armure" && Number(system.resultatProtection ?? 0) > 0 ? `Protection ${system.resultatProtection}` : null,
weaponCharacteristicLabel: item.type === "arme" ? this.getWeaponCharacteristicLabel(system.categorie) : null,
canRoll: ["arme", "sortilege"].includes(item.type),
@@ -182,7 +190,8 @@ export class DonjonEtCieUtility {
canRollDamage: Boolean(system.degats),
rollAction: item.type === "sortilege" ? "rollSpell" : "rollWeapon",
damageAction: "rollDamage",
isEquipped: Boolean(system.equipee)
isEquipped: Boolean(system.equipee),
canReset: item.type === "entrainement" && deltaMax > 0 && delta !== deltaMax
};
}

View File

@@ -0,0 +1,25 @@
/**
* Donjon & Cie - Systeme FoundryVTT
*
* Donjon & Cie est un jeu de role edite par John Doe.
* Ce systeme FoundryVTT est une implementation independante et n'est pas
* affilie a John Doe.
*
* @author LeRatierBretonnien
* @copyright 20252026 LeRatierBretonnien
* @license CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/
*/
import BaseItemDataModel from "./base-item.mjs";
export default class EntrainementDataModel extends BaseItemDataModel {
static defineSchema() {
const fields = foundry.data.fields;
return {
...super.defineSchema(),
delta: new fields.NumberField({ initial: 4, integer: true }),
deltaMax: new fields.NumberField({ initial: 4, integer: true }),
effet: new fields.StringField({ initial: "" })
};
}
}

View File

@@ -19,5 +19,6 @@ export { default as ArmeDataModel } from "./arme.mjs";
export { default as ArmureDataModel } from "./armure.mjs";
export { default as EquipementDataModel } from "./equipement.mjs";
export { default as ConsommableDataModel } from "./consommable.mjs";
export { default as EntrainementDataModel } from "./entrainement.mjs";
export { default as EmployeDataModel } from "./employe.mjs";
export { default as PnjDataModel } from "./pnj.mjs";