Ame/Ame max
This commit is contained in:
@@ -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 }),
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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" }
|
||||
]
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user