Compare commits
63 Commits
fvtt-hawkm
...
fvtt-hawkm
| Author | SHA1 | Date | |
|---|---|---|---|
| 05ca6e1763 | |||
| d3f014fcca | |||
| 679b3208cd | |||
| 871a18a0ee | |||
| 264c49eb06 | |||
| 9349c54966 | |||
| 274efac2b5 | |||
| 7a7398f8ca | |||
| 93600f7e13 | |||
| a6fa3afbee | |||
| 1051349dd0 | |||
| a245b0e87c | |||
| c9ce3367ed | |||
| e95e068112 | |||
| 6dd63a2c54 | |||
| 650e4b7449 | |||
| 3f27482ad9 | |||
| 436b282ff5 | |||
| 39f8cfdbcc | |||
| 24a57a906e | |||
| 667f3678fb | |||
| d5dd9e5bf7 | |||
| 3403b72d1f | |||
| 8a4487c833 | |||
| 4eece5aaf4 | |||
| b574ba76ef | |||
| 0b9e1a80af | |||
| 6505b1c969 | |||
| 280e90d7a6 | |||
| 4fa9a911a0 | |||
| b8c61f8f12 | |||
| b47b14a4b1 | |||
| 9391acf6ee | |||
| 8af9c582bf | |||
| fac158e0ad | |||
| 69a2f81ede | |||
| 005d390941 | |||
| 3327109f7e | |||
| b38bfc97c2 | |||
| 89a7730d43 | |||
| 2ebd1bd1fd | |||
| 9e023d3f01 | |||
| 2c12ec38fb | |||
| 38059232cb | |||
| c331604393 | |||
| 71c1e1cd29 | |||
| 4a2ca5fab5 | |||
| ea8c82256c | |||
| 7df8aad4dc | |||
| bb38705d52 | |||
| 4344a5fbd3 | |||
| df461fecf9 | |||
| 3aeb51c8ac | |||
| 154e9d3da5 | |||
| 9b58acc058 | |||
| 189411eef8 | |||
| b1966412a0 | |||
| c34d223d8f | |||
| 0e5be07fb9 | |||
| 22ae4fb588 | |||
| 42ac857c06 | |||
| 1c143f542c | |||
| 4d447c9783 |
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
.vscode/settings.json
|
||||
.idea
|
||||
.history
|
||||
todo.md
|
||||
/.vscode
|
||||
/ignored/
|
||||
/node_modules/
|
||||
/jsconfig.json
|
||||
/package.json
|
||||
/package-lock.json
|
||||
8
_deprecated/competences-creatures.db
Normal file
8
_deprecated/competences-creatures.db
Normal file
@@ -0,0 +1,8 @@
|
||||
{"name":"Mêlée","type":"competence","img":"systems/fvtt-hawkmoon-cyd/assets/icons/competence.webp","system":{"description":"<p style=\"text-align: justify;\">Mêlée représente la maîtrise martiale et l’habileté au combat rapproché, avec ou sans arme. Plus cette Compétence est élevée, plus le personnage est à même de passer la garde de ses adversaires en combat au corps-à-corps.</p>","niveau":0,"attribut1":"pui","attribut2":"none","attribut3":"none","doublebonus":false,"predilections":[{"name":"Armes à une main (Puissance)","used":false,"description":"Pour utiliser des armes comme l’épée courte, la hache, une arme improvisée à une main, etc.\n\n"},{"name":"Armes à deux mains (Puissance)","used":false,"description":"Pour utiliser des armes comme la hache nordaine ou l’épée arthurienne, une arme improvisée à deux mains, etc."},{"name":"Mains nues (Puissance)","used":false,"description":"Pour se battre à mains nues, qu’il s’agisse d’une bagarre ou d’un pugilat codifié."}],"predilections[0]":["Nouvelle prédilection",""]},"effects":[],"ownership":{"default":0,"8b7NkRYwYKm5eOMy":3,"wYQCdPQVeRKBJmZI":3},"flags":{"core":{"sourceId":"Compendium.fvtt-hawkmoon-cyd.skills.VM3TSQYxseYdCFjv"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.1.7","coreVersion":"10.291","createdTime":1666620807186,"modifiedTime":1671645643952,"lastModifiedBy":"wYQCdPQVeRKBJmZI"},"folder":null,"sort":0,"_id":"0nhTxujlIUB63Aqt"}
|
||||
{"name":"Discrétion","type":"competence","img":"systems/fvtt-hawkmoon-cyd/assets/icons/competence.webp","system":{"description":"<p style=\"text-align: justify;\">Discrétion représente la capacité à ne pas se faire remarquer, qu’il s’agisse de se fondre dans la foule, de prendre l'apparence de quelqu’un d’autre, de se cacher dans l’ombre ou encore de se déplacer en silence. Plus cette Compétence est élevée, plus le personnage est apte à passer<br>physiquement inaperçu.</p>","niveau":0,"attribut1":"adr","attribut2":"tre","attribut3":"none","doublebonus":false,"predilections":[{"name":"Cacher et se cacher (Trempe)","used":false,"description":"Pour se fondre dans le décor. Le personnage adopte un comportement décontracté qui le fait passer inaperçu, il trouve une cachette, etc. Permet également de dissimuler un objet sur soi (qu’il s’agisse d’une bourse, d’une arme, d’un tatouage, etc.).\n\n"},{"name":"Déguisement (Trempe)","used":false,"description":"Pour dissimuler son identité, altérer ses traits ou prendre ceux d'une personne spécifique."},{"name":"Déplacement silencieux (Adresse)","used":false,"description":"Pour se déplacer sans éveiller l’attention lorsqu’on ne peut être vu (dans l’obscurité ou à couvert, lorsqu’un garde est derrière une porte ou un angle\nde mur, etc.)."}]},"effects":[],"ownership":{"default":0,"8b7NkRYwYKm5eOMy":3,"wYQCdPQVeRKBJmZI":3},"flags":{"core":{"sourceId":"Compendium.fvtt-hawkmoon-cyd.skills.gBmAdYl4rhbY89ee"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.1.7","coreVersion":"10.291","createdTime":1666620807186,"modifiedTime":1671645638028,"lastModifiedBy":"wYQCdPQVeRKBJmZI"},"folder":null,"sort":0,"_id":"J4x6SP6l6njOrZn3"}
|
||||
{"name":"Armes à distance","type":"competence","img":"systems/fvtt-hawkmoon-cyd/assets/icons/competence.webp","system":{"description":"<p style=\"text-align: justify;\">Représente l’habileté au lancer ou avec une arme à distance. Plus cette Compétence est élevée, plus les tirs du personnage sont précis. </p>\n<p style=\"text-align: justify;\"> </p>\n<p style=\"text-align: justify;\"> </p>\n<p style=\"text-align: justify;\"> </p>","niveau":0,"attribut1":"adr","attribut2":"none","attribut3":"none","doublebonus":false,"predilections":[{"name":"Armes à feu (Adresse) ","used":false,"description":"Pour des armes comme le lance-feu. "},{"name":"Armes à projectile (Adresse)","used":false,"description":"Pour des armes comme l'arc, la fronde, l'arbalète, etc."},{"name":"Armes de jet (Adresse)","used":false,"description":"Pour des armes comme la dague de lancer, la bombe à mèche, le javelot, les projectiles improvisés, etc. "}],"predilections[0]":["Nouvelle prédilection",""],"predilections[1]":["Nouvelle prédilection",""],"predilections[2]":["Nouvelle prédilection",""]},"effects":[],"ownership":{"default":0,"8b7NkRYwYKm5eOMy":3,"wYQCdPQVeRKBJmZI":3},"flags":{"core":{"sourceId":"Compendium.fvtt-hawkmoon-cyd.skills.MLMlscPBb1ZCPTRl"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.1.7","coreVersion":"10.291","createdTime":1666619959067,"modifiedTime":1671645649970,"lastModifiedBy":"wYQCdPQVeRKBJmZI"},"folder":null,"sort":0,"_id":"UfVYwmPFwy2T7jZM"}
|
||||
{"name":"Survie","type":"competence","img":"systems/fvtt-hawkmoon-cyd/assets/icons/competence.webp","system":{"description":"<p style=\"text-align: justify;\">Survie représente la capacité à trouver de quoi subsister dans la nature, à établir un campement, à faire du feu avec les moyens du bord, à se repérer. Avec Clairvoyance, cette Compétence permet de trouver des baies comestibles, de poser tous les types de pièges, de pister, de trouver le meilleur emplacement pour un campement. Avec Adresse, elle permet de chasser, de pêcher, de faire du feu dans des conditions difficiles et de confectionner les pièges les plus simples (collets, fosses, etc.).</p>\n<p style=\"text-align: justify;\">Les Prédilections représentent quant à elles les différents milieux ou climats.</p>","niveau":0,"attribut1":"adr","attribut2":"cla","attribut3":"none","doublebonus":false,"predilections":[{"name":"Fleuve, Forêt, Hiver, Mer, Montagne, Souterrains, etc. (Adresse ou Clairvoyance)","used":false,"description":"En fonction de chaque milieu, la Prédilection permet d’y évoluer de la façon la plus adaptée."}],"predilections[0]":["Nouvelle prédilection",""],"predilections[1]":["Nouvelle prédilection",""],"predilections[2]":["Nouvelle prédilection",""],"predilections[3]":["Nouvelle prédilection",""],"predilections[4]":["Nouvelle prédilection",""],"predilections[5]":["Nouvelle prédilection",""],"predilections[6]":["Nouvelle prédilection",""],"predilections[7]":["Nouvelle prédilection",""],"predilections[8]":["Nouvelle prédilection",""],"predilections[9]":["Nouvelle prédilection",""],"predilections[10]":["Nouvelle prédilection",""],"predilections[11]":["Nouvelle prédilection",""]},"effects":[],"ownership":{"default":0,"8b7NkRYwYKm5eOMy":3,"wYQCdPQVeRKBJmZI":3},"flags":{"core":{"sourceId":"Compendium.fvtt-hawkmoon-cyd.skills.yI1zY5k8mAdx9wHK"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.1.7","coreVersion":"10.291","createdTime":1666620807186,"modifiedTime":1671645647913,"lastModifiedBy":"wYQCdPQVeRKBJmZI"},"folder":null,"sort":0,"_id":"Vpth0atT9qS6VqUB"}
|
||||
{"name":"Perception","type":"competence","img":"systems/fvtt-hawkmoon-cyd/assets/icons/competence.webp","system":{"description":"<p style=\"text-align: justify;\">Perception représente à la fois la conscience de son environnement, la capacité à remarquer les détails incongrus, et l’aptitude à lire le langage corporel. Plus cette Compétence est élevée, plus les sens du personnage sont affûtés.</p>","niveau":0,"attribut1":"cla","attribut2":"none","attribut3":"none","doublebonus":false,"predilections":[{"name":"Empathie (Clairvoyance)","used":false,"description":"Pour déchiffrer, par son attitude ou ses gestes, l’opinion ou la sincérité d’un interlocuteur, pour deviner les choses exprimées à mots couverts, pour comprendre quelqu’un qui s’exprime par signes."},{"name":"Recherche (Clairvoyance)","used":false,"description":"Pour remarquer les détails les plus infimes, pour trouver un objet ou un passage dissimulés."},{"name":"Vigilance (Clairvoyance) ","used":false,"description":"Pour détecter un personnage ou un animal qui se cache, pour remarquer une menace potentielle (piège, terrain dangereux, tireur embusqué), pour rester attentif lors d’un tour de garde."}],"predilections[0]":["Nouvelle prédilection",""],"predilections[1]":["Nouvelle prédilection",""],"predilections[2]":["Nouvelle prédilection",""],"predilections[3]":["Nouvelle prédilection",""],"predilections[4]":["Nouvelle prédilection",""],"predilections[5]":["Nouvelle prédilection",""]},"effects":[],"ownership":{"default":0,"8b7NkRYwYKm5eOMy":3,"wYQCdPQVeRKBJmZI":3},"flags":{"core":{"sourceId":"Compendium.fvtt-hawkmoon-cyd.skills.7p2MTjttE4fllp9e"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.1.7","coreVersion":"10.291","createdTime":1666620807186,"modifiedTime":1671645646434,"lastModifiedBy":"wYQCdPQVeRKBJmZI"},"folder":null,"sort":0,"_id":"cunjmZoXNhSX5qdV"}
|
||||
{"name":"Coercition","type":"competence","img":"systems/fvtt-hawkmoon-cyd/assets/icons/competence.webp","system":{"description":"<p style=\"text-align: justify;\">Coercition représente la capacité de forcer quelqu’un à agir contre son gré, à révéler des secrets ou à obéir aveuglément. Plus cette Compétence est élevée, plus le personnage sait se montrer intimidant et jouer sur l’autorité qu’il inspire pour briser la volonté de ses interlocuteurs.</p>","niveau":0,"attribut1":"pre","attribut2":"none","attribut3":"none","doublebonus":false,"predilections":[{"name":"Commandement (Présence) ","used":false,"description":"Pour donner des ordres auxquels on obéira sans poser de question. "},{"name":"Interrogatoire (Présence)","used":false,"description":"Pour forcer quelqu'un à révéler des informations, que ce soit par la torture ou à l'aide de techniques de manipulation plus subtiles. "},{"name":"Intimidation (Présence)","used":false,"description":"Pour faire peur, pour convaincre quelqu'un de renoncer à se battre, pour donner l'impression d'être dangereux. "}]},"effects":[],"ownership":{"default":0,"8b7NkRYwYKm5eOMy":3,"wYQCdPQVeRKBJmZI":3},"flags":{"core":{"sourceId":"Compendium.fvtt-hawkmoon-cyd.skills.15IDGG6JoZnRCQtY"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.1.7","coreVersion":"10.291","createdTime":1666620317429,"modifiedTime":1671645635525,"lastModifiedBy":"wYQCdPQVeRKBJmZI"},"folder":null,"sort":0,"_id":"lchi2ulzWdm8j1l7"}
|
||||
{"name":"Nage","type":"competence","img":"systems/fvtt-hawkmoon-cyd/assets/icons/competence.webp","system":{"description":"<p style=\"text-align: justify;\">Nage représente la vitesse (Adresse), mais aussi l’endurance du nageur (Puissance). La natation est une Compétence assez rare dans le monde de Hawkmoon. Un personnage qui n’a plus pied et ne sait pas nager commence à se noyer au bout d’un tour de jeu (soit six secondes). Reportez-vous à la règle de noyade p. 214.</p>\n<p style=\"text-align: justify;\"> </p>\n<h3 style=\"text-align: justify;\"><strong>Prédilections/Maîtrises</strong></h3>\n<ul>\n<li style=\"text-align: justify;\"><strong>Au choix du joueur et du MJ.</strong></li>\n</ul>","niveau":0,"attribut1":"adr","attribut2":"pui","attribut3":"none","doublebonus":false,"predilections":[],"predilections[0]":["Nouvelle prédilection",""],"predilections[1]":["Nouvelle prédilection",""],"predilections[2]":["Nouvelle prédilection",""],"predilections[3]":["Nouvelle prédilection",""]},"effects":[],"ownership":{"default":0,"8b7NkRYwYKm5eOMy":3,"wYQCdPQVeRKBJmZI":3},"flags":{"core":{"sourceId":"Compendium.fvtt-hawkmoon-cyd.skills.Dw7q0dGCoaBy1Smu"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.1.7","coreVersion":"10.291","createdTime":1666620807186,"modifiedTime":1671645639961,"lastModifiedBy":"wYQCdPQVeRKBJmZI"},"folder":null,"sort":0,"_id":"pyeEZFo46NTnV8WK"}
|
||||
{"name":"Mouvements","type":"competence","img":"systems/fvtt-hawkmoon-cyd/assets/icons/competence.webp","system":{"description":"<p style=\"text-align: justify;\">Mouvements indique la capacité du personnage à se déplacer rapidement et longtemps. Cette Compétence représente aussi bien la souplesse et la vivacité des gestes que l’endurance physique et la résistance à l’effort. Plus cette Compétence est élevée, plus le personnage est en forme et peut courir, grimper ou sauter longtemps et rapidement sans se fatiguer.</p>","niveau":0,"attribut1":"adr","attribut2":"pui","attribut3":"none","doublebonus":false,"predilections":[{"name":"Acrobaties (Adresse)","used":true,"description":"Pour faire des figures acrobatiques, sauter en hauteur ou en longueur, jongler, ou encore pour rattraper un objet fragile sans l’abîmer (ou un ustensile dangereux sans se blesser).\n\n"},{"name":"Course (Puissance)","used":false,"description":"Pour sprinter ou pour tenir la distance dans une course d’endurance."},{"name":"Escalade (Puissance) ","used":false,"description":"Pour escalader murs, arbres, etc. Sert également à avancer en étant suspendu à une corde horizontale."}],"predilections[0]":["Nouvelle prédilection",""],"predilections[1]":["Nouvelle prédilection",""],"predilections[2]":["Nouvelle prédilection",""]},"effects":[],"ownership":{"default":0,"8b7NkRYwYKm5eOMy":3,"wYQCdPQVeRKBJmZI":3},"flags":{"core":{"sourceId":"Compendium.fvtt-hawkmoon-cyd.skills.bP7pPSCekexUEf7m"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.1.7","coreVersion":"10.291","createdTime":1666620807186,"modifiedTime":1671645642114,"lastModifiedBy":"wYQCdPQVeRKBJmZI"},"folder":null,"sort":0,"_id":"tFU5yISK6spdNWco"}
|
||||
BIN
assets/fonts/Montserrat-Italic-VariableFont_wght.ttf
Normal file
BIN
assets/fonts/Montserrat-Italic-VariableFont_wght.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/Montserrat-Medium.ttf
Normal file
BIN
assets/fonts/Montserrat-Medium.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/Montserrat-Medium.woff
Normal file
BIN
assets/fonts/Montserrat-Medium.woff
Normal file
Binary file not shown.
BIN
assets/fonts/Montserrat-Thin.woff
Normal file
BIN
assets/fonts/Montserrat-Thin.woff
Normal file
Binary file not shown.
BIN
assets/fonts/Montserrat-VariableFont_wght.ttf
Normal file
BIN
assets/fonts/Montserrat-VariableFont_wght.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/pfeffer-simpelgotisch.bold.otf
Normal file
BIN
assets/fonts/pfeffer-simpelgotisch.bold.otf
Normal file
Binary file not shown.
BIN
assets/fonts/pfeffer-simpelgotisch.regular.otf
Normal file
BIN
assets/fonts/pfeffer-simpelgotisch.regular.otf
Normal file
Binary file not shown.
BIN
assets/fonts/pfeffer-simpelgotisch.regular2.otf
Normal file
BIN
assets/fonts/pfeffer-simpelgotisch.regular2.otf
Normal file
Binary file not shown.
BIN
assets/fonts/pfeffer-simpelgotisch.semibold.otf
Normal file
BIN
assets/fonts/pfeffer-simpelgotisch.semibold.otf
Normal file
Binary file not shown.
BIN
assets/icons/mutation.webp
Normal file
BIN
assets/icons/mutation.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.1 KiB |
BIN
assets/scenes/hawkmoon_map_europe.webp
Normal file
BIN
assets/scenes/hawkmoon_map_europe.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 807 KiB |
BIN
assets/scenes/scenes-CXx90Qk7nXEd2uTh-thumb.webp
Normal file
BIN
assets/scenes/scenes-CXx90Qk7nXEd2uTh-thumb.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.1 KiB |
BIN
assets/scenes/scenes-j6RYn1X7KfhTioX5-thumb.webp
Normal file
BIN
assets/scenes/scenes-j6RYn1X7KfhTioX5-thumb.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.2 KiB |
BIN
assets/ui/landing_page_hawmoon.webp
Normal file
BIN
assets/ui/landing_page_hawmoon.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 384 KiB |
40
lang/fr.json
40
lang/fr.json
@@ -1,25 +1,25 @@
|
||||
{
|
||||
"ACTOR": {
|
||||
"TypePersonnage": "Personnage",
|
||||
"TypeCellule": "Cellule",
|
||||
"TypeCreature": "Créature"
|
||||
"TYPES": {
|
||||
"Actor": {
|
||||
"personnage": "Personnage",
|
||||
"cellule": "Cellule",
|
||||
"creature": "Créature"
|
||||
},
|
||||
"Item": {
|
||||
"artefact": "Artefact",
|
||||
"arme": "Arme",
|
||||
"talent": "Talent",
|
||||
"historique": "Historique",
|
||||
"profil": "Profil",
|
||||
"competence": "Compétence",
|
||||
"protection": "Protection",
|
||||
"monnaie": "Monnaie",
|
||||
"equipement": "Equipement",
|
||||
"ressource": "Ressource",
|
||||
"contact": "Contact",
|
||||
"mutation": "Mutation"
|
||||
}
|
||||
},
|
||||
|
||||
"ITEM": {
|
||||
"TypeArtefact": "Artefact",
|
||||
"TypeArme": "Arme",
|
||||
"TypeTalent": "Talent",
|
||||
"TypeHistorique": "Historique",
|
||||
"TypeProfil": "Profil",
|
||||
"TypeCompetence": "Compétence",
|
||||
"TypeProtection": "Protection",
|
||||
"TypeMonnaie": "Monnaie",
|
||||
"TypeEquipement": "Equipement",
|
||||
"TypeRessource": "Ressource",
|
||||
"TypeContact": "Contact"
|
||||
|
||||
},
|
||||
|
||||
"HAWKMOON": {
|
||||
"ui": {
|
||||
"editContact": "Modifier le contact",
|
||||
|
||||
@@ -7,12 +7,12 @@ import { HawkmoonUtility } from "./hawkmoon-utility.js";
|
||||
import { HawkmoonAutomation } from "./hawkmoon-automation.js";
|
||||
|
||||
/* -------------------------------------------- */
|
||||
export class HawkmoonActorSheet extends ActorSheet {
|
||||
export class HawkmoonActorSheet extends foundry.appv1.sheets.ActorSheet {
|
||||
|
||||
/** @override */
|
||||
static get defaultOptions() {
|
||||
|
||||
return mergeObject(super.defaultOptions, {
|
||||
return foundry.utils.mergeObject(super.defaultOptions, {
|
||||
classes: ["fvtt-hawkmoon-cyd", "sheet", "actor"],
|
||||
template: "systems/fvtt-hawkmoon-cyd/templates/actor-sheet.html",
|
||||
width: 640,
|
||||
@@ -25,7 +25,7 @@ export class HawkmoonActorSheet extends ActorSheet {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async getData() {
|
||||
const objectData = duplicate(this.object)
|
||||
const objectData = foundry.utils.duplicate(this.object)
|
||||
|
||||
let formData = {
|
||||
title: this.title,
|
||||
@@ -39,26 +39,30 @@ export class HawkmoonActorSheet extends ActorSheet {
|
||||
effects: this.object.effects.map(e => foundry.utils.deepClone(e.data)),
|
||||
limited: this.object.limited,
|
||||
skills: this.actor.getSkills(),
|
||||
armes: duplicate(this.actor.getWeapons()),
|
||||
monnaies: duplicate(this.actor.getMonnaies()),
|
||||
protections: duplicate(this.actor.getArmors()),
|
||||
historiques: duplicate(this.actor.getHistoriques() || []),
|
||||
talents: duplicate(this.actor.getTalents() || []),
|
||||
armes: foundry.utils.duplicate(this.actor.getWeapons()),
|
||||
monnaies: foundry.utils.duplicate(this.actor.getMonnaies()),
|
||||
protections: foundry.utils.duplicate(this.actor.getArmors()),
|
||||
historiques: foundry.utils.duplicate(this.actor.getHistoriques() || []),
|
||||
talents: foundry.utils.duplicate(this.actor.getTalents() || []),
|
||||
mutations: foundry.utils.duplicate(this.actor.getMutations() || []),
|
||||
talentsCell: this.getCelluleTalents(),
|
||||
profils: duplicate(this.actor.getProfils() || []),
|
||||
combat: this.actor.getCombatValues(),
|
||||
equipements: duplicate(this.actor.getEquipments()),
|
||||
artefacts: duplicate(this.actor.getArtefacts()),
|
||||
monnaies: duplicate(this.actor.getMonnaies()),
|
||||
profils: foundry.utils.duplicate(this.actor.getProfils() || []),
|
||||
combat: this.actor.getCombatValues(),
|
||||
equipements: foundry.utils.duplicate(this.actor.getEquipments()),
|
||||
artefacts: foundry.utils.duplicate(this.actor.getArtefacts()),
|
||||
richesse: this.actor.computeRichesse(),
|
||||
coupDevastateur: this.actor.items.find(it => it.type =="talent" && it.name.toLowerCase() == "coup devastateur" && !it.system.used),
|
||||
valeurEquipement: this.actor.computeValeurEquipement(),
|
||||
nbCombativite: this.actor.system.sante.nbcombativite,
|
||||
combativiteList: HawkmoonUtility.getCombativiteList(this.actor.system.sante.nbcombativite),
|
||||
initiative: this.actor.getFlag("world", "last-initiative") || -1,
|
||||
description: await TextEditor.enrichHTML(this.object.system.biodata.description, {async: true}),
|
||||
habitat: await TextEditor.enrichHTML(this.object.system.biodata.habitat, {async: true}),
|
||||
description: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.biodata.description, {async: true}),
|
||||
habitat: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.biodata.habitat, {async: true}),
|
||||
options: this.options,
|
||||
owner: this.document.isOwner,
|
||||
editScore: this.options.editScore,
|
||||
isGM: game.user.isGM
|
||||
isGM: game.user.isGM,
|
||||
config: game.system.hawkmoon.config
|
||||
}
|
||||
this.formData = formData;
|
||||
|
||||
@@ -87,14 +91,14 @@ export class HawkmoonActorSheet extends ActorSheet {
|
||||
|
||||
// Everything below here is only needed if the sheet is editable
|
||||
if (!this.options.editable) return;
|
||||
|
||||
|
||||
// Update Inventory Item
|
||||
html.find('.item-edit').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item")
|
||||
let itemId = li.data("item-id")
|
||||
const item = this.actor.items.get( itemId )
|
||||
item.sheet.render(true)
|
||||
})
|
||||
})
|
||||
// Delete Inventory Item
|
||||
html.find('.item-delete').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
@@ -116,7 +120,7 @@ export class HawkmoonActorSheet extends ActorSheet {
|
||||
let value = Number($(event.currentTarget).data("adversite-value"))
|
||||
this.actor.incDecAdversite(adv, value)
|
||||
})
|
||||
|
||||
|
||||
html.find('.quantity-modify').click(event => {
|
||||
const li = $(event.currentTarget).parents(".item")
|
||||
const value = Number($(event.currentTarget).data("quantite-value"))
|
||||
@@ -124,9 +128,9 @@ export class HawkmoonActorSheet extends ActorSheet {
|
||||
})
|
||||
|
||||
html.find('.roll-initiative').click((event) => {
|
||||
this.actor.rollAttribut("pre", true)
|
||||
this.actor.rollAttribut("adr", true)
|
||||
})
|
||||
|
||||
|
||||
html.find('.roll-attribut').click((event) => {
|
||||
const li = $(event.currentTarget).parents(".item")
|
||||
let attrKey = li.data("attr-key")
|
||||
@@ -143,29 +147,46 @@ export class HawkmoonActorSheet extends ActorSheet {
|
||||
let armeId = li.data("item-id")
|
||||
this.actor.rollArmeOffensif(armeId)
|
||||
})
|
||||
|
||||
html.find('.roll-assommer').click((event) => {
|
||||
this.actor.rollAssommer()
|
||||
})
|
||||
html.find('.roll-coup-bas').click((event) => {
|
||||
this.actor.rollCoupBas()
|
||||
})
|
||||
html.find('.roll-immobiliser').click((event) => {
|
||||
this.actor.rollImmobiliser()
|
||||
})
|
||||
html.find('.roll-repousser').click((event) => {
|
||||
this.actor.rollRepousser()
|
||||
})
|
||||
html.find('.roll-desengager').click((event) => {
|
||||
this.actor.rollDesengager()
|
||||
})
|
||||
|
||||
html.find('.roll-arme-degats').click((event) => {
|
||||
const li = $(event.currentTarget).parents(".item")
|
||||
let armeId = li.data("item-id")
|
||||
this.actor.rollArmeDegats(armeId)
|
||||
})
|
||||
|
||||
|
||||
html.find('.item-add').click((event) => {
|
||||
const itemType = $(event.currentTarget).data("type")
|
||||
this.actor.createEmbeddedDocuments('Item', [{ name: `Nouveau ${itemType}`, type: itemType }], { renderSheet: true })
|
||||
})
|
||||
|
||||
|
||||
html.find('.lock-unlock-sheet').click((event) => {
|
||||
this.options.editScore = !this.options.editScore;
|
||||
this.render(true);
|
||||
});
|
||||
});
|
||||
html.find('.item-equip').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
this.actor.equipItem( li.data("item-id") );
|
||||
this.render(true);
|
||||
this.render(true);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/** @override */
|
||||
setPosition(options = {}) {
|
||||
|
||||
@@ -17,8 +17,8 @@ export class HawkmoonActor extends Actor {
|
||||
/**
|
||||
* Override the create() function to provide additional SoS functionality.
|
||||
*
|
||||
* This overrided create() function adds initial items
|
||||
* Namely: Basic skills, money,
|
||||
* This overrided create() function adds initial items
|
||||
* Namely: Basic skills, money,
|
||||
*
|
||||
* @param {Object} data Barebones actor data which this function adds onto.
|
||||
* @param {Object} options (Unused) Additional options which customize the creation workflow.
|
||||
@@ -41,7 +41,11 @@ export class HawkmoonActor extends Actor {
|
||||
const skills = await HawkmoonUtility.loadCompendium("fvtt-hawkmoon-cyd.skills")
|
||||
data.items = skills.map(i => i.toObject())
|
||||
}
|
||||
if (data.type == 'pnj') {
|
||||
if (data.type == 'creature') {
|
||||
const skills = await HawkmoonUtility.loadCompendium("fvtt-hawkmoon-cyd.skills-creatures")
|
||||
data.items = skills.map(i => i.toObject())
|
||||
data.items.push({ name: "Arme naturelle 1", type: 'arme', img: "systems/fvtt-hawkmoon-cyd/assets/icons/melee.webp", system: { typearme: "contact", bonusmaniementoff: 0, seuildefense: 0, degats: "0" } })
|
||||
data.items.push({ name: "Arme naturelle 2", type: 'arme', img: "systems/fvtt-hawkmoon-cyd/assets/icons/melee.webp", system: { typearme: "contact", bonusmaniementoff: 0, seuildefense: 0, degats: "0" } })
|
||||
}
|
||||
|
||||
return super.create(data, options);
|
||||
@@ -63,22 +67,31 @@ export class HawkmoonActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
prepareArme(arme) {
|
||||
arme = duplicate(arme)
|
||||
if (this.type == "cellule") {
|
||||
return arme
|
||||
}
|
||||
|
||||
arme = foundry.utils.duplicate(arme)
|
||||
let combat = this.getCombatValues()
|
||||
if (arme.system.typearme == "contact" || arme.system.typearme == "contactjet") {
|
||||
let bonusDefense = this.getBonusDefenseFromTalents()
|
||||
arme.system.competence = duplicate(this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "mêlée"))
|
||||
arme.system.competence = foundry.utils.duplicate(this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "mêlée"))
|
||||
arme.system.attrKey = "pui"
|
||||
arme.system.totalDegats = arme.system.degats + "+" + combat.bonusDegatsTotal
|
||||
arme.system.totalOffensif = this.system.attributs.pui.value + arme.system.competence.system.niveau + arme.system.bonusmaniementoff
|
||||
arme.system.totalDefensif = combat.defenseTotal + arme.system.competence.system.niveau + arme.system.seuildefense + bonusDefense
|
||||
arme.system.totalOffensif = this.system.attributs.pui.value + arme.system.competence.system.niveau + arme.system.bonusmaniementoff + (this.system.combat.monte ? 3 : 0)
|
||||
arme.system.totalDefensif = combat.defenseTotal + arme.system.competence.system.niveau + arme.system.seuildefense + bonusDefense + (this.system.combat.monte ? 3 : 0)
|
||||
console.log("Arme", arme.system.totalDefensif, combat, arme.system.competence.system.niveau, arme.system.seuildefense, bonusDefense)
|
||||
arme.system.isdefense = true
|
||||
arme.system.isMelee = true
|
||||
arme.system.isDistance = false
|
||||
}
|
||||
if (arme.system.typearme == "jet" || arme.system.typearme == "tir") {
|
||||
arme.system.competence = duplicate(this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "armes à distance"))
|
||||
arme.system.competence = foundry.utils.duplicate(this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "armes à distance"))
|
||||
arme.system.attrKey = "adr"
|
||||
arme.system.totalOffensif = this.system.attributs.adr.value + arme.system.competence.system.niveau + arme.system.bonusmaniementoff
|
||||
arme.system.totalDegats = arme.system.degats
|
||||
arme.system.isMelee = false
|
||||
arme.system.isDistance = true
|
||||
if (arme.system.isdefense) {
|
||||
arme.system.totalDefensif = combat.defenseTotal + arme.system.competence.system.niveau + arme.system.seuildefense
|
||||
}
|
||||
@@ -87,6 +100,11 @@ export class HawkmoonActor extends Actor {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getItemSorted(types) {
|
||||
let items = this.items.filter(item => types.includes(item.type)) || []
|
||||
HawkmoonUtility.sortArrayObjectsByName(items)
|
||||
return items
|
||||
}
|
||||
getWeapons() {
|
||||
let armes = []
|
||||
for (let arme of this.items) {
|
||||
@@ -94,60 +112,45 @@ export class HawkmoonActor extends Actor {
|
||||
armes.push(this.prepareArme(arme))
|
||||
}
|
||||
}
|
||||
HawkmoonUtility.sortArrayObjectsByName(armes)
|
||||
return armes
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
getMonnaies() {
|
||||
return this.items.filter( it => it.type == "monnaie")
|
||||
return this.getItemSorted(["monnaie"])
|
||||
}
|
||||
|
||||
/* ----------------------- --------------------- */
|
||||
addMember( actorId) {
|
||||
let members = duplicate(this.system.members)
|
||||
members.push( {id: actorId} )
|
||||
this.update ({'system.members': members})
|
||||
}
|
||||
async removeMember(actorId) {
|
||||
let members = this.system.members.filter(it => it.id != actorId )
|
||||
this.update ({'system.members': members})
|
||||
}
|
||||
|
||||
/* ----------------------- --------------------- */
|
||||
getEquipments() {
|
||||
return this.items.filter(item => item.type == "equipement")
|
||||
return this.getItemSorted(["equipement"])
|
||||
}
|
||||
/* ----------------------- --------------------- */
|
||||
getArtefacts() {
|
||||
return this.items.filter(item => item.type == "artefact")
|
||||
return this.getItemSorted(["artefact"])
|
||||
}
|
||||
/* ----------------------- --------------------- */
|
||||
getMonnaies() {
|
||||
return this.items.filter(item => item.type == "monnaie")
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
getArmors() {
|
||||
return this.items.filter(item => item.type == "protection")
|
||||
return this.getItemSorted(["protection"])
|
||||
}
|
||||
getHistoriques() {
|
||||
return this.items.filter(item => item.type == "historique")
|
||||
return this.getItemSorted(["historique"])
|
||||
}
|
||||
getProfils() {
|
||||
return this.items.filter(item => item.type == "profil")
|
||||
return this.getItemSorted(["profil"])
|
||||
}
|
||||
getTalents() {
|
||||
return this.items.filter(item => item.type == "talent")
|
||||
return this.getItemSorted(["talent"])
|
||||
}
|
||||
getRessources() {
|
||||
return this.items.filter(item => item.type == "ressource")
|
||||
return this.getItemSorted(["ressource"])
|
||||
}
|
||||
getContacts() {
|
||||
return this.items.filter(item => item.type == "contact")
|
||||
return this.getItemSorted(["contact"])
|
||||
}
|
||||
getMutations() {
|
||||
return this.getItemSorted(["mutation"])
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getSkills() {
|
||||
let comp = []
|
||||
for (let item of this.items) {
|
||||
item = duplicate(item)
|
||||
item = foundry.utils.duplicate(item)
|
||||
if (item.type == "competence") {
|
||||
item.system.attribut1total = item.system.niveau + (this.system.attributs[item.system.attribut1]?.value || 0)
|
||||
item.system.attribut2total = item.system.niveau + (this.system.attributs[item.system.attribut2]?.value || 0)
|
||||
@@ -163,22 +166,24 @@ export class HawkmoonActor extends Actor {
|
||||
comp.push(item)
|
||||
}
|
||||
}
|
||||
return comp.sort(function (a, b) {
|
||||
let fa = a.name.toLowerCase(),
|
||||
fb = b.name.toLowerCase();
|
||||
if (fa < fb) {
|
||||
return -1;
|
||||
}
|
||||
if (fa > fb) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
})
|
||||
HawkmoonUtility.sortArrayObjectsByName(comp)
|
||||
return comp
|
||||
}
|
||||
|
||||
/* ----------------------- --------------------- */
|
||||
addMember(actorId) {
|
||||
let members = foundry.utils.duplicate(this.system.members)
|
||||
members.push({ id: actorId })
|
||||
this.update({ 'system.members': members })
|
||||
}
|
||||
async removeMember(actorId) {
|
||||
let members = this.system.members.filter(it => it.id != actorId)
|
||||
this.update({ 'system.members': members })
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getDefenseBase() {
|
||||
return Math.max(this.system.attributs.tre.value, this.system.attributs.pui.value)
|
||||
return Math.max(this.system.attributs.tre.value, this.system.attributs.adr.value)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -188,7 +193,7 @@ export class HawkmoonActor extends Actor {
|
||||
/* -------------------------------------------- */
|
||||
getProtection() {
|
||||
let equipProtection = 0
|
||||
for(let armor in this.items) {
|
||||
for (let armor of this.items) {
|
||||
if (armor.type == "protection" && armor.system.equipped) {
|
||||
equipProtection += Number(armor.system.protection)
|
||||
}
|
||||
@@ -201,6 +206,20 @@ export class HawkmoonActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getCombatValues() {
|
||||
if (this.type == "cellule") {
|
||||
return {
|
||||
initBase: 0,
|
||||
initTotal: 0,
|
||||
bonusDegats: 0,
|
||||
bonusDegatsTotal: 0,
|
||||
vitesseBase: 0,
|
||||
vitesseTotal: 0,
|
||||
defenseBase: 0,
|
||||
protection: 0,
|
||||
defenseTotal: 0
|
||||
}
|
||||
}
|
||||
|
||||
let combat = {
|
||||
initBase: this.system.attributs.adr.value,
|
||||
initTotal: this.system.attributs.adr.value + this.system.combat.initbonus,
|
||||
@@ -209,8 +228,8 @@ export class HawkmoonActor extends Actor {
|
||||
vitesseBase: this.getVitesseBase(),
|
||||
vitesseTotal: this.getVitesseBase() + this.system.combat.vitessebonus,
|
||||
defenseBase: this.getDefenseBase(),
|
||||
protection : this.getProtection(),
|
||||
defenseTotal: this.getDefenseBase() + this.system.combat.defensebonus + this.getProtection() - this.getTotalAdversite()
|
||||
protection: this.getProtection(),
|
||||
defenseTotal: this.getDefenseBase() + this.system.combat.defensebonus + this.getProtection() - this.getTotalAdversite() + (this.system.combat.defensetotale ? 3 : 0)
|
||||
}
|
||||
return combat
|
||||
}
|
||||
@@ -229,26 +248,33 @@ export class HawkmoonActor extends Actor {
|
||||
|
||||
if (this.type == 'personnage') {
|
||||
let talentBonus = this.getVigueurBonus()
|
||||
let vigueur = Math.floor((this.system.attributs.pui.value + this.system.attributs.tre.value) / 2) + talentBonus
|
||||
let vigueur = Math.floor((this.system.attributs.pui.value + this.system.attributs.tre.value) / 2) + talentBonus + this.system.sante.vigueurmodifier
|
||||
if (vigueur != this.system.sante.vigueur) {
|
||||
this.update({ 'system.sante.vigueur': vigueur })
|
||||
}
|
||||
}
|
||||
|
||||
super.prepareDerivedData()
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
_preUpdate(changed, options, user) {
|
||||
|
||||
if (changed?.system?.sante?.etat && changed?.system?.sante?.etat != this.system.sante.etat) {
|
||||
setTimeout(() => {
|
||||
this.processCombativite(changed.system.sante)
|
||||
}, 800)
|
||||
}
|
||||
super._preUpdate(changed, options, user);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
_onUpdate(data, options, user) {
|
||||
super._onUpdate(data, options, user);
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
getItemById(id) {
|
||||
let item = this.items.find(item => item.id == id);
|
||||
if (item) {
|
||||
item = duplicate(item)
|
||||
item = foundry.utils.duplicate(item)
|
||||
}
|
||||
return item;
|
||||
}
|
||||
@@ -281,7 +307,7 @@ export class HawkmoonActor extends Actor {
|
||||
checkAttribut(attribut, minLevel) {
|
||||
let attr = this.system.attributs.find(at => at.labelnorm == attribut.toLowerCase())
|
||||
if (attr && attr.value >= minLevel) {
|
||||
return { isValid: true, attr: duplicate(attr) }
|
||||
return { isValid: true, attr: foundry.utils.duplicate(attr) }
|
||||
}
|
||||
return { isValid: false }
|
||||
}
|
||||
@@ -289,11 +315,11 @@ export class HawkmoonActor extends Actor {
|
||||
checkAttributOrCompetenceLevel(compName, minLevel) {
|
||||
let comp = this.items.find(i => i.type == "competence" && i.name.toLowerCase() == compName.toLowerCase() && i.system.niveau >= minLevel)
|
||||
if (comp) {
|
||||
return { isValid: true, item: duplicate(comp) }
|
||||
return { isValid: true, item: foundry.utils.duplicate(comp) }
|
||||
} else {
|
||||
for (let attrKey in this.system.attributs) {
|
||||
if (this.system.attributs[attrKey].label.toLowerCase() == compName.toLowerCase() && this.system.attributs[attrKey].value >= minLevel) {
|
||||
return { isValid: true, item: duplicate(this.system.attributs[attrKey]) }
|
||||
return { isValid: true, item: foundry.utils.duplicate(this.system.attributs[attrKey]) }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -303,7 +329,7 @@ export class HawkmoonActor extends Actor {
|
||||
addCompetenceBonus(compName, bonus, baCost) {
|
||||
let comp = this.items.find(i => i.type == "competence" && i.name.toLowerCase() == compName.toLowerCase())
|
||||
if (comp) {
|
||||
comp = duplicate(comp)
|
||||
comp = foundry.utils.duplicate(comp)
|
||||
comp.system.bonus = bonus
|
||||
comp.system.baCost = baCost
|
||||
return { isValid: true, item: comp }
|
||||
@@ -382,13 +408,45 @@ export class HawkmoonActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getBonusDegats() {
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
changeEtatCombativite(value) {
|
||||
if (value === "vaincu") {
|
||||
value = 200
|
||||
}
|
||||
let sante = foundry.utils.duplicate(this.system.sante)
|
||||
sante.etat += Number(value)
|
||||
sante.etat = Math.max(sante.etat, 0)
|
||||
sante.etat = Math.min(sante.etat, this.system.sante.nbcombativite)
|
||||
this.update({ 'system.sante': sante })
|
||||
if (sante.etat == this.system.sante.nbcombativite) {
|
||||
ChatMessage.create({ content: `<strong>${this.name} est vaincu !</strong>` })
|
||||
}
|
||||
// Duplicated ! this.processCombativite(sante)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
processCombativite(sante) {
|
||||
sante = sante || foundry.utils.duplicate(this.system.sante)
|
||||
// Gestion des états affaibli et très affaibli
|
||||
if (sante.etat == this.system.sante.nbcombativite - 2 || sante.etat == this.system.sante.nbcombativite - 1) {
|
||||
if (sante.etat == this.system.sante.nbcombativite - 2 && this.items.find(item => item.type == "talent" && item.name.toLowerCase() == "encaissement")) {
|
||||
ChatMessage.create({ content: `<strong>${this.name} ne subit pas les 2 adversités rouge grâce à Encaissement. Pensez à les ajouter à la fin de la scène !</strong>` })
|
||||
} else if (sante.etat == this.system.sante.nbcombativite - 1 && this.items.find(item => item.type == "talent" && item.name.toLowerCase().includes("vaillant"))) {
|
||||
ChatMessage.create({ content: `<strong>${this.name} ne subit pas les 2 adversités rouge grâce à Vaillant. Pensez à les ajouter à la fin de la scène !</strong>` })
|
||||
} else {
|
||||
ChatMessage.create({ content: `<strong>${this.name} subit 2 adversités rouge !</strong>` })
|
||||
this.incDecAdversite("rouge", 2)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async equipGear(equipmentId) {
|
||||
let item = this.items.find(item => item.id == equipmentId);
|
||||
if (item && item.system.data) {
|
||||
if (item?.system?.data) {
|
||||
let update = { _id: item.id, "system.equipped": !item.system.equipped };
|
||||
await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
|
||||
}
|
||||
@@ -398,13 +456,13 @@ export class HawkmoonActor extends Actor {
|
||||
getSubActors() {
|
||||
let subActors = [];
|
||||
for (let id of this.system.subactors) {
|
||||
subActors.push(duplicate(game.actors.get(id)));
|
||||
subActors.push(foundry.utils.duplicate(game.actors.get(id)));
|
||||
}
|
||||
return subActors;
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
async addSubActor(subActorId) {
|
||||
let subActors = duplicate(this.system.subactors);
|
||||
let subActors = foundry.utils.duplicate(this.system.subactors);
|
||||
subActors.push(subActorId);
|
||||
await this.update({ 'system.subactors': subActors });
|
||||
}
|
||||
@@ -426,9 +484,10 @@ export class HawkmoonActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async incDecAdversite(adv, incDec = 0) {
|
||||
let adversite = duplicate(this.system.adversite)
|
||||
let adversite = foundry.utils.duplicate(this.system.adversite)
|
||||
adversite[adv] += Number(incDec)
|
||||
adversite[adv] = Math.max(adversite[adv], 0)
|
||||
adversite[adv] = Math.min(adversite[adv], 20)
|
||||
this.update({ 'system.adversite': adversite })
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
@@ -437,34 +496,34 @@ export class HawkmoonActor extends Actor {
|
||||
if (objetQ) {
|
||||
let newQ = objetQ.system.quantite + incDec
|
||||
newQ = Math.max(newQ, 0)
|
||||
const updated = await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'system.quantite': newQ }]); // pdates one EmbeddedEntity
|
||||
await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'system.quantite': newQ }]); // pdates one EmbeddedEntity
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
computeRichesse() {
|
||||
let valueSC = 0
|
||||
for(let monnaie of this.items) {
|
||||
for (let monnaie of this.items) {
|
||||
if (monnaie.type == "monnaie") {
|
||||
valueSC += Number(monnaie.system.prixsc) * Number(monnaie.system.quantite)
|
||||
valueSC += Number(monnaie.system.prixsc) * Number(monnaie.system.quantite)
|
||||
}
|
||||
}
|
||||
return HawkmoonUtility.computeMonnaieDetails( valueSC)
|
||||
return HawkmoonUtility.computeMonnaieDetails(valueSC)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
computeValeurEquipement() {
|
||||
let valueSC = 0
|
||||
for(let equip of this.items) {
|
||||
for (let equip of this.items) {
|
||||
if (equip.type == "equipement" || equip.type == "arme" || equip.type == "protection") {
|
||||
valueSC += Number(equip.system.prixsc) * Number(equip.system.quantite ?? 1)
|
||||
valueSC += (Number(equip.system.prixca) * Number(equip.system.quantite ?? 1)) * 20
|
||||
valueSC += (Number(equip.system.prixpo) * Number(equip.system.quantite ?? 1)) * 400
|
||||
valueSC += Number(equip.system.prixsc) * Number(equip.system.quantite ?? 1)
|
||||
valueSC += (Number(equip.system.prixca) * Number(equip.system.quantite ?? 1)) * 20
|
||||
valueSC += (Number(equip.system.prixpo) * Number(equip.system.quantite ?? 1)) * 400
|
||||
}
|
||||
}
|
||||
return HawkmoonUtility.computeMonnaieDetails( valueSC)
|
||||
return HawkmoonUtility.computeMonnaieDetails(valueSC)
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getCompetence(compId) {
|
||||
return this.items.get(compId)
|
||||
@@ -473,7 +532,7 @@ export class HawkmoonActor extends Actor {
|
||||
/* -------------------------------------------- */
|
||||
async setPredilectionUsed(compId, predIdx) {
|
||||
let comp = this.items.get(compId)
|
||||
let pred = duplicate(comp.system.predilections)
|
||||
let pred = foundry.utils.duplicate(comp.system.predilections)
|
||||
pred[predIdx].used = true
|
||||
await this.updateEmbeddedDocuments('Item', [{ _id: compId, 'system.predilections': pred }])
|
||||
}
|
||||
@@ -484,18 +543,35 @@ export class HawkmoonActor extends Actor {
|
||||
return init || -1
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getBestAttackValue() {
|
||||
let attackList = this.items.filter(item => (item.type == "arme" || item.type == "talent") && item.system.equipped)
|
||||
let maxOff = 0
|
||||
let bestArme
|
||||
for (let arme of attackList) {
|
||||
if (arme.type == "arme") {
|
||||
arme = this.prepareArme(arme)
|
||||
}
|
||||
if (arme.system.totalOffensif > maxOff) {
|
||||
maxOff = arme.system.totalOffensif
|
||||
bestArme = foundry.utils.duplicate(arme)
|
||||
}
|
||||
}
|
||||
return bestArme
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
getBestDefenseValue() {
|
||||
let defenseList = this.items.filter(item => (item.type == "arme") && item.system.equipped)
|
||||
let maxDef = 0
|
||||
let bestArme
|
||||
for (let arme of defenseList) {
|
||||
if (arme.type == "arme" ) {
|
||||
if (arme.type == "arme") {
|
||||
arme = this.prepareArme(arme)
|
||||
}
|
||||
if (arme.system.totalDefensif > maxDef) {
|
||||
maxDef = arme.system.totalDefensif
|
||||
bestArme = duplicate(arme)
|
||||
bestArme = foundry.utils.duplicate(arme)
|
||||
}
|
||||
}
|
||||
return bestArme
|
||||
@@ -510,7 +586,7 @@ export class HawkmoonActor extends Actor {
|
||||
for (let auto of talent.system.automations) {
|
||||
if (auto.eventtype === "prepare-roll") {
|
||||
if (auto.competence.toLowerCase() == competence.name.toLowerCase()) {
|
||||
talent = duplicate(talent)
|
||||
talent = foundry.utils.duplicate(talent)
|
||||
talent.system.bonus = auto.bonus
|
||||
talent.system.baCost = auto.baCost
|
||||
talents.push(talent)
|
||||
@@ -541,22 +617,34 @@ export class HawkmoonActor extends Actor {
|
||||
rollData.nbBA = this.system.bonneaventure.actuelle
|
||||
rollData.nbAdversites = this.getTotalAdversite()
|
||||
rollData.talents = []
|
||||
rollData.attrKey2 = "none"
|
||||
rollData.coupDevastateur = this.items.find(it => it.type == "talent" && it.name.toLowerCase() == "coup dévastateur" && !it.system.used)
|
||||
rollData.hasAmbidextre = this.items.find(it => it.type == "talent" && it.name.toLowerCase() == "ambidextre")
|
||||
rollData.hasFeinte = this.system.bonneaventure.actuelle > 0 && this.items.find(it => it.type == "talent" && it.name.toLowerCase() == "feinte")
|
||||
rollData.isMonte = this.system.combat.monte
|
||||
rollData.config = game.system.hawkmoon.config
|
||||
|
||||
if (attrKey) {
|
||||
rollData.attrKey = attrKey
|
||||
if (attrKey != "tochoose") {
|
||||
rollData.actionImg = "systems/fvtt-hawkmoon-cyd/assets/icons/" + this.system.attributs[attrKey].labelnorm + ".webp"
|
||||
rollData.attr = duplicate(this.system.attributs[attrKey])
|
||||
rollData.attr = foundry.utils.duplicate(this.system.attributs[attrKey])
|
||||
}
|
||||
}
|
||||
if (compId) {
|
||||
rollData.competence = duplicate(this.items.get(compId) || {})
|
||||
rollData.maitrises = rollData.competence.system.predilections.filter(p => p.maitrise)
|
||||
rollData.competence = foundry.utils.duplicate(this.items.get(compId) || {})
|
||||
let maitrises = [{ key: "none", label: "Aucune" }]
|
||||
rollData.competence.system.predilections.forEach(function (item) {
|
||||
if (item.maitrise) {
|
||||
maitrises.push({ key: item.id, label: item.name });
|
||||
}
|
||||
})
|
||||
rollData.maitrises = maitrises // rollData.competence.system.predilections.filter(p => p.maitrise)
|
||||
rollData.actionImg = rollData.competence?.img
|
||||
rollData.talents = this.searchRelevantTalents(rollData.competence)
|
||||
}
|
||||
if (compName) {
|
||||
rollData.competence = duplicate(this.items.find(item => item.name.toLowerCase() == compName.toLowerCase()) || {})
|
||||
rollData.competence = foundry.utils.duplicate(this.items.find(item => item.name.toLowerCase() == compName.toLowerCase()) || {})
|
||||
rollData.actionImg = rollData.competence?.img
|
||||
}
|
||||
return rollData
|
||||
@@ -564,8 +652,8 @@ export class HawkmoonActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async rollAttribut(attrKey, isInit = false) {
|
||||
let rollData = this.getCommonRollData(attrKey)
|
||||
rollData.multiplier = (isInit)? 1 : 2
|
||||
let rollData = this.getCommonRollData(attrKey)
|
||||
rollData.multiplier = (isInit) ? 1 : 2
|
||||
rollData.isInit = isInit
|
||||
let rollDialog = await HawkmoonRollDialog.create(this, rollData)
|
||||
rollDialog.render(true)
|
||||
@@ -593,26 +681,102 @@ export class HawkmoonActor extends Actor {
|
||||
let rollDialog = await HawkmoonRollDialog.create(this, rollData)
|
||||
rollDialog.render(true)
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
async rollAssommer() {
|
||||
let rollData = this.getCommonRollData("pui", undefined, "Filouterie")
|
||||
rollData.assomer = true
|
||||
rollData.conditionsCommunes = true
|
||||
HawkmoonUtility.updateWithTarget(rollData)
|
||||
let rollDialog = await HawkmoonRollDialog.create(this, rollData)
|
||||
rollDialog.render(true)
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
async rollCoupBas() {
|
||||
let rollData = this.getCommonRollData("pui", undefined, "Mêlée")
|
||||
rollData.coupBas = true
|
||||
rollData.conditionsCommunes = true
|
||||
HawkmoonUtility.updateWithTarget(rollData)
|
||||
let rollDialog = await HawkmoonRollDialog.create(this, rollData)
|
||||
rollDialog.render(true)
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
async rollImmobiliser() {
|
||||
let rollData = this.getCommonRollData("pui", undefined, "Mêlée")
|
||||
rollData.immobiliser = true
|
||||
rollData.conditionsCommunes = true
|
||||
rollData.cibleconsciente = true
|
||||
HawkmoonUtility.updateWithTarget(rollData)
|
||||
let rollDialog = await HawkmoonRollDialog.create(this, rollData)
|
||||
rollDialog.render(true)
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
async rollRepousser() {
|
||||
let rollData = this.getCommonRollData("pui", undefined, "Mêlée")
|
||||
rollData.repousser = true
|
||||
rollData.conditionsCommunes = true
|
||||
rollData.cibleconsciente = true
|
||||
HawkmoonUtility.updateWithTarget(rollData)
|
||||
let rollDialog = await HawkmoonRollDialog.create(this, rollData)
|
||||
rollDialog.render(true)
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
async rollDesengager() {
|
||||
let rollData = this.getCommonRollData("adr", undefined, "Mouvements")
|
||||
rollData.desengager = true
|
||||
rollData.conditionsCommunes = true
|
||||
HawkmoonUtility.updateWithTarget(rollData)
|
||||
let rollDialog = await HawkmoonRollDialog.create(this, rollData)
|
||||
rollDialog.render(true)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async rollArmeDegats(armeId, targetVigueur = undefined) {
|
||||
async rollArmeDegats(armeId, targetVigueur = undefined, rollDataInput = undefined) {
|
||||
let arme = this.items.get(armeId)
|
||||
if (arme.type == "arme") {
|
||||
arme = this.prepareArme(arme)
|
||||
}
|
||||
console.log("DEGATS", arme)
|
||||
let roll = new Roll( "1d10+"+arme.system.totalDegats).roll({ async: false })
|
||||
console.log("DEGATS", arme, targetVigueur, rollDataInput)
|
||||
let roll
|
||||
let bonus = 0
|
||||
let bonus2 = 0
|
||||
|
||||
if (rollDataInput?.applyCoupDevastateur) {
|
||||
bonus2 = Math.floor(this.system.attributs.pui.value / 2)
|
||||
let talent = this.items.find(item => item.type == "talent" && item.name.toLowerCase() == "coup dévastateur")
|
||||
this.updateEmbeddedDocuments('Item', [{ _id: talent.id, 'system.used': true }])
|
||||
}
|
||||
|
||||
if (rollDataInput?.isHeroique) {
|
||||
if (rollDataInput?.attaqueCharge) {
|
||||
bonus = 5
|
||||
}
|
||||
if (rollDataInput?.chargeCavalerie) {
|
||||
bonus = 6
|
||||
}
|
||||
roll = await new Roll("2d10rr10+" + arme.system.totalDegats + "+" + bonus + "+" + bonus2).roll()
|
||||
} else {
|
||||
if (rollDataInput?.attaqueCharge) {
|
||||
bonus = 3
|
||||
}
|
||||
if (rollDataInput?.chargeCavalerie) {
|
||||
bonus = 4
|
||||
}
|
||||
roll = await new Roll("1d10+" + arme.system.totalDegats + "+" + bonus + "+" + bonus2).roll()
|
||||
}
|
||||
await HawkmoonUtility.showDiceSoNice(roll, game.settings.get("core", "rollMode"));
|
||||
let nbEtatPerdus = 0
|
||||
let nbEtatPerdus = 0
|
||||
if (targetVigueur) {
|
||||
nbEtatPerdus = Math.floor(roll.total / targetVigueur)
|
||||
}
|
||||
//console.log(roll)
|
||||
let rollData = {
|
||||
arme: arme,
|
||||
finalResult: roll.total,
|
||||
formula: roll.formula,
|
||||
alias: this.name,
|
||||
actorImg: this.img,
|
||||
actorId: this.id,
|
||||
defenderTokenId: rollDataInput?.defenderTokenId,
|
||||
actionImg: arme.img,
|
||||
targetVigueur: targetVigueur,
|
||||
nbEtatPerdus: nbEtatPerdus
|
||||
@@ -621,5 +785,9 @@ export class HawkmoonActor extends Actor {
|
||||
content: await renderTemplate(`systems/fvtt-hawkmoon-cyd/templates/chat-degats-result.html`, rollData)
|
||||
})
|
||||
|
||||
if (rollDataInput?.defenderTokenId && nbEtatPerdus) {
|
||||
HawkmoonUtility.applyCombativite(rollDataInput, nbEtatPerdus)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,10 +14,10 @@ export class HawkmoonAutomation {
|
||||
this.__objectTypes = { }
|
||||
|
||||
Object.entries(game.data.model.Actor).forEach(kv => {
|
||||
this.__objectTypes[kv[0]] = duplicate(kv[1])
|
||||
this.__objectTypes[kv[0]] = foundry.utils.duplicate(kv[1])
|
||||
})
|
||||
Object.entries(game.data.model.Item).forEach(kv => {
|
||||
this.__objectTypes[kv[0]] = duplicate(kv[1])
|
||||
this.__objectTypes[kv[0]] = foundry.utils.duplicate(kv[1])
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -7,15 +7,15 @@ import { HawkmoonUtility } from "./hawkmoon-utility.js";
|
||||
import { HawkmoonAutomation } from "./hawkmoon-automation.js";
|
||||
|
||||
/* -------------------------------------------- */
|
||||
const __ALLOWED_ITEM_CELLULE = { "talent": 1, "ressource": 1, "contact": 1}
|
||||
const __ALLOWED_ITEM_CELLULE = { "talent": 1, "ressource": 1, "contact": 1, "equipement": 1, "protection": 1, "artefact": 1, "arme": 1, "monnaie": 1 }
|
||||
|
||||
/* -------------------------------------------- */
|
||||
export class HawkmoonCelluleSheet extends ActorSheet {
|
||||
export class HawkmoonCelluleSheet extends foundry.appv1.sheets.ActorSheet {
|
||||
|
||||
/** @override */
|
||||
static get defaultOptions() {
|
||||
|
||||
return mergeObject(super.defaultOptions, {
|
||||
return foundry.utils.mergeObject(super.defaultOptions, {
|
||||
classes: ["fvtt-hawkmoon-cyd", "sheet", "actor"],
|
||||
template: "systems/fvtt-hawkmoon-cyd/templates/cellule-sheet.html",
|
||||
width: 640,
|
||||
@@ -28,7 +28,7 @@ export class HawkmoonCelluleSheet extends ActorSheet {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async getData() {
|
||||
const objectData = duplicate(this.object)
|
||||
const objectData = foundry.utils.duplicate(this.object)
|
||||
|
||||
let formData = {
|
||||
title: this.title,
|
||||
@@ -41,15 +41,23 @@ export class HawkmoonCelluleSheet extends ActorSheet {
|
||||
system: objectData.system,
|
||||
effects: this.object.effects.map(e => foundry.utils.deepClone(e.data)),
|
||||
limited: this.object.limited,
|
||||
talents: duplicate(this.actor.getTalents() || {}),
|
||||
ressources: duplicate(this.actor.getRessources()),
|
||||
contacts: duplicate(this.actor.getContacts()),
|
||||
talents: foundry.utils.duplicate(this.actor.getTalents() || {}),
|
||||
ressources: foundry.utils.duplicate(this.actor.getRessources()),
|
||||
contacts: foundry.utils.duplicate(this.actor.getContacts()),
|
||||
members: this.getMembers(),
|
||||
equipements: foundry.utils.duplicate(this.actor.getEquipments()),
|
||||
artefacts: foundry.utils.duplicate(this.actor.getArtefacts()),
|
||||
armes: foundry.utils.duplicate(this.actor.getWeapons()),
|
||||
monnaies: foundry.utils.duplicate(this.actor.getMonnaies()),
|
||||
protections: foundry.utils.duplicate(this.actor.getArmors()),
|
||||
richesse: this.actor.computeRichesse(),
|
||||
valeurEquipement: this.actor.computeValeurEquipement(),
|
||||
description: await TextEditor.enrichHTML(this.object.system.description, { async: true }),
|
||||
options: this.options,
|
||||
owner: this.document.isOwner,
|
||||
editScore: this.options.editScore,
|
||||
isGM: game.user.isGM
|
||||
isGM: game.user.isGM,
|
||||
config: game.system.hawkmoon.config
|
||||
}
|
||||
this.formData = formData;
|
||||
|
||||
@@ -87,7 +95,7 @@ export class HawkmoonCelluleSheet extends ActorSheet {
|
||||
let actorId = li.data("actor-id")
|
||||
this.actor.removeMember(actorId)
|
||||
})
|
||||
|
||||
|
||||
// Update Inventory Item
|
||||
html.find('.item-edit').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item")
|
||||
@@ -109,15 +117,15 @@ export class HawkmoonCelluleSheet extends ActorSheet {
|
||||
let value = ev.currentTarget.value
|
||||
this.actor.editItemField(itemId, itemType, itemField, dataType, value)
|
||||
})
|
||||
|
||||
html.find('.quantity-minus').click(event => {
|
||||
const li = $(event.currentTarget).parents(".item");
|
||||
this.actor.incDecQuantity(li.data("item-id"), -1);
|
||||
});
|
||||
html.find('.quantity-plus').click(event => {
|
||||
const li = $(event.currentTarget).parents(".item");
|
||||
this.actor.incDecQuantity(li.data("item-id"), +1);
|
||||
});
|
||||
html.find('.quantity-modify').click(event => {
|
||||
const li = $(event.currentTarget).parents(".item")
|
||||
const value = Number($(event.currentTarget).data("quantite-value"))
|
||||
this.actor.incDecQuantity( li.data("item-id"), value );
|
||||
})
|
||||
html.find('.item-add').click((event) => {
|
||||
const itemType = $(event.currentTarget).data("type")
|
||||
this.actor.createEmbeddedDocuments('Item', [{ name: `Nouveau ${itemType}`, type: itemType }], { renderSheet: true })
|
||||
})
|
||||
|
||||
html.find('.lock-unlock-sheet').click((event) => {
|
||||
this.options.editScore = !this.options.editScore;
|
||||
@@ -128,7 +136,7 @@ export class HawkmoonCelluleSheet extends ActorSheet {
|
||||
/* -------------------------------------------- */
|
||||
async _onDropActor(event, dragData) {
|
||||
const actor = fromUuidSync(dragData.uuid)
|
||||
if (actor) {
|
||||
if (actor) {
|
||||
this.actor.addMember(actor.id)
|
||||
} else {
|
||||
ui.notifications.warn("Cet acteur n'a pas été trouvé.")
|
||||
@@ -148,7 +156,7 @@ export class HawkmoonCelluleSheet extends ActorSheet {
|
||||
super._onDropItem(event, dragData)
|
||||
return
|
||||
}
|
||||
ui.notifications("Ce type d'item n'est pas autorisé sur une Cellule.")
|
||||
ui.notification.info("Ce type d'item n'est pas autorisé sur une Cellule.")
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -6,9 +6,9 @@ export class HawkmoonCombat extends Combat {
|
||||
/* -------------------------------------------- */
|
||||
async rollInitiative(ids, formula = undefined, messageOptions = {} ) {
|
||||
ids = typeof ids === "string" ? [ids] : ids;
|
||||
for (let cId = 0; cId < ids.length; cId++) {
|
||||
const c = this.combatants.get(ids[cId]);
|
||||
//console.log("Init for combattant", c )
|
||||
for (let cId of ids) {
|
||||
const c = this.combatants.get(cId);
|
||||
console.log("Init for combattant", c, ids)
|
||||
let id = c._id || c.id
|
||||
let initValue = c.actor ? c.actor.getInitiativeScore() : 0
|
||||
await this.updateEmbeddedDocuments("Combatant", [ { _id: id, initiative: initValue } ]);
|
||||
@@ -21,5 +21,4 @@ export class HawkmoonCombat extends Combat {
|
||||
_onUpdate(changed, options, userId) {
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
143
modules/hawkmoon-config.js
Normal file
143
modules/hawkmoon-config.js
Normal file
@@ -0,0 +1,143 @@
|
||||
export const HAWKMOON_CONFIG = {
|
||||
|
||||
optionsDifficulte: [
|
||||
{ key: "0", label: "Aucune/Inconnue" },
|
||||
{ key: "5", label: "Facile (5)" },
|
||||
{ key: "6", label: "(6)" },
|
||||
{ key: "7", label: "(7)" },
|
||||
{ key: "8", label: "(8)" },
|
||||
{ key: "9", label: "(9)" },
|
||||
{ key: "10", label: "Moyenne (10)" },
|
||||
{ key: "11", label: "(11)" },
|
||||
{ key: "12", label: "(12)" },
|
||||
{ key: "13", label: "(13)" },
|
||||
{ key: "14", label: "(14)" },
|
||||
{ key: "15", label: "Ardue (15)" },
|
||||
{ key: "16", label: "(16)" },
|
||||
{ key: "17", label: "(17)" },
|
||||
{ key: "18", label: "(18)" },
|
||||
{ key: "19", label: "(19)" },
|
||||
{ key: "20", label: "Hasardeuse (20)" },
|
||||
{ key: "21", label: "(21)" },
|
||||
{ key: "22", label: "(22)" },
|
||||
{ key: "23", label: "(23)" },
|
||||
{ key: "24", label: "(24)" },
|
||||
{ key: "25", label: "Insensée (25)" },
|
||||
{ key: "26", label: "(26)" },
|
||||
{ key: "27", label: "(27)" },
|
||||
{ key: "28", label: "(28)" },
|
||||
{ key: "29", label: "(29)" },
|
||||
{ key: "30", label: "Pure Folie (30)" }
|
||||
],
|
||||
optionsDistanceTir: [
|
||||
{ key: "porteecourte", label: "Courte ({protectionDefenseur}+5)" },
|
||||
{ key: "porteemoyenne", label: "Moyenne ({protectionDefenseur}+9)" },
|
||||
{ key: "porteelongue", label: "Longue ({protectionDefenseur}+14)" }
|
||||
],
|
||||
optionsBonusMalus: [
|
||||
{ key: "-10", label: "-10" },
|
||||
{ key: "-9", label: "-9" },
|
||||
{ key: "-8", label: "-8" },
|
||||
{ key: "-7", label: "-7" },
|
||||
{ key: "-6", label: "-6" },
|
||||
{ key: "-5", label: "-5" },
|
||||
{ key: "-4", label: "-4" },
|
||||
{ key: "-3", label: "-3" },
|
||||
{ key: "-2", label: "-2" },
|
||||
{ key: "-1", label: "-1" },
|
||||
{ key: "0", label: "0" },
|
||||
{ key: "1", label: "+1" },
|
||||
{ key: "2", label: "+2" },
|
||||
{ key: "3", label: "+3" },
|
||||
{ key: "4", label: "+4" },
|
||||
{ key: "5", label: "+5" },
|
||||
{ key: "6", label: "+6" },
|
||||
{ key: "7", label: "+7" },
|
||||
{ key: "8", label: "+8" },
|
||||
{ key: "9", label: "+9" },
|
||||
{ key: "10", label: "+10" }
|
||||
],
|
||||
optionsTailleCible: [
|
||||
{ key: "normal", label: "Normal (SD+0)" },
|
||||
{ key: "main", label: "Main (SD+10)" },
|
||||
{ key: "enfant", label: "Enfant (SD+3)" },
|
||||
{ key: "maison", label: "Maison (SD-10)" }
|
||||
],
|
||||
optionsCouvert: [
|
||||
{ key: "aucun", label: "Aucun" },
|
||||
{ key: "leger", label: "Léger (SD+5)" },
|
||||
{ key: "complet", label: "Quasi complet (SD+10)" }
|
||||
],
|
||||
optionsTireurDeplacement: [
|
||||
{ key: "immobile", label: "Immobile (SD+0)" },
|
||||
{ key: "lent", label: "Lent (SD+3)" },
|
||||
{ key: "rapide", label: "Rapide (SD+5)" }
|
||||
],
|
||||
optionsSoutiens: [
|
||||
{ key: "0", label: "Aucun" },
|
||||
{ key: "1", label: "Un soutien (+3)" },
|
||||
{ key: "2", label: "Deux soutiens (+4)" },
|
||||
{ key: "3", label: "Trois soutiens (+5)" }
|
||||
],
|
||||
optionsStatutResistant: [
|
||||
{ key: "commun", label: "Commun" },
|
||||
{ key: "clandestin", label: "Clandestin" },
|
||||
{ key: "insurge", label: "Insurgé" }
|
||||
],
|
||||
optionsTypeArme: [
|
||||
{key: "contact", label: "Arme de contact"},
|
||||
{key: "contactjet", label: "Arme de contact et de Jet"},
|
||||
{key: "jet", label: "Arme de Jet"},
|
||||
{key: "tir", label: "Arme de Tir"}
|
||||
],
|
||||
optionsArtefactBranche: [
|
||||
{key: "alchimie", label: "Alchimie"},
|
||||
{key: "biologie", label: "Biologie"},
|
||||
{key: "electricite", label: "Electricité"},
|
||||
{key: "mecanique", label: "Mécanique"},
|
||||
{key: "scienceesprit", label: "Science de l'Esprit"}
|
||||
],
|
||||
optionsArtefactBranche2: [
|
||||
{key: "none", label: "Aucune"},
|
||||
{key: "alchimie", label: "Alchimie"},
|
||||
{key: "biologie", label: "Biologie"},
|
||||
{key: "electricite", label: "Electricité"},
|
||||
{key: "mecanique", label: "Mécanique"},
|
||||
{key: "scienceesprit", label: "Science de l'Esprit"}
|
||||
],
|
||||
optionsTypeContact: [
|
||||
{key: "contact", label: "Contact"},
|
||||
{key: "allie", label: "Allié"}
|
||||
],
|
||||
optionsTypeMutation: [
|
||||
{key: "tares_communes", label: "Tares et Malformations communes"},
|
||||
{key: "evolutions_communes", label: "Evolutions communes"},
|
||||
{key: "tares_rares", label: "Tares et Malformations rares"},
|
||||
{key: "evolutions_rares", label: "Evolutions rares"},
|
||||
{key: "tares_majeures", label: "Tares et Maformations majeures"},
|
||||
{key: "evolutions_majeures", label: "Evolutions majeures"},
|
||||
{key: "tares_except", label: "Tares et Malformations exceptionnelles"},
|
||||
{key: "evolutions_except", label: "Evolutions exceptionnelles"}
|
||||
],
|
||||
optionsTypeTalent: [
|
||||
{key: "personnage", label: "Personnage"},
|
||||
{key: "cellule", label: "Cellule"},
|
||||
{key: "traitespece", label: "Trait d'espèce"}
|
||||
],
|
||||
optionsUseTalent: [
|
||||
{key: "permanent", label: "Permanent"},
|
||||
{key: "sceance", label: "Une fois par scéance"},
|
||||
{key: "scenario", label: "Une fois par scénario"},
|
||||
{key: "jour", label: "Une fois par jour"},
|
||||
{key: "unique", label: "Unique"}
|
||||
],
|
||||
optionsAutomationEvent: [
|
||||
{key: "on-drop", label: "Drop sur l'acteur"},
|
||||
{key: "prepare-roll", label: "Préparation d'un jet"},
|
||||
{key: "bonus-permanent", label: "Bonus permanent"}
|
||||
],
|
||||
optionsBonusPermanent: [
|
||||
{key: "vigueur", label: "Vigueur"},
|
||||
{key: "bonus-defensif", label: "Bonus au Seuil de Défense"}
|
||||
]
|
||||
}
|
||||
@@ -13,7 +13,7 @@ export class HawkmoonCreatureSheet extends HawkmoonActorSheet {
|
||||
/** @override */
|
||||
static get defaultOptions() {
|
||||
|
||||
return mergeObject(super.defaultOptions, {
|
||||
return foundry.utils.mergeObject(super.defaultOptions, {
|
||||
classes: ["fvtt-hawkmoon-cyd", "sheet", "actor"],
|
||||
template: "systems/fvtt-hawkmoon-cyd/templates/creature-sheet.html",
|
||||
width: 640,
|
||||
|
||||
@@ -22,7 +22,7 @@ export class HawkmoonTokenHud {
|
||||
|
||||
const hudData = { actor: actor }
|
||||
|
||||
const controlIconActions = html.find('.control-icon[data-action=combat]');
|
||||
const controlIconActions = $(html).find('.control-icon[data-action=combat]');
|
||||
// initiative
|
||||
await HawkmoonTokenHud._configureSubMenu(controlIconActions, 'systems/fvtt-hawkmoon-cyd/templates/hud-adversites.html', hudData,
|
||||
(event) => {
|
||||
@@ -34,7 +34,7 @@ export class HawkmoonTokenHud {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async addTokenHudExtensions(app, html, tokenId) {
|
||||
const controlIconCombat = html.find('.control-icon[data-action=combat]')
|
||||
const controlIconCombat = $(html).find('.control-icon[data-action=combat]')
|
||||
if (controlIconCombat.length>0 ) {
|
||||
HawkmoonTokenHud.addExtensionHud(app, html, tokenId);
|
||||
}
|
||||
@@ -42,11 +42,11 @@ export class HawkmoonTokenHud {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async _configureSubMenu(insertionPoint, template, hudData, onMenuItem) {
|
||||
const hud = $(await renderTemplate(template, hudData))
|
||||
const hud = $(await foundry.applications.handlebars.renderTemplate(template, hudData))
|
||||
const list = hud.find('div.hawkmoon-hud-list')
|
||||
|
||||
|
||||
HawkmoonTokenHud._toggleHudListActive(hud, list);
|
||||
|
||||
|
||||
hud.find('img.hawkmoon-hud-togglebutton').click(event => HawkmoonTokenHud._toggleHudListActive(hud, list));
|
||||
list.find('.hawkmoon-hud-adversite').click(onMenuItem);
|
||||
|
||||
|
||||
@@ -4,12 +4,12 @@ import { HawkmoonUtility } from "./hawkmoon-utility.js";
|
||||
* Extend the basic ItemSheet with some very simple modifications
|
||||
* @extends {ItemSheet}
|
||||
*/
|
||||
export class HawkmoonItemSheet extends ItemSheet {
|
||||
export class HawkmoonItemSheet extends foundry.appv1.sheets.ItemSheet {
|
||||
|
||||
/** @override */
|
||||
static get defaultOptions() {
|
||||
|
||||
return mergeObject(super.defaultOptions, {
|
||||
return foundry.utils.mergeObject(super.defaultOptions, {
|
||||
classes: ["fvtt-hawkmoon-cyd", "sheet", "item"],
|
||||
template: "systems/fvtt-hawkmoon-cyd/templates/item-sheet.html",
|
||||
dragDrop: [{ dragSelector: null, dropSelector: null }],
|
||||
@@ -48,7 +48,7 @@ export class HawkmoonItemSheet extends ItemSheet {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async getData() {
|
||||
const objectData = duplicate(this.object)
|
||||
const objectData = foundry.utils.duplicate(this.object)
|
||||
let formData = {
|
||||
title: this.title,
|
||||
id: this.id,
|
||||
@@ -64,7 +64,8 @@ export class HawkmoonItemSheet extends ItemSheet {
|
||||
owner: this.document.isOwner,
|
||||
description: await TextEditor.enrichHTML(this.object.system.description, {async: true}),
|
||||
mr: (this.object.type == 'specialisation'),
|
||||
isGM: game.user.isGM
|
||||
isGM: game.user.isGM,
|
||||
config: game.system.hawkmoon.config
|
||||
}
|
||||
|
||||
if ( objectData.type == "don") {
|
||||
@@ -89,7 +90,7 @@ export class HawkmoonItemSheet extends ItemSheet {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
postItem() {
|
||||
let chatData = duplicate(HawkmoonUtility.data(this.item));
|
||||
let chatData = foundry.utils.duplicate(HawkmoonUtility.data(this.item));
|
||||
if (this.actor) {
|
||||
chatData.actor = { id: this.actor.id };
|
||||
}
|
||||
@@ -132,7 +133,7 @@ export class HawkmoonItemSheet extends ItemSheet {
|
||||
html.find('.edit-predilection').change(ev => {
|
||||
const li = $(ev.currentTarget).parents(".prediction-item")
|
||||
let index = li.data("prediction-index")
|
||||
let pred = duplicate(this.object.system.predilections)
|
||||
let pred = foundry.utils.duplicate(this.object.system.predilections)
|
||||
pred[index].name = ev.currentTarget.value
|
||||
pred[index].id = pred[index].id || randomID(16)
|
||||
this.object.update( { 'system.predilections': pred })
|
||||
@@ -140,70 +141,70 @@ export class HawkmoonItemSheet extends ItemSheet {
|
||||
html.find('.edit-predilection-description').change(ev => {
|
||||
const li = $(ev.currentTarget).parents(".prediction-item")
|
||||
let index = li.data("prediction-index")
|
||||
let pred = duplicate(this.object.system.predilections)
|
||||
let pred = foundry.utils.duplicate(this.object.system.predilections)
|
||||
pred[index].description = ev.currentTarget.value
|
||||
pred[index].id = pred[index].id || randomID(16)
|
||||
this.object.update( { 'system.predilections': pred })
|
||||
})
|
||||
})
|
||||
html.find('.predilection-acquise').change(ev => {
|
||||
const li = $(ev.currentTarget).parents(".prediction-item")
|
||||
let index = li.data("prediction-index")
|
||||
let pred = duplicate(this.object.system.predilections)
|
||||
let pred = foundry.utils.duplicate(this.object.system.predilections)
|
||||
pred[index].acquise = ev.currentTarget.checked
|
||||
pred[index].id = pred[index].id || randomID(16)
|
||||
this.object.update( { 'system.predilections': pred })
|
||||
})
|
||||
})
|
||||
html.find('.predilection-maitrise').change(ev => {
|
||||
const li = $(ev.currentTarget).parents(".prediction-item")
|
||||
let index = li.data("prediction-index")
|
||||
let pred = duplicate(this.object.system.predilections)
|
||||
let pred = foundry.utils.duplicate(this.object.system.predilections)
|
||||
pred[index].maitrise = ev.currentTarget.checked
|
||||
pred[index].id = pred[index].id || randomID(16)
|
||||
this.object.update( { 'system.predilections': pred })
|
||||
})
|
||||
})
|
||||
html.find('.predilection-used').change(ev => {
|
||||
const li = $(ev.currentTarget).parents(".prediction-item")
|
||||
let index = li.data("prediction-index")
|
||||
let pred = duplicate(this.object.system.predilections)
|
||||
let pred = foundry.utils.duplicate(this.object.system.predilections)
|
||||
pred[index].used = ev.currentTarget.checked
|
||||
pred[index].id = pred[index].id || randomID(16)
|
||||
this.object.update( { 'system.predilections': pred })
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
html.find('#add-predilection').click(ev => {
|
||||
let pred = duplicate(this.object.system.predilections)
|
||||
pred.push( { name: "Nouvelle prédilection", id: randomID(16), used: false })
|
||||
let pred = foundry.utils.duplicate(this.object.system.predilections)
|
||||
pred.push( { name: "Nouvelle prédilection", id: randomID(16), used: false })
|
||||
this.object.update( { 'system.predilections': pred })
|
||||
})
|
||||
html.find('.delete-prediction').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".prediction-item")
|
||||
let index = li.data("prediction-index")
|
||||
let pred = duplicate(this.object.system.predilections)
|
||||
let pred = foundry.utils.duplicate(this.object.system.predilections)
|
||||
pred.splice(index,1)
|
||||
this.object.update( { 'system.predilections': pred })
|
||||
})
|
||||
|
||||
html.find('#add-automation').click(ev => {
|
||||
let autom = duplicate(this.object.system.automations)
|
||||
autom.push( { eventtype: "on-drop", name: "Automatisation 1", competence: "", minLevel: 0, id: randomID(16) })
|
||||
let autom = foundry.utils.duplicate(this.object.system.automations)
|
||||
autom.push( { eventtype: "on-drop", name: "Automatisation 1", bonusname: "vigueur", bonus: 0, competence: "", minLevel: 0, baCost: 0, id: randomID(16) })
|
||||
this.object.update( { 'system.automations': autom })
|
||||
})
|
||||
html.find('.delete-automation').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".automation-item")
|
||||
let index = li.data("automation-index")
|
||||
let autom = duplicate(this.object.system.automations)
|
||||
let autom = foundry.utils.duplicate(this.object.system.automations)
|
||||
autom.splice(index,1)
|
||||
this.object.update( { 'system.automations': autom })
|
||||
})
|
||||
html.find('.automation-edit-field').change(ev => {
|
||||
let index = $(ev.currentTarget).data("automation-index")
|
||||
let field = $(ev.currentTarget).data("automation-field")
|
||||
let auto = duplicate(this.object.system.automations)
|
||||
let auto = foundry.utils.duplicate(this.object.system.automations)
|
||||
auto[index][field] = ev.currentTarget.value
|
||||
auto[index].id = auto[index].id || randomID(16)
|
||||
this.object.update( { 'system.automations': auto })
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
// Update Inventory Item
|
||||
html.find('.item-delete').click(ev => {
|
||||
const li = $(ev.currentTarget).parents(".item");
|
||||
|
||||
@@ -13,6 +13,7 @@ export const defaultItemImg = {
|
||||
artefact: "systems/fvtt-hawkmoon-cyd/assets/icons/artefact.webp",
|
||||
contact: "systems/fvtt-hawkmoon-cyd/assets/icons/contacts.webp",
|
||||
ressource: "systems/fvtt-hawkmoon-cyd/assets/icons/ressources.webp",
|
||||
mutation: "systems/fvtt-hawkmoon-cyd/assets/icons/mutation.webp",
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -18,6 +18,7 @@ import { HawkmoonCombat } from "./hawkmoon-combat.js";
|
||||
import { HawkmoonItem } from "./hawkmoon-item.js";
|
||||
import { HawkmoonAutomation } from "./hawkmoon-automation.js";
|
||||
import { HawkmoonTokenHud } from "./hawkmoon-hud.js";
|
||||
import { HAWKMOON_CONFIG } from "./hawkmoon-config.js";
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* Foundry VTT Initialization */
|
||||
@@ -32,7 +33,7 @@ Hooks.once("init", async function () {
|
||||
HawkmoonUtility.preloadHandlebarsTemplates()
|
||||
|
||||
/* -------------------------------------------- */
|
||||
// Set an initiative formula for the system
|
||||
// Set an initiative formula for the system
|
||||
CONFIG.Combat.initiative = {
|
||||
formula: "1d10",
|
||||
decimals: 1
|
||||
@@ -50,18 +51,19 @@ Hooks.once("init", async function () {
|
||||
CONFIG.Item.documentClass = HawkmoonItem
|
||||
game.system.hawkmoon = {
|
||||
HawkmoonUtility,
|
||||
HawkmoonAutomation
|
||||
HawkmoonAutomation,
|
||||
config : HAWKMOON_CONFIG
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
// Register sheet application classes
|
||||
Actors.unregisterSheet("core", ActorSheet);
|
||||
Actors.registerSheet("fvtt-hawkmoon-cyd", HawkmoonActorSheet, { types: ["personnage"], makeDefault: true })
|
||||
Actors.registerSheet("fvtt-hawkmoon-cyd", HawkmoonCreatureSheet, { types: ["creature"], makeDefault: true })
|
||||
Actors.registerSheet("fvtt-hawkmoon-cyd", HawkmoonCelluleSheet, { types: ["cellule"], makeDefault: true });
|
||||
// Regster sheet application classes
|
||||
foundry.documents.collections.Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet);
|
||||
foundry.documents.collections.Actors.registerSheet("fvtt-hawkmoon-cyd", HawkmoonActorSheet, { types: ["personnage"], makeDefault: true })
|
||||
foundry.documents.collections.Actors.registerSheet("fvtt-hawkmoon-cyd", HawkmoonCreatureSheet, { types: ["creature"], makeDefault: true })
|
||||
foundry.documents.collections.Actors.registerSheet("fvtt-hawkmoon-cyd", HawkmoonCelluleSheet, { types: ["cellule"], makeDefault: true });
|
||||
|
||||
Items.unregisterSheet("core", ItemSheet);
|
||||
Items.registerSheet("fvtt-hawkmoon-cyd", HawkmoonItemSheet, { makeDefault: true })
|
||||
foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet);
|
||||
foundry.documents.collections.Items.registerSheet("fvtt-hawkmoon-cyd", HawkmoonItemSheet, { makeDefault: true })
|
||||
|
||||
HawkmoonUtility.init()
|
||||
HawkmoonAutomation.init()
|
||||
@@ -83,28 +85,15 @@ function welcomeMessage() {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
// Register world usage statistics
|
||||
function registerUsageCount(registerKey) {
|
||||
if (game.user.isGM) {
|
||||
game.settings.register(registerKey, "world-key", {
|
||||
name: "Unique world key",
|
||||
scope: "world",
|
||||
config: false,
|
||||
default: "",
|
||||
type: String
|
||||
});
|
||||
|
||||
let worldKey = game.settings.get(registerKey, "world-key")
|
||||
if (worldKey == undefined || worldKey == "") {
|
||||
worldKey = randomID(32)
|
||||
game.settings.set(registerKey, "world-key", worldKey)
|
||||
async function importDefaultScene() {
|
||||
let exists = game.scenes.find(j => j.name == "Accueil");
|
||||
if (!exists) {
|
||||
const scenes = await HawkmoonUtility.loadCompendium("fvtt-hawkmoon-cyd.scenes")
|
||||
let newDocuments = scenes.filter(i => i.name == "Accueil");
|
||||
if (newDocuments) {
|
||||
await game.scenes.documentClass.create(newDocuments);
|
||||
game.scenes.find(i => i.name == "Accueil").activate();
|
||||
}
|
||||
// Simple API counter
|
||||
let regURL = `https://www.uberwald.me/fvtt_appcount/count.php?name="${registerKey}"&worldKey="${worldKey}"&version="${game.release.generation}.${game.release.build}"&system="${game.system.id}"&systemversion="${game.system.version}"`
|
||||
//$.ajaxSetup({
|
||||
//headers: { 'Access-Control-Allow-Origin': '*' }
|
||||
//})
|
||||
$.ajax(regURL)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,14 +113,16 @@ Hooks.once("ready", function () {
|
||||
});
|
||||
}
|
||||
|
||||
registerUsageCount('fvtt-hawkmoon-cyd')
|
||||
import("https://www.uberwald.me/fvtt_appcount/count-class-ready.js").then(moduleCounter=>{
|
||||
console.log("ClassCounter loaded", moduleCounter)
|
||||
moduleCounter.ClassCounter.registerUsageCount()
|
||||
}).catch(err=>
|
||||
console.log("No stats available, giving up.")
|
||||
)
|
||||
|
||||
importDefaultScene()
|
||||
welcomeMessage()
|
||||
|
||||
// CSS patch for v9
|
||||
if (game.version) {
|
||||
let sidebar = document.getElementById("sidebar");
|
||||
sidebar.style.width = "min-content";
|
||||
}
|
||||
});
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -147,4 +138,3 @@ Hooks.on("chatMessage", (html, content, msg) => {
|
||||
}
|
||||
return true;
|
||||
});
|
||||
|
||||
|
||||
@@ -3,12 +3,12 @@ import { HawkmoonUtility } from "./hawkmoon-utility.js";
|
||||
export class HawkmoonRollDialog extends Dialog {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async create(actor, rollData ) {
|
||||
static async create(actor, rollData) {
|
||||
|
||||
let options = { classes: ["HawkmoonDialog"], width: 320, height: 'fit-content', 'z-index': 99999 };
|
||||
let html = await renderTemplate('systems/fvtt-hawkmoon-cyd/templates/roll-dialog-generic.html', rollData);
|
||||
let options = { classes: ["HawkmoonDialog"], width: 420, height: 'fit-content', 'z-index': 99999 };
|
||||
let html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-hawkmoon-cyd/templates/roll-dialog-generic.html', rollData);
|
||||
|
||||
return new HawkmoonRollDialog(actor, rollData, html, options );
|
||||
return new HawkmoonRollDialog(actor, rollData, html, options);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -16,22 +16,23 @@ export class HawkmoonRollDialog extends Dialog {
|
||||
let conf = {
|
||||
title: "Test de Capacité",
|
||||
content: html,
|
||||
buttons: {
|
||||
buttons: {
|
||||
rolld10: {
|
||||
icon: '<i class="fas fa-check"></i>',
|
||||
label: "Lancer 1d10",
|
||||
callback: () => { this.roll("d10") }
|
||||
},
|
||||
rolld20: {
|
||||
icon: '<i class="fas fa-check"></i>',
|
||||
label: "Lancer 1d20",
|
||||
callback: () => { this.roll("d20") }
|
||||
},
|
||||
cancel: {
|
||||
icon: '<i class="fas fa-times"></i>',
|
||||
label: "Annuler",
|
||||
callback: () => { this.close() }
|
||||
} },
|
||||
icon: '<i class="fas fa-check"></i>',
|
||||
label: "Lancer 1d10",
|
||||
callback: () => { this.roll("d10") }
|
||||
},
|
||||
rolld20: {
|
||||
icon: '<i class="fas fa-check"></i>',
|
||||
label: "Lancer 1d20",
|
||||
callback: () => { this.roll("d20") }
|
||||
},
|
||||
cancel: {
|
||||
icon: '<i class="fas fa-times"></i>',
|
||||
label: "Annuler",
|
||||
callback: () => { this.close() }
|
||||
}
|
||||
},
|
||||
close: close
|
||||
}
|
||||
|
||||
@@ -42,9 +43,9 @@ export class HawkmoonRollDialog extends Dialog {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
roll ( dice) {
|
||||
roll(dice) {
|
||||
this.rollData.mainDice = dice
|
||||
HawkmoonUtility.rollHawkmoon( this.rollData )
|
||||
HawkmoonUtility.rollHawkmoon(this.rollData)
|
||||
}
|
||||
|
||||
|
||||
@@ -56,25 +57,87 @@ export class HawkmoonRollDialog extends Dialog {
|
||||
function onLoad() {
|
||||
}
|
||||
$(function () { onLoad(); });
|
||||
|
||||
html.find('#modificateur').change(async (event) => {
|
||||
|
||||
html.find('#modificateur').change(async (event) => {
|
||||
this.rollData.modificateur = Number(event.currentTarget.value)
|
||||
})
|
||||
html.find('#difficulte').change(async (event) => {
|
||||
html.find('#difficulte').change((event) => {
|
||||
console.log("Difficulte: " + event.currentTarget.value)
|
||||
this.rollData.difficulte = Number(event.currentTarget.value)
|
||||
})
|
||||
html.find('#attrKey').change(async (event) => {
|
||||
html.find('#attrKey').change(async (event) => {
|
||||
this.rollData.attrKey = String(event.currentTarget.value)
|
||||
})
|
||||
html.find('#select-maitrise').change(async (event) => {
|
||||
})
|
||||
html.find('#attrKey2').change(async (event) => {
|
||||
this.rollData.attrKey2 = String(event.currentTarget.value)
|
||||
})
|
||||
html.find('#select-maitrise').change(async (event) => {
|
||||
this.rollData.maitriseId = String(event.currentTarget.value)
|
||||
})
|
||||
html.find('#competence-talents').change((event) => {
|
||||
this.rollData.selectedTalents = $('#competence-talents').val()
|
||||
this.rollData.selectedTalents = $('#competence-talents').val()
|
||||
})
|
||||
html.find('#taille-cible').change((event) => {
|
||||
this.rollData.tailleCible = String(event.currentTarget.value)
|
||||
})
|
||||
html.find('#tireur-deplacement').change((event) => {
|
||||
this.rollData.tireurDeplacement = String(event.currentTarget.value)
|
||||
})
|
||||
html.find('#cible-couvert').change((event) => {
|
||||
this.rollData.cibleCouvert = String(event.currentTarget.value)
|
||||
})
|
||||
html.find('#distance-tir').change((event) => {
|
||||
this.rollData.distanceTir = String(event.currentTarget.value)
|
||||
})
|
||||
html.find('#bonus-malus-context').change((event) => {
|
||||
this.rollData.bonusMalusContext = Number(event.currentTarget.value)
|
||||
this.rollData.bonusMalusContext = Number(event.currentTarget.value)
|
||||
})
|
||||
|
||||
html.find('#defenseur-au-sol').change((event) => {
|
||||
this.rollData.defenseurAuSol = event.currentTarget.checked
|
||||
})
|
||||
html.find('#ambidextre-1').change((event) => {
|
||||
this.rollData.ambidextre1 = event.currentTarget.checked
|
||||
})
|
||||
html.find('#ambidextre-2').change((event) => {
|
||||
this.rollData.ambidextre2 = event.currentTarget.checked
|
||||
})
|
||||
html.find('#attaque-monte').change((event) => {
|
||||
this.rollData.attqueMonte = event.currentTarget.checked
|
||||
})
|
||||
html.find('#defenseur-aveugle').change((event) => {
|
||||
this.rollData.defenseurAveugle = event.currentTarget.checked
|
||||
})
|
||||
html.find('#defenseur-de-dos').change((event) => {
|
||||
this.rollData.defenseurDeDos = event.currentTarget.checked
|
||||
})
|
||||
html.find('#defenseur-restreint').change((event) => {
|
||||
this.rollData.defenseurRestreint = event.currentTarget.checked
|
||||
})
|
||||
html.find('#defenseur-immobilise').change((event) => {
|
||||
this.rollData.defenseurImmobilise = event.currentTarget.checked
|
||||
})
|
||||
html.find('#attaque-charge').change((event) => {
|
||||
this.rollData.attaqueCharge = event.currentTarget.checked
|
||||
})
|
||||
html.find('#charge-cavalerie').change((event) => {
|
||||
this.rollData.chargeCavalerie = event.currentTarget.checked
|
||||
})
|
||||
html.find('#attaquants-multiple').change((event) => {
|
||||
this.rollData.attaquantsMultiples = event.currentTarget.checked
|
||||
})
|
||||
html.find('#soutiens').change((event) => {
|
||||
this.rollData.soutiens = Number(event.currentTarget.value)
|
||||
})
|
||||
html.find('#feinte').change((event) => {
|
||||
this.rollData.feinte = event.currentTarget.checked
|
||||
})
|
||||
html.find('#contenir').change((event) => {
|
||||
this.rollData.contenir = event.currentTarget.checked
|
||||
})
|
||||
html.find('#attaque-desarme').change((event) => {
|
||||
this.rollData.attaqueDesarme = event.currentTarget.checked
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,12 @@
|
||||
import { HawkmoonCombat } from "./hawkmoon-combat.js";
|
||||
import { HawkmoonCommands } from "./hawkmoon-commands.js";
|
||||
|
||||
/* -------------------------------------------- */
|
||||
const __distanceDifficulte = { "porteecourte": 5, "porteemoyenne": 9, "porteelongue": 14 }
|
||||
const __tireurDeplacement = { immobile: 0, lent: 3, rapide: 5 }
|
||||
const __cibleCouvert = { aucun: 0, leger: 5, complet: 10 }
|
||||
const __tailleCible = { normal: 0, main: 10, enfant: 3, maison: -10 }
|
||||
|
||||
/* -------------------------------------------- */
|
||||
export class HawkmoonUtility {
|
||||
|
||||
@@ -9,8 +15,7 @@ export class HawkmoonUtility {
|
||||
/* -------------------------------------------- */
|
||||
static async init() {
|
||||
Hooks.on('renderChatLog', (log, html, data) => HawkmoonUtility.chatListeners(html))
|
||||
Hooks.on("getChatLogEntryContext", (html, options) => HawkmoonUtility.chatRollMenu(html, options))
|
||||
|
||||
Hooks.on("getChatMessageContextOptions", (html, options) => HawkmoonUtility.chatRollMenu(html, options))
|
||||
Hooks.on("getCombatTrackerEntryContext", (html, options) => {
|
||||
HawkmoonUtility.pushInitiativeOptions(html, options);
|
||||
})
|
||||
@@ -61,6 +66,13 @@ export class HawkmoonUtility {
|
||||
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static sortArrayObjectsByName(myArray) {
|
||||
myArray.sort((a, b) => {
|
||||
return a.name.localeCompare(b.name);
|
||||
})
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static getModificateurOptions() {
|
||||
let opt = []
|
||||
@@ -92,15 +104,53 @@ export class HawkmoonUtility {
|
||||
return this.skills
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static updatePauseLogo(html) {
|
||||
let logoPause = "systems/fvtt-hawkmoon-cyd/assets/logos/" + game.settings.get("fvtt-hawkmoon-cyd", "hawkmoon-pause-logo") + ".webp"
|
||||
console.log("Hawkmoon | Updating pause logo to:", logoPause)
|
||||
|
||||
// Supprimer l'ancien style s'il existe
|
||||
let oldStyle = document.getElementById('hawkmoon-pause-logo-override')
|
||||
if (oldStyle) {
|
||||
oldStyle.remove()
|
||||
}
|
||||
|
||||
// Injecter une règle CSS pour override le logo
|
||||
let styleSheet = document.createElement('style')
|
||||
styleSheet.id = 'hawkmoon-pause-logo-override'
|
||||
styleSheet.textContent = `#pause>img { content: url(${logoPause}) !important; }`
|
||||
document.head.appendChild(styleSheet)
|
||||
|
||||
console.log("Hawkmoon | Logo CSS rule injected")
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async ready() {
|
||||
const skills = await HawkmoonUtility.loadCompendium("fvtt-hawkmoon-cyd.skills")
|
||||
this.skills = skills.map(i => i.toObject())
|
||||
|
||||
// Setup pause logo
|
||||
let logoPause = "systems/fvtt-hawkmoon-cyd/assets/logos/" + game.settings.get("fvtt-hawkmoon-cyd", "hawkmoon-pause-logo") + ".webp"
|
||||
let logoImg = document.querySelector('#pause').children[0]
|
||||
logoImg.setAttribute('style', `content: url(${logoPause})`)
|
||||
this.updatePauseLogo()
|
||||
|
||||
game.system.hawkmoon.config.listeNiveauSkill = this.createDirectOptionList(0, 10)
|
||||
game.system.hawkmoon.config.listeNiveauCreature = this.createDirectOptionList(0, 35)
|
||||
game.system.hawkmoon.config.listeNiveauContact = this.createDirectOptionList(1, 3)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static createDirectOptionList(min, max) {
|
||||
let options = {};
|
||||
for (let i = min; i <= max; i++) {
|
||||
options[`${i}`] = `${i}`;
|
||||
}
|
||||
return options;
|
||||
}
|
||||
static createArrayOptionList(min, max) {
|
||||
let options = [];
|
||||
for (let i = min; i <= max; i++) {
|
||||
options.push({ key: `${i}`, label: `${i}` });
|
||||
}
|
||||
return options;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -122,24 +172,33 @@ export class HawkmoonUtility {
|
||||
/* -------------------------------------------- */
|
||||
static async chatListeners(html) {
|
||||
|
||||
html.on("click", '.predilection-reroll', async event => {
|
||||
$(html).on("click", '.predilection-reroll', async event => {
|
||||
let predIdx = $(event.currentTarget).data("predilection-index")
|
||||
let messageId = HawkmoonUtility.findChatMessageId(event.currentTarget)
|
||||
let message = game.messages.get(messageId)
|
||||
let rollData = message.getFlag("world", "hawkmoon-roll")
|
||||
let actor = this.getActorFromRollData(rollData)
|
||||
let actor = HawkmoonUtility.getActorFromRollData(rollData)
|
||||
await actor.setPredilectionUsed(rollData.competence._id, predIdx)
|
||||
rollData.competence = duplicate(actor.getCompetence(rollData.competence._id))
|
||||
rollData.competence = foundry.utils.duplicate(actor.getCompetence(rollData.competence._id))
|
||||
HawkmoonUtility.rollHawkmoon(rollData)
|
||||
})
|
||||
|
||||
html.on("click", '.roll-chat-degat', async event => {
|
||||
$(html).on("click", '.roll-chat-degat', async event => {
|
||||
let messageId = HawkmoonUtility.findChatMessageId(event.currentTarget)
|
||||
let message = game.messages.get(messageId)
|
||||
let rollData = message.getFlag("world", "hawkmoon-roll")
|
||||
let actor = this.getActorFromRollData(rollData)
|
||||
actor.rollArmeDegats(rollData.arme._id, rollData.targetVigueur)
|
||||
let actor = HawkmoonUtility.getActorFromRollData(rollData)
|
||||
actor.rollArmeDegats(rollData.arme._id, rollData.targetVigueur, rollData)
|
||||
})
|
||||
$(html).on("click", '.roll-chat-degat-devastateur', async event => {
|
||||
let messageId = HawkmoonUtility.findChatMessageId(event.currentTarget)
|
||||
let message = game.messages.get(messageId)
|
||||
let rollData = message.getFlag("world", "hawkmoon-roll")
|
||||
let actor = HawkmoonUtility.getActorFromRollData(rollData)
|
||||
rollData.applyCoupDevastateur = true
|
||||
actor.rollArmeDegats(rollData.arme._id, rollData.targetVigueur, rollData)
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -150,13 +209,11 @@ export class HawkmoonUtility {
|
||||
'systems/fvtt-hawkmoon-cyd/templates/partial-item-header.html',
|
||||
'systems/fvtt-hawkmoon-cyd/templates/partial-item-description.html',
|
||||
'systems/fvtt-hawkmoon-cyd/templates/partial-item-nav.html',
|
||||
'systems/fvtt-hawkmoon-cyd/templates/partial-list-niveau.html',
|
||||
'systems/fvtt-hawkmoon-cyd/templates/partial-item-prix.html',
|
||||
'systems/fvtt-hawkmoon-cyd/templates/partial-sante-etat.html',
|
||||
'systems/fvtt-hawkmoon-cyd/templates/partial-automation.html',
|
||||
'systems/fvtt-hawkmoon-cyd/templates/hud-adversites.html',
|
||||
]
|
||||
return loadTemplates(templatePaths);
|
||||
return foundry.applications.handlebars.loadTemplates(templatePaths);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -233,30 +290,19 @@ export class HawkmoonUtility {
|
||||
|
||||
let id = rollData.rollId;
|
||||
let oldRollData = this.rollDataStore[id] || {};
|
||||
let newRollData = mergeObject(oldRollData, rollData);
|
||||
let newRollData = foundry.utils.mergeObject(oldRollData, rollData);
|
||||
this.rollDataStore[id] = newRollData;
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
static saveRollData(rollData) {
|
||||
game.socket.emit("system.fvtt-hawkmoon-cyd", {
|
||||
name: "msg_update_roll", data: rollData
|
||||
}); // Notify all other clients of the roll
|
||||
this.updateRollData(rollData);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static getRollData(id) {
|
||||
return this.rollDataStore[id];
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static onSocketMesssage(msg) {
|
||||
//console.log("SOCKET MESSAGE", msg.name, game.user.character.id, msg.data.defenderId);
|
||||
if (msg.name == "msg_update_defense_state") {
|
||||
this.updateDefenseState(msg.data.defenderId, msg.data.rollId);
|
||||
}
|
||||
if (msg.name == "msg_update_roll") {
|
||||
this.updateRollData(msg.data);
|
||||
if (msg.msg == "msg_apply_combativite") {
|
||||
let defender = game.canvas.tokens.get(msg.data.defenderTokenId)?.actor
|
||||
if (defender) {
|
||||
defender.changeEtatCombativite(msg.data.value)
|
||||
} else {
|
||||
console.warn("HawkmoonUtility.onSocketMesssage : Impossible de trouver le token pour appliquer la combativité", msg.defenderTokenId)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -290,10 +336,10 @@ export class HawkmoonUtility {
|
||||
switch (rollMode) {
|
||||
case "blindroll": //GM only
|
||||
blind = true;
|
||||
case "gmroll": //GM + rolling player
|
||||
case "gmroll": // GM + rolling player
|
||||
whisper = this.getUsers(user => user.isGM);
|
||||
break;
|
||||
case "roll": //everybody
|
||||
case "roll": // everybody
|
||||
whisper = this.getUsers(user => user.active);
|
||||
break;
|
||||
case "selfroll":
|
||||
@@ -308,13 +354,13 @@ export class HawkmoonUtility {
|
||||
/* -------------------------------------------- */
|
||||
static computeMonnaieDetails(valueSC) {
|
||||
let po = Math.floor(valueSC / 400)
|
||||
let pa = Math.floor((valueSC - (po*400)) / 20)
|
||||
let sc = valueSC - (po*400) - (pa*20)
|
||||
let pa = Math.floor((valueSC - (po * 400)) / 20)
|
||||
let sc = valueSC - (po * 400) - (pa * 20)
|
||||
return {
|
||||
po: po, pa: pa, sc: sc, valueSC: valueSC
|
||||
po, pa, sc, valueSC
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static computeResult(rollData) {
|
||||
rollData.diceResult = rollData.roll.terms[0].results[0].result
|
||||
@@ -330,15 +376,28 @@ export class HawkmoonUtility {
|
||||
}
|
||||
}
|
||||
|
||||
//console.log("Result : ", rollData)
|
||||
//console.log("Result : ", rollData
|
||||
this.computeResultQuality(rollData)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static computeResultQuality(rollData) {
|
||||
if (rollData.difficulte > 0 && !rollData.isDramatique) {
|
||||
rollData.isSuccess = (rollData.finalResult >= rollData.difficulte)
|
||||
rollData.isHeroique = ((rollData.finalResult - rollData.difficulte) >= 10)
|
||||
rollData.isDramatique = ((rollData.finalResult - rollData.difficulte) <= -10)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static applyCombativite(rollData, value) {
|
||||
if (game.user.isGM) {
|
||||
let defender = game.canvas.tokens.get(rollData.defenderTokenId).actor
|
||||
defender.changeEtatCombativite(value)
|
||||
} else {
|
||||
game.socket.emit("system.fvtt-hawkmoon-cyd", { msg: "msg_apply_combativite", data: { defenderTokenId: rollData.defenderTokenId, value } });
|
||||
}
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
static async rollHawkmoon(rollData) {
|
||||
|
||||
@@ -348,7 +407,10 @@ export class HawkmoonUtility {
|
||||
}
|
||||
if (!rollData.attr) {
|
||||
rollData.actionImg = "systems/fvtt-hawkmoon-cyd/assets/icons/" + actor.system.attributs[rollData.attrKey].labelnorm + ".webp"
|
||||
rollData.attr = duplicate(actor.system.attributs[rollData.attrKey])
|
||||
rollData.attr = foundry.utils.duplicate(actor.system.attributs[rollData.attrKey])
|
||||
}
|
||||
if (rollData.attrKey2 != "none") {
|
||||
rollData.attr2 = foundry.utils.duplicate(actor.system.attributs[rollData.attrKey2])
|
||||
}
|
||||
|
||||
if (rollData.maitriseId != "none") {
|
||||
@@ -360,7 +422,7 @@ export class HawkmoonUtility {
|
||||
|
||||
//console.log("BEFORE COMP", rollData)
|
||||
if (rollData.competence) {
|
||||
rollData.predilections = duplicate(rollData.competence.system.predilections.filter(pred => pred.acquise && !pred.maitrise && !pred.used) || [])
|
||||
rollData.predilections = foundry.utils.duplicate(rollData.competence.system.predilections || [])
|
||||
let compmod = (rollData.competence.system.niveau == 0) ? -3 : 0
|
||||
rollData.diceFormula += `+${rollData.attr.value}+${rollData.competence.system.niveau}+${rollData.modificateur}+${compmod}`
|
||||
|
||||
@@ -382,10 +444,58 @@ export class HawkmoonUtility {
|
||||
}
|
||||
}
|
||||
rollData.diceFormula += `+${rollData.bonusMalusContext}`
|
||||
} else if (rollData.attr2) {
|
||||
rollData.diceFormula += `+${rollData.attr.value}+${rollData.attr2.value}+${rollData.modificateur}+${rollData.bonusMalusContext}`
|
||||
} else {
|
||||
rollData.diceFormula += `+${rollData.attr.value}*${rollData.multiplier}+${rollData.modificateur}+${rollData.bonusMalusContext}`
|
||||
}
|
||||
|
||||
// Bonus arme naturelle en défense
|
||||
if (rollData.bonusArmeNaturelle) {
|
||||
rollData.diceFormula += `+${rollData.bonusArmeNaturelle}`
|
||||
}
|
||||
if (rollData.attaquantsMultiples) {
|
||||
rollData.diceFormula += `+3`
|
||||
}
|
||||
if (rollData.hasAmbidextre) {
|
||||
if (rollData.ambidextre1) {
|
||||
rollData.diceFormula += `-3`
|
||||
} else if (rollData.ambidextre2) {
|
||||
rollData.diceFormula += `-6`
|
||||
}
|
||||
}
|
||||
if (rollData.defenseurAuSol) {
|
||||
rollData.diceFormula += `+3`
|
||||
}
|
||||
if (rollData.defenseurAveugle) {
|
||||
rollData.diceFormula += `+10`
|
||||
}
|
||||
if (rollData.defenseurDeDos) {
|
||||
rollData.diceFormula += `+5`
|
||||
}
|
||||
if (rollData.defenseurRestreint) {
|
||||
rollData.diceFormula += `+3`
|
||||
}
|
||||
if (rollData.defenseurImmobilise) {
|
||||
rollData.diceFormula += `+5`
|
||||
}
|
||||
if (rollData.soutiens > 0) { // 1 soutien = +3, 2 soutiens = +4, 3 soutiens = +5
|
||||
rollData.diceFormula += `+${rollData.soutiens + 2}`
|
||||
}
|
||||
|
||||
if (rollData.arme?.system.isDistance) {
|
||||
rollData.difficulte = __distanceDifficulte[rollData.distanceTir]
|
||||
rollData.difficulte += __tireurDeplacement[rollData.tireurDeplacement]
|
||||
rollData.difficulte += __cibleCouvert[rollData.cibleCouvert]
|
||||
rollData.difficulte += __tailleCible[rollData.tailleCible]
|
||||
rollData.difficulte += rollData.cibleDeplace ? 3 : 0
|
||||
rollData.difficulte += rollData.cibleCaC ? 3 : 0
|
||||
rollData.difficulte += rollData.protectionDefenseur
|
||||
}
|
||||
if (rollData.attaqueDesarme) {
|
||||
rollData.difficulte += 10
|
||||
}
|
||||
|
||||
// Ajout adversités
|
||||
rollData.diceFormula += `-${rollData.nbAdversites}`
|
||||
|
||||
@@ -393,9 +503,12 @@ export class HawkmoonUtility {
|
||||
rollData.diceFormula += `+${rollData.arme.system.bonusmaniementoff}`
|
||||
}
|
||||
|
||||
let myRoll = new Roll(rollData.diceFormula).roll({ async: false })
|
||||
// Gestion de la feinte éventuelle
|
||||
rollData.nbCombativitePerdu = 1
|
||||
|
||||
let myRoll = await new Roll(rollData.diceFormula).roll()
|
||||
await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
|
||||
rollData.roll = myRoll
|
||||
rollData.roll = foundry.utils.duplicate(myRoll)
|
||||
console.log(">>>> ", myRoll)
|
||||
|
||||
rollData.finalResult = myRoll.total
|
||||
@@ -403,34 +516,66 @@ export class HawkmoonUtility {
|
||||
if (rollData.isInit) {
|
||||
actor.setFlag("world", "last-initiative", rollData.finalResult)
|
||||
}
|
||||
if (rollData.feinte) {
|
||||
actor.changeBonneAventure(-1)
|
||||
if (rollData.isHeroique) {
|
||||
rollData.nbCombativitePerdu = "vaincu"
|
||||
} else if (rollData.isSuccess) {
|
||||
rollData.nbCombativitePerdu = 2
|
||||
}
|
||||
}
|
||||
|
||||
this.createChatWithRollMode(rollData.alias, {
|
||||
content: await renderTemplate(`systems/fvtt-hawkmoon-cyd/templates/chat-generic-result.html`, rollData)
|
||||
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-hawkmoon-cyd/templates/chat-generic-result.html`, rollData)
|
||||
}, rollData)
|
||||
|
||||
if ((rollData.coupBas || rollData.arme) && rollData.isSuccess && rollData.defenderTokenId) {
|
||||
this.applyCombativite(rollData, rollData.nbCombativitePerdu)
|
||||
}
|
||||
if (rollData.coupBas && rollData.isSuccess && rollData.defenderTokenId) {
|
||||
let defender = game.canvas.tokens.get(rollData.defenderTokenId).actor
|
||||
defender.incDecAdversite("bleue", -2)
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static getCombativiteList(nbActivite) {
|
||||
let list = [{ value: String(0), label: "Combatif" }]
|
||||
for (let i = 1; i < nbActivite - 2; i++) {
|
||||
list.push({ value: String(i), label: "Eprouvé " + i })
|
||||
}
|
||||
list[nbActivite - 2] = { value: String(nbActivite - 2), label: "Affaibli" }
|
||||
list[nbActivite - 1] = { value: String(nbActivite - 1), label: "Très Affaibli" }
|
||||
list[nbActivite] = { value: String(nbActivite), label: "Vaincu" }
|
||||
return list
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async bonusRollHawkmoon(rollData) {
|
||||
rollData.bonusFormula = rollData.addedBonus
|
||||
console.log("Bonus Roll Hawkmoon", rollData.bonusFormula)
|
||||
|
||||
let bonusRoll = new Roll(rollData.bonusFormula).roll({ async: false })
|
||||
await this.showDiceSoNice(bonusRoll, game.settings.get("core", "rollMode"));
|
||||
rollData.bonusRoll = bonusRoll
|
||||
if (!Number(rollData.bonusFormula)) {
|
||||
let bonusRoll = await new Roll(rollData.bonusFormula).roll()
|
||||
await this.showDiceSoNice(bonusRoll, game.settings.get("core", "rollMode"));
|
||||
rollData.bonusRoll = foundry.utils.duplicate(bonusRoll)
|
||||
rollData.finalResult += Number(rollData.bonusRoll.total)
|
||||
} else {
|
||||
rollData.finalResult += Number(rollData.bonusFormula)
|
||||
console.log("Bonus Roll Hawkmoon 2", rollData.finalResult)
|
||||
}
|
||||
|
||||
rollData.finalResult += rollData.bonusRoll.total
|
||||
|
||||
this.computeResult(rollData)
|
||||
this.computeResultQuality(rollData)
|
||||
|
||||
this.createChatWithRollMode(rollData.alias, {
|
||||
content: await renderTemplate(`systems/fvtt-hawkmoon-cyd/templates/chat-generic-result.html`, rollData)
|
||||
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-hawkmoon-cyd/templates/chat-generic-result.html`, rollData)
|
||||
}, rollData)
|
||||
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static getUsers(filter) {
|
||||
return game.users.filter(filter).map(user => user.data._id);
|
||||
return game.users.filter(filter).map(user => user._id);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -450,7 +595,7 @@ export class HawkmoonUtility {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static blindMessageToGM(chatOptions) {
|
||||
let chatGM = duplicate(chatOptions);
|
||||
let chatGM = foundry.utils.duplicate(chatOptions);
|
||||
chatGM.whisper = this.getUsers(user => user.isGM);
|
||||
chatGM.content = "Blinde message of " + game.user.name + "<br>" + chatOptions.content;
|
||||
console.log("blindMessageToGM", chatGM);
|
||||
@@ -514,13 +659,30 @@ export class HawkmoonUtility {
|
||||
/* -------------------------------------------- */
|
||||
static getBasicRollData() {
|
||||
let rollData = {
|
||||
rollId: randomID(16),
|
||||
rollId: foundry.utils.randomID(16),
|
||||
rollMode: game.settings.get("core", "rollMode"),
|
||||
modificateursOptions: this.getModificateurOptions(),
|
||||
pointAmeOptions: this.getPointAmeOptions(),
|
||||
difficulte: 0,
|
||||
modificateur: 0,
|
||||
bonusMalusContext: 0
|
||||
bonusMalusContext: 0,
|
||||
bonusArmeNaturelle: 0,
|
||||
defenseurAveugle: false,
|
||||
defenseurDeDos: false,
|
||||
defenseurAuSol: false,
|
||||
defenseurRestreint: false,
|
||||
defenseurImmobilise: false,
|
||||
tailleCible: "normal",
|
||||
tireurDeplacement: "immobile",
|
||||
cibleCouvert: "aucun",
|
||||
distanceTir: "porteemoyenne",
|
||||
attaqueCharge: false,
|
||||
attaqueDesarme: false,
|
||||
attaqueAmbidextre1: false,
|
||||
attaqueAmbidextre2: false,
|
||||
chargeCavalerie: false,
|
||||
contenir: false,
|
||||
soutiens: 0
|
||||
}
|
||||
return rollData
|
||||
}
|
||||
@@ -532,9 +694,26 @@ export class HawkmoonUtility {
|
||||
rollData.defenderTokenId = target.id
|
||||
let defender = game.canvas.tokens.get(rollData.defenderTokenId).actor
|
||||
rollData.armeDefense = defender.getBestDefenseValue()
|
||||
rollData.armeAttaqueDefenseur = defender.getBestAttackValue()
|
||||
rollData.targetVigueur = defender.getVigueur()
|
||||
if (rollData.armeDefense) {
|
||||
rollData.protectionDefenseur = defender.getProtection()
|
||||
if (rollData.immobiliser || rollData.repousser) {
|
||||
let combatValues = defender.getCombatValues()
|
||||
rollData.difficulte = combatValues.defenseTotal + (rollData.armeDefense && rollData.cibleconsciente ? 5 : 0)
|
||||
} else if (rollData.coupBas) {
|
||||
let combatValues = defender.getCombatValues()
|
||||
rollData.difficulte = combatValues.defenseTotal
|
||||
} else if (rollData.assomer) {
|
||||
rollData.difficulte = 3 + (defender.system.attributs.tre.value * 2)
|
||||
} else if (rollData.desengager) {
|
||||
rollData.difficulte = rollData.armeAttaqueDefenseur?.system?.totalOffensif || 0;
|
||||
} else if (rollData.armeDefense) {
|
||||
rollData.difficulte = rollData.armeDefense.system.totalDefensif
|
||||
if (!rollData.desengager && !rollData.arme.system.armenaturelle && !rollData.arme.system.armefortune) {
|
||||
if (rollData.armeDefense.system.armenaturelle || rollData.armeDefense.system.armefortune) {
|
||||
rollData.bonusArmeNaturelle = 3
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ui.notifications.warn("Aucune arme de défense équipée, difficulté manuelle à positionner.")
|
||||
}
|
||||
@@ -548,11 +727,11 @@ export class HawkmoonUtility {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static applyBonneAventureRoll(li, changed, addedBonus) {
|
||||
let msgId = li.data("message-id")
|
||||
let msgId = $(li).data("message-id")
|
||||
let msg = game.messages.get(msgId)
|
||||
if (msg) {
|
||||
let rollData = msg.getFlag("world", "hawkmoon-roll")
|
||||
let actor = this.getActorFromRollData(rollData)
|
||||
let actor = HawkmoonUtility.getActorFromRollData(rollData)
|
||||
actor.changeBonneAventure(changed)
|
||||
rollData.isReroll = true
|
||||
rollData.textBonus = "Bonus de Points d'Aventure"
|
||||
@@ -567,11 +746,11 @@ export class HawkmoonUtility {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static applyEclatRoll(li, changed, addedBonus) {
|
||||
let msgId = li.data("message-id")
|
||||
let msgId = $(li).data("message-id")
|
||||
let msg = game.messages.get(msgId)
|
||||
if (msg) {
|
||||
let rollData = msg.getFlag("world", "hawkmoon-roll")
|
||||
let actor = this.getActorFromRollData(rollData)
|
||||
let actor = HawkmoonUtility.getActorFromRollData(rollData)
|
||||
actor.changeEclat(changed)
|
||||
rollData.isReroll = true
|
||||
rollData.textBonus = "Bonus d'Eclat"
|
||||
@@ -588,15 +767,15 @@ export class HawkmoonUtility {
|
||||
static chatRollMenu(html, options) {
|
||||
let canApply = li => canvas.tokens.controlled.length && li.find(".hawkmoon-roll").length
|
||||
let canApplyBA = function (li) {
|
||||
let message = game.messages.get(li.attr("data-message-id"))
|
||||
let message = game.messages.get($(li).attr("data-message-id"))
|
||||
let rollData = message.getFlag("world", "hawkmoon-roll")
|
||||
let actor = this.getActorFromRollData(rollData)
|
||||
let actor = HawkmoonUtility.getActorFromRollData(rollData)
|
||||
return (!rollData.isReroll && actor.getBonneAventure() > 0)
|
||||
}
|
||||
let canApplyPE = function (li) {
|
||||
let message = game.messages.get(li.attr("data-message-id"))
|
||||
let message = game.messages.get($(li).attr("data-message-id"))
|
||||
let rollData = message.getFlag("world", "hawkmoon-roll")
|
||||
let actor = this.getActorFromRollData(rollData)
|
||||
let actor = HawkmoonUtility.getActorFromRollData(rollData)
|
||||
return (!rollData.isReroll && actor.getEclat() > 0)
|
||||
}
|
||||
options.push(
|
||||
@@ -620,7 +799,7 @@ export class HawkmoonUtility {
|
||||
name: "Relancer le dé (1 point d'Eclat)",
|
||||
icon: "<i class='fas fa-user-plus'></i>",
|
||||
condition: canApply && canApplyPE,
|
||||
callback: li => HawkmoonUtility.applyEclatRoll(li, -3, "reroll")
|
||||
callback: li => HawkmoonUtility.applyEclatRoll(li, -1, "reroll")
|
||||
}
|
||||
)
|
||||
return options
|
||||
@@ -629,11 +808,11 @@ export class HawkmoonUtility {
|
||||
/* -------------------------------------------- */
|
||||
static async confirmDelete(actorSheet, li) {
|
||||
let itemId = li.data("item-id");
|
||||
let msgTxt = "<p>Are you sure to remove this Item ?";
|
||||
let msgTxt = "<p>Etes vous certain de vouloir supprimer cet item ?";
|
||||
let buttons = {
|
||||
delete: {
|
||||
icon: '<i class="fas fa-check"></i>',
|
||||
label: "Yes, remove it",
|
||||
label: "Oui !",
|
||||
callback: () => {
|
||||
actorSheet.actor.deleteEmbeddedDocuments("Item", [itemId]);
|
||||
li.slideUp(200, () => actorSheet.render(false));
|
||||
@@ -641,12 +820,12 @@ export class HawkmoonUtility {
|
||||
},
|
||||
cancel: {
|
||||
icon: '<i class="fas fa-times"></i>',
|
||||
label: "Cancel"
|
||||
label: "Non"
|
||||
}
|
||||
}
|
||||
msgTxt += "</p>";
|
||||
let d = new Dialog({
|
||||
title: "Confirm removal",
|
||||
title: "Confirmer la suppression",
|
||||
content: msgTxt,
|
||||
buttons: buttons,
|
||||
default: "cancel"
|
||||
@@ -665,7 +844,6 @@ export class HawkmoonUtility {
|
||||
console.log(entryData)
|
||||
htmlTab += `<tr><td>@UUID[Compendium.${compName}.${entryData._id}]{${entryData.name}}</td>`
|
||||
htmlTab += `<td>${entryData.system.description}</td>`;
|
||||
//htmlTab += `<td>${entryData.system.resumebonus}</td>`;
|
||||
htmlTab += "</tr>\n";
|
||||
}
|
||||
htmlTab += "</table>";
|
||||
|
||||
31
modules/models/arme.mjs
Normal file
31
modules/models/arme.mjs
Normal file
@@ -0,0 +1,31 @@
|
||||
/**
|
||||
* Data model pour les armes
|
||||
*/
|
||||
export class ArmeDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
description: new fields.HTMLField({ initial: "" }),
|
||||
prixpo: new fields.NumberField({ initial: 0, integer: true }),
|
||||
prixca: new fields.NumberField({ initial: 0, integer: true }),
|
||||
prixsc: new fields.NumberField({ initial: 0, integer: true }),
|
||||
rarete: new fields.NumberField({ initial: 0, integer: true }),
|
||||
quantite: new fields.NumberField({ initial: 1, integer: true }),
|
||||
equipped: new fields.BooleanField({ initial: false }),
|
||||
typearme: new fields.StringField({ initial: "" }),
|
||||
armenaturelle: new fields.BooleanField({ initial: false }),
|
||||
armefortune: new fields.BooleanField({ initial: false }),
|
||||
bonusmaniementoff: new fields.NumberField({ initial: 0, integer: true }),
|
||||
seuildefense: new fields.NumberField({ initial: 0, integer: true }),
|
||||
onlevelonly: new fields.BooleanField({ initial: false }),
|
||||
degats: new fields.StringField({ initial: "" }),
|
||||
deuxmains: new fields.BooleanField({ initial: false }),
|
||||
percearmure: new fields.BooleanField({ initial: false }),
|
||||
percearmurevalue: new fields.NumberField({ initial: 0, integer: true }),
|
||||
courte: new fields.NumberField({ initial: 0, integer: true }),
|
||||
moyenne: new fields.NumberField({ initial: 0, integer: true }),
|
||||
longue: new fields.NumberField({ initial: 0, integer: true }),
|
||||
tr: new fields.NumberField({ initial: 0, integer: true })
|
||||
};
|
||||
}
|
||||
}
|
||||
28
modules/models/artefact.mjs
Normal file
28
modules/models/artefact.mjs
Normal file
@@ -0,0 +1,28 @@
|
||||
/**
|
||||
* Data model pour les artefacts
|
||||
*/
|
||||
export class ArtefactDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
description: new fields.HTMLField({ initial: "" }),
|
||||
prixpo: new fields.NumberField({ initial: 0, integer: true }),
|
||||
prixca: new fields.NumberField({ initial: 0, integer: true }),
|
||||
prixsc: new fields.NumberField({ initial: 0, integer: true }),
|
||||
rarete: new fields.NumberField({ initial: 0, integer: true }),
|
||||
quantite: new fields.NumberField({ initial: 1, integer: true }),
|
||||
equipped: new fields.BooleanField({ initial: false }),
|
||||
complexite: new fields.NumberField({ initial: 0, integer: true }),
|
||||
branche: new fields.StringField({ initial: "" }),
|
||||
branche2: new fields.StringField({ initial: "none" }),
|
||||
dureerealisation: new fields.StringField({ initial: "" }),
|
||||
tempsroute: new fields.StringField({ initial: "" }),
|
||||
effetdejeu: new fields.StringField({ initial: "" }),
|
||||
defautcourant: new fields.StringField({ initial: "" }),
|
||||
autrescarac: new fields.StringField({ initial: "" }),
|
||||
avantagespossibles: new fields.StringField({ initial: "" }),
|
||||
avantages: new fields.StringField({ initial: "" }),
|
||||
competences: new fields.StringField({ initial: "" })
|
||||
};
|
||||
}
|
||||
}
|
||||
53
modules/models/base-item.mjs
Normal file
53
modules/models/base-item.mjs
Normal file
@@ -0,0 +1,53 @@
|
||||
/**
|
||||
* Template de base pour tous les items
|
||||
*/
|
||||
export class BaseItemModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
description: new fields.HTMLField({ initial: "" })
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Template pour les équipements de base
|
||||
*/
|
||||
export class BaseEquipItemModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
prixpo: new fields.NumberField({ initial: 0, integer: true }),
|
||||
prixca: new fields.NumberField({ initial: 0, integer: true }),
|
||||
prixsc: new fields.NumberField({ initial: 0, integer: true }),
|
||||
rarete: new fields.NumberField({ initial: 0, integer: true }),
|
||||
quantite: new fields.NumberField({ initial: 1, integer: true }),
|
||||
equipped: new fields.BooleanField({ initial: false })
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Template pour l'automatisation
|
||||
*/
|
||||
export class AutomationItemModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
isautomated: new fields.BooleanField({ initial: false }),
|
||||
automations: new fields.ArrayField(
|
||||
new fields.SchemaField({
|
||||
id: new fields.StringField({ initial: "" }),
|
||||
eventtype: new fields.StringField({ initial: "on-drop" }),
|
||||
name: new fields.StringField({ initial: "" }),
|
||||
bonusname: new fields.StringField({ initial: "vigueur" }),
|
||||
bonus: new fields.NumberField({ initial: 0, integer: true }),
|
||||
competence: new fields.StringField({ initial: "" }),
|
||||
minLevel: new fields.NumberField({ initial: 0, integer: true }),
|
||||
baCost: new fields.NumberField({ initial: 0, integer: true })
|
||||
}),
|
||||
{ initial: [] }
|
||||
)
|
||||
};
|
||||
}
|
||||
}
|
||||
15
modules/models/cellule.mjs
Normal file
15
modules/models/cellule.mjs
Normal file
@@ -0,0 +1,15 @@
|
||||
/**
|
||||
* Data model pour les cellules
|
||||
*/
|
||||
export class CelluleDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
notoriete: new fields.NumberField({ initial: 0, integer: true }),
|
||||
resistance: new fields.NumberField({ initial: 0, integer: true }),
|
||||
developpement: new fields.NumberField({ initial: 0, integer: true }),
|
||||
members: new fields.ArrayField(new fields.StringField(), { initial: [] }),
|
||||
description: new fields.HTMLField({ initial: "" })
|
||||
};
|
||||
}
|
||||
}
|
||||
27
modules/models/competence.mjs
Normal file
27
modules/models/competence.mjs
Normal file
@@ -0,0 +1,27 @@
|
||||
/**
|
||||
* Data model pour les compétences
|
||||
*/
|
||||
export class CompetenceDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
description: new fields.HTMLField({ initial: "" }),
|
||||
niveau: new fields.NumberField({ initial: 0, integer: true }),
|
||||
attribut1: new fields.StringField({ initial: "" }),
|
||||
attribut2: new fields.StringField({ initial: "" }),
|
||||
attribut3: new fields.StringField({ initial: "" }),
|
||||
doublebonus: new fields.BooleanField({ initial: false }),
|
||||
predilections: new fields.ArrayField(
|
||||
new fields.SchemaField({
|
||||
id: new fields.StringField({ initial: "" }),
|
||||
name: new fields.StringField({ initial: "" }),
|
||||
description: new fields.StringField({ initial: "" }),
|
||||
acquise: new fields.BooleanField({ initial: false }),
|
||||
maitrise: new fields.BooleanField({ initial: false }),
|
||||
used: new fields.BooleanField({ initial: false })
|
||||
}),
|
||||
{ initial: [] }
|
||||
)
|
||||
};
|
||||
}
|
||||
}
|
||||
14
modules/models/contact.mjs
Normal file
14
modules/models/contact.mjs
Normal file
@@ -0,0 +1,14 @@
|
||||
/**
|
||||
* Data model pour les contacts
|
||||
*/
|
||||
export class ContactDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
contacttype: new fields.StringField({ initial: "" }),
|
||||
niveau: new fields.StringField({ initial: "" }),
|
||||
pointdev: new fields.NumberField({ initial: 0, integer: true }),
|
||||
description: new fields.HTMLField({ initial: "" })
|
||||
};
|
||||
}
|
||||
}
|
||||
97
modules/models/creature.mjs
Normal file
97
modules/models/creature.mjs
Normal file
@@ -0,0 +1,97 @@
|
||||
/**
|
||||
* Data model pour les créatures
|
||||
*/
|
||||
export class CreatureDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
// Template biodata
|
||||
biodata: new fields.SchemaField({
|
||||
name: new fields.StringField({ initial: "" }),
|
||||
age: new fields.NumberField({ initial: 0, integer: true }),
|
||||
poids: new fields.StringField({ initial: "" }),
|
||||
taille: new fields.StringField({ initial: "" }),
|
||||
cheveux: new fields.StringField({ initial: "" }),
|
||||
sexe: new fields.StringField({ initial: "" }),
|
||||
yeux: new fields.StringField({ initial: "" }),
|
||||
description: new fields.StringField({ initial: "" }),
|
||||
habitat: new fields.StringField({ initial: "" }),
|
||||
notes: new fields.StringField({ initial: "" }),
|
||||
statut: new fields.StringField({ initial: "" }),
|
||||
gmnotes: new fields.StringField({ initial: "" }),
|
||||
statutresistant: new fields.StringField({ initial: "commun" })
|
||||
}),
|
||||
// Template core
|
||||
subactors: new fields.ArrayField(new fields.StringField(), { initial: [] }),
|
||||
attributs: new fields.SchemaField({
|
||||
adr: new fields.SchemaField({
|
||||
label: new fields.StringField({ initial: "Adresse" }),
|
||||
labelnorm: new fields.StringField({ initial: "adresse" }),
|
||||
abbrev: new fields.StringField({ initial: "adr" }),
|
||||
value: new fields.NumberField({ initial: 1, integer: true })
|
||||
}),
|
||||
pui: new fields.SchemaField({
|
||||
label: new fields.StringField({ initial: "Puissance" }),
|
||||
labelnorm: new fields.StringField({ initial: "puissance" }),
|
||||
abbrev: new fields.StringField({ initial: "pui" }),
|
||||
value: new fields.NumberField({ initial: 1, integer: true })
|
||||
}),
|
||||
cla: new fields.SchemaField({
|
||||
label: new fields.StringField({ initial: "Clairvoyance" }),
|
||||
labelnorm: new fields.StringField({ initial: "clairvoyance" }),
|
||||
abbrev: new fields.StringField({ initial: "cla" }),
|
||||
value: new fields.NumberField({ initial: 1, integer: true })
|
||||
}),
|
||||
pre: new fields.SchemaField({
|
||||
label: new fields.StringField({ initial: "Présence" }),
|
||||
labelnorm: new fields.StringField({ initial: "presence" }),
|
||||
abbrev: new fields.StringField({ initial: "pre" }),
|
||||
value: new fields.NumberField({ initial: 0, integer: true })
|
||||
}),
|
||||
tre: new fields.SchemaField({
|
||||
label: new fields.StringField({ initial: "Trempe" }),
|
||||
labelnorm: new fields.StringField({ initial: "trempe" }),
|
||||
abbrev: new fields.StringField({ initial: "tre" }),
|
||||
value: new fields.NumberField({ initial: 0, integer: true })
|
||||
})
|
||||
}),
|
||||
bonneaventure: new fields.SchemaField({
|
||||
base: new fields.NumberField({ initial: 0, integer: true }),
|
||||
actuelle: new fields.NumberField({ initial: 0, integer: true })
|
||||
}),
|
||||
experience: new fields.SchemaField({
|
||||
value: new fields.NumberField({ initial: 0, integer: true })
|
||||
}),
|
||||
eclat: new fields.SchemaField({
|
||||
value: new fields.NumberField({ initial: 0, integer: true })
|
||||
}),
|
||||
sante: new fields.SchemaField({
|
||||
vigueur: new fields.NumberField({ initial: 0, integer: true }),
|
||||
etat: new fields.NumberField({ initial: 0, integer: true }),
|
||||
vigueurmodifier: new fields.NumberField({ initial: 0, integer: true }),
|
||||
nbcombativite: new fields.NumberField({ initial: 5, integer: true })
|
||||
}),
|
||||
adversite: new fields.SchemaField({
|
||||
bleue: new fields.NumberField({ initial: 0, integer: true }),
|
||||
rouge: new fields.NumberField({ initial: 0, integer: true }),
|
||||
noire: new fields.NumberField({ initial: 0, integer: true })
|
||||
}),
|
||||
vitesse: new fields.SchemaField({
|
||||
value: new fields.NumberField({ initial: 0, integer: true })
|
||||
}),
|
||||
combat: new fields.SchemaField({
|
||||
initbonus: new fields.NumberField({ initial: 0, integer: true }),
|
||||
vitessebonus: new fields.NumberField({ initial: 0, integer: true }),
|
||||
bonusdegats: new fields.NumberField({ initial: 0, integer: true }),
|
||||
attaquebonus: new fields.NumberField({ initial: 0, integer: true }),
|
||||
defensebonus: new fields.NumberField({ initial: 0, integer: true }),
|
||||
defensetotale: new fields.BooleanField({ initial: false }),
|
||||
monte: new fields.BooleanField({ initial: false })
|
||||
}),
|
||||
// Propriétés spécifiques aux créatures
|
||||
ressources: new fields.SchemaField({
|
||||
value: new fields.NumberField({ initial: 0, integer: true })
|
||||
})
|
||||
};
|
||||
}
|
||||
}
|
||||
17
modules/models/equipement.mjs
Normal file
17
modules/models/equipement.mjs
Normal file
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Data model pour l'équipement
|
||||
*/
|
||||
export class EquipementDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
description: new fields.HTMLField({ initial: "" }),
|
||||
prixpo: new fields.NumberField({ initial: 0, integer: true }),
|
||||
prixca: new fields.NumberField({ initial: 0, integer: true }),
|
||||
prixsc: new fields.NumberField({ initial: 0, integer: true }),
|
||||
rarete: new fields.NumberField({ initial: 0, integer: true }),
|
||||
quantite: new fields.NumberField({ initial: 1, integer: true }),
|
||||
equipped: new fields.BooleanField({ initial: false })
|
||||
};
|
||||
}
|
||||
}
|
||||
12
modules/models/historique.mjs
Normal file
12
modules/models/historique.mjs
Normal file
@@ -0,0 +1,12 @@
|
||||
/**
|
||||
* Data model pour les historiques
|
||||
*/
|
||||
export class HistoriqueDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
description: new fields.HTMLField({ initial: "" }),
|
||||
bonusmalus: new fields.StringField({ initial: "" })
|
||||
};
|
||||
}
|
||||
}
|
||||
26
modules/models/index.mjs
Normal file
26
modules/models/index.mjs
Normal file
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* Index des DataModels pour Hawkmoon CYD
|
||||
* Ce fichier centralise tous les exports des modèles de données
|
||||
*/
|
||||
|
||||
// Modèles d'items
|
||||
export { TalentDataModel } from './talent.mjs';
|
||||
export { HistoriqueDataModel } from './historique.mjs';
|
||||
export { ProfilDataModel } from './profil.mjs';
|
||||
export { CompetenceDataModel } from './competence.mjs';
|
||||
export { ArmeDataModel } from './arme.mjs';
|
||||
export { ProtectionDataModel } from './protection.mjs';
|
||||
export { MonnaieDataModel } from './monnaie.mjs';
|
||||
export { EquipementDataModel } from './equipement.mjs';
|
||||
export { ArtefactDataModel } from './artefact.mjs';
|
||||
export { RessourceDataModel } from './ressource.mjs';
|
||||
export { ContactDataModel } from './contact.mjs';
|
||||
export { MutationDataModel } from './mutation.mjs';
|
||||
|
||||
// Modèles d'acteurs
|
||||
export { PersonnageDataModel } from './personnage.mjs';
|
||||
export { CelluleDataModel } from './cellule.mjs';
|
||||
export { CreatureDataModel } from './creature.mjs';
|
||||
|
||||
// Templates de base (si nécessaire pour extension)
|
||||
export { BaseItemModel, BaseEquipItemModel, AutomationItemModel } from './base-item.mjs';
|
||||
17
modules/models/monnaie.mjs
Normal file
17
modules/models/monnaie.mjs
Normal file
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Data model pour les monnaies
|
||||
*/
|
||||
export class MonnaieDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
description: new fields.HTMLField({ initial: "" }),
|
||||
prixpo: new fields.NumberField({ initial: 0, integer: true }),
|
||||
prixca: new fields.NumberField({ initial: 0, integer: true }),
|
||||
prixsc: new fields.NumberField({ initial: 0, integer: true }),
|
||||
rarete: new fields.NumberField({ initial: 0, integer: true }),
|
||||
quantite: new fields.NumberField({ initial: 1, integer: true }),
|
||||
equipped: new fields.BooleanField({ initial: false })
|
||||
};
|
||||
}
|
||||
}
|
||||
14
modules/models/mutation.mjs
Normal file
14
modules/models/mutation.mjs
Normal file
@@ -0,0 +1,14 @@
|
||||
/**
|
||||
* Data model pour les mutations
|
||||
*/
|
||||
export class MutationDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
description: new fields.HTMLField({ initial: "" }),
|
||||
mutationcategorie: new fields.StringField({ initial: "tares_communes" }),
|
||||
hascomplexite: new fields.BooleanField({ initial: false }),
|
||||
complexite: new fields.NumberField({ initial: 0, integer: true })
|
||||
};
|
||||
}
|
||||
}
|
||||
93
modules/models/personnage.mjs
Normal file
93
modules/models/personnage.mjs
Normal file
@@ -0,0 +1,93 @@
|
||||
/**
|
||||
* Data model pour les personnages
|
||||
*/
|
||||
export class PersonnageDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
// Template biodata
|
||||
biodata: new fields.SchemaField({
|
||||
name: new fields.StringField({ initial: "" }),
|
||||
age: new fields.NumberField({ initial: 0, integer: true }),
|
||||
poids: new fields.StringField({ initial: "" }),
|
||||
taille: new fields.StringField({ initial: "" }),
|
||||
cheveux: new fields.StringField({ initial: "" }),
|
||||
sexe: new fields.StringField({ initial: "" }),
|
||||
yeux: new fields.StringField({ initial: "" }),
|
||||
description: new fields.StringField({ initial: "" }),
|
||||
habitat: new fields.StringField({ initial: "" }),
|
||||
notes: new fields.StringField({ initial: "" }),
|
||||
statut: new fields.StringField({ initial: "" }),
|
||||
gmnotes: new fields.StringField({ initial: "" }),
|
||||
statutresistant: new fields.StringField({ initial: "commun" })
|
||||
}),
|
||||
// Template core
|
||||
subactors: new fields.ArrayField(new fields.StringField(), { initial: [] }),
|
||||
attributs: new fields.SchemaField({
|
||||
adr: new fields.SchemaField({
|
||||
label: new fields.StringField({ initial: "Adresse" }),
|
||||
labelnorm: new fields.StringField({ initial: "adresse" }),
|
||||
abbrev: new fields.StringField({ initial: "adr" }),
|
||||
value: new fields.NumberField({ initial: 1, integer: true })
|
||||
}),
|
||||
pui: new fields.SchemaField({
|
||||
label: new fields.StringField({ initial: "Puissance" }),
|
||||
labelnorm: new fields.StringField({ initial: "puissance" }),
|
||||
abbrev: new fields.StringField({ initial: "pui" }),
|
||||
value: new fields.NumberField({ initial: 1, integer: true })
|
||||
}),
|
||||
cla: new fields.SchemaField({
|
||||
label: new fields.StringField({ initial: "Clairvoyance" }),
|
||||
labelnorm: new fields.StringField({ initial: "clairvoyance" }),
|
||||
abbrev: new fields.StringField({ initial: "cla" }),
|
||||
value: new fields.NumberField({ initial: 1, integer: true })
|
||||
}),
|
||||
pre: new fields.SchemaField({
|
||||
label: new fields.StringField({ initial: "Présence" }),
|
||||
labelnorm: new fields.StringField({ initial: "presence" }),
|
||||
abbrev: new fields.StringField({ initial: "pre" }),
|
||||
value: new fields.NumberField({ initial: 0, integer: true })
|
||||
}),
|
||||
tre: new fields.SchemaField({
|
||||
label: new fields.StringField({ initial: "Trempe" }),
|
||||
labelnorm: new fields.StringField({ initial: "trempe" }),
|
||||
abbrev: new fields.StringField({ initial: "tre" }),
|
||||
value: new fields.NumberField({ initial: 0, integer: true })
|
||||
})
|
||||
}),
|
||||
bonneaventure: new fields.SchemaField({
|
||||
base: new fields.NumberField({ initial: 0, integer: true }),
|
||||
actuelle: new fields.NumberField({ initial: 0, integer: true })
|
||||
}),
|
||||
experience: new fields.SchemaField({
|
||||
value: new fields.NumberField({ initial: 0, integer: true })
|
||||
}),
|
||||
eclat: new fields.SchemaField({
|
||||
value: new fields.NumberField({ initial: 0, integer: true })
|
||||
}),
|
||||
sante: new fields.SchemaField({
|
||||
vigueur: new fields.NumberField({ initial: 0, integer: true }),
|
||||
etat: new fields.NumberField({ initial: 0, integer: true }),
|
||||
vigueurmodifier: new fields.NumberField({ initial: 0, integer: true }),
|
||||
nbcombativite: new fields.NumberField({ initial: 5, integer: true })
|
||||
}),
|
||||
adversite: new fields.SchemaField({
|
||||
bleue: new fields.NumberField({ initial: 0, integer: true }),
|
||||
rouge: new fields.NumberField({ initial: 0, integer: true }),
|
||||
noire: new fields.NumberField({ initial: 0, integer: true })
|
||||
}),
|
||||
vitesse: new fields.SchemaField({
|
||||
value: new fields.NumberField({ initial: 0, integer: true })
|
||||
}),
|
||||
combat: new fields.SchemaField({
|
||||
initbonus: new fields.NumberField({ initial: 0, integer: true }),
|
||||
vitessebonus: new fields.NumberField({ initial: 0, integer: true }),
|
||||
bonusdegats: new fields.NumberField({ initial: 0, integer: true }),
|
||||
attaquebonus: new fields.NumberField({ initial: 0, integer: true }),
|
||||
defensebonus: new fields.NumberField({ initial: 0, integer: true }),
|
||||
defensetotale: new fields.BooleanField({ initial: false }),
|
||||
monte: new fields.BooleanField({ initial: false })
|
||||
})
|
||||
};
|
||||
}
|
||||
}
|
||||
23
modules/models/profil.mjs
Normal file
23
modules/models/profil.mjs
Normal file
@@ -0,0 +1,23 @@
|
||||
/**
|
||||
* Data model pour les profils
|
||||
*/
|
||||
export class ProfilDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
description: new fields.HTMLField({ initial: "" }),
|
||||
exemples: new fields.StringField({ initial: "" }),
|
||||
attribut1: new fields.StringField({ initial: "" }),
|
||||
attribut2: new fields.StringField({ initial: "" }),
|
||||
attribut3: new fields.StringField({ initial: "" }),
|
||||
competences: new fields.StringField({ initial: "" }),
|
||||
talentsinitie: new fields.StringField({ initial: "" }),
|
||||
prerequisaguerri: new fields.StringField({ initial: "" }),
|
||||
talentsaguerri: new fields.StringField({ initial: "" }),
|
||||
prerequismaitre: new fields.StringField({ initial: "" }),
|
||||
talentsmaitre: new fields.StringField({ initial: "" }),
|
||||
celluleinfo: new fields.StringField({ initial: "" }),
|
||||
equipement: new fields.StringField({ initial: "" })
|
||||
};
|
||||
}
|
||||
}
|
||||
19
modules/models/protection.mjs
Normal file
19
modules/models/protection.mjs
Normal file
@@ -0,0 +1,19 @@
|
||||
/**
|
||||
* Data model pour les protections
|
||||
*/
|
||||
export class ProtectionDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
description: new fields.HTMLField({ initial: "" }),
|
||||
prixpo: new fields.NumberField({ initial: 0, integer: true }),
|
||||
prixca: new fields.NumberField({ initial: 0, integer: true }),
|
||||
prixsc: new fields.NumberField({ initial: 0, integer: true }),
|
||||
rarete: new fields.NumberField({ initial: 0, integer: true }),
|
||||
quantite: new fields.NumberField({ initial: 1, integer: true }),
|
||||
equipped: new fields.BooleanField({ initial: false }),
|
||||
protection: new fields.NumberField({ initial: 0, integer: true }),
|
||||
adversitepoids: new fields.NumberField({ initial: 0, integer: true })
|
||||
};
|
||||
}
|
||||
}
|
||||
12
modules/models/ressource.mjs
Normal file
12
modules/models/ressource.mjs
Normal file
@@ -0,0 +1,12 @@
|
||||
/**
|
||||
* Data model pour les ressources
|
||||
*/
|
||||
export class RessourceDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
pointdev: new fields.NumberField({ initial: 0, integer: true }),
|
||||
description: new fields.HTMLField({ initial: "" })
|
||||
};
|
||||
}
|
||||
}
|
||||
30
modules/models/talent.mjs
Normal file
30
modules/models/talent.mjs
Normal file
@@ -0,0 +1,30 @@
|
||||
/**
|
||||
* Data model pour les talents
|
||||
*/
|
||||
export class TalentDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
description: new fields.HTMLField({ initial: "" }),
|
||||
isautomated: new fields.BooleanField({ initial: false }),
|
||||
automations: new fields.ArrayField(
|
||||
new fields.SchemaField({
|
||||
id: new fields.StringField({ initial: "" }),
|
||||
eventtype: new fields.StringField({ initial: "on-drop" }),
|
||||
name: new fields.StringField({ initial: "" }),
|
||||
bonusname: new fields.StringField({ initial: "vigueur" }),
|
||||
bonus: new fields.NumberField({ initial: 0, integer: true }),
|
||||
competence: new fields.StringField({ initial: "" }),
|
||||
minLevel: new fields.NumberField({ initial: 0, integer: true }),
|
||||
baCost: new fields.NumberField({ initial: 0, integer: true })
|
||||
}),
|
||||
{ initial: [] }
|
||||
),
|
||||
talenttype: new fields.StringField({ initial: "" }),
|
||||
utilisation: new fields.StringField({ initial: "" }),
|
||||
prerequis: new fields.StringField({ initial: "" }),
|
||||
resumebonus: new fields.StringField({ initial: "" }),
|
||||
used: new fields.BooleanField({ initial: false })
|
||||
};
|
||||
}
|
||||
}
|
||||
BIN
packs/aides-de-jeu/000276.ldb
Normal file
BIN
packs/aides-de-jeu/000276.ldb
Normal file
Binary file not shown.
0
packs/aides-de-jeu/000335.log
Normal file
0
packs/aides-de-jeu/000335.log
Normal file
1
packs/aides-de-jeu/CURRENT
Normal file
1
packs/aides-de-jeu/CURRENT
Normal file
@@ -0,0 +1 @@
|
||||
MANIFEST-000333
|
||||
0
packs/aides-de-jeu/LOCK
Normal file
0
packs/aides-de-jeu/LOCK
Normal file
8
packs/aides-de-jeu/LOG
Normal file
8
packs/aides-de-jeu/LOG
Normal file
@@ -0,0 +1,8 @@
|
||||
2026/01/05-22:20:56.155164 7f93eb7fe6c0 Recovering log #331
|
||||
2026/01/05-22:20:56.166270 7f93eb7fe6c0 Delete type=3 #329
|
||||
2026/01/05-22:20:56.166327 7f93eb7fe6c0 Delete type=0 #331
|
||||
2026/01/05-22:39:51.165703 7f93e9ffb6c0 Level-0 table #336: started
|
||||
2026/01/05-22:39:51.165730 7f93e9ffb6c0 Level-0 table #336: 0 bytes OK
|
||||
2026/01/05-22:39:51.171765 7f93e9ffb6c0 Delete type=0 #334
|
||||
2026/01/05-22:39:51.199079 7f93e9ffb6c0 Manual compaction at level-0 from '!journal!MUbViCE2PkVxlzqe' @ 72057594037927935 : 1 .. '!journal.pages!gVybbv17TFY8o3Y4.fQidyqfF1TbsZKHM' @ 0 : 0; will stop at (end)
|
||||
2026/01/05-22:39:51.199117 7f93e9ffb6c0 Manual compaction at level-1 from '!journal!MUbViCE2PkVxlzqe' @ 72057594037927935 : 1 .. '!journal.pages!gVybbv17TFY8o3Y4.fQidyqfF1TbsZKHM' @ 0 : 0; will stop at (end)
|
||||
8
packs/aides-de-jeu/LOG.old
Normal file
8
packs/aides-de-jeu/LOG.old
Normal file
@@ -0,0 +1,8 @@
|
||||
2025/11/21-21:17:11.288531 7f34ccff96c0 Recovering log #327
|
||||
2025/11/21-21:17:11.303357 7f34ccff96c0 Delete type=3 #325
|
||||
2025/11/21-21:17:11.303441 7f34ccff96c0 Delete type=0 #327
|
||||
2025/11/21-21:20:34.182000 7f322ffff6c0 Level-0 table #332: started
|
||||
2025/11/21-21:20:34.182040 7f322ffff6c0 Level-0 table #332: 0 bytes OK
|
||||
2025/11/21-21:20:34.189103 7f322ffff6c0 Delete type=0 #330
|
||||
2025/11/21-21:20:34.199156 7f322ffff6c0 Manual compaction at level-0 from '!journal!MUbViCE2PkVxlzqe' @ 72057594037927935 : 1 .. '!journal.pages!gVybbv17TFY8o3Y4.fQidyqfF1TbsZKHM' @ 0 : 0; will stop at (end)
|
||||
2025/11/21-21:20:34.220809 7f322ffff6c0 Manual compaction at level-1 from '!journal!MUbViCE2PkVxlzqe' @ 72057594037927935 : 1 .. '!journal.pages!gVybbv17TFY8o3Y4.fQidyqfF1TbsZKHM' @ 0 : 0; will stop at (end)
|
||||
BIN
packs/aides-de-jeu/MANIFEST-000333
Normal file
BIN
packs/aides-de-jeu/MANIFEST-000333
Normal file
Binary file not shown.
BIN
packs/armes/000275.ldb
Normal file
BIN
packs/armes/000275.ldb
Normal file
Binary file not shown.
0
packs/armes/000334.log
Normal file
0
packs/armes/000334.log
Normal file
1
packs/armes/CURRENT
Normal file
1
packs/armes/CURRENT
Normal file
@@ -0,0 +1 @@
|
||||
MANIFEST-000332
|
||||
0
packs/armes/LOCK
Normal file
0
packs/armes/LOCK
Normal file
8
packs/armes/LOG
Normal file
8
packs/armes/LOG
Normal file
@@ -0,0 +1,8 @@
|
||||
2026/01/05-22:20:56.048400 7f93eaffd6c0 Recovering log #330
|
||||
2026/01/05-22:20:56.058614 7f93eaffd6c0 Delete type=3 #328
|
||||
2026/01/05-22:20:56.058678 7f93eaffd6c0 Delete type=0 #330
|
||||
2026/01/05-22:39:51.125881 7f93e9ffb6c0 Level-0 table #335: started
|
||||
2026/01/05-22:39:51.125907 7f93e9ffb6c0 Level-0 table #335: 0 bytes OK
|
||||
2026/01/05-22:39:51.131746 7f93e9ffb6c0 Delete type=0 #333
|
||||
2026/01/05-22:39:51.137885 7f93e9ffb6c0 Manual compaction at level-0 from '!items!0fit7HelSjaFtXcW' @ 72057594037927935 : 1 .. '!items!wxrzP3NyiHiYnAMJ' @ 0 : 0; will stop at (end)
|
||||
2026/01/05-22:39:51.137919 7f93e9ffb6c0 Manual compaction at level-1 from '!items!0fit7HelSjaFtXcW' @ 72057594037927935 : 1 .. '!items!wxrzP3NyiHiYnAMJ' @ 0 : 0; will stop at (end)
|
||||
8
packs/armes/LOG.old
Normal file
8
packs/armes/LOG.old
Normal file
@@ -0,0 +1,8 @@
|
||||
2025/11/21-21:17:11.119952 7f34cd7fa6c0 Recovering log #326
|
||||
2025/11/21-21:17:11.135840 7f34cd7fa6c0 Delete type=3 #324
|
||||
2025/11/21-21:17:11.135940 7f34cd7fa6c0 Delete type=0 #326
|
||||
2025/11/21-21:20:34.115063 7f322ffff6c0 Level-0 table #331: started
|
||||
2025/11/21-21:20:34.115090 7f322ffff6c0 Level-0 table #331: 0 bytes OK
|
||||
2025/11/21-21:20:34.121038 7f322ffff6c0 Delete type=0 #329
|
||||
2025/11/21-21:20:34.121241 7f322ffff6c0 Manual compaction at level-0 from '!items!0fit7HelSjaFtXcW' @ 72057594037927935 : 1 .. '!items!wxrzP3NyiHiYnAMJ' @ 0 : 0; will stop at (end)
|
||||
2025/11/21-21:20:34.121271 7f322ffff6c0 Manual compaction at level-1 from '!items!0fit7HelSjaFtXcW' @ 72057594037927935 : 1 .. '!items!wxrzP3NyiHiYnAMJ' @ 0 : 0; will stop at (end)
|
||||
BIN
packs/armes/MANIFEST-000332
Normal file
BIN
packs/armes/MANIFEST-000332
Normal file
Binary file not shown.
BIN
packs/competences-creatures/000275.ldb
Normal file
BIN
packs/competences-creatures/000275.ldb
Normal file
Binary file not shown.
0
packs/competences-creatures/000334.log
Normal file
0
packs/competences-creatures/000334.log
Normal file
1
packs/competences-creatures/CURRENT
Normal file
1
packs/competences-creatures/CURRENT
Normal file
@@ -0,0 +1 @@
|
||||
MANIFEST-000332
|
||||
0
packs/competences-creatures/LOCK
Normal file
0
packs/competences-creatures/LOCK
Normal file
8
packs/competences-creatures/LOG
Normal file
8
packs/competences-creatures/LOG
Normal file
@@ -0,0 +1,8 @@
|
||||
2026/01/05-22:20:56.023009 7f93eb7fe6c0 Recovering log #330
|
||||
2026/01/05-22:20:56.032779 7f93eb7fe6c0 Delete type=3 #328
|
||||
2026/01/05-22:20:56.032853 7f93eb7fe6c0 Delete type=0 #330
|
||||
2026/01/05-22:39:51.087705 7f93e9ffb6c0 Level-0 table #335: started
|
||||
2026/01/05-22:39:51.087797 7f93e9ffb6c0 Level-0 table #335: 0 bytes OK
|
||||
2026/01/05-22:39:51.094096 7f93e9ffb6c0 Delete type=0 #333
|
||||
2026/01/05-22:39:51.112531 7f93e9ffb6c0 Manual compaction at level-0 from '!items!0nhTxujlIUB63Aqt' @ 72057594037927935 : 1 .. '!items!tFU5yISK6spdNWco' @ 0 : 0; will stop at (end)
|
||||
2026/01/05-22:39:51.112576 7f93e9ffb6c0 Manual compaction at level-1 from '!items!0nhTxujlIUB63Aqt' @ 72057594037927935 : 1 .. '!items!tFU5yISK6spdNWco' @ 0 : 0; will stop at (end)
|
||||
8
packs/competences-creatures/LOG.old
Normal file
8
packs/competences-creatures/LOG.old
Normal file
@@ -0,0 +1,8 @@
|
||||
2025/11/21-21:17:11.082663 7f34ccff96c0 Recovering log #326
|
||||
2025/11/21-21:17:11.097415 7f34ccff96c0 Delete type=3 #324
|
||||
2025/11/21-21:17:11.097522 7f34ccff96c0 Delete type=0 #326
|
||||
2025/11/21-21:20:34.082672 7f322ffff6c0 Level-0 table #331: started
|
||||
2025/11/21-21:20:34.082698 7f322ffff6c0 Level-0 table #331: 0 bytes OK
|
||||
2025/11/21-21:20:34.088631 7f322ffff6c0 Delete type=0 #329
|
||||
2025/11/21-21:20:34.094927 7f322ffff6c0 Manual compaction at level-0 from '!items!0nhTxujlIUB63Aqt' @ 72057594037927935 : 1 .. '!items!tFU5yISK6spdNWco' @ 0 : 0; will stop at (end)
|
||||
2025/11/21-21:20:34.094971 7f322ffff6c0 Manual compaction at level-1 from '!items!0nhTxujlIUB63Aqt' @ 72057594037927935 : 1 .. '!items!tFU5yISK6spdNWco' @ 0 : 0; will stop at (end)
|
||||
BIN
packs/competences-creatures/MANIFEST-000332
Normal file
BIN
packs/competences-creatures/MANIFEST-000332
Normal file
Binary file not shown.
BIN
packs/competences/000275.ldb
Normal file
BIN
packs/competences/000275.ldb
Normal file
Binary file not shown.
0
packs/competences/000334.log
Normal file
0
packs/competences/000334.log
Normal file
1
packs/competences/CURRENT
Normal file
1
packs/competences/CURRENT
Normal file
@@ -0,0 +1 @@
|
||||
MANIFEST-000332
|
||||
0
packs/competences/LOCK
Normal file
0
packs/competences/LOCK
Normal file
8
packs/competences/LOG
Normal file
8
packs/competences/LOG
Normal file
@@ -0,0 +1,8 @@
|
||||
2026/01/05-22:20:55.998572 7f93ea7fc6c0 Recovering log #330
|
||||
2026/01/05-22:20:56.008503 7f93ea7fc6c0 Delete type=3 #328
|
||||
2026/01/05-22:20:56.008556 7f93ea7fc6c0 Delete type=0 #330
|
||||
2026/01/05-22:39:51.100430 7f93e9ffb6c0 Level-0 table #335: started
|
||||
2026/01/05-22:39:51.100453 7f93e9ffb6c0 Level-0 table #335: 0 bytes OK
|
||||
2026/01/05-22:39:51.106283 7f93e9ffb6c0 Delete type=0 #333
|
||||
2026/01/05-22:39:51.112557 7f93e9ffb6c0 Manual compaction at level-0 from '!items!15IDGG6JoZnRCQtY' @ 72057594037927935 : 1 .. '!items!yI1zY5k8mAdx9wHK' @ 0 : 0; will stop at (end)
|
||||
2026/01/05-22:39:51.112589 7f93e9ffb6c0 Manual compaction at level-1 from '!items!15IDGG6JoZnRCQtY' @ 72057594037927935 : 1 .. '!items!yI1zY5k8mAdx9wHK' @ 0 : 0; will stop at (end)
|
||||
8
packs/competences/LOG.old
Normal file
8
packs/competences/LOG.old
Normal file
@@ -0,0 +1,8 @@
|
||||
2025/11/21-21:17:11.044217 7f34ce7fc6c0 Recovering log #326
|
||||
2025/11/21-21:17:11.059351 7f34ce7fc6c0 Delete type=3 #324
|
||||
2025/11/21-21:17:11.059409 7f34ce7fc6c0 Delete type=0 #326
|
||||
2025/11/21-21:20:34.076024 7f322ffff6c0 Level-0 table #331: started
|
||||
2025/11/21-21:20:34.076057 7f322ffff6c0 Level-0 table #331: 0 bytes OK
|
||||
2025/11/21-21:20:34.082546 7f322ffff6c0 Delete type=0 #329
|
||||
2025/11/21-21:20:34.094915 7f322ffff6c0 Manual compaction at level-0 from '!items!15IDGG6JoZnRCQtY' @ 72057594037927935 : 1 .. '!items!yI1zY5k8mAdx9wHK' @ 0 : 0; will stop at (end)
|
||||
2025/11/21-21:20:34.094962 7f322ffff6c0 Manual compaction at level-1 from '!items!15IDGG6JoZnRCQtY' @ 72057594037927935 : 1 .. '!items!yI1zY5k8mAdx9wHK' @ 0 : 0; will stop at (end)
|
||||
BIN
packs/competences/MANIFEST-000332
Normal file
BIN
packs/competences/MANIFEST-000332
Normal file
Binary file not shown.
BIN
packs/equipement/000275.ldb
Normal file
BIN
packs/equipement/000275.ldb
Normal file
Binary file not shown.
0
packs/equipement/000334.log
Normal file
0
packs/equipement/000334.log
Normal file
1
packs/equipement/CURRENT
Normal file
1
packs/equipement/CURRENT
Normal file
@@ -0,0 +1 @@
|
||||
MANIFEST-000332
|
||||
0
packs/equipement/LOCK
Normal file
0
packs/equipement/LOCK
Normal file
8
packs/equipement/LOG
Normal file
8
packs/equipement/LOG
Normal file
@@ -0,0 +1,8 @@
|
||||
2026/01/05-22:20:56.073305 7f93eb7fe6c0 Recovering log #330
|
||||
2026/01/05-22:20:56.084269 7f93eb7fe6c0 Delete type=3 #328
|
||||
2026/01/05-22:20:56.084336 7f93eb7fe6c0 Delete type=0 #330
|
||||
2026/01/05-22:39:51.112726 7f93e9ffb6c0 Level-0 table #335: started
|
||||
2026/01/05-22:39:51.112760 7f93e9ffb6c0 Level-0 table #335: 0 bytes OK
|
||||
2026/01/05-22:39:51.119133 7f93e9ffb6c0 Delete type=0 #333
|
||||
2026/01/05-22:39:51.137862 7f93e9ffb6c0 Manual compaction at level-0 from '!items!0BopmCu8vGK2923j' @ 72057594037927935 : 1 .. '!items!zYx0Ak2y1LNTcKlO' @ 0 : 0; will stop at (end)
|
||||
2026/01/05-22:39:51.137903 7f93e9ffb6c0 Manual compaction at level-1 from '!items!0BopmCu8vGK2923j' @ 72057594037927935 : 1 .. '!items!zYx0Ak2y1LNTcKlO' @ 0 : 0; will stop at (end)
|
||||
8
packs/equipement/LOG.old
Normal file
8
packs/equipement/LOG.old
Normal file
@@ -0,0 +1,8 @@
|
||||
2025/11/21-21:17:11.157103 7f34ce7fc6c0 Recovering log #326
|
||||
2025/11/21-21:17:11.172875 7f34ce7fc6c0 Delete type=3 #324
|
||||
2025/11/21-21:17:11.172939 7f34ce7fc6c0 Delete type=0 #326
|
||||
2025/11/21-21:20:34.095092 7f322ffff6c0 Level-0 table #331: started
|
||||
2025/11/21-21:20:34.095126 7f322ffff6c0 Level-0 table #331: 0 bytes OK
|
||||
2025/11/21-21:20:34.102295 7f322ffff6c0 Delete type=0 #329
|
||||
2025/11/21-21:20:34.121183 7f322ffff6c0 Manual compaction at level-0 from '!items!0BopmCu8vGK2923j' @ 72057594037927935 : 1 .. '!items!zYx0Ak2y1LNTcKlO' @ 0 : 0; will stop at (end)
|
||||
2025/11/21-21:20:34.121249 7f322ffff6c0 Manual compaction at level-1 from '!items!0BopmCu8vGK2923j' @ 72057594037927935 : 1 .. '!items!zYx0Ak2y1LNTcKlO' @ 0 : 0; will stop at (end)
|
||||
BIN
packs/equipement/MANIFEST-000332
Normal file
BIN
packs/equipement/MANIFEST-000332
Normal file
Binary file not shown.
BIN
packs/historiques/000275.ldb
Normal file
BIN
packs/historiques/000275.ldb
Normal file
Binary file not shown.
0
packs/historiques/000334.log
Normal file
0
packs/historiques/000334.log
Normal file
1
packs/historiques/CURRENT
Normal file
1
packs/historiques/CURRENT
Normal file
@@ -0,0 +1 @@
|
||||
MANIFEST-000332
|
||||
0
packs/historiques/LOCK
Normal file
0
packs/historiques/LOCK
Normal file
8
packs/historiques/LOG
Normal file
8
packs/historiques/LOG
Normal file
@@ -0,0 +1,8 @@
|
||||
2026/01/05-22:20:56.034759 7f93ea7fc6c0 Recovering log #330
|
||||
2026/01/05-22:20:56.045303 7f93ea7fc6c0 Delete type=3 #328
|
||||
2026/01/05-22:20:56.045387 7f93ea7fc6c0 Delete type=0 #330
|
||||
2026/01/05-22:39:51.094206 7f93e9ffb6c0 Level-0 table #335: started
|
||||
2026/01/05-22:39:51.094228 7f93e9ffb6c0 Level-0 table #335: 0 bytes OK
|
||||
2026/01/05-22:39:51.100330 7f93e9ffb6c0 Delete type=0 #333
|
||||
2026/01/05-22:39:51.112546 7f93e9ffb6c0 Manual compaction at level-0 from '!items!15foLG7y3LUXNzkK' @ 72057594037927935 : 1 .. '!items!z1HtkvazCGHut7cz' @ 0 : 0; will stop at (end)
|
||||
2026/01/05-22:39:51.112583 7f93e9ffb6c0 Manual compaction at level-1 from '!items!15foLG7y3LUXNzkK' @ 72057594037927935 : 1 .. '!items!z1HtkvazCGHut7cz' @ 0 : 0; will stop at (end)
|
||||
8
packs/historiques/LOG.old
Normal file
8
packs/historiques/LOG.old
Normal file
@@ -0,0 +1,8 @@
|
||||
2025/11/21-21:17:11.100312 7f34ce7fc6c0 Recovering log #326
|
||||
2025/11/21-21:17:11.117500 7f34ce7fc6c0 Delete type=3 #324
|
||||
2025/11/21-21:17:11.117567 7f34ce7fc6c0 Delete type=0 #326
|
||||
2025/11/21-21:20:34.069446 7f322ffff6c0 Level-0 table #331: started
|
||||
2025/11/21-21:20:34.069505 7f322ffff6c0 Level-0 table #331: 0 bytes OK
|
||||
2025/11/21-21:20:34.075899 7f322ffff6c0 Delete type=0 #329
|
||||
2025/11/21-21:20:34.094892 7f322ffff6c0 Manual compaction at level-0 from '!items!15foLG7y3LUXNzkK' @ 72057594037927935 : 1 .. '!items!z1HtkvazCGHut7cz' @ 0 : 0; will stop at (end)
|
||||
2025/11/21-21:20:34.094951 7f322ffff6c0 Manual compaction at level-1 from '!items!15foLG7y3LUXNzkK' @ 72057594037927935 : 1 .. '!items!z1HtkvazCGHut7cz' @ 0 : 0; will stop at (end)
|
||||
BIN
packs/historiques/MANIFEST-000332
Normal file
BIN
packs/historiques/MANIFEST-000332
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user