diff --git a/module/actor.js b/module/actor.js
index 02821e42..5ea535e0 100644
--- a/module/actor.js
+++ b/module/actor.js
@@ -175,12 +175,24 @@ export class RdDActor extends Actor {
isCreature() {
return this.data.type == 'creature' || this.data.type == 'entite';
}
-
/* -------------------------------------------- */
isPersonnage() {
return this.data.type == 'personnage';
}
-
+ /* -------------------------------------------- */
+ getFatigueActuelle() {
+ if (!this.isPersonnage()) {
+ return 0;
+ }
+ return Misc.toInt(this.data.data.sante.fatigue?.value);
+ }
+ /* -------------------------------------------- */
+ getFatigueMax() {
+ if (!this.isPersonnage()) {
+ return 1;
+ }
+ return Misc.toInt(this.data.data.sante.fatigue?.max);
+ }
/* -------------------------------------------- */
getReveActuel() {
return Misc.toInt(this.data.data.reve?.reve?.value ?? this.data.data.carac.reve.value);
@@ -246,8 +258,8 @@ export class RdDActor extends Actor {
return this.data.items.filter((item) => item.type == 'competence');
}
/* -------------------------------------------- */
- getCompetence(compName) {
- return RdDItemCompetence.findCompetence(this.data.items, compName);
+ getCompetence(name) {
+ return RdDItemCompetence.findCompetence(this.data.items, name);
}
/* -------------------------------------------- */
getTache(id) {
@@ -297,7 +309,7 @@ export class RdDActor extends Actor {
}
/* -------------------------------------------- */
- getSurprise(isCombat = true) {
+ getSurprise(isCombat = undefined) {
let niveauSurprise = Array.from(this.effects?.values() ?? [])
.map(effect => StatusEffects.valeurSurprise(effect.data, isCombat))
.reduce((a,b)=> a+b, 0);
@@ -926,7 +938,6 @@ export class RdDActor extends Actor {
if (item.data.quantite == undefined) item.data.quantite = 1; // Auto-fix
if (item.data.cout < 0) item.data.cout = 0; // Auto-fix
prixTotalEquipement += Number(item.data.cout) * Number(item.data.quantite);
- //console.log("cout équipement : ", item.name, item.data.cout, item.data.quantite, prixTotalEquipement);
}
}
// Mise à jour valeur totale de l'équipement
@@ -1296,14 +1307,17 @@ export class RdDActor extends Actor {
if (sante.fatigue && fatigue > 0) {
sante.fatigue.value = Math.max(sante.fatigue.value + fatigue, this._computeFatigueMin());
}
- if (!this.isEntiteCauchemar() && sante.vie.value<-this.getSConst()) {
+ await this.update({ "data.sante": sante });
+ if (this.isDead()) {
await this.addStatusEffectById('dead');
}
-
- await this.update({ "data.sante": sante });
return result;
}
+ isDead() {
+ return !this.isEntiteCauchemar() && this.data.data.sante.vie.value<-this.getSConst()
+ }
+
/* -------------------------------------------- */
_computeFatigueMin() {
return this.data.data.sante.endurance.max - this.data.data.sante.endurance.value;
@@ -1999,129 +2013,87 @@ export class RdDActor extends Actor {
}
/* -------------------------------------------- */
- async rollChant( id ) {
- let chant = duplicate(this.getChant(id));
- let competence = duplicate(this.getCompetence("chant"));
- competence.data.defaut_carac = "ouie";
- let chantData = {
- competence: competence,
- chant: chant,
- diffLibre: -chant.data.niveau,
- diffConditions: 0,
- use: { libre: false, conditions: true, },
- carac: {}
- };
- chantData.carac["ouie"] = duplicate(this.data.data.carac["ouie"]);
-
- console.log("rollChant !!!", chantData);
-
- const dialog = await RdDRoll.create(this, chantData, { html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-chant.html' }, {
- name: 'jet-chant',
- label: 'Chanter ' + chant.name,
- height: 600,
- callbacks: [
- this.createCallbackExperience(),
- { action: r => this._chantResult(r) }
- ]
- });
- dialog.render(true);
- }
- /* -------------------------------------------- */
- async _chantResult(chantData) {
- if ( chantData.rolled.isSuccess) {
- chantData.qualiteFinale = chantData.danse.data.niveau + chantData.rolled.ptQualite;
- } else {
- chantData.qualiteFinale = chantData.competence.data.niveau + chantData.rolled.ptQualite;
- }
- console.log("CHAN", chantData)
- RdDResolutionTable.displayRollData(chantData, this.name, 'chat-resultat-chant.html');
- }
-
- /* -------------------------------------------- */
- async rollDanse( id ) {
- let danse = duplicate(this.getDanse(id));
- let competence = duplicate(this.getCompetence("danse"));
- let danseData = {
- competence: competence,
- danse: danse,
- diffLibre: -danse.data.niveau,
+ async _rollArt(artData, selectedCarac, competence, oeuvre) {
+ mergeObject(artData, {
+ oeuvre: oeuvre,
+ competence: duplicate(competence),
+ diffLibre: -oeuvre.data.niveau,
diffConditions: 0,
use: { libre: false, conditions: true, },
+ selectedCarac: duplicate(this.data.data.carac[selectedCarac]),
forceCarac: {}
- };
- if ( danse.data.agilite) {
- competence.data.defaut_carac = "agilite";
- danseData.selectedCarac = duplicate(this.data.data.carac["agilite"]);
- danseData.forceCarac["agilite"] = duplicate(this.data.data.carac["agilite"]);
- }
- if ( danse.data.apparence) {
- competence.data.defaut_carac = "apparence";
- danseData.selectedCarac = duplicate(this.data.data.carac["apparence"]);
- danseData.forceCarac["apparence"] = duplicate(this.data.data.carac["apparence"]);
- }
+ });
+ artData.competence.data.defaut_carac = selectedCarac;
+ artData.forceCarac[selectedCarac] = duplicate(this.data.data.carac[selectedCarac]);
- console.log("rollDanse !!!", danseData);
+ console.log("rollArtiste !!!", artData);
- const dialog = await RdDRoll.create(this, danseData, { html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-danse.html' }, {
- name: 'jet-danse',
- label: 'Danser ' + danse.name,
+ const dialog = await RdDRoll.create(this, artData, { html: `systems/foundryvtt-reve-de-dragon/templates/dialog-roll-${artData.art}.html` }, {
+ name: `jet-${artData.art}`,
+ label: `${artData.verbe} ${oeuvre.name}`,
height: 600,
callbacks: [
this.createCallbackExperience(),
- { action: r => this._danseResult(r) }
+ { action: r => this._resultArt(r) }
]
});
dialog.render(true);
}
+
/* -------------------------------------------- */
- async _danseResult(danseData) {
- if ( danseData.rolled.isSuccess) {
- danseData.qualiteFinale = danseData.danse.data.niveau + danseData.rolled.ptQualite;
- } else {
- danseData.qualiteFinale = danseData.competence.data.niveau + danseData.rolled.ptQualite;
- }
- console.log("CHAN", danseData)
- RdDResolutionTable.displayRollData(danseData, this.name, 'chat-resultat-danse.html');
+ async _resultArt(artData) {
+ const baseQualite = (artData.rolled.isSuccess ? artData.oeuvre.data.niveau : artData.competence.data.niveau);
+ artData.qualiteFinale = Math.min(baseQualite, artData.oeuvre.data.niveau) + artData.rolled.ptQualite;
+
+ console.log("OEUVRE", artData.art, artData)
+ RdDResolutionTable.displayRollData(artData, this.name, `chat-resultat-${artData.art}.html`);
}
- /* -------------------------------------------- */
- async rollMusique( id ) {
- let musique = duplicate(this.getMusique(id));
- let competence = duplicate(this.getCompetence("musique"));
- competence.data.defaut_carac = "ouie";
- let musiqueData = {
- competence: competence,
- musique: musique,
- diffLibre: -musique.data.niveau,
- diffConditions: 0,
- use: { libre: false, conditions: true, },
- carac: {}
- };
- musiqueData.carac["ouie"] = duplicate(this.data.data.carac["ouie"]);
-
- console.log("rollMusique !!!", musiqueData);
+ /* -------------------------------------------- */
+ async rollDanse(id) {
+ const oeuvre = duplicate(this.getDanse(id));
+ const competence = this.getCompetence("danse");
+ const selectedCarac = this._getCaracDanse(oeuvre, competence);
+ const artData = { art: 'danse', verbe: 'Danser' };
+ await this._rollArt(artData, selectedCarac, competence, oeuvre);
+ }
+
+ _getCaracDanse(oeuvre, competence) {
+ if (oeuvre.data.agilite) { return "agilite"; }
+ else if (oeuvre.data.apparence) { return "apparence"; }
+ return competence.data.defaut_carac;
+ }
+
+ /* -------------------------------------------- */
+ async rollMusique(id) {
+ const oeuvre = duplicate(this.getMusique(id));
+ const competence = this.getCompetence("musique");
+ const selectedCarac = "ouie";
+ const artData = { art: 'musique', verbe: 'Jouer' };
+ await this._rollArt(artData, selectedCarac, competence, oeuvre);
+ }
+
+ /* -------------------------------------------- */
+ async rollRecetteCuisine(id) {
+ const oeuvre = duplicate(this.getRecetteCuisine(id));
+ const competence = this.getCompetence("cuisine");
+ const selectedCarac = 'odoratgout';
+ const artData = { art: 'cuisine', verbe: 'Cuisiner' };
+ await this._rollArt(artData, selectedCarac, competence, oeuvre);
+ }
+
+ /* -------------------------------------------- */
+ async rollJeu(id) {
+ const oeuvre = duplicate(this.getJeu(id));
+ const competence = this.getCompetence("jeu");
+ const selectedCarac = competence.data.defaut_carac;
+ const artData = {
+ art: 'jeu', verbe: 'Jeu',
+ use: { libre: true, conditions: true, },
+ };
+ await this._rollArt(artData, selectedCarac, competence, oeuvre);
+ }
- const dialog = await RdDRoll.create(this, musiqueData, { html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-musique.html' }, {
- name: 'jet-musique',
- label: 'Jouer ' + musique.name,
- height: 600,
- callbacks: [
- this.createCallbackExperience(),
- { action: r => this._musiqueResult(r) }
- ]
- });
- dialog.render(true);
- }
- /* -------------------------------------------- */
- async _musiqueResult(musiqueData) {
- if ( musiqueData.rolled.isSuccess) {
- musiqueData.qualiteFinale = musiqueData.musique.data.niveau + musiqueData.rolled.ptQualite;
- } else {
- musiqueData.qualiteFinale = musiqueData.competence.data.niveau + musiqueData.rolled.ptQualite;
- }
- console.log("MUSIQUE", musiqueData)
- RdDResolutionTable.displayRollData(musiqueData, this.name, 'chat-resultat-musique.html');
- }
/* -------------------------------------------- */
async rollJeu( id ) {
@@ -2155,46 +2127,7 @@ export class RdDActor extends Actor {
RdDResolutionTable.displayRollData(jeudData, this.name, 'chat-resultat-jeu.html');
}
- /* -------------------------------------------- */
- async rollRecetteCuisine( id ) {
- let cuisine = duplicate(this.getRecetteCuisine(id));
- let competence = duplicate(this.getCompetence("cuisine"));
- competence.data.defaut_carac = "odoratgout";
- let cuisineData = {
- competence: competence,
- cuisine: cuisine,
- diffLibre: -cuisine.data.niveau,
- diffConditions: 0,
- use: { libre: true, conditions: true, },
- carac: {}
- };
- cuisineData.carac["odoratgout"] = duplicate(this.data.data.carac["odoratgout"]);
- console.log("rollRecetteCuisine !!!", cuisineData);
-
- const dialog = await RdDRoll.create(this, cuisineData, { html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-cuisine.html' }, {
- name: 'jet-jeu',
- label: 'Cuisiner ' + cuisine.name,
- height: 600,
- callbacks: [
- this.createCallbackExperience(),
- { action: r => this._recetteCuisineResult(r) }
- ]
- });
- dialog.render(true);
- }
- /* -------------------------------------------- */
- async _recetteCuisineResult(cuisineData) {
- if ( cuisineData.rolled.isSuccess) {
- cuisineData.qualiteFinale = cuisineData.cuisine.data.niveau + cuisineData.rolled.ptQualite;
- } else {
- cuisineData.qualiteFinale = cuisineData.competence.data.niveau + cuisineData.rolled.ptQualite;
- }
- console.log("Cuisine", cuisineData)
- RdDResolutionTable.displayRollData(cuisineData, this.name, 'chat-resultat-cuisine.html');
- }
-
-
/* -------------------------------------------- */
async rollMeditation(id) {
let meditation = duplicate(this.getMeditation(id));
@@ -2324,9 +2257,7 @@ export class RdDActor extends Actor {
/* -------------------------------------------- */
async appliquerExperience(rolled, caracName, competence = undefined) {
- if (this.isCreature()) {
- return;
- }
+ if (!this.isPersonnage()) return;
if (rolled.isPart && rolled.finalLevel < 0) {
// Cas de désir lancinant, pas d'expérience sur particulière
if (this.checkDesirLancinant()) {
@@ -2357,7 +2288,7 @@ export class RdDActor extends Actor {
await this.update({ "data.carac": carac });
} else {
ChatMessage.create({
- content: `Vous avez ${xpCarac} à répartir pour la caractérisque dérivée ${caracName}. Vous devez le faire manuellement.`,
+ content: `Vous avez ${xpCarac} à répartir pour la caractéristique dérivée ${caracName}. Vous devez le faire manuellement.`,
whisper: ChatMessage.getWhisperRecipients(game.user.name)
});
}
@@ -2707,7 +2638,7 @@ export class RdDActor extends Actor {
} else {
// TODO: status effect dead
this.addStatusEffectById('dead');
- ChatMessage.create({ content: `
+ ChatMessage.create({ content: `
${this.name} vient de succomber à une seconde blessure critique ! Que les Dragons gardent son Archétype en paix !` });
encaissement.critiques -= count;
encaissement.mort = true;
diff --git a/styles/simple.css b/styles/simple.css
index e047b7ee..8537226a 100644
--- a/styles/simple.css
+++ b/styles/simple.css
@@ -878,6 +878,8 @@ ul, li {
border: 0;
padding: 2px 6px 2px 2px;
float: left;
+ width: 64px;
+ height: 64px;
}
#sidebar-tabs {
diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html
index 1ff8923e..2e8873d4 100644
--- a/templates/actor-sheet.html
+++ b/templates/actor-sheet.html
@@ -906,11 +906,11 @@