diff --git a/changelog.md b/changelog.md index 50e13b3a..52c1b561 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,8 @@ # 12.0 +## 12.0.41 - La loupe d'Astrobazzarh +- On peut de nouveau effectuer des tirages cachés +- Le stress transformé est bien diminué lorsqu'on met le stress dans une compétence + ## 12.0.40 - Les mains d'Astrobazzarh - correction des attaques particulières en combat - correction de message sur les min/max liés aux modificateurs de races (s'applique uniquement sur la taille) diff --git a/module/actor-sheet.js b/module/actor-sheet.js index 0359bc45..f7a43c14 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -237,7 +237,11 @@ export class RdDActorSheet extends RdDBaseActorSangSheet { this.html.find('.carac-xp-augmenter').click(async event => await this.actor.updateCaracXPAuto(event.currentTarget.name.replace("augmenter.", ""))) this.html.find('.competence-xp-augmenter').click(async event => await this.actor.updateCompetenceXPAuto(RdDSheetUtility.getItemId(event))) - this.html.find('.competence-stress-augmenter').click(async event => await this.actor.updateCompetenceStress(RdDSheetUtility.getItemId(event))) + this.html.find('.competence-stress-augmenter').click(async event =>{ + await this.actor.updateCompetenceStress(RdDSheetUtility.getItemId(event)) + this.render(true) + } + ) if (this.options.vueDetaillee) { // On carac change diff --git a/module/actor.js b/module/actor.js index c4f82a84..641766d5 100644 --- a/module/actor.js +++ b/module/actor.js @@ -736,7 +736,7 @@ export class RdDActor extends RdDBaseActorSang { await competence.update({ "system.xp": toXp, "system.niveau": toNiveau, - }); + }, { render: false }) await ExperienceLog.add(this, XP_TOPIC.XP, fromXp, toXp, competence.name); await ExperienceLog.add(this, XP_TOPIC.NIVEAU, fromNiveau, toNiveau, competence.name); } @@ -767,7 +767,7 @@ export class RdDActor extends RdDBaseActorSang { await competence.update({ "system.xp": newXp, "system.niveau": toNiveau, - }); + }, { render: false }) const toXpStress = Math.max(0, fromXpStress - xpUtilise); await this.update({ "system.compteurs.experience.value": toXpStress }); @@ -783,7 +783,7 @@ export class RdDActor extends RdDBaseActorSang { const toNiveau = compValue ?? RdDItemCompetence.getNiveauBase(competence.system.categorie, competence.getCategories()); this.notifyCompetencesTronc(competence, toNiveau); const fromNiveau = competence.system.niveau; - await competence.update({ 'system.niveau': toNiveau }); + await competence.update({ 'system.niveau': toNiveau }, { render: false }) await ExperienceLog.add(this, XP_TOPIC.NIVEAU, fromNiveau, toNiveau, competence.name, true); } } @@ -808,7 +808,7 @@ export class RdDActor extends RdDBaseActorSang { if (isNaN(toXp) || typeof (toXp) != 'number') toXp = 0; const fromXp = competence.system.xp; this.checkCompetenceXP(idOrName, toXp); - await competence.update({ 'system.xp': toXp }); + await competence.update({ 'system.xp': toXp }, { render: false }) await ExperienceLog.add(this, XP_TOPIC.XP, fromXp, toXp, competence.name, true); if (toXp > fromXp) { RdDUtility.checkThanatosXP(competence) @@ -822,7 +822,7 @@ export class RdDActor extends RdDBaseActorSang { if (competence) { if (isNaN(toXpSort) || typeof (toXpSort) != 'number') toXpSort = 0; const fromXpSort = competence.system.xp_sort; - await competence.update({ 'system.xp_sort': toXpSort }); + await competence.update({ 'system.xp_sort': toXpSort }, { render: false }) await ExperienceLog.add(this, XP_TOPIC.XPSORT, fromXpSort, toXpSort, competence.name, true); if (toXpSort > fromXpSort) { RdDUtility.checkThanatosXP(competence) @@ -834,7 +834,7 @@ export class RdDActor extends RdDBaseActorSang { async updateCompetenceArchetype(idOrName, compValue) { let competence = this.getCompetence(idOrName) if (competence) { - await competence.update({ 'system.niveau_archetype': Math.max(compValue ?? 0, 0) }); + await competence.update({ 'system.niveau_archetype': Math.max(compValue ?? 0, 0) }) } } @@ -1560,7 +1560,7 @@ export class RdDActor extends RdDBaseActorSang { if (!rollData.rolled.isPart || rollData.finalLevel >= 0 || game.settings.get("core", "rollMode") == 'selfroll' || - !Misc.hasConnectedGM()) { + !Misc.hasConnectedGM()) { return } hideChatMessage = hideChatMessage == 'hide' || (Misc.isRollModeHiddenToPlayer() && !game.user.isGM) @@ -1584,7 +1584,7 @@ export class RdDActor extends RdDBaseActorSang { /* -------------------------------------------- */ async _appliquerAppelMoral(rollData) { - if (!rollData.use.moral || game.settings.get("core", "rollMode") == 'selfroll'){ + if (!rollData.use.moral || game.settings.get("core", "rollMode") == 'selfroll') { return } if (rollData.rolled.isEchec || @@ -1869,7 +1869,7 @@ export class RdDActor extends RdDBaseActorSang { competence: competence, show: { title: options?.title ?? '' } }, - // TODO: + // TODO: callbacks: [{ action: r => this.$onRollCompetence(r, options) }] }); } @@ -1882,7 +1882,7 @@ export class RdDActor extends RdDBaseActorSang { compData.system.defaut_carac = tacheData.system.carac; // Patch ! await this.openRollDialog({ - name: 'jet-competence', + name: 'jet-competence', label: 'Jet de Tâche ' + tacheData.name, template: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-competence.hbs', rollData: { @@ -1945,9 +1945,9 @@ export class RdDActor extends RdDBaseActorSang { } await this.openRollDialog({ - name: `jet-${artData.art}`, + name: `jet-${artData.art}`, label: `${artData.verbe} ${oeuvre.name}`, - template: `systems/foundryvtt-reve-de-dragon/templates/dialog-roll-${oeuvre.type}.hbs`, + template: `systems/foundryvtt-reve-de-dragon/templates/dialog-roll-${oeuvre.type}.hbs`, rollData: artData, callbacks: [{ action: callbackAction }], }) @@ -2527,7 +2527,6 @@ export class RdDActor extends RdDBaseActorSang { }) } const blessure = this.getItem(blessureId, 'blessure') - console.log('TODO update blessure', this, blessureId, rollData, rollData.tache); if (blessure && !blessure.system.premierssoins.done) { const tache = rollData.tache; if (rollData.rolled.isETotal) { diff --git a/module/actor/base-actor.js b/module/actor/base-actor.js index bda083dd..0ca304d4 100644 --- a/module/actor/base-actor.js +++ b/module/actor/base-actor.js @@ -244,16 +244,19 @@ export class RdDBaseActor extends Actor { async onUpdateActor(update, options, actorId) { } async onDeleteItem(item, options, id) { if (item.isInventaire()) { - this._removeItemFromConteneur(item) + await this._removeItemFromConteneur(item) } } - _removeItemFromConteneur(item) { - this.items.filter(it => it.isConteneur() && it.system.contenu.includes(item.id)) - .forEach(conteneur => { - const nouveauContenu = conteneur.system.contenu.filter(id => id != item.id); - conteneur.update({ 'system.contenu': nouveauContenu }); - }); + async _removeItemFromConteneur(item) { + const updates = this.items.filter(it => it.isConteneur() && it.system.contenu.includes(item.id)) + .map(conteneur => { + const nouveauContenu = conteneur.system.contenu.filter(id => id != item.id) + return { _id: conteneur.id, 'system.contenu': nouveauContenu } + }) + if (updates.length > 0) { + await this.updateEmbeddedDocuments('Item', updates) + } } async onTimeChanging(oldTimestamp, newTimestamp) { diff --git a/module/applications/sheets/_module.mjs b/module/applications/sheets/_module.mjs index f45bf73d..9b7a35b4 100644 --- a/module/applications/sheets/_module.mjs +++ b/module/applications/sheets/_module.mjs @@ -1,2 +1,4 @@ export { default as RdDItemBaseSheet} from "./common-item-sheet.mjs" export { default as RdDMonnaieSheet } from "./monnaie-sheet.mjs" +export { default as RdDMunitionSheet } from "./munition-sheet.mjs" + diff --git a/module/applications/sheets/monnaie-sheet.mjs b/module/applications/sheets/monnaie-sheet.mjs index c8c487ab..efe3b12c 100644 --- a/module/applications/sheets/monnaie-sheet.mjs +++ b/module/applications/sheets/monnaie-sheet.mjs @@ -13,15 +13,10 @@ export default class RdDMonnaieSheet extends RdDItemBaseSheet { RdDItemBaseSheet.DEFAULT_OPTIONS, { classes: ["fvtt-rdd", "item", "monnaie"], - position: { - width: 400, - }, - window: { - contentClasses: ["monnaie-content"], - } + position: { width: 400 }, + window: { contentClasses: ["monnaie-content"] } }) - /** @override */ static PARTS = { main: { diff --git a/module/applications/sheets/munition-sheet.mjs b/module/applications/sheets/munition-sheet.mjs new file mode 100644 index 00000000..828f1fec --- /dev/null +++ b/module/applications/sheets/munition-sheet.mjs @@ -0,0 +1,34 @@ +import { TEMPLATE_DESCRIPTION, TEMPLATE_INVENTAIRE } from "../../common/_module.mjs"; +import { ITEM_TYPES } from "../../constants.js"; +import RdDItemBaseSheet from "./common-item-sheet.mjs"; + +export default class RdDMunitionSheet extends RdDItemBaseSheet { + /** @override */ + static get ITEM_TYPE() { return ITEM_TYPES.munition } + static get TEMPLATES() { return [TEMPLATE_DESCRIPTION, TEMPLATE_INVENTAIRE] } + + /** @override */ + static DEFAULT_OPTIONS = Object.assign({}, + RdDItemBaseSheet.DEFAULT_OPTIONS, + { + classes: ["fvtt-rdd", "item", "munition"], + position: { width: 400 }, + window: { contentClasses: ["munition-content"] } + }) + + /** @override */ + static PARTS = { + main: { + template: "systems/foundryvtt-reve-de-dragon/templates/sheets/item/munition.hbs", + }, + } + + /** @override */ + async _prepareContext() { + return Object.assign( + await super._prepareContext(), + await TEMPLATE_DESCRIPTION.prepareContext(this.document), + await TEMPLATE_INVENTAIRE.prepareContext(this.document) + ) + } +} \ No newline at end of file diff --git a/module/chat-utility.js b/module/chat-utility.js index 9f6c053e..61b6b901 100644 --- a/module/chat-utility.js +++ b/module/chat-utility.js @@ -62,7 +62,6 @@ export class ChatUtility { } /* -------------------------------------------- */ - static removeMessages(socketData) { if (Misc.isFirstConnectedGM()) { ChatUtility.onRemoveMessages(socketData); @@ -97,7 +96,7 @@ export class ChatUtility { } break case "gmroll": - messageData.whisper = ChatUtility.getOwners(actor) + messageData.whisper = actor ? ChatUtility.getOwners(actor) : ChatUtility.getUserAndGMs() break case "selfroll": messageData.whisper = [game.user] @@ -108,7 +107,7 @@ export class ChatUtility { } static getOwners(document) { - return game.users.filter(it => document.getUserLevel(it) == CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER) + return document ? game.users.filter(it => document.getUserLevel(it) == CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER) : [game.user] } static getUserAndGMs() { @@ -199,7 +198,7 @@ export class ChatUtility { static async onCreateChatMessage(chatMessage, options, id) { if (chatMessage.isAuthor) { await chatMessage.setFlag(SYSTEM_RDD, 'rdd-timestamp', game.system.rdd.calendrier.getTimestamp()); - await chatMessage.update({ content: await RdDTextEditor.enrichHTML(chatMessage.content, undefined, {showLink:false}) }) + await chatMessage.update({ content: await RdDTextEditor.enrichHTML(chatMessage.content, undefined, { showLink: false }) }) } } } diff --git a/module/documents/munition.mjs b/module/documents/munition.mjs new file mode 100644 index 00000000..19ade5fd --- /dev/null +++ b/module/documents/munition.mjs @@ -0,0 +1,7 @@ +import { RdDItem } from "../item.js"; + +export default class RdDItemMunition extends RdDItem { + static get defaultIcon() { + return 'systems/foundryvtt-reve-de-dragon/icons/objets/fleche.webp' + } +} diff --git a/module/models/_module.mjs b/module/models/_module.mjs index f636920a..588f6fd9 100644 --- a/module/models/_module.mjs +++ b/module/models/_module.mjs @@ -1 +1,2 @@ export { default as RdDModelMonnaie } from "./monnaie.mjs" +export { default as RdDModelMunition } from "./munition.mjs" diff --git a/module/models/munition.mjs b/module/models/munition.mjs new file mode 100644 index 00000000..2d5d7d61 --- /dev/null +++ b/module/models/munition.mjs @@ -0,0 +1,10 @@ +import { TEMPLATE_DESCRIPTION, TEMPLATE_INVENTAIRE } from "../common/_module.mjs"; + +export default class RdDModelMunition extends foundry.abstract.TypeDataModel { + static defineSchema() { + return Object.assign({}, + TEMPLATE_DESCRIPTION.fields(), + TEMPLATE_INVENTAIRE.fields() + ) + } +} diff --git a/module/rdd-main.js b/module/rdd-main.js index 730f19eb..b6759d9b 100644 --- a/module/rdd-main.js +++ b/module/rdd-main.js @@ -105,6 +105,7 @@ export class SystemReveDeDragon { this.RdDStatBlockParser = RdDStatBlockParser this.itemClasses = { monnaie: items.RdDModelMonnaie, + munition: items.RdDModelMunition, armure: RdDItemArmure, blessure: RdDItemBlessure, gemme: RdDItemGemme, @@ -185,6 +186,7 @@ export class SystemReveDeDragon { CONFIG.Item.documentClass = RdDItem CONFIG.Item.dataModels = { monnaie: models.RdDModelMonnaie, + munition: models.RdDModelMunition, } CONFIG.RDD = { resolutionTable: RdDResolutionTable.resolutionTable, @@ -206,17 +208,16 @@ export class SystemReveDeDragon { Items.registerSheet(SYSTEM_RDD, RdDItemInventaireSheet, { types: [ - "objet", "arme", "armure", "livre", "munition", "nourritureboisson", + "objet", "arme", "armure", "livre", "nourritureboisson", ], makeDefault: true }) sheets.RdDItemBaseSheet.registerAll( - sheets.RdDMonnaieSheet + sheets.RdDMonnaieSheet, + sheets.RdDMunitionSheet ) - // , - // sheets.RdDMunitionSheet Items.registerSheet(SYSTEM_RDD, RdDItemSheetV1, { types: [ "competence", "competencecreature", diff --git a/template.json b/template.json index 3bc25e74..869ba16b 100644 --- a/template.json +++ b/template.json @@ -750,9 +750,6 @@ "inertie": 0, "enchantabilite": 0 }, - "munition": { - "templates": ["description", "inventaire"] - }, "nourritureboisson": { "templates": ["description", "inventaire", "comestible"], "cuisinier": "", diff --git a/templates/actor/xp-competences.hbs b/templates/actor/xp-competences.hbs index 13d924ff..47c1ff9b 100644 --- a/templates/actor/xp-competences.hbs +++ b/templates/actor/xp-competences.hbs @@ -1,15 +1,18 @@