Compare commits
	
		
			50 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 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 | 
@@ -1,6 +1,6 @@
 | 
			
		||||
name: Release Creation
 | 
			
		||||
 | 
			
		||||
on: 
 | 
			
		||||
on:
 | 
			
		||||
  release:
 | 
			
		||||
    types: [published]
 | 
			
		||||
 | 
			
		||||
@@ -9,9 +9,11 @@ jobs:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
    - run: echo "💡 The ${{ gitea.repository }} repository will cloned to the runner."
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    #- 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
 | 
			
		||||
@@ -29,7 +31,7 @@ jobs:
 | 
			
		||||
        url: https://www.uberwald.me/gitea/${{gitea.repository}}
 | 
			
		||||
        manifest: https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/system.json
 | 
			
		||||
        download: https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/rddsystem.zip
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    - name: Set up Node.js
 | 
			
		||||
      uses: actions/setup-node@v2
 | 
			
		||||
      with:
 | 
			
		||||
@@ -37,7 +39,7 @@ jobs:
 | 
			
		||||
 | 
			
		||||
    - name: Install dependencies
 | 
			
		||||
      run: npm install
 | 
			
		||||
      
 | 
			
		||||
 | 
			
		||||
    - name: Build the compendiums
 | 
			
		||||
      run: node ./tools/packCompendiumsToDist.mjs
 | 
			
		||||
 | 
			
		||||
@@ -46,29 +48,29 @@ 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
 | 
			
		||||
      with:
 | 
			
		||||
        go-version: '>=1.20.1'
 | 
			
		||||
    
 | 
			
		||||
    - name: Use Go Action  
 | 
			
		||||
 | 
			
		||||
    - name: Use Go Action
 | 
			
		||||
      id: use-go-action
 | 
			
		||||
      uses: https://gitea.com/actions/release-action@main
 | 
			
		||||
      with:
 | 
			
		||||
        files: |-
 | 
			
		||||
          ./rddsystem.zip  
 | 
			
		||||
          ./rddsystem.zip
 | 
			
		||||
          system.json
 | 
			
		||||
        api_key: '${{secrets.ALLOW_PUSH_RELEASE}}'
 | 
			
		||||
 | 
			
		||||
    - name: Publish to Foundry server  
 | 
			
		||||
    - name: Publish to Foundry server
 | 
			
		||||
      uses: djlechuck/foundryvtt-publish-package-action@v1
 | 
			
		||||
      with:
 | 
			
		||||
        token: ${{ secrets.FOUNDRYVTT_RELEASE_TOKEN }}
 | 
			
		||||
        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  | 
							
								
								
									
										87
									
								
								changelog.md
									
									
									
									
									
								
							
							
						
						@@ -1,4 +1,76 @@
 | 
			
		||||
# 13.0
 | 
			
		||||
 | 
			
		||||
## 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é
 | 
			
		||||
- les possessions utilisent maintenant correctement le rêve actuel
 | 
			
		||||
- les sorts variables ne causent plus de soucis de voie pour le lancement de sorts
 | 
			
		||||
- les acteurs ayant un sort avec un coût de rêve entier ne sont plus considérés
 | 
			
		||||
  comme pouvant avoir un rêve variable
 | 
			
		||||
 | 
			
		||||
## 12.0.42 - Les errements d'Astrobazzarh
 | 
			
		||||
 | 
			
		||||
- Correction de différentes automatisations de combat incorrectes
 | 
			
		||||
- Correction des jets `@roll[vue/-2]` qui tentaient de chercher une compétence -2 (à cause des armes à 1/2 mains)
 | 
			
		||||
 | 
			
		||||
## 12.0.41 - La loupe d'Astrobazzarh
 | 
			
		||||
- On peut de nouveau effectuer des tirages cachés
 | 
			
		||||
- Le stress transformé est bien diminué lorsqu'on met le stress dans une compétence
 | 
			
		||||
 | 
			
		||||
## 12.0.40 - Les mains d'Astrobazzarh
 | 
			
		||||
- correction des attaques particulières en combat
 | 
			
		||||
