Compare commits

...

64 Commits

Author SHA1 Message Date
7a7398f8ca Correction sur styles CSS 2025-10-20 22:30:15 +02:00
93600f7e13 Correction sur styles CSS 2025-10-20 22:29:22 +02:00
a6fa3afbee Double adversités 2025-08-24 17:00:06 +02:00
1051349dd0 Correction sur usage BA sur un jet impair au D20 2025-06-24 21:04:58 +02:00
a245b0e87c Corrections sur couleur des pages dans les journaux 2025-06-03 13:32:11 +02:00
c9ce3367ed Corrections sur couleur des pages dans les journaux 2025-06-03 13:31:17 +02:00
e95e068112 Fix perte de combatitivité sur action d'un joueur 2025-06-03 09:37:50 +02:00
6dd63a2c54 Hawkmoon : Foundry v13 migration 2025-04-30 23:26:24 +02:00
650e4b7449 Hawkmoon : Foundry v13 migration 2025-04-30 23:24:55 +02:00
3f27482ad9 Hawkmoon : Foundry v13 migraton 2025-04-30 23:23:32 +02:00
436b282ff5 Correction sur se désengager 2025-03-28 18:09:36 +01:00
39f8cfdbcc Correction sur 2 attaques avec ambidextrie 2025-03-28 14:56:52 +01:00
24a57a906e Fix protection pour creatures 2025-02-07 20:43:03 +01:00
667f3678fb Fix protection pour creatures 2025-02-07 20:42:14 +01:00
d5dd9e5bf7 Cleanup welcome scene 2024-08-23 13:49:57 +02:00
3403b72d1f ajout item sur cellule + augmentation bonus et difficultés 2024-08-22 14:39:42 +02:00
8a4487c833 ajout item sur cellule + augmentation bonus et difficultés 2024-08-22 14:39:30 +02:00
4eece5aaf4 Correction sur carte europe 2024-06-18 17:26:55 +02:00
b574ba76ef Fix combativite 2024-06-01 09:17:57 +02:00
0b9e1a80af Fix talents + artefacts 2024-05-31 23:25:43 +02:00
6505b1c969 Fix talents + artefacts 2024-05-31 23:16:28 +02:00
280e90d7a6 Fix initiative 2024-05-31 14:03:36 +02:00
4fa9a911a0 Ameliorations creatures 2024-05-30 08:30:29 +02:00
b8c61f8f12 Fix sheets 2024-05-24 08:25:25 +02:00
b47b14a4b1 Fix sheets 2024-05-24 08:24:40 +02:00
9391acf6ee Add v12 support 2024-05-23 11:33:02 +02:00
8af9c582bf Preparation du passage en v12 2024-05-05 18:06:29 +02:00
fac158e0ad Fix v11/v12 2024-05-02 09:27:16 +02:00
69a2f81ede Correction sur SD à distance 2024-04-24 20:39:39 +02:00
005d390941 Support de toutes les options de combat 2024-04-01 22:48:18 +02:00
3327109f7e Compendiusm again 2024-02-24 17:03:57 +01:00
b38bfc97c2 Compendiusm again 2024-02-24 17:03:31 +01:00
89a7730d43 Ajout des mutations 2024-02-24 15:55:29 +01:00
2ebd1bd1fd Ajout des mutations 2024-02-24 15:54:47 +01:00
9e023d3f01 Fix calcul defense 2024-02-15 11:47:15 +01:00
2c12ec38fb Enhance stats 2024-02-08 12:51:41 +01:00
38059232cb Automatisations de combats, WIP 2023-12-28 18:40:46 +01:00
c331604393 Predilections et warning 2023-12-21 21:02:11 +01:00
71c1e1cd29 Affichage des specialisations 2023-12-19 21:52:59 +01:00
4a2ca5fab5 CSS fixes 2023-11-26 14:07:55 +01:00
ea8c82256c v11 ready 2023-08-21 22:46:12 +02:00
7df8aad4dc v11 ready 2023-08-16 13:02:06 +02:00
bb38705d52 Fix arme à distance + modificateur de vigueur 2023-08-16 10:51:19 +02:00
4344a5fbd3 v11 ready 2023-08-16 10:32:02 +02:00
df461fecf9 Fix css for compendiums 2023-05-29 17:08:21 +02:00
3aeb51c8ac Fix css for compendiums 2023-05-29 16:35:16 +02:00
154e9d3da5 Fix css for compendiums 2023-05-29 16:07:59 +02:00
9b58acc058 v10/v11 compatibility 2023-05-25 07:24:34 +02:00
189411eef8 v10/v11 compatibility 2023-05-25 07:23:25 +02:00
b1966412a0 Correction sur init + assistance au combat dans la fenetre de dialogue 2023-04-24 22:20:47 +02:00
c34d223d8f Ajout statut resistant 2023-03-26 20:33:57 +02:00
0e5be07fb9 Alpha sort 2023-03-19 18:58:28 +01:00
22ae4fb588 Fix protections 2023-03-14 07:18:14 +01:00
42ac857c06 Fix protections 2023-03-14 07:13:33 +01:00
1c143f542c Fix creature 2023-03-13 23:58:43 +01:00
4d447c9783 Enhance creatures 2022-12-21 19:15:03 +01:00
8760e3eb6e Fix ajout equipements 2022-12-19 10:15:46 +01:00
b3ddfb802e Fix name 2022-12-18 17:50:18 +01:00
9f111771df Fix Historiques 2022-12-11 18:42:35 +01:00
44141e3982 Fix Historiques 2022-12-11 18:42:16 +01:00
35b47d5aaf Mise à jour diu README 2022-12-06 07:41:57 +01:00
c48116de54 Mise à jour diu README 2022-12-06 07:41:51 +01:00
295c68a16e Mise à jour diu README 2022-12-06 07:37:11 +01:00
b9d12843a5 Ajout Artefacts et syntaxe item/acteurs 2022-12-06 07:27:51 +01:00
143 changed files with 3503 additions and 1840 deletions

