Ame/Ame max

This commit is contained in:
2025-10-26 08:49:38 +01:00
parent cddc4ce48a
commit 2dc7665a25
72 changed files with 376 additions and 257 deletions

View File

@@ -63,6 +63,10 @@ export class MournbladeCYD2ActorSheet extends foundry.appv1.sheets.ActorSheet {
valeurEquipement: this.actor.computeValeurEquipement(),
nbCombativite: this.actor.system.sante.nbcombativite,
combativiteList: MournbladeCYD2Utility.getCombativiteList(this.actor.system.sante.nbcombativite),
nbAme: this.actor.system.ame.nbame,
ameMax: this.actor.getAmeMax(),
ameList: MournbladeCYD2Utility.getAmeList(this.actor.system.ame.nbame, this.actor.getAmeMax()),
ameMaxList: MournbladeCYD2Utility.getAmeMaxList(this.actor.system.ame.nbame),
initiative: this.actor.getFlag("world", "last-initiative") || -1,
description: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.biodata.description, { async: true }),
habitat: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.biodata.habitat, { async: true }),

View File

@@ -281,6 +281,12 @@ export class MournbladeCYD2Actor extends Actor {
if (vigueur != this.system.sante.vigueur) {
this.update({ 'system.sante.vigueur': vigueur })
}
let seuilPouvoirBonus = this.getSeuilPouvoirBonus()
let seuilPouvoir = Math.floor((this.system.attributs.tre.value + this.system.attributs.cla.value) / 2) + seuilPouvoirBonus + this.system.ame.seuilpouvoirmodifier
if (seuilPouvoir != this.system.ame.seuilpouvoir) {
this.update({ 'system.ame.seuilpouvoir': seuilPouvoir })
}
}
super.prepareDerivedData()
}
@@ -292,6 +298,26 @@ export class MournbladeCYD2Actor extends Actor {
this.processCombativite(changed.system.sante)
}, 800)
}
if (changed?.system?.ame?.etat && changed?.system?.ame?.etat != this.system.ame.etat) {
// L'état d'Âme ne peut pas être inférieur au minimum (max dans le système)
let minAme = this.system.ame.max !== undefined ? this.system.ame.max : 0
if (changed.system.ame.etat < minAme) {
changed.system.ame.etat = minAme
}
// L'état d'Âme ne peut pas dépasser nbame (Brisé)
if (changed.system.ame.etat > this.system.ame.nbame) {
changed.system.ame.etat = this.system.ame.nbame
}
setTimeout(() => {
this.processAme(changed.system.ame)
}, 800)
}
// Si le max d'Âme change, ajuster l'état actuel si nécessaire
if (changed?.system?.ame?.max !== undefined && changed.system.ame.max != this.system.ame.max) {
if (this.system.ame.etat < changed.system.ame.max) {
changed.system.ame.etat = changed.system.ame.max
}
}
super._preUpdate(changed, options, user);
}
@@ -392,6 +418,31 @@ export class MournbladeCYD2Actor extends Actor {
return bonus
}
/* -------------------------------------------- */
getSeuilPouvoir() {
return this.system.ame.seuilpouvoir
}
/* -------------------------------------------- */
getSeuilPouvoirBonus() {
let talents = this.items.filter(item => item.type == "talent" && item.system.isautomated)
let bonus = 0
for (let talent of talents) {
for (let auto of talent.system.automations) {
if (auto.eventtype == "bonus-permanent" && auto.bonusname == "seuilpouvoir") {
bonus += Number(auto.bonus || 0)
}
}
}
return bonus
}
/* -------------------------------------------- */
getAmeMax() {
// Utiliser une vérification stricte car 0 (Serein) est une valeur valide
return this.system.ame.max !== undefined ? this.system.ame.max : this.system.ame.nbame
}
/* -------------------------------------------- */
getBonneAventure() {
return this.system.bonneaventure.actuelle
@@ -456,6 +507,24 @@ export class MournbladeCYD2Actor extends Actor {
// Duplicated ! this.processCombativite(sante)
}
/* -------------------------------------------- */
changeEtatAme(value) {
if (value === "brise") {
value = 200
}
let ame = foundry.utils.duplicate(this.system.ame)
ame.etat += Number(value)
// L'état ne peut pas être inférieur au minimum (max dans le système)
let minAme = this.system.ame.max !== undefined ? this.system.ame.max : 0
ame.etat = Math.max(ame.etat, minAme)
// L'état ne peut pas dépasser nbame (Brisé)
ame.etat = Math.min(ame.etat, this.system.ame.nbame)
this.update({ 'system.ame': ame })
if (ame.etat >= this.system.ame.nbame) {
ChatMessage.create({ content: `<strong>${this.name} est brisé !</strong>` })
}
}
/* -------------------------------------------- */
processCombativite(sante) {
sante = sante || foundry.utils.duplicate(this.system.sante)
@@ -472,6 +541,23 @@ export class MournbladeCYD2Actor extends Actor {
}
}
/* -------------------------------------------- */
processAme(ame) {
ame = ame || foundry.utils.duplicate(this.system.ame)
let traumatiseValue = this.system.ame.nbame - 2
let tresTraumatiseValue = this.system.ame.nbame - 1
let briseValue = this.system.ame.nbame
// Gestion des états Traumatisé, Très Traumatisé et Brisé
if (ame.etat == traumatiseValue) {
ChatMessage.create({ content: `<strong>${this.name} est Traumatisé !</strong>` })
} else if (ame.etat == tresTraumatiseValue) {
ChatMessage.create({ content: `<strong>${this.name} est Très Traumatisé !</strong>` })
} else if (ame.etat >= briseValue) {
ChatMessage.create({ content: `<strong>${this.name} est Brisé !</strong>` })
}
}
/* -------------------------------------------- */
async equipGear(equipmentId) {
let item = this.items.find(item => item.id == equipmentId);

View File

@@ -85,59 +85,60 @@ export const MOURNBLADECYD2_CONFIG = {
{ key: "insurge", label: "Insurgé" }
],
optionsTypeArme: [
{key: "contact", label: "Arme de contact"},
{key: "contactjet", label: "Arme de contact et de Jet"},
{key: "jet", label: "Arme de Jet"},
{key: "tir", label: "Arme de Tir"}
{ key: "contact", label: "Arme de contact" },
{ key: "contactjet", label: "Arme de contact et de Jet" },
{ key: "jet", label: "Arme de Jet" },
{ key: "tir", label: "Arme de Tir" }
],
optionsArtefactBranche: [
{key: "alchimie", label: "Alchimie"},
{key: "biologie", label: "Biologie"},
{key: "electricite", label: "Electricité"},
{key: "mecanique", label: "Mécanique"},
{key: "scienceesprit", label: "Science de l'Esprit"}
{ key: "alchimie", label: "Alchimie" },
{ key: "biologie", label: "Biologie" },
{ key: "electricite", label: "Electricité" },
{ key: "mecanique", label: "Mécanique" },
{ key: "scienceesprit", label: "Science de l'Esprit" }
],
optionsArtefactBranche2: [
{key: "none", label: "Aucune"},
{key: "alchimie", label: "Alchimie"},
{key: "biologie", label: "Biologie"},
{key: "electricite", label: "Electricité"},
{key: "mecanique", label: "Mécanique"},
{key: "scienceesprit", label: "Science de l'Esprit"}
{ key: "none", label: "Aucune" },
{ key: "alchimie", label: "Alchimie" },
{ key: "biologie", label: "Biologie" },
{ key: "electricite", label: "Electricité" },
{ key: "mecanique", label: "Mécanique" },
{ key: "scienceesprit", label: "Science de l'Esprit" }
],
optionsTypeContact: [
{key: "contact", label: "Contact"},
{key: "allie", label: "Allié"}
{ key: "contact", label: "Contact" },
{ key: "allie", label: "Allié" }
],
optionsTypeMutation: [
{key: "tares_communes", label: "Tares et Malformations communes"},
{key: "evolutions_communes", label: "Evolutions communes"},
{key: "tares_rares", label: "Tares et Malformations rares"},
{key: "evolutions_rares", label: "Evolutions rares"},
{key: "tares_majeures", label: "Tares et Maformations majeures"},
{key: "evolutions_majeures", label: "Evolutions majeures"},
{key: "tares_except", label: "Tares et Malformations exceptionnelles"},
{key: "evolutions_except", label: "Evolutions exceptionnelles"}
{ key: "tares_communes", label: "Tares et Malformations communes" },
{ key: "evolutions_communes", label: "Evolutions communes" },
{ key: "tares_rares", label: "Tares et Malformations rares" },
{ key: "evolutions_rares", label: "Evolutions rares" },
{ key: "tares_majeures", label: "Tares et Maformations majeures" },
{ key: "evolutions_majeures", label: "Evolutions majeures" },
{ key: "tares_except", label: "Tares et Malformations exceptionnelles" },
{ key: "evolutions_except", label: "Evolutions exceptionnelles" }
],
optionsTypeTalent: [
{key: "personnage", label: "Personnage"},
{key: "cellule", label: "Cellule"},
{key: "traitespece", label: "Trait d'espèce"}
{ key: "personnage", label: "Personnage" },
{ key: "cellule", label: "Cellule" },
{ key: "traitespece", label: "Trait d'espèce" }
],
optionsUseTalent: [
{key: "permanent", label: "Permanent"},
{key: "sceance", label: "Une fois par scéance"},
{key: "scenario", label: "Une fois par scénario"},
{key: "jour", label: "Une fois par jour"},
{key: "unique", label: "Unique"}
{ key: "permanent", label: "Permanent" },
{ key: "sceance", label: "Une fois par scéance" },
{ key: "scenario", label: "Une fois par scénario" },
{ key: "jour", label: "Une fois par jour" },
{ key: "unique", label: "Unique" }
],
optionsAutomationEvent: [
{key: "on-drop", label: "Drop sur l'acteur"},
{key: "prepare-roll", label: "Préparation d'un jet"},
{key: "bonus-permanent", label: "Bonus permanent"}
{ key: "on-drop", label: "Drop sur l'acteur" },
{ key: "prepare-roll", label: "Préparation d'un jet" },
{ key: "bonus-permanent", label: "Bonus permanent" }
],
optionsBonusPermanent: [
{key: "vigueur", label: "Vigueur"},
{key: "bonus-defensif", label: "Bonus au Seuil de Défense"}
{ key: "vigueur", label: "Vigueur" },
{ key: "seuilpouvoir", label: "Seuil de Pouvoir" },
{ key: "bonus-defensif", label: "Bonus au Seuil de Défense" }
]
}

View File

@@ -534,6 +534,71 @@ export class MournbladeCYD2Utility {
return list
}
/* -------------------------------------------- */
static getAmeList(nbAme, ameMin = null) {
// ameMin représente le meilleur état accessible (le minimum où l'âme peut remonter)
// Si ameMin = 3 (Stressé 3), la liste commence à Stressé 3 et va jusqu'à Brisé
// Si ameMin = 0 (Serein), tous les états sont disponibles
let minEffectif = ameMin !== null && ameMin !== undefined ? Math.min(ameMin, nbAme) : 0
let list = []
// Ajouter Serein seulement si ameMin <= 0
if (minEffectif <= 0) {
list.push({ value: String(0), label: "Serein" })
}
// Génération des états Stressé
let nbStresseTotal = Math.max(0, nbAme - 3)
for (let i = 1; i <= nbStresseTotal; i++) {
if (i >= minEffectif) {
list.push({ value: String(i), label: "Stressé " + i })
}
}
// Ajout des états finaux
let traumatiseValue = nbAme - 2
let tresTraumatiseValue = nbAme - 1
let briseValue = nbAme
if (traumatiseValue >= minEffectif) {
list.push({ value: String(traumatiseValue), label: "Traumatisé" })
}
if (tresTraumatiseValue >= minEffectif) {
list.push({ value: String(tresTraumatiseValue), label: "Très Traumatisé" })
}
if (briseValue >= minEffectif) {
list.push({ value: String(briseValue), label: "Brisé" })
}
return list
}
/* -------------------------------------------- */
static getAmeMaxList(nbAme) {
// Génère la liste complète des états d'âme pour le dropdown "Max"
let list = [{ value: String(0), label: "Serein" }]
// Génération des états Stressé (de 1 à nbAme-3)
let nbStresse = Math.max(0, nbAme - 3)
for (let i = 1; i <= nbStresse; i++) {
list.push({ value: String(i), label: "Stressé " + i })
}
// Ajout des états finaux
if (nbAme >= 3) {
list.push({ value: String(nbAme - 2), label: "Traumatisé" })
}
if (nbAme >= 2) {
list.push({ value: String(nbAme - 1), label: "Très Traumatisé" })
}
if (nbAme >= 1) {
list.push({ value: String(nbAme), label: "Brisé" })
}
return list
}
/* -------------------------------------------- */
static async bonusRollMournbladeCYD2(rollData) {
rollData.bonusFormula = rollData.addedBonus