- correction de message sur les min/max liés aux modificateurs de races (s'applique uniquement sur la taille)
 | 
			
		||||
 | 
			
		||||
## 12.0.39 - Les mains d'Astrobazzarh
 | 
			
		||||
- les armes à 1 ou 2 mains fonctionnent dans les liens de jets de dés
 | 
			
		||||
- commande `/jet` pour poster une demande de jet de dés
 | 
			
		||||
@@ -39,8 +111,8 @@
 | 
			
		||||
- support de liens "jets de dés"
 | 
			
		||||
  - on peut ajouter des liens "jet de dés" dans les journaux, descriptions, notes, maladresses, ...
 | 
			
		||||
  - avec la syntaxe `@roll[...]` on peut ajouter le lien vers:
 | 
			
		||||
    - un jet de caractéristique/compétence `@roll[carac/competence/difficulte]` / `@roll[carac/difficulte]` / `@roll[carac/competence]` 
 | 
			
		||||
    - une formule foundry `@roll[2d6]` pour lancer 2d6 
 | 
			
		||||
    - un jet de caractéristique/compétence `@roll[carac/competence/difficulte]` / `@roll[carac/difficulte]` / `@roll[carac/competence]`
 | 
			
		||||
    - une formule foundry `@roll[2d6]` pour lancer 2d6
 | 
			
		||||
    - une manipulation alchimique `@roll[couleur vert-bleu]`
 | 
			
		||||
  - les liens "jet avec caractéristiques" s'appliquent:
 | 
			
		||||
    - à tous les tokens sélectionnés
 | 
			
		||||
@@ -105,7 +177,7 @@
 | 
			
		||||
  - les tas dans les conteneurs peuvent être désempilés sans rendre le conteneur inutilisable
 | 
			
		||||
  - les conteneurs ne peuvent plus être empilés (pour éviter que le contenu de Schroedinger quand on les sépare)
 | 
			
		||||
  - 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
 | 
			
		||||
@@ -216,7 +288,7 @@
 | 
			
		||||
 | 
			
		||||
## 12.0.6 - Le bazar d'Astrobazzarh
 | 
			
		||||
- 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
 | 
			
		||||
    propre contenu, ce qui empêche d'ouvrir la feuille d'acteur.
 | 
			
		||||
  - un objet non-conteneur pouvait dans certains cas avoir un pseudo contenu
 | 
			
		||||
@@ -224,7 +296,7 @@
 | 
			
		||||
    conteneur (et donc non affiché)
 | 
			
		||||
  - vider les conteneurs supprime correctement toutes les informations liées
 | 
			
		||||
    aux conteneurs/contenus
 | 
			
		||||
- Les messages pour les tirages dans le compendium utilisent le "roll mode" 
 | 
			
		||||
- Les messages pour les tirages dans le compendium utilisent le "roll mode"
 | 
			
		||||
  courant pour leur visibilité
 | 
			
		||||
- Fix: restaurer la compatibilité Foundry 11
 | 
			
		||||
 | 
			
		||||
@@ -319,7 +391,7 @@
 | 
			
		||||
 | 
			
		||||
## 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 
 | 
			
		||||
- 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)
 | 
			
		||||
- Ajout d'une icône et transformation en bouton du lien pour accéder à l'astrologie et aux chiffres astraux
 | 
			
		||||
- Suppression de message de log inutile sur chaque point de coeur
 | 
			
		||||
@@ -439,7 +511,7 @@ Vu qu'elles ne peuvent pas être utilisées, permet de savoir pourquoi
 | 
			
		||||
  - le message annonçant le joueur dont c'est le tour ne contient plus d'informations de santé
 | 
			
		||||
  - un message avec les informations de santé est envoyé au Gardienn et au propriétaire du token.acteur
 | 
			
		||||
  - le jet de vie est bien fait par le token si besoin
 | 
			
		||||
  - seul les propriétaires peuvent faire les jets de vie 
 | 
			
		||||
  - seul les propriétaires peuvent faire les jets de vie
 | 
			
		||||
