Compare commits
	
		
			7 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 89bbe63340 | |||
| 149990e352 | |||
| 3e355784c7 | |||
| b92055d5dd | |||
| 220f8142f5 | |||
| a8bb00ad0b | |||
| 78e30b5503 | 
| @@ -1,4 +1,12 @@ | ||||
| # 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) | ||||
|  | ||||
| ## 12.0.39 - Les mains d'Astrobazzarh | ||||
| - les armes à 1 ou 2 mains fonctionnent dans les liens de jets de dés | ||||
| - commande `/jet` pour poster une demande de jet de dés | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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) { | ||||
|   | ||||
| @@ -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) { | ||||
|   | ||||
| @@ -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 }) }) | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -19,10 +19,12 @@ export class RdDItemRace extends RdDItem { | ||||
|         return false | ||||
|       } | ||||
|     } | ||||
|     const carac = RdDCarac.carac(code) | ||||
|     if (race.isMax(actor, code, value - 1)) { | ||||
|       ui.notifications.warn(`${value} est supérieure au maximum de ${carac.label}`) | ||||
|       return false | ||||
|     if (code == LIST_CARAC_PERSONNAGE.taille.code) { | ||||
|       const carac = RdDCarac.carac(code) | ||||
|       if (race.isMax(actor, code, value - 1)) { | ||||
|         ui.notifications.warn(`${value} est supérieure au maximum de ${carac.label}`) | ||||
|         return false | ||||
|       } | ||||
|     } | ||||
|     return true | ||||
|   } | ||||
| @@ -59,7 +61,8 @@ export class RdDItemRace extends RdDItem { | ||||
|     if (code == LIST_CARAC_PERSONNAGE.force.code) { | ||||
|       return value >= this.getForceMax(actor) | ||||
|     } | ||||
|     const max = foundry.utils.getProperty(this, path) ?? -1 | ||||
|     const pathMax = path.replace(".value", ".max"); | ||||
|     const max = foundry.utils.getProperty(this, pathMax) ?? -1 | ||||
|     return (max > 0 && value >= max) | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -776,7 +776,7 @@ export class RdDCombat { | ||||
|  | ||||
|     if (this.attacker.isCreatureEntite()) { | ||||
|       RdDItemCompetenceCreature.setRollDataCreature(rollData); | ||||
|   } | ||||
|     } | ||||
|     else if (arme) { | ||||
|       // Usual competence | ||||
|       rollData.arme = RdDItemArme.armeUneOuDeuxMains(arme, RdDItemCompetence.isArmeUneMain(competence)); | ||||
| @@ -832,7 +832,10 @@ export class RdDCombat { | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   async _onAttaqueNormale(attackerRoll) { | ||||
|     if (!RdDCombat.isReussite(attackerRoll) || RdDCombat.isParticuliere(attackerRoll)) { | ||||
|     if (!RdDCombat.isReussite(attackerRoll)) { | ||||
|       return | ||||
|     } | ||||
|     if (RdDCombat.isParticuliere(attackerRoll) && attackerRoll.particuliere == undefined) { | ||||
|       return | ||||
|     } | ||||
|     console.log("RdDCombat.onAttaqueNormale >>>", attackerRoll); | ||||
| @@ -849,7 +852,7 @@ export class RdDCombat { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     if (this.target) { | ||||
|     if (this.defender) { | ||||
|       await this._sendMessageDefense(attackerRoll, defenderRoll); | ||||
|     } | ||||
|   } | ||||
| @@ -999,7 +1002,7 @@ export class RdDCombat { | ||||
|  | ||||
|     this.removeChatMessageActionsPasseArme(rollData.passeArme); | ||||
|     rollData.particuliere = choix; | ||||
|     await this._onAttaqueNormale(rollData); | ||||
|     await this._onAttaqueNormale(rollData) | ||||
|   } | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   | ||||
| @@ -1,15 +1,18 @@ | ||||
| <div> | ||||
|   <ul class="item-list"> | ||||
|     <li class="item flexrow"> | ||||
|     <li class="flexrow"> | ||||
|       <label class="derivee-label" for="system.compteurs.experience.value">Stress transformé</label> | ||||
|       {{#if options.vueDetaillee}} | ||||
|       <input class="derivee-value" type="number" name="system.compteurs.experience.value" value="{{system.compteurs.experience.value}}" data-dtype="number" size="3"/> | ||||
|       <input class="resource-content" | ||||
|         type="text" data-dtype="Number" size="3" | ||||
|         name="system.compteurs.experience.value" | ||||
|         value="{{system.compteurs.experience.value}}"/> | ||||
|       {{else}} | ||||
|       <label name="system.compteurs.experience.value">{{system.compteurs.experience.value}}</label> | ||||
|       {{/if}} | ||||
|     </li> | ||||
|     {{#if options.vueDetaillee}} | ||||
|     <li class="item flexrow"> | ||||
|     <li class="flexrow"> | ||||
|       <span class="generic-label">Total XP compétences</span> | ||||
|       <span class="competence-value">{{calc.competenceXPTotal}}</span> | ||||
|     </li> | ||||
|   | ||||
| @@ -2,19 +2,22 @@ | ||||
|   <h4 class="rdd-roll-part">{{alias}} réussit une attaque particulière!</strong></h4> | ||||
|   {{#if isForce}} | ||||
|   <br> | ||||
|   <a class="chat-card-button particuliere-attaque" data-mode="force" data-attackerId="{{attackerId}}"> | ||||
|   <a class="chat-card-button particuliere-attaque" data-mode="force" data-attackerId="{{attackerId}}" | ||||
|     data-defenderTokenId="{{defenderToken.id}}" data-attackerTokenId="{{attackerToken.id}}"> | ||||
|     Attaquer en Force | ||||
|   </a> | ||||
|   {{/if}} | ||||
|   {{#if isRapide}} | ||||
|   <br> | ||||
|   <a class="chat-card-button particuliere-attaque" data-mode="rapidite" data-attackerId="{{attackerId}}"> | ||||
|   <a class="chat-card-button particuliere-attaque" data-mode="rapidite" data-attackerId="{{attackerId}}" | ||||
|     data-defenderTokenId="{{defenderToken.id}}" data-attackerTokenId="{{attackerToken.id}}"> | ||||
|     Attaquer en Rapidité | ||||
|   </a> | ||||
|   {{/if}} | ||||
|   {{#if isFinesse}} | ||||
|   <br> | ||||
|   <a class="chat-card-button particuliere-attaque" data-mode="finesse" data-attackerId="{{attackerId}}"> | ||||
|   <a class="chat-card-button particuliere-attaque" data-mode="finesse" data-attackerId="{{attackerId}}" | ||||
|     data-defenderTokenId="{{defenderToken.id}}" data-attackerTokenId="{{attackerToken.id}}"> | ||||
|     Attaquer en Finesse | ||||
|   </a> | ||||
|   {{/if}} | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
| <hr> | ||||
| <div> | ||||
|   {{#if rolled.isSuccess}} | ||||
|   {{alias}} a gagné {{xpSort}} points d'expérience en sorts dans la {{competence.name}}. | ||||
|   {{alias}} a gagné {{xpSort}} points d'expérience en sorts en {{competence.name}}. | ||||
|   {{else}} | ||||
|   {{alias}} n'a pas pu interpréter le signe draconique. | ||||
|   {{/if}} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user