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 @@