Compare commits

..

45 Commits
v13 ... v11

Author SHA1 Message Date
6b338314c4 Merge pull request 'Fix fatigue à la descente des TMR' (#760) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
All checks were successful
Release Creation / build (release) Successful in 2m14s
Reviewed-on: #760
2025-05-04 19:16:25 +02:00
6661805f6f Fix fatigue à la descente des TMR
La modification d'un activeEffect déclenche un render, qui
utilise les valeurs courante de l'actor.

Du coup, si l'update de l'actor est fait après:
- le render en cours utilise les anciennes valeurs
- comme un render est en cours, le nouveau render est ignoré

En faisant les changements d'active effect après ceux de l'actor,
l'affichage se fait correctement.,
2025-05-04 18:24:39 +02:00
29931fdcb5 Merge pull request 'Fix: sommeil avec double rêve' (#758) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
Reviewed-on: #758
2025-04-30 14:01:03 +02:00
ec24e4a7e7 Fix: sommeil avec double rêve 2025-04-27 17:51:50 +02:00
d1adf3f6c4 Merge pull request '12.0.49 - La deuxième lame d'Astrobazzarh' (#757) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
All checks were successful
Release Creation / build (release) Successful in 1m20s
Reviewed-on: #757
2025-04-24 16:46:35 +02:00
8eb1387be4 attaques à distance sans difficulté libre 2025-04-24 00:58:42 +02:00
85378d74e3 Fix parade des vieux boucliers 2025-04-24 00:43:32 +02:00
9471420d38 Fix défenses particulières 2025-04-23 22:01:29 +02:00
6e456ca92c Merge pull request '12.0.48 - La chèvre d'Astrobazzarh' (#756) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
All checks were successful
Release Creation / build (release) Successful in 2m2s
Reviewed-on: #756
2025-04-23 11:50:59 +02:00
482256c218 L'armure du Bandersnatch 2025-04-22 20:42:43 +02:00
fa1c4ff221 Correction: particulières sur carac dérivées 2025-04-22 20:42:21 +02:00
b777271657 Echec à la mise en réserve
Un échec au lancement de sort brise la concentration, la mise en
réserve présuppose le lancement du sort.
2025-04-22 20:41:49 +02:00
d06a55b615 Amélioration message lancement sort en réserve 2025-04-22 20:41:35 +02:00
adfbc11eb8 Consistance chèvre
La consistance chèvre est supportée (caractères accentués)
2025-04-22 20:41:31 +02:00
9dd905134b Correction sur les mise à jour en cascade + correction sur le force rendering après un changement de competence
All checks were successful
Release Creation / build (release) Successful in 2m25s
2025-04-06 23:15:10 +02:00
f32b6af7b6 Correction sur les mise à jour en cascade + correction sur le force rendering après un changement de competence 2025-04-06 23:13:59 +02:00
9b8a600e22 Merge pull request '## 12.0.46 - Le double demi d'Astrobazzarh' (#755) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
All checks were successful
Release Creation / build (release) Successful in 1m25s
Reviewed-on: #755
2025-03-18 20:48:20 +01:00
25db7e0712 Amélioration des fermetures de TMR
- un seul message lors de la fermeture au MJ et joueur
- le déclenchement de sort en réserve
2025-03-18 01:56:26 +01:00
776d4ce9ec correction des raffraîchissement lors du sommeil
On peut de nouveau dormir plusieurs heures
2025-03-18 01:50:00 +01:00
1de0806e37 Fix changelog 2025-03-16 00:20:48 +01:00
03366fdf26 Gestion armes naturelles sur defense
All checks were successful
Release Creation / build (release) Successful in 1m51s
2025-03-15 22:04:37 +01:00
14f324360d Merge pull request 'Fix: difficulté des médiations' (#754) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
Reviewed-on: #754
2025-03-15 20:32:20 +01:00
d60c9f1b28 Renommage révéler/masquer le demi-rêve 2025-03-15 17:18:41 +01:00
cf514470fd Fix: difficulté des médiations
La difficulté des méditations n'augmente plus en cas de réussite
et d'échec normal
2025-03-15 17:17:29 +01:00
b09b095897 Formatage changelog
All checks were successful
Release Creation / build (release) Successful in 1m53s
2025-03-05 08:26:37 +01:00
d81965155c Correction sur heures de repos 2025-03-05 08:25:00 +01:00
9fa8a2e6f3 Merge pull request '12.0.44 - Les errements d'Astrobazzarh, suite' (#753) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
Reviewed-on: #753
2025-03-05 08:24:13 +01:00
da7f87fd45 Changelog 12.0.44 2025-03-04 23:06:39 +01:00
6aba92900c Fix erreurs sorts variables
- correction de la sélection de la voie de draconique pour
  sort à voie variable
- en cas de sort avec un coût en rêve numérique, ce n'est pas variable
2025-03-04 23:01:04 +01:00
4939e5564e Fix possessions 2025-03-04 22:46:28 +01:00
40be65a94e Merge pull request 'v11 - sommeil' (#752) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
Reviewed-on: #752
2025-03-04 22:11:00 +01:00
633638a9ab Fix récupération sommeil
Les différentsq updates pouvaient ne pas être visibles lors du sommeil

En forçant un render 20ms après la fin des actions qui impliquent un
sommeil, les mises à jour sont correctes
2025-03-04 22:04:52 +01:00
88a3464eed Add command to run debug server 2025-03-04 21:32:21 +01:00
921e470498 Petit fixes de synchro + essai pour corriger message XP + roll
All checks were successful
Release Creation / build (release) Successful in 2m32s
2025-02-27 22:53:06 +01:00
0009876a6d Merge pull request '12.0.42' (#751) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
All checks were successful
Release Creation / build (release) Successful in 1m39s
Reviewed-on: #751
2025-02-10 07:58:31 +01:00
54785f0c3a Version 12.0.42 2025-02-10 01:54:25 +01:00
df76c4bd78 Corrections automatisations combat
Visiblement des changements sur les callbacks n'avaient pas
été finalisés
2025-02-10 01:54:25 +01:00
5f3c678195 Fix: jet de caractéristique/difficulté
Les jets avec difficulté ne fonctionnaient plus à cause des armes
 à 1 main / à 2 mains
2025-02-09 22:51:06 +01:00
89bbe63340 Merge pull request 'La loupe d'Astrobazzar' (#748) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
All checks were successful
Release Creation / build (release) Successful in 1m27s
Reviewed-on: #748
2025-02-09 00:30:52 +01:00
149990e352 Correction: diminution stress transformé 2025-02-07 21:29:50 +01:00
3e355784c7 Message d'expérience en sort
Adaptation du message d'xp en sort au renommage des voies draconiques
2025-02-07 20:47:20 +01:00
b92055d5dd Commande /tirer cachée
Pour les messages sans actor, la méthode getOwners ne marchait
pas. En cas d'absence d'acteur, les gmroll doivent être pour le
joueur courant et les MJs
2025-02-07 20:47:20 +01:00
220f8142f5 Merge pull request 'v11 Fix choix particulière' (#746) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
All checks were successful
Release Creation / build (release) Successful in 1m45s
Reviewed-on: #746
2025-02-06 10:42:25 +01:00
a8bb00ad0b Fix choix particulière 2025-02-05 22:56:24 +01:00
78e30b5503 Correction message min/max de race 2025-02-02 00:06:38 +01:00
232 changed files with 3515 additions and 6211 deletions

View File

@@ -12,8 +12,6 @@ jobs:
#- uses: actions/checkout@v3 #- uses: actions/checkout@v3
- uses: RouxAntoine/checkout@v3.5.4 - uses: RouxAntoine/checkout@v3.5.4
with:
ref: 'v13'
# get part of the tag after the `v` # get part of the tag after the `v`
- name: Extract tag version number - name: Extract tag version number
@@ -48,7 +46,7 @@ jobs:
apt update -y apt update -y
apt install -y zip apt install -y zip
- run: zip -r ./rddsystem.zip system.json template.json README.md LICENSE.txt assets/ css/ fonts/ icons lang/ module/ packs/ pic/ sounds/ styles/ templates/ - run: zip -r ./rddsystem.zip system.json template.json README.md LICENSE.txt assets/ fonts/ icons lang/ module/ packs/ pic/ sounds/ styles/ templates/
- name: setup go - name: setup go
uses: actions/setup-go@v3 uses: actions/setup-go@v3
@@ -71,6 +69,6 @@ jobs:
id: 'foundryvtt-reve-de-dragon' id: 'foundryvtt-reve-de-dragon'
version: ${{github.event.release.tag_name}} version: ${{github.event.release.tag_name}}
manifest: 'https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/system.json' manifest: 'https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/system.json'
notes: 'https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/branch/v13/changelog.md' notes: 'https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/branch/v11/changelog.md'
compatibility-minimum: '13' compatibility-minimum: '12'
compatibility-verified: '13' compatibility-verified: '12'

0
.gitlab/.gitkeep Normal file
View File

View File

View File

@@ -0,0 +1,14 @@
Pour que le bug soit traité, merci de préciser quelques détails.
### Environment
> Indiquez quelques éléments de votre installation
* Foundry VTT Version: (Example 0.5.4)
* OS: [Windows, MacOS, Linux (which distro)]
* Modules ?: Liste des modules utilisés
### Description du problème
/label ~Bug ~Nonrepro

View File

@@ -0,0 +1,14 @@
### Résumé de la fonctionnalité
> Décrivez de manière simple et concise la fonction que vous voulez voir ajoutée.
### Expérience Utilisateur
> Indiquez ce que l'utilisateur aura comme bénéfice avec cette fonction.
### Priority/Importance
> Selon vous, quelle est l'importance de cette fonctionnalité.
/label ~Feature

View File

@@ -1,65 +1,15 @@
# 13.0
## 13.0.7 - Sous le signe d'Illysis
- Fix Foundry V13
- les tooltips des ajustements sont correctement visible
- correction des affichages des signes d'heures dans la fenêtre d'astrologie
- en cas d'appel au moral lorsqu'une double significative est requise,
le moral est perdu si la réussite est insuffisante
- transformation du niveau des musiques/danses/chants/recettes de cuisine en valeur numérique
- les effets draconiques sur une case inconnue (A0) ne causent plus de problèmes dans les TMRs
## 13.0.6 - Le bandage d'Illysis
- Les soins sont de nouveau disponibles depuis les tokens
- Correction des boutons de la feuille simplifiée
- On peut de nouveau acheter dans les commerces
## 13.0.5
- Export CSV/Scriptarium à nouveau disponible dans les menus d'acteurs
## 13.0.4 - Le long discours d'Illysis
- On peut de nouveau modifier les descriptions
- ne pas proposer l'export csv par défaut
- Correction de la macro "Jet quelconque"
- Correction de la ligne 'rêve actuel' ajoutée dans les caracs
- Corrections d'affichage
- boutons de l'horloge
- boutons de déplacement des TMR
- modification des messages de tchat
## 13.0.3 - La dernière auberge d'Illysis
- On peut de nouveau acheter aux commerces
- La description des Grizzal a des espaces
- Corrections v13
- Affichage des images et noms d'objets en ligne
- affichage des compétences de créature sur une ligne
- Affichage des informations d'acteur sur une ligne dans l'astrologie
- Affichage des résultat de recherche
## 13.0.0 - Le début de l'errance d'Illysis
- Migration vers la version 13 de Foundry
# 12.0 # 12.0
## 12.0.50 - Le sommeil d'Astrobazzarh ## 12.0.50 - Le sommeil d'Astrobazzarh
- Le don de double rêve n'interrompt plus le sommeil toutes les heures - Le don de double rêve n'interrompt plus le sommeil toutes les heures
- la perte de fatigue à la descente des TMR est visible immédiatement - la perte de fatigue à la descente des TMR est visible immédiatement
## 12.0.49 - La deuxième lame d'Astrobazzarh ## 12.0.49 - La deuxième lame d'Astrobazzarh
- Corrections - Corrections
- les défenses particulières sont correctement affichées - les défenses particulières sont correctement affichées
- les vieux boucliers (sans catégorie de parade car créés il y a longtemps) peuvent parer... - les vieux boucliers (sans catégorie de parade car créés il y a longtemps) peuvent parer...
- Les attaques à distance n'ont pas de difficulté libre - Les attaques à distance n'ont pas de difficulté libre
## 12.0.48 - La chèvre d'Astrobazzarh ## 12.0.48 - La chèvre d'Astrobazzarh
- le Bandersnatch a une protection de 10 - le Bandersnatch a une protection de 10
- la consistance chèvre est maintenant possible dans les recettes - la consistance chèvre est maintenant possible dans les recettes
alchimiques (et toutes les consistances avec accents) alchimiques (et toutes les consistances avec accents)
@@ -68,12 +18,10 @@
- Correction: les réussites particulières fonctionnent avec les caractéristiques dérivées - Correction: les réussites particulières fonctionnent avec les caractéristiques dérivées
## 12.0.47 ## 12.0.47
- Correction sur les mise à jour en cascade - - Correction sur les mise à jour en cascade -
- Correction sur le force rendering après un changement de competence - Correction sur le force rendering après un changement de competence
## 12.0.46 - Le double demi d'Astrobazzarh ## 12.0.46 - Le double demi d'Astrobazzarh
- correction des raffraîchissement lors du sommeil qui empêchait de dormir - correction des raffraîchissement lors du sommeil qui empêchait de dormir
plusieurs heures plusieurs heures
- Si la fatigue n'est pas utilisée, les rounds dans les TMR font perdre de l'endurance (au lieu d'en gagner) - Si la fatigue n'est pas utilisée, les rounds dans les TMR font perdre de l'endurance (au lieu d'en gagner)
@@ -190,11 +138,9 @@
- la description du chrasme contient le lien vers son venin plutôt qu'un tableau - la description du chrasme contient le lien vers son venin plutôt qu'un tableau
## 12.0.28 - Les réserves d'Astrobazzarh ## 12.0.28 - Les réserves d'Astrobazzarh
- possibilité de mettre en réserve depuis un sort connu - possibilité de mettre en réserve depuis un sort connu
## 12.0.27 - Les vêtements d'Astrobazzarh ## 12.0.27 - Les vêtements d'Astrobazzarh
- Ajout de la liste des armures dans l'onglet caractéristiques - Ajout de la liste des armures dans l'onglet caractéristiques
- Ajout d'une option pour choisir une carte des TMR alternatives - Ajout d'une option pour choisir une carte des TMR alternatives
- Le Gardien peut créer des sorts en réserve parmi les sorts d'un personnage - Le Gardien peut créer des sorts en réserve parmi les sorts d'un personnage
@@ -215,14 +161,12 @@
- les modèles de personnages non joueurs sont non-liés par défaut - les modèles de personnages non joueurs sont non-liés par défaut
## 12.0.26 - Astrobazzarh le Haut-rêvant ## 12.0.26 - Astrobazzarh le Haut-rêvant
- bouton pour le don de haut-rêve en un clic - bouton pour le don de haut-rêve en un clic
- les compétences de draconic ne sont plus précédées de "Voie de" - les compétences de draconic ne sont plus précédées de "Voie de"
- migration des compétences & compendiums - migration des compétences & compendiums
- Correction feuille simplifiée qui ne s'affichait pas en cas de sort variable - Correction feuille simplifiée qui ne s'affichait pas en cas de sort variable
## 12.0.24 - Les ajustements d'Astrobazzarh ## 12.0.24 - Les ajustements d'Astrobazzarh
- amélioration - amélioration
- meilleure gestion des noms des voies de draconic - meilleure gestion des noms des voies de draconic
- affichage du détail des sorts avec le nom de voie, 'court', la difficulté, le coût - affichage du détail des sorts avec le nom de voie, 'court', la difficulté, le coût
@@ -232,7 +176,6 @@
- on peut maintenant saisir et supprimer les bonus de cases de manière intuitive - on peut maintenant saisir et supprimer les bonus de cases de manière intuitive
## 12.0.23 - La bibliothèque d'Astrobazzarh ## 12.0.23 - La bibliothèque d'Astrobazzarh
- corrections mineures - corrections mineures
- meilleure gestion de la parade des armes naturelles - meilleure gestion de la parade des armes naturelles
- cas de "User lacks permission to update" pour les blessures et les StatusEffects - cas de "User lacks permission to update" pour les blessures et les StatusEffects
@@ -248,23 +191,19 @@
- dans les compendiums, les compétences Écriture et Épée ont une majuscule accentuée. Les Épée dans le compendium d'équipements référence le nom de compétence accentué. - dans les compendiums, les compétences Écriture et Épée ont une majuscule accentuée. Les Épée dans le compendium d'équipements référence le nom de compétence accentué.
## 12.0.21 - La nomination d'Astrobazzarh ## 12.0.21 - La nomination d'Astrobazzarh
- Les noms pour les messages dans le tchat sont maintenant ceux des tokens plutôt que ceux des acteurs - Les noms pour les messages dans le tchat sont maintenant ceux des tokens plutôt que ceux des acteurs
- Fix: le choix des effets dans les options s'affiche correctement - Fix: le choix des effets dans les options s'affiche correctement
## 12.0.20 - Le tableau d'Astrobazzarh ## 12.0.20 - Le tableau d'Astrobazzarh
- Ecran d'accueil officiel Scriptarium - Ecran d'accueil officiel Scriptarium
## 12.0.19 - La témérité d'Astrobazzarh ## 12.0.19 - La témérité d'Astrobazzarh
- Fix - Fix
- les défenses des créatures sont correctement filtrées - les défenses des créatures sont correctement filtrées
- le lancer d'initiative pour tous les personnages/PNJs fonctionne correctement - le lancer d'initiative pour tous les personnages/PNJs fonctionne correctement
- les lieux et commerces n'ont pas d'initiative - les lieux et commerces n'ont pas d'initiative
## 12.0.18 - A la barbe d'Astrobazzarh ## 12.0.18 - A la barbe d'Astrobazzarh
- Améliorations sur la feuille de PNJ simplifiée - Améliorations sur la feuille de PNJ simplifiée
- Ajout du portrait - Ajout du portrait
- Ajout du corps à corps - Ajout du corps à corps
@@ -281,13 +220,11 @@
- Ajout d'un indicateur pour les armes de parade nécessitant une significative - Ajout d'un indicateur pour les armes de parade nécessitant une significative
## 12.0.16 - Le secret d'Astrobazzarh ## 12.0.16 - Le secret d'Astrobazzarh
- Fix: les jets envoyés messages uniquement au MJ ne sont plus envoyés à tous les autres joueurs (et dupliqués) - Fix: les jets envoyés messages uniquement au MJ ne sont plus envoyés à tous les autres joueurs (et dupliqués)
- Les noms affichés dans les automatisations de combat sont maintenant ceux des tokens plutôt que ceux des acteurs - Les noms affichés dans les automatisations de combat sont maintenant ceux des tokens plutôt que ceux des acteurs
- Ajout d'une option pour la localisation des blessures - Ajout d'une option pour la localisation des blessures
## 12.0.15 - Le messager d'Astrobazzarh ## 12.0.15 - Le messager d'Astrobazzarh
- Correction des faces de dés personalisés dice-so-nice - Correction des faces de dés personalisés dice-so-nice
- Les messages de maladies ne sont plus publics - Les messages de maladies ne sont plus publics
- Les messages privés dans les TMR sont aussi envoyés au GM - Les messages privés dans les TMR sont aussi envoyés au GM
@@ -295,7 +232,6 @@
- Amélioration du rendu des tables de compendiums (commande /table) - Amélioration du rendu des tables de compendiums (commande /table)
## 12.0.14 - Les légions d'Astrobazzarh ## 12.0.14 - Les légions d'Astrobazzarh
- Feuille de PNJ: - Feuille de PNJ:
- boutons standard (encaissement, ...) - boutons standard (encaissement, ...)
- boutons pour ajuster les compteurs - boutons pour ajuster les compteurs
@@ -304,18 +240,15 @@
- gestion des armes - gestion des armes
## 12.0.13 - La Chance d'Astrobazzarh ## 12.0.13 - La Chance d'Astrobazzarh
- Fix: jets de caractéristiques - Fix: jets de caractéristiques
## 12.0.12 - L'étalage d'Astrobazzarh ## 12.0.12 - L'étalage d'Astrobazzarh
- Fix: On peut de nouveau vendre des items sans propriétaire, depuis les compendiums ou depuis l'onglet des Objets - Fix: On peut de nouveau vendre des items sans propriétaire, depuis les compendiums ou depuis l'onglet des Objets
- Début de Feuille PNJ au format des encarts Scriptarium - Début de Feuille PNJ au format des encarts Scriptarium
- support des jets de caractéristiques - support des jets de caractéristiques
- support des jets de compétences - support des jets de compétences
## 12.0.11 - Le scriptorium d'Astrobazzarh ## 12.0.11 - Le scriptorium d'Astrobazzarh
- ajout d'un bouton pour générer les éléments de description d'un personnage - ajout d'un bouton pour générer les éléments de description d'un personnage
- ajout du logo en background dans la liste des systèmes Foundry - ajout du logo en background dans la liste des systèmes Foundry
- ajout d'un champ pour le métier - ajout d'un champ pour le métier
@@ -324,12 +257,10 @@
- export de l'esquive avec armure et sans armure - export de l'esquive avec armure et sans armure
## 12.0.9 - 12.0.10 - Le scriptorium d'Astrobazzarh ## 12.0.9 - 12.0.10 - Le scriptorium d'Astrobazzarh
- corrections de l'export scriptarium - corrections de l'export scriptarium
- ajout d'une fonction avancée pour un exporter "scriptarium" des personnages - ajout d'une fonction avancée pour un exporter "scriptarium" des personnages
## 12.0.8 - La quincaillerie d'Astrobazzarh ## 12.0.8 - La quincaillerie d'Astrobazzarh
- le propriétaire est indiqué dans les feuilles d'équipements/compétences/... - le propriétaire est indiqué dans les feuilles d'équipements/compétences/...
- Ecaille d'efficacité - Ecaille d'efficacité
- l'écaille d'efficacité est prise en compte même si on n'utilise pas le ciblage en combat - l'écaille d'efficacité est prise en compte même si on n'utilise pas le ciblage en combat
@@ -339,7 +270,6 @@
- le tooltip de l'initiative affiche correctement l'initiative - le tooltip de l'initiative affiche correctement l'initiative
## 12.0.7 - La propriété d'Astrobazzarh ## 12.0.7 - La propriété d'Astrobazzarh
- correction des opérations faites à la création d'un Item: - correction des opérations faites à la création d'un Item:
- la durée des queues/rencontres/souffles - la durée des queues/rencontres/souffles
- les effets draconiques d'un souffle/queue - les effets draconiques d'un souffle/queue
@@ -354,7 +284,6 @@
- la commande /voyage affiche maintenant les compétences liées au terrain - la commande /voyage affiche maintenant les compétences liées au terrain
## 12.0.6 - Le bazar d'Astrobazzarh ## 12.0.6 - Le bazar d'Astrobazzarh
- Corrections de l'inventaire en bazar: - Corrections de l'inventaire en bazar:
- un problème pouvait survenir en déplaçant les objets - un problème pouvait survenir en déplaçant les objets
l'inventaire, qui fait qu'un conteneur se retrouve récursivement dans son l'inventaire, qui fait qu'un conteneur se retrouve récursivement dans son
@@ -369,26 +298,22 @@
- Fix: restaurer la compatibilité Foundry 11 - Fix: restaurer la compatibilité Foundry 11
## 12.0.5 - Les mauvais jours d'Astrobazzarh ## 12.0.5 - Les mauvais jours d'Astrobazzarh
- Fix: on peut de nouveau ouvrir l'édition de calendrier - Fix: on peut de nouveau ouvrir l'édition de calendrier
- Fix: on ne peut plus ouvrir plusieurs fenêtres de lancer de sort - Fix: on ne peut plus ouvrir plusieurs fenêtres de lancer de sort
- Fix: Failed to execute 'getComputedStyle' on 'Window' - Fix: Failed to execute 'getComputedStyle' on 'Window'
## 12.0.4 - La plaie d'Astrobazzarh ## 12.0.4 - La plaie d'Astrobazzarh
- **Support V12** - **Support V12**
- Fix: les boutons d'encaissement dans le tchat fonctionnent de nouveau - Fix: les boutons d'encaissement dans le tchat fonctionnent de nouveau
- Fix warnings sur "Die" et AudioHelper - Fix warnings sur "Die" et AudioHelper
## 12.0.3 - L'hémorragie d'Astrobazzarh ## 12.0.3 - L'hémorragie d'Astrobazzarh
- **Support V12** - **Support V12**
- On peut de nouveau ouvrir un acteur blessé après redémarrage du monde - On peut de nouveau ouvrir un acteur blessé après redémarrage du monde
- On peut de nouveau ouvrir les Items avec une rareté par environnement - On peut de nouveau ouvrir les Items avec une rareté par environnement
- Le choix de ne plus afficher les demandes de suppression est bien pris en compte - Le choix de ne plus afficher les demandes de suppression est bien pris en compte
## 12.0.2 - Les pluies d'Astrobazzarh ## 12.0.2 - Les pluies d'Astrobazzarh
- **Support V12** - **Support V12**
- correction des actions techniques déleguées au MJ qui bloquaient les fenêtre de lancer de dés des joueurs (et plein d'autres) - correction des actions techniques déleguées au MJ qui bloquaient les fenêtre de lancer de dés des joueurs (et plein d'autres)
- la fenêtre de calendrier s'ouvre correctement - la fenêtre de calendrier s'ouvre correctement
@@ -403,16 +328,13 @@
- correction d'erreurs intempestives 'User ... lacks permission to update ...' - correction d'erreurs intempestives 'User ... lacks permission to update ...'
# 11.2 # 11.2
## 11.2.21 - Le questionnement d'Akarlikarlikar ## 11.2.21 - Le questionnement d'Akarlikarlikar
- Une confirmation spécifique est demandée pour monter dans les terres médianes en cas de rencontre en attente - Une confirmation spécifique est demandée pour monter dans les terres médianes en cas de rencontre en attente
- L'expérience en caractéristique sur les jets de chance et rêve actuels est mise dans la caractéristique correspondante - L'expérience en caractéristique sur les jets de chance et rêve actuels est mise dans la caractéristique correspondante
- Les effets s'appliquent correctement sur les créatures - Les effets s'appliquent correctement sur les créatures
- La date et l'heure (draconiques) sont affichées dans les messages du tchat - La date et l'heure (draconiques) sont affichées dans les messages du tchat
## 11.2.20 - Le soulagement d'Akarlikarlikar ## 11.2.20 - Le soulagement d'Akarlikarlikar
- L'option "ajout de la difficulté d'attaque à l'encaissement" est affichée comme un modificateur d'encaissement - L'option "ajout de la difficulté d'attaque à l'encaissement" est affichée comme un modificateur d'encaissement
- Les options d'encaissement alternatives fonctionnent avec la validation de l'encaissement par le gardien - Les options d'encaissement alternatives fonctionnent avec la validation de l'encaissement par le gardien
- La fenêtre d'astrologie du gardien affiche toutes les heures lues par un personnage - La fenêtre d'astrologie du gardien affiche toutes les heures lues par un personnage
@@ -422,15 +344,12 @@
- Les messages de récupération de rêve en cas de Rêve de Dragon sont clarifiés - Les messages de récupération de rêve en cas de Rêve de Dragon sont clarifiés
## 11.2.19 - Les hémorroïdes d'Akarlikarlikar ## 11.2.19 - Les hémorroïdes d'Akarlikarlikar
- La validation des jets d'encaissement par le Gardien fonctionne de nouveau - La validation des jets d'encaissement par le Gardien fonctionne de nouveau
## 11.2.18 - Le bourrichon d'Akarlikarlikar ## 11.2.18 - Le bourrichon d'Akarlikarlikar
- Les différentes listes de la feuille de personnage ont maintenant le bouton pour envoyer dans le tchat - Les différentes listes de la feuille de personnage ont maintenant le bouton pour envoyer dans le tchat
## 11.2.17 - Le cache-oeil d'Akarlikarlikar ## 11.2.17 - Le cache-oeil d'Akarlikarlikar
- Le titre des fenêtre d'objet affiche de nouveau le type traduit - Le titre des fenêtre d'objet affiche de nouveau le type traduit
- Les tooltips des boutons edit/delete sont maintenant en Français - Les tooltips des boutons edit/delete sont maintenant en Français
- La case à cocher "Cacher les points de tâches" fonctionne de nouveau - La case à cocher "Cacher les points de tâches" fonctionne de nouveau
@@ -439,43 +358,35 @@
- La fenêtre des TMRs ne devrait plus afficher une zone noire au lieu de la carte. - La fenêtre des TMRs ne devrait plus afficher une zone noire au lieu de la carte.
## 11.2.16 - Le Tri d'Akarlikarlikar ## 11.2.16 - Le Tri d'Akarlikarlikar
- Tri alphabétique des items dans la fenêtre de création - Tri alphabétique des items dans la fenêtre de création
- Mise à jour comptage de monde - Mise à jour comptage de monde
## 11.2.15 - La Table d'Akarlikarlikar ## 11.2.15 - La Table d'Akarlikarlikar
- Tirage automatique de la foce d'une rencontre (via la commande /tmrr) - Tirage automatique de la foce d'une rencontre (via la commande /tmrr)
- Ajout de boutons pour ajouter des blessures "complètes" (ie avec perte d'endurance/vie) - Ajout de boutons pour ajouter des blessures "complètes" (ie avec perte d'endurance/vie)
## 11.2.14 - Les petits pas d'Akarlikarlikar ## 11.2.14 - Les petits pas d'Akarlikarlikar
- Correction sur la gestion de la surprise - Correction sur la gestion de la surprise
- Ordre des messages sur les cases humides - Ordre des messages sur les cases humides
## 11.2.13 - Les cent pas d'Akarlikarlikar ## 11.2.13 - Les cent pas d'Akarlikarlikar
- Ajout de la commande /voyage pour gérer la fatigue de marche des voyageurs - Ajout de la commande /voyage pour gérer la fatigue de marche des voyageurs
## 11.2.12 - Le somnifère d'Akarlikarlikar ## 11.2.12 - Le somnifère d'Akarlikarlikar
- Fix: les potions enchantées n'empêchent plus de finir correctement Château Dormant - Fix: les potions enchantées n'empêchent plus de finir correctement Château Dormant
## 11.2.11 - Le miroir d'Akarlikarlikar ## 11.2.11 - Le miroir d'Akarlikarlikar
- Changement des images de compétence de créatures morsure/pinces pour être dans le thème - Changement des images de compétence de créatures morsure/pinces pour être dans le thème
- Suppression de la bordure autour des portraits d'acteurs, remplacés par un légèr éclaircissement du fond - Suppression de la bordure autour des portraits d'acteurs, remplacés par un légèr éclaircissement du fond
- Fix: le refoulement ajoute correctement un souffle et revient à 0 en cas d'échec - Fix: le refoulement ajoute correctement un souffle et revient à 0 en cas d'échec
## 11.2.10 - Les expériences d'Akarlikarlikar ## 11.2.10 - Les expériences d'Akarlikarlikar
- En cas d'expérience des caractéristiques dérivées, - En cas d'expérience des caractéristiques dérivées,
- si plusieurs caractéristiques pourraient recevoir l'expérience, une fenêtre demande au joueur - si plusieurs caractéristiques pourraient recevoir l'expérience, une fenêtre demande au joueur
- si une seule caractéristique peut recevoir de l'expérience, c'est attribué automatiquement - si une seule caractéristique peut recevoir de l'expérience, c'est attribué automatiquement
- Si la force est au maximum pour la taille personnage, on ne peut plus gagner d'expérience - Si la force est au maximum pour la taille personnage, on ne peut plus gagner d'expérience
## 11.2.9 - La barbe d'Akarlikarlikar ## 11.2.9 - La barbe d'Akarlikarlikar
- Amélioration des textes de tooltips - Amélioration des textes de tooltips
- Les tooltips sont plus dans le thème de couleur du système Rêve de Dragon - Les tooltips sont plus dans le thème de couleur du système Rêve de Dragon
- Ajouts d'icones pour les attaque/initiative/soins dans les raccourcis sur les tokens (HUD) - Ajouts d'icones pour les attaque/initiative/soins dans les raccourcis sur les tokens (HUD)
@@ -487,23 +398,19 @@
- Changement de l'icône d'état d'empoignade pour suivre les couleurs des autres icônes d'état - Changement de l'icône d'état d'empoignade pour suivre les couleurs des autres icônes d'état
## 11.2.8 - L'éclairage d'Akarlikarlikar ## 11.2.8 - L'éclairage d'Akarlikarlikar
- l'ajustement de la lumière jour/nuit s'étale sur moins de temps (vaisseau et Lyre) - l'ajustement de la lumière jour/nuit s'étale sur moins de temps (vaisseau et Lyre)
- les nouveaux tooltips ne masquent plus l'information d'expérience - les nouveaux tooltips ne masquent plus l'information d'expérience
- les jets de dés pour maîtriser les rencontres fonctionnent de nouveau - les jets de dés pour maîtriser les rencontres fonctionnent de nouveau
## 11.2.7 - Les explications d'Akarlikarlikar ## 11.2.7 - Les explications d'Akarlikarlikar
- Ajout de tooltips sur la plupart des boutons, liens clickables, objets, tâches, ... - Ajout de tooltips sur la plupart des boutons, liens clickables, objets, tâches, ...
- Fix: on peut de nouveau regarder l'inventaire avec les droits limités/observateur - Fix: on peut de nouveau regarder l'inventaire avec les droits limités/observateur
## 11.2.6 - Les réveils difficiles d'Akarlikarlikar ## 11.2.6 - Les réveils difficiles d'Akarlikarlikar
- Les changements de points de Cœur sont temporaires jusqu'à fin Château Dormant - Les changements de points de Cœur sont temporaires jusqu'à fin Château Dormant
- Fix: tous les petits fixes (feuille qui s'ouvre plus, compagnons animaux, potions qui bloquent Château Dormant, ...) - Fix: tous les petits fixes (feuille qui s'ouvre plus, compagnons animaux, potions qui bloquent Château Dormant, ...)
## 11.2.2 - Les tendres moments d'Akarlikarlikar ## 11.2.2 - Les tendres moments d'Akarlikarlikar
- On peut maintenant avoir des points de Cœur pour des suivants/compagnons - On peut maintenant avoir des points de Cœur pour des suivants/compagnons
- diminuer les points de coeurs fait perdre du moral - diminuer les points de coeurs fait perdre du moral
- on peut proposer un tendre moment - on peut proposer un tendre moment
@@ -522,14 +429,11 @@
ne bloquent plus les jets de dés ne bloquent plus les jets de dés
## v11.2.1 - La technique d'Akarlikarlikar ## v11.2.1 - La technique d'Akarlikarlikar
- On peut créer des armes pour Corps à corps et Esquive. Barreaux de chaise, armes improvisées, techniques d'art martiaux, pas de côté pour faire trébucher l'adversaire... A vous de voir comment imaginer de nouvelles "armes". - On peut créer des armes pour Corps à corps et Esquive. Barreaux de chaise, armes improvisées, techniques d'art martiaux, pas de côté pour faire trébucher l'adversaire... A vous de voir comment imaginer de nouvelles "armes".
- Les armes avec une résistance de 0 ne peuvent pas être utilisées, une image et un rappel indiquent qu'elles sont cassées - Les armes avec une résistance de 0 ne peuvent pas être utilisées, une image et un rappel indiquent qu'elles sont cassées
Vu qu'elles ne peuvent pas être utilisées, permet de savoir pourquoi Vu qu'elles ne peuvent pas être utilisées, permet de savoir pourquoi
## v11.2.0 - Les Terres médianes d'Akarlikarlikar ## v11.2.0 - Les Terres médianes d'Akarlikarlikar
- Les TMRs sont redimensionables - Les TMRs sont redimensionables
- Nouveaux graphismes plus lisibles dans les TMRs - Nouveaux graphismes plus lisibles dans les TMRs
- Nouveau code couleur des icônes dans les TMR: - Nouveau code couleur des icônes dans les TMR:
@@ -543,15 +447,12 @@ Vu qu'elles ne peuvent pas être utilisées, permet de savoir pourquoi
- Fix: Les jets d'encaissement forcés par le gardien à un résultat inférieur à 11 ne peuvent plus donner un deuxième d10 négatif - Fix: Les jets d'encaissement forcés par le gardien à un résultat inférieur à 11 ne peuvent plus donner un deuxième d10 négatif
# v11.1 # v11.1
## v11.1.6 - Les dissections de Werther de Zloth ## v11.1.6 - Les dissections de Werther de Zloth
- Fix: on peut de nouveau donner des compétences aux créatures - Fix: on peut de nouveau donner des compétences aux créatures
- Fix: le délai de guérison d'une blessure rétrogradée est correctement appliqué - Fix: le délai de guérison d'une blessure rétrogradée est correctement appliqué
- Fix: l'encaissement à valider par le MJ fonctionne de nouveau - Fix: l'encaissement à valider par le MJ fonctionne de nouveau
## v11.1.5 - Werther de Zloth l'Onirique ## v11.1.5 - Werther de Zloth l'Onirique
- Fixes: - Fixes:
- la demande de défense ne marchait plus - la demande de défense ne marchait plus
- la tête réserve extensible crée bien une case de réserve extensible (à modifier) - la tête réserve extensible crée bien une case de réserve extensible (à modifier)
@@ -566,7 +467,6 @@ Vu qu'elles ne peuvent pas être utilisées, permet de savoir pourquoi
- pas de jets de vie pour les morts - pas de jets de vie pour les morts
## v11.1.4 - Werther de Zloth l'Onirique ## v11.1.4 - Werther de Zloth l'Onirique
- Ajout du facteur de significative à côté du pourcentage dans le résultat des jets de dés pour rappeler que le pourcentage n'est pas diviasé - Ajout du facteur de significative à côté du pourcentage dans le résultat des jets de dés pour rappeler que le pourcentage n'est pas diviasé
- Fix: dans les TMRs, les tooltips affichent bien les informations de tous les effets sur la case - Fix: dans les TMRs, les tooltips affichent bien les informations de tous les effets sur la case
- Fix: la fatigue et l'éthylisme sont de nouveau pris en compte dans le calcul de l'éthylisme - Fix: la fatigue et l'éthylisme sont de nouveau pris en compte dans le calcul de l'éthylisme
@@ -576,18 +476,15 @@ Vu qu'elles ne peuvent pas être utilisées, permet de savoir pourquoi
- Esthétique: ne pas afficher "+0" pour les ajustements de jets/encaissement - Esthétique: ne pas afficher "+0" pour les ajustements de jets/encaissement
## v11.1.2 - Les vertèbres de Werther de Zloth ## v11.1.2 - Les vertèbres de Werther de Zloth
- Fix: les jets d'encaissement fonctionnent de nouveau normalement - Fix: les jets d'encaissement fonctionnent de nouveau normalement
- Macro "Mon personnage" permettant au joueur d'accéder à sa feuille de personnage depuis la barre de macros - Macro "Mon personnage" permettant au joueur d'accéder à sa feuille de personnage depuis la barre de macros
## v11.1.1 - Les fumebols de Werther de Zloth ## v11.1.1 - Les fumebols de Werther de Zloth
- Fix: on peut de nouveau afficher les vues détaillées - Fix: on peut de nouveau afficher les vues détaillées
- Fix: on peut ouvrir les sacs et contenants portés par les véhicules et créatures - Fix: on peut ouvrir les sacs et contenants portés par les véhicules et créatures
- Fix: cuisiner du gibier prend maintenant bien les proportaions en compte - Fix: cuisiner du gibier prend maintenant bien les proportaions en compte
## v11.1.0 - Les choix de Werther de Zloth ## v11.1.0 - Les choix de Werther de Zloth
- Les options suivantes peuvent être désactivées: - Les options suivantes peuvent être désactivées:
- La transformation de stress à Château Dormant - La transformation de stress à Château Dormant
- La récuperation de chance à Château Dormant - La récuperation de chance à Château Dormant
@@ -605,9 +502,7 @@ Vu qu'elles ne peuvent pas être utilisées, permet de savoir pourquoi
- en cas de charge, les particulières sont toujours en force (p125) - en cas de charge, les particulières sont toujours en force (p125)
# v11.0 # v11.0
## v11.0.28 - les fractures de Khrachtchoum ## v11.0.28 - les fractures de Khrachtchoum
- La gravité de la blessure est affichée dans le résumé de l'encaissement - La gravité de la blessure est affichée dans le résumé de l'encaissement
- Lors du changement d'acteur pendant le round - Lors du changement d'acteur pendant le round
- le message annonçant le joueur dont c'est le tour ne contient plus d'informations de santé - le message annonçant le joueur dont c'est le tour ne contient plus d'informations de santé
@@ -619,14 +514,12 @@ Vu qu'elles ne peuvent pas être utilisées, permet de savoir pourquoi
- le moral est indiqué avant l'icone d'appel au moral - le moral est indiqué avant l'icone d'appel au moral
## v11.0.27 - Khrachtchoum le méticuleux ## v11.0.27 - Khrachtchoum le méticuleux
- le tooltip dans les TMR reste visible si on ne bouge pas la souris - le tooltip dans les TMR reste visible si on ne bouge pas la souris
- le surencombrement n'affecte QUE les actions physiques - le surencombrement n'affecte QUE les actions physiques
- on peut de nouveau fabriquer une potion depuis la fenêtre d'édition de l'herbe - on peut de nouveau fabriquer une potion depuis la fenêtre d'édition de l'herbe
- si les TMR sont minimisées alors qu'une action est requise, elles sont bien réaffichées lorsque l'action est faite - si les TMR sont minimisées alors qu'une action est requise, elles sont bien réaffichées lorsque l'action est faite
## v11.0.26 - le crépuscule de Khrachtchoum ## v11.0.26 - le crépuscule de Khrachtchoum
- gestion correcte des TMRs - gestion correcte des TMRs
- les TMRs ne sont jamais minimisées (par le système) quand le haut-rêvant est en demi-rêve - les TMRs ne sont jamais minimisées (par le système) quand le haut-rêvant est en demi-rêve
- lorsqu'une fenêtre liée aux demi-rêve est affichée, cliquer sur les TMRs n'a pas d'effet - lorsqu'une fenêtre liée aux demi-rêve est affichée, cliquer sur les TMRs n'a pas d'effet
@@ -645,57 +538,45 @@ Vu qu'elles ne peuvent pas être utilisées, permet de savoir pourquoi
- les jets de compétences d'attaque des créatures fonctionnent de nouveau - les jets de compétences d'attaque des créatures fonctionnent de nouveau
## v11.0.25 - la vision du rêve de Khrachtchoum ## v11.0.25 - la vision du rêve de Khrachtchoum
- Les TMRs restent affichées tant que le Haut-rêvant est en demi-rêve - Les TMRs restent affichées tant que le Haut-rêvant est en demi-rêve
## v11.0.24 - les couleurs de Khrachtchoum ## v11.0.24 - les couleurs de Khrachtchoum
- nouvelle carte des TMRs - nouvelle carte des TMRs
## v11.0.23 - la lumière de Khrachtchoum ## v11.0.23 - la lumière de Khrachtchoum
- ajustement automatique de la luminosité selon l'heure pour les scènes: - ajustement automatique de la luminosité selon l'heure pour les scènes:
- avec une vision des tokens (sinon: ce n'est pas une scène de carte pour tokens) - avec une vision des tokens (sinon: ce n'est pas une scène de carte pour tokens)
- avec illumination globale (correspondant à une illumination extérieure) - avec illumination globale (correspondant à une illumination extérieure)
- quand lampe "allumée" dans la fenêtre du calendrier - quand lampe "allumée" dans la fenêtre du calendrier
## v11.0.22 - les automatismes de Khrachtchoum le Problémeux ## v11.0.22 - les automatismes de Khrachtchoum le Problémeux
- Macro pour attaquer avec les compétences de créatures - Macro pour attaquer avec les compétences de créatures
## v11.0.20 ## v11.0.20
- Macro pour attaquer avec les armes des personnages - Macro pour attaquer avec les armes des personnages
## v11.0.17 ## v11.0.17
- Fix: les actions de commerce ne s'appliquait pas bien aux personnages des tokens non liés - Fix: les actions de commerce ne s'appliquait pas bien aux personnages des tokens non liés
## v11.0.15 - L'apprentissage de Khrachtchoum ## v11.0.15 - L'apprentissage de Khrachtchoum
- Fix: l'expérience ne s'appliquait plus sur certaines réussites particulières (régression depuis la 11.0.7) - Fix: l'expérience ne s'appliquait plus sur certaines réussites particulières (régression depuis la 11.0.7)
## v11.0.14 - Les pincettes de Khrachtchoum le Problémeux ## v11.0.14 - Les pincettes de Khrachtchoum le Problémeux
- Correction du calcul de la place restante lors de l'ajout dans un conteneur - Correction du calcul de la place restante lors de l'ajout dans un conteneur
## v11.0.13 - La multiplication de l'eau de Khrachtchoum le Problémeux ## v11.0.13 - La multiplication de l'eau de Khrachtchoum le Problémeux
- Correction de la vente depuis un commerce ayant des quantités illimitées - Correction de la vente depuis un commerce ayant des quantités illimitées
## v11.0.12 - Les poids de la mesure de Khrachtchoum le Problémeux ## v11.0.12 - Les poids de la mesure de Khrachtchoum le Problémeux
- Correction des malus de surencombrement - Correction des malus de surencombrement
- Le malus armure est correctement affiché dans l'onglet des caractéristiques - Le malus armure est correctement affiché dans l'onglet des caractéristiques
- Correction d'orthographe et amélioration des messages des oeuvres d'art - Correction d'orthographe et amélioration des messages des oeuvres d'art
## v11.0.11 - Les bleus de Khrachtchoum le Problémeux ## v11.0.11 - Les bleus de Khrachtchoum le Problémeux
- si le gardien configure le sommeil, les joueurs sont notifiés que chateau dormant vient de passer - si le gardien configure le sommeil, les joueurs sont notifiés que chateau dormant vient de passer
- possibilité de créer des armes et des compétences de créatures non-mortelles. - possibilité de créer des armes et des compétences de créatures non-mortelles.
## v11.0.10 - Les Songes de Khrachtchoum le Problémeux ## v11.0.10 - Les Songes de Khrachtchoum le Problémeux
- on peut de nouveau se déplacer dans les TMRs d'un clic sur la case à atteindre - on peut de nouveau se déplacer dans les TMRs d'un clic sur la case à atteindre
- Lire un livre depuis l'inventaire permet de nouveau de faire un jet de la tâche - Lire un livre depuis l'inventaire permet de nouveau de faire un jet de la tâche
créée au lieu de créer toujours une nouvelle tâche créée au lieu de créer toujours une nouvelle tâche
@@ -706,14 +587,12 @@ Vu qu'elles ne peuvent pas être utilisées, permet de savoir pourquoi
les heures dormies sont déduites des heures restant à dormir les heures dormies sont déduites des heures restant à dormir
## v11.0.9 - Les Souvenirs de Khrachtchoum le Problémeux ## v11.0.9 - Les Souvenirs de Khrachtchoum le Problémeux
- mode de saisie de l'archétype en vue détaillée - mode de saisie de l'archétype en vue détaillée
- création une nouvelle incarnation depuis l'archétype - création une nouvelle incarnation depuis l'archétype
- réorganisation de la fenêtre de sélection des règles optionnelles - réorganisation de la fenêtre de sélection des règles optionnelles
- correction de l'affichage du type dans les fenêtres d'objets - correction de l'affichage du type dans les fenêtres d'objets
## v11.0.8 - la poigne de Sémolosse ## v11.0.8 - la poigne de Sémolosse
- lien vers le changelog - lien vers le changelog
- organisation des compendiums du système - organisation des compendiums du système
- correction de l'empoignade - correction de l'empoignade
@@ -736,3 +615,4 @@ Vu qu'elles ne peuvent pas être utilisées, permet de savoir pourquoi
- correction des achats par le MJ sans acteur sélectionné - correction des achats par le MJ sans acteur sélectionné
Cf branche v10 pour l'historique des versions 10 Cf branche v10 pour l'historique des versions 10

File diff suppressed because it is too large Load Diff

View File

@@ -1,37 +0,0 @@
const gulp = require('gulp');
const less = require('gulp-less');
function onError(err) {
util.log(util.colors.red.bold('[ERROR LESS]:'),util.colors.bgRed(err.message));
this.emit('end');
};
/* ----------------------------------------- */
/* Compile LESS
/* ----------------------------------------- */
function compileLESS() {
return gulp.src("less/foundryvtt-reve-de-dragon.less")
.pipe(less()).on('error',console.log.bind(console))
.pipe(gulp.dest("./css"))
}
const css = gulp.series(compileLESS);
/* ----------------------------------------- */
/* Watch Updates
/* ----------------------------------------- */
const SIMPLE_LESS = ["less/*.less", "less/item/*.less"];
function watchUpdates() {
gulp.watch(SIMPLE_LESS, css);
}
/* ----------------------------------------- */
/* Export Tasks
/* ----------------------------------------- */
exports.default = gulp.series(
gulp.parallel(css),
watchUpdates
);
exports.css = css;
exports.watchUpdates = watchUpdates;

View File

@@ -1,50 +0,0 @@
:root {
/* =================== 2. DEBUGGING HIGHLIGHTERS ============ */
// --debug-background-color-red: #ff000054;
// --debug-background-color-blue: #1d00ff54;
// --debug-background-color-green: #54ff0054;
// --debug-box-shadow-red: inset 0 0 2px red;
// --debug-box-shadow-blue: inset 0 0 2px blue;
// --debug-box-shadow-green: inset 0 0 2px green;
/* =================== 3. some constants ============ */
--fieldset-background: url(/ui/parchment.jpg);
--rdd-color-text-primary: rgba(10, 10, 10, 0.9);
--rdd-input-background:rgba(0, 0, 0, 0.05);
--rdd-color-border-input: rgba(0, 0, 0, 0.2);
--rdd-bg-input: rgba(255, 255, 255, 0.1);
--color-controls:rgba(0, 0, 0, 0.9);
--color-controls-light:hsla(0, 0%, 20%, 0.8);
--color-controls-hover:hsla(60, 100%, 75%, 0.7);
--color-control-border-hover:rgba(255, 128, 0, 0.8);
--color-gold: rgba(191, 149, 63, 0.8);
--gradient-gold: linear-gradient(30deg, rgba(191, 149, 63, 0.3), rgba(252, 246, 186, 0.3), rgba(179, 135, 40, 0.3), rgba(251, 245, 183, 0.3), rgba(170, 119, 28, 0.3));
--gradient-silver: linear-gradient(30deg, rgba(61, 55, 93, 0.3), rgba(178, 179, 196, 0.3), rgba(59, 62, 63, 0.6), rgba(206, 204, 199, 0.3), rgba(61, 46, 49, 0.3));
--gradient-green: linear-gradient(30deg, rgba(7, 76, 0, 0.3), rgba(66, 163, 65, 0.2), rgba(184, 226, 163, 0.1), rgba(66, 163, 65, 0.2), rgba(184, 226, 163, 0.3));
--gradient-red: linear-gradient(150deg, rgba(255, 0, 0, 0.3), rgba(255, 200, 128, 0.05),rgba(255, 200, 128, 0.1), rgba(255,10,0,0.3));
--gradient-violet: linear-gradient(150deg, rgba(100, 45, 124, 0.6), rgba(216, 157, 192, 0.3), rgba(177, 157, 216, 0.5), rgba(107, 62, 121, 0.3), rgba(100, 45, 124, 0.6));
--gradient-purple-black: linear-gradient(150deg, rgba(0, 0, 0, 0.7), rgba(100, 45, 124, 0.4), rgba(82, 17, 131, 0.3),rgba(100, 45, 124, 0.4), rgba(0, 0, 0, 0.7));
--gradient-silver-light: linear-gradient(30deg, rgba(61, 55, 93, 0.2), rgba(178, 179, 196, 0.1), rgba(59, 62, 63, 0.2), rgba(206, 204, 199, 0.1), rgba(61, 46, 49, 0.2));
--gradient-daylight: conic-gradient(
from 0deg,
hsla(50, 100%, 80%, 0.7),
hsla(30, 30%, 40%, 0.1) 25%,
hsla(250, 50%, 40%, 0.1) 25%,
hsla(250, 30%, 30%, 0.7) 50%,
hsla(250, 50%, 40%, 0.1) 75%,
hsla(30, 30%, 40%, 0.1) 75%,
hsla(50, 100%, 80%, 0.7)
);
--background-custom-button: linear-gradient(to bottom, rgba(33, 55, 74, 0.988) 5%, rgba(21, 40, 51, 0.671) 100%);
--background-custom-button-hover: linear-gradient(to bottom, rgb(128, 0, 0) 5%, rgb(62, 1, 1) 100%);
--background-control-selected: linear-gradient(to bottom, hsla(0, 100%, 25%, 0.5) 5%, hsla(0, 100%, 12%, 0.5) 100%);
--background-tooltip: hsla(60, 12%, 85%, 0.95);
--color-tooltip:hsla(282, 47%, 33%, 0.9);
--color-tooltip-faint:hsla(282, 47%, 66%, 0.5);
--background-error:hsla(16, 100%, 50%, 0.8);
--color-profile-border: hsla(0, 0%, 80%, 0.05);
}

View File

@@ -1,84 +0,0 @@
/* ==================== (A) Fonts ==================== */
@font-face {
font-family: "GoudyAcc";
src: url('../fonts/goudyacc.ttf') format("truetype");
}
@font-face {
font-family: "MedievalSharp";
src: url('../fonts/MedievalSharp.ttf') format("truetype");
}
@font-face {
font-family: "GrenzeGotisch";
src: url('../fonts/GrenzeGotisch-Regular.ttf') format("truetype");
}
@font-face {
font-family: "Fondamento";
src: url('../fonts/Fondamento.ttf') format("truetype");
}
@font-face {
font-family: "CaslonAntique";
src: url('../fonts/CaslonAntique.ttf') format("truetype");
}
@font-face {
font-family: 'HeuresDraconiques';
src:
url('../fonts/heuresdraconiques2.woff') format('woff'),
url('../fonts/heuresdraconiques2.woff2') format('woff2'),
url('../fonts/heuresdraconiques2.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
:root {
/* =================== 1. ACTOR SHEET FONT STYLES =========== */
--window-header-title-font-family: CaslonAntique;
--window-header-title-font-size: 1.6rem;
--window-header-title-font-weight: normal;
--window-header-title-color: #f5f5f5;
--major-button-font-family: CaslonAntique;
--major-button-font-size: 1.4rem;
--major-button-font-weight: normal;
--major-button-color: #dadada;
--tab-header-font-family: CaslonAntique;
--tab-header-font-size: 1.2rem;
--tab-header-font-weight: 700;
--tab-header-color: #403f3e;
--tab-header-color-active: #4a0404;
--actor-input-font-family: CaslonAntique;
--actor-input-font-size: 1.2rem;
--actor-input-font-weight: 500;
--actor-input-color: black;
--actor-label-font-family: CaslonAntique;
--actor-label-font-size: 1.2rem;
--actor-label-font-weight: 700;
--actor-label-color: #464331c4;
}
/* Global styles & Font */
.window-app {
font-family: CaslonAntique;
text-align: justify;
font-size: 1rem;
letter-spacing: 1px;
}
/* Fonts */
.sheet header.sheet-header h1 input,
.window-app .window-header,
#actors .directory-list,
#navigation #scene-list .scene.nav-item {
font-family: "GoudyAcc"
}
/* For title, sidebar character and scene */
.sheet nav.sheet-tabs,
.window-app input,
.sheet header.sheet-header .header-compteurs,
.sheet header.sheet-header .flex-group-center.flex-fatigue,
select, .item-checkbox, #sidebar, #players, #navigation #nav-toggle {
font-family: "CaslonAntique"; /* For sheet parts; For nav and title */
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +0,0 @@
// Styles pour la feuille d'objet Monnaie
.monnaie-content {
.item-sheet-common();
.item-sheet-header();
}

View File

@@ -1,7 +0,0 @@
// Styles pour la feuille d'objet Monnaie
.munition-content {
.item-sheet-common();
.item-sheet-header();
}

View File

@@ -1,7 +0,0 @@
// Styles pour la feuille d'objet Monnaie
.tarot-content {
.item-sheet-common();
.item-sheet-header();
}

View File

@@ -1,108 +0,0 @@
.item-sheet-common() {
padding: 0px;
// Styles pour la section de description, si le partiel utilise une structure standard
.editor,
.editor-content {
height: auto; // Ajuster selon le besoin
min-height: 100px; // Hauteur minimale pour la description
background: var(--rdd-bg-input-alt); // Une couleur de fond alternative
padding: 5px;
border-radius: 3px;
color: var(--rdd-color-text-primary);
}
.window-content {
font-family: CaslonAntique;
text-align: justify;
font-size: 1rem;
letter-spacing: 1px;
padding: 0% 0 0 0;
font-size: calc(var(--font-size-standard) * 1);
color: var(--color-dark-1);
background-size: 100% 100%;
}
fieldset {
background: var(--fieldset-background);
color: var(--rdd-color-text-primary);
margin-bottom: 4px;
border-radius: 6px;
border-color: var(--rdd-color-text-primary);
border-width: 2px;
}
.form-group {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: flex-start;
align-items: center;
padding: 2px 0;
border-bottom: 1px solid var(--rdd-color-shadow-primary);
font-size: 0.9rem;
label {
font-weight: normal;
flex: 2;
padding-left: 5px;
margin: 0;
color: var(
--rdd-color-text-primary
); // Assurez-vous que cette variable existe dans colors.less
}
.attribute-value,
input[type="text"],
input[type="number"],
select {
flex: 3;
background: var(--rdd-input-background);
border: 1px solid var(--rdd-color-border-input); // Assurez-vous que cette variable existe
color: var(
--rdd-color-text-input
); // Assurez-vous que cette variable existe
padding: 2px 2px; // Augmentation du padding vertical
border-radius: 3px;
}
input[type="checkbox"] {
flex: 0 0 20px; // Taille fixe pour les cases à cocher
margin-left: 5px;
}
}
}
.item-sheet-header() {
background: #011d33 url(../assets/ui/bg_header.webp) no-repeat left top;
color: rgba(255, 255, 255, 1);
.sheet-header-row {
display: flex;
flex-direction: row;
align-items: center;
h1,
input {
font-family: CaslonAntique;
font-size: 2.5rem;
font-weight: normal;
color: var(--window-header-title-color);
margin: 4px;
height: 3rem;
}
}
:is(
input[type="text"],
input[type="number"],
input[type="password"],
input[type="datetime-local"],
input[type="date"],
input[type="time"]
) {
color: rgba(255, 255, 255, 0.75);
background: rgba(255, 255, 255, 0.1);
border: 0 none;
margin-bottom: 0.2rem;
}
}

View File

@@ -1583,7 +1583,7 @@ export class RdDActor extends RdDBaseActorSang {
return return
} }
if (rollData.rolled.isEchec || if (rollData.rolled.isEchec ||
(rollData.diviseurSignificative && (rollData.rolled.roll * rollData.diviseurSignificative > rollData.rolled.score))) { (rollData.ajustements.diviseurSignificative && (rollData.rolled.roll * rollData.ajustements.diviseurSignificative > rollData.score))) {
rollData.perteMoralEchec = rollData.moral <= -3 ? 'dissolution' : 'perte'; rollData.perteMoralEchec = rollData.moral <= -3 ? 'dissolution' : 'perte';
rollData.moral = await this.moralIncDec(-1); /* L'appel au moral a échoué. Le personnage perd un point de moral */ rollData.moral = await this.moralIncDec(-1); /* L'appel au moral a échoué. Le personnage perd un point de moral */
} }
@@ -1795,8 +1795,10 @@ export class RdDActor extends RdDBaseActorSang {
}; };
RollDataAjustements.calcul(rollData, this); RollDataAjustements.calcul(rollData, this);
await RdDResolutionTable.rollData(rollData); await RdDResolutionTable.rollData(rollData);
this.gererExperience(rollData);
await RdDRollResult.displayRollData(rollData, this) await RdDRollResult.displayRollData(rollData, this)
this.gererExperience(rollData);
return rollData.rolled; return rollData.rolled;
} }

View File

@@ -341,9 +341,6 @@ export class RdDBaseActorReve extends RdDBaseActor {
const selectedCaracName = ['apparence', 'perception', 'force', 'reve'].find(it => carac[it] != undefined) const selectedCaracName = ['apparence', 'perception', 'force', 'reve'].find(it => carac[it] != undefined)
await this.openRollDialog({ await this.openRollDialog({
name: 'jet-quelconque',
label: 'Jet',
template: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll.hbs',
rollData: { rollData: {
alias: this.getAlias(), alias: this.getAlias(),
carac: carac, carac: carac,

View File

@@ -14,12 +14,11 @@ import { ItemAction } from "../item/item-actions.js";
* Extend the basic ActorSheet with some very simple modifications * Extend the basic ActorSheet with some very simple modifications
* @extends {ActorSheet} * @extends {ActorSheet}
*/ */
export class RdDBaseActorSheet extends foundry.appv1.sheets.ActorSheet { export class RdDBaseActorSheet extends ActorSheet {
static _warnedAppV1 = true
/** @override */ /** @override */
static get defaultOptions() { static get defaultOptions() {
return foundry.utils.mergeObject(foundry.appv1.sheets.ActorSheet.defaultOptions, { return foundry.utils.mergeObject(ActorSheet.defaultOptions, {
classes: ["rdd", "sheet", "actor"], classes: ["rdd", "sheet", "actor"],
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "carac" }], tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "carac" }],
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: undefined }], dragDrop: [{ dragSelector: ".item-list .item", dropSelector: undefined }],

View File

@@ -213,7 +213,6 @@ export class RdDBaseActor extends Actor {
isCreatureEntite() { return this.isCreature() || this.isEntite() } isCreatureEntite() { return this.isCreature() || this.isEntite() }
isCreature() { return false } isCreature() { return false }
isEntite(typeentite = []) { return false } isEntite(typeentite = []) { return false }
isHautRevant() { return false }
isVehicule() { return false } isVehicule() { return false }
isPersonnage() { return false } isPersonnage() { return false }
getItem(id, type = undefined) { getItem(id, type = undefined) {
@@ -735,7 +734,7 @@ export class RdDBaseActor extends Actor {
name: this.getAlias(), name: this.getAlias(),
system: { description: this.system.description } system: { description: this.system.description }
} }
foundry.applications.handlebars.renderTemplate('systems/foundryvtt-reve-de-dragon/templates/post-actor.hbs', chatData) renderTemplate('systems/foundryvtt-reve-de-dragon/templates/post-actor.hbs', chatData)
.then(html => ChatMessage.create(RdDUtility.chatDataSetup(html, modeOverride))); .then(html => ChatMessage.create(RdDUtility.chatDataSetup(html, modeOverride)));
} }

View File

@@ -1,4 +1,6 @@
import { DialogItemAchat } from "../achat-vente/dialog-item-achat.js";
import { RdDItem } from "../item.js"; import { RdDItem } from "../item.js";
import { RdDUtility } from "../rdd-utility.js";
import { RdDBaseActorSheet } from "./base-actor-sheet.js"; import { RdDBaseActorSheet } from "./base-actor-sheet.js";
/** /**
@@ -42,8 +44,13 @@ export class RdDCommerceSheet extends RdDBaseActorSheet {
activateListeners(html) { activateListeners(html) {
super.activateListeners(html); super.activateListeners(html);
this.html.find('a.item-acheter').click(async event => await this.vente(this.getItem(event)));
this.html.find('.service-acheter').click(async event => await this.vente(this.getItem(event)));
if (!this.options.editable) return; if (!this.options.editable) return;
this.html.find('a.item-quantite-moins').click(async event => await this.getItem(event)?.quantiteIncDec(-1, { supprimerSiZero: false }));
this.html.find('a.item-quantite-plus').click(async event => await this.getItem(event)?.quantiteIncDec(1));
this.html.find('input.item-quantite').change(async event => { this.html.find('input.item-quantite').change(async event => {
const newQuantite = Math.max(0, Number.parseInt(this.html.find(event.currentTarget).val())); const newQuantite = Math.max(0, Number.parseInt(this.html.find(event.currentTarget).val()));
await this.getItem(event)?.update({ "system.quantite": newQuantite }); await this.getItem(event)?.update({ "system.quantite": newQuantite });
@@ -57,4 +64,28 @@ export class RdDCommerceSheet extends RdDBaseActorSheet {
getTypesInventaire() { getTypesInventaire() {
return RdDItem.getItemTypesInventaire('all'); return RdDItem.getItemTypesInventaire('all');
} }
async vente(item) {
const acheteur = RdDUtility.getSelectedActor();
if (!acheteur) {
ui.notifications.warn(`Pas d'acheteur sélectionné`);
return;
}
const disponible = this.actor.getQuantiteDisponible(item)
if (disponible == 0) {
ui.notifications.warn(`${this.getAlias()} n'a plus de ${item.name} en vente`);
return;
}
await DialogItemAchat.onAcheter({
item,
vendeur: this.actor,
acheteur,
quantiteIllimite: disponible == undefined,
nbLots: disponible ?? 1,
tailleLot: 1,
prixLot: item.calculerPrixCommercant()
});
}
} }

View File

@@ -1,6 +1,4 @@
import { DialogItemAchat } from "../achat-vente/dialog-item-achat.js";
import { Misc } from "../misc.js"; import { Misc } from "../misc.js";
import { RdDUtility } from "../rdd-utility.js";
import { RdDBaseActor } from "./base-actor.js"; import { RdDBaseActor } from "./base-actor.js";
export class RdDCommerce extends RdDBaseActor { export class RdDCommerce extends RdDBaseActor {
@@ -39,27 +37,4 @@ export class RdDCommerce extends RdDBaseActor {
const pourcentage = this.system.pourcentage ?? 100; const pourcentage = this.system.pourcentage ?? 100;
return Misc.keepDecimals(Math.ceil(item.system.cout * pourcentage) / 100, 2); return Misc.keepDecimals(Math.ceil(item.system.cout * pourcentage) / 100, 2);
} }
async vente(item) {
const acheteur = RdDUtility.getSelectedActor();
if (!acheteur) {
ui.notifications.warn(`Pas d'acheteur sélectionné`);
return;
}
const disponible = this.getQuantiteDisponible(item)
if (disponible == 0) {
ui.notifications.warn(`${this.getAlias()} n'a plus de ${item.name} en vente`);
return;
}
await DialogItemAchat.onAcheter({
item,
vendeur: this,
acheteur,
quantiteIllimite: disponible == undefined,
nbLots: disponible ?? 1,
tailleLot: 1,
prixLot: item.calculerPrixCommercant()
});
}
} }

View File

@@ -7,7 +7,7 @@ import { CATEGORIES_COMPETENCES, CATEGORIES_DRACONIC, Mapping } from "./mapping.
export class RdDActorExportSheet extends RdDActorSheet { export class RdDActorExportSheet extends RdDActorSheet {
static init() { static init() {
foundry.applications.handlebars.loadTemplates([ loadTemplates([
"systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/arme.hbs", "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/arme.hbs",
"systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/blessure.hbs", "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/blessure.hbs",
"systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/blessures.hbs", "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/blessures.hbs",
@@ -21,7 +21,7 @@ export class RdDActorExportSheet extends RdDActorSheet {
"systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/protection.hbs", "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/protection.hbs",
"systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/sort.hbs", "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/sort.hbs",
]) ])
foundry.documents.collections.Actors.registerSheet(SYSTEM_RDD, RdDActorExportSheet, { types: ["personnage"], makeDefault: false, label: "Feuille simplifiée" }) Actors.registerSheet(SYSTEM_RDD, RdDActorExportSheet, { types: ["personnage"], makeDefault: false, label: "Feuille simplifiée" })
} }
static get defaultOptions() { static get defaultOptions() {

View File

@@ -3,7 +3,7 @@ import { Misc } from "../../misc.js"
import { EXPORT_CSV_SCRIPTARIUM, OptionsAvancees } from "../../settings/options-avancees.js" import { EXPORT_CSV_SCRIPTARIUM, OptionsAvancees } from "../../settings/options-avancees.js"
import { Mapping } from "./mapping.js" import { Mapping } from "./mapping.js"
const IMG_SCRIPTARIUM = '<img class="context-menu-img" src="systems/foundryvtt-reve-de-dragon/assets/ui/scriptarium.svg">' const IMG_SCRIPTARIUM = '<img class="context-menu-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/scriptarium.svg">'
export class ExportScriptarium { export class ExportScriptarium {
@@ -12,18 +12,14 @@ export class ExportScriptarium {
} }
constructor() { constructor() {
//Hooks.on("getActorDirectoryFolderContext", (actorDirectory, menus) => { ExportScriptarium.INSTANCE.onActorDirectoryMenu(actorDirectory, menus) }) Hooks.on("getActorDirectoryFolderContext", (actorDirectory, menus) => { ExportScriptarium.INSTANCE.onActorDirectoryMenu(actorDirectory, menus) })
Hooks.on("getFolderContextOptions", (actorDirectory, menus) => { ExportScriptarium.INSTANCE.onActorDirectoryMenu(actorDirectory, menus) }) Hooks.on("getActorDirectoryEntryContext", (actorDirectory, menus) => { ExportScriptarium.INSTANCE.onActorDirectoryMenu(actorDirectory, menus) })
//Hooks.on("getActorDirectoryEntryContext", (actorDirectory, menus) => { ExportScriptarium.INSTANCE.onActorDirectoryMenu(actorDirectory, menus) })
Hooks.on("getActorContextOptions", (actorDirectory, menus) => { ExportScriptarium.INSTANCE.onActorDirectoryMenu(actorDirectory, menus) })
} }
onActorDirectoryMenu(actorDirectory, menus) { onActorDirectoryMenu(actorDirectory, menus) {
// DEBUG console.log("ExportScriptarium.onActorDirectoryMenu", actorDirectory, menus)
menus.push({ menus.push({
name: 'Export Personnages', name: 'Export Personnages <i class="fa-regular fa-file-csv"></i>',
icon: '<i class="fa-solid fa-download"></i>', //IMG_SCRIPTARIUM, icon: IMG_SCRIPTARIUM,
condition: (target) => game.user.isGM && condition: (target) => game.user.isGM &&
OptionsAvancees.isUsing(EXPORT_CSV_SCRIPTARIUM) && OptionsAvancees.isUsing(EXPORT_CSV_SCRIPTARIUM) &&
this.$getActors(actorDirectory, target).length > 0, this.$getActors(actorDirectory, target).length > 0,
@@ -32,28 +28,22 @@ export class ExportScriptarium {
} }
$getTargetName(actorDirectory, target) { $getTargetName(actorDirectory, target) {
target = $(target)
const li = target.closest(".directory-item") const li = target.closest(".directory-item")
const folderId = li.data("folderId") const folderId = li.data("folderId")
const actorId = li.data("entryId") const actorId = li.data("documentId")
return actorId return actorId
? game.actors.get(actorId).name ? game.actors.get(actorId).name
: actorDirectory.collection.filter(it => it.folder.id == folderId).name : actorDirectory.folders.find(it => it.id == folderId).name
} }
$getActors(actorDirectory, target) { $getActors(actorDirectory, target) {
if (actorDirectory.id != "actors") {
return []
}
// DEBUG console.log("ExportScriptarium.$getActors", actorDirectory, target)
target = $(target)
const li = target.closest(".directory-item") const li = target.closest(".directory-item")
const folderId = li.data("folderId") const folderId = li.data("folderId")
const actorId = li.data("entryId") const actorId = li.data("documentId")
const actors = actorId const actors = actorId
? [game.actors.get(actorId)] ? [game.actors.get(actorId)]
: folderId : folderId
? actorDirectory.collection.filter(it => it.folder.id == folderId) ? actorDirectory.folders.find(it => it.id == folderId).contents
: [] : []
return actors.filter(it => it.type == ACTOR_TYPES.personnage) return actors.filter(it => it.type == ACTOR_TYPES.personnage)
} }
@@ -64,7 +54,7 @@ export class ExportScriptarium {
const actorLines = actors.map(actor => Misc.join(this.getActorLine(actor), ';')) const actorLines = actors.map(actor => Misc.join(this.getActorLine(actor), ';'))
const data = Misc.join([header, ...actorLines], eol) const data = Misc.join([header, ...actorLines], eol)
const filename = `scriptarium-${targetName?.slugify()}.csv`; const filename = `scriptarium-${targetName?.slugify()}.csv`;
foundry.utils.saveDataToFile(data, "text/csv;charset=windows-1252", `${filename}`); saveDataToFile(data, "text/csv;charset=windows-1252", `${filename}`);
} }
getHeaderLine() { getHeaderLine() {

View File

@@ -26,7 +26,7 @@ const RANDOM_VALUES = {
export class AppPersonnageAleatoire extends FormApplication { export class AppPersonnageAleatoire extends FormApplication {
static preloadHandlebars() { static preloadHandlebars() {
foundry.applications.handlebars.loadTemplates([ loadTemplates([
'systems/foundryvtt-reve-de-dragon/templates/actor/random/champ-aleatoire.hbs', 'systems/foundryvtt-reve-de-dragon/templates/actor/random/champ-aleatoire.hbs',
]) ])
} }

View File

@@ -1,5 +0,0 @@
export { default as RdDItemBaseSheet} from "./common-item-sheet.mjs"
export { default as RdDMonnaieSheet } from "./monnaie-sheet.mjs"
export { default as RdDMunitionSheet } from "./munition-sheet.mjs"
export { default as RdDTarotSheet } from "./tarot-sheet.mjs"

View File

@@ -1,111 +0,0 @@
const { HandlebarsApplicationMixin } = foundry.applications.api
import { SYSTEM_RDD } from "../../constants.js"
import { Misc } from "../../misc.js"
import { RdDSheetUtility } from "../../rdd-sheet-utility.js";
export default class RdDItemBaseSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ItemSheetV2) {
static preloadHandlebars(...templatesList) {
const handlebars = ["systems/foundryvtt-reve-de-dragon/templates/sheets/item/common/header.hbs"]
templatesList.forEach(templates =>
templates.forEach(t =>
t.handlebars().forEach(h => handlebars.push(h))
)
)
loadTemplates(Misc.distinct(handlebars))
}
static register(sheetClass) {
const itemType = sheetClass.ITEM_TYPE
Items.registerSheet(SYSTEM_RDD, sheetClass, {
label: Misc.typeName('Item', itemType),
types: [itemType],
makeDefault: true
})
}
static registerAll(...sheetClasses) {
const handlebars = ["systems/foundryvtt-reve-de-dragon/templates/sheets/item/common/header.hbs"]
sheetClasses.forEach(sheetClass => {
sheetClass.TEMPLATES.forEach(t =>
t.handlebars().forEach(h => handlebars.push(h))
)
const itemType = sheetClass.ITEM_TYPE
foundry.documents.collections.Items.registerSheet(SYSTEM_RDD, sheetClass, {
label: Misc.typeName('Item', itemType),
types: [itemType],
makeDefault: true
})
})
foundry.applications.handlebars.loadTemplates(Misc.distinct(handlebars))
}
static get ITEM_TYPE() { return undefined }
constructor(options = {}) {
super(options)
}
static get TEMPLATES() { return [] }
/** @override */
static DEFAULT_OPTIONS = {
classes: ["fvtt-rdd", "item"],
position: {
width: 448,
height: "auto",
},
form: {
submitOnChange: true,
},
window: {
resizable: true,
},
actions: {
editImage: RdDItemBaseSheet.#onEditImage,
}
}
/** @override */
async _prepareContext() {
return {
item: this.document,
options: RdDSheetUtility.getOptions(this.document, this.isEditable),
fields: this.document.schema.fields,
systemFields: this.document.system.schema.fields,
system: this.document.system,
source: this.document.toObject(),
isEditable: this.isEditable,
}
}
// #region Actions
/**
* Handle changing a Document's image.
*
* @this RdDItemBaseSheet
* @param {PointerEvent} event The originating click event
* @param {HTMLElement} target The capturing HTML element which defined a [data-action]
* @returns {Promise}
* @private
*/
static async #onEditImage(event, target) {
const attr = target.dataset.edit
const current = foundry.utils.getProperty(this.document, attr)
const { img } = this.document.constructor.getDefaultArtwork?.(this.document.toObject()) ?? {}
const fp = new FilePicker({
current,
type: "image",
redirectToRoot: img ? [img] : [],
callback: (path) => {
this.document.update({ [attr]: path })
},
top: this.position.top + 40,
left: this.position.left + 10,
})
return fp.browse()
}
// #endregion
}

View File

@@ -1,35 +0,0 @@
import { TEMPLATE_DESCRIPTION, TEMPLATE_INVENTAIRE } from "../../common/_module.mjs";
import { ITEM_TYPES } from "../../constants.js";
import RdDItemBaseSheet from "./common-item-sheet.mjs";
export default class RdDMonnaieSheet extends RdDItemBaseSheet {
/** @override */
static get ITEM_TYPE() { return ITEM_TYPES.monnaie }
static get TEMPLATES() { return [TEMPLATE_DESCRIPTION, TEMPLATE_INVENTAIRE] }
/** @override */
static DEFAULT_OPTIONS = Object.assign({},
RdDItemBaseSheet.DEFAULT_OPTIONS,
{
classes: ["fvtt-rdd", "item", "monnaie"],
position: { width: 448 },
window: { contentClasses: ["monnaie-content"] }
})
/** @override */
static PARTS = {
main: {
template: "systems/foundryvtt-reve-de-dragon/templates/sheets/item/monnaie.hbs",
},
}
/** @override */
async _prepareContext() {
return Object.assign(
await super._prepareContext(),
await TEMPLATE_DESCRIPTION.prepareContext(this.document),
await TEMPLATE_INVENTAIRE.prepareContext(this.document)
)
}
}

View File

@@ -1,34 +0,0 @@
import { TEMPLATE_DESCRIPTION, TEMPLATE_INVENTAIRE } from "../../common/_module.mjs";
import { ITEM_TYPES } from "../../constants.js";
import RdDItemBaseSheet from "./common-item-sheet.mjs";
export default class RdDMunitionSheet extends RdDItemBaseSheet {
/** @override */
static get ITEM_TYPE() { return ITEM_TYPES.munition }
static get TEMPLATES() { return [TEMPLATE_DESCRIPTION, TEMPLATE_INVENTAIRE] }
/** @override */
static DEFAULT_OPTIONS = Object.assign({},
RdDItemBaseSheet.DEFAULT_OPTIONS,
{
classes: ["fvtt-rdd", "item", "munition"],
position: { width: 448 },
window: { contentClasses: ["munition-content"] }
})
/** @override */
static PARTS = {
main: {
template: "systems/foundryvtt-reve-de-dragon/templates/sheets/item/munition.hbs",
},
}
/** @override */
async _prepareContext() {
return Object.assign(
await super._prepareContext(),
await TEMPLATE_DESCRIPTION.prepareContext(this.document),
await TEMPLATE_INVENTAIRE.prepareContext(this.document)
)
}
}

View File

@@ -1,33 +0,0 @@
import { TEMPLATE_DESCRIPTION, TEMPLATE_INVENTAIRE } from "../../common/_module.mjs";
import { ITEM_TYPES } from "../../constants.js";
import RdDItemBaseSheet from "./common-item-sheet.mjs";
export default class RdDTarotSheet extends RdDItemBaseSheet {
/** @override */
static get ITEM_TYPE() { return ITEM_TYPES.tarot }
static get TEMPLATES() { return [TEMPLATE_DESCRIPTION] }
/** @override */
static DEFAULT_OPTIONS = Object.assign({},
RdDItemBaseSheet.DEFAULT_OPTIONS,
{
classes: ["fvtt-rdd", "item", "tarot"],
position: { width: 448 },
window: { contentClasses: ["tarot-content"] }
})
/** @override */
static PARTS = {
main: {
template: "systems/foundryvtt-reve-de-dragon/templates/sheets/item/tarot.hbs",
},
}
/** @override */
async _prepareContext() {
return Object.assign(
await super._prepareContext(),
await TEMPLATE_DESCRIPTION.prepareContext(this.document)
)
}
}

View File

@@ -13,7 +13,7 @@ const TEXT_ROLL_MANAGERS = [
export class RdDTextEditor { export class RdDTextEditor {
static registerChatCallbacks(html) { static registerChatCallbacks(html) {
$(html).on("click", '.roll-text', async event => await RdDTextEditor.rollText(event)) html.on("click", '.roll-text', async event => await RdDTextEditor.rollText(event))
} }
static async enrichHTML(text, object, options = {showlink:true}) { static async enrichHTML(text, object, options = {showlink:true}) {
@@ -30,7 +30,7 @@ export class RdDTextEditor {
context.text = await manager.onReplaceRoll(context); context.text = await manager.onReplaceRoll(context);
} }
return await foundry.applications.ux.TextEditor.implementation.enrichHTML(context.text, { return await TextEditor.enrichHTML(context.text, {
relativeTo: object, relativeTo: object,
secrets: object?.isOwner, secrets: object?.isOwner,
async: true async: true

View File

@@ -10,7 +10,7 @@ import { RdDTextEditor } from "./apps/rdd-text-roll-editor.js";
export class ChatUtility { export class ChatUtility {
static async init() { static async init() {
Hooks.on("renderChatMessageHTML", async (app, html, msg) => await ChatUtility.onRenderChatMessage(app, html, msg)) Hooks.on("renderChatMessage", async (app, html, msg) => await ChatUtility.onRenderChatMessage(app, html, msg))
Hooks.on("createChatMessage", async (chatMessage, options, id) => await ChatUtility.onCreateChatMessage(chatMessage, options, id)) Hooks.on("createChatMessage", async (chatMessage, options, id) => await ChatUtility.onCreateChatMessage(chatMessage, options, id))
} }
@@ -190,8 +190,8 @@ export class ChatUtility {
if (rddTimestamp) { if (rddTimestamp) {
const timestamp = new RdDTimestamp(rddTimestamp); const timestamp = new RdDTimestamp(rddTimestamp);
const timestampData = timestamp.toCalendrier(); const timestampData = timestamp.toCalendrier();
const dateHeure = await foundry.applications.handlebars.renderTemplate('systems/foundryvtt-reve-de-dragon/templates/common/date-heure.hbs', timestampData); const dateHeure = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/common/date-heure.hbs', timestampData);
$(html).find('header.message-header .message-sender').after(dateHeure) html.find('header.message-header .message-sender').after(dateHeure)
} }
} }

View File

@@ -5,13 +5,13 @@ const INFO_COEUR = 'info-coeur';
export class RdDCoeur { export class RdDCoeur {
static registerChatCallbacks(html) { static registerChatCallbacks(html) {
$(html).on("click", 'a.accepter-tendre-moment', event => { html.on("click", 'a.accepter-tendre-moment', event => {
RdDCoeur.accepterTendreMoment(RdDCoeur.extractInfoCoeur(event)) RdDCoeur.accepterTendreMoment(RdDCoeur.extractInfoCoeur(event))
}) })
$(html).on("click", 'a.refuser-tendre-moment', event => { html.on("click", 'a.refuser-tendre-moment', event => {
RdDCoeur.refuserTendreMoment(RdDCoeur.extractInfoCoeur(event)) RdDCoeur.refuserTendreMoment(RdDCoeur.extractInfoCoeur(event))
}) })
$(html).on("click", 'a.perdre-point-coeur-douceur', event => { html.on("click", 'a.perdre-point-coeur-douceur', event => {
RdDCoeur.perdreEnDouceur( RdDCoeur.perdreEnDouceur(
RdDCoeur.extractInfoCoeur(event), RdDCoeur.extractInfoCoeur(event),
event.currentTarget.attributes['data-actor-id'].value) event.currentTarget.attributes['data-actor-id'].value)

View File

@@ -1,8 +0,0 @@
import { CommonDescription } from "./description.mjs";
import { CommonInventaire } from "./inventaire.mjs";
export const TEMPLATE_DESCRIPTION = new CommonDescription()
export const TEMPLATE_INVENTAIRE = new CommonInventaire()
export const ALL_COMMON_TEMPLATES = [TEMPLATE_DESCRIPTION, TEMPLATE_INVENTAIRE]

View File

@@ -1,10 +0,0 @@
/**
* class describing common methods implemented by template parts,
* used for sheet/models/documents
*/
export default class CommonTemplate {
fields() { }
handlebars() { return [] }
actions() { return {} }
async prepareContext(item) { }
}

View File

@@ -1,32 +0,0 @@
import { RdDTextEditor } from "../apps/rdd-text-roll-editor.js"
import CommonTemplate from "./common-template.mjs"
import { HTMLSTRING } from "./field-types.mjs"
const fields = foundry.data.fields
export class CommonDescription extends CommonTemplate {
fields() {
return {
description: new fields.HTMLField({ ...HTMLSTRING }),
descriptionmj: new fields.HTMLField({ gmOnly: true, ...HTMLSTRING })
}
}
handlebars() {
return [
"systems/foundryvtt-reve-de-dragon/templates/sheets/item/common/template-description.hbs",
]
}
actions() {
return {}
}
async prepareContext(item) {
const enriched = {
description: await RdDTextEditor.enrichHTML(item.system.description, item),
descriptionmj: await RdDTextEditor.enrichHTML(item.system.descriptionmj, item),
}
return { enriched }
}
}

View File

@@ -1,9 +0,0 @@
export const INTEGER = { required: true, nullable: false, min: 0, integer: true }
export const DECIMAL = { required: true, nullable: false, min: 0, integer: false } /* TODO: validation de nombre décimales?*/
export const INTEGER_SIGNED = { required: true, nullable: false, integer: true }
export const DECIMAL_SIGNED = { required: true, nullable: false, integer: false }
export const STRING = { required: true, nullable: false, blank: true, trim: true }
export const HTMLSTRING = { initial: "", required: true, nullable: false, blank: true, textSearch: true }
export const MODEL_ARRAY = { initial: [], required: true, nullable: false }

View File

@@ -1,36 +0,0 @@
import CommonTemplate from "./common-template.mjs"
import { RARETES } from "../item/raretes.js"
import { DECIMAL, INTEGER, INTEGER_SIGNED, MODEL_ARRAY, STRING } from "./field-types.mjs"
const fields = foundry.data.fields
export class CommonInventaire extends CommonTemplate {
fields() {
return {
encombrement: new fields.NumberField({ label: "Encombrement", initial: 0, ...INTEGER }),
quantite: new fields.NumberField({ label: "Quantité", initial: 1, ...INTEGER }),
qualite: new fields.NumberField({ label: "Qualité", initial: 0, ...INTEGER_SIGNED }),
cout: new fields.NumberField({ label: "Coût", initial: 0.0, ...DECIMAL }),
environnement: new fields.ArrayField(
new fields.SchemaField({
milieu: new fields.StringField({ label: "Milieu", initial: "", ...STRING }),
rarete: new fields.StringField({
label: "Rareté", initial: RARETES[0].code, ...STRING,
validate: (value, options) => RARETES.find(it => it.code == value)
}),
frequence: new fields.NumberField({ label: "Fréquence", initial: RARETES[0].frequence, ...INTEGER }),
}),
{ label: "Environnement", ...MODEL_ARRAY }),
}
}
handlebars() {
return [
"systems/foundryvtt-reve-de-dragon/templates/sheets/item/common/template-inventaire.hbs"
]
}
async prepareContext(item) {
return {}
}
}

View File

@@ -1,3 +0,0 @@
export { default as RdDModelMonnaie } from "./monnaie.mjs"
export { default as RdDModelMunition } from "./munition.mjs"
export { default as RdDModelTarot } from "./tarot.mjs"

View File

@@ -1,11 +0,0 @@
import { RdDItem } from "../item.js";
export default class RdDItemMonnaie extends RdDItem {
constructor(data, context) {
if (!data.img) {
data.img = 'systems/foundryvtt-reve-de-dragon/icons/objets/piece_etain_poisson.webp'
}
super(data, context);
}
}

View File

@@ -1,7 +0,0 @@
import { RdDItem } from "../item.js";
export default class RdDItemMunition extends RdDItem {
static get defaultIcon() {
return 'systems/foundryvtt-reve-de-dragon/icons/objets/fleche.webp'
}
}

View File

@@ -1,7 +0,0 @@
import { RdDItem } from "../item.js";
export default class RdDItemTarot extends RdDItem {
static get defaultIcon() {
return 'systems/foundryvtt-reve-de-dragon/icons/tarots/dos-tarot.webp'
}
}

View File

@@ -4,7 +4,8 @@ import { Misc } from "../misc.js"
export const ACTION_ITEM_ENCHANTER = { export const ACTION_ITEM_ENCHANTER = {
code: 'item-enchanter', label: 'Enchanter', icon: it => 'fa-solid fa-sparkles', code: 'item-enchanter', label: 'Enchanter', icon: it => 'fa-solid fa-sparkles',
filter: it => game.user.isGM || DialogEnchanter.isEnchantable(it) && it.parent?.type != ACTOR_TYPES.commerce, filter: it => game.user.isGM || DialogEnchanter.isEnchantable(it),
optionsFilter: options => options.editable,
action: (item, actor) => DialogEnchanter.enchanter(item) action: (item, actor) => DialogEnchanter.enchanter(item)
} }

View File

@@ -14,11 +14,12 @@ import { RdDItem } from "./item.js";
import { FLEUVE_COORD, TMRUtility } from "./tmr-utility.js"; import { FLEUVE_COORD, TMRUtility } from "./tmr-utility.js";
import { RdDTextEditor } from "./apps/rdd-text-roll-editor.js"; import { RdDTextEditor } from "./apps/rdd-text-roll-editor.js";
import { ItemAction } from "./item/item-actions.js"; import { ItemAction } from "./item/item-actions.js";
import { RdDItemGemme } from "./item/gemme.js";
/** /**
* Extend the basic ItemSheet for RdD specific items * Extend the basic ItemSheet for RdD specific items
*/ */
export class RdDItemSheetV1 extends foundry.appv1.sheets.ItemSheet { export class RdDItemSheet extends ItemSheet {
static get ITEM_TYPE() { static get ITEM_TYPE() {
return undefined return undefined
@@ -31,7 +32,7 @@ export class RdDItemSheetV1 extends foundry.appv1.sheets.ItemSheet {
} }
static register(sheetClass) { static register(sheetClass) {
foundry.documents.collections.Items.registerSheet(SYSTEM_RDD, sheetClass, { Items.registerSheet(SYSTEM_RDD, sheetClass, {
label: Misc.typeName('Item', sheetClass.ITEM_TYPE), label: Misc.typeName('Item', sheetClass.ITEM_TYPE),
types: [sheetClass.ITEM_TYPE], types: [sheetClass.ITEM_TYPE],
makeDefault: true makeDefault: true
@@ -42,7 +43,7 @@ export class RdDItemSheetV1 extends foundry.appv1.sheets.ItemSheet {
static get defaultOptions() { static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, { return foundry.utils.mergeObject(super.defaultOptions, {
classes: [SYSTEM_RDD, "sheet", "item"], classes: [SYSTEM_RDD, "sheet", "item"],
template: RdDItemSheetV1.defaultTemplate(RdDItemSheetV1.ITEM_TYPE), template: RdDItemSheet.defaultTemplate(RdDItemSheet.ITEM_TYPE),
width: 550, width: 550,
height: 550 height: 550
}, { inplace: false }); }, { inplace: false });
@@ -50,7 +51,7 @@ export class RdDItemSheetV1 extends foundry.appv1.sheets.ItemSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
get template() { get template() {
return RdDItemSheetV1.defaultTemplate(this.item.type); return RdDItemSheet.defaultTemplate(this.item.type);
} }
get title() { get title() {
@@ -100,7 +101,7 @@ export class RdDItemSheetV1 extends foundry.appv1.sheets.ItemSheet {
description: await RdDTextEditor.enrichHTML(this.item.system.description, this.item), description: await RdDTextEditor.enrichHTML(this.item.system.description, this.item),
descriptionmj: await RdDTextEditor.enrichHTML(this.item.system.descriptionmj, this.item), descriptionmj: await RdDTextEditor.enrichHTML(this.item.system.descriptionmj, this.item),
isComestible: this.item.getUtilisationCuisine(), isComestible: this.item.getUtilisationCuisine(),
options: RdDSheetUtility.mergeDocumentRights({}, this.item, this.isEditable), options: RdDSheetUtility.mergeDocumentRights(this.options, this.item, this.isEditable),
competences: await SystemCompendiums.getCompetences(ACTOR_TYPES.personnage), competences: await SystemCompendiums.getCompetences(ACTOR_TYPES.personnage),
categories: RdDItem.getCategories(this.item.type), categories: RdDItem.getCategories(this.item.type),
} }
@@ -263,7 +264,7 @@ export class RdDItemSheetV1 extends foundry.appv1.sheets.ItemSheet {
_updateObject(event, formData) { _updateObject(event, formData) {
switch (this.item.type) { switch (this.item.type) {
case ITEM_TYPES.sort: case ITEM_TYPES.sort:
formData['system.bonuscase'] = RdDItemSort.bonuscasesToString(RdDItemSheetV1._listCaseTmr( formData['system.bonuscase'] = RdDItemSort.bonuscasesToString(RdDItemSheet._listCaseTmr(
formData.caseTmrCoord, formData.caseTmrCoord,
formData.caseTmrBonus, formData.caseTmrBonus,
formData.caseTmrAdd formData.caseTmrAdd
@@ -313,7 +314,7 @@ export class RdDItemSheetV1 extends foundry.appv1.sheets.ItemSheet {
async _onDrop(event) { async _onDrop(event) {
// Try to extract the dragData // Try to extract the dragData
let dragData = RdDItemSheetV1.$extractDragData(event); let dragData = RdDItemSheet.$extractDragData(event);
if (!dragData) return false; if (!dragData) return false;
const allowed = Hooks.call("dropActorSheetData", this.actor, this, dragData); const allowed = Hooks.call("dropActorSheetData", this.actor, this, dragData);
if (allowed === false) return false; if (allowed === false) return false;

View File

@@ -78,8 +78,6 @@ export const defaultItemImg = {
souffle: "systems/foundryvtt-reve-de-dragon/icons/souffle_dragon.webp", souffle: "systems/foundryvtt-reve-de-dragon/icons/souffle_dragon.webp",
tarot: "systems/foundryvtt-reve-de-dragon/icons/tarots/dos-tarot.webp", tarot: "systems/foundryvtt-reve-de-dragon/icons/tarots/dos-tarot.webp",
tete: "systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp", tete: "systems/foundryvtt-reve-de-dragon/icons/tete_dragon.webp",
monnaie:"systems/foundryvtt-reve-de-dragon/icons/objets/piece_etain_poisson.webp",
munition: "systems/foundryvtt-reve-de-dragon/icons/objets/fleche.webp"
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@@ -1,4 +1,3 @@
import { ACTOR_TYPES } from "../constants.js"
import { Misc } from "../misc.js" import { Misc } from "../misc.js"
import { RdDSheetUtility } from "../rdd-sheet-utility.js" import { RdDSheetUtility } from "../rdd-sheet-utility.js"
import { RdDUtility } from "../rdd-utility.js" import { RdDUtility } from "../rdd-utility.js"
@@ -15,21 +14,22 @@ const _SPACEHOLDER = { placeholder: true }
const _VENDRE = { const _VENDRE = {
code: 'item-vendre', label: 'Vendre ou donner', icon: it => 'fa-solid fa-comments-dollar', code: 'item-vendre', label: 'Vendre ou donner', icon: it => 'fa-solid fa-comments-dollar',
filter: it => Misc.toInt(it.system.quantite) > 0, filter: it => Misc.toInt(it.system.quantite) > 0,
optionsFilter: options => options.editable,
action: (item, actor) => item.proposerVente() action: (item, actor) => item.proposerVente()
} }
const _ACHETER = { const _ACHAT_SERVICE = {
code: 'item-acheter', label: 'Acheter', icon: it => 'fa-regular fa-coins', code: 'item-service-acheter', label: 'Acheter', icon: it => 'fa-regular fa-coins',
filter: it => Misc.toInt(it.system.quantite) > 0 && it.parent?.type == ACTOR_TYPES.commerce, //filter: it => Misc.toInt(it.system.quantite) > 0,
action: (item, actor) => actor.vente(item) //optionsFilter: options => options.editable,
//action: (item, actor) => item.proposerVente()
} }
const _MONTRER = { const _MONTRER = {
code: 'item-montrer', label: 'Montrer', icon: it => 'fa-solid fa-comment', code: 'item-montrer', label: 'Montrer', icon: it => 'fa-solid fa-comment',
allowLimited: true,
action: (item, actor) => item.postItemToChat() action: (item, actor) => item.postItemToChat()
} }
const _SPLIT = { const _SPLIT = {
code: 'item-split', label: 'Séparer le goupe', icon: it => 'fa-solid fa-unlink', code: 'item-split', label: 'Séparer le goupe', icon: it => 'fa-solid fa-unlink',
filter: it => Misc.toInt(it.system.quantite) > 1 && it.parent?.type != ACTOR_TYPES.commerce, filter: it => Misc.toInt(it.system.quantite) > 1,
action: (item, actor) => RdDSheetUtility.splitItem(item, actor) action: (item, actor) => RdDSheetUtility.splitItem(item, actor)
} }
@@ -39,7 +39,7 @@ const _EDIT = {
} }
const _DELETE = { const _DELETE = {
code: 'item-delete', label: 'Supprimer', icon: it => 'fa-solid fa-trash', code: 'item-delete', label: 'Supprimer', icon: it => 'fa-solid fa-trash',
optionsFilter: options => options.isOwner, optionsFilter: options => options.editable && options.isOwner,
action: (item, actor) => RdDUtility.confirmActorItemDelete(item, actor) action: (item, actor) => RdDUtility.confirmActorItemDelete(item, actor)
} }
const _EQUIPER = { const _EQUIPER = {
@@ -51,25 +51,30 @@ const _EQUIPER = {
const _CUISINER = { const _CUISINER = {
code: 'item-cuisiner', label: 'Cuisiner', icon: it => 'fa-solid fa-utensils', code: 'item-cuisiner', label: 'Cuisiner', icon: it => 'fa-solid fa-utensils',
filter: it => it.getUtilisation() == 'cuisine' && it.system.sust > 0, filter: it => it.getUtilisation() == 'cuisine' && it.system.sust > 0,
optionsFilter: options => options.editable,
action: (item, actor) => actor.preparerNourriture(item) action: (item, actor) => actor.preparerNourriture(item)
} }
const _MANGER_CRU = { const _MANGER_CRU = {
code: 'item-manger-cru', label: 'Manger cru', icon: it => 'fa-solid fa-drumstick-bite', code: 'item-manger-cru', label: 'Manger cru', icon: it => 'fa-solid fa-drumstick-bite',
filter: it => it.getUtilisation() == 'cuisine' && it.system.sust > 0, filter: it => it.getUtilisation() == 'cuisine' && it.system.sust > 0,
optionsFilter: options => options.editable,
action: (item, actor) => actor.mangerNourriture(item) action: (item, actor) => actor.mangerNourriture(item)
} }
const _MANGER = { const _MANGER = {
code: 'item-manger', label: 'Manger', icon: it => 'fa-solid fa-utensils', code: 'item-manger', label: 'Manger', icon: it => 'fa-solid fa-utensils',
filter: it => !(it.system.boisson), filter: it => !(it.system.boisson),
optionsFilter: options => options.editable,
action: (item, actor) => actor.mangerNourriture(item) action: (item, actor) => actor.mangerNourriture(item)
} }
const _BOIRE = { const _BOIRE = {
code: 'item-boire', label: 'Boire', icon: it => 'fa-solid fa-glass-water', code: 'item-boire', label: 'Boire', icon: it => 'fa-solid fa-glass-water',
filter: it => it.system.boisson, filter: it => it.system.boisson,
optionsFilter: options => options.editable,
action: (item, actor) => actor.mangerNourriture(item) action: (item, actor) => actor.mangerNourriture(item)
} }
const _DECOCTION = { const _DECOCTION = {
code: 'item-decoction', label: 'Décoction', icon: it => 'fa-solid fa-flask-vial', code: 'item-decoction', label: 'Décoction', icon: it => 'fa-solid fa-flask-vial',
optionsFilter: options => options.editable,
action: (item, actor) => actor.fabriquerDecoctionHerbe(item) action: (item, actor) => actor.fabriquerDecoctionHerbe(item)
} }
const _OUVRIR = { const _OUVRIR = {
@@ -79,12 +84,14 @@ const _OUVRIR = {
const _LIRE = { const _LIRE = {
code: 'item-lire', label: 'Lire', icon: it => 'fa-solid fa-book-open', code: 'item-lire', label: 'Lire', icon: it => 'fa-solid fa-book-open',
optionsFilter: options => options.editable,
action: (item, actor) => actor.actionLire(item) action: (item, actor) => actor.actionLire(item)
} }
const _REFOULER = { const _REFOULER = {
code: 'item-refouler', label: 'Refouler', icon: it => 'fa-solid fa-burst', code: 'item-refouler', label: 'Refouler', icon: it => 'fa-solid fa-burst',
filter: it => it.system.refoulement > 0, filter: it => it.system.refoulement > 0,
optionsFilter: options => options.editable,
action: (item, actor) => actor.actionRefoulement(item) action: (item, actor) => actor.actionRefoulement(item)
} }
@@ -95,7 +102,7 @@ const _SORT_RESERVE = {
} }
export const COMMON_ACTIONS = [_EQUIPER] export const COMMON_ACTIONS = [_EQUIPER]
export const DEFAULT_ACTIONS = [_ACHETER, _SPACEHOLDER, _SPLIT, _VENDRE, _MONTRER, _EDIT, _DELETE] export const DEFAULT_ACTIONS = [_SPACEHOLDER, _SPLIT, _VENDRE, _MONTRER, _EDIT, _DELETE]
export const ITEM_ACTIONS = { export const ITEM_ACTIONS = {
faune: [_CUISINER, _MANGER_CRU], faune: [_CUISINER, _MANGER_CRU],
@@ -107,16 +114,17 @@ export const ITEM_ACTIONS = {
ombre: [_REFOULER], ombre: [_REFOULER],
plante: [_CUISINER, _MANGER_CRU], plante: [_CUISINER, _MANGER_CRU],
queue: [_REFOULER], queue: [_REFOULER],
sort: [_SORT_RESERVE] sort: [_SORT_RESERVE],
service: [_ACHAT_SERVICE]
} }
export class ItemAction { export class ItemAction {
static applies(action, item, options) { static applies(action, item, options) {
return action && item return action && item
&& item.isActionAllowed(action.code) && item.isActionAllowed(action.code)
&& (!action.filter || action.filter(item)) && (!action.filter || action.filter(item))
&& (action.allowLimited || options.editable)
&& (!action.optionsFilter || action.optionsFilter(options)) && (!action.optionsFilter || action.optionsFilter(options))
} }
@@ -128,10 +136,10 @@ export class ItemAction {
} }
static async onActionItem(event, actor, options) { static async onActionItem(event, actor, options) {
const code = $(event.currentTarget).data('code')
const item = RdDSheetUtility.getItem(event, actor) const item = RdDSheetUtility.getItem(event, actor)
const code = $(event.currentTarget).data('code')
const action = item?.itemActions().find(it => it.code == code) const action = item?.itemActions().find(it => it.code == code)
if (action && ItemAction.applies(action, item, options)) { if (action && (!action.optionsFilter || action.optionsFilter(options))) {
await action.action(item, actor) await action.action(item, actor)
} }
} }

View File

@@ -1,14 +1,14 @@
import { HtmlUtility } from "../html-utility.js"; import { HtmlUtility } from "../html-utility.js";
import { RdDItemSheetV1 } from "../item-sheet.js"; import { RdDItemSheet } from "../item-sheet.js";
import { Misc } from "../misc.js"; import { Misc } from "../misc.js";
import { RdDRaretes } from "./raretes.js"; import { RdDRaretes } from "./raretes.js";
const TYPE_ITEMS_NATURELS = ["faune", "herbe", "plante", "ingredient"]; const TYPE_ITEMS_NATURELS = ["faune", "herbe", "plante", "ingredient"];
export class RdDItemInventaireSheet extends RdDItemSheetV1 { export class RdDItemInventaireSheet extends RdDItemSheet {
static get defaultOptions() { static get defaultOptions() {
return foundry.utils.mergeObject(RdDItemSheetV1.defaultOptions, { return foundry.utils.mergeObject(RdDItemSheet.defaultOptions, {
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "informations" }] tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "informations" }]
}, { inplace: false }) }, { inplace: false })
} }

View File

@@ -1,6 +1,6 @@
import { RdDItemSheetV1 } from "../item-sheet.js"; import { RdDItemSheet } from "../item-sheet.js";
export class RdDBlessureItemSheet extends RdDItemSheetV1 { export class RdDBlessureItemSheet extends RdDItemSheet {
static get ITEM_TYPE() { return "blessure" }; static get ITEM_TYPE() { return "blessure" };

View File

@@ -9,7 +9,7 @@ export class RdDFauneItemSheet extends RdDItemInventaireSheet {
if (!this.options.editable) return; if (!this.options.editable) return;
$(html).find("a.linked-actor-delete").click(async event => await this.onDeleteLinkedActor()); html.find("a.linked-actor-delete").click(async event => await this.onDeleteLinkedActor());
} }
async _onDropActor(event, dragData) { async _onDropActor(event, dragData) {

View File

@@ -1,7 +1,7 @@
import { RdDRencontre } from "./rencontre.js"; import { RdDRencontre } from "./rencontre.js";
import { RdDItemSheetV1 } from "../item-sheet.js"; import { RdDItemSheet } from "../item-sheet.js";
export class RdDRencontreItemSheet extends RdDItemSheetV1 { export class RdDRencontreItemSheet extends RdDItemSheet {
static get ITEM_TYPE() { return "rencontre" }; static get ITEM_TYPE() { return "rencontre" };

View File

@@ -1,6 +1,6 @@
import { RdDItemSheetV1 } from "../item-sheet.js"; import { RdDItemSheet } from "../item-sheet.js";
export class RdDServiceItemSheet extends RdDItemSheetV1 { export class RdDServiceItemSheet extends RdDItemSheet {
static get ITEM_TYPE() { return "service" }; static get ITEM_TYPE() { return "service" };

View File

@@ -1,12 +1,12 @@
import { RdDItemSheetV1 } from "../item-sheet.js"; import { RdDItemSheet } from "../item-sheet.js";
import { RdDItemSigneDraconique } from "./signedraconique.js"; import { RdDItemSigneDraconique } from "./signedraconique.js";
import { TMRUtility } from "../tmr-utility.js"; import { TMRUtility } from "../tmr-utility.js";
/** /**
* Item sheet pour signes draconiques * Item sheet pour signes draconiques
* @extends {RdDItemSheetV1} * @extends {RdDItemSheet}
*/ */
export class RdDSigneDraconiqueItemSheet extends RdDItemSheetV1 { export class RdDSigneDraconiqueItemSheet extends RdDItemSheet {
static get ITEM_TYPE() { return "signedraconique" } static get ITEM_TYPE() { return "signedraconique" }
@@ -36,9 +36,9 @@ export class RdDSigneDraconiqueItemSheet extends RdDItemSheetV1 {
if (!this.options.editable) return; if (!this.options.editable) return;
$(html).find(".signe-aleatoire").click(async event => await this.setSigneAleatoire()); html.find(".signe-aleatoire").click(async event => await this.setSigneAleatoire());
$(html).find("input.select-tmr").change(async event => await this.onSelectTmr(event)); html.find("input.select-tmr").change(async event => await this.onSelectTmr(event));
$(html).find(".signe-xp-sort").change(async event => await this.onValeurXpSort(event.currentTarget.attributes['data-typereussite']?.value, Number(event.currentTarget.value))); html.find(".signe-xp-sort").change(async event => await this.onValeurXpSort(event.currentTarget.attributes['data-typereussite']?.value, Number(event.currentTarget.value)));
} }
async setSigneAleatoire() { async setSigneAleatoire() {

View File

@@ -3,10 +3,10 @@ import { SYSTEM_RDD } from "../constants.js";
import { Misc } from "../misc.js"; import { Misc } from "../misc.js";
export class RdDJournalSheet extends foundry.appv1.sheets.JournalTextPageSheet { export class RdDJournalSheet extends JournalTextPageSheet {
static register() { static register() {
foundry.applications.apps.DocumentSheetConfig.unregisterSheet(JournalEntryPage, "core", foundry.appv1.sheets.JournalTextPageSheet) DocumentSheetConfig.unregisterSheet(JournalEntryPage, "core", JournalTextPageSheet)
foundry.applications.apps.DocumentSheetConfig.registerSheet(JournalEntryPage, DocumentSheetConfig.registerSheet(JournalEntryPage,
SYSTEM_RDD, SYSTEM_RDD,
RdDJournalSheet, { RdDJournalSheet, {
types: ["text"], types: ["text"],

View File

@@ -8,7 +8,6 @@ import { RdDTimestamp } from "./time/rdd-timestamp.js";
import { RdDRaretes } from "./item/raretes.js"; import { RdDRaretes } from "./item/raretes.js";
import { VOIES_DRACONIC } from "./item-sort.js"; import { VOIES_DRACONIC } from "./item-sort.js";
import { SystemCompendiums } from "./settings/system-compendiums.js"; import { SystemCompendiums } from "./settings/system-compendiums.js";
import { Misc } from "./misc.js";
class Migration { class Migration {
get code() { return "sample"; } get code() { return "sample"; }
@@ -632,37 +631,13 @@ class _12_0_38_TachesEcriture extends Migration {
async migrate() { async migrate() {
await this.applyItemsUpdates(items => items await this.applyItemsUpdates(items => items
.filter(it => [ITEM_TYPES.tache, ITEM_TYPES.livre, ITEM_TYPES.oeuvre, ITEM_TYPES.meditation].includes(it.type)) .filter(it => [ITEM_TYPES.tache, ITEM_TYPES.livre, ITEM_TYPES.oeuvre, ITEM_TYPES.meditation].includes(it.type) )
.filter(it => Grammar.equalsInsensitive(it.system.competence, 'ecriture')) .filter(it => it.system.competence == 'Ecriture')
.map(it => { return { _id: it.id, 'system.competence': 'Écriture' } }) .map(it => { return { _id: it.id, 'system.competence': 'Écriture' } })
) )
} }
} }
class _13_0_4_FixReveActuel extends Migration {
get code() { return "fix-reve-actuel" }
get version() { return "13.0.4" }
async migrate() {
game.actors.forEach(it => it.update({ 'system.carac.-=reve-actuel': null }))
}
}
class _13_0_7_FixNiveauOeuvres extends Migration {
get code() { return "fix-niveau-oeuvres" }
get version() { return "13.0.7" }
async migrate() {
await this.applyItemsUpdates(items => items
.filter(it => [ITEM_TYPES.musique, ITEM_TYPES.chant, ITEM_TYPES.danse, ITEM_TYPES.recettecuisine].includes(it.type))
.map(it => {
const niveau = isNaN(it.system.niveau) ? 0 : parseInt(it.system.niveau)
return { _id: it.id, 'system.niveau': niveau }
})
)
}
}
export class Migrations { export class Migrations {
static getMigrations() { static getMigrations() {
return [ return [
@@ -685,9 +660,7 @@ export class Migrations {
new _12_0_26_MigrationVoieSorts(), new _12_0_26_MigrationVoieSorts(),
new _12_0_32_MigrationRaces(), new _12_0_32_MigrationRaces(),
new _12_0_37_MigrationAlchimieEtat(), new _12_0_37_MigrationAlchimieEtat(),
new _12_0_38_TachesEcriture(), new _12_0_38_TachesEcriture()
new _13_0_4_FixReveActuel(),
new _13_0_7_FixNiveauOeuvres(),
]; ];
} }

View File

@@ -265,7 +265,7 @@ export class Misc {
const subset = elements.filter(options.preFilter) const subset = elements.filter(options.preFilter)
.filter(it => Grammar.toLowerCaseNoAccent(options.mapper(it))?.includes(value)) .filter(it => Grammar.toLowerCaseNoAccent(options.mapper(it))?.includes(value))
.sort(Misc.ascending(it => options.mapper(it))) .sort(Misc.ascending(it => options.mapper(it)))
if (subset.length == 0) { if (subset.length == 0 && options?.onMessage) {
options.onMessage(`Pas de ${options.description} correspondant à ${value}`); options.onMessage(`Pas de ${options.description} correspondant à ${value}`);
} }
return subset; return subset;

View File

@@ -1,3 +0,0 @@
export { default as RdDModelMonnaie } from "./monnaie.mjs"
export { default as RdDModelMunition } from "./munition.mjs"
export { default as RdDModelTarot } from "./tarot.mjs"

View File

@@ -1,10 +0,0 @@
import { TEMPLATE_DESCRIPTION, TEMPLATE_INVENTAIRE } from "../common/_module.mjs";
export default class RdDModelMonnaie extends foundry.abstract.TypeDataModel {
static defineSchema() {
return Object.assign({},
TEMPLATE_DESCRIPTION.fields(),
TEMPLATE_INVENTAIRE.fields()
)
}
}

View File

@@ -1,10 +0,0 @@
import { TEMPLATE_DESCRIPTION, TEMPLATE_INVENTAIRE } from "../common/_module.mjs";
export default class RdDModelMunition extends foundry.abstract.TypeDataModel {
static defineSchema() {
return Object.assign({},
TEMPLATE_DESCRIPTION.fields(),
TEMPLATE_INVENTAIRE.fields()
)
}
}

View File

@@ -1,18 +0,0 @@
import { TEMPLATE_DESCRIPTION } from "../common/_module.mjs";
import { DECIMAL, INTEGER, INTEGER_SIGNED, MODEL_ARRAY, STRING } from "../common/field-types.mjs"
const fields = foundry.data.fields
export default class RdDModelTarot extends foundry.abstract.TypeDataModel {
static defineSchema() {
let tarotFields = {
concept : new fields.StringField({ label: "Concept", initial: "", ...STRING }),
aspect : new fields.StringField({ label: "Aspect", initial: "", ...STRING }),
frequence : new fields.NumberField({ label: "Fréquence", initial: 1, ...INTEGER })
}
return Object.assign({},
TEMPLATE_DESCRIPTION.fields(),
tarotFields
)
}
}

View File

@@ -17,23 +17,23 @@ import { RdDRollResult } from "./rdd-roll-result.js";
/* -------------------------------------------- */ /* -------------------------------------------- */
const premierRoundInit = [ const premierRoundInit = [
{ pattern: 'hast' }, { pattern: 'hast', init: 5.90 },
{ pattern: 'lance' }, { pattern: 'lance', init: 5.85 },
{ pattern: 'baton' }, { pattern: 'baton', init: 5.80 },
{ pattern: 'doubledragonne' }, { pattern: 'doubledragonne', init: 5.75 },
{ pattern: 'esparlongue' }, { pattern: 'esparlongue', init: 5.70 },
{ pattern: 'epeedragonne' }, { pattern: 'epeedragonne', init: 5.65 },
{ pattern: 'epeebatarde' }, { pattern: 'epeebatarde', init: 5.60 },
{ pattern: 'epeecyane' }, { pattern: 'epeecyane', init: 5.55 },
{ pattern: 'epeesorde' }, { pattern: 'epeesorde', init: 5.50 },
{ pattern: 'grandehache' }, { pattern: 'grandehache', init: 5.45 },
{ pattern: 'bataille' }, { pattern: 'bataille', init: 5.40 },
{ pattern: 'epeegnome' }, { pattern: 'epeegnome', init: 5.35 },
{ pattern: 'masse' }, { pattern: 'masse', init: 5.30 },
{ pattern: 'gourdin' }, { pattern: 'gourdin', init: 5.25 },
{ pattern: 'fleau' }, { pattern: 'fleau', init: 5.20 },
{ pattern: 'dague' }, { pattern: 'dague', init: 5.15 },
{ pattern: 'autre' }, { pattern: 'autre', init: 5.10 },
]; ];
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -45,10 +45,6 @@ export class RdDCombatManager extends Combat {
Hooks.on("updateCombat", (combat, change, options, userId) => { RdDCombat.onUpdateCombat(combat, change, options, userId) }); Hooks.on("updateCombat", (combat, change, options, userId) => { RdDCombat.onUpdateCombat(combat, change, options, userId) });
Hooks.on("preDeleteCombat", (combat, html, id) => { combat.onPreDeleteCombat() }) Hooks.on("preDeleteCombat", (combat, html, id) => { combat.onPreDeleteCombat() })
Hooks.on("deleteCombat", (combat, html, id) => { combat.onDeleteCombat() }) Hooks.on("deleteCombat", (combat, html, id) => { combat.onDeleteCombat() })
for (let i = 0.0; i < premierRoundInit.length; i++) {
premierRoundInit[i].init = 5.99 - i / 100
}
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -112,7 +108,9 @@ export class RdDCombatManager extends Combat {
async rollInitiative(ids, messageOptions = {}) { async rollInitiative(ids, messageOptions = {}) {
console.log(`${game.system.title} | Combat.rollInitiative()`, ids, messageOptions) console.log(`${game.system.title} | Combat.rollInitiative()`, ids, messageOptions)
ids = typeof ids === "string" ? [ids] : ids ids = typeof ids === "string" ? [ids] : ids
Promise.all(ids.map(id => this.rollInitRdD(id, undefined, messageOptions))) ids.forEach(async id =>
await this.rollInitRdD(id, undefined, messageOptions)
)
return this return this
} }
@@ -253,13 +251,11 @@ export class RdDCombatManager extends Combat {
let initMissing = game.combat.combatants.find(it => !it.initiative); let initMissing = game.combat.combatants.find(it => !it.initiative);
if (!initMissing) { // Premier round ! if (!initMissing) { // Premier round !
for (let combatant of game.combat.combatants) { for (let combatant of game.combat.combatants) {
if (combatant.initiativeData?.arme?.type == "arme") { let action = combatant.initiativeData?.arme;
// TODO: get init data premier round //console.log("Parsed !!!", combatant, initDone, game.combat.current, arme);
const initiativeData = combatant.initiativeData; if (action && action.type == "arme") {
const action = combatant.initiativeData.arme; for (let initData of premierRoundInit) {
const fromArme = Grammar.toLowerCaseNoAccentNoSpace(action.system.initpremierround) if (Grammar.toLowerCaseNoAccentNoSpace(action.system.initpremierround).includes(initData.pattern)) {
const initData = premierRoundInit.find(it => fromArme.includes(initData.pattern))
if (initData) {
let msg = `<h4>L'initiative de ${combatant.actor.getAlias()} a été modifiée !</h4> let msg = `<h4>L'initiative de ${combatant.actor.getAlias()} a été modifiée !</h4>
<hr> <hr>
<div> <div>
@@ -273,6 +269,7 @@ export class RdDCombatManager extends Combat {
} }
} }
} }
}
/* -------------------------------------------- */ /* -------------------------------------------- */
static incDecInit(combatantId, incDecValue) { static incDecInit(combatantId, incDecValue) {
@@ -300,7 +297,7 @@ export class RdDCombatManager extends Combat {
].concat(options); ].concat(options);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static async rollInitiativeAction(combatantId, action) { static rollInitiativeAction(combatantId, action) {
const combatant = game.combat.combatants.get(combatantId) const combatant = game.combat.combatants.get(combatantId)
const actor = RdDCombatManager.getActorCombatant(combatant) const actor = RdDCombatManager.getActorCombatant(combatant)
if (actor == undefined) { return [] } if (actor == undefined) { return [] }
@@ -311,8 +308,7 @@ export class RdDCombatManager extends Combat {
const ajustement = RdDCombatManager.calculAjustementInit(actor, action) const ajustement = RdDCombatManager.calculAjustementInit(actor, action)
const rollFormula = RdDCombatManager.formuleInitiative(init.offset, init.carac, init.niveau, ajustement); const rollFormula = RdDCombatManager.formuleInitiative(init.offset, init.carac, init.niveau, ajustement);
await game.combat.rollInitRdD(combatantId, rollFormula, init); game.combat.rollInitRdD(combatantId, rollFormula, init);
combatant.initiativeData
} }
static getInitData(actor, action) { static getInitData(actor, action) {
@@ -487,7 +483,7 @@ export class RdDCombat {
'.appel-destinee-attaque', '.appel-destinee-attaque',
'.echec-total-attaque', '.echec-total-attaque',
]) { ]) {
$(html).on("click", button, event => { html.on("click", button, event => {
const rddCombat = RdDCombat.rddCombatForAttackerAndDefender( const rddCombat = RdDCombat.rddCombatForAttackerAndDefender(
event.currentTarget.attributes['data-attackerId']?.value, event.currentTarget.attributes['data-attackerId']?.value,
event.currentTarget.attributes['data-attackerTokenId']?.value, event.currentTarget.attributes['data-attackerTokenId']?.value,
@@ -498,7 +494,7 @@ export class RdDCombat {
} }
}); });
} }
$(html).on("click", 'a.chat-jet-vie', event => { html.on("click", 'a.chat-jet-vie', event => {
event.preventDefault(); event.preventDefault();
RdDCombat._callJetDeVie(event); RdDCombat._callJetDeVie(event);
}); });

View File

@@ -9,7 +9,7 @@ export class RdDCompendiumOrganiser {
console.log('onRenderCompendium', compendium, html, compendiumData); console.log('onRenderCompendium', compendium, html, compendiumData);
const pack = compendium.collection const pack = compendium.collection
if (pack.metadata.system === SYSTEM_RDD) { if (pack.metadata.system === SYSTEM_RDD) {
$(html).find('.directory-item').each((i, element) => { html.find('.directory-item').each((i, element) => {
RdDCompendiumOrganiser.setEntityTypeName(pack, element); RdDCompendiumOrganiser.setEntityTypeName(pack, element);
}); });
} }

View File

@@ -12,7 +12,7 @@ const imgHeures = [1, 2, 3, 4, 5, 6, 7, 9, 9, 10, 11, 12].map(heure => {
const imgSigneDragon = imgHeures[4] const imgSigneDragon = imgHeures[4]
/** De pour les jets de rencontre */ /** De pour les jets de rencontre */
export class DeTMR extends foundry.dice.terms.Die { export class DeTMR extends Die {
/** @override */ /** @override */
static DENOMINATION = "t"; static DENOMINATION = "t";
@@ -50,7 +50,7 @@ export class DeTMR extends foundry.dice.terms.Die {
} }
/** DeDraconique pour le D8 sans limite avec 8=>0 */ /** DeDraconique pour le D8 sans limite avec 8=>0 */
export class DeDraconique extends foundry.dice.terms.Die { export class DeDraconique extends Die {
/** @override */ /** @override */
static DENOMINATION = "r"; static DENOMINATION = "r";
@@ -89,7 +89,7 @@ export class DeDraconique extends foundry.dice.terms.Die {
} }
/** De 12 avec les heures */ /** De 12 avec les heures */
export class DeHeure extends foundry.dice.terms.Die { export class DeHeure extends Die {
/** @override */ /** @override */
static DENOMINATION = "h"; static DENOMINATION = "h";

View File

@@ -15,36 +15,36 @@ export class RdDEmpoignade {
/* -------------------------------------------- */ /* -------------------------------------------- */
static registerChatCallbacks(html) { static registerChatCallbacks(html) {
$(html).on("click", '.defense-empoignade-cac', event => { html.on("click", '.defense-empoignade-cac', event => {
const chatMessage = ChatUtility.getChatMessage(event); const chatMessage = ChatUtility.getChatMessage(event);
const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage); const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage);
let defenseMode = event.currentTarget.attributes['data-defense-mode'].value let defenseMode = event.currentTarget.attributes['data-defense-mode'].value
RdDEmpoignade.onDefenseEmpoignade(rollData, defenseMode, "Corps à corps", "melee") RdDEmpoignade.onDefenseEmpoignade(rollData, defenseMode, "Corps à corps", "melee")
}); });
$(html).on("click", '.defense-empoignade-esquive', event => { html.on("click", '.defense-empoignade-esquive', event => {
const chatMessage = ChatUtility.getChatMessage(event); const chatMessage = ChatUtility.getChatMessage(event);
const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage); const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage);
let defenseMode = event.currentTarget.attributes['data-defense-mode'].value let defenseMode = event.currentTarget.attributes['data-defense-mode'].value
RdDEmpoignade.onDefenseEmpoignade(rollData, defenseMode, "Esquive", "derobee") RdDEmpoignade.onDefenseEmpoignade(rollData, defenseMode, "Esquive", "derobee")
}); });
$(html).on("click", '.empoignade-poursuivre', event => { html.on("click", '.empoignade-poursuivre', event => {
let attackerId = event.currentTarget.attributes['data-attackerId'].value let attackerId = event.currentTarget.attributes['data-attackerId'].value
let defenderId = event.currentTarget.attributes['data-defenderId'].value let defenderId = event.currentTarget.attributes['data-defenderId'].value
RdDEmpoignade.onAttaqueEmpoignadeValidee(game.actors.get(attackerId), game.actors.get(defenderId)) RdDEmpoignade.onAttaqueEmpoignadeValidee(game.actors.get(attackerId), game.actors.get(defenderId))
}); });
$(html).on("click", '.empoignade-entrainer-sol', event => { html.on("click", '.empoignade-entrainer-sol', event => {
const chatMessage = ChatUtility.getChatMessage(event); const chatMessage = ChatUtility.getChatMessage(event);
const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage); const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage);
RdDEmpoignade.entrainerAuSol(rollData) RdDEmpoignade.entrainerAuSol(rollData)
ChatUtility.removeChatMessageId(chatMessage.id) ChatUtility.removeChatMessageId(chatMessage.id)
}); });
$(html).on("click", '.empoignade-projeter-sol', event => { html.on("click", '.empoignade-projeter-sol', event => {
const chatMessage = ChatUtility.getChatMessage(event); const chatMessage = ChatUtility.getChatMessage(event);
const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage); const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage);
RdDEmpoignade.projeterAuSol(rollData) RdDEmpoignade.projeterAuSol(rollData)
ChatUtility.removeChatMessageId(chatMessage.id) ChatUtility.removeChatMessageId(chatMessage.id)
}); });
$(html).on("change", '.empoignade-perte-endurance', event => { html.on("change", '.empoignade-perte-endurance', event => {
const chatMessage = ChatUtility.getChatMessage(event); const chatMessage = ChatUtility.getChatMessage(event);
const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage); const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage);
if (event.currentTarget.value && event.currentTarget.value != "none") { if (event.currentTarget.value && event.currentTarget.value != "none") {

View File

@@ -54,7 +54,7 @@ import { RdDItemSouffle } from "./item/souffle.js"
import { RdDRencontre } from "./item/rencontre.js" import { RdDRencontre } from "./item/rencontre.js"
import { RdDItemSheetV1 } from "./item-sheet.js" import { RdDItemSheet } from "./item-sheet.js"
import { RdDBlessureItemSheet } from "./item/sheet-blessure.js" import { RdDBlessureItemSheet } from "./item/sheet-blessure.js"
import { RdDServiceItemSheet } from "./item/sheet-service.js" import { RdDServiceItemSheet } from "./item/sheet-service.js"
import { RdDRencontreItemSheet } from "./item/sheet-rencontre.js" import { RdDRencontreItemSheet } from "./item/sheet-rencontre.js"
@@ -80,10 +80,6 @@ import { RdDItemPotion } from "./item/potion.js"
import { RdDItemGemme } from "./item/gemme.js" import { RdDItemGemme } from "./item/gemme.js"
import { RdDGemmeItemSheet } from "./item/sheet-gemme.js" import { RdDGemmeItemSheet } from "./item/sheet-gemme.js"
import * as models from "./models/_module.mjs"
import * as items from "./documents/_module.mjs"
import * as sheets from "./applications/sheets/_module.mjs"
/** /**
* RdD system * RdD system
* Author: LeRatierBretonnien * Author: LeRatierBretonnien
@@ -104,9 +100,6 @@ export class SystemReveDeDragon {
this.RdDHotbar = RdDHotbar this.RdDHotbar = RdDHotbar
this.RdDStatBlockParser = RdDStatBlockParser this.RdDStatBlockParser = RdDStatBlockParser
this.itemClasses = { this.itemClasses = {
monnaie: items.RdDItemMonnaie,
munition: items.RdDItemMunition,
tarot: items.RdDModelTarot,
armure: RdDItemArmure, armure: RdDItemArmure,
blessure: RdDItemBlessure, blessure: RdDItemBlessure,
gemme: RdDItemGemme, gemme: RdDItemGemme,
@@ -136,9 +129,6 @@ export class SystemReveDeDragon {
/* -------------------------------------------- */ /* -------------------------------------------- */
onInit() { onInit() {
game.system.rdd = this game.system.rdd = this
globalThis.RdD = game.system
this.AppAstrologie = AppAstrologie this.AppAstrologie = AppAstrologie
console.log(`Initializing Reve de Dragon System Settings`) console.log(`Initializing Reve de Dragon System Settings`)
@@ -185,11 +175,6 @@ export class SystemReveDeDragon {
console.log(`Initializing Reve de Dragon Documents`) console.log(`Initializing Reve de Dragon Documents`)
CONFIG.Actor.documentClass = RdDBaseActor CONFIG.Actor.documentClass = RdDBaseActor
CONFIG.Item.documentClass = RdDItem CONFIG.Item.documentClass = RdDItem
CONFIG.Item.dataModels = {
monnaie: models.RdDModelMonnaie,
munition: models.RdDModelMunition,
tarot: models.RdDModelTarot,
}
CONFIG.RDD = { CONFIG.RDD = {
resolutionTable: RdDResolutionTable.resolutionTable, resolutionTable: RdDResolutionTable.resolutionTable,
carac_array: RdDUtility.getCaracArray(), carac_array: RdDUtility.getCaracArray(),
@@ -199,51 +184,45 @@ export class SystemReveDeDragon {
/* -------------------------------------------- */ /* -------------------------------------------- */
// Register sheet application classes // Register sheet application classes
foundry.documents.collections.Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet) Actors.unregisterSheet("core", ActorSheet)
foundry.documents.collections.Actors.registerSheet(SYSTEM_RDD, RdDCommerceSheet, { types: ["commerce"], makeDefault: true }) Actors.registerSheet(SYSTEM_RDD, RdDCommerceSheet, { types: ["commerce"], makeDefault: true })
foundry.documents.collections.Actors.registerSheet(SYSTEM_RDD, RdDActorSheet, { types: ["personnage"], makeDefault: true }) Actors.registerSheet(SYSTEM_RDD, RdDActorSheet, { types: ["personnage"], makeDefault: true })
foundry.documents.collections.Actors.registerSheet(SYSTEM_RDD, RdDCreatureSheet, { types: ["creature"], makeDefault: true }) Actors.registerSheet(SYSTEM_RDD, RdDCreatureSheet, { types: ["creature"], makeDefault: true })
foundry.documents.collections.Actors.registerSheet(SYSTEM_RDD, RdDActorVehiculeSheet, { types: ["vehicule"], makeDefault: true }) Actors.registerSheet(SYSTEM_RDD, RdDActorVehiculeSheet, { types: ["vehicule"], makeDefault: true })
foundry.documents.collections.Actors.registerSheet(SYSTEM_RDD, RdDActorEntiteSheet, { types: ["entite"], makeDefault: true }) Actors.registerSheet(SYSTEM_RDD, RdDActorEntiteSheet, { types: ["entite"], makeDefault: true })
foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet) Items.unregisterSheet("core", ItemSheet)
RdDActorExportSheet.init() RdDActorExportSheet.init()
foundry.documents.collections.Items.registerSheet(SYSTEM_RDD, RdDItemInventaireSheet, { Items.registerSheet(SYSTEM_RDD, RdDItemInventaireSheet, {
types: [ types: [
"objet", "arme", "armure", "livre", "nourritureboisson", "objet", "arme", "armure", "livre", "munition",
"monnaie", "nourritureboisson",
], ],
makeDefault: true makeDefault: true
}) })
Items.registerSheet(SYSTEM_RDD, RdDItemSheet, {
sheets.RdDItemBaseSheet.registerAll(
sheets.RdDMonnaieSheet,
sheets.RdDMunitionSheet,
sheets.RdDTarotSheet
)
foundry.documents.collections.Items.registerSheet(SYSTEM_RDD, RdDItemSheetV1, {
types: [ types: [
"competence", "competencecreature", "competence", "competencecreature",
"recettealchimique", "musique", "chant", "danse", "jeu", "race", "recettealchimique", "musique", "chant", "danse", "jeu", "race",
"recettecuisine", "oeuvre", "meditation", "recettecuisine", "oeuvre", "meditation",
"queue", "ombre", "souffle", "tete", "casetmr", "sort", "sortreserve", "queue", "ombre", "souffle", "tete", "casetmr", "sort", "sortreserve",
"nombreastral", "tache", "maladie", "poison", "possession", "nombreastral", "tache", "maladie", "poison", "possession",
"extraitpoetique", "empoignade" "tarot", "extraitpoetique", "empoignade"
], ],
makeDefault: true makeDefault: true
}) })
RdDItemSheetV1.register(RdDBlessureItemSheet) RdDItemSheet.register(RdDBlessureItemSheet)
RdDItemSheetV1.register(RdDConteneurItemSheet) RdDItemSheet.register(RdDConteneurItemSheet)
RdDItemSheetV1.register(RdDFauneItemSheet) RdDItemSheet.register(RdDFauneItemSheet)
RdDItemSheetV1.register(RdDGemmeItemSheet) RdDItemSheet.register(RdDGemmeItemSheet)
RdDItemSheetV1.register(RdDHerbeItemSheet) RdDItemSheet.register(RdDHerbeItemSheet)
RdDItemSheetV1.register(RdDIngredientItemSheet) RdDItemSheet.register(RdDIngredientItemSheet)
RdDItemSheetV1.register(RdDPlanteItemSheet) RdDItemSheet.register(RdDPlanteItemSheet)
RdDItemSheetV1.register(RdDPotionItemSheet) RdDItemSheet.register(RdDPotionItemSheet)
RdDItemSheetV1.register(RdDRencontreItemSheet) RdDItemSheet.register(RdDRencontreItemSheet)
RdDItemSheetV1.register(RdDServiceItemSheet) RdDItemSheet.register(RdDServiceItemSheet)
RdDItemSheetV1.register(RdDSigneDraconiqueItemSheet) RdDItemSheet.register(RdDSigneDraconiqueItemSheet)
RdDJournalSheet.register() RdDJournalSheet.register()
// préparation des différents modules // préparation des différents modules

View File

@@ -268,7 +268,7 @@ export class RdDResolutionTable {
maxCarac = Math.min(maxCarac, minCarac + 20); maxCarac = Math.min(maxCarac, minCarac + 20);
minLevel = Math.max(minLevel, -10); minLevel = Math.max(minLevel, -10);
maxLevel = Math.max(Math.min(maxLevel, 30), minLevel + colonnes); maxLevel = Math.max(Math.min(maxLevel, 30), minLevel + colonnes);
return await foundry.applications.handlebars.renderTemplate('systems/foundryvtt-reve-de-dragon/templates/resolution-table.hbs', { return await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/resolution-table.hbs', {
carac: carac, carac: carac,
difficulte: level, difficulte: level,
min: minLevel, min: minLevel,

View File

@@ -12,6 +12,6 @@ export class RdDRollResult {
static async buildRollDataHtml(rollData, template = 'chat-resultat-general.hbs') { static async buildRollDataHtml(rollData, template = 'chat-resultat-general.hbs') {
rollData.show = rollData.show || {}; rollData.show = rollData.show || {};
return await foundry.applications.handlebars.renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/${template}`, rollData); return await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/${template}`, rollData);
} }
} }

View File

@@ -22,7 +22,7 @@ export class RdDRoll extends Dialog {
RdDRoll._ensureCorrectAction(action); RdDRoll._ensureCorrectAction(action);
RdDRoll._setDefaultOptions(actor, rollData); RdDRoll._setDefaultOptions(actor, rollData);
const html = await foundry.applications.handlebars.renderTemplate(dialogConfig.html, rollData); const html = await renderTemplate(dialogConfig.html, rollData);
let options = { classes: ["rdd-roll-dialog"], width: 650, height: 'fit-content', 'z-index': 99999, close: html => { } }; let options = { classes: ["rdd-roll-dialog"], width: 650, height: 'fit-content', 'z-index': 99999, close: html => { } };
if (dialogConfig.close) { if (dialogConfig.close) {
@@ -40,7 +40,7 @@ export class RdDRoll extends Dialog {
etat: actor.getEtatGeneral(), etat: actor.getEtatGeneral(),
moral: actor.getMoralTotal(), /* La valeur du moral pour les jets de volonté */ moral: actor.getMoralTotal(), /* La valeur du moral pour les jets de volonté */
amoureux: actor.listeSuivants(it => it.coeur > 0), amoureux: actor.listeSuivants(it => it.coeur > 0),
carac: foundry.utils.duplicate(actor.system.carac), carac: actor.system.carac,
finalLevel: 0, finalLevel: 0,
diffConditions: 0, diffConditions: 0,
diffLibre: rollData.competence?.system.default_diffLibre ?? 0, diffLibre: rollData.competence?.system.default_diffLibre ?? 0,
@@ -344,7 +344,7 @@ export class RdDRoll extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
async buildAjustements(rollData) { async buildAjustements(rollData) {
return await foundry.applications.handlebars.renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/partial-roll-ajustements.hbs`, rollData); return await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/partial-roll-ajustements.hbs`, rollData);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@@ -3,11 +3,11 @@ import { RdDItem } from "./item.js";
export class RdDSheetUtility { export class RdDSheetUtility {
static getOptions(document, editable) { static mergeDocumentRights(options, document, editable) {
const userRightLevel = game.user.isGM const userRightLevel = game.user.isGM
? CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER ? CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER
: document.getUserLevel(game.user); : document.getUserLevel(game.user);
return { let newOptions = {
isGM: game.user.isGM, isGM: game.user.isGM,
isOwned: document.parent ? true : false, isOwned: document.parent ? true : false,
editable: editable, editable: editable,
@@ -16,15 +16,10 @@ export class RdDSheetUtility {
isObserver: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER, isObserver: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER,
isOwner: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER isOwner: userRightLevel >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER
} }
}
static mergeDocumentRights(options, document, editable) {
const newOptions = RdDSheetUtility.getOptions(document, editable);
foundry.utils.mergeObject(options, newOptions); foundry.utils.mergeObject(options, newOptions);
return options; return options;
} }
static getItem(event, actor) { static getItem(event, actor) {
return actor.items.get(RdDSheetUtility.getItemId(event)) return actor.items.get(RdDSheetUtility.getItemId(event))
} }

View File

@@ -1,7 +1,7 @@
import { SHOW_DICE, SYSTEM_RDD } from "./constants.js"; import { SHOW_DICE, SYSTEM_RDD } from "./constants.js";
import { RollDataAjustements } from "./rolldata-ajustements.js"; import { RollDataAjustements } from "./rolldata-ajustements.js";
import { RdDUtility } from "./rdd-utility.js"; import { RdDUtility } from "./rdd-utility.js";
import { COORD_TMR_INCONNU, TMRUtility } from "./tmr-utility.js"; import { TMRUtility } from "./tmr-utility.js";
import { RdDResolutionTable } from "./rdd-resolution-table.js"; import { RdDResolutionTable } from "./rdd-resolution-table.js";
import { RdDTMRRencontreDialog } from "./rdd-tmr-rencontre-dialog.js"; import { RdDTMRRencontreDialog } from "./rdd-tmr-rencontre-dialog.js";
import { ChatUtility } from "./chat-utility.js"; import { ChatUtility } from "./chat-utility.js";
@@ -47,7 +47,7 @@ export class RdDTMRDialog extends Dialog {
static async create(actor, tmrData) { static async create(actor, tmrData) {
await PixiTMR.init() await PixiTMR.init()
let html = await foundry.applications.handlebars.renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-tmr.hbs', tmrData); let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-tmr.hbs', tmrData);
if (tmrData.mode != 'visu' && !game.user.isGM) { if (tmrData.mode != 'visu' && !game.user.isGM) {
ChatMessage.create({ content: actor.name + " est monté dans les TMR en mode : " + tmrData.mode, whisper: ChatUtility.getGMs() }); ChatMessage.create({ content: actor.name + " est monté dans les TMR en mode : " + tmrData.mode, whisper: ChatUtility.getGMs() });
} }
@@ -508,7 +508,7 @@ export class RdDTMRDialog extends Dialog {
ChatMessage.create({ ChatMessage.create({
whisper: ChatUtility.getOwners(this.actor), whisper: ChatUtility.getOwners(this.actor),
content: await foundry.applications.handlebars.renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-rencontre-tmr.hbs`, rencData) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-rencontre-tmr.hbs`, rencData)
}); });
this.$updateValuesDisplay(); this.$updateValuesDisplay();
@@ -996,10 +996,6 @@ export class RdDTMRDialog extends Dialog {
const targetOddq = this.pixiTMR.computeEventOddq(event) const targetOddq = this.pixiTMR.computeEventOddq(event)
const targetCoord = TMRUtility.oddqToCoordTMR(targetOddq) const targetCoord = TMRUtility.oddqToCoordTMR(targetOddq)
if (targetCoord == COORD_TMR_INCONNU){
ui.notifications.error("Vous ne pouvez pas vous déplacer ici");
return
}
// Validation de la case de destination (gestion du cas des rencontres qui peuvent téléporter) // Validation de la case de destination (gestion du cas des rencontres qui peuvent téléporter)
const typeDeplacement = this._calculDeplacement(targetCoord, currentCoord, currentOddq, targetOddq); const typeDeplacement = this._calculDeplacement(targetCoord, currentCoord, currentOddq, targetOddq);

View File

@@ -1,5 +1,6 @@
/* -------------------------------------------- */ /* -------------------------------------------- */
import { HtmlUtility } from "./html-utility.js"; import { HtmlUtility } from "./html-utility.js";
import { Misc } from "./misc.js";
import { RdDCombatManager } from "./rdd-combat.js"; import { RdDCombatManager } from "./rdd-combat.js";
import { Targets } from "./targets.js"; import { Targets } from "./targets.js";
@@ -13,8 +14,8 @@ export class RdDTokenHud {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async removeExtensionHud(app, html, tokenId) { static async removeExtensionHud(app, html, tokenId) {
$(html).find('.control-icon.rdd-combat').remove(); html.find('.control-icon.rdd-combat').remove();
$(html).find('.control-icon.rdd-initiative').remove(); html.find('.control-icon.rdd-initiative').remove();
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -49,7 +50,7 @@ export class RdDTokenHud {
{ name: 'Initiative +1', command: 'inc', value: 0.01 }, { name: 'Initiative +1', command: 'inc', value: 0.01 },
{ name: 'Initiative -1', command: 'dec', value: -0.01 }] { name: 'Initiative -1', command: 'dec', value: -0.01 }]
}; };
const controlIconCombat = $(html).find('.control-icon[data-action=combat]'); const controlIconCombat = html.find('.control-icon[data-action=combat]');
await RdDTokenHud._configureSubMenu(controlIconCombat, await RdDTokenHud._configureSubMenu(controlIconCombat,
'systems/foundryvtt-reve-de-dragon/templates/hud-actor-init.hbs', 'systems/foundryvtt-reve-de-dragon/templates/hud-actor-init.hbs',
hudData, hudData,
@@ -68,7 +69,7 @@ export class RdDTokenHud {
static async addExtensionHudCombat(html, combatant, token, actions) { static async addExtensionHudCombat(html, combatant, token, actions) {
const hudData = { combatant, token, actions, commandes: [] }; const hudData = { combatant, token, actions, commandes: [] };
const controlIconTarget = $(html).find('.control-icon[data-action=target]'); const controlIconTarget = html.find('.control-icon[data-action=target]');
await RdDTokenHud._configureSubMenu(controlIconTarget, 'systems/foundryvtt-reve-de-dragon/templates/hud-actor-attaque.hbs', hudData, await RdDTokenHud._configureSubMenu(controlIconTarget, 'systems/foundryvtt-reve-de-dragon/templates/hud-actor-attaque.hbs', hudData,
(event) => { (event) => {
const actionIndex = event.currentTarget.attributes['data-action-index']?.value; const actionIndex = event.currentTarget.attributes['data-action-index']?.value;
@@ -88,7 +89,7 @@ export class RdDTokenHud {
if (target?.actor) { if (target?.actor) {
const hudSoins = { blessures: target.actor.blessuresASoigner() ?? [] }; const hudSoins = { blessures: target.actor.blessuresASoigner() ?? [] };
if (hudSoins.blessures.length > 0) { if (hudSoins.blessures.length > 0) {
const controlIconTarget = $(html).find('.control-icon[data-action=combat]'); const controlIconTarget = html.find('.control-icon[data-action=combat]');
await RdDTokenHud._configureSubMenu(controlIconTarget, await RdDTokenHud._configureSubMenu(controlIconTarget,
'systems/foundryvtt-reve-de-dragon/templates/hud-actor-soins.hbs', 'systems/foundryvtt-reve-de-dragon/templates/hud-actor-soins.hbs',
hudSoins, hudSoins,
@@ -111,8 +112,7 @@ export class RdDTokenHud {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async addTokenHudExtensions(app, html, tokenId) { static async addTokenHudExtensions(app, html, tokenId) {
console.log(`Adding token HUD extensions for token ${tokenId}`); const controlIconCombat = html.find('.control-icon[data-action=combat]');
const controlIconCombat = $(html).find('.control-icon[data-action=combat]');
if (controlIconCombat.length > 0) { if (controlIconCombat.length > 0) {
controlIconCombat.click(event => { controlIconCombat.click(event => {
if (event.currentTarget.className.includes('active')) { if (event.currentTarget.className.includes('active')) {
@@ -129,7 +129,7 @@ export class RdDTokenHud {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async _configureSubMenu(insertionPoint, template, hudData, onMenuItem) { static async _configureSubMenu(insertionPoint, template, hudData, onMenuItem) {
const hud = $(await foundry.applications.handlebars.renderTemplate(template, hudData)); const hud = $(await renderTemplate(template, hudData));
const list = hud.find('div.rdd-hud-list'); const list = hud.find('div.rdd-hud-list');
RdDTokenHud._toggleHudListActive(hud, list); RdDTokenHud._toggleHudListActive(hud, list);

View File

@@ -349,7 +349,7 @@ export class RdDUtility {
Handlebars.registerHelper('typeTmr-name', type => TMRUtility.typeTmrName(type)); Handlebars.registerHelper('typeTmr-name', type => TMRUtility.typeTmrName(type));
Handlebars.registerHelper('effetRencontre-name', coord => TMRUtility.typeTmrName(coord)); Handlebars.registerHelper('effetRencontre-name', coord => TMRUtility.typeTmrName(coord));
foundry.applications.handlebars.loadTemplates(templatePaths); loadTemplates(templatePaths);
} }
static getItem(itemId, actorId = undefined) { static getItem(itemId, actorId = undefined) {
@@ -733,14 +733,14 @@ export class RdDUtility {
RdDTextEditor.registerChatCallbacks(html) RdDTextEditor.registerChatCallbacks(html)
// Gestion spécifique message passeurs // Gestion spécifique message passeurs
$(html).on("click", '.tmr-passeur-coord a', event => { html.on("click", '.tmr-passeur-coord a', event => {
let coord = event.currentTarget.attributes['data-tmr-coord'].value; let coord = event.currentTarget.attributes['data-tmr-coord'].value;
let actorId = event.currentTarget.attributes['data-actor-id'].value; let actorId = event.currentTarget.attributes['data-actor-id'].value;
let actor = game.actors.get(actorId); let actor = game.actors.get(actorId);
actor.tmrApp.positionnerDemiReve(coord); actor.tmrApp.positionnerDemiReve(coord);
}); });
// Gestion spécifique des sorts en réserve multiples (ie têtes) // Gestion spécifique des sorts en réserve multiples (ie têtes)
$(html).on("click", '.declencher-sort-reserve', event => { html.on("click", '.declencher-sort-reserve', event => {
let coord = event.currentTarget.attributes['data-tmr-coord'].value; let coord = event.currentTarget.attributes['data-tmr-coord'].value;
let sortId = event.currentTarget.attributes['data-sort-id'].value; let sortId = event.currentTarget.attributes['data-sort-id'].value;
let actorId = event.currentTarget.attributes['data-actor-id'].value; let actorId = event.currentTarget.attributes['data-actor-id'].value;
@@ -750,7 +750,7 @@ export class RdDUtility {
}); });
// gestion bouton tchat Possession // gestion bouton tchat Possession
$(html).on("click", '.defense-possession', event => { html.on("click", '.defense-possession', event => {
let attackerId = event.currentTarget.attributes['data-attackerId'].value let attackerId = event.currentTarget.attributes['data-attackerId'].value
let defenderId = event.currentTarget.attributes['data-defenderId'].value let defenderId = event.currentTarget.attributes['data-defenderId'].value
let possessionId = event.currentTarget.attributes['data-possessionId'].value let possessionId = event.currentTarget.attributes['data-possessionId'].value
@@ -758,16 +758,16 @@ export class RdDUtility {
}); });
// gestion bouton tchat Acheter // gestion bouton tchat Acheter
$(html).on("click", '.button-acheter', event => { html.on("click", '.button-acheter', event => {
const venteData = DialogItemAchat.preparerAchat(event.currentTarget); const venteData = DialogItemAchat.preparerAchat(event.currentTarget);
if (venteData) { if (venteData) {
DialogItemAchat.onAcheter(venteData); DialogItemAchat.onAcheter(venteData);
} }
}); });
$(html).on("click", '.button-creer-acteur', event => RdDNameGen.onCreerActeur(event)); html.on("click", '.button-creer-acteur', event => RdDNameGen.onCreerActeur(event));
// Gestion du bouton payer // Gestion du bouton payer
$(html).on("click", '.payer-button', event => { html.on("click", '.payer-button', event => {
let sommeAPayer = Number(event.currentTarget.attributes['data-somme-a-payer']?.value ?? 0); let sommeAPayer = Number(event.currentTarget.attributes['data-somme-a-payer']?.value ?? 0);
let actor = RdDUtility.getSelectedActor("Pour effectuer le paiement:"); let actor = RdDUtility.getSelectedActor("Pour effectuer le paiement:");
if (actor) { if (actor) {
@@ -775,8 +775,8 @@ export class RdDUtility {
ChatUtility.removeChatMessageId(RdDUtility.findChatMessageId(event.currentTarget)); ChatUtility.removeChatMessageId(RdDUtility.findChatMessageId(event.currentTarget));
} }
}); });
$(html).on("click", '.rdd-world-content-link', async event => { html.on("click", '.rdd-world-content-link', async event => {
const htmlElement = $(html).find(event.currentTarget); const htmlElement = html.find(event.currentTarget);
const id = htmlElement?.data("id"); const id = htmlElement?.data("id");
const doctype = htmlElement?.data("doctype"); const doctype = htmlElement?.data("doctype");
switch (doctype ?? 'Item') { switch (doctype ?? 'Item') {

View File

@@ -4,7 +4,7 @@ import { Misc } from "../misc.js"
export const EXPORT_CSV_SCRIPTARIUM = 'export-csv-scriptarium' export const EXPORT_CSV_SCRIPTARIUM = 'export-csv-scriptarium'
const OPTIONS_AVANCEES = [ const OPTIONS_AVANCEES = [
{ group: 'Menus', name: EXPORT_CSV_SCRIPTARIUM, descr: "Proposer le menu d'export csv Scriptarium", default: false }, { group: 'Menus', name: EXPORT_CSV_SCRIPTARIUM, descr: "Proposer le menu d'export csv Scriptarium" },
] ]
export class OptionsAvancees extends FormApplication { export class OptionsAvancees extends FormApplication {
@@ -24,6 +24,10 @@ export class OptionsAvancees extends FormApplication {
}) })
} }
constructor(...args) {
super(...args)
}
static _getId(name) { static _getId(name) {
return `rdd-advanced-${name}` return `rdd-advanced-${name}`
} }
@@ -71,7 +75,7 @@ export class OptionsAvancees extends FormApplication {
} }
activateListeners(html) { activateListeners(html) {
$(html).find(".select-option").click((event) => { html.find(".select-option").click((event) => {
if (event.currentTarget.attributes.name) { if (event.currentTarget.attributes.name) {
let id = event.currentTarget.attributes.name.value let id = event.currentTarget.attributes.name.value
let isChecked = event.currentTarget.checked let isChecked = event.currentTarget.checked
@@ -84,3 +88,4 @@ export class OptionsAvancees extends FormApplication {
this.close() this.close()
} }
} }

View File

@@ -112,7 +112,7 @@ export class ReglesOptionnelles extends FormApplication {
} }
activateListeners(html) { activateListeners(html) {
$(html).find(".select-option").click((event) => { html.find(".select-option").click((event) => {
if (event.currentTarget.attributes.name) { if (event.currentTarget.attributes.name) {
let id = event.currentTarget.attributes.name.value; let id = event.currentTarget.attributes.name.value;
let isChecked = event.currentTarget.checked; let isChecked = event.currentTarget.checked;
@@ -125,3 +125,4 @@ export class ReglesOptionnelles extends FormApplication {
this.close(); this.close();
} }
} }

View File

@@ -131,7 +131,7 @@ export class StatusEffects extends FormApplication {
} }
activateListeners(html) { activateListeners(html) {
$(html).find(".select-effect").click((event) => { html.find(".select-effect").click((event) => {
let id = event.currentTarget.attributes.name?.value; let id = event.currentTarget.attributes.name?.value;
if (id) { if (id) {
let selected = StatusEffects._getUseStatusEffects(); let selected = StatusEffects._getUseStatusEffects();
@@ -151,3 +151,4 @@ export class StatusEffects extends FormApplication {
this.close(); this.close();
} }
} }

View File

@@ -184,7 +184,7 @@ export class SystemCompendiums extends FormApplication {
} }
activateListeners(html) { activateListeners(html) {
$(html).find("select.system-compendium-setting").change((event) => { html.find("select.system-compendium-setting").change((event) => {
const compendium = $(event.currentTarget).data('compendium') const compendium = $(event.currentTarget).data('compendium')
const value = $(event.currentTarget).val(); const value = $(event.currentTarget).val();
const systemCompendium = CONFIGURABLE_COMPENDIUMS[compendium]; const systemCompendium = CONFIGURABLE_COMPENDIUMS[compendium];

View File

@@ -9,7 +9,7 @@ export class DialogChateauDormant extends Dialog {
motifStress: `Nuit du ${date}`, motifStress: `Nuit du ${date}`,
finChateauDormant: game.system.rdd.calendrier.getTimestampFinChateauDormant() finChateauDormant: game.system.rdd.calendrier.getTimestampFinChateauDormant()
}; };
const html = await foundry.applications.handlebars.renderTemplate("systems/foundryvtt-reve-de-dragon/templates/sommeil/dialog-chateau-dormant.hbs", const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/sommeil/dialog-chateau-dormant.hbs",
dialogData); dialogData);
new DialogChateauDormant(dialogData, html) new DialogChateauDormant(dialogData, html)
@@ -36,7 +36,7 @@ export class DialogChateauDormant extends Dialog {
activateListeners(html) { activateListeners(html) {
super.activateListeners(html); super.activateListeners(html);
this.html = $(html); this.html = html;
this.html.find('input.sommeil-insomnie').change(event => this.onInsomnie(event)); this.html.find('input.sommeil-insomnie').change(event => this.onInsomnie(event));
this._activateListenerOnActorMoral(this.html); this._activateListenerOnActorMoral(this.html);
} }

View File

@@ -15,8 +15,6 @@ const TEMPLATE_CALENDRIER = "systems/foundryvtt-reve-de-dragon/templates/time/ca
const INITIAL_CALENDAR_POS = { top: 200, left: 200, horlogeAnalogique: true }; const INITIAL_CALENDAR_POS = { top: 200, left: 200, horlogeAnalogique: true };
/* -------------------------------------------- */ /* -------------------------------------------- */
export class RdDCalendrier extends Application { export class RdDCalendrier extends Application {
static _warnedAppV1 = true
static initSettings() { static initSettings() {
game.settings.register(SYSTEM_RDD, "liste-nombre-astral", { game.settings.register(SYSTEM_RDD, "liste-nombre-astral", {
name: "liste-nombre-astral", name: "liste-nombre-astral",

View File

@@ -102,7 +102,7 @@ export class TMRRencontres {
/* -------------------------------------------- */ /* -------------------------------------------- */
async $chatRolledRencontre(row, rencontre, tmr) { async $chatRolledRencontre(row, rencontre, tmr) {
const flavorContent = await foundry.applications.handlebars.renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-compendium-table-roll-rencontre.hbs', const flavorContent = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-compendium-table-roll-rencontre.hbs',
{ {
roll: row.roll, roll: row.roll,
rencontre, rencontre,
@@ -113,7 +113,7 @@ export class TMRRencontres {
}); });
const messageData = { const messageData = {
user: game.user.id, user: game.user.id,
type: CONST.CHAT_MESSAGE_STYLES.ROLL, type: CONST.CHAT_MESSAGE_TYPES.ROLL,
roll: row.roll, roll: row.roll,
sound: CONFIG.sounds.dice, sound: CONFIG.sounds.dice,
content: flavorContent content: flavorContent

View File

@@ -2,9 +2,6 @@ import { Misc } from "./misc.js";
import { Grammar } from "./grammar.js"; import { Grammar } from "./grammar.js";
import { RdDDice } from "./rdd-dice.js"; import { RdDDice } from "./rdd-dice.js";
const TMR_INCONNU = "inconnu"
export const COORD_TMR_INCONNU = "A0"
export const TMRType = { export const TMRType = {
cite: { type: 'cite', name: "cité", genre: "f" }, cite: { type: 'cite', name: "cité", genre: "f" },
sanctuaire: { type: 'sanctuaire', name: "sanctuaire", genre: 'm' }, sanctuaire: { type: 'sanctuaire', name: "sanctuaire", genre: 'm' },
@@ -19,15 +16,13 @@ export const TMRType = {
marais: { type: 'marais', name: "marais", genre: "m" }, marais: { type: 'marais', name: "marais", genre: "m" },
gouffre: { type: 'gouffre', name: "gouffre", genre: "m" }, gouffre: { type: 'gouffre', name: "gouffre", genre: "m" },
necropole: { type: 'necropole', name: "nécropole", genre: "f" }, necropole: { type: 'necropole', name: "nécropole", genre: "f" },
desolation: { type: 'desolation', name: "désolation", genre: "f" }, desolation: { type: 'desolation', name: "désolation", genre: "f" }
[TMR_INCONNU]: { type: TMR_INCONNU, name: TMR_INCONNU, genre: "m" }
} }
export const FLEUVE_COORD = 'Fleuve' export const FLEUVE_COORD = 'Fleuve'
const TMRMapping = { const TMRMapping = {
Fleuve: { type: TMRType.fleuve.type, label: "Fleuve de l'Oubli", generique: 'fleuve' }, Fleuve: { type: TMRType.fleuve.type, label: "Fleuve de l'Oubli", generique: 'fleuve' },
[COORD_TMR_INCONNU]: { type: TMR_INCONNU, label: TMR_INCONNU },
A1: { type: TMRType.cite.type, label: "Cité Vide" }, A1: { type: TMRType.cite.type, label: "Cité Vide" },
B1: { type: TMRType.plaines.type, label: "Plaines dAssorh" }, B1: { type: TMRType.plaines.type, label: "Plaines dAssorh" },
C1: { type: TMRType.necropole.type, label: "Nécropole de Kroak" }, C1: { type: TMRType.necropole.type, label: "Nécropole de Kroak" },
@@ -277,7 +272,7 @@ export class TMRUtility {
} }
static getTMRType(coord) { static getTMRType(coord) {
const tmr = TMRUtility.getTMR(coord) const tmr = TMRUtility.getTMR(coord);
return Misc.upperFirst(TMRType[tmr.type].name); return Misc.upperFirst(TMRType[tmr.type].name);
} }

View File

@@ -3,9 +3,9 @@ import { Draconique } from "./draconique.js";
import { PixiTMR } from "./pixi-tmr.js"; import { PixiTMR } from "./pixi-tmr.js";
const IMAGE_CARTE_TMR = 'image-carte-tmr'; const IMAGE_CARTE_TMR = 'image-carte-tmr';
const TMR_V1 = "systems/foundryvtt-reve-de-dragon/assets/ui/tmr-v1.webp"; const TMR_V1 = "systems/foundryvtt-reve-de-dragon/styles/img/ui/tmr-v1.webp";
const TMR_V2 = "systems/foundryvtt-reve-de-dragon/assets/ui/tmr-v2.webp"; const TMR_V2 = "systems/foundryvtt-reve-de-dragon/styles/img/ui/tmr-v2.webp";
const TMR_V3_COULEUR = "systems/foundryvtt-reve-de-dragon/assets/ui/tmr-v3-couleur.webp"; const TMR_V3_COULEUR = "systems/foundryvtt-reve-de-dragon/styles/img/ui/tmr-v3-couleur.webp";
export class CarteTmr extends Draconique { export class CarteTmr extends Draconique {

View File

@@ -13,7 +13,7 @@ export class Conquete extends Draconique {
async onActorCreateOwned(actor, item) { await this._creerConquete(actor, item); } async onActorCreateOwned(actor, item) { await this._creerConquete(actor, item); }
code() { return 'conquete' } code() { return 'conquete' }
tooltip(linkData) { return 'Doit être conquis' } tooltip(linkData) { return `Doit être conquis` }
img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/conquete.svg' } img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/conquete.svg' }
createSprite(pixiTMR) { createSprite(pixiTMR) {

View File

@@ -1,5 +1,5 @@
import { ITEM_TYPES } from "../constants.js"; import { ITEM_TYPES } from "../constants.js";
import { COORD_TMR_INCONNU, TMRUtility } from "../tmr-utility.js"; import { TMRUtility } from "../tmr-utility.js";
import { PixiTMR } from "./pixi-tmr.js"; import { PixiTMR } from "./pixi-tmr.js";
const registeredEffects = [ const registeredEffects = [
@@ -12,7 +12,7 @@ export class Draconique {
static init() { static init() {
} }
static isCaseTMR(item) { return item.type == ITEM_TYPES.casetmr } static isCaseTMR(item) { return item.type == ITEM_TYPES.casetmr; }
static isQueueDragon(item) { return item.isQueueDragon(); } static isQueueDragon(item) { return item.isQueueDragon(); }
static isSouffleDragon(item) { return item.type == ITEM_TYPES.souffle; } static isSouffleDragon(item) { return item.type == ITEM_TYPES.souffle; }
static isTeteDragon(item) { return item.type == ITEM_TYPES.tete; } static isTeteDragon(item) { return item.type == ITEM_TYPES.tete; }
@@ -127,7 +127,7 @@ export class Draconique {
* @param {*} coord les coordonnées d'une case. Si undefined toute case du type correspondra, * @param {*} coord les coordonnées d'une case. Si undefined toute case du type correspondra,
*/ */
isCase(item, coord = undefined) { isCase(item, coord = undefined) {
return Draconique.isCaseTMR(item) && item.system.specific == this.code() && (coord ? (coord != COORD_TMR_INCONNU && item.system.coord == coord) : true); return Draconique.isCaseTMR(item) && item.system.specific == this.code() && (coord ? item.system.coord == coord : true);
} }
find(list, coord = undefined) { find(list, coord = undefined) {
@@ -150,7 +150,7 @@ export class Draconique {
} }
isCaseForSource(item, draconique) { isCaseForSource(item, draconique) {
return Draconique.isCaseTMR(item) && item.system.specific == this.code() && item.system.sourceid == draconique.id return Draconique.isCaseTMR(item) && item.system.specific == this.code() && item.system.sourceid == draconique.id;
} }
async onVisiteSupprimer(actor, tmr, onRemoveToken) { async onVisiteSupprimer(actor, tmr, onRemoveToken) {

View File

@@ -1,6 +1,6 @@
import { Grammar } from "../grammar.js"; import { Grammar } from "../grammar.js";
import { tmrTokenZIndex } from "../tmr-constants.js"; import { tmrTokenZIndex } from "../tmr-constants.js";
import { COORD_TMR_INCONNU, TMRUtility } from "../tmr-utility.js"; import { TMRUtility } from "../tmr-utility.js";
import { Draconique } from "./draconique.js"; import { Draconique } from "./draconique.js";
export class QueteEaux extends Draconique { export class QueteEaux extends Draconique {
@@ -9,13 +9,11 @@ export class QueteEaux extends Draconique {
match(item) { return Draconique.isTeteDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes("quete des eaux"); } match(item) { return Draconique.isTeteDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes("quete des eaux"); }
manualMessage() { return "Vous devrez re-configurer votre Nouvelle Quête des Eaux une fois un lac ou marais vaincu" } manualMessage() { return "Vous devrez re-configurer votre Nouvelle Quête des Eaux une fois un lac ou marais vaincu" }
async onActorCreateOwned(actor, tete) { async onActorCreateOwned(actor, tete) {
await this.createCaseTmr(actor, "Nouvelle Quête des Eaux", { coord: COORD_TMR_INCONNU }, tete.id); await this.createCaseTmr(actor, "Nouvelle Quête des Eaux", { coord: 'A0' }, tete.id);
} }
code() { return 'maitrisee' } code() { return 'maitrisee' }
tooltip(linkData) { tooltip(linkData) { return `Quête des eaux, ${TMRUtility.getTMRType(linkData.system.coord)} maîtrisé` }
return linkData.system.coord == COORD_TMR_INCONNU ? 'Nouvelle Quête des eaux en cours' : `Quête des eaux, ${TMRUtility.getTMRType(linkData.system.coord)} maîtrisé`
}
img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/maitrisee.svg' } img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/maitrisee.svg' }
createSprite(pixiTMR) { createSprite(pixiTMR) {

View File

@@ -1,6 +1,5 @@
import { Grammar } from "../grammar.js"; import { Grammar } from "../grammar.js";
import { tmrTokenZIndex } from "../tmr-constants.js"; import { tmrTokenZIndex } from "../tmr-constants.js";
import { COORD_TMR_INCONNU } from "../tmr-utility.js";
import { Draconique } from "./draconique.js"; import { Draconique } from "./draconique.js";
export class TerreAttache extends Draconique { export class TerreAttache extends Draconique {
@@ -10,7 +9,7 @@ export class TerreAttache extends Draconique {
manualMessage() { return "Vous pouvez re-configurer votre Nouvelle Terre d'attache" } manualMessage() { return "Vous pouvez re-configurer votre Nouvelle Terre d'attache" }
async onActorCreateOwned(actor, tete) { async onActorCreateOwned(actor, tete) {
await this.createCaseTmr(actor, "Nouvelle Terre d'attache", { coord: COORD_TMR_INCONNU }, tete.id); await this.createCaseTmr(actor, "Nouvelle Terre d'attache", { coord: 'A0' }, tete.id);
} }
code() { return 'attache' } code() { return 'attache' }

View File

@@ -106,9 +106,9 @@ export class DialogFatigueVoyage extends Dialog {
activateListeners(html) { activateListeners(html) {
if (this.html == undefined) { if (this.html == undefined) {
$(html).find('select[name="code-terrain"]').trigger("focus") html.find('select[name="code-terrain"]').trigger("focus")
} }
this.html = $(html); this.html = html;
super.activateListeners(html); super.activateListeners(html);
this.html.find('select[name="code-terrain"]').change(event => this.changeParameters()) this.html.find('select[name="code-terrain"]').change(event => this.changeParameters())

View File

@@ -1,37 +1,15 @@
{ {
"name": "foundryvtt-reve-de-dragon",
"description": "<h2><em>Rêve de Dragon</em> pour Foundry Virtual TableTop</h2>",
"private": true,
"version": "1.0.0",
"license": "Creative Commons",
"main": "gulpfile.js",
"scripts": { "scripts": {
"build": "npx vite build", "build": "npx vite build",
"gulp": "gulp",
"run": "npx vite serve", "run": "npx vite serve",
"packCompendiumsToDist": "node ./tools/packCompendiumsToDist.mjs", "packCompendiumsToDist": "node ./tools/packCompendiumsToDist.mjs",
"packCompendiumsToPublic": "node ./tools/packCompendiumsToPublic.mjs", "packCompendiumsToPublic": "node ./tools/packCompendiumsToPublic.mjs",
"unpackCompendiumsFromPublic": "node ./tools/unpackCompendiumsFromPublic.mjs" "unpackCompendiumsFromPublic": "node ./tools/unpackCompendiumsFromPublic.mjs"
}, },
"devDependencies": { "devDependencies": {
"@eslint/js": "^9.8.0", "@foundryvtt/foundryvtt-cli": "^1.0.3"
"@foundryvtt/foundryvtt-cli": "^1.0.3",
"commander": "^11.1.0",
"eslint": "^9.9.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-jsdoc": "^48.11.0",
"eslint-plugin-prettier": "^5.2.1",
"globals": "^15.9.0",
"less": "^4.1.3",
"prettier": "^3.3.3"
}, },
"dependencies": { "dependencies": {
"gulp": "^5.0.0",
"gulp-less": "^5.0.0",
"rollup-plugin-visualizer": "^5.12.0" "rollup-plugin-visualizer": "^5.12.0"
},
"repository": {
"type": "git",
"url": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon.git"
} }
} }

View File

@@ -3,8 +3,8 @@ type: faune
img: systems/foundryvtt-reve-de-dragon/icons/faune/ours.webp img: systems/foundryvtt-reve-de-dragon/icons/faune/ours.webp
system: system:
description: >- description: >-
<p>Ours. For&ecirc;t, montagne, 300 kg, 600 sust. Surtout recherch&eacute; <p>Ours. For&ecirc;t, montagne, 300 kg, 600 sust.Surtout recherch&eacute;
pour sa peau (voir le grizzal, p405).</p> pour sa peau (voir legrizzal, p405).</p>
descriptionmj: '' descriptionmj: ''
encombrement: 150 encombrement: 150
quantite: 1 quantite: 1

View File

@@ -2,7 +2,7 @@ name: Terres médianes du rêve
type: script type: script
scope: global scope: global
author: Hp9ImM4o9YRTSdfu author: Hp9ImM4o9YRTSdfu
img: systems/foundryvtt-reve-de-dragon/assets/ui/icon-tmr-normal.svg img: systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-normal.svg
command: |- command: |-
const selected = game.system.rdd.RdDUtility.getSelectedActor(); const selected = game.system.rdd.RdDUtility.getSelectedActor();
if (!selected) { if (!selected) {
@@ -18,8 +18,8 @@ command: |-
title: `Monter dans les TMR`, title: `Monter dans les TMR`,
content: `Monter dans les TMR`, content: `Monter dans les TMR`,
buttons: { buttons: {
normale: { label: `normale`, icon: `<img class="button-img" src="systems/foundryvtt-reve-de-dragon/assets/ui/icon-tmr-normal.svg" alt="Montée dans les Terres M&eacute;dianes !"/>`, callback: () => selected.displayTMR("normal") }, normale: { label: `normale`, icon: `<img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-normal.svg" alt="Montée dans les Terres M&eacute;dianes !"/>`, callback: () => selected.displayTMR("normal") },
rapide: { label: `rapide`, icon: `<img class="button-img" src="systems/foundryvtt-reve-de-dragon/assets/ui/icon-tmr-rapide.svg" alt="Montée accélérée dans les Terres M&eacute;dianes !"/>`, callback: () => selected.displayTMR("rapide") }, rapide: { label: `rapide`, icon: `<img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-rapide.svg" alt="Montée accélérée dans les Terres M&eacute;dianes !"/>`, callback: () => selected.displayTMR("rapide") },
}, },
}); });

View File

@@ -5,7 +5,7 @@ sort: 0
pages: pages:
- name: 'Figure: Documentation MJ/Joueurs' - name: 'Figure: Documentation MJ/Joueurs'
type: image type: image
src: systems/foundryvtt-reve-de-dragon/assets/logo.webp src: systems/foundryvtt-reve-de-dragon/styles/img/logo.webp
title: title:
show: false show: false
level: 1 level: 1
@@ -94,9 +94,9 @@ pages:
<li><img style="background-color:purple;vertical-align:middle" src="icons/svg/bones.svg" width="25" height="30" /> Encaisser des dommages</li> <li><img style="background-color:purple;vertical-align:middle" src="icons/svg/bones.svg" width="25" height="30" /> Encaisser des dommages</li>
<li><img style="background-color:purple;vertical-align:middle" src="icons/svg/regen.svg" width="25" height="30" /> Remise à neuf (Uniquement pour le MJ) pour enlever toutes les blessures/états du personnage.</li> <li><img style="background-color:purple;vertical-align:middle" src="icons/svg/regen.svg" width="25" height="30" /> Remise à neuf (Uniquement pour le MJ) pour enlever toutes les blessures/états du personnage.</li>
<li><img style="background-color:purple;vertical-align:middle" src="icons/svg/sleep.svg" width="25" height="30" /> Le sommeil (dormir une heure, une nuit, gris rêve)</li> <li><img style="background-color:purple;vertical-align:middle" src="icons/svg/sleep.svg" width="25" height="30" /> Le sommeil (dormir une heure, une nuit, gris rêve)</li>
<li><img style="background-color:purple;vertical-align:middle" src="systems/foundryvtt-reve-de-dragon/assets/ui/icon-tmr-normal.svg" width="25" height="30" /> Montée dans les Terres Médianes</li> <li><img style="background-color:purple;vertical-align:middle" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-normal.svg" width="25" height="30" /> Montée dans les Terres Médianes</li>
<li><img style="background-color:purple;vertical-align:middle" src="systems/foundryvtt-reve-de-dragon/assets/ui/icon-tmr-rapide.svg" width="25" height="30" /> Montée rapide</li> <li><img style="background-color:purple;vertical-align:middle" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-rapide.svg" width="25" height="30" /> Montée rapide</li>
<li><img style="background-color:purple;vertical-align:middle" src="systems/foundryvtt-reve-de-dragon/assets/ui/icon-tmr-view.svg" width="25" height="30" /> Regarder ses terres médianes (sans monter)</li> <li><img style="background-color:purple;vertical-align:middle" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-view.svg" width="25" height="30" /> Regarder ses terres médianes (sans monter)</li>
</ul> </ul>
<h1>Combat</h1> <h1>Combat</h1>
<p>Pour l'initiative et les attaques, des options sont disponibles <p>Pour l'initiative et les attaques, des options sont disponibles
@@ -171,7 +171,7 @@ pages:
<li>Les retours que vous nous ferez via <a href="https://discord.gg/pPSDNJk">discord</a> <li>Les retours que vous nous ferez via <a href="https://discord.gg/pPSDNJk">discord</a>
(channel #rêve-de-dragon) ;-)</li> (channel #rêve-de-dragon) ;-)</li>
</ul> </ul>
<p><img style="border:0;display:block;margin-left:auto;margin-right:auto" src="systems/foundryvtt-reve-de-dragon/assets/rdd_pause.webp" width="210" height="216" /></p> <p><img style="border:0;display:block;margin-left:auto;margin-right:auto" src="systems/foundryvtt-reve-de-dragon/styles/img/rdd_pause.webp" width="210" height="216" /></p>
_id: p0xOSy6tZwU4DOq5 _id: p0xOSy6tZwU4DOq5
image: {} image: {}
video: video:

View File

@@ -5,7 +5,7 @@ sort: 0
pages: pages:
- name: 'Figure: Passeur fou' - name: 'Figure: Passeur fou'
type: image type: image
src: systems/foundryvtt-reve-de-dragon/assets/ui/tmp_main_r1.webp src: systems/foundryvtt-reve-de-dragon/styles/img/ui/tmp_main_r1.webp
title: title:
show: false show: false
level: 1 level: 1

View File

@@ -5,7 +5,7 @@ sort: 0
pages: pages:
- name: 'Figure: Tourbillon rouge' - name: 'Figure: Tourbillon rouge'
type: image type: image
src: systems/foundryvtt-reve-de-dragon/assets/ui/tmp_main_r1.webp src: systems/foundryvtt-reve-de-dragon/styles/img/ui/tmp_main_r1.webp
title: title:
show: false show: false
level: 1 level: 1

View File

@@ -1,6 +1,6 @@
name: Rêve de Dragon name: Rêve de Dragon
type: rencontre type: rencontre
img: systems/foundryvtt-reve-de-dragon/assets/rdd_pause.webp img: systems/foundryvtt-reve-de-dragon/styles/img/rdd_pause.webp
system: system:
description: '' description: ''
descriptionmj: '' descriptionmj: ''

View File

@@ -38,7 +38,7 @@ regions: []
ownership: ownership:
default: 0 default: 0
background: background:
src: systems/foundryvtt-reve-de-dragon/assets/ecran_rdd.webp src: systems/foundryvtt-reve-de-dragon/styles/img/ecran_rdd.webp
offsetX: 0 offsetX: 0
offsetY: 0 offsetY: 0
anchorX: 0 anchorX: 0

4
styles/img/.directory Normal file
View File

@@ -0,0 +1,4 @@
[Dolphin]
Timestamp=2020,11,21,13,59,38
Version=4
VisibleRoles=Details_text,Details_size,Details_modificationtime,Details_creationtime,CustomizedDetails

View File

Before

Width:  |  Height:  |  Size: 193 KiB

After

Width:  |  Height:  |  Size: 193 KiB

View File

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 60 KiB

View File

Before

Width:  |  Height:  |  Size: 163 KiB

After

Width:  |  Height:  |  Size: 163 KiB

View File

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 103 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 8.2 KiB

View File

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

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