diff --git a/changelog.md b/changelog.md index a08f01fd..95912fa0 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,15 @@ # 11.2 +## 11.2.9 - La barbe d'Akarlikarlikar +- Amélioration des textes de tooltips +- Les tooltips sont plus dans le thème de couleur du système Rêve de Dragon +- Ajouts d'icones pour les attaque/initiative/soins dans les raccourcis sur les tokens (HUD) +- Ajout d'une icône et transformation en bouton du lien pour accéder à l'astrologie et aux chiffres astraux +- Suppression de message de log inutile sur chaque point de coeur +- On peut désactiver l'ajustement astrologique sur les jets de chance (pour des jts de chances non liés à une heure)- Fix: suppression de quelques cas d'erreur lors de l'ouverture des TMR +- Fix: suppression du warning de depréciation effects flags.core.statusId +- Les sorts en réserve en fleuve sont indiqués sur toutes les cases fleuve +- Changement de l'icône d'état d'empoignade pour suivre les couleurs des autres icônes d'état + ## 11.2.8 - L'éclairage d'Akarlikarlikar - l'ajustement de la lumière jour/nuit s'étale sur moins de temps (vaisseau et Lyre) - les nouveaux tooltips ne masquent plus l'information d'expérience diff --git a/icons/empoignade.svg b/icons/empoignade.svg new file mode 100644 index 00000000..149efad2 --- /dev/null +++ b/icons/empoignade.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/empoignade.webp b/icons/empoignade.webp new file mode 100644 index 00000000..483f7df4 Binary files /dev/null and b/icons/empoignade.webp differ diff --git a/icons/tmr/sort-reserve-humide.svg b/icons/tmr/sort-reserve-humide.svg new file mode 100644 index 00000000..3c156328 --- /dev/null +++ b/icons/tmr/sort-reserve-humide.svg @@ -0,0 +1,102 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/module/actor.js b/module/actor.js index 2c4cfd7c..03dbd000 100644 --- a/module/actor.js +++ b/module/actor.js @@ -399,7 +399,7 @@ export class RdDActor extends RdDBaseActorSang { content: 'Remise à neuf de ' + this.name }); await this.supprimerBlessures(it => true); - await this.removeEffects(e => e.flags.core.statusId !== STATUSES.StatusDemiReve); + await this.removeEffects(e => e.id != STATUSES.StatusDemiReve); const updates = { 'system.sante.endurance.value': this.system.sante.endurance.max, 'system.sante.vie.value': this.system.sante.vie.max, @@ -1804,7 +1804,10 @@ export class RdDActor extends RdDBaseActorSang { } blessuresASoigner() { - return this.filterItems(it => it.system.gravite > 0 && it.system.gravite <= 6 && !(it.system.premierssoins.done && it.system.soinscomplets.done), 'blessure') + return (this.itemTypes[TYPES.blessure]) + .filter(it => it.system.gravite > 0 && it.system.gravite <= 6) + .filter(it => !(it.system.premierssoins.done && it.system.soinscomplets.done)) + .sort(Misc.descending(b => (b.system.premierssoins.done ? "A" : "B") + b.system.gravite)) } async getTacheBlessure(blesse, blessure) { @@ -2920,9 +2923,7 @@ export class RdDActor extends RdDBaseActorSang { } /* -------------------------------------------- */ - isEffectAllowed(statusId) { - return true - } + isEffectAllowed(effectId) { return true } /* -------------------------------------------- */ async onPreUpdateItem(item, change, options, id) { diff --git a/module/actor/base-actor-reve.js b/module/actor/base-actor-reve.js index 6a361f74..1765340d 100644 --- a/module/actor/base-actor-reve.js +++ b/module/actor/base-actor-reve.js @@ -180,32 +180,32 @@ export class RdDBaseActorReve extends RdDBaseActor { } /* -------------------------------------------- */ - isEffectAllowed(statusId) { return true } + isEffectAllowed(effectId) { return true } getEffects(filter = e => true) { return this.getEmbeddedCollection("ActiveEffect").filter(filter); } - getEffect(statusId) { - return this.getEmbeddedCollection("ActiveEffect").find(it => it.flags?.core?.statusId == statusId); + getEffect(effectId) { + return this.getEmbeddedCollection("ActiveEffect").find(it => it.statuses?.has(effectId)); } - - async setEffect(statusId, status) { - if (this.isEffectAllowed(statusId)) { - const effect = this.getEffect(statusId); + + async setEffect(effectId, status) { + if (this.isEffectAllowed(effectId)) { + const effect = this.getEffect(effectId); if (!status && effect) { await this.deleteEmbeddedDocuments('ActiveEffect', [effect.id]); } if (status && !effect) { - await this.createEmbeddedDocuments("ActiveEffect", [StatusEffects.status(statusId)]); + await this.createEmbeddedDocuments("ActiveEffect", [StatusEffects.prepareActiveEffect(effectId)]); } } } - - async removeEffect(statusId) { - const effect = this.getEffect(statusId); + + async removeEffect(id) { + const effect = this.getEmbeddedCollection("ActiveEffect").find(it => it.id == id); if (effect) { - await this.deleteEmbeddedDocuments('ActiveEffect', [effect.id]); + await this.deleteEmbeddedDocuments('ActiveEffect', [id]); } } diff --git a/module/actor/creature.js b/module/actor/creature.js index 08eb6672..b6656b43 100644 --- a/module/actor/creature.js +++ b/module/actor/creature.js @@ -33,8 +33,8 @@ export class RdDCreature extends RdDBaseActorSang { } } - isEffectAllowed(statusId) { - return [STATUSES.StatusComma].includes(statusId); + isEffectAllowed(effectId) { + return [STATUSES.StatusComma].includes(effectId); } isEntiteAccordee(attacker) { diff --git a/module/actor/entite.js b/module/actor/entite.js index 7e971249..2b005c87 100644 --- a/module/actor/entite.js +++ b/module/actor/entite.js @@ -70,8 +70,8 @@ export class RdDEntite extends RdDBaseActorReve { await RdDEncaisser.encaisser(this) } - isEffectAllowed(statusId) { - return [STATUSES.StatusComma].includes(statusId); + isEffectAllowed(effectId) { + return [STATUSES.StatusComma].includes(effectId); } async onAppliquerJetEncaissement(encaissement, attacker) { diff --git a/module/rdd-bonus.js b/module/rdd-bonus.js index 2df1b670..93c1d36e 100644 --- a/module/rdd-bonus.js +++ b/module/rdd-bonus.js @@ -19,10 +19,6 @@ export class RdDBonus { } - static isAjustementAstrologique(rollData) { - return RdDCarac.isChance(rollData.selectedCarac) || - rollData.selectedSort?.system.isrituel; - } /* -------------------------------------------- */ static isDefenseAttaqueFinesse(rollData) { if (rollData.isEmpoignade && rollData.rolled?.isPart) { diff --git a/module/rdd-roll.js b/module/rdd-roll.js index 801d9175..c41f74ec 100644 --- a/module/rdd-roll.js +++ b/module/rdd-roll.js @@ -44,6 +44,7 @@ export class RdDRoll extends Dialog { diffLibre: rollData.competence?.system.default_diffLibre ?? 0, perteMoralEchec: false, /* Pour l'affichage dans le chat */ use: { + astrologique: true, moral: false, /* Est-ce que le joueur demande d'utiliser le moral ? Utile si le joueur change plusieurs fois de carac associée. */ libre: true, coeur: undefined, @@ -214,6 +215,10 @@ export class RdDRoll extends Dialog { this.rollData[attribute] = event.currentTarget.checked; this.updateRollResult(html); }); + this.html.find('input.use-astrologique').change((event) => { + this.rollData.use.astrologique = event.currentTarget.checked; + this.updateRollResult(html); + }); this.html.find('input.use-encTotal').change((event) => { this.rollData.use.encTotal = event.currentTarget.checked; this.updateRollResult(html); @@ -314,6 +319,7 @@ export class RdDRoll extends Dialog { HtmlUtility.showControlWhen(this.html.find(".use-encTotal"), rollData.ajustements.encTotal.visible && RdDCarac.isAgiliteOuDerobee(rollData.selectedCarac)); HtmlUtility.showControlWhen(this.html.find(".use-surenc"), rollData.ajustements.surenc.visible && RdDCarac.isActionPhysique(rollData.selectedCarac)); + HtmlUtility.showControlWhen(this.html.find(".use-astrologique"), rollData.ajustements.astrologique.visible); HtmlUtility.showControlWhen(this.html.find(".utilisation-moral"), rollData.use.appelAuMoral); HtmlUtility.showControlWhen(this.html.find(".divAppelAuMoral"), rollData.use.appelAuMoral); HtmlUtility.showControlWhen(this.html.find(".utilisation-coeur"), rollData.ajustements.coeur.visible); diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index 8224dac6..bb0c7202 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -17,6 +17,7 @@ import { STATUSES } from "./settings/status-effects.js"; import { RdDRencontre } from "./item/rencontre.js"; import { RdDTimestamp } from "./time/rdd-timestamp.js"; import { TYPES } from "./item.js"; +import { Misc } from "./misc.js"; const TMR_DISPLAY_SIZE = { code: 'tmr-display-size', @@ -141,7 +142,7 @@ export class RdDTMRDialog extends Dialog { // Le reste... this.updateValuesDisplay(); } - + async onDeplacement() { await this.manageRencontre(TMRUtility.getTMR(this._getCoordActor())); } @@ -162,9 +163,11 @@ export class RdDTMRDialog extends Dialog { } async forceTMRDisplay() { - this.bringToTop() - if (this.subdialog?.bringToTop) { - this.subdialog.bringToTop(); + if (this.rendered) { + this.bringToTop() + if (this.subdialog?.bringToTop) { + this.subdialog.bringToTop(); + } } } @@ -247,26 +250,21 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ _getTokensCasesTmr() { - return this.casesSpeciales.map(c => this._tokenCaseSpeciale(c)).filter(token => token); - } - _getTokensRencontres() { - return this.rencontresExistantes.map(it => this._tokenRencontre(it)); - } - _getTokensSortsReserve() { - return this.actor.itemTypes[TYPES.sortreserve].map(it => this._tokenSortEnReserve(it)); + return Misc.concat(this.casesSpeciales.map(caseSpeciale => + Draconique.get(caseSpeciale.system.specific)?.token(this.pixiTMR, caseSpeciale, () => caseSpeciale.system.coord) + )) } - /* -------------------------------------------- */ - _tokenRencontre(rencontre) { - return EffetsDraconiques.rencontre.token(this.pixiTMR, rencontre, () => rencontre.system.coord); + _getTokensRencontres() { + return Misc.concat(this.rencontresExistantes.map(rencontre => + EffetsDraconiques.rencontre.tokens(this.pixiTMR, rencontre, () => rencontre.system.coord) + )) } - _tokenCaseSpeciale(casetmr) { - const caseData = casetmr; - const draconique = Draconique.get(caseData.system.specific); - return draconique?.token(this.pixiTMR, caseData, () => caseData.system.coord); - } - _tokenSortEnReserve(sortReserve) { - return EffetsDraconiques.sortReserve.token(this.pixiTMR, sortReserve, () => sortReserve.system.coord); + + _getTokensSortsReserve() { + const sortsReserve = this.actor.itemTypes[TYPES.sortreserve]; + return Misc.concat(sortsReserve.map(sortReserve => + EffetsDraconiques.sortReserve.tokens(this.pixiTMR, sortReserve, () => sortReserve.system.coord))) } _tokenDemiReve() { @@ -342,7 +340,7 @@ export class RdDTMRDialog extends Dialog { this._tellToGM(this.actor.name + " a quitté les terres médianes"); } await this.actor.santeIncDec((ReglesOptionnelles.isUsing("appliquer-fatigue") ? "fatigue" : "endurance"), - this.cumulFatigue) + this.cumulFatigue) } await super.close(); this.pixiTMR.close() @@ -581,7 +579,7 @@ export class RdDTMRDialog extends Dialog { } this.descenteTMR = false; this.currentRencontre = undefined; - if (this._presentCite(tmr)) { + if (await this._presentCite(tmr)) { return; } this.currentRencontre = await this._jetDeRencontre(tmr); @@ -592,7 +590,7 @@ export class RdDTMRDialog extends Dialog { } else { const dialog = new RdDTMRRencontreDialog(this.actor, this.currentRencontre, tmr); - dialog.render(true); + await dialog.render(true); this.setTMRPendingAction(dialog); } } @@ -602,11 +600,11 @@ export class RdDTMRDialog extends Dialog { } /* -------------------------------------------- */ - _presentCite(tmr) { + async _presentCite(tmr) { const presentCite = this.casesSpeciales.find(c => EffetsDraconiques.presentCites.isCase(c, tmr.coord)); if (presentCite) { const caseData = presentCite; - const dialog = EffetsDraconiques.presentCites.choisirUnPresent(caseData, present => { + const dialog = await EffetsDraconiques.presentCites.choisirUnPresent(caseData, present => { this._utiliserPresentCite(presentCite, present, tmr) this.restoreTMRAfterAction(); }); @@ -1126,6 +1124,9 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ _trackToken(token) { + if (!token) { + return + } if (this.demiReve === token && this.isDemiReveCache()) { return; } diff --git a/module/rdd-token-hud.js b/module/rdd-token-hud.js index cbefeab8..0cdf7adf 100644 --- a/module/rdd-token-hud.js +++ b/module/rdd-token-hud.js @@ -90,7 +90,6 @@ export class RdDTokenHud { if (target?.actor) { const hudSoins = { blessures: target.actor.blessuresASoigner() ?? [] }; if (hudSoins.blessures.length > 0) { - // soins const controlIconTarget = html.find('.control-icon[data-action=combat]'); await RdDTokenHud._configureSubMenu(controlIconTarget, 'systems/foundryvtt-reve-de-dragon/templates/hud-actor-soins.hbs', diff --git a/module/rdd-utility.js b/module/rdd-utility.js index e25a71d9..5baefcfe 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -215,15 +215,16 @@ export class RdDUtility { 'systems/foundryvtt-reve-de-dragon/templates/partial-description-overflow.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-description-sort.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-ajustements.html', + 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-astrologique.hbs', + 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-coeur.hbs', + 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-competences.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-diffLibre.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-diffFixe.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-diffCondition.html', - 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-surenc.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-enctotal.html', - 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-moral.html', - 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-coeur.hbs', 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-forcer.html', - 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-competences.html', + 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-moral.html', + 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-surenc.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-select-carac.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-item-hautrevant.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-item-frequence.html', diff --git a/module/rolldata-ajustements.js b/module/rolldata-ajustements.js index df601186..cff5de65 100644 --- a/module/rolldata-ajustements.js +++ b/module/rolldata-ajustements.js @@ -74,6 +74,17 @@ export const referenceAjustements = { getLabel: (rollData, actor) => 'Sur-encombrement', getValue: (rollData, actor) => actor.computeMalusSurEncombrement() }, + rituel: { + isUsed: (rollData, actor) => actor.isPersonnage() && ReglesOptionnelles.isUsing("astrologie") && rollData.selectedSort?.system.isrituel, + getLabel: (rollData, actor) => 'Astrologique', + getValue: (rollData, actor) => actor.ajustementAstrologique() + }, + astrologique: { + isVisible: (rollData, actor) => actor.isPersonnage() && ReglesOptionnelles.isUsing("astrologie") && RdDCarac.isChance(rollData.selectedCarac), + isUsed: (rollData, actor) => RdDCarac.isChance(rollData.selectedCarac) && rollData.use.astrologique, + getLabel: (rollData, actor) => 'Astrologique', + getValue: (rollData, actor) => actor.ajustementAstrologique() + }, moral: { isVisible: (rollData, actor) => actor.isPersonnage() && RdDCarac.isActionPhysique(rollData.selectedCarac) && rollData.use?.moral, isUsed: (rollData, actor) => rollData.use.moral, @@ -84,18 +95,13 @@ export const referenceAjustements = { isVisible: (rollData, actor) => actor.isPersonnage() && RdDCarac.isVolonte(rollData.selectedCarac), isUsed: (rollData, actor) => rollData.use.coeur != undefined, getLabel: (rollData, actor) => 'Ajustement de cœur', - getValue: (rollData, actor) => -2 * (rollData.use?.coeur?.coeur ?? 0) + getValue: (rollData, actor) => -2 * (rollData.use.coeur?.coeur ?? 0) }, moralTotal: { isUsed: (rollData, actor) => RdDCarac.isVolonte(rollData.selectedCarac), getLabel: (rollData, actor) => 'Moral', getValue: (rollData, actor) => actor.getMoralTotal() }, - astrologique: { - isUsed: (rollData, actor) => ReglesOptionnelles.isUsing("astrologie") && RdDBonus.isAjustementAstrologique(rollData), - getLabel: (rollData, actor) => 'Astrologique', - getValue: (rollData, actor) => actor.ajustementAstrologique() - }, facteurSign: { isUsed: (rollData, actor) => rollData.diviseurSignificative > 1, getLabel: (rollData, actor) => Misc.getFractionHtml(rollData.diviseurSignificative), @@ -193,4 +199,5 @@ export class RollDataAjustements { RdDCarac.isChance(selectedCarac) || (RdDCarac.isReve(selectedCarac) && !rollData.competence); } + } diff --git a/module/settings/status-effects.js b/module/settings/status-effects.js index 406797bc..69f99a26 100644 --- a/module/settings/status-effects.js +++ b/module/settings/status-effects.js @@ -1,13 +1,13 @@ import { SYSTEM_RDD } from "../constants.js"; export const STATUSES = { - StatusStunned : 'stun', + StatusStunned: 'stun', StatusBleeding: 'bleeding', StatusProne: 'prone', StatusGrappling: 'grappling', StatusGrappled: 'grappled', StatusRestrained: 'restrain', - StatusUnconscious: 'unconscious', + StatusUnconscious: 'unconscious', StatusBlind: 'blind', StatusComma: 'comma', StatusDead: 'dead', @@ -18,8 +18,8 @@ const rddStatusEffects = [ { rdd: true, id: STATUSES.StatusStunned, label: 'EFFECT.StatusStunned', icon: 'icons/svg/stoned.svg', "duration.rounds": 1 }, { rdd: true, id: STATUSES.StatusBleeding, label: 'EFFECT.StatusBleeding', icon: 'icons/svg/blood.svg' }, { rdd: true, id: STATUSES.StatusProne, label: 'EFFECT.StatusProne', icon: 'icons/svg/falling.svg' }, - { rdd: true, id: STATUSES.StatusGrappling, tint: '#33cc33', label: 'EFFECT.StatusGrappling', icon: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp' }, - { rdd: true, id: STATUSES.StatusGrappled, tint: '#ff9900', label: 'EFFECT.StatusGrappled', icon: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp' }, + { rdd: true, id: STATUSES.StatusGrappling, tint: '#33cc33', label: 'EFFECT.StatusGrappling', icon: 'systems/foundryvtt-reve-de-dragon/icons/empoignade.svg' }, + { rdd: true, id: STATUSES.StatusGrappled, tint: '#ff9900', label: 'EFFECT.StatusGrappled', icon: 'systems/foundryvtt-reve-de-dragon/icons/empoignade.svg' }, { rdd: true, id: STATUSES.StatusRestrained, label: 'EFFECT.StatusRestrained', icon: 'icons/svg/net.svg' }, { rdd: true, id: STATUSES.StatusUnconscious, label: 'EFFECT.StatusUnconscious', icon: 'icons/svg/unconscious.svg' }, { rdd: true, id: STATUSES.StatusBlind, label: 'EFFECT.StatusBlind', icon: 'icons/svg/blind.svg' }, @@ -29,13 +29,16 @@ const rddStatusEffects = [ ]; const demiReveStatusEffect = rddStatusEffects.find(it => it.id == STATUSES.StatusDemiReve); -const statusDemiSurprise = [STATUSES.StatusStunned, STATUSES.StatusProne, STATUSES.StatusRestrained]; -const statusSurpriseTotale = [STATUSES.StatusUnconscious, STATUSES.StatusBlind, STATUSES.StatusComma]; +const statusDemiSurprise = new Set([STATUSES.StatusStunned, STATUSES.StatusProne, STATUSES.StatusRestrained]) +const statusSurpriseTotale = new Set([STATUSES.StatusUnconscious, STATUSES.StatusBlind, STATUSES.StatusComma]) export class StatusEffects extends FormApplication { static onReady() { - const rddStatusIds = rddStatusEffects.map(it => it.id); - rddStatusEffects.forEach(it => it.flags = { core: { statusId: it.id } }); + const rddEffectIds = rddStatusEffects.map(it => it.id); + rddStatusEffects.forEach(it => { + it.statuses = new Set() + it.statuses.add(it.id) + }) const defaultStatusEffectIds = CONFIG.statusEffects.map(it => it.id); game.settings.register(SYSTEM_RDD, "use-status-effects", { name: "use-status-effects", @@ -54,37 +57,47 @@ export class StatusEffects extends FormApplication { restricted: true }); - CONFIG.RDD.allEffects = rddStatusEffects.concat(CONFIG.statusEffects.filter(it => !rddStatusIds.includes(it.id))); + CONFIG.RDD.allEffects = rddStatusEffects.concat(CONFIG.statusEffects.filter(it => !rddEffectIds.includes(it.id))); StatusEffects._setUseStatusEffects(StatusEffects._getUseStatusEffects()); console.log('statusEffects', CONFIG.statusEffects); } static valeurSurprise(effect, isCombat) { - // const id = StatusEffects.statusId(effect); - if (statusSurpriseTotale.includes(effect.flags?.core?.statusId)) { + if (statusSurpriseTotale.intersects(effect.statuses)) { return 2; } - return statusDemiSurprise.includes(effect.flags?.core?.statusId) || (isCombat && effect.flags?.core?.statusId == STATUSES.StatusDemiReve) ? 1 : 0; + if (statusDemiSurprise.intersects(effect.statuses)) { + return 1 + } + if (isCombat && effect.statuses.includes(STATUSES.StatusDemiReve)) { + return 1 + } + return 0 } static _getUseStatusEffects() { - return game.settings.get(SYSTEM_RDD, "use-status-effects")?.split(',') ?? []; + return game.settings.get(SYSTEM_RDD, "use-status-effects")?.split(',') ?? []; } - static _setUseStatusEffects(statusIds) { + static _setUseStatusEffects(effectIds) { if (game.user.isGM) { - game.settings.set(SYSTEM_RDD, "use-status-effects", statusIds.join()); + game.settings.set(SYSTEM_RDD, "use-status-effects", effectIds.join()); } for (let effect of CONFIG.RDD.allEffects) { - effect.active = effect.rdd || statusIds.includes(effect.flags?.core?.statusId); + effect.active = effect.rdd || effectIds.includes(effect.id); } CONFIG.statusEffects = CONFIG.RDD.allEffects.filter(it => it.active); } - static status(statusId) { - return rddStatusEffects.find(it => it.flags?.core?.statusId == statusId); + static prepareActiveEffect(effectId) { + let status = rddStatusEffects.find(it => it.id == effectId) + if (status) { + status = duplicate(status) + status.statuses = [effectId] + } + return status; } static demiReve() { diff --git a/module/tmr/draconique.js b/module/tmr/draconique.js index 88f75f17..90b58092 100644 --- a/module/tmr/draconique.js +++ b/module/tmr/draconique.js @@ -18,8 +18,8 @@ export class Draconique { static isTeteDragon(item) { return item.type == TYPES.tete; } static isQueueSouffle(item) { return Draconique.isQueueDragon(item) || Draconique.isSouffleDragon(item); } - static register(draconique) { - registeredEffects[draconique.code()] = draconique; + static register(draconique, code = undefined) { + registeredEffects[code ?? draconique.code()] = draconique; if (draconique.img()) { PixiTMR.register(draconique.code(), draconique.img()) } @@ -90,6 +90,15 @@ export class Draconique { */ token(pixiTMR, linkData, coordTMR, type = undefined) { const tooltip = this.tooltip(linkData); + return this._createToken(pixiTMR, linkData, coordTMR, type, tooltip); + } + + tokens(pixiTMR, linkData, coordTMR, type = undefined) { + const tooltip = this.tooltip(linkData); + return [this._createToken(pixiTMR, linkData, coordTMR, type, tooltip)]; + } + + _createToken(pixiTMR, linkData, coordTMR, type, tooltip) { const token = { sprite: this.createSprite(pixiTMR), coordTMR: coordTMR, diff --git a/module/tmr/effets-draconiques.js b/module/tmr/effets-draconiques.js index 42e45b2f..1b0753d1 100644 --- a/module/tmr/effets-draconiques.js +++ b/module/tmr/effets-draconiques.js @@ -6,7 +6,7 @@ import { ReserveExtensible } from "./reserve-extensible.js"; import { DemiReve } from "./demi-reve.js"; import { TrouNoir } from "./trou-noir.js"; import { Rencontre } from "./rencontre.js"; -import { SortReserve } from "./sort-reserve.js"; +import { SortReserve, SortReserveHumide } from "./sort-reserve.js"; import { CarteTmr } from "./carte-tmr.js"; import { PontImpraticable } from "./pont-impraticable.js"; import { Draconique } from "./draconique.js"; @@ -26,6 +26,7 @@ export class EffetsDraconiques { static demiReve = new DemiReve(); static rencontre = new Rencontre(); static sortReserve = new SortReserve(); + static sortReserveHumide = new SortReserveHumide(); static debordement = new Debordement(); static presentCites = new PresentCites(); static fermetureCites = new FermetureCites(); @@ -49,6 +50,7 @@ export class EffetsDraconiques { Draconique.register(EffetsDraconiques.demiReve); Draconique.register(EffetsDraconiques.rencontre); Draconique.register(EffetsDraconiques.sortReserve); + Draconique.register(EffetsDraconiques.sortReserveHumide); Draconique.register(EffetsDraconiques.debordement); Draconique.register(EffetsDraconiques.fermetureCites); Draconique.register(EffetsDraconiques.queteEaux); diff --git a/module/tmr/present-cites.js b/module/tmr/present-cites.js index c3eade99..1b00a8b0 100644 --- a/module/tmr/present-cites.js +++ b/module/tmr/present-cites.js @@ -49,7 +49,7 @@ export class PresentCites extends Draconique { content: `La ${this.tmrLabel(casetmr)} vous offre un présent, faites votre choix`, buttons: buttons }); - dialog.render(true); + await dialog.render(true); return dialog } diff --git a/module/tmr/sort-reserve.js b/module/tmr/sort-reserve.js index 7f4bec3e..c0f2aeec 100644 --- a/module/tmr/sort-reserve.js +++ b/module/tmr/sort-reserve.js @@ -1,5 +1,7 @@ import { tmrTokenZIndex } from "../tmr-constants.js"; +import { TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; +import { EffetsDraconiques } from "./effets-draconiques.js"; export class SortReserve extends Draconique { @@ -19,4 +21,19 @@ export class SortReserve extends Draconique { taille: () => pixiTMR.sizes.third, }); } + + tokens(pixiTMR, linkData, coordTMR, type = undefined) { + if (TMRUtility.getTMR(coordTMR()).type == 'fleuve') { + const tooltip = this.tooltip(linkData) + const fleuves = TMRUtility.getListTMR('fleuve') + return fleuves.map(f => EffetsDraconiques.sortReserveHumide._createToken(pixiTMR, linkData, () => f.coord, type?? this.code(), tooltip)) + } + return super.tokens(pixiTMR, linkData, coordTMR, type) + } +} + +export class SortReserveHumide extends SortReserve { + code() { return 'sortreservehumide' } + tooltip(sort) { return `${sort.name} en fleuve, r${sort.system.ptreve}` } + img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/sort-reserve-humide.svg' } } diff --git a/styles/simple.css b/styles/simple.css index 5752c9b0..80d9a24e 100644 --- a/styles/simple.css +++ b/styles/simple.css @@ -788,6 +788,10 @@ input:is(.blessure-premiers_soins, .blessure-soins_complets) { .rdd-roll-dialog div.dialog-content input { font-size: 1rem; } +.rdd-roll-dialog div.dialog-content input[type="checkbox"]{ + width: 1rem; + vertical-align: sub; +} .rdd-roll-part { align-items: center; border-radius: 6px; padding: 3px; @@ -1363,43 +1367,37 @@ table.table-nombres-astraux tr:hover { justify-content: flex-start; flex-direction: column; position: absolute; - top: 2.75rem; - right: 4rem; + top: 4.6rem; + right: 3.5rem; } .token-hud-ext.soins { - justify-content: flex-start; flex-direction: column; position: absolute; - top: 13.2rem; - left: -5rem; - max-width: 8.5rem + top: 14.7rem; + left: -6rem; + max-width: 8rem; + line-height: 1rem; } .token-hud-ext.right { - justify-content: flex-start; flex-direction: column; position: absolute; - top: 2.75rem; - left: 4rem; + top: 4.6rem; + left: 3.5rem; } -.control-icon.token-hud-icon { - width: fit-content; +div.control-icon.token-hud-icon { + width: 9rem; height: fit-content; + border-radius: 0.3rem; min-width: 6rem; flex-basis: auto; padding: 0; - line-height: 1rem; + line-height: 0.95rem; margin: 0.2rem; } -.control-icon.token-hud-icon.right { - margin-left: 8px; -} .rdd-hud-menu label { font-size: 0.8rem; } -#token-hud .status-effects.active{ - z-index: 2; -} /* ======================================== */ .item-checkbox { height: 25px; @@ -1941,6 +1939,14 @@ div.calendar-timestamp-edit select.calendar-signe-heure { padding: 3px; } +aside#tooltip{ + background: var(--background-tooltip); + color: var(--color-text-dark-primary); + font-size: 1rem; + border-radius: 0.2rem; + padding: 0.4rem; +} + .tooltip :is(.ttt-xp,.ttt-levelup) { width: 250px; background: var(--background-tooltip) !important; diff --git a/system.json b/system.json index 23820357..ce736465 100644 --- a/system.json +++ b/system.json @@ -1,8 +1,8 @@ { "id": "foundryvtt-reve-de-dragon", "title": "Rêve de Dragon", - "version": "11.2.8", - "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-11.2.8.zip", + "version": "11.2.9", + "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-11.2.9.zip", "manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/v11/system.json", "changelog": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/branch/v11/changelog.md", "compatibility": { diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index 7c35256e..4f849b8b 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -70,9 +70,13 @@ {{#if options.vueDetaillee}}    {{#if @root.options.vueArchetype}} - Incarnation + + Incarnation + {{else}} - Archétype + + Archétype + {{/if}} {{/if}} diff --git a/templates/actor/archetype.hbs b/templates/actor/archetype.hbs index 08858640..2e57478b 100644 --- a/templates/actor/archetype.hbs +++ b/templates/actor/archetype.hbs @@ -2,7 +2,8 @@