This commit is contained in:
@@ -22,7 +22,9 @@ export default class DonjonEtCiePNJSheet extends DonjonEtCieActorSheet {
|
||||
...super.DEFAULT_OPTIONS.actions,
|
||||
rollPnjArmor: DonjonEtCiePNJSheet.#onRollPnjArmor,
|
||||
rollPnjCourage: DonjonEtCiePNJSheet.#onRollPnjCourage,
|
||||
rollPnjAttackDamage: DonjonEtCiePNJSheet.#onRollPnjAttackDamage
|
||||
rollPnjAttackDamage: DonjonEtCiePNJSheet.#onRollPnjAttackDamage,
|
||||
createPnjAttack: DonjonEtCiePNJSheet.#onCreatePnjAttack,
|
||||
deletePnjAttack: DonjonEtCiePNJSheet.#onDeletePnjAttack
|
||||
}
|
||||
};
|
||||
|
||||
@@ -48,7 +50,7 @@ export default class DonjonEtCiePNJSheet extends DonjonEtCieActorSheet {
|
||||
armorDisplay: Number(system.defense?.armure?.delta ?? 0) ? `Δ${system.defense.armure.delta}` : "—",
|
||||
storedArmor: Number(system.defense?.armure?.resultatProtection ?? 0) > 0 ? system.defense.armure.resultatProtection : "—",
|
||||
courageDisplay: Number(system.defense?.courage?.delta ?? 0) ? `Δ${system.defense.courage.delta}` : "—",
|
||||
hasAttackDamage: Boolean(system.attaque?.degats)
|
||||
pnjAttacks: this.document.getPnjAttacks()
|
||||
};
|
||||
}
|
||||
|
||||
@@ -64,6 +66,16 @@ export default class DonjonEtCiePNJSheet extends DonjonEtCieActorSheet {
|
||||
|
||||
static async #onRollPnjAttackDamage(event) {
|
||||
event.preventDefault();
|
||||
return this.document.rollPnjAttackDamage();
|
||||
return this.document.rollPnjAttackDamage(event.target.closest("[data-attack-index]")?.dataset.attackIndex ?? 0);
|
||||
}
|
||||
|
||||
static async #onCreatePnjAttack(event) {
|
||||
event.preventDefault();
|
||||
return this.document.createPnjAttack();
|
||||
}
|
||||
|
||||
static async #onDeletePnjAttack(event) {
|
||||
event.preventDefault();
|
||||
return this.document.deletePnjAttack(event.target.closest("[data-attack-index]")?.dataset.attackIndex ?? 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,12 @@ import { DonjonEtCieUtility } from "./donjon-et-cie-utility.mjs";
|
||||
import { DonjonEtCieRollDialog } from "./applications/donjon-et-cie-roll-dialog.mjs";
|
||||
|
||||
export class DonjonEtCieActor extends Actor {
|
||||
static defaultPnjAttack = {
|
||||
nom: "Attaque",
|
||||
degats: "1d6",
|
||||
notes: ""
|
||||
};
|
||||
|
||||
prepareDerivedData() {
|
||||
super.prepareDerivedData();
|
||||
|
||||
@@ -163,6 +169,45 @@ export class DonjonEtCieActor extends Actor {
|
||||
if (item?.type === "entrainement") return item.resetUsageDie();
|
||||
}
|
||||
|
||||
getPnjAttacks() {
|
||||
if (this.type !== "pnj") return [];
|
||||
|
||||
const attacks = Array.isArray(this.system.attaques) ? this.system.attaques : [];
|
||||
if (attacks.length) return attacks.map((attack, index) => ({
|
||||
index,
|
||||
nom: attack.nom || `Attaque ${index + 1}`,
|
||||
degats: attack.degats || "",
|
||||
notes: attack.notes || ""
|
||||
}));
|
||||
|
||||
const legacy = this.system.attaque;
|
||||
if (legacy) {
|
||||
return [{
|
||||
index: 0,
|
||||
nom: legacy.nom || "Attaque",
|
||||
degats: legacy.degats || "",
|
||||
notes: legacy.notes || ""
|
||||
}];
|
||||
}
|
||||
|
||||
return [{ index: 0, ...foundry.utils.deepClone(this.constructor.defaultPnjAttack) }];
|
||||
}
|
||||
|
||||
async createPnjAttack() {
|
||||
if (this.type !== "pnj") return null;
|
||||
const attaques = this.getPnjAttacks().map(({ nom, degats, notes }) => ({ nom, degats, notes }));
|
||||
attaques.push(foundry.utils.deepClone(this.constructor.defaultPnjAttack));
|
||||
return this.update({ "system.attaques": attaques });
|
||||
}
|
||||
|
||||
async deletePnjAttack(index) {
|
||||
if (this.type !== "pnj") return null;
|
||||
const attaques = this.getPnjAttacks().map(({ nom, degats, notes }) => ({ nom, degats, notes }));
|
||||
attaques.splice(Number(index), 1);
|
||||
if (!attaques.length) attaques.push(foundry.utils.deepClone(this.constructor.defaultPnjAttack));
|
||||
return this.update({ "system.attaques": attaques });
|
||||
}
|
||||
|
||||
#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;
|
||||
@@ -203,9 +248,10 @@ export class DonjonEtCieActor extends Actor {
|
||||
}));
|
||||
}
|
||||
|
||||
async rollPnjAttackDamage() {
|
||||
const attackName = this.system.attaque?.nom || "Attaque";
|
||||
const attackDamage = this.system.attaque?.degats || "";
|
||||
async rollPnjAttackDamage(index = 0) {
|
||||
const attack = this.getPnjAttacks()[Number(index)] ?? null;
|
||||
const attackName = attack?.nom || "Attaque";
|
||||
const attackDamage = attack?.degats || "";
|
||||
if (!attackDamage) return null;
|
||||
|
||||
return DonjonEtCieRollDialog.createDamage(this, {
|
||||
@@ -213,7 +259,7 @@ export class DonjonEtCieActor extends Actor {
|
||||
type: "attaque",
|
||||
system: {
|
||||
degats: attackDamage,
|
||||
portee: this.system.attaque?.notes || ""
|
||||
portee: attack?.notes || ""
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -13,6 +13,11 @@
|
||||
export default class PnjDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
const makeAttack = () => new fields.SchemaField({
|
||||
nom: new fields.StringField({ initial: "Attaque" }),
|
||||
degats: new fields.StringField({ initial: "1d6" }),
|
||||
notes: new fields.StringField({ initial: "" })
|
||||
});
|
||||
|
||||
return {
|
||||
espece: new fields.StringField({ initial: "" }),
|
||||
@@ -35,10 +40,9 @@ export default class PnjDataModel extends foundry.abstract.TypeDataModel {
|
||||
delta: new fields.NumberField({ initial: 0, integer: true })
|
||||
})
|
||||
}),
|
||||
attaque: new fields.SchemaField({
|
||||
nom: new fields.StringField({ initial: "Attaque" }),
|
||||
degats: new fields.StringField({ initial: "1d6" }),
|
||||
notes: new fields.StringField({ initial: "" })
|
||||
attaque: makeAttack(),
|
||||
attaques: new fields.ArrayField(makeAttack(), {
|
||||
initial: [{ nom: "Attaque", degats: "1d6", notes: "" }]
|
||||
}),
|
||||
pouvoirsSpeciaux: new fields.HTMLField({ initial: "" }),
|
||||
description: new fields.HTMLField({ initial: "" }),
|
||||
|
||||
Reference in New Issue
Block a user