This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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"]
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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 });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
25
modules/models/entrainement.mjs
Normal file
25
modules/models/entrainement.mjs
Normal 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 2025–2026 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: "" })
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -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";
|
||||
|
||||
Reference in New Issue
Block a user