Compare commits
	
		
			66 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 0456221cf7 | |||
| 583b4ff003 | |||
| b4ac906802 | |||
| 395c7a4cc3 | |||
| 27bc07f64a | |||
| 2f3ec7bab0 | |||
| 8d39a0526f | |||
| f83548b91e | |||
| 90d17a3477 | |||
| fb15f3eb38 | |||
| 4df0eab574 | |||
| c8d589f0d2 | |||
| d7470836a5 | |||
| 817fa8e62a | |||
| 0fe4f64343 | |||
| d6b5b0a550 | |||
| c9d87851bd | |||
| 5b48fda3d0 | |||
| abae85157b | |||
| da2dca1769 | |||
| 6e405ea753 | |||
| a96f4bf641 | |||
| a0f42204d5 | |||
| c25320755a | |||
| aa5f159a91 | |||
| bb80391a47 | |||
| 1abb757b6b | |||
| 84c44d1f6d | |||
| ccb939207d | |||
| cd38a197cc | |||
| 6b053b189b | |||
| cc4cbbc771 | |||
| 0850789ed7 | |||
| 7a6ccac7fa | |||
| ed64d823ac | |||
| 3162264afa | |||
| e53eda5b42 | |||
| 47a7564a1c | |||
| f7a6fee51d | |||
| 0b3f08ef29 | |||
| 8df9c8ddf5 | |||
| 4cbe652a91 | |||
| 3eb1179c40 | |||
| cf185844af | |||
| 250b936fae | |||
| cd8268f569 | |||
| c04e0cec78 | |||
| 1d5fe1af71 | |||
| e96a627c37 | |||
| 06c3d2f80a | |||
| d07f5a41e7 | |||
| 856d038dc9 | |||
| 791593ad38 | |||
| 42179dab1d | |||
| 83631cd366 | |||
| 01cf47ad55 | |||
| d492b37a45 | |||
| ecdcdb69d5 | |||
| 8479fdda8a | |||
| 83e57fbbc7 | |||
| 2d256b1217 | |||
| 526d38d32e | |||
| 2ff3dfef89 | |||
| f1b6c01cd7 | |||
| 675fe5838e | |||
| bafdec9924 | 
| @@ -12,6 +12,8 @@ jobs: | ||||
|  | ||||
|     #- uses: actions/checkout@v3 | ||||
|     - uses: RouxAntoine/checkout@v3.5.4 | ||||
|       with: | ||||
|         ref: 'v13' | ||||
|  | ||||
|     # get part of the tag after the `v` | ||||
|     - name: Extract tag version number | ||||
| @@ -46,7 +48,7 @@ jobs: | ||||
|          apt update -y | ||||
|          apt install -y zip | ||||
|  | ||||
|     - run: zip -r ./rddsystem.zip system.json template.json README.md LICENSE.txt assets/ fonts/ icons lang/ module/ packs/ pic/ sounds/ styles/ templates/  | ||||
|     - run: zip -r ./rddsystem.zip system.json template.json README.md LICENSE.txt assets/ css/ fonts/ icons lang/ module/ packs/ pic/ sounds/ styles/ templates/ | ||||
|  | ||||
|     - name: setup go | ||||
|       uses: actions/setup-go@v3 | ||||
| @@ -69,6 +71,6 @@ jobs: | ||||
|         id: 'foundryvtt-reve-de-dragon' | ||||
|         version: ${{github.event.release.tag_name}} | ||||
|         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/v11/changelog.md' | ||||
|         compatibility-minimum: '12' | ||||
|         compatibility-verified: '12' | ||||
|         notes: 'https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/branch/v13/changelog.md' | ||||
|         compatibility-minimum: '13' | ||||
|         compatibility-verified: '13' | ||||
| @@ -1,14 +0,0 @@ | ||||
| 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 | ||||
| @@ -1,14 +0,0 @@ | ||||
|  | ||||
| ### 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 | ||||
| Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB | 
| Before Width: | Height: | Size: 193 KiB After Width: | Height: | Size: 193 KiB | 
| Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB | 
| Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB | 
| Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB | 
| Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 60 KiB | 
| Before Width: | Height: | Size: 163 KiB After Width: | Height: | Size: 163 KiB | 
| Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 103 KiB | 
| Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB | 
| Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 8.2 KiB | 
| Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB | 
| Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB | 
| Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB | 
| Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB | 
| Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB | 
| Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.9 KiB | 
| Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.9 KiB | 
| Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.9 KiB | 
| Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB | 
| Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.9 KiB | 
| Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.9 KiB | 
| Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.9 KiB | 
| Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.9 KiB | 
| Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.9 KiB | 
| Before Width: | Height: | Size: 716 KiB After Width: | Height: | Size: 716 KiB | 
| Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 8.6 KiB | 
| Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB | 
| Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB | 
| Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB | 
| Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB | 
| Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB | 
| Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.2 KiB | 
| Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB | 
| Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB | 
| Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB | 
| Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB | 
| Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB | 
| Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB | 
| Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB | 
| Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB | 
| Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB | 
| Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB | 
| Before Width: | Height: | Size: 9.5 KiB After Width: | Height: | Size: 9.5 KiB | 
| Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB | 
| Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.9 KiB | 
| Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 7.6 KiB | 
| Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB | 
| Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 6.0 KiB | 
| Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB | 
| Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB | 
| Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 56 KiB | 
| Before Width: | Height: | Size: 188 B After Width: | Height: | Size: 188 B | 
| Before Width: | Height: | Size: 162 B After Width: | Height: | Size: 162 B | 
| Before Width: | Height: | Size: 634 KiB After Width: | Height: | Size: 634 KiB | 
| Before Width: | Height: | Size: 1.0 MiB After Width: | Height: | Size: 1.0 MiB | 
| Before Width: | Height: | Size: 637 KiB After Width: | Height: | Size: 637 KiB | 
							
								
								
									
										146
									
								
								changelog.md
									
									
									
									
									
								
							
							
						
						| @@ -1,5 +1,81 @@ | ||||