10
.gitignore vendored Normal file
View File

@@ -0,0 +1,10 @@
.vscode/settings.json
.idea
.history
todo.md
/.vscode
/ignored/
/node_modules/
/jsconfig.json
/package.json
/package-lock.json

25
LICENCE.txt Normal file
View File

@@ -0,0 +1,25 @@
MIT License
Copyright (c) 2022 Uberwald/LeRatierBretonnien
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
This license does not apply to the compendium content listed in this software's
"packs" directory. See the README for licensing information for the compendium
packs.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -1,23 +1,29 @@
# Système Foundry pour Mournblade (French RPG, Titam France/Sombres Projets)
# Système Foundry pour Hawkmoon (French RPG, Titam France/Sombres Projets)
## EN
Unofficial system for Mournblade (French version from Titam France).
Unofficial system for Hawkmoon (French version from Titam France).
This system has been approved by Département des Sombres Projets ( http://www.titam-france.fr/ ), thanks !
Books are mandatory to play and are available at : http://www.titam-france.fr
## FR
Système non-officiel pour le JDR Mournblade (Titam France).
Système non-officiel pour le JDR Hawkmoon (Titam France/Sombres Projets).
Ce système a été autorisé par Ludospherik ( http://www.ludospherik.fr/ ), merci à eux !
Ce système a été autorisé par le Département des Sombres Projets ( http://www.titam-france.fr/ ), merci à eux !
Les livres du jeu sont nécessaires pour jouer, et sont disponibles ici : http://www.titam-france.fr
# Credits
Mournblade, le jeu de rôle de Sword & Sorcery, is a property of Titam France/Sombres Projets.
Hawkmoon, le jeu de rôle du Troisième Millénaire, is a property of Titam France/Sombres Projets.
# Developmement
LeRatierBretonnien
# Tests, icones et saisie des données
Prêtre, Blondin, Zechrub/Chris, Kyllian, Lightbringer

View 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&ecirc;l&eacute;e repr&eacute;sente la ma&icirc;trise martiale et l&rsquo;habilet&eacute; au combat rapproch&eacute;, avec ou sans arme. Plus cette Comp&eacute;tence est &eacute;lev&eacute;e, plus le personnage est &agrave; m&ecirc;me de passer la garde de ses adversaires en combat au corps-&agrave;-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, quil sagisse dune bagarre ou dun 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&eacute;tion repr&eacute;sente la capacit&eacute; &agrave; ne pas se faire remarquer, qu&rsquo;il s&rsquo;agisse de se fondre dans la foule, de prendre l'apparence de quelqu&rsquo;un d&rsquo;autre, de se cacher dans l&rsquo;ombre ou encore de se d&eacute;placer en silence. Plus cette Comp&eacute;tence est &eacute;lev&eacute;e, plus le personnage est apte &agrave; passer<br>physiquement inaper&ccedil;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 (quil sagisse dune bourse, dune arme, dun 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 lattention lorsquon ne peut être vu (dans lobscurité ou à couvert, lorsquun 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&eacute;sente l&rsquo;habilet&eacute; au lancer ou avec une arme &agrave; distance. Plus cette Comp&eacute;tence est &eacute;lev&eacute;e, plus les tirs du personnage sont pr&eacute;cis.&nbsp;</p>\n<p style=\"text-align: justify;\">&nbsp;</p>\n<p style=\"text-align: justify;\">&nbsp;</p>\n<p style=\"text-align: justify;\">&nbsp;</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&eacute;sente la capacit&eacute; &agrave; trouver de quoi subsister dans la nature, &agrave; &eacute;tablir un campement, &agrave; faire du feu avec les moyens du bord, &agrave; se rep&eacute;rer. Avec Clairvoyance, cette Comp&eacute;tence permet de trouver des baies comestibles, de poser tous les types de pi&egrave;ges, de pister, de trouver le meilleur emplacement pour un campement. Avec Adresse, elle permet de chasser, de p&ecirc;cher, de faire du feu dans des conditions difficiles et de confectionner les pi&egrave;ges les plus simples (collets, fosses, etc.).</p>\n<p style=\"text-align: justify;\">Les Pr&eacute;dilections repr&eacute;sentent quant &agrave; elles les diff&eacute;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 dy é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&eacute;sente &agrave; la fois la conscience de son environnement, la capacit&eacute; &agrave; remarquer les d&eacute;tails incongrus, et l&rsquo;aptitude &agrave; lire le langage corporel. Plus cette Comp&eacute;tence est &eacute;lev&eacute;e, plus les sens du personnage sont aff&ucirc;t&eacute;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, lopinion ou la sincérité dun interlocuteur, pour deviner les choses exprimées à mots couverts, pour comprendre quelquun qui sexprime 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 dun 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&eacute;sente la capacit&eacute; de forcer quelqu&rsquo;un &agrave; agir contre son gr&eacute;, &agrave; r&eacute;v&eacute;ler des secrets ou &agrave; ob&eacute;ir aveugl&eacute;ment. Plus cette Comp&eacute;tence est &eacute;lev&eacute;e, plus le personnage sait se montrer intimidant et jouer sur l&rsquo;autorit&eacute; qu&rsquo;il inspire pour briser la volont&eacute; 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&eacute;sente la vitesse (Adresse), mais aussi l&rsquo;endurance du nageur (Puissance). La natation est une Comp&eacute;tence assez rare dans le monde de Hawkmoon. Un personnage qui n&rsquo;a plus pied et ne sait pas nager commence &agrave; se noyer au bout d&rsquo;un tour de jeu (soit six secondes). Reportez-vous &agrave; la r&egrave;gle de noyade p. 214.</p>\n<p style=\"text-align: justify;\">&nbsp;</p>\n<h3 style=\"text-align: justify;\"><strong>Pr&eacute;dilections/Ma&icirc;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&eacute; du personnage &agrave; se d&eacute;placer rapidement et longtemps. Cette Comp&eacute;tence repr&eacute;sente aussi bien la souplesse et la vivacit&eacute; des gestes que l&rsquo;endurance physique et la r&eacute;sistance &agrave; l&rsquo;effort. Plus cette Comp&eacute;tence est &eacute;lev&eacute;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 labî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 dendurance."},{"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/icons/mutation.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 807 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 KiB

31
lang/fr.json Normal file
View File

@@ -0,0 +1,31 @@
{
"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"
}
},
"HAWKMOON": {
"ui": {
"editContact": "Modifier le contact",
"deleteContact": "Supprimer le contact",
"editTrait": "Modifier le trait",
"deleteTrait": "Supprimer le trait"
}
}
}

View File

@@ -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,25 +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()),
historique: duplicate(this.actor.getHistorique() || {}),
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()),
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;
@@ -86,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");
@@ -115,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"))
@@ -123,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")
@@ -142,25 +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 = {}) {

View File

@@ -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,56 +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"])
}
/* ----------------------- --------------------- */
getMonnaies() {
return this.items.filter(item => item.type == "monnaie")
getArtefacts() {
return this.getItemSorted(["artefact"])
}
/* -------------------------------------------- */
getArmors() {
return this.items.filter(item => item.type == "protection")
return this.getItemSorted(["protection"])
}
getHistorique() {
return this.items.find(item => item.type == "historique")
getHistoriques() {
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)
@@ -159,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)
}
/* -------------------------------------------- */
@@ -184,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)
}
@@ -197,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,
@@ -205,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
}
@@ -225,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;
}
@@ -277,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 }
}
@@ -285,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]) }
}
}
}
@@ -299,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 }
@@ -378,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
}
@@ -394,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 });
}
@@ -422,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 })
}
/* -------------------------------------------- */
@@ -433,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)
@@ -469,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 }])
}
@@ -480,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
@@ -506,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)
@@ -537,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
@@ -560,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)
@@ -589,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
@@ -617,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)
}
}
}