- Amélioration de la fenêtre de jets
 | 
			
		||||
  - le type de dégâts pour les attaques est toujours affiché
 | 
			
		||||
  - le moral est indiqué avant l'icone d'appel au moral
 | 
			
		||||
@@ -546,4 +618,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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2473
									
								
								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 */
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										2100
									
								
								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;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -237,7 +237,11 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
 | 
			
		||||
 | 
			
		||||
    this.html.find('.carac-xp-augmenter').click(async event => await this.actor.updateCaracXPAuto(event.currentTarget.name.replace("augmenter.", "")))
 | 
			
		||||
    this.html.find('.competence-xp-augmenter').click(async event => await this.actor.updateCompetenceXPAuto(RdDSheetUtility.getItemId(event)))
 | 
			
		||||
    this.html.find('.competence-stress-augmenter').click(async event => await this.actor.updateCompetenceStress(RdDSheetUtility.getItemId(event)))
 | 
			
		||||
    this.html.find('.competence-stress-augmenter').click(async event =>{
 | 
			
		||||
      await this.actor.updateCompetenceStress(RdDSheetUtility.getItemId(event))
 | 
			
		||||
      this.render(true)
 | 
			
		||||
    } 
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
    if (this.options.vueDetaillee) {
 | 
			
		||||
      // On carac change
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										187
									
								
								module/actor.js
									
									
									
									
									
								
							
							
						
						@@ -243,7 +243,7 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
    }
 | 
			
		||||
    await this.resetInfoSommeil()
 | 
			
		||||
    ChatMessage.create(message);
 | 
			
		||||
    this.sheet.render(true);
 | 
			
		||||
    setTimeout(() => this.sheet.render(), 20)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async _recuperationSante(message) {
 | 
			
		||||
@@ -279,30 +279,34 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async dormirChateauDormant() {
 | 
			
		||||
    if (!ReglesOptionnelles.isUsing("chateau-dormant-gardien") || !this.system.sommeil || this.system.sommeil.nouveaujour) {
 | 
			
		||||
      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)
 | 
			
		||||
      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();
 | 
			
		||||
      this.sheet.render(true);
 | 
			
		||||
      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);
 | 
			
		||||
    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();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async resetInfoSommeil() {
 | 
			
		||||
    await this.update({
 | 
			
		||||
      'system.sommeil': {
 | 
			
		||||
@@ -442,10 +446,9 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
      message.content += 'Vous ne trouvez pas le sommeil';
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      let jetsReve = [];
 | 
			
		||||
      let dormi = await this.dormirDesHeures(jetsReve, message, heures, options);
 | 
			
		||||
      if (jetsReve.length > 0) {
 | 
			
		||||
        message.content += `Vous récupérez ${jetsReve.map(it => it < 0 ? '0 (réveil)' : it).reduce(Misc.joining("+"))} Points de rêve. `;
 | 
			
		||||
      let dormi = await this.$dormirDesHeures(message, heures, options);
 | 
			
		||||
      if (dormi.jetsReve.length > 0) {
 | 
			
		||||
        message.content += `Vous récupérez ${dormi.jetsReve.map(it => it < 0 ? '0 (réveil)' : it).reduce(Misc.joining("+"))} Points de rêve. `;
 | 
			
		||||
      }
 | 
			
		||||
      if (dormi.etat == 'eveil') {
 | 
			
		||||
        await this.reveilReveDeDragon(message, dormi.heures);
 | 
			
		||||
@@ -458,11 +461,9 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
      ChatMessage.create(message);
 | 
			
		||||
    }
 | 
			
		||||
    if (options.chateauDormant) {
 | 
			
		||||
      await this.dormirChateauDormant();
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      this.sheet.render(true);
 | 
			
		||||
      await this.$dormirChateauDormant();
 | 
			
		||||
    }
 | 
			
		||||
    setTimeout(() => this.sheet.render(), 20)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async reveilReveDeDragon(message, heures) {
 | 
			
		||||
@@ -472,18 +473,18 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async dormirDesHeures(jetsReve, message, heures, options) {
 | 
			
		||||
    const dormi = { heures: 0, etat: 'dort' };
 | 
			
		||||
  async $dormirDesHeures(message, heures, options) {
 | 
			
		||||
    const dormi = { heures: 0, etat: 'dort', jetsReve: [] };
 | 
			
		||||
    for (; dormi.heures < heures && dormi.etat == 'dort'; dormi.heures++) {
 | 
			
		||||
      await this._recupererEthylisme(message);
 | 
			
		||||
      await this.$recupererEthylisme(message);
 | 
			
		||||
      if (options.grisReve) {
 | 
			
		||||
        await this.recupererFatigue(message);
 | 
			
		||||
        await this.$recupererFatigue(message);
 | 
			
		||||
      }
 | 
			
		||||
      else if (!this.system.sommeil?.insomnie) {
 | 
			
		||||
        await this.recupererFatigue(message);
 | 
			
		||||
        dormi.etat = await this.jetRecuperationReve(jetsReve, message);
 | 
			
		||||
        await this.$recupererFatigue(message);
 | 
			
		||||
        await this.$jetRecuperationReve(dormi, message);
 | 
			
		||||
        if (dormi.etat == 'dort' && EffetsDraconiques.isDonDoubleReve(this)) {
 | 
			
		||||
          dormi.etat = await this.jetRecuperationReve(jetsReve, message);
 | 
			
		||||
          await this.$jetRecuperationReve(dormi, message);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
@@ -491,35 +492,36 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async jetRecuperationReve(jetsReve, message) {
 | 
			
		||||
  async $jetRecuperationReve(dormi, message) {
 | 
			
		||||
    if (this.getReveActuel() < this.system.reve.seuil.value) {
 | 
			
		||||
      let reve = await RdDDice.rollTotal("1dr");
 | 
			
		||||
      const reve = await RdDDice.rollTotal("1dr")
 | 
			
		||||
      if (reve >= 7) {
 | 
			
		||||
        // Rêve de Dragon !
 | 
			
		||||
        message.content += `Vous faites un <strong>Rêve de Dragon</strong> de ${reve} Points de rêve qui vous réveille! `;
 | 
			
		||||
        await this.combattreReveDeDragon(reve);
 | 
			
		||||
        jetsReve.push(-1);
 | 
			
		||||
        return 'eveil';
 | 
			
		||||
        dormi.jetsReve.push(-1);
 | 
			
		||||
        dormi.etat = 'eveil'
 | 
			
		||||
        return
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
        if (!ReglesOptionnelles.isUsing("recuperation-reve")) {
 | 
			
		||||
          ChatMessage.create({
 | 
			
		||||
            whisper: ChatUtility.getOwners(this),
 | 
			
		||||
            content: `Pas de récupération de rêve (${reve} points ignorés)`
 | 
			
		||||
          });
 | 
			
		||||
          jetsReve.push(0);
 | 
			
		||||
          })
 | 
			
		||||
          dormi.jetsReve.push(0)
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
          await this.reveActuelIncDec(reve);
 | 
			
		||||
          jetsReve.push(reve);
 | 
			
		||||
          await this.reveActuelIncDec(reve)
 | 
			
		||||
          dormi.jetsReve.push(reve)
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return 'dort';
 | 
			
		||||
    dormi.etat = 'dort'
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async _recupererEthylisme(message) {
 | 
			
		||||
  async $recupererEthylisme(message) {
 | 
			
		||||
    if (!ReglesOptionnelles.isUsing("recuperation-ethylisme")) { return; }
 | 
			
		||||
    let value = Math.min(Number.parseInt(this.system.compteurs.ethylisme.value) + 1, 1);
 | 
			
		||||
    if (value <= 0) {
 | 
			
		||||
@@ -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. `;
 | 
			
		||||
@@ -549,15 +550,15 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async recupererFatigue(message) {
 | 
			
		||||
  async $recupererFatigue(message) {
 | 
			
		||||
    if (ReglesOptionnelles.isUsing("appliquer-fatigue")) {
 | 
			
		||||
      let fatigue = this.system.sante.fatigue.value;
 | 
			
		||||
      const fatigueMin = this.getFatigueMin();
 | 
			
		||||
      let fatigue = this.system.sante.fatigue.value
 | 
			
		||||
      const fatigueMin = this.getFatigueMin()
 | 
			
		||||
      if (fatigue <= fatigueMin) {
 | 
			
		||||
        return;
 | 
			
		||||
        return
 | 
			
		||||
      }
 | 
			
		||||
      fatigue = Math.max(fatigueMin, this._calculRecuperationSegment(fatigue));
 | 
			
		||||
      await this.update({ "system.sante.fatigue.value": fatigue });
 | 
			
		||||
      fatigue = Math.max(fatigueMin, this._calculRecuperationSegment(fatigue))
 | 
			
		||||
      await this.update({ 'system.sante.fatigue.value': fatigue });
 | 
			
		||||
      if (fatigue == 0) {
 | 
			
		||||
        message.content += "Vous êtes complêtement reposé. ";
 | 
			
		||||
      }
 | 
			
		||||
@@ -667,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);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -736,7 +741,7 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
      await competence.update({
 | 
			
		||||
        "system.xp": toXp,
 | 
			
		||||
        "system.niveau": toNiveau,
 | 
			
		||||
      });
 | 
			
		||||
      }, { render: false })
 | 
			
		||||
      await ExperienceLog.add(this, XP_TOPIC.XP, fromXp, toXp, competence.name);
 | 
			
		||||
      await ExperienceLog.add(this, XP_TOPIC.NIVEAU, fromNiveau, toNiveau, competence.name);
 | 
			
		||||
    }
 | 
			
		||||
@@ -767,7 +772,7 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
    await competence.update({
 | 
			
		||||
      "system.xp": newXp,
 | 
			
		||||
      "system.niveau": toNiveau,
 | 
			
		||||
    });
 | 
			
		||||
    }, { render: false })
 | 
			
		||||
    const toXpStress = Math.max(0, fromXpStress - xpUtilise);
 | 
			
		||||
    await this.update({ "system.compteurs.experience.value": toXpStress });
 | 
			
		||||
 | 
			
		||||
@@ -783,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 });
 | 
			
		||||
      await competence.update({ 'system.niveau': toNiveau }, { render: true })
 | 
			
		||||
      await ExperienceLog.add(this, XP_TOPIC.NIVEAU, fromNiveau, toNiveau, competence.name, true);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
@@ -808,7 +813,7 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
      if (isNaN(toXp) || typeof (toXp) != 'number') toXp = 0;
 | 
			
		||||
      const fromXp = competence.system.xp;
 | 
			
		||||
      this.checkCompetenceXP(idOrName, toXp);
 | 
			
		||||
      await competence.update({ 'system.xp': toXp });
 | 
			
		||||
      await competence.update({ 'system.xp': toXp }, { render: false })
 | 
			
		||||
      await ExperienceLog.add(this, XP_TOPIC.XP, fromXp, toXp, competence.name, true);
 | 
			
		||||
      if (toXp > fromXp) {
 | 
			
		||||
        RdDUtility.checkThanatosXP(competence)
 | 
			
		||||
@@ -822,7 +827,7 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
    if (competence) {
 | 
			
		||||
      if (isNaN(toXpSort) || typeof (toXpSort) != 'number') toXpSort = 0;
 | 
			
		||||
      const fromXpSort = competence.system.xp_sort;
 | 
			
		||||
      await competence.update({ 'system.xp_sort': toXpSort });
 | 
			
		||||
      await competence.update({ 'system.xp_sort': toXpSort }, { render: false })
 | 
			
		||||
      await ExperienceLog.add(this, XP_TOPIC.XPSORT, fromXpSort, toXpSort, competence.name, true);
 | 
			
		||||
      if (toXpSort > fromXpSort) {
 | 
			
		||||
        RdDUtility.checkThanatosXP(competence)
 | 
			
		||||
@@ -834,7 +839,7 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
  async updateCompetenceArchetype(idOrName, compValue) {
 | 
			
		||||
    let competence = this.getCompetence(idOrName)
 | 
			
		||||
    if (competence) {
 | 
			
		||||
      await competence.update({ 'system.niveau_archetype': Math.max(compValue ?? 0, 0) });
 | 
			
		||||
      await competence.update({ 'system.niveau_archetype': Math.max(compValue ?? 0, 0) })
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -1047,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)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
@@ -1560,7 +1555,7 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
    if (!rollData.rolled.isPart ||
 | 
			
		||||
      rollData.finalLevel >= 0 ||
 | 
			
		||||
      game.settings.get("core", "rollMode") == 'selfroll' ||
 | 
			
		||||
	  !Misc.hasConnectedGM()) {
 | 
			
		||||
      !Misc.hasConnectedGM()) {
 | 
			
		||||
      return
 | 
			
		||||
    }
 | 
			
		||||
    hideChatMessage = hideChatMessage == 'hide' || (Misc.isRollModeHiddenToPlayer() && !game.user.isGM)
 | 
			
		||||
@@ -1584,7 +1579,7 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async _appliquerAppelMoral(rollData) {
 | 
			
		||||
    if (!rollData.use.moral || game.settings.get("core", "rollMode") == 'selfroll'){
 | 
			
		||||
    if (!rollData.use.moral || game.settings.get("core", "rollMode") == 'selfroll') {
 | 
			
		||||
      return
 | 
			
		||||
    }
 | 
			
		||||
    if (rollData.rolled.isEchec ||
 | 
			
		||||
@@ -1770,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();
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
@@ -1869,7 +1864,7 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
        competence: competence,
 | 
			
		||||
        show: { title: options?.title ?? '' }
 | 
			
		||||
      },
 | 
			
		||||
	  // TODO:
 | 
			
		||||
      // TODO:
 | 
			
		||||
      callbacks: [{ action: r => this.$onRollCompetence(r, options) }]
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
@@ -1882,7 +1877,7 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
    compData.system.defaut_carac = tacheData.system.carac; // Patch !
 | 
			
		||||
 | 
			
		||||
    await this.openRollDialog({
 | 
			
		||||
          name: 'jet-competence',
 | 
			
		||||
      name: 'jet-competence',
 | 
			
		||||
      label: 'Jet de Tâche ' + tacheData.name,
 | 
			
		||||
      template: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-competence.hbs',
 | 
			
		||||
      rollData: {
 | 
			
		||||
@@ -1945,9 +1940,9 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    await this.openRollDialog({
 | 
			
		||||
          name: `jet-${artData.art}`,
 | 
			
		||||
      name: `jet-${artData.art}`,
 | 
			
		||||
      label: `${artData.verbe} ${oeuvre.name}`,
 | 
			
		||||
          template: `systems/foundryvtt-reve-de-dragon/templates/dialog-roll-${oeuvre.type}.hbs`,
 | 
			
		||||
      template: `systems/foundryvtt-reve-de-dragon/templates/dialog-roll-${oeuvre.type}.hbs`,
 | 
			
		||||
      rollData: artData,
 | 
			
		||||
      callbacks: [{ action: callbackAction }],
 | 
			
		||||
    })
 | 
			
		||||
@@ -2116,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) }
 | 
			
		||||
        ]
 | 
			
		||||
      });
 | 
			
		||||
@@ -2125,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);
 | 
			
		||||
@@ -2527,7 +2516,6 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
      })
 | 
			
		||||
    }
 | 
			
		||||
    const blessure = this.getItem(blessureId, 'blessure')
 | 
			
		||||
    console.log('TODO update blessure', this, blessureId, rollData, rollData.tache);
 | 
			
		||||
    if (blessure && !blessure.system.premierssoins.done) {
 | 
			
		||||
      const tache = rollData.tache;
 | 
			
		||||
      if (rollData.rolled.isETotal) {
 | 
			
		||||
@@ -2644,12 +2632,13 @@ export class RdDActor extends RdDBaseActorSang {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
  async incDecItemUse(itemId, inc = 1) {
 | 
			
		||||
    const currentItemUse = this.getFlag(SYSTEM_RDD, 'itemUse');
 | 
			
		||||
    let itemUse = currentItemUse ? foundry.utils.duplicate(currentItemUse) : {};
 | 
			
		||||
    itemUse[itemId] = (itemUse[itemId] ?? 0) + inc;
 | 
			
		||||
    await this.setFlag(SYSTEM_RDD, 'itemUse', itemUse);
 | 
			
		||||
    console.log("ITEM USE INC", inc, itemUse);
 | 
			
		||||
  async incDecItemUse(itemId, shouldIncrease = true) {
 | 
			
		||||
    if (shouldIncrease) {
 | 
			
		||||
      const currentItemUse = this.getFlag(SYSTEM_RDD, 'itemUse');
 | 
			
		||||
      let itemUse = currentItemUse ? foundry.utils.duplicate(currentItemUse) : {};
 | 
			
		||||
      itemUse[itemId] = (itemUse[itemId] ?? 0) + 1;
 | 
			
		||||
      await this.setFlag(SYSTEM_RDD, 'itemUse', itemUse);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
 
 | 
			
		||||
@@ -277,14 +277,9 @@ export class RdDBaseActorReve extends RdDBaseActor {
 | 
			
		||||
    return dialog
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  createEmptyCallback() {
 | 
			
		||||
    return {
 | 
			
		||||
      condition: r => false,
 | 
			
		||||
      action: r => { }
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
  createCallbackExperience() { return this.createEmptyCallback(); }
 | 
			
		||||
  createCallbackAppelAuMoral() { return this.createEmptyCallback(); }
 | 
			
		||||
  createCallbackExperience() { return { action: r => { } } }
 | 
			
		||||
  createCallbackAppelAuMoral() { return { action: r => { } } }
 | 
			
		||||
 | 
			
		||||
  async _onCloseRollDialog(html) { }
 | 
			
		||||
 | 
			
		||||
  async rollCaracCompetence(caracName, compName, diff, options = { title: "" }) {
 | 
			
		||||
 
 | 
			
		||||
@@ -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 }],
 | 
			
		||||
 
 | 
			
		||||
@@ -244,16 +244,19 @@ export class RdDBaseActor extends Actor {
 | 
			
		||||
  async onUpdateActor(update, options, actorId) { }
 | 
			
		||||
  async onDeleteItem(item, options, id) {
 | 
			
		||||
    if (item.isInventaire()) {
 | 
			
		||||
      this._removeItemFromConteneur(item)
 | 
			
		||||
      await this._removeItemFromConteneur(item)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _removeItemFromConteneur(item) {
 | 
			
		||||
    this.items.filter(it => it.isConteneur() && it.system.contenu.includes(item.id))
 | 
			
		||||
      .forEach(conteneur => {
 | 
			
		||||
        const nouveauContenu = conteneur.system.contenu.filter(id => id != item.id);
 | 
			
		||||
        conteneur.update({ 'system.contenu': nouveauContenu });
 | 
			
		||||
      });
 | 
			
		||||
  async _removeItemFromConteneur(item) {
 | 
			
		||||
    const updates = this.items.filter(it => it.isConteneur() && it.system.contenu.includes(item.id))
 | 
			
		||||
      .map(conteneur => {
 | 
			
		||||
        const nouveauContenu = conteneur.system.contenu.filter(id => id != item.id)
 | 
			
		||||
        return { _id: conteneur.id, 'system.contenu': nouveauContenu }
 | 
			
		||||
      })
 | 
			
		||||
    if (updates.length > 0) {
 | 
			
		||||
      await this.updateEmbeddedDocuments('Item', updates)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async onTimeChanging(oldTimestamp, newTimestamp) {
 | 
			
		||||
@@ -731,7 +734,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)));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -744,7 +747,7 @@ export class RdDBaseActor extends Actor {
 | 
			
		||||
  async jetDeMoral() { this.actionImpossible("jet de moral") }
 | 
			
		||||
 | 
			
		||||
  async resetItemUse() { }
 | 
			
		||||
  async incDecItemUse(itemId, inc = 1) { }
 | 
			
		||||
  async incDecItemUse(itemId, shouldIncrease = true) { }
 | 
			
		||||
  getItemUse(itemId) { return 0; }
 | 
			
		||||
 | 
			
		||||
  async finDeRound(options = { terminer: false }) { }
 | 
			
		||||
 
 | 
			
		||||
@@ -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 {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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')
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@ import { RdDUtility } from "../../rdd-utility.js";
 | 
			
		||||
import { TextRollManager } from "./text-roll-formatter.js";
 | 
			
		||||
 | 
			
		||||
const REGECP_CARAC = "(?<carac>[A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+)"
 | 
			
		||||
const REGEXP_COMP = "(\\/(?<competence>[A-Za-z0-9À-ÖØ-öø-ÿ -]+))?"
 | 
			
		||||
const REGEXP_COMP = "(\\/(?<competence>[A-Za-zÀ-ÖØ-öø-ÿ ]+([1-2]?[A-Za-zÀ-ÖØ-öø-ÿ ]+)?))?"
 | 
			
		||||
const REGEXP_DIFF = "(/(?<diff>[\\+\\-]?\\d+(d\\d+)?))?"
 | 
			
		||||
const REGEXP_ROLL_CARAC_COMP = REGECP_CARAC + REGEXP_COMP + REGEXP_DIFF
 | 
			
		||||
const XREGEXP_ROLL_CARAC_COMP = XRegExp("@roll\\[" + REGEXP_ROLL_CARAC_COMP + "\\]", 'giu')
 | 
			
		||||
 
 | 
			
		||||
@@ -5,12 +5,12 @@ import { RdDTextEditor } from "./apps/rdd-text-roll-editor.js";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class providing helper methods to get the list of users, and 
 | 
			
		||||
 * Class providing helper methods to get the list of users, and
 | 
			
		||||
 */
 | 
			
		||||
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))
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -62,7 +62,6 @@ export class ChatUtility {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* -------------------------------------------- */
 | 
			
		||||
 | 
			
		||||
  static removeMessages(socketData) {
 | 
			
		||||
    if (Misc.isFirstConnectedGM()) {
 | 
			
		||||
      ChatUtility.onRemoveMessages(socketData);
 | 
			
		||||
@@ -97,7 +96,7 @@ export class ChatUtility {
 | 
			
		||||
        }
 | 
			
		||||
        break
 | 
			
		||||
      case "gmroll":
 | 
			
		||||
        messageData.whisper = ChatUtility.getOwners(actor)
 | 
			
		||||
        messageData.whisper = actor ? ChatUtility.getOwners(actor) : ChatUtility.getUserAndGMs()
 | 
			
		||||
        break
 | 
			
		||||
      case "selfroll":
 | 
			
		||||
        messageData.whisper = [game.user]
 | 
			
		||||
@@ -108,7 +107,7 @@ export class ChatUtility {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static getOwners(document) {
 | 
			
		||||
    return game.users.filter(it => document.getUserLevel(it) == CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER)
 | 
			
		||||
    return document ? game.users.filter(it => document.getUserLevel(it) == CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER) : [game.user]
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static getUserAndGMs() {
 | 
			
		||||
@@ -191,15 +190,15 @@ 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)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static async onCreateChatMessage(chatMessage, options, id) {
 | 
			
		||||
    if (chatMessage.isAuthor) {
 | 
			
		||||
      await chatMessage.setFlag(SYSTEM_RDD, 'rdd-timestamp', game.system.rdd.calendrier.getTimestamp());
 | 
			
		||||
      await chatMessage.update({ content: await RdDTextEditor.enrichHTML(chatMessage.content, undefined, {showLink:false}) })
 | 
			
		||||
      await chatMessage.update({ content: await RdDTextEditor.enrichHTML(chatMessage.content, undefined, { showLink: false }) })
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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'
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||