| # 13.0 | ||||
| ## 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.50 - Le sommeil d'Astrobazzarh | ||||
|  | ||||
| - 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 | ||||
|  | ||||
| ## 12.0.49 - La deuxième lame d'Astrobazzarh | ||||
|  | ||||
| - Corrections | ||||
|   - 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 attaques à distance n'ont pas de difficulté libre | ||||
|  | ||||
| ## 12.0.48 - La chèvre d'Astrobazzarh | ||||
|  | ||||
| - le Bandersnatch a une protection de 10 | ||||
| - la consistance chèvre est maintenant possible dans les recettes | ||||
|   alchimiques (et toutes les consistances avec accents) | ||||
| - un échec au lancement d'un sort pour le mettre en réserve brise | ||||
|   la concentration du haut-rêvant | ||||
| - Correction: les réussites particulières fonctionnent avec les caractéristiques dérivées | ||||
|  | ||||
| ## 12.0.47 | ||||
|  | ||||
| - Correction sur les mise à jour en cascade - | ||||
| - Correction sur le force rendering après un changement de competence | ||||
|  | ||||
| ## 12.0.46 - Le double demi d'Astrobazzarh | ||||
|  | ||||
| - correction des raffraîchissement lors du sommeil qui empêchait de dormir | ||||
|   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) | ||||
| - les TMRs se ferment correctement quand la fatigue maximale est dépassée | ||||
| - le message de lancement de sort en réserve donne la description du sort | ||||
| - suppression de double-messages lors de la fermeture des TMR | ||||
|  | ||||
| ## 12.0.45 - Les errements d'Astrobazzarh, encore | ||||
|  | ||||
| - La difficulté des méditations n'augmente plus en cas de réussite et d'échec normal | ||||
| - Renommage du Bouton pour révéler/masquer le demi-rêve | ||||
|  | ||||
| ## 12.0.44 - Les errements d'Astrobazzarh, suite | ||||
|  | ||||
| - on peut de nouveau dormir et se réveiller reposé | ||||
| @@ -104,9 +180,11 @@ | ||||
| - la description du chrasme contient le lien vers son venin plutôt qu'un tableau | ||||
|  | ||||
| ## 12.0.28 - Les réserves d'Astrobazzarh | ||||
|  | ||||
| - possibilité de mettre en réserve depuis un sort connu | ||||
|  | ||||
| ## 12.0.27 - Les vêtements d'Astrobazzarh | ||||
|  | ||||
| - Ajout de la liste des armures dans l'onglet caractéristiques | ||||
| - 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 | ||||
| @@ -127,12 +205,14 @@ | ||||
|   - les modèles de personnages non joueurs sont non-liés par défaut | ||||
|  | ||||
| ## 12.0.26 - Astrobazzarh le Haut-rêvant | ||||
|  | ||||
| - 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" | ||||
|   - migration des compétences & compendiums | ||||
| - Correction feuille simplifiée qui ne s'affichait pas en cas de sort variable | ||||
|  | ||||
| ## 12.0.24 - Les ajustements d'Astrobazzarh | ||||
|  | ||||
| - amélioration | ||||
|   - 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 | ||||
| @@ -142,6 +222,7 @@ | ||||
|   - on peut maintenant saisir et supprimer les bonus de cases de manière intuitive | ||||
|  | ||||
| ## 12.0.23 - La bibliothèque d'Astrobazzarh | ||||
|  | ||||
| - corrections mineures | ||||
|   - meilleure gestion de la parade des armes naturelles | ||||
|   - cas de "User lacks permission to update" pour les blessures et les StatusEffects | ||||
| @@ -157,19 +238,23 @@ | ||||
|   - 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 | ||||
|  | ||||
| - 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 | ||||
|  | ||||
| ## 12.0.20 - Le tableau d'Astrobazzarh | ||||
|  | ||||
| - Ecran d'accueil officiel Scriptarium | ||||
|  | ||||
| ## 12.0.19 - La témérité d'Astrobazzarh | ||||
|  | ||||
| - Fix | ||||
|   - les défenses des créatures sont correctement filtrées | ||||
|   - le lancer d'initiative pour tous les personnages/PNJs fonctionne correctement | ||||
|   - les lieux et commerces n'ont pas d'initiative | ||||
|  | ||||
| ## 12.0.18 - A la barbe d'Astrobazzarh | ||||
|  | ||||
| - Améliorations sur la feuille de PNJ simplifiée | ||||
|   - Ajout du portrait | ||||
|   - Ajout du corps à corps | ||||
| @@ -186,11 +271,13 @@ | ||||
| - Ajout d'un indicateur pour les armes de parade nécessitant une significative | ||||
|  | ||||
| ## 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) | ||||
| - 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 | ||||
|  | ||||
| ## 12.0.15 - Le messager d'Astrobazzarh | ||||
|  | ||||
| - Correction des faces de dés personalisés dice-so-nice | ||||
| - Les messages de maladies ne sont plus publics | ||||
| - Les messages privés dans les TMR sont aussi envoyés au GM | ||||
| @@ -198,6 +285,7 @@ | ||||
| - Amélioration du rendu des tables de compendiums (commande /table) | ||||
|  | ||||
| ## 12.0.14 - Les légions d'Astrobazzarh | ||||
|  | ||||
| - Feuille de PNJ: | ||||
|   - boutons standard (encaissement, ...) | ||||
|   - boutons pour ajuster les compteurs | ||||
| @@ -206,15 +294,18 @@ | ||||
|   - gestion des armes | ||||
|  | ||||
| ## 12.0.13 - La Chance d'Astrobazzarh | ||||
|  | ||||
| - Fix: jets de caractéristiques | ||||
|  | ||||
| ## 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 | ||||
| - Début de Feuille PNJ au format des encarts Scriptarium | ||||
|   - support des jets de caractéristiques | ||||
|   - support des jets de compétences | ||||
|  | ||||
| ## 12.0.11 - Le scriptorium d'Astrobazzarh | ||||
|  | ||||
| - 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 d'un champ pour le métier | ||||
| @@ -223,10 +314,12 @@ | ||||
|   - export de l'esquive avec armure et sans armure | ||||
|  | ||||
| ## 12.0.9 - 12.0.10 - Le scriptorium d'Astrobazzarh | ||||
|  | ||||
| - corrections de l'export scriptarium | ||||
| - ajout d'une fonction avancée pour un exporter "scriptarium" des personnages | ||||
|  | ||||
| ## 12.0.8 - La quincaillerie d'Astrobazzarh | ||||
|  | ||||
| - le propriétaire est indiqué dans les feuilles d'équipements/compétences/... | ||||
| - Ecaille d'efficacité | ||||
|   - l'écaille d'efficacité est prise en compte même si on n'utilise pas le ciblage en combat | ||||
| @@ -236,6 +329,7 @@ | ||||
|   - le tooltip de l'initiative affiche correctement l'initiative | ||||
|  | ||||
| ## 12.0.7 - La propriété d'Astrobazzarh | ||||
|  | ||||
| - correction des opérations faites à la création d'un Item: | ||||
|   - la durée des queues/rencontres/souffles | ||||
|   - les effets draconiques d'un souffle/queue | ||||
| @@ -250,6 +344,7 @@ | ||||
| - la commande /voyage affiche maintenant les compétences liées au terrain | ||||
|  | ||||
| ## 12.0.6 - Le bazar d'Astrobazzarh | ||||
|  | ||||
| - Corrections de l'inventaire en bazar: | ||||
|   - un problème pouvait survenir en déplaçant les objets | ||||
|     l'inventaire, qui fait qu'un conteneur se retrouve récursivement dans son | ||||
| @@ -264,22 +359,26 @@ | ||||
| - Fix: restaurer la compatibilité Foundry 11 | ||||
|  | ||||
| ## 12.0.5 - Les mauvais jours d'Astrobazzarh | ||||
|  | ||||
| - Fix: on peut de nouveau ouvrir l'édition de calendrier | ||||
| - Fix: on ne peut plus ouvrir plusieurs fenêtres de lancer de sort | ||||
| - Fix: Failed to execute 'getComputedStyle' on 'Window' | ||||
|  | ||||
| ## 12.0.4 - La plaie d'Astrobazzarh | ||||
|  | ||||
| - **Support V12** | ||||
|   - Fix: les boutons d'encaissement dans le tchat fonctionnent de nouveau | ||||
|   - Fix warnings sur "Die" et AudioHelper | ||||
|  | ||||
| ## 12.0.3 - L'hémorragie d'Astrobazzarh | ||||
|  | ||||
| - **Support V12** | ||||
|   - 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 | ||||
|   - Le choix de ne plus afficher les demandes de suppression est bien pris en compte | ||||
|  | ||||
| ## 12.0.2 - Les pluies d'Astrobazzarh | ||||
|  | ||||
| - **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) | ||||
|   - la fenêtre de calendrier s'ouvre correctement | ||||
| @@ -294,13 +393,16 @@ | ||||
|   - correction d'erreurs intempestives 'User ... lacks permission to update ...' | ||||
|  | ||||
| # 11.2 | ||||
|  | ||||
| ## 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 | ||||
| - 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 | ||||
| - La date et l'heure (draconiques) sont affichées dans les messages du tchat | ||||
|  | ||||
| ## 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 | ||||
| - 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 | ||||
| @@ -310,12 +412,15 @@ | ||||
| - 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 | ||||
|  | ||||
| - La validation des jets d'encaissement par le Gardien fonctionne de nouveau | ||||
|  | ||||
| ## 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 | ||||
|  | ||||
| ## 11.2.17 - Le cache-oeil d'Akarlikarlikar | ||||
|  | ||||
| - Le titre des fenêtre d'objet affiche de nouveau le type traduit | ||||
| - Les tooltips des boutons edit/delete sont maintenant en Français | ||||
| - La case à cocher "Cacher les points de tâches" fonctionne de nouveau | ||||
| @@ -324,35 +429,43 @@ | ||||
| - La fenêtre des TMRs ne devrait plus afficher une zone noire au lieu de la carte. | ||||
|  | ||||
| ## 11.2.16 - Le Tri d'Akarlikarlikar | ||||
|  | ||||
| - Tri alphabétique des items dans la fenêtre de création | ||||
| - Mise à jour comptage de monde | ||||
|  | ||||
| ## 11.2.15 - La Table d'Akarlikarlikar | ||||
|  | ||||
| - 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) | ||||
|  | ||||
| ## 11.2.14 - Les petits pas d'Akarlikarlikar | ||||
|  | ||||
| - Correction sur la gestion de la surprise | ||||
| - Ordre des messages sur les cases humides | ||||
|  | ||||
| ## 11.2.13 - Les cent pas d'Akarlikarlikar | ||||
|  | ||||
| - Ajout de la commande /voyage pour gérer la fatigue de marche des voyageurs | ||||
|  | ||||
| ## 11.2.12 - Le somnifère  d'Akarlikarlikar | ||||
|  | ||||
| - Fix: les potions enchantées n'empêchent plus de finir correctement Château Dormant | ||||
|  | ||||
| ## 11.2.11 - Le miroir d'Akarlikarlikar | ||||
|  | ||||
| - 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 | ||||
| - Fix: le refoulement ajoute correctement un souffle et revient à 0 en cas d'échec | ||||
|  | ||||
| ## 11.2.10 - Les expériences d'Akarlikarlikar | ||||
|  | ||||
| - 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 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 | ||||
|  | ||||
| ## 11.2.9 - La barbe d'Akarlikarlikar | ||||
|  | ||||
| - Amélioration des textes de tooltips | ||||
| - 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) | ||||
| @@ -364,19 +477,23 @@ | ||||
| - 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 | ||||
|  | ||||
| - 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 jets de dés pour maîtriser les rencontres fonctionnent de nouveau | ||||
|  | ||||
| ## 11.2.7 - Les explications d'Akarlikarlikar | ||||
|  | ||||
| - 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 | ||||
|  | ||||
| ## 11.2.6 - Les réveils difficiles d'Akarlikarlikar | ||||
|  | ||||
| - 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, ...) | ||||
|  | ||||
| ## 11.2.2 - Les tendres moments d'Akarlikarlikar | ||||
|  | ||||
| - On peut maintenant avoir des points de Cœur pour des suivants/compagnons | ||||
|   - diminuer les points de coeurs fait perdre du moral | ||||
|   - on peut proposer un tendre moment | ||||
| @@ -395,11 +512,14 @@ | ||||
|     ne bloquent plus les jets de dés | ||||
|  | ||||
| ## 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". | ||||
| - 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 | ||||
|  | ||||
| ## v11.2.0 - Les Terres médianes d'Akarlikarlikar | ||||
|  | ||||
| - Les TMRs sont redimensionables | ||||
| - Nouveaux graphismes plus lisibles dans les TMRs | ||||
| - Nouveau code couleur des icônes dans les TMR: | ||||
| @@ -413,12 +533,15 @@ 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 | ||||
|  | ||||
| # v11.1 | ||||
|  | ||||
| ## v11.1.6 - Les dissections de Werther de Zloth | ||||
|  | ||||
| - 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: l'encaissement à valider par le MJ fonctionne de nouveau | ||||
|  | ||||
| ## v11.1.5 - Werther de Zloth l'Onirique | ||||
|  | ||||
| - Fixes: | ||||
|   - la demande de défense ne marchait plus | ||||
|   - la tête réserve extensible crée bien une case de réserve extensible (à modifier) | ||||
| @@ -433,6 +556,7 @@ Vu qu'elles ne peuvent pas être utilisées, permet de savoir pourquoi | ||||
|   - pas de jets de vie pour les morts | ||||
|  | ||||
| ## 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é | ||||
| - 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 | ||||
| @@ -442,15 +566,18 @@ 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 | ||||
|  | ||||
| ## v11.1.2 - Les vertèbres de Werther de Zloth | ||||
|  | ||||
| - 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 | ||||
|  | ||||
| ## v11.1.1 - Les fumebols de Werther de Zloth | ||||
|  | ||||
| - 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: cuisiner du gibier prend maintenant bien les proportaions en compte | ||||
|  | ||||
| ## v11.1.0 - Les choix de Werther de Zloth | ||||
|  | ||||
| - Les options suivantes peuvent être désactivées: | ||||
|   - La transformation de stress à Château Dormant | ||||
|   - La récuperation de chance à Château Dormant | ||||
| @@ -468,7 +595,9 @@ 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) | ||||
|  | ||||
| # v11.0 | ||||
|  | ||||
| ## v11.0.28 - les fractures de Khrachtchoum | ||||
|  | ||||
| - La gravité de la blessure est affichée dans le résumé de l'encaissement | ||||
| - 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é | ||||
| @@ -480,12 +609,14 @@ Vu qu'elles ne peuvent pas être utilisées, permet de savoir pourquoi | ||||
|   - le moral est indiqué avant l'icone d'appel au moral | ||||
|  | ||||
| ## v11.0.27 - Khrachtchoum le méticuleux | ||||
|  | ||||
| - le tooltip dans les TMR reste visible si on ne bouge pas la souris | ||||
| - le surencombrement n'affecte QUE les actions physiques | ||||
| - 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 | ||||
|  | ||||
| ## v11.0.26 - le crépuscule de Khrachtchoum | ||||
|  | ||||
| - 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 | ||||
|   - lorsqu'une fenêtre liée aux demi-rêve est affichée, cliquer sur les TMRs n'a pas d'effet | ||||
| @@ -504,45 +635,57 @@ 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 | ||||
|  | ||||
| ## 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 | ||||
|  | ||||
| ## v11.0.24 - les couleurs de Khrachtchoum | ||||
|  | ||||
| - nouvelle carte des TMRs | ||||
|  | ||||
| ## v11.0.23 - la lumière de Khrachtchoum | ||||
|  | ||||
| - 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 illumination globale (correspondant à une illumination extérieure) | ||||
|   - quand lampe "allumée" dans la fenêtre du calendrier | ||||
|  | ||||
| ## v11.0.22 - les automatismes de Khrachtchoum le Problémeux | ||||
|  | ||||
| - Macro pour attaquer avec les compétences de créatures | ||||
|  | ||||
| ## v11.0.20 | ||||
|  | ||||
| - Macro pour attaquer avec les armes des personnages | ||||
|  | ||||
| ## v11.0.17 | ||||
|  | ||||
| - Fix: les actions de commerce ne s'appliquait pas bien aux personnages des tokens non liés | ||||
|  | ||||
| ## 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) | ||||
|  | ||||
| ## v11.0.14 - Les pincettes de Khrachtchoum le Problémeux | ||||
|  | ||||
| - 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 | ||||
|  | ||||
| - 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 | ||||
|  | ||||
| - Correction des malus de surencombrement | ||||
| - Le malus armure est correctement affiché dans l'onglet des caractéristiques | ||||
| - Correction d'orthographe et amélioration des messages des oeuvres d'art | ||||
|  | ||||
| ## 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 | ||||
| - 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 | ||||
|  | ||||
| - 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 | ||||
|   créée au lieu de créer toujours une nouvelle tâche | ||||
| @@ -553,12 +696,14 @@ Vu qu'elles ne peuvent pas être utilisées, permet de savoir pourquoi | ||||
|   les heures dormies sont déduites des heures restant à dormir | ||||
|  | ||||
| ## v11.0.9 - Les Souvenirs de Khrachtchoum le Problémeux | ||||
|  | ||||
| - mode de saisie de l'archétype en vue détaillée | ||||
| - création  une nouvelle incarnation depuis l'archétype | ||||
| - 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 | ||||
|  | ||||
| ## v11.0.8 - la poigne de Sémolosse | ||||
|  | ||||
| - lien vers le changelog | ||||
| - organisation des compendiums du système | ||||
| - correction de l'empoignade | ||||
| @@ -581,4 +726,3 @@ Vu qu'elles ne peuvent pas être utilisées, permet de savoir pourquoi | ||||
| - correction des achats par le MJ sans acteur sélectionné | ||||
|  | ||||
| Cf branche v10 pour l'historique des versions 10 | ||||
|  | ||||
|   | ||||
							
								
								
									
										2502
									
								
								css/foundryvtt-reve-de-dragon.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										37
									
								
								gulpfile.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,37 @@ | ||||