View File

@@ -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])
})
}

View File

@@ -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.")
}

View File

@@ -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
View 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"}
]
}

View File

@@ -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,

View File

@@ -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);

View File

@@ -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");

View File

@@ -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",
}
/**

View File

@@ -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()
@@ -77,33 +79,21 @@ function welcomeMessage() {
content: `<div id="welcome-message-Hawkmoon"><span class="rdd-roll-part">
<strong>Bienvenue dans Hawkmoon et le troisième Millénaire !</strong>
<p>Les livres de Hawkmoon sont nécessaires pour jouer : https://www.titam-france.fr</p>
<p>Hawkmoon est jeude rôle publié par Titam France/Sombres projets, tout les droits leur appartiennent.<p>
<p>Hawkmoon est jeu de rôle publié par Titam France/Sombres projets, tout les droits leur appartiennent.</p>
<p>Système développé par LeRatierBretonnien, support sur le <a href="https://discord.gg/pPSDNJk">Discord FR de Foundry</a>.</p>
` });
}
/* -------------------------------------------- */
// 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)
}
}
@@ -123,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";
}
});
/* -------------------------------------------- */
@@ -146,4 +138,3 @@ Hooks.on("chatMessage", (html, content, msg) => {
}
return true;
});

View File

@@ -6,7 +6,7 @@ export class HawkmoonRollDialog extends Dialog {
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 html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-hawkmoon-cyd/templates/roll-dialog-generic.html', rollData);
return new HawkmoonRollDialog(actor, rollData, html, options );
}
@@ -16,16 +16,16 @@ 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") }
callback: () => { this.roll("d10") }
},
rolld20: {
icon: '<i class="fas fa-check"></i>',
label: "Lancer 1d20",
callback: () => { this.roll("d20") }
callback: () => { this.roll("d20") }
},
cancel: {
icon: '<i class="fas fa-times"></i>',
@@ -56,25 +56,87 @@ export class HawkmoonRollDialog extends Dialog {
function onLoad() {
}
$(function () { onLoad(); });
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) => {
this.rollData.attrKey = String(event.currentTarget.value)
})
})
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
})
}
}

