diff --git a/fonts/goudyacc.woff b/fonts/goudyacc.woff new file mode 100644 index 00000000..7e314255 Binary files /dev/null and b/fonts/goudyacc.woff differ diff --git a/icons/heures/de-heures.webp b/icons/heures/de-heures.webp new file mode 100644 index 00000000..7615d31b Binary files /dev/null and b/icons/heures/de-heures.webp differ diff --git a/module/rdd-combat.js b/module/rdd-combat.js index 5bdf7daa..e05c7160 100644 --- a/module/rdd-combat.js +++ b/module/rdd-combat.js @@ -196,8 +196,8 @@ export class RdDCombatManager extends Combat { let competences = items.filter(it => it.type == 'competence'); actions = actions.concat(RdDCombatManager.finalizeArmeList(armes, competences, actorData.data.carac)); - - if (actorData.data.attributs.hautrevant.value){ + + if (actorData.data.attributs.hautrevant.value) { actions.push({ name: "Draconic", data: { initOnly: true, competence: "Draconic" } }); } } @@ -364,6 +364,8 @@ export class RdDCombat { return RdDCombat.onMsgEncaisser(sockmsg.data); case "msg_defense": return RdDCombat.onMsgDefense(sockmsg.data); + case "msg_combat_passearme": + return RdDCombat.onMsgPasseArme(sockmsg.data); } } @@ -434,9 +436,31 @@ export class RdDCombat { return undefined; } + static messagePasseArme(data) { + game.socket.emit("system.foundryvtt-reve-de-dragon", { msg: "msg_combat_passearme", data: data }); + RdDCombat.onMsgPasseArme(data); + } + + static onMsgPasseArme(data) { + switch (data.actionPasseArme) { + case "store-attaque": + game.system.rdd.combatStore.attaques[data.id] = data.rollData; + break; + case "store-defense": + game.system.rdd.combatStore.defenses[data.id] = data.rollData; + break; + case "delete-attaque": + delete game.system.rdd.combatStore.attaques[data.id]; + break; + case "delete-defense": + delete game.system.rdd.combatStore.defenses[data.id]; + break; + } + } + /* -------------------------------------------- */ static _storeAttaque(attackerId, attackerRoll) { - game.system.rdd.combatStore.attaques[attackerId] = duplicate(attackerRoll); + RdDCombat.messagePasseArme({ actionPasseArme: "store-attaque", id: attackerId, rollData: attackerRoll }); } /* -------------------------------------------- */ @@ -446,12 +470,12 @@ export class RdDCombat { /* -------------------------------------------- */ static _deleteAttaque(attackerId) { - delete game.system.rdd.combatStore.attaques[attackerId]; + RdDCombat.messagePasseArme({ actionPasseArme: "delete-attaque", id: attackerId }); } /* -------------------------------------------- */ - static _storeDefense(defenderRoll) { - game.system.rdd.combatStore.defenses[defenderRoll.passeArme] = duplicate(defenderRoll); + static _storeDefense(passeArme, defenderRoll) { + RdDCombat.messagePasseArme({ actionPasseArme: "store-defense", id: passeArme, rollData: defenderRoll }); } /* -------------------------------------------- */ @@ -461,7 +485,7 @@ export class RdDCombat { /* -------------------------------------------- */ static _deleteDefense(passeArme) { - delete game.system.rdd.combatStore.defenses[passeArme]; + RdDCombat.messagePasseArme({ actionPasseArme: "delete-defense", id: passeArme }); } /* -------------------------------------------- */ @@ -497,20 +521,18 @@ export class RdDCombat { /* -------------------------------------------- */ static onMsgDefense(msg) { let defenderToken = canvas.tokens.get(msg.defenderTokenId); - if (defenderToken) { - if (!game.user.isGM && !game.user.character) { // vérification / sanity check - ui.notifications.error("Le joueur " + game.user.name + " n'est connecté à aucun personnage. Impossible de continuer."); - return; - } - if (Misc.isElectedUser()) { - const rddCombat = RdDCombat.createForAttackerAndDefender(msg.attackerId, msg.defenderTokenId); - if (rddCombat) { - const defenderRoll = msg.defenderRoll; - RdDCombat._storeAttaque(msg.attackerId, defenderRoll.attackerRoll); - RdDCombat._storeDefense(defenderRoll); - rddCombat.removeChatMessageActionsPasseArme(defenderRoll.passeArme); - rddCombat._chatMessageDefense(msg.paramChatDefense); - } + if (!game.user.isGM && !game.user.character) { // vérification / sanity check + ui.notifications.error("Le joueur " + game.user.name + " n'est connecté à aucun personnage. Impossible de continuer."); + return; + } + if (defenderToken && Misc.isElectedUser()) { + const rddCombat = RdDCombat.createForAttackerAndDefender(msg.attackerId, msg.defenderTokenId); + if (rddCombat) { + const defenderRoll = msg.defenderRoll; + RdDCombat._storeAttaque(msg.attackerId, defenderRoll.attackerRoll); + RdDCombat._storeDefense(defenderRoll.passeArme, defenderRoll); + rddCombat.removeChatMessageActionsPasseArme(defenderRoll.passeArme); + rddCombat._chatMessageDefense(msg.paramChatDefense); } } } @@ -773,7 +795,7 @@ export class RdDCombat { let defenderRoll = { attackerRoll: attackerRoll, passeArme: attackerRoll.passeArme, show: {} } // Save rollData for defender RdDCombat._storeAttaque(this.attackerId, attackerRoll); - RdDCombat._storeDefense(defenderRoll) + RdDCombat._storeDefense(defenderRoll.passeArme, defenderRoll); attackerRoll.show = { cible: this.target ? this.defender.data.name : 'la cible', @@ -1009,7 +1031,7 @@ export class RdDCombat { this.removeChatMessageActionsPasseArme(defenderRoll.passeArme); this._sendMessageDefense(defenderRoll.attackerRoll, defenderRoll, { defense: true }); - RdDCombat._storeDefense(defenderRoll); + RdDCombat._storeDefense(defenderRoll.passeArme, defenderRoll); } /* -------------------------------------------- */ @@ -1081,7 +1103,7 @@ export class RdDCombat { this.removeChatMessageActionsPasseArme(defenderRoll.passeArme); this._sendMessageDefense(defenderRoll.attackerRoll, defenderRoll, { defense: true }) - RdDCombat._storeDefense(defenderRoll); + RdDCombat._storeDefense(defenderRoll.passeArme, defenderRoll); } /* -------------------------------------------- */ diff --git a/packs/signes-draconiques.txt b/packs/signes-draconiques.txt new file mode 100644 index 00000000..dc6b73c3 --- /dev/null +++ b/packs/signes-draconiques.txt @@ -0,0 +1,81 @@ +des centaines de graines emportées par le vent +des cheminées de fées +des cristaux de neige étincelants au soleil +des feux follets dans la nuit +des fumeroles s'échappant de fissures dans le sol +des grêlons de la taille d'un oeuf de pigeon +des lichens à l'assaut d'une souche +des mirages sur l'horizon +des nuages accrochées aux flancs d'une montagne +des nuées dans le ciel nocturne +des plumes duveteuses accrochées dans les fougères +des roches sculptées par l'érosion +des signes comme gravés à même la pierre évoquant la langue des Dragons +des silhouettes imprécises dans la brume +des sons de flûtes provenant du sous bois +des traces de fossiles dans une roche +des uages noirs qui moutonnent juste avant la pluie +des veinures aux reflets métalliques dans la roche +des voiles d'aurores boréales tombant dans le ciel nocturne +des éclairs zébrant le ciel à l'horizon +l'entrelacs des branches d'un arbre millénaire +l'écoulement d'une chute l'eau +l'écume sur les vagues salées +la brillance d'étoiles alignées +la coloration verte des flammes +la course hypnotique des balles d'un jongleur +la formation de givre sur une étendue d'eau +la lueur du crépuscule sur les cimes à l'horizon +la lune rouge sang +la rosée dans une toile d'araignée +la teinte rouge de la lune à travers les nuages +le faisceau d'ondes causé par un insecte aquatique +le mouvement de grains de sable poussés par le vent +le mouvement de vagues battant le rivage +le mouvement régulier des pales d'un moulin à vent +le rythme de l'eau qui emporte les aubes d'un moulin +le soleil masqué par un passage de nuages +le tableau abstrait de tâches sur le sol +les cicatrices et boutons du visage d'un malade +les colorations violacées et oranges du ciel matinal +les figures de la rouille sur un vieux casque +les filaments d'une fleur carnivore enlaçant un insecte +les rayons du soleil couchant +les reflets d'eau à travers les plantes aquatiques +les remous cascadant d’un torrent tels un liquide en ébullition dans une marmite de gigant +les restes d'un mur antique +les vagues du vent dans les herbes hautes +un arbre mort fendu par la foudre +un arc-en-ciel double +un arc-en-ciel très lumineux +un cadavre d'animal inconnu +un dragon de nuages prenant son envol +un empilement de pierres +un enfant sautant dans les flaques d'eau +un fantôme de poussière étincellant au soleil +un geyser projetant eau et vapeur à la face des Dragons +un manche d'outil poli par l'usure +un moustique gorgé de sang +un nid d'oiseau inconnu +un nuage d'insectes assombrissant le ciel +un panache de fumée volcaniques s'élevant à l'horizon +un parterre de fleurs +un prairie brumeuse +un rideau de pluie éclairé d'un rai de lumière diffus +un tourbillon dans l'eau +un tourbillon de poussière +un vol d'oiseaux migrateurs alignés traçant des lettres dans le ciel +une braise attisée par le vent +une coloration bleutée de la lune +une concrétion rocheuse évoquant une cascade figée +une fine couche de terre craquelée par le soleil +une forme animale évoquée par les courbes d'une écorce +une gerbe d'étincelles échappant du feu +une mante religieuse dévorrant son male +une mue de lézard +une nuée chaotique d'oiseaux tourbillonnant dans le vent +une ondée illuminée tombant tel un voile +une phosphorescence dans l'eau +une tornade dans le lointain +une étoile filante +une étrange disposition d'ossements sur le sol diff --git a/system.json b/system.json index 6a5718b9..6138d242 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "name": "foundryvtt-reve-de-dragon", "title": "Rêve de Dragon", "description": "Rêve de Dragon RPG for FoundryVTT", - "version": "1.3.61", + "version": "1.3.62", "manifestPlusVersion": "1.0.0", "minimumCoreVersion": "0.7.5", "compatibleCoreVersion": "0.7.9", diff --git a/tokens.rar b/tokens.rar new file mode 100644 index 00000000..b8e97c35 Binary files /dev/null and b/tokens.rar differ