| 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; | ||||
							
								
								
									
										50
									
								
								less/colors.less
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,50 @@ | ||||
| :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); | ||||
|   } | ||||
							
								
								
									
										84
									
								
								less/fonts.less
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,84 @@ | ||||
| /* ==================== (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 */ | ||||
| } | ||||
							
								
								
									
										2115
									
								
								less/foundryvtt-reve-de-dragon.less
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										7
									
								
								less/item/monnaie.less
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,7 @@ | ||||
| // Styles pour la feuille d'objet Monnaie | ||||
| .monnaie-content { | ||||
|  | ||||
|   .item-sheet-common(); | ||||
|   .item-sheet-header(); | ||||
|  | ||||
| } | ||||
							
								
								
									
										7
									
								
								less/item/munition.less
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,7 @@ | ||||
| // Styles pour la feuille d'objet Monnaie | ||||
| .munition-content { | ||||
|  | ||||
|   .item-sheet-common(); | ||||
|   .item-sheet-header(); | ||||
|  | ||||
| } | ||||
							
								
								
									
										7
									
								
								less/item/tarot.less
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,7 @@ | ||||
| // Styles pour la feuille d'objet Monnaie | ||||
| .tarot-content { | ||||
|  | ||||
|   .item-sheet-common(); | ||||
|   .item-sheet-header(); | ||||
|  | ||||
| } | ||||
							
								
								
									
										108
									
								
								less/sheets.less
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,108 @@ | ||||
| .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; | ||||
|   } | ||||
| } | ||||
| @@ -279,28 +279,32 @@ export class RdDActor extends RdDBaseActorSang { | ||||
|   /* -------------------------------------------- */ | ||||
|   async dormirChateauDormant() { | ||||
|     if (!ReglesOptionnelles.isUsing("chateau-dormant-gardien") || !this.system.sommeil || this.system.sommeil.nouveaujour) { | ||||
|       await this.$dormirChateauDormant(); | ||||
|       setTimeout(() => this.sheet.render(), 20) | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   async $dormirChateauDormant() { | ||||
|     const message = { | ||||
|       whisper: ChatUtility.getOwners(this), | ||||
|       content: "" | ||||
|     }; | ||||
|  | ||||
|       await this._recuperationSante(message) | ||||
|       await this._recupereMoralChateauDormant(message) | ||||
|       await this._recupereChance() | ||||
|       await this.transformerStress() | ||||
|       await this.retourSeuilDeReve(message) | ||||
|       await this.setBonusPotionSoin(0) | ||||
|       await this.retourSust(message) | ||||
|       await this.$perteReveEnchantementsChateauDormants() | ||||
|       await this.$suppressionLancementsSort() | ||||
|       await RdDCoeur.applyCoeurChateauDormant(this, message) | ||||
|     await this._recuperationSante(message); | ||||
|     await this._recupereMoralChateauDormant(message); | ||||
|     await this._recupereChance(); | ||||
|     await this.transformerStress(); | ||||
|     await this.retourSeuilDeReve(message); | ||||
|     await this.setBonusPotionSoin(0); | ||||
|     await this.retourSust(message); | ||||
|     await this.$perteReveEnchantementsChateauDormants(); | ||||
|     await this.$suppressionLancementsSort(); | ||||
|     await RdDCoeur.applyCoeurChateauDormant(this, message); | ||||
|     if (message.content != "") { | ||||
|       message.content = `A la fin Chateau Dormant, ${message.content}<br>Un nouveau jour se lève`; | ||||
|       ChatMessage.create(message); | ||||
|     } | ||||
|     await this.resetInfoSommeil(); | ||||
|       setTimeout(() => this.sheet.render(), 20) | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   async resetInfoSommeil() { | ||||
| @@ -457,12 +461,10 @@ export class RdDActor extends RdDBaseActorSang { | ||||
|       ChatMessage.create(message); | ||||
|     } | ||||
|     if (options.chateauDormant) { | ||||
|       await this.dormirChateauDormant(); | ||||
|       await this.$dormirChateauDormant(); | ||||
|     } | ||||
|     else { | ||||
|     setTimeout(() => this.sheet.render(), 20) | ||||
|   } | ||||
|   } | ||||
|  | ||||
|   async reveilReveDeDragon(message, heures) { | ||||
|     const restant = Math.max(this.system.sommeil?.heures - heures, 0) | ||||
| @@ -482,7 +484,7 @@ export class RdDActor extends RdDBaseActorSang { | ||||
|         await this.$recupererFatigue(message); | ||||
|         await this.$jetRecuperationReve(dormi, message); | ||||
|         if (dormi.etat == 'dort' && EffetsDraconiques.isDonDoubleReve(this)) { | ||||
|           dormi.etat = await this.$jetRecuperationReve(dormi, message); | ||||
|           await this.$jetRecuperationReve(dormi, message); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
| @@ -541,7 +543,6 @@ export class RdDActor extends RdDBaseActorSang { | ||||
|       max = Math.floor(max / 2); | ||||
|     } | ||||
|     const manquant = max - this.system.sante.endurance.value; | ||||
|  | ||||
|     if (manquant > 0) { | ||||
|       await this.santeIncDec("endurance", manquant); | ||||
|       message.content += `Vous récuperez ${manquant} points d'endurance. `; | ||||
| @@ -558,7 +559,6 @@ export class RdDActor extends RdDBaseActorSang { | ||||
|       } | ||||
|       fatigue = Math.max(fatigueMin, this._calculRecuperationSegment(fatigue)) | ||||
|       await this.update({ 'system.sante.fatigue.value': fatigue }); | ||||
|       await new Promise(resolve => setTimeout(resolve, 200));  | ||||
|       if (fatigue == 0) { | ||||
|         message.content += "Vous êtes complêtement reposé. "; | ||||
|       } | ||||
| @@ -668,19 +668,23 @@ export class RdDActor extends RdDBaseActorSang { | ||||
|     if (!RdDItemRace.checkRacialMax(this, caracName, to)) { | ||||
|       return | ||||
|     } | ||||
|     let updates = {}; | ||||
|     if (caracName == LIST_CARAC_PERSONNAGE.reve.code) { | ||||
|       if (to > Misc.toInt(this.system.reve.seuil.value)) { | ||||
|         this.setPointsDeSeuil(to); | ||||
|         updates[`system.reve.seuil.value`] = to; // SFA : Direct and packed changes | ||||
|         //this.setPointsDeSeuil(to); | ||||
|       }  | ||||
|     } | ||||
|     if (caracName == LIST_CARAC_PERSONNAGE.chance.code) { | ||||
|       if (to > Misc.toInt(this.system.compteurs.chance.value)) { | ||||
|         this.setPointsDeChance(to); | ||||
|         updates[`system.compteurs.chance.value`] = to; // SFA : Direct and packed changes | ||||
|         //this.setPointsDeChance(to); | ||||
|       } | ||||
|     } | ||||
|     let selectedCarac = this.findCaracByName(caracName); | ||||
|     const from = selectedCarac.value | ||||
|     await this.update({ [`system.carac.${caracName}.value`]: to }); | ||||
|     updates[`system.carac.${caracName}.value`] = to; | ||||
|     await this.update(updates); | ||||
|     await ExperienceLog.add(this, XP_TOPIC.CARAC, from, to, caracName); | ||||
|   } | ||||
|  | ||||
| @@ -784,7 +788,7 @@ export class RdDActor extends RdDBaseActorSang { | ||||
|       const toNiveau = compValue ?? RdDItemCompetence.getNiveauBase(competence.system.categorie, competence.getCategories()); | ||||
|       this.notifyCompetencesTronc(competence, toNiveau); | ||||
|       const fromNiveau = competence.system.niveau; | ||||
|       await competence.update({ 'system.niveau': toNiveau }, { render: false }) | ||||
|       await competence.update({ 'system.niveau': toNiveau }, { render: true }) | ||||
|       await ExperienceLog.add(this, XP_TOPIC.NIVEAU, fromNiveau, toNiveau, competence.name, true); | ||||
|     } | ||||
|   } | ||||
| @@ -1048,20 +1052,10 @@ export class RdDActor extends RdDBaseActorSang { | ||||
|   } | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   async deleteRencontreTMRAtPosition() { | ||||
|     const rencontreIds = this.itemTypes[ITEM_TYPES.rencontre].filter(this.filterRencontreTMRDemiReve()).map(it => it.id) | ||||
|     if (rencontreIds.length > 0) { | ||||
|       await this.deleteEmbeddedDocuments('Item', rencontreIds) | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   getRencontreTMREnAttente() { | ||||
|     return this.itemTypes[ITEM_TYPES.rencontre].find(this.filterRencontreTMRDemiReve()) | ||||
|   } | ||||
|  | ||||
|   filterRencontreTMRDemiReve() { | ||||
|     const position = this.getDemiReve() | ||||
|     return it => it.system.coord == position | ||||
|     return this.itemTypes[ITEM_TYPES.rencontre].find(it => it.system.coord == position) | ||||
|   } | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
| @@ -1771,7 +1765,7 @@ export class RdDActor extends RdDBaseActorSang { | ||||
|     if (reveActuel == 0) { // 0 points de reve | ||||
|       ChatMessage.create({ content: this.name + " est réduit à 0 Points de Rêve, et tombe endormi !" }); | ||||
|     } | ||||
|     if (!rollData.isSortReserve) { | ||||
|     if (!rollData.isSortReserve || !rolled.isSuccess) { | ||||
|       this.tmrApp?.close(); | ||||
|     } | ||||
|   } | ||||
| @@ -1801,10 +1795,8 @@ export class RdDActor extends RdDBaseActorSang { | ||||
|     }; | ||||
|     RollDataAjustements.calcul(rollData, this); | ||||
|     await RdDResolutionTable.rollData(rollData); | ||||
|     await RdDRollResult.displayRollData(rollData, this) | ||||
|  | ||||
|     this.gererExperience(rollData); | ||||
|  | ||||
|     await RdDRollResult.displayRollData(rollData, this) | ||||
|     return rollData.rolled; | ||||
|   } | ||||
|  | ||||
| @@ -2119,7 +2111,6 @@ export class RdDActor extends RdDBaseActorSang { | ||||
|         label: "Jet de méditation", | ||||
|         callbacks: [ | ||||
|           this.createCallbackExperience(), | ||||
|           { condition: r => r.rolled.isEPart, action: r => this._meditationEPart(r) }, | ||||
|           { action: r => this._meditationResult(r) } | ||||
|         ] | ||||
|       }); | ||||
| @@ -2128,21 +2119,16 @@ export class RdDActor extends RdDBaseActorSang { | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   async _meditationResult(meditationRoll) { | ||||
|     this.santeIncDec("fatigue", 2); | ||||
|  | ||||
|     if (meditationRoll.rolled.isSuccess) { | ||||
|       await this.createEmbeddedDocuments("Item", [RdDItemSigneDraconique.prepareSigneDraconiqueMeditation(meditationRoll.meditation, meditationRoll.rolled)]); | ||||
|     } | ||||
|  | ||||
|     if (meditationRoll.rolled.isEPart){ | ||||
|       await this.updateEmbeddedDocuments('Item', [{ _id: meditationRoll.meditation._id, 'system.malus': meditationRoll.meditation.system.malus - 1 }]); | ||||
|     } | ||||
|     await this.santeIncDec("fatigue", 2); | ||||
|     await RdDRollResult.displayRollData(meditationRoll, this.name, 'chat-resultat-meditation.hbs'); | ||||
|   } | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   _meditationEPart(meditationRoll) { | ||||
|     this.updateEmbeddedDocuments('Item', [{ _id: meditationRoll.meditation._id, 'system.malus': meditationRoll.meditation.system.malus - 1 }]); | ||||
|   } | ||||
|  | ||||
|  | ||||
|   /* -------------------------------------------- */ | ||||
|   _getSignesDraconiques(coord) { | ||||
|     const type = TMRUtility.getTMRType(coord); | ||||
|   | ||||
| @@ -341,6 +341,9 @@ export class RdDBaseActorReve extends RdDBaseActor { | ||||
|     const selectedCaracName = ['apparence', 'perception', 'force', 'reve'].find(it => carac[it] != undefined) | ||||
|  | ||||
|     await this.openRollDialog({ | ||||
|       name: 'jet-quelconque', | ||||
|       label: 'Jet', | ||||
|       template: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll.hbs', | ||||
|       rollData: { | ||||
|         alias: this.getAlias(), | ||||
|         carac: carac, | ||||
|   | ||||
| @@ -39,7 +39,12 @@ export class RdDBaseActorSang extends RdDBaseActorReve { | ||||
|     return 0; | ||||
|   } | ||||
|  | ||||
|   getFatigueRestante() { return this.getFatigueMax() - this.getFatigueActuelle() } | ||||
|   isCumulFatigueCauseSommeil(cumulFatigue){ | ||||
|     return ReglesOptionnelles.isUsing("appliquer-fatigue") | ||||
|     ? (this.getFatigueRestante() <= cumulFatigue) | ||||
|     : (this.getEnduranceActuelle() <= cumulFatigue) | ||||
|   } | ||||
|   getFatigueRestante() {return this.getFatigueMax() - this.getFatigueActuelle() } | ||||
|   getFatigueMin() { return this.system.sante.endurance.max - this.system.sante.endurance.value } | ||||
|  | ||||
|   malusFatigue() { | ||||
|   | ||||
| @@ -14,11 +14,12 @@ import { ItemAction } from "../item/item-actions.js"; | ||||
|  * Extend the basic ActorSheet with some very simple modifications | ||||
|  * @extends {ActorSheet} | ||||
|  */ | ||||
| export class RdDBaseActorSheet extends ActorSheet { | ||||
| export class RdDBaseActorSheet extends foundry.appv1.sheets.ActorSheet { | ||||
|   static _warnedAppV1 = true | ||||
|  | ||||
|   /** @override */ | ||||
|   static get defaultOptions() { | ||||
|     return foundry.utils.mergeObject(ActorSheet.defaultOptions, { | ||||
|     return foundry.utils.mergeObject(foundry.appv1.sheets.ActorSheet.defaultOptions, { | ||||
|       classes: ["rdd", "sheet", "actor"], | ||||
|       tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "carac" }], | ||||
|       dragDrop: [{ dragSelector: ".item-list .item", dropSelector: undefined }], | ||||
|   | ||||
| @@ -213,6 +213,7 @@ export class RdDBaseActor extends Actor { | ||||
|   isCreatureEntite() { return this.isCreature() || this.isEntite() } | ||||
|   isCreature() { return false } | ||||
|   isEntite(typeentite = []) { return false } | ||||
|   isHautRevant() { return false } | ||||
|   isVehicule() { return false } | ||||
|   isPersonnage() { return false } | ||||
|   getItem(id, type = undefined) { | ||||
| @@ -734,7 +735,7 @@ export class RdDBaseActor extends Actor { | ||||
|       name: this.getAlias(), | ||||
|       system: { description: this.system.description } | ||||
|     } | ||||
|     renderTemplate('systems/foundryvtt-reve-de-dragon/templates/post-actor.hbs', chatData) | ||||
|     foundry.applications.handlebars.renderTemplate('systems/foundryvtt-reve-de-dragon/templates/post-actor.hbs', chatData) | ||||
|       .then(html => ChatMessage.create(RdDUtility.chatDataSetup(html, modeOverride))); | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,4 @@ | ||||
| import { DialogItemAchat } from "../achat-vente/dialog-item-achat.js"; | ||||
| import { RdDItem } from "../item.js"; | ||||
| import { RdDUtility } from "../rdd-utility.js"; | ||||
| import { RdDBaseActorSheet } from "./base-actor-sheet.js"; | ||||
|  | ||||
| /** | ||||
| @@ -44,13 +42,8 @@ export class RdDCommerceSheet extends RdDBaseActorSheet { | ||||
|   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; | ||||
|  | ||||
|     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 => { | ||||
|       const newQuantite = Math.max(0, Number.parseInt(this.html.find(event.currentTarget).val())); | ||||
|       await this.getItem(event)?.update({ "system.quantite": newQuantite }); | ||||
| @@ -64,28 +57,4 @@ export class RdDCommerceSheet extends RdDBaseActorSheet { | ||||
|   getTypesInventaire() { | ||||
|     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() | ||||
|     }); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,4 +1,6 @@ | ||||
| import { DialogItemAchat } from "../achat-vente/dialog-item-achat.js"; | ||||
| import { Misc } from "../misc.js"; | ||||
| import { RdDUtility } from "../rdd-utility.js"; | ||||
| import { RdDBaseActor } from "./base-actor.js"; | ||||
|  | ||||
| export class RdDCommerce extends RdDBaseActor { | ||||
| @@ -37,4 +39,27 @@ export class RdDCommerce extends RdDBaseActor { | ||||
|     const pourcentage = this.system.pourcentage ?? 100; | ||||
|     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() | ||||
|     }); | ||||
|   } | ||||
|    | ||||
| } | ||||
| @@ -7,7 +7,7 @@ import { CATEGORIES_COMPETENCES, CATEGORIES_DRACONIC, Mapping } from "./mapping. | ||||
|  | ||||
| export class RdDActorExportSheet extends RdDActorSheet { | ||||
|   static init() { | ||||
|     loadTemplates([ | ||||
|     foundry.applications.handlebars.loadTemplates([ | ||||
|       "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/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/sort.hbs", | ||||
|     ]) | ||||
|     Actors.registerSheet(SYSTEM_RDD, RdDActorExportSheet, { types: ["personnage"], makeDefault: false, label: "Feuille simplifiée" }) | ||||
|     foundry.documents.collections.Actors.registerSheet(SYSTEM_RDD, RdDActorExportSheet, { types: ["personnage"], makeDefault: false, label: "Feuille simplifiée" }) | ||||
|   } | ||||
|  | ||||
|   static get defaultOptions() { | ||||
|   | ||||
| @@ -3,7 +3,7 @@ import { Misc } from "../../misc.js" | ||||
| import { EXPORT_CSV_SCRIPTARIUM, OptionsAvancees } from "../../settings/options-avancees.js" | ||||
| import { Mapping } from "./mapping.js" | ||||
|  | ||||
| const IMG_SCRIPTARIUM = '<img class="context-menu-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/scriptarium.svg">' | ||||
| const IMG_SCRIPTARIUM = '<img class="context-menu-img" src="systems/foundryvtt-reve-de-dragon/assets/ui/scriptarium.svg">' | ||||
|  | ||||
| export class ExportScriptarium { | ||||
|  | ||||
| @@ -12,14 +12,18 @@ export class ExportScriptarium { | ||||
|   } | ||||
|  | ||||
|   constructor() { | ||||
|     Hooks.on("getActorDirectoryFolderContext", (actorDirectory, menus) => { ExportScriptarium.INSTANCE.onActorDirectoryMenu(actorDirectory, menus) }) | ||||
|     Hooks.on("getActorDirectoryEntryContext", (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("getActorContextOptions", (actorDirectory, menus) => { ExportScriptarium.INSTANCE.onActorDirectoryMenu(actorDirectory, menus) }) | ||||
|  | ||||
|   } | ||||
|  | ||||
|   onActorDirectoryMenu(actorDirectory, menus) { | ||||
|     // DEBUG console.log("ExportScriptarium.onActorDirectoryMenu", actorDirectory, menus) | ||||
|     menus.push({ | ||||
|       name: 'Export Personnages <i class="fa-regular fa-file-csv"></i>', | ||||
|       icon: IMG_SCRIPTARIUM, | ||||
|       name: 'Export Personnages', | ||||
|       icon: '<i class="fa-solid fa-download"></i>', //IMG_SCRIPTARIUM, | ||||
|       condition: (target) => game.user.isGM && | ||||
|         OptionsAvancees.isUsing(EXPORT_CSV_SCRIPTARIUM) && | ||||
|         this.$getActors(actorDirectory, target).length > 0, | ||||
| @@ -28,22 +32,28 @@ export class ExportScriptarium { | ||||
|   } | ||||
|  | ||||
|   $getTargetName(actorDirectory, target) { | ||||
|     target = $(target) | ||||
|     const li = target.closest(".directory-item") | ||||
|     const folderId = li.data("folderId") | ||||
|     const actorId = li.data("documentId") | ||||
|     const actorId = li.data("entryId") | ||||
|     return actorId | ||||
|       ? game.actors.get(actorId).name | ||||
|       : actorDirectory.folders.find(it => it.id == folderId).name | ||||
|       : actorDirectory.collection.filter(it => it.folder.id == folderId).name | ||||
|   } | ||||
|  | ||||
|   $getActors(actorDirectory, target) { | ||||
|     if (actorDirectory.id != "actors") { | ||||
|       return [] | ||||
|     } | ||||
|     // DEBUG console.log("ExportScriptarium.$getActors", actorDirectory, target) | ||||
|     target = $(target) | ||||
|     const li = target.closest(".directory-item") | ||||
|     const folderId = li.data("folderId") | ||||
|     const actorId = li.data("documentId") | ||||
|     const actorId = li.data("entryId") | ||||
|     const actors = actorId | ||||
|       ? [game.actors.get(actorId)] | ||||
|       : folderId | ||||
|         ? actorDirectory.folders.find(it => it.id == folderId).contents | ||||
|         ? actorDirectory.collection.filter(it => it.folder.id == folderId) | ||||
|         : [] | ||||
|     return actors.filter(it => it.type == ACTOR_TYPES.personnage) | ||||
|   } | ||||
| @@ -54,7 +64,7 @@ export class ExportScriptarium { | ||||
|     const actorLines = actors.map(actor => Misc.join(this.getActorLine(actor), ';')) | ||||
|     const data = Misc.join([header, ...actorLines], eol) | ||||
|     const filename = `scriptarium-${targetName?.slugify()}.csv`; | ||||
|     saveDataToFile(data, "text/csv;charset=windows-1252", `${filename}`); | ||||
|     foundry.utils.saveDataToFile(data, "text/csv;charset=windows-1252", `${filename}`); | ||||
|   } | ||||
|  | ||||
|   getHeaderLine() { | ||||
|   | ||||
| @@ -26,7 +26,7 @@ const RANDOM_VALUES = { | ||||
|  | ||||
| export class AppPersonnageAleatoire extends FormApplication { | ||||
|   static preloadHandlebars() { | ||||
|     loadTemplates([ | ||||
|     foundry.applications.handlebars.loadTemplates([ | ||||
|       'systems/foundryvtt-reve-de-dragon/templates/actor/random/champ-aleatoire.hbs', | ||||
|     ]) | ||||
|   } | ||||
|   | ||||
							
								
								
									
										5
									
								
								module/applications/sheets/_module.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,5 @@ | ||||
| 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" | ||||
|  | ||||
							
								
								
									
										111
									
								
								module/applications/sheets/common-item-sheet.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,111 @@ | ||||
| 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 | ||||
| } | ||||
							
								
								
									
										35
									
								
								module/applications/sheets/monnaie-sheet.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,35 @@ | ||||
| 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) | ||||
|     ) | ||||
|   } | ||||
| } | ||||
							
								
								
									
										34
									
								
								module/applications/sheets/munition-sheet.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,34 @@ | ||||
| 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) | ||||
|     ) | ||||
|   } | ||||
| } | ||||
							
								
								
									
										33
									
								
								module/applications/sheets/tarot-sheet.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,33 @@ | ||||
| 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) | ||||
|     ) | ||||
|   } | ||||
| } | ||||
| @@ -13,7 +13,7 @@ const TEXT_ROLL_MANAGERS = [ | ||||
|  | ||||
| export class RdDTextEditor { | ||||
|   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}) { | ||||
| @@ -30,7 +30,7 @@ export class RdDTextEditor { | ||||
|       context.text = await manager.onReplaceRoll(context); | ||||
|     } | ||||
|  | ||||
|     return await TextEditor.enrichHTML(context.text, { | ||||
|     return await foundry.applications.ux.TextEditor.implementation.enrichHTML(context.text, { | ||||
|       relativeTo: object, | ||||
|       secrets: object?.isOwner, | ||||
|       async: true | ||||
|   | ||||
| @@ -5,7 +5,7 @@ import { RdDUtility } from "../../rdd-utility.js"; | ||||
| import { RdDAlchimie } from "../../rdd-alchimie.js"; | ||||
| import { TextRollManager } from "./text-roll-formatter.js"; | ||||
|  | ||||
| const REGEX_ALCHIMIE_TERMES = "(?<termes>(\\w|-)+)" | ||||
| const REGEX_ALCHIMIE_TERMES = "(?<termes>([-A-Za-zÀ-ÖØ-öø-ÿ ])+)" | ||||
| const REGEX_ALCHIMIE_MANIP = "(?<manip>(couleur|consistance))" | ||||
| const XREGEXP_ROLL_ALCHIMIE = XRegExp("@roll\\[" + REGEX_ALCHIMIE_MANIP + "\\s+" + REGEX_ALCHIMIE_TERMES + "\\]", 'giu') | ||||
| const XREGEXP_ROLL_ALCHIMIE_MANIP = XRegExp("@" + REGEX_ALCHIMIE_MANIP + "\\{" + REGEX_ALCHIMIE_TERMES + "\\}", 'giu') | ||||
|   | ||||
| @@ -10,7 +10,7 @@ import { RdDTextEditor } from "./apps/rdd-text-roll-editor.js"; | ||||
| export class ChatUtility { | ||||
|  | ||||
|   static async init() { | ||||
|     Hooks.on("renderChatMessage", async (app, html, msg) => await ChatUtility.onRenderChatMessage(app, html, msg)) | ||||
|     Hooks.on("renderChatMessageHTML", async (app, html, msg) => await ChatUtility.onRenderChatMessage(app, html, msg)) | ||||
|     Hooks.on("createChatMessage", async (chatMessage, options, id) => await ChatUtility.onCreateChatMessage(chatMessage, options, id)) | ||||
|   } | ||||
|  | ||||
| @@ -190,8 +190,8 @@ export class ChatUtility { | ||||
|     if (rddTimestamp) { | ||||
|       const timestamp = new RdDTimestamp(rddTimestamp); | ||||
|       const timestampData = timestamp.toCalendrier(); | ||||
|       const dateHeure = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/common/date-heure.hbs', timestampData); | ||||
|       html.find('header.message-header .message-sender').after(dateHeure) | ||||
|       const dateHeure = await foundry.applications.handlebars.renderTemplate('systems/foundryvtt-reve-de-dragon/templates/common/date-heure.hbs', timestampData); | ||||
|       $(html).find('header.message-header .message-sender').after(dateHeure) | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -5,13 +5,13 @@ const INFO_COEUR = 'info-coeur'; | ||||
|  | ||||
| export class RdDCoeur { | ||||
|   static registerChatCallbacks(html) { | ||||
|     html.on("click", 'a.accepter-tendre-moment', event => { | ||||
|     $(html).on("click", 'a.accepter-tendre-moment', 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)) | ||||
|     }) | ||||
|     html.on("click", 'a.perdre-point-coeur-douceur', event => { | ||||
|     $(html).on("click", 'a.perdre-point-coeur-douceur', event => { | ||||
|       RdDCoeur.perdreEnDouceur( | ||||
|         RdDCoeur.extractInfoCoeur(event), | ||||
|         event.currentTarget.attributes['data-actor-id'].value) | ||||
|   | ||||
							
								
								
									
										8
									
								
								module/common/_module.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,8 @@ | ||||
| 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] | ||||
|  | ||||
							
								
								
									
										10
									
								
								module/common/common-template.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,10 @@ | ||||
| /** | ||||
|  * 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) { } | ||||
| } | ||||
							
								
								
									
										32
									
								
								module/common/description.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,32 @@ | ||||
| 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 } | ||||
|   } | ||||
|  | ||||
| } | ||||
							
								
								
									
										9
									
								
								module/common/field-types.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,9 @@ | ||||
| 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 } | ||||
|  | ||||
							
								
								
									
										36
									
								
								module/common/inventaire.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,36 @@ | ||||
| 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 {} | ||||
|   } | ||||
| } | ||||
							
								
								
									
										3
									
								
								module/documents/_module.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,3 @@ | ||||
| export { default as RdDModelMonnaie } from "./monnaie.mjs" | ||||
| export { default as RdDModelMunition } from "./munition.mjs" | ||||
| export { default as RdDModelTarot } from "./tarot.mjs" | ||||
							
								
								
									
										11
									
								
								module/documents/monnaie.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,11 @@ | ||||
| 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); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										7
									
								
								module/documents/munition.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,7 @@ | ||||
| import { RdDItem } from "../item.js"; | ||||
|  | ||||
| export default class RdDItemMunition extends RdDItem { | ||||
|   static get defaultIcon() { | ||||
|     return 'systems/foundryvtt-reve-de-dragon/icons/objets/fleche.webp' | ||||
|   } | ||||
| } | ||||
							
								
								
									
										7
									
								
								module/documents/tarot.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,7 @@ | ||||
| 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' | ||||
|   } | ||||
| } | ||||
| @@ -4,8 +4,7 @@ import { Misc } from "../misc.js" | ||||
|  | ||||
| export const ACTION_ITEM_ENCHANTER =  { | ||||
|   code: 'item-enchanter', label: 'Enchanter', icon: it => 'fa-solid fa-sparkles', | ||||
|   filter: it => game.user.isGM || DialogEnchanter.isEnchantable(it), | ||||
|   optionsFilter: options => options.editable, | ||||
|   filter: it => game.user.isGM || DialogEnchanter.isEnchantable(it) && it.parent?.type != ACTOR_TYPES.commerce, | ||||
|   action: (item, actor) => DialogEnchanter.enchanter(item) | ||||
| } | ||||
|  | ||||
|   | ||||