View File

@@ -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 = []
@@ -101,6 +113,26 @@ export class HawkmoonUtility {
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})`)
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 +154,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 +191,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 +272,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 +318,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 +336,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 +358,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 +389,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 +404,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 +426,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 +485,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 +498,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 +577,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 +641,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 +676,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 +709,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 +728,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 +749,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 +781,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 +790,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 +802,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 +826,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>";

Binary file not shown.

View File

View File

@@ -0,0 +1 @@
MANIFEST-000317

0
packs/aides-de-jeu/LOCK Normal file
View File

8
packs/aides-de-jeu/LOG Normal file
View File

@@ -0,0 +1,8 @@
2025/10/17-20:49:09.898677 7f7b753f96c0 Recovering log #315
2025/10/17-20:49:09.909170 7f7b753f96c0 Delete type=3 #313
2025/10/17-20:49:09.909239 7f7b753f96c0 Delete type=0 #315
2025/10/17-22:35:10.581106 7f7b6f3ff6c0 Level-0 table #320: started
2025/10/17-22:35:10.581135 7f7b6f3ff6c0 Level-0 table #320: 0 bytes OK
2025/10/17-22:35:10.587115 7f7b6f3ff6c0 Delete type=0 #318
2025/10/17-22:35:10.603825 7f7b6f3ff6c0 Manual compaction at level-0 from '!journal!MUbViCE2PkVxlzqe' @ 72057594037927935 : 1 .. '!journal.pages!gVybbv17TFY8o3Y4.fQidyqfF1TbsZKHM' @ 0 : 0; will stop at (end)
2025/10/17-22:35:10.603883 7f7b6f3ff6c0 Manual compaction at level-1 from '!journal!MUbViCE2PkVxlzqe' @ 72057594037927935 : 1 .. '!journal.pages!gVybbv17TFY8o3Y4.fQidyqfF1TbsZKHM' @ 0 : 0; will stop at (end)

View File

@@ -0,0 +1,8 @@
2025/10/17-20:28:53.005538 7f7b6ffff6c0 Recovering log #311
2025/10/17-20:28:53.015248 7f7b6ffff6c0 Delete type=3 #309
2025/10/17-20:28:53.015310 7f7b6ffff6c0 Delete type=0 #311
2025/10/17-20:41:09.987430 7f7b6f3ff6c0 Level-0 table #316: started
2025/10/17-20:41:09.987468 7f7b6f3ff6c0 Level-0 table #316: 0 bytes OK
2025/10/17-20:41:09.993944 7f7b6f3ff6c0 Delete type=0 #314
2025/10/17-20:41:10.021275 7f7b6f3ff6c0 Manual compaction at level-0 from '!journal!MUbViCE2PkVxlzqe' @ 72057594037927935 : 1 .. '!journal.pages!gVybbv17TFY8o3Y4.fQidyqfF1TbsZKHM' @ 0 : 0; will stop at (end)
2025/10/17-20:41:10.021333 7f7b6f3ff6c0 Manual compaction at level-1 from '!journal!MUbViCE2PkVxlzqe' @ 72057594037927935 : 1 .. '!journal.pages!gVybbv17TFY8o3Y4.fQidyqfF1TbsZKHM' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/armes/000275.ldb Normal file

Binary file not shown.

0
packs/armes/000318.log Normal file
View File

1
packs/armes/CURRENT Normal file
View File

@@ -0,0 +1 @@
MANIFEST-000316

0
packs/armes/LOCK Normal file
View File

8
packs/armes/LOG Normal file
View File

@@ -0,0 +1,8 @@
2025/10/17-20:49:09.793672 7f7b753f96c0 Recovering log #314
2025/10/17-20:49:09.803546 7f7b753f96c0 Delete type=3 #312
2025/10/17-20:49:09.803615 7f7b753f96c0 Delete type=0 #314
2025/10/17-22:35:10.536969 7f7b6f3ff6c0 Level-0 table #319: started
2025/10/17-22:35:10.537001 7f7b6f3ff6c0 Level-0 table #319: 0 bytes OK
2025/10/17-22:35:10.542920 7f7b6f3ff6c0 Delete type=0 #317
2025/10/17-22:35:10.548820 7f7b6f3ff6c0 Manual compaction at level-0 from '!items!0fit7HelSjaFtXcW' @ 72057594037927935 : 1 .. '!items!wxrzP3NyiHiYnAMJ' @ 0 : 0; will stop at (end)
2025/10/17-22:35:10.548874 7f7b6f3ff6c0 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
View File

@@ -0,0 +1,8 @@
2025/10/17-20:28:52.891518 7f7b74bf86c0 Recovering log #310
2025/10/17-20:28:52.901457 7f7b74bf86c0 Delete type=3 #308
2025/10/17-20:28:52.901513 7f7b74bf86c0 Delete type=0 #310
2025/10/17-20:41:09.934499 7f7b6f3ff6c0 Level-0 table #315: started
2025/10/17-20:41:09.934522 7f7b6f3ff6c0 Level-0 table #315: 0 bytes OK
2025/10/17-20:41:09.940458 7f7b6f3ff6c0 Delete type=0 #313
2025/10/17-20:41:09.960521 7f7b6f3ff6c0 Manual compaction at level-0 from '!items!0fit7HelSjaFtXcW' @ 72057594037927935 : 1 .. '!items!wxrzP3NyiHiYnAMJ' @ 0 : 0; will stop at (end)
2025/10/17-20:41:09.960598 7f7b6f3ff6c0 Manual compaction at level-1 from '!items!0fit7HelSjaFtXcW' @ 72057594037927935 : 1 .. '!items!wxrzP3NyiHiYnAMJ' @ 0 : 0; will stop at (end)

BIN
packs/armes/MANIFEST-000316 Normal file

Binary file not shown.

Binary file not shown.

View File

View File

@@ -0,0 +1 @@
MANIFEST-000316

View File

View File

@@ -0,0 +1,8 @@
2025/10/17-20:49:09.768629 7f7b6ffff6c0 Recovering log #314
2025/10/17-20:49:09.779130 7f7b6ffff6c0 Delete type=3 #312
2025/10/17-20:49:09.779215 7f7b6ffff6c0 Delete type=0 #314
2025/10/17-22:35:10.498148 7f7b6f3ff6c0 Level-0 table #319: started
2025/10/17-22:35:10.498192 7f7b6f3ff6c0 Level-0 table #319: 0 bytes OK
2025/10/17-22:35:10.504185 7f7b6f3ff6c0 Delete type=0 #317
2025/10/17-22:35:10.523654 7f7b6f3ff6c0 Manual compaction at level-0 from '!items!0nhTxujlIUB63Aqt' @ 72057594037927935 : 1 .. '!items!tFU5yISK6spdNWco' @ 0 : 0; will stop at (end)
2025/10/17-22:35:10.523691 7f7b6f3ff6c0 Manual compaction at level-1 from '!items!0nhTxujlIUB63Aqt' @ 72057594037927935 : 1 .. '!items!tFU5yISK6spdNWco' @ 0 : 0; will stop at (end)

View File

@@ -0,0 +1,8 @@
2025/10/17-20:28:52.864581 7f7b6ffff6c0 Recovering log #310
2025/10/17-20:28:52.874388 7f7b6ffff6c0 Delete type=3 #308
2025/10/17-20:28:52.874444 7f7b6ffff6c0 Delete type=0 #310
2025/10/17-20:41:09.921911 7f7b6f3ff6c0 Level-0 table #315: started
2025/10/17-20:41:09.921935 7f7b6f3ff6c0 Level-0 table #315: 0 bytes OK
2025/10/17-20:41:09.928010 7f7b6f3ff6c0 Delete type=0 #313
2025/10/17-20:41:09.934388 7f7b6f3ff6c0 Manual compaction at level-0 from '!items!0nhTxujlIUB63Aqt' @ 72057594037927935 : 1 .. '!items!tFU5yISK6spdNWco' @ 0 : 0; will stop at (end)
2025/10/17-20:41:09.934420 7f7b6f3ff6c0 Manual compaction at level-1 from '!items!0nhTxujlIUB63Aqt' @ 72057594037927935 : 1 .. '!items!tFU5yISK6spdNWco' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

View File

@@ -0,0 +1 @@
MANIFEST-000316

0
packs/competences/LOCK Normal file
View File

8
packs/competences/LOG Normal file
View File

@@ -0,0 +1,8 @@
2025/10/17-20:49:09.744321 7f7b75bfa6c0 Recovering log #314
2025/10/17-20:49:09.753860 7f7b75bfa6c0 Delete type=3 #312
2025/10/17-20:49:09.753934 7f7b75bfa6c0 Delete type=0 #314
2025/10/17-22:35:10.511424 7f7b6f3ff6c0 Level-0 table #319: started
2025/10/17-22:35:10.511449 7f7b6f3ff6c0 Level-0 table #319: 0 bytes OK
2025/10/17-22:35:10.517304 7f7b6f3ff6c0 Delete type=0 #317
2025/10/17-22:35:10.523675 7f7b6f3ff6c0 Manual compaction at level-0 from '!items!15IDGG6JoZnRCQtY' @ 72057594037927935 : 1 .. '!items!yI1zY5k8mAdx9wHK' @ 0 : 0; will stop at (end)
2025/10/17-22:35:10.523698 7f7b6f3ff6c0 Manual compaction at level-1 from '!items!15IDGG6JoZnRCQtY' @ 72057594037927935 : 1 .. '!items!yI1zY5k8mAdx9wHK' @ 0 : 0; will stop at (end)

View File

@@ -0,0 +1,8 @@
2025/10/17-20:28:52.833282 7f7b75bfa6c0 Recovering log #310
2025/10/17-20:28:52.844042 7f7b75bfa6c0 Delete type=3 #308
2025/10/17-20:28:52.844117 7f7b75bfa6c0 Delete type=0 #310
2025/10/17-20:41:09.915408 7f7b6f3ff6c0 Level-0 table #315: started
2025/10/17-20:41:09.915432 7f7b6f3ff6c0 Level-0 table #315: 0 bytes OK
2025/10/17-20:41:09.921802 7f7b6f3ff6c0 Delete type=0 #313
2025/10/17-20:41:09.934379 7f7b6f3ff6c0 Manual compaction at level-0 from '!items!15IDGG6JoZnRCQtY' @ 72057594037927935 : 1 .. '!items!yI1zY5k8mAdx9wHK' @ 0 : 0; will stop at (end)
2025/10/17-20:41:09.934414 7f7b6f3ff6c0 Manual compaction at level-1 from '!items!15IDGG6JoZnRCQtY' @ 72057594037927935 : 1 .. '!items!yI1zY5k8mAdx9wHK' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/equipement/000275.ldb Normal file

Binary file not shown.

View File

1
packs/equipement/CURRENT Normal file
View File

@@ -0,0 +1 @@
MANIFEST-000316

0
packs/equipement/LOCK Normal file
View File

8
packs/equipement/LOG Normal file
View File

@@ -0,0 +1,8 @@
2025/10/17-20:49:09.817906 7f7b75bfa6c0 Recovering log #314
2025/10/17-20:49:09.828670 7f7b75bfa6c0 Delete type=3 #312
2025/10/17-20:49:09.828748 7f7b75bfa6c0 Delete type=0 #314
2025/10/17-22:35:10.543003 7f7b6f3ff6c0 Level-0 table #319: started
2025/10/17-22:35:10.543024 7f7b6f3ff6c0 Level-0 table #319: 0 bytes OK
2025/10/17-22:35:10.548737 7f7b6f3ff6c0 Delete type=0 #317
2025/10/17-22:35:10.548828 7f7b6f3ff6c0 Manual compaction at level-0 from '!items!0BopmCu8vGK2923j' @ 72057594037927935 : 1 .. '!items!zYx0Ak2y1LNTcKlO' @ 0 : 0; will stop at (end)
2025/10/17-22:35:10.548865 7f7b6f3ff6c0 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
View File

@@ -0,0 +1,8 @@
2025/10/17-20:28:52.917702 7f7b753f96c0 Recovering log #310
2025/10/17-20:28:52.927558 7f7b753f96c0 Delete type=3 #308
2025/10/17-20:28:52.927613 7f7b753f96c0 Delete type=0 #310
2025/10/17-20:41:09.940553 7f7b6f3ff6c0 Level-0 table #315: started
2025/10/17-20:41:09.940581 7f7b6f3ff6c0 Level-0 table #315: 0 bytes OK
2025/10/17-20:41:09.947637 7f7b6f3ff6c0 Delete type=0 #313
2025/10/17-20:41:09.960552 7f7b6f3ff6c0 Manual compaction at level-0 from '!items!0BopmCu8vGK2923j' @ 72057594037927935 : 1 .. '!items!zYx0Ak2y1LNTcKlO' @ 0 : 0; will stop at (end)
2025/10/17-20:41:09.960608 7f7b6f3ff6c0 Manual compaction at level-1 from '!items!0BopmCu8vGK2923j' @ 72057594037927935 : 1 .. '!items!zYx0Ak2y1LNTcKlO' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

View File

@@ -0,0 +1 @@
MANIFEST-000316

0
packs/historiques/LOCK Normal file
View File

8
packs/historiques/LOG Normal file
View File

@@ -0,0 +1,8 @@
2025/10/17-20:49:09.780990 7f7b74bf86c0 Recovering log #314
2025/10/17-20:49:09.790922 7f7b74bf86c0 Delete type=3 #312
2025/10/17-20:49:09.791046 7f7b74bf86c0 Delete type=0 #314
2025/10/17-22:35:10.504312 7f7b6f3ff6c0 Level-0 table #319: started
2025/10/17-22:35:10.504337 7f7b6f3ff6c0 Level-0 table #319: 0 bytes OK
2025/10/17-22:35:10.511317 7f7b6f3ff6c0 Delete type=0 #317
2025/10/17-22:35:10.523666 7f7b6f3ff6c0 Manual compaction at level-0 from '!items!15foLG7y3LUXNzkK' @ 72057594037927935 : 1 .. '!items!z1HtkvazCGHut7cz' @ 0 : 0; will stop at (end)
2025/10/17-22:35:10.523704 7f7b6f3ff6c0 Manual compaction at level-1 from '!items!15foLG7y3LUXNzkK' @ 72057594037927935 : 1 .. '!items!z1HtkvazCGHut7cz' @ 0 : 0; will stop at (end)

View File

@@ -0,0 +1,8 @@
2025/10/17-20:28:52.876807 7f7b75bfa6c0 Recovering log #310
2025/10/17-20:28:52.886763 7f7b75bfa6c0 Delete type=3 #308
2025/10/17-20:28:52.886882 7f7b75bfa6c0 Delete type=0 #310
2025/10/17-20:41:09.909233 7f7b6f3ff6c0 Level-0 table #315: started
2025/10/17-20:41:09.909293 7f7b6f3ff6c0 Level-0 table #315: 0 bytes OK
2025/10/17-20:41:09.915307 7f7b6f3ff6c0 Delete type=0 #313
2025/10/17-20:41:09.934366 7f7b6f3ff6c0 Manual compaction at level-0 from '!items!15foLG7y3LUXNzkK' @ 72057594037927935 : 1 .. '!items!z1HtkvazCGHut7cz' @ 0 : 0; will stop at (end)
2025/10/17-20:41:09.934408 7f7b6f3ff6c0 Manual compaction at level-1 from '!items!15foLG7y3LUXNzkK' @ 72057594037927935 : 1 .. '!items!z1HtkvazCGHut7cz' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/mutations/000185.ldb Normal file

Binary file not shown.

View File

1
packs/mutations/CURRENT Normal file
View File

@@ -0,0 +1 @@
MANIFEST-000226

0
packs/mutations/LOCK Normal file
View File

8
packs/mutations/LOG Normal file
View File

@@ -0,0 +1,8 @@
2025/10/17-20:49:09.755935 7f7b753f96c0 Recovering log #224
2025/10/17-20:49:09.766032 7f7b753f96c0 Delete type=3 #222
2025/10/17-20:49:09.766080 7f7b753f96c0 Delete type=0 #224
2025/10/17-22:35:10.517436 7f7b6f3ff6c0 Level-0 table #229: started
2025/10/17-22:35:10.517471 7f7b6f3ff6c0 Level-0 table #229: 0 bytes OK
2025/10/17-22:35:10.523546 7f7b6f3ff6c0 Delete type=0 #227
2025/10/17-22:35:10.523683 7f7b6f3ff6c0 Manual compaction at level-0 from '!folders!5d4Zn28TUcPxRyXd' @ 72057594037927935 : 1 .. '!items!zttESycGKltfwCzJ' @ 0 : 0; will stop at (end)
2025/10/17-22:35:10.523709 7f7b6f3ff6c0 Manual compaction at level-1 from '!folders!5d4Zn28TUcPxRyXd' @ 72057594037927935 : 1 .. '!items!zttESycGKltfwCzJ' @ 0 : 0; will stop at (end)

8
packs/mutations/LOG.old Normal file
View File

@@ -0,0 +1,8 @@
2025/10/17-20:28:52.850444 7f7b753f96c0 Recovering log #220
2025/10/17-20:28:52.860559 7f7b753f96c0 Delete type=3 #218
2025/10/17-20:28:52.860629 7f7b753f96c0 Delete type=0 #220
2025/10/17-20:41:09.928209 7f7b6f3ff6c0 Level-0 table #225: started
2025/10/17-20:41:09.928246 7f7b6f3ff6c0 Level-0 table #225: 0 bytes OK
2025/10/17-20:41:09.934269 7f7b6f3ff6c0 Delete type=0 #223
2025/10/17-20:41:09.934398 7f7b6f3ff6c0 Manual compaction at level-0 from '!folders!5d4Zn28TUcPxRyXd' @ 72057594037927935 : 1 .. '!items!zttESycGKltfwCzJ' @ 0 : 0; will stop at (end)
2025/10/17-20:41:09.934428 7f7b6f3ff6c0 Manual compaction at level-1 from '!folders!5d4Zn28TUcPxRyXd' @ 72057594037927935 : 1 .. '!items!zttESycGKltfwCzJ' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/profils/000275.ldb Normal file

Binary file not shown.

0
packs/profils/000318.log Normal file
View File

1
packs/profils/CURRENT Normal file
View File

@@ -0,0 +1 @@
MANIFEST-000316

0
packs/profils/LOCK Normal file
View File

8
packs/profils/LOG Normal file
View File

@@ -0,0 +1,8 @@
2025/10/17-20:49:09.830796 7f7b753f96c0 Recovering log #314
2025/10/17-20:49:09.842331 7f7b753f96c0 Delete type=3 #312
2025/10/17-20:49:09.842423 7f7b753f96c0 Delete type=0 #314
2025/10/17-22:35:10.523783 7f7b6f3ff6c0 Level-0 table #319: started
2025/10/17-22:35:10.523803 7f7b6f3ff6c0 Level-0 table #319: 0 bytes OK
2025/10/17-22:35:10.529922 7f7b6f3ff6c0 Delete type=0 #317
2025/10/17-22:35:10.548803 7f7b6f3ff6c0 Manual compaction at level-0 from '!items!26mRstKhCJoXkhu1' @ 72057594037927935 : 1 .. '!items!tFQqcxmkS3MT6ASE' @ 0 : 0; will stop at (end)
2025/10/17-22:35:10.548837 7f7b6f3ff6c0 Manual compaction at level-1 from '!items!26mRstKhCJoXkhu1' @ 72057594037927935 : 1 .. '!items!tFQqcxmkS3MT6ASE' @ 0 : 0; will stop at (end)

8
packs/profils/LOG.old Normal file
View File

@@ -0,0 +1,8 @@
2025/10/17-20:28:52.931574 7f7b74bf86c0 Recovering log #310
2025/10/17-20:28:52.941330 7f7b74bf86c0 Delete type=3 #308
2025/10/17-20:28:52.941393 7f7b74bf86c0 Delete type=0 #310
2025/10/17-20:41:09.947757 7f7b6f3ff6c0 Level-0 table #315: started
2025/10/17-20:41:09.947779 7f7b6f3ff6c0 Level-0 table #315: 0 bytes OK
2025/10/17-20:41:09.953770 7f7b6f3ff6c0 Delete type=0 #313
2025/10/17-20:41:09.960567 7f7b6f3ff6c0 Manual compaction at level-0 from '!items!26mRstKhCJoXkhu1' @ 72057594037927935 : 1 .. '!items!tFQqcxmkS3MT6ASE' @ 0 : 0; will stop at (end)
2025/10/17-20:41:09.960660 7f7b6f3ff6c0 Manual compaction at level-1 from '!items!26mRstKhCJoXkhu1' @ 72057594037927935 : 1 .. '!items!tFQqcxmkS3MT6ASE' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

View File

@@ -0,0 +1 @@
MANIFEST-000316

0
packs/protections/LOCK Normal file
View File

8
packs/protections/LOG Normal file
View File

@@ -0,0 +1,8 @@
2025/10/17-20:49:09.806029 7f7b6ffff6c0 Recovering log #314
2025/10/17-20:49:09.815854 7f7b6ffff6c0 Delete type=3 #312
2025/10/17-20:49:09.815927 7f7b6ffff6c0 Delete type=0 #314
2025/10/17-22:35:10.530010 7f7b6f3ff6c0 Level-0 table #319: started
2025/10/17-22:35:10.530036 7f7b6f3ff6c0 Level-0 table #319: 0 bytes OK
2025/10/17-22:35:10.536861 7f7b6f3ff6c0 Delete type=0 #317
2025/10/17-22:35:10.548812 7f7b6f3ff6c0 Manual compaction at level-0 from '!items!16iPa2yIzB0V3pxb' @ 72057594037927935 : 1 .. '!items!yszkersMTE4p9VzP' @ 0 : 0; will stop at (end)
2025/10/17-22:35:10.548856 7f7b6f3ff6c0 Manual compaction at level-1 from '!items!16iPa2yIzB0V3pxb' @ 72057594037927935 : 1 .. '!items!yszkersMTE4p9VzP' @ 0 : 0; will stop at (end)

View File

@@ -0,0 +1,8 @@
2025/10/17-20:28:52.904993 7f7b6ffff6c0 Recovering log #310
2025/10/17-20:28:52.915402 7f7b6ffff6c0 Delete type=3 #308
2025/10/17-20:28:52.915473 7f7b6ffff6c0 Delete type=0 #310
2025/10/17-20:41:09.953909 7f7b6f3ff6c0 Level-0 table #315: started
2025/10/17-20:41:09.953941 7f7b6f3ff6c0 Level-0 table #315: 0 bytes OK
2025/10/17-20:41:09.960253 7f7b6f3ff6c0 Delete type=0 #313
2025/10/17-20:41:09.960585 7f7b6f3ff6c0 Manual compaction at level-0 from '!items!16iPa2yIzB0V3pxb' @ 72057594037927935 : 1 .. '!items!yszkersMTE4p9VzP' @ 0 : 0; will stop at (end)
2025/10/17-20:41:09.960625 7f7b6f3ff6c0 Manual compaction at level-1 from '!items!16iPa2yIzB0V3pxb' @ 72057594037927935 : 1 .. '!items!yszkersMTE4p9VzP' @ 0 : 0; will stop at (end)

Binary file not shown.

BIN
packs/scenes/000114.ldb Normal file

Binary file not shown.

0
packs/scenes/000157.log Normal file
View File

1
packs/scenes/CURRENT Normal file
View File

@@ -0,0 +1 @@
MANIFEST-000155

Some files were not shown because too many files have changed in this diff Show More