Compare commits
	
		
			123 Commits
		
	
	
		
			10971e9e7b
			...
			13.0.5
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 8d39a0526f | |||
| f83548b91e | |||
| 90d17a3477 | |||
| fb15f3eb38 | |||
| 4df0eab574 | |||
| c8d589f0d2 | |||
| d7470836a5 | |||
| 817fa8e62a | |||
| 0fe4f64343 | |||
| d6b5b0a550 | |||
| c9d87851bd | |||
| 5b48fda3d0 | |||
| abae85157b | |||
| da2dca1769 | |||
| 6e405ea753 | |||
| a96f4bf641 | |||
| a0f42204d5 | |||
| c25320755a | |||
| aa5f159a91 | |||
| bb80391a47 | |||
| 1abb757b6b | |||
| 84c44d1f6d | |||
| ccb939207d | |||
| cd38a197cc | |||
| 6b053b189b | |||
| cc4cbbc771 | |||
| 0850789ed7 | |||
| 7a6ccac7fa | |||
| ed64d823ac | |||
| 3162264afa | |||
| e53eda5b42 | |||
| 47a7564a1c | |||
| f7a6fee51d | |||
| 0b3f08ef29 | |||
| 8df9c8ddf5 | |||
| 4cbe652a91 | |||
| 3eb1179c40 | |||
| cf185844af | |||
| 250b936fae | |||
| cd8268f569 | |||
| c04e0cec78 | |||
| 1d5fe1af71 | |||
| e96a627c37 | |||
| 06c3d2f80a | |||
| d07f5a41e7 | |||
| 856d038dc9 | |||
| 791593ad38 | |||
| 42179dab1d | |||
| 83631cd366 | |||
| 01cf47ad55 | |||
| d492b37a45 | |||
| ecdcdb69d5 | |||
| 8479fdda8a | |||
| 83e57fbbc7 | |||
| 2d256b1217 | |||
| 526d38d32e | |||
| 2ff3dfef89 | |||
| f1b6c01cd7 | |||
| 675fe5838e | |||
| bafdec9924 | |||
| 069fef4720 | |||
| e32a7d7540 | |||
| 0773493851 | |||
| da982678b7 | |||
| c1066d70f6 | |||
| 5085ba5b54 | |||
| f37483a61d | |||
| 5357e53a5f | |||
| 764dde6296 | |||
| 681fbc3177 | |||
| 70e3e63001 | |||
| 7ed9a4a12b | |||
| acfab362a0 | |||
| 3d49a3de11 | |||
| 24518642a7 | |||
| d917f80e88 | |||
| b29027c61a | |||
| 6083dd41fa | |||
| 8969d5e0ed | |||
| 7d135a214f | |||
| 9d66a479c4 | |||
| 800b4a2f32 | |||
| 9fc21e6d97 | |||
| ce7f5381ca | |||
| 48acdaaca6 | |||
| 425c6af672 | |||
| 4281f76dfb | |||
| 8ebd6ec771 | |||
| 14391daa0b | |||
| ac29e1410e | |||
| 442ffe9b3a | |||
| d922e4fdd5 | |||
| a8dc07b4db | |||
| 40a47ee8a2 | |||
| c5633a9fc5 | |||
| 7e8da49912 | |||
| b524716ede | |||
| 72a9752820 | |||
| 8e578c6566 | |||
| 5ac9c682d9 | |||
| 6de19eb357 | |||
| 90d096a6df | |||
| c733644f3a | |||
| de9d3bbb48 | |||
| efdffd171c | |||
| 8406c8434a | |||
| a4b474970c | |||
| 135e5e46a0 | |||
| 969bc3b573 | |||
| a9eb101c9d | |||
| d53da1f011 | |||
| ab0f7e563f | |||
| 57c41a0218 | |||
| 1b75decb18 | |||
| 551438f514 | |||
| 792558ac84 | |||
| 06aff9a3c0 | |||
| 7e736a00d7 | |||
| b87f406093 | |||
| 785bd4b9ce | |||
| daca86b1df | |||
| aa52e26e1a | |||
| f956da1fc0 | 
@@ -1,6 +1,6 @@
 | 
				
			|||||||
name: Release Creation
 | 
					name: Release Creation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
on: 
 | 
					on:
 | 
				
			||||||
  release:
 | 
					  release:
 | 
				
			||||||
    types: [published]
 | 
					    types: [published]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -9,9 +9,11 @@ jobs:
 | 
				
			|||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
    - run: echo "💡 The ${{ gitea.repository }} repository will cloned to the runner."
 | 
					    - run: echo "💡 The ${{ gitea.repository }} repository will cloned to the runner."
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    #- uses: actions/checkout@v3
 | 
					    #- uses: actions/checkout@v3
 | 
				
			||||||
    - uses: RouxAntoine/checkout@v3.5.4
 | 
					    - uses: RouxAntoine/checkout@v3.5.4
 | 
				
			||||||
 | 
					      with:
 | 
				
			||||||
 | 
					        ref: 'v13'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # get part of the tag after the `v`
 | 
					    # get part of the tag after the `v`
 | 
				
			||||||
    - name: Extract tag version number
 | 
					    - name: Extract tag version number
 | 
				
			||||||
@@ -29,7 +31,7 @@ jobs:
 | 
				
			|||||||
        url: https://www.uberwald.me/gitea/${{gitea.repository}}
 | 
					        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
 | 
					        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
 | 
					        download: https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/rddsystem.zip
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    - name: Set up Node.js
 | 
					    - name: Set up Node.js
 | 
				
			||||||
      uses: actions/setup-node@v2
 | 
					      uses: actions/setup-node@v2
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
@@ -37,7 +39,7 @@ jobs:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    - name: Install dependencies
 | 
					    - name: Install dependencies
 | 
				
			||||||
      run: npm install
 | 
					      run: npm install
 | 
				
			||||||
      
 | 
					
 | 
				
			||||||
    - name: Build the compendiums
 | 
					    - name: Build the compendiums
 | 
				
			||||||
      run: node ./tools/packCompendiumsToDist.mjs
 | 
					      run: node ./tools/packCompendiumsToDist.mjs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -46,29 +48,29 @@ jobs:
 | 
				
			|||||||
         apt update -y
 | 
					         apt update -y
 | 
				
			||||||
         apt install -y zip
 | 
					         apt install -y zip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - run: zip -r ./rddsystem.zip system.json template.json README.md LICENSE.txt assets/ 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
 | 
					    - name: setup go
 | 
				
			||||||
      uses: actions/setup-go@v3
 | 
					      uses: actions/setup-go@v3
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        go-version: '>=1.20.1'
 | 
					        go-version: '>=1.20.1'
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    - name: Use Go Action  
 | 
					    - name: Use Go Action
 | 
				
			||||||
      id: use-go-action
 | 
					      id: use-go-action
 | 
				
			||||||
      uses: https://gitea.com/actions/release-action@main
 | 
					      uses: https://gitea.com/actions/release-action@main
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        files: |-
 | 
					        files: |-
 | 
				
			||||||
          ./rddsystem.zip  
 | 
					          ./rddsystem.zip
 | 
				
			||||||
          system.json
 | 
					          system.json
 | 
				
			||||||
        api_key: '${{secrets.ALLOW_PUSH_RELEASE}}'
 | 
					        api_key: '${{secrets.ALLOW_PUSH_RELEASE}}'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Publish to Foundry server  
 | 
					    - name: Publish to Foundry server
 | 
				
			||||||
      uses: djlechuck/foundryvtt-publish-package-action@v1
 | 
					      uses: djlechuck/foundryvtt-publish-package-action@v1
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        token: ${{ secrets.FOUNDRYVTT_RELEASE_TOKEN }}
 | 
					        token: ${{ secrets.FOUNDRYVTT_RELEASE_TOKEN }}
 | 
				
			||||||
        id: 'foundryvtt-reve-de-dragon'
 | 
					        id: 'foundryvtt-reve-de-dragon'
 | 
				
			||||||
        version: ${{github.event.release.tag_name}}
 | 
					        version: ${{github.event.release.tag_name}}
 | 
				
			||||||
        manifest: 'https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/system.json'
 | 
					        manifest: 'https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/system.json'
 | 
				
			||||||
        notes: 'https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/branch/v11/changelog.md'
 | 
					        notes: 'https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/branch/v13/changelog.md'
 | 
				
			||||||
        compatibility-minimum: '12'
 | 
					        compatibility-minimum: '13'
 | 
				
			||||||
        compatibility-verified: '12'
 | 
					        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  | 
							
								
								
									
										148
									
								
								changelog.md
									
									
									
									
									
								
							
							
						
						@@ -1,4 +1,141 @@
 | 
				
			|||||||
 | 
					# 13.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 13.0.4 - Le long discours d'Illysis
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- On peut de nouveau modifier les descriptions
 | 
				
			||||||
 | 
					- ne pas proposer l'export csv par défaut
 | 
				
			||||||
 | 
					- Correction de la macro "Jet quelconque"
 | 
				
			||||||
 | 
					- Correction de la ligne 'rêve actuel' ajoutée dans les caracs
 | 
				
			||||||
 | 
					- Corrections d'affichage
 | 
				
			||||||
 | 
					  - boutons de l'horloge
 | 
				
			||||||
 | 
					  - boutons de déplacement des TMR
 | 
				
			||||||
 | 
					  - modification des messages de tchat
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 13.0.3 - La dernière auberge d'Illysis
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- On peut de nouveau acheter aux commerces
 | 
				
			||||||
 | 
					- La description des Grizzal a des espaces
 | 
				
			||||||
 | 
					- Corrections v13
 | 
				
			||||||
 | 
					  - Affichage des images et noms d'objets en ligne
 | 
				
			||||||
 | 
					  - affichage des compétences de créature sur une ligne
 | 
				
			||||||
 | 
					  - Affichage des informations d'acteur sur une ligne dans l'astrologie
 | 
				
			||||||
 | 
					  - Affichage des résultat de recherche
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 13.0.0 - Le début de l'errance d'Illysis
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Migration vers la version 13 de Foundry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# 12.0
 | 
					# 12.0
 | 
				
			||||||
 | 
					## 12.0.50 - Le sommeil d'Astrobazzarh
 | 
				
			||||||
 | 
					- 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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 12.0.38 - Les prévisions d'Astrobazzarh
 | 
				
			||||||
 | 
					- Correction de modifications de personnages qui ne s'affichaient pas:
 | 
				
			||||||
 | 
					  - changements d'endurance/vie/fatigue, transformé, ...
 | 
				
			||||||
 | 
					- Migration des compétences "Ecriture" en "Écriture" dans les tâches, livres, oeuvres et méditations
 | 
				
			||||||
 | 
					- Correction des jets de compétences de créatures
 | 
				
			||||||
 | 
					- Premières préparations techniques pour le passage à Founry v13
 | 
				
			||||||
 | 
					  - liste des impacts d'un jet de dés (expérience, points de tâche, ...)
 | 
				
			||||||
 | 
					  - utilisation de l'extension hbs pour tous les fichiers handlebars
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 12.0.37 - Les enchantements d'Astrobazzarh
 | 
				
			||||||
 | 
					- les potions ont un état, seules les potions liquides sont enchantables
 | 
				
			||||||
 | 
					- les lancements de sorts du jour sont conservés jusqu'à chateau dormant
 | 
				
			||||||
 | 
					- lorsqu'un joueur souhaite enchanter une potion, les sorts d'enchantements/purification/permanence doivent avoir été lancés auparavant
 | 
				
			||||||
 | 
					- on peut enchanter des gemmes exactement comme des potions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 12.0.36 - L'alchimie d'Astrobazzarh
 | 
				
			||||||
 | 
					- Nouveautés
 | 
				
			||||||
 | 
					  - ajout d'un bouton pour enchanter les potions
 | 
				
			||||||
 | 
					  - standardisation des boutons d'actions sur les items
 | 
				
			||||||
 | 
					  - utilisations d'icones pour les actions de l'inventaire
 | 
				
			||||||
 | 
					- Corrections:
 | 
				
			||||||
 | 
					  - la commande /tmra sans paramètres fonctionne
 | 
				
			||||||
 | 
					  - les jets d'encaissement depuis le tchat fonctionnent
 | 
				
			||||||
 | 
					  - affichage de la vie/endurance en cas de blessures et remise à neuf
 | 
				
			||||||
 | 
					  - les queues durant 12 heures ajoutées début Vaisseau ne durent plus 24 heures
 | 
				
			||||||
 | 
					- Compendiums
 | 
				
			||||||
 | 
					  - Corrections des remedes enchantables
 | 
				
			||||||
 | 
					  - Corrections de descriptions pour proposer les jet de dés
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 12.0.35 - La Solution d'Astrobazzarh
 | 
				
			||||||
 | 
					- Fix problème d'initialisation des feuilles d'items
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 12.0.34 - la tête d'Astrobazzarh
 | 
				
			||||||
 | 
					- 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
 | 
				
			||||||
 | 
					    - une manipulation alchimique `@roll[couleur vert-bleu]`
 | 
				
			||||||
 | 
					  - les liens "jet avec caractéristiques" s'appliquent:
 | 
				
			||||||
 | 
					    - à tous les tokens sélectionnés
 | 
				
			||||||
 | 
					    - sinon, à l'acteur propriétaire (dans le cas d'un Item) ou à l'acteur courant
 | 
				
			||||||
 | 
					    - sinon, au personnage du joueur
 | 
				
			||||||
 | 
					  - on peut poster les liens dans le tchat pour proposer un jet aux joueurs
 | 
				
			||||||
 | 
					- gestion des blocs secrets dans les descriptions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 12.0.33 - la vieillesse d'Astrobazzarh
 | 
				
			||||||
 | 
					- retour de l'expérience pour les joueurs
 | 
				
			||||||
 | 
					- suppression du message "Pas de caractéristique" sur les jets d'odorat-goût
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 12.0.32 - les rêveries d'Astrobazzarh
 | 
					## 12.0.32 - les rêveries d'Astrobazzarh
 | 
				
			||||||
- Ajout des Items Race pour gérer les ajustements liés aux races
 | 
					- Ajout des Items Race pour gérer les ajustements liés aux races
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -51,7 +188,7 @@
 | 
				
			|||||||
  - les tas dans les conteneurs peuvent être désempilés sans rendre le conteneur inutilisable
 | 
					  - 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)
 | 
					  - 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
 | 
					  - on peut maintenant saisir et supprimer les bonus de cases de manière intuitive
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
## 12.0.23 - La bibliothèque d'Astrobazzarh
 | 
					## 12.0.23 - La bibliothèque d'Astrobazzarh
 | 
				
			||||||
- corrections mineures
 | 
					- corrections mineures
 | 
				
			||||||
  - meilleure gestion de la parade des armes naturelles
 | 
					  - meilleure gestion de la parade des armes naturelles
 | 
				
			||||||
@@ -162,7 +299,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## 12.0.6 - Le bazar d'Astrobazzarh
 | 
					## 12.0.6 - Le bazar d'Astrobazzarh
 | 
				
			||||||
- Corrections de l'inventaire en bazar:
 | 
					- Corrections de l'inventaire en bazar:
 | 
				
			||||||
  - un problème pouvait survenir en déplaçant les objets 
 | 
					  - un problème pouvait survenir en déplaçant les objets
 | 
				
			||||||
    l'inventaire, qui fait qu'un conteneur se retrouve récursivement dans son
 | 
					    l'inventaire, qui fait qu'un conteneur se retrouve récursivement dans son
 | 
				
			||||||
    propre contenu, ce qui empêche d'ouvrir la feuille d'acteur.
 | 
					    propre contenu, ce qui empêche d'ouvrir la feuille d'acteur.
 | 
				
			||||||
  - un objet non-conteneur pouvait dans certains cas avoir un pseudo contenu
 | 
					  - un objet non-conteneur pouvait dans certains cas avoir un pseudo contenu
 | 
				
			||||||
@@ -170,7 +307,7 @@
 | 
				
			|||||||
    conteneur (et donc non affiché)
 | 
					    conteneur (et donc non affiché)
 | 
				
			||||||
  - vider les conteneurs supprime correctement toutes les informations liées
 | 
					  - vider les conteneurs supprime correctement toutes les informations liées
 | 
				
			||||||
    aux conteneurs/contenus
 | 
					    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é
 | 
					  courant pour leur visibilité
 | 
				
			||||||
- Fix: restaurer la compatibilité Foundry 11
 | 
					- Fix: restaurer la compatibilité Foundry 11
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -265,7 +402,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## 11.2.9 - La barbe d'Akarlikarlikar
 | 
					## 11.2.9 - La barbe d'Akarlikarlikar
 | 
				
			||||||
- Amélioration des textes de tooltips
 | 
					- Amélioration des textes de tooltips
 | 
				
			||||||
- Les tooltips sont plus dans le thème de couleur du système Rêve de Dragon 
 | 
					- Les tooltips sont plus dans le thème de couleur du système Rêve de Dragon
 | 
				
			||||||
- Ajouts d'icones pour les attaque/initiative/soins dans les raccourcis sur les tokens (HUD)
 | 
					- Ajouts d'icones pour les attaque/initiative/soins dans les raccourcis sur les tokens (HUD)
 | 
				
			||||||
- Ajout d'une icône et transformation en bouton du lien pour accéder à l'astrologie et aux chiffres astraux
 | 
					- 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
 | 
					- Suppression de message de log inutile sur chaque point de coeur
 | 
				
			||||||
@@ -385,7 +522,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é
 | 
					  - 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
 | 
					  - 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
 | 
					  - 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
 | 
					- Amélioration de la fenêtre de jets
 | 
				
			||||||
  - le type de dégâts pour les attaques est toujours affiché
 | 
					  - le type de dégâts pour les attaques est toujours affiché
 | 
				
			||||||
  - le moral est indiqué avant l'icone d'appel au moral
 | 
					  - le moral est indiqué avant l'icone d'appel au moral
 | 
				
			||||||
@@ -492,4 +629,3 @@ Vu qu'elles ne peuvent pas être utilisées, permet de savoir pourquoi
 | 
				
			|||||||
- correction des achats par le MJ sans acteur sélectionné
 | 
					- correction des achats par le MJ sans acteur sélectionné
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Cf branche v10 pour l'historique des versions 10
 | 
					Cf branche v10 pour l'historique des versions 10
 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2502
									
								
								css/foundryvtt-reve-de-dragon.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										37
									
								
								gulpfile.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					const gulp = require('gulp');
 | 
				
			||||||
 | 
					const less = require('gulp-less');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function onError(err) {
 | 
				
			||||||
 | 
					  util.log(util.colors.red.bold('[ERROR LESS]:'),util.colors.bgRed(err.message));
 | 
				
			||||||
 | 
					  this.emit('end');
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------- */
 | 
				
			||||||
 | 
					/*  Compile LESS
 | 
				
			||||||
 | 
					/* ----------------------------------------- */
 | 
				
			||||||
 | 
					function compileLESS() {
 | 
				
			||||||
 | 
					  return gulp.src("less/foundryvtt-reve-de-dragon.less")
 | 
				
			||||||
 | 
					      .pipe(less()).on('error',console.log.bind(console))
 | 
				
			||||||
 | 
					      .pipe(gulp.dest("./css"))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					const css = gulp.series(compileLESS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------- */
 | 
				
			||||||
 | 
					/*  Watch Updates
 | 
				
			||||||
 | 
					/* ----------------------------------------- */
 | 
				
			||||||
 | 
					const SIMPLE_LESS = ["less/*.less", "less/item/*.less"];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function watchUpdates() {
 | 
				
			||||||
 | 
					  gulp.watch(SIMPLE_LESS, css);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ----------------------------------------- */
 | 
				
			||||||
 | 
					/*  Export Tasks
 | 
				
			||||||
 | 
					/* ----------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exports.default = gulp.series(
 | 
				
			||||||
 | 
					    gulp.parallel(css),
 | 
				
			||||||
 | 
					    watchUpdates
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					exports.css = css;
 | 
				
			||||||
 | 
					exports.watchUpdates = watchUpdates;
 | 
				
			||||||
							
								
								
									
										50
									
								
								less/colors.less
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,50 @@
 | 
				
			|||||||
 | 
					:root {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* =================== 2. DEBUGGING HIGHLIGHTERS ============ */
 | 
				
			||||||
 | 
					    // --debug-background-color-red: #ff000054;
 | 
				
			||||||
 | 
					    // --debug-background-color-blue: #1d00ff54;
 | 
				
			||||||
 | 
					    // --debug-background-color-green: #54ff0054;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // --debug-box-shadow-red: inset 0 0 2px red;
 | 
				
			||||||
 | 
					    // --debug-box-shadow-blue: inset 0 0 2px blue;
 | 
				
			||||||
 | 
					    // --debug-box-shadow-green: inset 0 0 2px green;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* =================== 3. some constants ============ */
 | 
				
			||||||
 | 
					    --fieldset-background: url(/ui/parchment.jpg);
 | 
				
			||||||
 | 
					    --rdd-color-text-primary: rgba(10, 10, 10, 0.9);
 | 
				
			||||||
 | 
					    --rdd-input-background:rgba(0, 0, 0, 0.05);
 | 
				
			||||||
 | 
					    --rdd-color-border-input: rgba(0, 0, 0, 0.2);
 | 
				
			||||||
 | 
					    --rdd-bg-input: rgba(255, 255, 255, 0.1);
 | 
				
			||||||
 | 
					    --color-controls:rgba(0, 0, 0, 0.9);
 | 
				
			||||||
 | 
					    --color-controls-light:hsla(0, 0%, 20%, 0.8);
 | 
				
			||||||
 | 
					    --color-controls-hover:hsla(60, 100%, 75%, 0.7);
 | 
				
			||||||
 | 
					    --color-control-border-hover:rgba(255, 128, 0, 0.8);
 | 
				
			||||||
 | 
					    --color-gold: rgba(191, 149, 63, 0.8);
 | 
				
			||||||
 | 
					    --gradient-gold: linear-gradient(30deg, rgba(191, 149, 63, 0.3), rgba(252, 246, 186, 0.3), rgba(179, 135, 40, 0.3), rgba(251, 245, 183, 0.3), rgba(170, 119, 28, 0.3));
 | 
				
			||||||
 | 
					    --gradient-silver: linear-gradient(30deg, rgba(61, 55, 93, 0.3), rgba(178, 179, 196, 0.3), rgba(59, 62, 63, 0.6), rgba(206, 204, 199, 0.3), rgba(61, 46, 49, 0.3));
 | 
				
			||||||
 | 
					    --gradient-green: linear-gradient(30deg, rgba(7, 76, 0, 0.3), rgba(66, 163, 65, 0.2), rgba(184, 226, 163, 0.1), rgba(66, 163, 65, 0.2), rgba(184, 226, 163, 0.3));
 | 
				
			||||||
 | 
					    --gradient-red: linear-gradient(150deg, rgba(255, 0, 0, 0.3), rgba(255, 200, 128, 0.05),rgba(255, 200, 128, 0.1), rgba(255,10,0,0.3));
 | 
				
			||||||
 | 
					    --gradient-violet: linear-gradient(150deg, rgba(100, 45, 124, 0.6), rgba(216, 157, 192, 0.3), rgba(177, 157, 216, 0.5), rgba(107, 62, 121, 0.3), rgba(100, 45, 124, 0.6));
 | 
				
			||||||
 | 
					    --gradient-purple-black: linear-gradient(150deg,  rgba(0, 0, 0, 0.7), rgba(100, 45, 124, 0.4), rgba(82, 17, 131, 0.3),rgba(100, 45, 124, 0.4), rgba(0, 0, 0, 0.7));
 | 
				
			||||||
 | 
					    --gradient-silver-light: linear-gradient(30deg, rgba(61, 55, 93, 0.2), rgba(178, 179, 196, 0.1), rgba(59, 62, 63, 0.2), rgba(206, 204, 199, 0.1), rgba(61, 46, 49, 0.2));
 | 
				
			||||||
 | 
					    --gradient-daylight: conic-gradient(
 | 
				
			||||||
 | 
					      from 0deg,
 | 
				
			||||||
 | 
					      hsla(50, 100%, 80%, 0.7),
 | 
				
			||||||
 | 
					      hsla(30, 30%, 40%, 0.1) 25%,
 | 
				
			||||||
 | 
					      hsla(250, 50%, 40%, 0.1) 25%,
 | 
				
			||||||
 | 
					      hsla(250, 30%, 30%, 0.7) 50%,
 | 
				
			||||||
 | 
					      hsla(250, 50%, 40%, 0.1) 75%,
 | 
				
			||||||
 | 
					      hsla(30, 30%, 40%, 0.1) 75%,
 | 
				
			||||||
 | 
					      hsla(50, 100%, 80%, 0.7)
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    --background-custom-button: linear-gradient(to bottom, rgba(33, 55, 74, 0.988) 5%, rgba(21, 40, 51, 0.671) 100%);
 | 
				
			||||||
 | 
					    --background-custom-button-hover: linear-gradient(to bottom, rgb(128, 0, 0) 5%, rgb(62, 1, 1) 100%);
 | 
				
			||||||
 | 
					    --background-control-selected: linear-gradient(to bottom, hsla(0, 100%, 25%, 0.5) 5%, hsla(0, 100%, 12%, 0.5) 100%);
 | 
				
			||||||
 | 
					    --background-tooltip: hsla(60, 12%, 85%, 0.95);
 | 
				
			||||||
 | 
					    --color-tooltip:hsla(282, 47%, 33%, 0.9);
 | 
				
			||||||
 | 
					    --color-tooltip-faint:hsla(282, 47%, 66%, 0.5);
 | 
				
			||||||
 | 
					    --background-error:hsla(16, 100%, 50%, 0.8);
 | 
				
			||||||
 | 
					    --color-profile-border: hsla(0, 0%, 80%, 0.05);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
							
								
								
									
										84
									
								
								less/fonts.less
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,84 @@
 | 
				
			|||||||
 | 
					/* ==================== (A) Fonts ==================== */
 | 
				
			||||||
 | 
					@font-face {
 | 
				
			||||||
 | 
					  font-family: "GoudyAcc";
 | 
				
			||||||
 | 
					  src: url('../fonts/goudyacc.ttf') format("truetype");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					@font-face {
 | 
				
			||||||
 | 
					  font-family: "MedievalSharp";
 | 
				
			||||||
 | 
					  src: url('../fonts/MedievalSharp.ttf') format("truetype");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					@font-face {
 | 
				
			||||||
 | 
					  font-family: "GrenzeGotisch";
 | 
				
			||||||
 | 
					  src: url('../fonts/GrenzeGotisch-Regular.ttf') format("truetype");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					@font-face {
 | 
				
			||||||
 | 
					  font-family: "Fondamento";
 | 
				
			||||||
 | 
					  src: url('../fonts/Fondamento.ttf') format("truetype");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					@font-face {
 | 
				
			||||||
 | 
					  font-family: "CaslonAntique";
 | 
				
			||||||
 | 
					  src: url('../fonts/CaslonAntique.ttf') format("truetype");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					@font-face {
 | 
				
			||||||
 | 
					  font-family: 'HeuresDraconiques';
 | 
				
			||||||
 | 
					  src:
 | 
				
			||||||
 | 
					      url('../fonts/heuresdraconiques2.woff') format('woff'),
 | 
				
			||||||
 | 
					      url('../fonts/heuresdraconiques2.woff2') format('woff2'),
 | 
				
			||||||
 | 
					      url('../fonts/heuresdraconiques2.ttf') format('truetype');
 | 
				
			||||||
 | 
					  font-weight: normal;
 | 
				
			||||||
 | 
					  font-style: normal;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:root {
 | 
				
			||||||
 | 
					  /* =================== 1. ACTOR SHEET FONT STYLES =========== */
 | 
				
			||||||
 | 
					    --window-header-title-font-family: CaslonAntique;
 | 
				
			||||||
 | 
					    --window-header-title-font-size: 1.6rem;
 | 
				
			||||||
 | 
					    --window-header-title-font-weight: normal;
 | 
				
			||||||
 | 
					    --window-header-title-color: #f5f5f5;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    --major-button-font-family: CaslonAntique;
 | 
				
			||||||
 | 
					    --major-button-font-size: 1.4rem;
 | 
				
			||||||
 | 
					    --major-button-font-weight: normal;
 | 
				
			||||||
 | 
					    --major-button-color: #dadada;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    --tab-header-font-family: CaslonAntique;
 | 
				
			||||||
 | 
					    --tab-header-font-size: 1.2rem;
 | 
				
			||||||
 | 
					    --tab-header-font-weight: 700;
 | 
				
			||||||
 | 
					    --tab-header-color: #403f3e;
 | 
				
			||||||
 | 
					    --tab-header-color-active: #4a0404;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    --actor-input-font-family: CaslonAntique;
 | 
				
			||||||
 | 
					    --actor-input-font-size: 1.2rem;
 | 
				
			||||||
 | 
					    --actor-input-font-weight: 500;
 | 
				
			||||||
 | 
					    --actor-input-color: black;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    --actor-label-font-family: CaslonAntique;
 | 
				
			||||||
 | 
					    --actor-label-font-size: 1.2rem;
 | 
				
			||||||
 | 
					    --actor-label-font-weight: 700;
 | 
				
			||||||
 | 
					    --actor-label-color: #464331c4;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Global styles & Font */
 | 
				
			||||||
 | 
					.window-app {
 | 
				
			||||||
 | 
					  font-family: CaslonAntique;
 | 
				
			||||||
 | 
					  text-align: justify;
 | 
				
			||||||
 | 
					  font-size: 1rem;
 | 
				
			||||||
 | 
					  letter-spacing: 1px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Fonts */
 | 
				
			||||||
 | 
					.sheet header.sheet-header h1 input,
 | 
				
			||||||
 | 
					.window-app .window-header,
 | 
				
			||||||
 | 
					#actors .directory-list,
 | 
				
			||||||
 | 
					#navigation #scene-list .scene.nav-item {
 | 
				
			||||||
 | 
					  font-family: "GoudyAcc"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* For title, sidebar character and scene */
 | 
				
			||||||
 | 
					.sheet nav.sheet-tabs,
 | 
				
			||||||
 | 
					.window-app input,
 | 
				
			||||||
 | 
					.sheet header.sheet-header .header-compteurs,
 | 
				
			||||||
 | 
					.sheet header.sheet-header .flex-group-center.flex-fatigue,
 | 
				
			||||||
 | 
					select,  .item-checkbox, #sidebar, #players, #navigation #nav-toggle {
 | 
				
			||||||
 | 
					    font-family: "CaslonAntique"; /* For sheet parts; For nav and title */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										2115
									
								
								less/foundryvtt-reve-de-dragon.less
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										7
									
								
								less/item/monnaie.less
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					// Styles pour la feuille d'objet Monnaie
 | 
				
			||||||
 | 
					.monnaie-content {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .item-sheet-common();
 | 
				
			||||||
 | 
					  .item-sheet-header();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										7
									
								
								less/item/munition.less
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					// Styles pour la feuille d'objet Monnaie
 | 
				
			||||||
 | 
					.munition-content {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .item-sheet-common();
 | 
				
			||||||
 | 
					  .item-sheet-header();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										7
									
								
								less/item/tarot.less
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					// Styles pour la feuille d'objet Monnaie
 | 
				
			||||||
 | 
					.tarot-content {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .item-sheet-common();
 | 
				
			||||||
 | 
					  .item-sheet-header();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										108
									
								
								less/sheets.less
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,108 @@
 | 
				
			|||||||
 | 
					.item-sheet-common() {
 | 
				
			||||||
 | 
					  padding: 0px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Styles pour la section de description, si le partiel utilise une structure standard
 | 
				
			||||||
 | 
					  .editor,
 | 
				
			||||||
 | 
					  .editor-content {
 | 
				
			||||||
 | 
					    height: auto; // Ajuster selon le besoin
 | 
				
			||||||
 | 
					    min-height: 100px; // Hauteur minimale pour la description
 | 
				
			||||||
 | 
					    background: var(--rdd-bg-input-alt); // Une couleur de fond alternative
 | 
				
			||||||
 | 
					    padding: 5px;
 | 
				
			||||||
 | 
					    border-radius: 3px;
 | 
				
			||||||
 | 
					    color: var(--rdd-color-text-primary);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .window-content {
 | 
				
			||||||
 | 
					    font-family: CaslonAntique;
 | 
				
			||||||
 | 
					    text-align: justify;
 | 
				
			||||||
 | 
					    font-size: 1rem;
 | 
				
			||||||
 | 
					    letter-spacing: 1px;
 | 
				
			||||||
 | 
					    padding: 0% 0 0 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    font-size: calc(var(--font-size-standard) * 1);
 | 
				
			||||||
 | 
					    color: var(--color-dark-1);
 | 
				
			||||||
 | 
					    background-size: 100% 100%;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  fieldset {
 | 
				
			||||||
 | 
					    background: var(--fieldset-background);
 | 
				
			||||||
 | 
					    color: var(--rdd-color-text-primary);
 | 
				
			||||||
 | 
					    margin-bottom: 4px;
 | 
				
			||||||
 | 
					    border-radius: 6px;
 | 
				
			||||||
 | 
					    border-color: var(--rdd-color-text-primary);
 | 
				
			||||||
 | 
					    border-width: 2px;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .form-group {
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    flex-direction: row;
 | 
				
			||||||
 | 
					    flex-wrap: wrap;
 | 
				
			||||||
 | 
					    justify-content: flex-start;
 | 
				
			||||||
 | 
					    align-items: center;
 | 
				
			||||||
 | 
					    padding: 2px 0;
 | 
				
			||||||
 | 
					    border-bottom: 1px solid var(--rdd-color-shadow-primary);
 | 
				
			||||||
 | 
					    font-size: 0.9rem;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    label {
 | 
				
			||||||
 | 
					      font-weight: normal;
 | 
				
			||||||
 | 
					      flex: 2;
 | 
				
			||||||
 | 
					      padding-left: 5px;
 | 
				
			||||||
 | 
					      margin: 0;
 | 
				
			||||||
 | 
					      color: var(
 | 
				
			||||||
 | 
					        --rdd-color-text-primary
 | 
				
			||||||
 | 
					      ); // Assurez-vous que cette variable existe dans colors.less
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .attribute-value,
 | 
				
			||||||
 | 
					    input[type="text"],
 | 
				
			||||||
 | 
					    input[type="number"],
 | 
				
			||||||
 | 
					    select {
 | 
				
			||||||
 | 
					      flex: 3;
 | 
				
			||||||
 | 
					      background: var(--rdd-input-background);
 | 
				
			||||||
 | 
					      border: 1px solid var(--rdd-color-border-input); // Assurez-vous que cette variable existe
 | 
				
			||||||
 | 
					      color: var(
 | 
				
			||||||
 | 
					        --rdd-color-text-input
 | 
				
			||||||
 | 
					      ); // Assurez-vous que cette variable existe
 | 
				
			||||||
 | 
					      padding: 2px 2px; // Augmentation du padding vertical
 | 
				
			||||||
 | 
					      border-radius: 3px;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    input[type="checkbox"] {
 | 
				
			||||||
 | 
					      flex: 0 0 20px; // Taille fixe pour les cases à cocher
 | 
				
			||||||
 | 
					      margin-left: 5px;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.item-sheet-header() {
 | 
				
			||||||
 | 
					  background: #011d33 url(../assets/ui/bg_header.webp) no-repeat left top;
 | 
				
			||||||
 | 
					  color: rgba(255, 255, 255, 1);
 | 
				
			||||||
 | 
					  .sheet-header-row {
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    flex-direction: row;
 | 
				
			||||||
 | 
					    align-items: center;
 | 
				
			||||||
 | 
					    h1,
 | 
				
			||||||
 | 
					    input {
 | 
				
			||||||
 | 
					      font-family: CaslonAntique;
 | 
				
			||||||
 | 
					      font-size: 2.5rem;
 | 
				
			||||||
 | 
					      font-weight: normal;
 | 
				
			||||||
 | 
					      color: var(--window-header-title-color);
 | 
				
			||||||
 | 
					      margin: 4px;
 | 
				
			||||||
 | 
					      height: 3rem;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  :is(
 | 
				
			||||||
 | 
					    input[type="text"],
 | 
				
			||||||
 | 
					    input[type="number"],
 | 
				
			||||||
 | 
					    input[type="password"],
 | 
				
			||||||
 | 
					    input[type="datetime-local"],
 | 
				
			||||||
 | 
					    input[type="date"],
 | 
				
			||||||
 | 
					    input[type="time"]
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    color: rgba(255, 255, 255, 0.75);
 | 
				
			||||||
 | 
					    background: rgba(255, 255, 255, 0.1);
 | 
				
			||||||
 | 
					    border: 0 none;
 | 
				
			||||||
 | 
					    margin-bottom: 0.2rem;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -44,13 +44,13 @@ export class ChatVente {
 | 
				
			|||||||
    vente.nbLots = Math.max(0, vente.nbLots - quantite)
 | 
					    vente.nbLots = Math.max(0, vente.nbLots - quantite)
 | 
				
			||||||
    await chatMessage.setFlag(SYSTEM_RDD, NB_LOTS, vente.nbLots)
 | 
					    await chatMessage.setFlag(SYSTEM_RDD, NB_LOTS, vente.nbLots)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-vente-item.html', vente);
 | 
					    const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-vente-item.hbs', vente);
 | 
				
			||||||
    chatMessage.update({ content: html });
 | 
					    chatMessage.update({ content: html });
 | 
				
			||||||
    chatMessage.render(true);
 | 
					    chatMessage.render(true);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static async displayAchatVente(vente) {
 | 
					  static async displayAchatVente(vente) {
 | 
				
			||||||
    const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-vente-item.html', vente);
 | 
					    const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-vente-item.hbs', vente);
 | 
				
			||||||
    const chatMessage = await ChatMessage.create(RdDUtility.chatDataSetup(html))
 | 
					    const chatMessage = await ChatMessage.create(RdDUtility.chatDataSetup(html))
 | 
				
			||||||
    await chatMessage.setFlag(SYSTEM_RDD, NB_LOTS, vente.nbLots)
 | 
					    await chatMessage.setFlag(SYSTEM_RDD, NB_LOTS, vente.nbLots)
 | 
				
			||||||
    await chatMessage.setFlag(SYSTEM_RDD, DETAIL_VENTE, {
 | 
					    await chatMessage.setFlag(SYSTEM_RDD, DETAIL_VENTE, {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,7 @@ export class DialogItemAchat extends Dialog {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DialogItemAchat.changeNombreLots(venteData, 1)
 | 
					    DialogItemAchat.changeNombreLots(venteData, 1)
 | 
				
			||||||
    const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-achat.html`, venteData)
 | 
					    const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-achat.hbs`, venteData)
 | 
				
			||||||
    new DialogItemAchat(html, venteData).render(true)
 | 
					    new DialogItemAchat(html, venteData).render(true)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,7 @@ export class DialogItemVente extends Dialog {
 | 
				
			|||||||
      quantiteIllimite: item.isItemCommerce() ? quantiteMax == undefined : !item.parent,
 | 
					      quantiteIllimite: item.isItemCommerce() ? quantiteMax == undefined : !item.parent,
 | 
				
			||||||
      isOwned:  item.parent,
 | 
					      isOwned:  item.parent,
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-vente.html`, venteData);
 | 
					    const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-vente.hbs`, venteData);
 | 
				
			||||||
    return new DialogItemVente(venteData, html).render(true);
 | 
					    return new DialogItemVente(venteData, html).render(true);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,13 +12,14 @@ import { RdDSheetUtility } from "./rdd-sheet-utility.js";
 | 
				
			|||||||
import { STATUSES } from "./settings/status-effects.js";
 | 
					import { STATUSES } from "./settings/status-effects.js";
 | 
				
			||||||
import { MAINS_DIRECTRICES } from "./actor.js";
 | 
					import { MAINS_DIRECTRICES } from "./actor.js";
 | 
				
			||||||
import { RdDBaseActorReveSheet } from "./actor/base-actor-reve-sheet.js";
 | 
					import { RdDBaseActorReveSheet } from "./actor/base-actor-reve-sheet.js";
 | 
				
			||||||
import { ITEM_TYPES, RdDItem } from "./item.js";
 | 
					import { ITEM_TYPES } from "./constants.js";
 | 
				
			||||||
 | 
					import { RdDItem } from "./item.js";
 | 
				
			||||||
import { RdDItemBlessure } from "./item/blessure.js";
 | 
					import { RdDItemBlessure } from "./item/blessure.js";
 | 
				
			||||||
import { RdDEmpoignade } from "./rdd-empoignade.js";
 | 
					import { RdDEmpoignade } from "./rdd-empoignade.js";
 | 
				
			||||||
import { RdDBaseActorSangSheet } from "./actor/base-actor-sang-sheet.js";
 | 
					import { RdDBaseActorSangSheet } from "./actor/base-actor-sang-sheet.js";
 | 
				
			||||||
import { RdDCoeur } from "./coeur/rdd-coeur.js";
 | 
					import { RdDCoeur } from "./coeur/rdd-coeur.js";
 | 
				
			||||||
import { AppPersonnageAleatoire } from "./actor/random/app-personnage-aleatoire.js";
 | 
					import { AppPersonnageAleatoire } from "./actor/random/app-personnage-aleatoire.js";
 | 
				
			||||||
import { RdDItemRace } from "./item/race.js";
 | 
					import { RdDTextEditor } from "./apps/rdd-text-roll-editor.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* -------------------------------------------- */
 | 
					/* -------------------------------------------- */
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -29,7 +30,7 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
 | 
				
			|||||||
  /** @override */
 | 
					  /** @override */
 | 
				
			||||||
  static get defaultOptions() {
 | 
					  static get defaultOptions() {
 | 
				
			||||||
    return foundry.utils.mergeObject(RdDBaseActorReveSheet.defaultOptions, {
 | 
					    return foundry.utils.mergeObject(RdDBaseActorReveSheet.defaultOptions, {
 | 
				
			||||||
      template: "systems/foundryvtt-reve-de-dragon/templates/actor-sheet.html",
 | 
					      template: "systems/foundryvtt-reve-de-dragon/templates/actor-sheet.hbs",
 | 
				
			||||||
      width: 550,
 | 
					      width: 550,
 | 
				
			||||||
      showCompNiveauBase: false,
 | 
					      showCompNiveauBase: false,
 | 
				
			||||||
      vueArchetype: false,
 | 
					      vueArchetype: false,
 | 
				
			||||||
@@ -44,8 +45,8 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
 | 
				
			|||||||
      cssClass: this.isEditable ? "editable" : "locked",
 | 
					      cssClass: this.isEditable ? "editable" : "locked",
 | 
				
			||||||
      limited: this.actor.limited,
 | 
					      limited: this.actor.limited,
 | 
				
			||||||
      owner: this.actor.isOwner,
 | 
					      owner: this.actor.isOwner,
 | 
				
			||||||
      biographie: await TextEditor.enrichHTML(this.actor.system.biographie, { async: true }),
 | 
					      biographie: await RdDTextEditor.enrichHTML(this.actor.system.biographie, this.actor),
 | 
				
			||||||
      notes: await TextEditor.enrichHTML(this.actor.system.notes, { async: true }),
 | 
					      notes: await RdDTextEditor.enrichHTML(this.actor.system.notes, this.actor),
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    foundry.utils.mergeObject(formData.calc, {
 | 
					    foundry.utils.mergeObject(formData.calc, {
 | 
				
			||||||
      surenc: this.actor.computeMalusSurEncombrement(),
 | 
					      surenc: this.actor.computeMalusSurEncombrement(),
 | 
				
			||||||
@@ -125,80 +126,73 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
 | 
				
			|||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.show-hide-competences').click(async event => {
 | 
					    this.html.find('.show-hide-competences').click(async event => {
 | 
				
			||||||
      this.options.showCompNiveauBase = !this.options.showCompNiveauBase;
 | 
					      this.options.showCompNiveauBase = !this.options.showCompNiveauBase
 | 
				
			||||||
      this.render(true);
 | 
					      this.render(true)
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.button-tmr-visu').click(async event => this.actor.displayTMR("visu"))
 | 
					    this.html.find('.button-tmr-visu').click(async event => await this.actor.displayTMR("visu"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Everything below here is only needed if the sheet is editable
 | 
					    // Everything below here is only needed if the sheet is editable
 | 
				
			||||||
    if (!this.options.editable) return;
 | 
					    if (!this.options.editable) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.sheet-possession-attack').click(async event => {
 | 
					    this.html.find('.sheet-possession-attack').click(async event => {
 | 
				
			||||||
      const poss = RdDSheetUtility.getItem(event, this.actor)
 | 
					      const poss = RdDSheetUtility.getItem(event, this.actor)
 | 
				
			||||||
      this.actor.conjurerPossession(poss)
 | 
					      await this.actor.conjurerPossession(poss)
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.subacteur-coeur-toggle a').click(async event => {
 | 
					    this.html.find('.subacteur-coeur-toggle a').click(async event => {
 | 
				
			||||||
      const subActorIdactorId = RdDSheetUtility.getEventItemData(event, 'subactor-id')
 | 
					      const subActorIdactorId = RdDSheetUtility.getEventItemData(event, 'subactor-id')
 | 
				
			||||||
      const coeurNombre = $(event.currentTarget).data('numero-coeur')
 | 
					      const coeurNombre = $(event.currentTarget).data('numero-coeur')
 | 
				
			||||||
      RdDCoeur.toggleSubActeurCoeur(this.actor.id, subActorIdactorId, coeurNombre)
 | 
					      await RdDCoeur.toggleSubActeurCoeur(this.actor.id, subActorIdactorId, coeurNombre)
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
    this.html.find('.subacteur-tendre-moment').click(async event => {
 | 
					    this.html.find('.subacteur-tendre-moment').click(async event => {
 | 
				
			||||||
      const subActorId = RdDSheetUtility.getEventItemData(event, 'subactor-id')
 | 
					      const subActorId = RdDSheetUtility.getEventItemData(event, 'subactor-id')
 | 
				
			||||||
      RdDCoeur.startSubActeurTendreMoment(this.actor.id, subActorId)
 | 
					      await RdDCoeur.startSubActeurTendreMoment(this.actor.id, subActorId)
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
    this.html.find('.subacteur-delete').click(async event => {
 | 
					    this.html.find('.subacteur-delete').click(async event => {
 | 
				
			||||||
      const li = RdDSheetUtility.getEventElement(event);
 | 
					      const li = RdDSheetUtility.getEventElement(event);
 | 
				
			||||||
      const subActorId = li.data("subactor-id");
 | 
					      const subActorId = li.data("subactor-id");
 | 
				
			||||||
      this.deleteSubActeur(subActorId, li);
 | 
					      this.deleteSubActeur(subActorId, li);
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
    this.html.find("input.derivee-value[name='system.compteurs.stress.value']").change(async event => {
 | 
					    this.html.find("input.derivee-value[name='system.compteurs.stress.value']").change(async event =>
 | 
				
			||||||
      this.actor.updateCompteurValue("stress", parseInt(event.target.value));
 | 
					      await this.actor.updateCompteurValue("stress", parseInt(event.target.value))
 | 
				
			||||||
    });
 | 
					    );
 | 
				
			||||||
    this.html.find("input.derivee-value[name='system.compteurs.experience.value']").change(async event => {
 | 
					    this.html.find("input.derivee-value[name='system.compteurs.experience.value']").change(async event =>
 | 
				
			||||||
      this.actor.updateCompteurValue("experience", parseInt(event.target.value));
 | 
					      await this.actor.updateCompteurValue("experience", parseInt(event.target.value))
 | 
				
			||||||
    });
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.creer-tache').click(async event => this.createEmptyTache());
 | 
					    this.html.find('.creer-tache').click(async event => await this.createEmptyTache());
 | 
				
			||||||
    this.html.find('.creer-une-oeuvre').click(async event => this.selectTypeOeuvreToCreate());
 | 
					    this.html.find('.creer-une-oeuvre').click(async event => await this.selectTypeOeuvreToCreate());
 | 
				
			||||||
    this.html.find('.creer-tache-blessure-legere').click(async event => RdDItemBlessure.createTacheSoinBlessure(this.actor, 2));
 | 
					    this.html.find('.creer-tache-blessure-legere').click(async event => await RdDItemBlessure.createTacheSoinBlessure(this.actor, 2));
 | 
				
			||||||
    this.html.find('.creer-tache-blessure-grave').click(async event => RdDItemBlessure.createTacheSoinBlessure(this.actor, 4));
 | 
					    this.html.find('.creer-tache-blessure-grave').click(async event => await RdDItemBlessure.createTacheSoinBlessure(this.actor, 4));
 | 
				
			||||||
    this.html.find('.creer-tache-blessure-critique').click(async event => RdDItemBlessure.createTacheSoinBlessure(this.actor, 6));
 | 
					    this.html.find('.creer-tache-blessure-critique').click(async event => await RdDItemBlessure.createTacheSoinBlessure(this.actor, 6));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.blessure-premierssoins-done').change(async event => {
 | 
					    this.html.find('.blessure-premierssoins-done').change(async event => {
 | 
				
			||||||
      const blessure = this.getBlessure(event);
 | 
					      await this.getBlessure(event)?.setSoinsBlessure({ premierssoins: { done: event.currentTarget.checked } });
 | 
				
			||||||
      await blessure?.setSoinsBlessure({ premierssoins: { done: event.currentTarget.checked } });
 | 
					 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    this.html.find('.blessure-soinscomplets-done').change(async event => {
 | 
					    this.html.find('.blessure-soinscomplets-done').change(async event => {
 | 
				
			||||||
      const blessure = this.getBlessure(event);
 | 
					      await this.getBlessure(event)?.setSoinsBlessure({ soinscomplets: { done: event.currentTarget.checked } })
 | 
				
			||||||
      await blessure?.setSoinsBlessure({ soinscomplets: { done: event.currentTarget.checked } })
 | 
					 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    this.html.find('.blessure-premierssoins-bonus').change(async event => {
 | 
					    this.html.find('.blessure-premierssoins-bonus').change(async event => {
 | 
				
			||||||
      const blessure = this.getBlessure(event);
 | 
					      await this.getBlessure(event)?.setSoinsBlessure({ premierssoins: { bonus: Number(event.currentTarget.value) } })
 | 
				
			||||||
      await blessure?.setSoinsBlessure({ premierssoins: { bonus: Number(event.currentTarget.value) } })
 | 
					 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    this.html.find('.blessure-soinscomplets-bonus').change(async event => {
 | 
					    this.html.find('.blessure-soinscomplets-bonus').change(async event => {
 | 
				
			||||||
      const blessure = this.getBlessure(event);
 | 
					      await this.getBlessure(event)?.setSoinsBlessure({ soinscomplets: { bonus: Number(event.currentTarget.value) } })
 | 
				
			||||||
      await blessure?.setSoinsBlessure({ soinscomplets: { bonus: Number(event.currentTarget.value) } })
 | 
					 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Equip Inventory Item
 | 
					    this.html.find('.roll-chance-actuelle').click(async event => await this.actor.rollCarac('chance-actuelle'))
 | 
				
			||||||
    this.html.find('.item-equip').click(async event => this.actor.equiperObjet(RdDSheetUtility.getItemId(event)))
 | 
					    this.html.find('.button-appel-chance').click(async event => await this.actor.rollAppelChance())
 | 
				
			||||||
    this.html.find('.roll-chance-actuelle').click(async event => this.actor.rollCarac('chance-actuelle'))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.button-appel-chance').click(async event => this.actor.rollAppelChance())
 | 
					    this.html.find('[name="jet-astrologie"]').click(async event => await this.actor.astrologieNombresAstraux())
 | 
				
			||||||
 | 
					    this.html.find('.action-tache').click(async event => await this.actor.rollTache(RdDSheetUtility.getItemId(event)))
 | 
				
			||||||
 | 
					    this.html.find('.meditation-label a').click(async event => await this.actor.rollMeditation(RdDSheetUtility.getItemId(event)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('[name="jet-astrologie"]').click(async event => this.actor.astrologieNombresAstraux())
 | 
					    this.html.find('.action-chant').click(async event => await this.actor.rollChant(RdDSheetUtility.getItemId(event)))
 | 
				
			||||||
    this.html.find('.tache-label a').click(async event => this.actor.rollTache(RdDSheetUtility.getItemId(event)))
 | 
					    this.html.find('.action-danse').click(async event => await this.actor.rollDanse(RdDSheetUtility.getItemId(event)))
 | 
				
			||||||
    this.html.find('.meditation-label a').click(async event => this.actor.rollMeditation(RdDSheetUtility.getItemId(event)))
 | 
					    this.html.find('.action-musique').click(async event => await this.actor.rollMusique(RdDSheetUtility.getItemId(event)))
 | 
				
			||||||
 | 
					    this.html.find('.action-oeuvre').click(async event => await this.actor.rollOeuvre(RdDSheetUtility.getItemId(event)))
 | 
				
			||||||
    this.html.find('.chant-label a').click(async event => this.actor.rollChant(RdDSheetUtility.getItemId(event)))
 | 
					    this.html.find('.action-jeu').click(async event => await this.actor.rollJeu(RdDSheetUtility.getItemId(event)))
 | 
				
			||||||
    this.html.find('.danse-label a').click(async event => this.actor.rollDanse(RdDSheetUtility.getItemId(event)))
 | 
					    this.html.find('.action-recettecuisine').click(async event => await this.actor.rollRecetteCuisine(RdDSheetUtility.getItemId(event)))
 | 
				
			||||||
    this.html.find('.musique-label a').click(async event => this.actor.rollMusique(RdDSheetUtility.getItemId(event)))
 | 
					 | 
				
			||||||
    this.html.find('.oeuvre-label a').click(async event => this.actor.rollOeuvre(RdDSheetUtility.getItemId(event)))
 | 
					 | 
				
			||||||
    this.html.find('.jeu-label a').click(async event => this.actor.rollJeu(RdDSheetUtility.getItemId(event)))
 | 
					 | 
				
			||||||
    this.html.find('.recettecuisine-label a').click(async event => this.actor.rollRecetteCuisine(RdDSheetUtility.getItemId(event)))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.description-aleatoire').click(async event => new AppPersonnageAleatoire(this.actor).render(true))
 | 
					    this.html.find('.description-aleatoire').click(async event => new AppPersonnageAleatoire(this.actor).render(true))
 | 
				
			||||||
    if (game.user.isGM) {
 | 
					    if (game.user.isGM) {
 | 
				
			||||||
@@ -214,17 +208,16 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
 | 
				
			|||||||
        await this.actor.deleteExperienceLog(0, key + 1);
 | 
					        await this.actor.deleteExperienceLog(0, key + 1);
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
      // Boutons spéciaux MJs
 | 
					      // Boutons spéciaux MJs
 | 
				
			||||||
      this.html.find('.forcer-tmr-aleatoire').click(async event => this.actor.reinsertionAleatoire("Action MJ"))
 | 
					      this.html.find('.forcer-tmr-aleatoire').click(async event => await this.actor.reinsertionAleatoire("Action MJ"))
 | 
				
			||||||
      this.html.find('.don-de-haut-reve').click(async event => this.actor.addDonDeHautReve())
 | 
					      this.html.find('.don-de-haut-reve').click(async event => await this.actor.addDonDeHautReve())
 | 
				
			||||||
      this.html.find('.sortreserve-add').click(async event => this.actor.addSortReserve(RdDSheetUtility.getItemId(event)))
 | 
					      this.html.find('.afficher-tmr').click(async event => await this.actor.changeTMRVisible())
 | 
				
			||||||
      this.html.find('.afficher-tmr').click(async event => this.actor.changeTMRVisible())
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Points de reve actuel
 | 
					    // Points de reve actuel
 | 
				
			||||||
    this.html.find('.roll-reve-actuel').click(async event => this.actor.rollCarac('reve-actuel', true))
 | 
					    this.html.find('.roll-reve-actuel').click(async event => await this.actor.rollCarac('reve-actuel', { resistance: true }))
 | 
				
			||||||
    this.html.find('.empoignade-label a').click(async event => RdDEmpoignade.onAttaqueEmpoignadeFromItem(RdDSheetUtility.getItem(event, this.actor)))
 | 
					    this.html.find('.action-empoignade').click(async event => await RdDEmpoignade.onAttaqueEmpoignadeFromItem(RdDSheetUtility.getItem(event, this.actor)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.roll-arme').click(async event => this.actor.rollArme(foundry.utils.duplicate(this._getEventArmeCombat(event)), 'competence'))
 | 
					    this.html.find('.roll-arme').click(async event => await this.actor.rollArme(foundry.utils.duplicate(this._getEventArmeCombat(event)), 'competence'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Initiative pour l'arme
 | 
					    // Initiative pour l'arme
 | 
				
			||||||
    this.html.find('.roll-init-arme').click(async event => {
 | 
					    this.html.find('.roll-init-arme').click(async event => {
 | 
				
			||||||
@@ -237,30 +230,34 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
 | 
				
			|||||||
    })
 | 
					    })
 | 
				
			||||||
    // Display TMR
 | 
					    // Display TMR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.button-tmr').click(async event => this.actor.displayTMR("normal"))
 | 
					    this.html.find('.button-tmr').click(async event => await this.actor.displayTMR("normal"))
 | 
				
			||||||
    this.html.find('.button-tmr-rapide').click(async event => this.actor.displayTMR("rapide"))
 | 
					    this.html.find('.button-tmr-rapide').click(async event => await this.actor.displayTMR("rapide"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.button-repos').click(async event => await this.actor.repos())
 | 
					    this.html.find('.button-repos').click(async event => await this.actor.repos())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.carac-xp-augmenter').click(async event => this.actor.updateCaracXPAuto(event.currentTarget.name.replace("augmenter.", "")))
 | 
					    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 => this.actor.updateCompetenceXPAuto(RdDSheetUtility.getItemId(event)))
 | 
					    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 => 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) {
 | 
					    if (this.options.vueDetaillee) {
 | 
				
			||||||
      // On carac change
 | 
					      // On carac change
 | 
				
			||||||
      this.html.find('input.carac-xp').change(async event => {
 | 
					      this.html.find('input.carac-xp').change(async event => {
 | 
				
			||||||
        let caracName = event.currentTarget.name.replace(".xp", "").replace("system.carac.", "");
 | 
					        let caracName = event.currentTarget.name.replace(".xp", "").replace("system.carac.", "")
 | 
				
			||||||
        this.actor.updateCaracXP(caracName, parseInt(event.target.value));
 | 
					        await this.actor.updateCaracXP(caracName, parseInt(event.target.value))
 | 
				
			||||||
      });
 | 
					      })
 | 
				
			||||||
      // On competence xp change
 | 
					      // On competence xp change
 | 
				
			||||||
      this.html.find('input.competence-xp').change(async event => {
 | 
					      this.html.find('input.competence-xp').change(async event => {
 | 
				
			||||||
        let compName = event.currentTarget.attributes.compname.value;
 | 
					        let compName = event.currentTarget.attributes.compname.value
 | 
				
			||||||
        this.actor.updateCompetenceXP(compName, parseInt(event.target.value));
 | 
					        await this.actor.updateCompetenceXP(compName, parseInt(event.target.value))
 | 
				
			||||||
      });
 | 
					      })
 | 
				
			||||||
      this.html.find('input.competence-xp-sort').change(async event => {
 | 
					      this.html.find('input.competence-xp-sort').change(async event => {
 | 
				
			||||||
        let compName = event.currentTarget.attributes.compname.value;
 | 
					        let compName = event.currentTarget.attributes.compname.value
 | 
				
			||||||
        this.actor.updateCompetenceXPSort(compName, parseInt(event.target.value));
 | 
					        await this.actor.updateCompetenceXPSort(compName, parseInt(event.target.value))
 | 
				
			||||||
      });
 | 
					      })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      this.html.find('.toggle-archetype').click(async event => {
 | 
					      this.html.find('.toggle-archetype').click(async event => {
 | 
				
			||||||
        this.options.vueArchetype = !this.options.vueArchetype;
 | 
					        this.options.vueArchetype = !this.options.vueArchetype;
 | 
				
			||||||
@@ -269,27 +266,27 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
 | 
				
			|||||||
      // On competence archetype change
 | 
					      // On competence archetype change
 | 
				
			||||||
      this.html.find('.competence-archetype').change(async event => {
 | 
					      this.html.find('.competence-archetype').change(async event => {
 | 
				
			||||||
        let compName = event.currentTarget.attributes.compname.value;
 | 
					        let compName = event.currentTarget.attributes.compname.value;
 | 
				
			||||||
        this.actor.updateCompetenceArchetype(compName, parseInt(event.target.value));
 | 
					        await this.actor.updateCompetenceArchetype(compName, parseInt(event.target.value));
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
      this.html.find('.nouvelle-incarnation').click(async event => this.actor.nouvelleIncarnation())
 | 
					      this.html.find('.nouvelle-incarnation').click(async event => await this.actor.nouvelleIncarnation())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // On pts de reve change
 | 
					    // On pts de reve change
 | 
				
			||||||
    this.html.find('.pointsreve-value').change(async event => this.actor.update({ "system.reve.reve.value": event.currentTarget.value }))
 | 
					    this.html.find('.pointsreve-value').change(async event => await this.actor.update({ "system.reve.reve.value": event.currentTarget.value }))
 | 
				
			||||||
    this.html.find('.seuil-reve-value').change(async event => this.actor.setPointsDeSeuil(event.currentTarget.value))
 | 
					    this.html.find('.seuil-reve-value').change(async event => await this.actor.setPointsDeSeuil(event.currentTarget.value))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.stress-test').click(async event => this.actor.transformerStress())
 | 
					    this.html.find('.stress-test').click(async event => await this.actor.transformerStress())
 | 
				
			||||||
    this.html.find('.moral-malheureux').click(async event => this.actor.jetDeMoral('malheureuse'))
 | 
					    this.html.find('.moral-malheureux').click(async event => await this.actor.jetDeMoral('malheureuse'))
 | 
				
			||||||
    this.html.find('.moral-neutre').click(async event => this.actor.jetDeMoral('neutre'))
 | 
					    this.html.find('.moral-neutre').click(async event => await this.actor.jetDeMoral('neutre'))
 | 
				
			||||||
    this.html.find('.moral-heureux').click(async event => this.actor.jetDeMoral('heureuse'))
 | 
					    this.html.find('.moral-heureux').click(async event => await this.actor.jetDeMoral('heureuse'))
 | 
				
			||||||
    this.html.find('.button-ethylisme').click(async event => this.actor.jetEthylisme())
 | 
					    this.html.find('.button-ethylisme').click(async event => await this.actor.jetEthylisme())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.ptreve-actuel-plus').click(async event => this.actor.reveActuelIncDec(1))
 | 
					    this.html.find('.ptreve-actuel-plus').click(async event => await this.actor.reveActuelIncDec(1))
 | 
				
			||||||
    this.html.find('.ptreve-actuel-moins').click(async event => this.actor.reveActuelIncDec(-1))
 | 
					    this.html.find('.ptreve-actuel-moins').click(async event => await this.actor.reveActuelIncDec(-1))
 | 
				
			||||||
    this.html.find('.chance-actuelle-plus').click(async event => this.actor.chanceActuelleIncDec(1))
 | 
					    this.html.find('.chance-actuelle-plus').click(async event => await this.actor.chanceActuelleIncDec(1))
 | 
				
			||||||
    this.html.find('.chance-actuelle-moins').click(async event => this.actor.chanceActuelleIncDec(-1))
 | 
					    this.html.find('.chance-actuelle-moins').click(async event => await this.actor.chanceActuelleIncDec(-1))
 | 
				
			||||||
    this.html.find('.fatigue-plus').click(async event => this.actor.santeIncDec("fatigue", 1))
 | 
					    this.html.find('.fatigue-plus').click(async event => await this.actor.santeIncDec("fatigue", 1))
 | 
				
			||||||
    this.html.find('.fatigue-moins').click(async event => this.actor.santeIncDec("fatigue", -1))
 | 
					    this.html.find('.fatigue-moins').click(async event => await this.actor.santeIncDec("fatigue", -1))
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  getBlessure(event) {
 | 
					  getBlessure(event) {
 | 
				
			||||||
@@ -326,7 +323,7 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
 | 
				
			|||||||
  /* -------------------------------------------- */
 | 
					  /* -------------------------------------------- */
 | 
				
			||||||
  async selectTypeOeuvreToCreate() {
 | 
					  async selectTypeOeuvreToCreate() {
 | 
				
			||||||
    let types = RdDItem.getTypesOeuvres();
 | 
					    let types = RdDItem.getTypesOeuvres();
 | 
				
			||||||
    let content = `<span class="competence-label">Selectionnez le type d'oeuvre</span><select class="item-type">`;
 | 
					    let content = `<span class="generic-label">Selectionnez le type d'oeuvre</span><select class="item-type">`;
 | 
				
			||||||
    for (let typeName of types) {
 | 
					    for (let typeName of types) {
 | 
				
			||||||
      content += `<option value="${typeName}">${Misc.typeName('Item', typeName)}</option>`
 | 
					      content += `<option value="${typeName}">${Misc.typeName('Item', typeName)}</option>`
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										536
									
								
								module/actor.js
									
									
									
									
									
								
							
							
						
						@@ -1,5 +1,6 @@
 | 
				
			|||||||
 | 
					import { RdDTextEditor } from "../apps/rdd-text-roll-editor.js";
 | 
				
			||||||
import { Grammar } from "../grammar.js";
 | 
					import { Grammar } from "../grammar.js";
 | 
				
			||||||
import { ITEM_TYPES } from "../item.js";
 | 
					import { ITEM_TYPES } from "../constants.js";
 | 
				
			||||||
import { RdDSheetUtility } from "../rdd-sheet-utility.js";
 | 
					import { RdDSheetUtility } from "../rdd-sheet-utility.js";
 | 
				
			||||||
import { RdDBaseActorSheet } from "./base-actor-sheet.js";
 | 
					import { RdDBaseActorSheet } from "./base-actor-sheet.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -25,16 +26,17 @@ export class RdDBaseActorReveSheet extends RdDBaseActorSheet {
 | 
				
			|||||||
    // Everything below here is only needed if the sheet is editable
 | 
					    // Everything below here is only needed if the sheet is editable
 | 
				
			||||||
    if (!this.options.editable) return;
 | 
					    if (!this.options.editable) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.button-encaissement').click(async event => this.actor.encaisser())
 | 
					    this.html.find('.button-encaissement').click(async event => await this.actor.encaisser())
 | 
				
			||||||
    this.html.find('.roll-carac').click(async event => {
 | 
					    this.html.find('.roll-carac').click(async event => {
 | 
				
			||||||
      this.actor.rollCarac(Grammar.toLowerCaseNoAccent(event.currentTarget.attributes['data-carac-name'].value))});
 | 
					      await this.actor.rollCarac(Grammar.toLowerCaseNoAccent(event.currentTarget.attributes['data-carac-name'].value))
 | 
				
			||||||
    this.html.find('.roll-competence').click(async event => this.actor.rollCompetence(RdDSheetUtility.getItemId(event)));
 | 
					    })
 | 
				
			||||||
    this.html.find('.endurance-plus').click(async event => this.actor.santeIncDec("endurance", 1));
 | 
					    this.html.find('.roll-competence').click(async event => await this.actor.rollCompetence(RdDSheetUtility.getItemId(event)));
 | 
				
			||||||
    this.html.find('.endurance-moins').click(async event => this.actor.santeIncDec("endurance", -1));
 | 
					    this.html.find('.endurance-plus').click(async event => await this.actor.santeIncDec("endurance", 1));
 | 
				
			||||||
 | 
					    this.html.find('.endurance-moins').click(async event => await this.actor.santeIncDec("endurance", -1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (game.user.isGM) {
 | 
					    if (game.user.isGM) {
 | 
				
			||||||
      this.html.find('.button-remise-a-neuf').click(async event => this.actor.remiseANeuf())
 | 
					      this.html.find('.button-remise-a-neuf').click(async event => await this.actor.remiseANeuf())
 | 
				
			||||||
      this.html.find('.delete-active-effect').click(async event => this.actor.removeEffect(this.html.find(event.currentTarget).parents(".active-effect").data('effect')));
 | 
					      this.html.find('.delete-active-effect').click(async event => await this.actor.removeEffect(this.html.find(event.currentTarget).parents(".active-effect").data('effect')));
 | 
				
			||||||
      this.html.find('.enlever-tous-effets').click(async event => await this.actor.removeEffects());
 | 
					      this.html.find('.enlever-tous-effets').click(async event => await this.actor.removeEffects());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    this.html.find('.competence-add').click(async event =>
 | 
					    this.html.find('.competence-add').click(async event =>
 | 
				
			||||||
@@ -47,18 +49,20 @@ export class RdDBaseActorReveSheet extends RdDBaseActorSheet {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
      }], { renderSheet: true })
 | 
					      }], { renderSheet: true })
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					    this.html.find('.roll-text').click(async event => await RdDTextEditor.rollText(event, this.actor))
 | 
				
			||||||
 | 
					    this.html.find('.chat-roll-text').click(async event => await RdDTextEditor.chatRollText(event))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (this.options.vueDetaillee) {
 | 
					    if (this.options.vueDetaillee) {
 | 
				
			||||||
      // On carac change
 | 
					      // On carac change
 | 
				
			||||||
      this.html.find('.carac-value').change(async event => {
 | 
					      this.html.find('.carac-value').change(async event => {
 | 
				
			||||||
        let caracName = event.currentTarget.name.replace(".value", "").replace("system.carac.", "");
 | 
					        let caracName = event.currentTarget.name.replace(".value", "").replace("system.carac.", "")
 | 
				
			||||||
        this.actor.updateCarac(caracName, parseInt(event.target.value));
 | 
					        await this.actor.updateCarac(caracName, parseInt(event.target.value))
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
      // On competence change
 | 
					      // On competence change
 | 
				
			||||||
      this.html.find('.competence-value').change(async event => {
 | 
					      this.html.find('.competence-value').change(async event => {
 | 
				
			||||||
        let compName = event.currentTarget.attributes.compname.value;
 | 
					        let compName = event.currentTarget.attributes.compname.value
 | 
				
			||||||
        //console.log("Competence changed :", compName);
 | 
					        await this.actor.updateCompetence(compName, parseInt(event.target.value))
 | 
				
			||||||
        this.actor.updateCompetence(compName, parseInt(event.target.value));
 | 
					 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,7 @@ import { RdDRoll } from "../rdd-roll.js";
 | 
				
			|||||||
import { RdDUtility } from "../rdd-utility.js";
 | 
					import { RdDUtility } from "../rdd-utility.js";
 | 
				
			||||||
import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
 | 
					import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
 | 
				
			||||||
import { RdDBaseActor } from "./base-actor.js";
 | 
					import { RdDBaseActor } from "./base-actor.js";
 | 
				
			||||||
import { ITEM_TYPES } from "../item.js";
 | 
					import { ITEM_TYPES } from "../constants.js";
 | 
				
			||||||
import { RdDItemCompetence } from "../item-competence.js";
 | 
					import { RdDItemCompetence } from "../item-competence.js";
 | 
				
			||||||
import { RdDItemCompetenceCreature } from "../item-competencecreature.js";
 | 
					import { RdDItemCompetenceCreature } from "../item-competencecreature.js";
 | 
				
			||||||
import { RdDItemArme } from "../item-arme.js";
 | 
					import { RdDItemArme } from "../item-arme.js";
 | 
				
			||||||
@@ -15,6 +15,7 @@ import { StatusEffects } from "../settings/status-effects.js";
 | 
				
			|||||||
import { Targets } from "../targets.js";
 | 
					import { Targets } from "../targets.js";
 | 
				
			||||||
import { RdDConfirm } from "../rdd-confirm.js";
 | 
					import { RdDConfirm } from "../rdd-confirm.js";
 | 
				
			||||||
import { RdDCarac } from "../rdd-carac.js";
 | 
					import { RdDCarac } from "../rdd-carac.js";
 | 
				
			||||||
 | 
					import { RdDRollResult } from "../rdd-roll-result.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { ChatUtility } from "../chat-utility.js";
 | 
					import { ChatUtility } from "../chat-utility.js";
 | 
				
			||||||
import { DialogValidationEncaissement } from "../dialog-validation-encaissement.js";
 | 
					import { DialogValidationEncaissement } from "../dialog-validation-encaissement.js";
 | 
				
			||||||
@@ -22,6 +23,7 @@ import { RdDCombat } from "../rdd-combat.js";
 | 
				
			|||||||
import { RdDEmpoignade } from "../rdd-empoignade.js";
 | 
					import { RdDEmpoignade } from "../rdd-empoignade.js";
 | 
				
			||||||
import { RdDPossession } from "../rdd-possession.js";
 | 
					import { RdDPossession } from "../rdd-possession.js";
 | 
				
			||||||
import { BASE_CORPS_A_CORPS, BASE_ESQUIVE, POSSESSION_SANS_DRACONIC } from "../item/base-items.js";
 | 
					import { BASE_CORPS_A_CORPS, BASE_ESQUIVE, POSSESSION_SANS_DRACONIC } from "../item/base-items.js";
 | 
				
			||||||
 | 
					import { RollDataAjustements } from "../rolldata-ajustements.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Classe de base pour les acteurs disposant de rêve (donc, pas des objets)
 | 
					 * Classe de base pour les acteurs disposant de rêve (donc, pas des objets)
 | 
				
			||||||
@@ -267,32 +269,70 @@ export class RdDBaseActorReve extends RdDBaseActor {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* -------------------------------------------- */
 | 
					  /* -------------------------------------------- */
 | 
				
			||||||
  async openRollDialog({ name, label, template, rollData, callbackAction }) {
 | 
					  async openRollDialog({ name, label, template, rollData, callbacks }) {
 | 
				
			||||||
    const dialog = await RdDRoll.create(this, rollData,
 | 
					    const dialog = await RdDRoll.create(this, rollData,
 | 
				
			||||||
      { html: template, close: async html => await this._onCloseRollDialog(html) },
 | 
					      { html: template, close: async html => await this._onCloseRollDialog(html) },
 | 
				
			||||||
      {
 | 
					      { name: name, label: label, callbacks: [this.createCallbackExperience(), this.createCallbackAppelAuMoral()].concat(callbacks) })
 | 
				
			||||||
        name: name,
 | 
					    dialog.render(true)
 | 
				
			||||||
        label: label,
 | 
					 | 
				
			||||||
        callbacks: [
 | 
					 | 
				
			||||||
          this.createCallbackExperience(),
 | 
					 | 
				
			||||||
          this.createCallbackAppelAuMoral(),
 | 
					 | 
				
			||||||
          { action: callbackAction }
 | 
					 | 
				
			||||||
        ]
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
    dialog.render(true);
 | 
					 | 
				
			||||||
    return dialog
 | 
					    return dialog
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  createEmptyCallback() {
 | 
					  createCallbackExperience() { return { action: r => { } } }
 | 
				
			||||||
    return {
 | 
					  createCallbackAppelAuMoral() { return { action: r => { } } }
 | 
				
			||||||
      condition: r => false,
 | 
					
 | 
				
			||||||
      action: r => { }
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  createCallbackExperience() { return this.createEmptyCallback(); }
 | 
					 | 
				
			||||||
  createCallbackAppelAuMoral() { return this.createEmptyCallback(); }
 | 
					 | 
				
			||||||
  async _onCloseRollDialog(html) { }
 | 
					  async _onCloseRollDialog(html) { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  async rollCaracCompetence(caracName, compName, diff, options = { title: "" }) {
 | 
				
			||||||
 | 
					    RdDEmpoignade.checkEmpoignadeEnCours(this)
 | 
				
			||||||
 | 
					    const competence = this.getCompetence(compName);
 | 
				
			||||||
 | 
					    await this.openRollDialog({
 | 
				
			||||||
 | 
					      name: 'jet-competence',
 | 
				
			||||||
 | 
					      label: competence ? 'Jet ' + Grammar.apostrophe('de', competence.name) : `Jet sans compétence (${compName})`,
 | 
				
			||||||
 | 
					      template: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-competence.hbs',
 | 
				
			||||||
 | 
					      rollData: {
 | 
				
			||||||
 | 
					        alias: this.getAlias(),
 | 
				
			||||||
 | 
					        carac: this.system.carac,
 | 
				
			||||||
 | 
					        selectedCarac: this.getCaracByName(caracName),
 | 
				
			||||||
 | 
					        selectedCaracName: caracName,
 | 
				
			||||||
 | 
					        diffLibre: diff,
 | 
				
			||||||
 | 
					        competence: competence,
 | 
				
			||||||
 | 
					        show: { title: options?.title ?? '' }
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      callbacks: [async r => this.$onRollCompetence(r, options)]
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Méthode pour faire un jet prédéterminer sans ouvrir la fenêtre de dialogue
 | 
				
			||||||
 | 
					   * @param {*} caracName code ou label de la caractéristique. On peut utiliser 'intel' pour Intellect.
 | 
				
			||||||
 | 
					   * @param {*} compName nom de compétence ou nom abrégé.
 | 
				
			||||||
 | 
					   * @param {*} diff difficulté (0 si undefined)
 | 
				
			||||||
 | 
					   * @param {*} options
 | 
				
			||||||
 | 
					   * @returns le jet effectué
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  async doRollCaracCompetence(caracName, compName, diff, options = { title: "" }) {
 | 
				
			||||||
 | 
					    const carac = this.getCaracByName(caracName);
 | 
				
			||||||
 | 
					    if (!carac) {
 | 
				
			||||||
 | 
					      ui.notifications.warn(`${this.name} n'a pas de caractéristique correspondant à ${caracName}`)
 | 
				
			||||||
 | 
					      return
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    const competence = this.getCompetence(compName);
 | 
				
			||||||
 | 
					    let rollData = {
 | 
				
			||||||
 | 
					      alias: this.getAlias(),
 | 
				
			||||||
 | 
					      caracValue: Number(carac.value),
 | 
				
			||||||
 | 
					      selectedCarac: carac,
 | 
				
			||||||
 | 
					      competence: competence,
 | 
				
			||||||
 | 
					      diffLibre: diff ?? 0,
 | 
				
			||||||
 | 
					      show: { title: options?.title ?? '' }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    RollDataAjustements.calcul(rollData, this);
 | 
				
			||||||
 | 
					    await RdDResolutionTable.rollData(rollData);
 | 
				
			||||||
 | 
					    this.gererExperience(rollData);
 | 
				
			||||||
 | 
					    await RdDResolutionTable.displayRollData(rollData, this)
 | 
				
			||||||
 | 
					    return rollData.rolled;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  gererExperience(rollData) { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* -------------------------------------------- */
 | 
					  /* -------------------------------------------- */
 | 
				
			||||||
  async roll() {
 | 
					  async roll() {
 | 
				
			||||||
    RdDEmpoignade.checkEmpoignadeEnCours(this)
 | 
					    RdDEmpoignade.checkEmpoignadeEnCours(this)
 | 
				
			||||||
@@ -301,51 +341,59 @@ export class RdDBaseActorReve extends RdDBaseActor {
 | 
				
			|||||||
    const selectedCaracName = ['apparence', 'perception', 'force', 'reve'].find(it => carac[it] != undefined)
 | 
					    const selectedCaracName = ['apparence', 'perception', 'force', 'reve'].find(it => carac[it] != undefined)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    await this.openRollDialog({
 | 
					    await this.openRollDialog({
 | 
				
			||||||
      name: `jet-${this.id}`,
 | 
					      name: 'jet-quelconque',
 | 
				
			||||||
      label: `Jet de ${this.getAlias()}`,
 | 
					      label: 'Jet',
 | 
				
			||||||
      template: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll.html',
 | 
					      template: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll.hbs',
 | 
				
			||||||
      rollData: {
 | 
					      rollData: {
 | 
				
			||||||
 | 
					        alias: this.getAlias(),
 | 
				
			||||||
        carac: carac,
 | 
					        carac: carac,
 | 
				
			||||||
        selectedCarac: carac[selectedCaracName],
 | 
					        selectedCarac: carac[selectedCaracName],
 | 
				
			||||||
        selectedCaracName: selectedCaracName,
 | 
					        selectedCaracName: selectedCaracName,
 | 
				
			||||||
        competences: this.itemTypes['competence']
 | 
					        competences: this.itemTypes['competence']
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      callbackAction: r => this.$onRollCaracResult(r)
 | 
					      callbacks: [{ action: r => this.$onRollCaracResult(r) }]
 | 
				
			||||||
    });
 | 
					    })
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* -------------------------------------------- */
 | 
					  /* -------------------------------------------- */
 | 
				
			||||||
  async rollCarac(caracName, jetResistance = undefined) {
 | 
					  async rollCarac(caracName, options = {}) {
 | 
				
			||||||
    if (Grammar.equalsInsensitive(caracName, 'taille')) {
 | 
					    if (Grammar.equalsInsensitive(caracName, 'taille')) {
 | 
				
			||||||
      return
 | 
					      return
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    foundry.utils.mergeObject(options, { resistance: false, diff: 0 }, { overwrite: false })
 | 
				
			||||||
    RdDEmpoignade.checkEmpoignadeEnCours(this)
 | 
					    RdDEmpoignade.checkEmpoignadeEnCours(this)
 | 
				
			||||||
    let selectedCarac = this.getCaracByName(caracName)
 | 
					    let selectedCarac = this.getCaracByName(caracName)
 | 
				
			||||||
    console.log("selectedCarac", selectedCarac)
 | 
					    const title = 'Jet ' + Grammar.apostrophe('de', selectedCarac.label);
 | 
				
			||||||
 | 
					    const jetResistance = options.resistance ? caracName : undefined;
 | 
				
			||||||
    await this.openRollDialog({
 | 
					    await this.openRollDialog({
 | 
				
			||||||
      name: 'jet-' + caracName,
 | 
					      name: 'jet-' + caracName,
 | 
				
			||||||
      label: 'Jet ' + Grammar.apostrophe('de', selectedCarac.label),
 | 
					      label: title,
 | 
				
			||||||
      template: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-carac.html',
 | 
					      template: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-carac.hbs',
 | 
				
			||||||
      rollData: {
 | 
					      rollData: {
 | 
				
			||||||
 | 
					        alias: this.getAlias(),
 | 
				
			||||||
        selectedCarac: selectedCarac,
 | 
					        selectedCarac: selectedCarac,
 | 
				
			||||||
        competences: this.itemTypes['competence'],
 | 
					        competences: this.itemTypes['competence'],
 | 
				
			||||||
        jetResistance: jetResistance ? caracName : undefined
 | 
					        diffLibre: options.diff ?? 0,
 | 
				
			||||||
 | 
					        jetResistance: jetResistance
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      callbackAction: r => this.$onRollCaracResult(r)
 | 
					      callbacks: [{ action: r => this.$onRollCaracResult(r) }]
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* -------------------------------------------- */
 | 
					  /* -------------------------------------------- */
 | 
				
			||||||
  async $onRollCaracResult(rollData) {
 | 
					  async $onRollCaracResult(rollData) {
 | 
				
			||||||
    // Final chat message
 | 
					    // Final chat message
 | 
				
			||||||
    await RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-general.html');
 | 
					    await RdDRollResult.displayRollData(rollData, this, 'chat-resultat-general.hbs');
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* -------------------------------------------- */
 | 
					  /* -------------------------------------------- */
 | 
				
			||||||
  async rollCompetence(idOrName, options = { tryTarget: true, arme: undefined }) {
 | 
					  async rollCompetence(idOrName, options = { tryTarget: true, arme: undefined }) {
 | 
				
			||||||
    RdDEmpoignade.checkEmpoignadeEnCours(this)
 | 
					    RdDEmpoignade.checkEmpoignadeEnCours(this)
 | 
				
			||||||
    const competence = this.getCompetence(idOrName);
 | 
					    const competence = this.getCompetence(idOrName);
 | 
				
			||||||
    let rollData = { carac: this.system.carac, competence: competence, arme: options.arme }
 | 
					    let rollData = {
 | 
				
			||||||
 | 
					      carac: this.system.carac,
 | 
				
			||||||
 | 
					      competence: competence,
 | 
				
			||||||
 | 
					      arme: options.arme
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    if (competence.type == ITEM_TYPES.competencecreature) {
 | 
					    if (competence.type == ITEM_TYPES.competencecreature) {
 | 
				
			||||||
      const token = RdDUtility.getSelectedToken(this)
 | 
					      const token = RdDUtility.getSelectedToken(this)
 | 
				
			||||||
      const arme = RdDItemCompetenceCreature.armeCreature(competence)
 | 
					      const arme = RdDItemCompetenceCreature.armeCreature(competence)
 | 
				
			||||||
@@ -363,18 +411,18 @@ export class RdDBaseActorReve extends RdDBaseActor {
 | 
				
			|||||||
      // Transformer la competence de créature
 | 
					      // Transformer la competence de créature
 | 
				
			||||||
      RdDItemCompetenceCreature.setRollDataCreature(rollData)
 | 
					      RdDItemCompetenceCreature.setRollDataCreature(rollData)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    const dialogLabel = 'Jet ' + Grammar.apostrophe('de', competence.name);
 | 
				
			||||||
    await this.openRollDialog({
 | 
					    await this.openRollDialog({
 | 
				
			||||||
      name: 'jet-competence',
 | 
					      name: 'jet-competence',
 | 
				
			||||||
      label: 'Jet ' + Grammar.apostrophe('de', competence.name),
 | 
					      label: dialogLabel,
 | 
				
			||||||
      template: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-competence.html',
 | 
					      template: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-competence.hbs',
 | 
				
			||||||
      rollData: rollData,
 | 
					      rollData: rollData,
 | 
				
			||||||
      callbackAction: r => this.$onRollCompetence(r, options)
 | 
					      callbacks: [{ action: r => this.$onRollCompetence(r, options) }]
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async $onRollCompetence(rollData, options) {
 | 
					  async $onRollCompetence(rollData, options) {
 | 
				
			||||||
    await RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-competence.html')
 | 
					    await RdDRollResult.displayRollData(rollData, this, 'chat-resultat-competence.hbs')
 | 
				
			||||||
    if (options?.onRollAutomate) {
 | 
					    if (options?.onRollAutomate) {
 | 
				
			||||||
      options.onRollAutomate(rollData);
 | 
					      options.onRollAutomate(rollData);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -474,7 +522,7 @@ export class RdDBaseActorReve extends RdDBaseActor {
 | 
				
			|||||||
    await ChatUtility.createChatWithRollMode(
 | 
					    await ChatUtility.createChatWithRollMode(
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        roll: encaissement.roll,
 | 
					        roll: encaissement.roll,
 | 
				
			||||||
        content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-encaissement.html', encaissement)
 | 
					        content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-encaissement.hbs', encaissement)
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      this
 | 
					      this
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
@@ -484,7 +532,7 @@ export class RdDBaseActorReve extends RdDBaseActor {
 | 
				
			|||||||
      encaissement.isGM = true
 | 
					      encaissement.isGM = true
 | 
				
			||||||
      ChatMessage.create({
 | 
					      ChatMessage.create({
 | 
				
			||||||
        whisper: ChatUtility.getGMs(),
 | 
					        whisper: ChatUtility.getGMs(),
 | 
				
			||||||
        content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-encaissement.html', encaissement)
 | 
					        content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-encaissement.hbs', encaissement)
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -509,10 +557,8 @@ export class RdDBaseActorReve extends RdDBaseActor {
 | 
				
			|||||||
      await entite.setEntiteReveAccordee(this);
 | 
					      await entite.setEntiteReveAccordee(this);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    await RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-accorder-cauchemar.html');
 | 
					    await RdDRollResult.displayRollData(rollData, this, 'chat-resultat-accorder-cauchemar.hbs');
 | 
				
			||||||
    if (rolled.isPart) {
 | 
					    await this.appliquerAjoutExperience(rollData, true);
 | 
				
			||||||
      await this.appliquerAjoutExperience(rollData, true);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return rolled.isSuccess;
 | 
					    return rolled.isSuccess;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,20 +17,20 @@ export class RdDBaseActorSangSheet extends RdDBaseActorReveSheet {
 | 
				
			|||||||
    // Everything below here is only needed if the sheet is editable
 | 
					    // Everything below here is only needed if the sheet is editable
 | 
				
			||||||
    if (!this.options.editable) return;
 | 
					    if (!this.options.editable) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.creer-blessure-legere').click(async event => RdDItemBlessure.createBlessure(this.actor, 2));
 | 
					    this.html.find('.creer-blessure-legere').click(async event => await RdDItemBlessure.createBlessure(this.actor, 2));
 | 
				
			||||||
    this.html.find('.creer-blessure-grave').click(async event => RdDItemBlessure.createBlessure(this.actor, 4));
 | 
					    this.html.find('.creer-blessure-grave').click(async event => await RdDItemBlessure.createBlessure(this.actor, 4));
 | 
				
			||||||
    this.html.find('.creer-blessure-critique').click(async event => RdDItemBlessure.createBlessure(this.actor, 6));
 | 
					    this.html.find('.creer-blessure-critique').click(async event => await RdDItemBlessure.createBlessure(this.actor, 6));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.subir-blessure-contusion').click(async event => RdDItemBlessure.applyFullBlessure(this.actor, 0));
 | 
					    this.html.find('.subir-blessure-contusion').click(async event => await RdDItemBlessure.applyFullBlessure(this.actor, 0));
 | 
				
			||||||
    this.html.find('.subir-blessure-legere').click(async event => RdDItemBlessure.applyFullBlessure(this.actor, 2));
 | 
					    this.html.find('.subir-blessure-legere').click(async event => await RdDItemBlessure.applyFullBlessure(this.actor, 2));
 | 
				
			||||||
    this.html.find('.subir-blessure-grave').click(async event => RdDItemBlessure.applyFullBlessure(this.actor, 4));
 | 
					    this.html.find('.subir-blessure-grave').click(async event => await RdDItemBlessure.applyFullBlessure(this.actor, 4));
 | 
				
			||||||
    this.html.find('.subir-blessure-critique').click(async event => RdDItemBlessure.applyFullBlessure(this.actor, 6));
 | 
					    this.html.find('.subir-blessure-critique').click(async event => await RdDItemBlessure.applyFullBlessure(this.actor, 6));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.jet-vie').click(async event => this.actor.jetDeVie())
 | 
					    this.html.find('.jet-vie').click(async event => await this.actor.jetDeVie())
 | 
				
			||||||
    this.html.find('.jet-endurance').click(async event => await this.jetEndurance())
 | 
					    this.html.find('.jet-endurance').click(async event => await this.jetEndurance())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.vie-plus').click(async event => this.actor.santeIncDec("vie", 1))
 | 
					    this.html.find('.vie-plus').click(async event => await this.actor.santeIncDec("vie", 1))
 | 
				
			||||||
    this.html.find('.vie-moins').click(async event => this.actor.santeIncDec("vie", -1))
 | 
					    this.html.find('.vie-moins').click(async event => await this.actor.santeIncDec("vie", -1))
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async jetEndurance() {
 | 
					  async jetEndurance() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
import { RdDUtility } from "../rdd-utility.js";
 | 
					import { RdDUtility } from "../rdd-utility.js";
 | 
				
			||||||
import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
 | 
					import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
 | 
				
			||||||
import { STATUSES } from "../settings/status-effects.js";
 | 
					import { STATUSES } from "../settings/status-effects.js";
 | 
				
			||||||
import { ITEM_TYPES } from "../item.js";
 | 
					import { ITEM_TYPES } from "../constants.js";
 | 
				
			||||||
import { RdDBaseActorReve } from "./base-actor-reve.js";
 | 
					import { RdDBaseActorReve } from "./base-actor-reve.js";
 | 
				
			||||||
import { RdDDice } from "../rdd-dice.js";
 | 
					import { RdDDice } from "../rdd-dice.js";
 | 
				
			||||||
import { RdDItemBlessure } from "../item/blessure.js";
 | 
					import { RdDItemBlessure } from "../item/blessure.js";
 | 
				
			||||||
@@ -39,7 +39,12 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
 | 
				
			|||||||
    return 0;
 | 
					    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 }
 | 
					  getFatigueMin() { return this.system.sante.endurance.max - this.system.sante.endurance.value }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  malusFatigue() {
 | 
					  malusFatigue() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,19 +3,23 @@ import { Misc } from "../misc.js";
 | 
				
			|||||||
import { DialogSplitItem } from "../dialog-split-item.js";
 | 
					import { DialogSplitItem } from "../dialog-split-item.js";
 | 
				
			||||||
import { RdDSheetUtility } from "../rdd-sheet-utility.js";
 | 
					import { RdDSheetUtility } from "../rdd-sheet-utility.js";
 | 
				
			||||||
import { Monnaie } from "../item-monnaie.js";
 | 
					import { Monnaie } from "../item-monnaie.js";
 | 
				
			||||||
import { RdDItem, ITEM_TYPES } from "../item.js";
 | 
					import { ITEM_TYPES } from "../constants.js";
 | 
				
			||||||
 | 
					import { RdDItem } from "../item.js";
 | 
				
			||||||
import { RdDItemCompetenceCreature } from "../item-competencecreature.js";
 | 
					import { RdDItemCompetenceCreature } from "../item-competencecreature.js";
 | 
				
			||||||
 | 
					import { RdDTextEditor } from "../apps/rdd-text-roll-editor.js";
 | 
				
			||||||
 | 
					import { ItemAction } from "../item/item-actions.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* -------------------------------------------- */
 | 
					/* -------------------------------------------- */
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Extend the basic ActorSheet with some very simple modifications
 | 
					 * Extend the basic ActorSheet with some very simple modifications
 | 
				
			||||||
 * @extends {ActorSheet}
 | 
					 * @extends {ActorSheet}
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export class RdDBaseActorSheet extends ActorSheet {
 | 
					export class RdDBaseActorSheet extends foundry.appv1.sheets.ActorSheet {
 | 
				
			||||||
 | 
					  static _warnedAppV1 = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /** @override */
 | 
					  /** @override */
 | 
				
			||||||
  static get defaultOptions() {
 | 
					  static get defaultOptions() {
 | 
				
			||||||
    return foundry.utils.mergeObject(ActorSheet.defaultOptions, {
 | 
					    return foundry.utils.mergeObject(foundry.appv1.sheets.ActorSheet.defaultOptions, {
 | 
				
			||||||
      classes: ["rdd", "sheet", "actor"],
 | 
					      classes: ["rdd", "sheet", "actor"],
 | 
				
			||||||
      tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "carac" }],
 | 
					      tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "carac" }],
 | 
				
			||||||
      dragDrop: [{ dragSelector: ".item-list .item", dropSelector: undefined }],
 | 
					      dragDrop: [{ dragSelector: ".item-list .item", dropSelector: undefined }],
 | 
				
			||||||
@@ -25,7 +29,7 @@ export class RdDBaseActorSheet extends ActorSheet {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  /* -------------------------------------------- */
 | 
					  /* -------------------------------------------- */
 | 
				
			||||||
  async getData() {
 | 
					  async getData() {
 | 
				
			||||||
    Monnaie.validerMonnaies(this.actor.itemTypes['monnaie']);
 | 
					    Monnaie.validerMonnaies(this.actor)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.actor.computeEtatGeneral();
 | 
					    this.actor.computeEtatGeneral();
 | 
				
			||||||
    let formData = {
 | 
					    let formData = {
 | 
				
			||||||
@@ -35,13 +39,13 @@ export class RdDBaseActorSheet extends ActorSheet {
 | 
				
			|||||||
      img: this.actor.img,
 | 
					      img: this.actor.img,
 | 
				
			||||||
      name: this.actor.name,
 | 
					      name: this.actor.name,
 | 
				
			||||||
      system: this.actor.system,
 | 
					      system: this.actor.system,
 | 
				
			||||||
      description: await TextEditor.enrichHTML(this.actor.system.description, { async: true }),
 | 
					      description: await RdDTextEditor.enrichHTML(this.actor.system.description, this.actor),
 | 
				
			||||||
      notesmj: await TextEditor.enrichHTML(this.actor.system.notesmj, { async: true }),
 | 
					      notesmj: await RdDTextEditor.enrichHTML(this.actor.system.notesmj, this.actor),
 | 
				
			||||||
      options: RdDSheetUtility.mergeDocumentRights(this.options, this.actor, this.isEditable),
 | 
					      options: RdDSheetUtility.mergeDocumentRights(this.options, this.actor, this.isEditable),
 | 
				
			||||||
      effects: this.actor.effects
 | 
					      effects: this.actor.effects
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    RdDBaseActorSheet.filterItemsPerTypeForSheet(formData, this.actor.itemTypes);
 | 
					    RdDUtility.filterItemsPerTypeForSheet(formData, this.actor.itemTypes);
 | 
				
			||||||
    formData.calc = {
 | 
					    formData.calc = {
 | 
				
			||||||
      fortune: Monnaie.toSolsDeniers(this.actor.getFortune()),
 | 
					      fortune: Monnaie.toSolsDeniers(this.actor.getFortune()),
 | 
				
			||||||
      prixTotalEquipement: this.actor.computePrixTotalEquipement(),
 | 
					      prixTotalEquipement: this.actor.computePrixTotalEquipement(),
 | 
				
			||||||
@@ -53,6 +57,7 @@ export class RdDBaseActorSheet extends ActorSheet {
 | 
				
			|||||||
    formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs);
 | 
					    formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs);
 | 
				
			||||||
    formData.competences.filter(it => it.type == ITEM_TYPES.competencecreature)
 | 
					    formData.competences.filter(it => it.type == ITEM_TYPES.competencecreature)
 | 
				
			||||||
      .forEach(it => it.isdommages = RdDItemCompetenceCreature.isDommages(it))
 | 
					      .forEach(it => it.isdommages = RdDItemCompetenceCreature.isDommages(it))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return formData;
 | 
					    return formData;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -76,109 +81,51 @@ export class RdDBaseActorSheet extends ActorSheet {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* -------------------------------------------- */
 | 
					 | 
				
			||||||
  static filterItemsPerTypeForSheet(formData, itemTypes) {
 | 
					 | 
				
			||||||
    formData.blessures = Misc.arrayOrEmpty(itemTypes['blessure']);
 | 
					 | 
				
			||||||
    formData.recettescuisine = Misc.arrayOrEmpty(itemTypes['recettecuisine']);
 | 
					 | 
				
			||||||
    formData.recettesAlchimiques = Misc.arrayOrEmpty(itemTypes['recettealchimique']);
 | 
					 | 
				
			||||||
    formData.maladies = Misc.arrayOrEmpty(itemTypes['maladie']);
 | 
					 | 
				
			||||||
    formData.poisons = Misc.arrayOrEmpty(itemTypes['poison']);
 | 
					 | 
				
			||||||
    formData.possessions = Misc.arrayOrEmpty(itemTypes['possession']);
 | 
					 | 
				
			||||||
    formData.maladiesPoisons = formData.maladies.concat(formData.poisons);
 | 
					 | 
				
			||||||
    formData.competences = (itemTypes['competence'] ?? []).concat(itemTypes['competencecreature'] ?? []);
 | 
					 | 
				
			||||||
    formData.sortsReserve = Misc.arrayOrEmpty(itemTypes['sortreserve']);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    formData.sorts = Misc.arrayOrEmpty(itemTypes['sort']);
 | 
					 | 
				
			||||||
    formData.rencontres = Misc.arrayOrEmpty(itemTypes['rencontre']);
 | 
					 | 
				
			||||||
    formData.casestmr = Misc.arrayOrEmpty(itemTypes['casetmr']);
 | 
					 | 
				
			||||||
    formData.signesdraconiques = Misc.arrayOrEmpty(itemTypes['signedraconique']);
 | 
					 | 
				
			||||||
    formData.queues = Misc.arrayOrEmpty(itemTypes['queue']);
 | 
					 | 
				
			||||||
    formData.souffles = Misc.arrayOrEmpty(itemTypes['souffle']);
 | 
					 | 
				
			||||||
    formData.ombres = Misc.arrayOrEmpty(itemTypes['ombre']);
 | 
					 | 
				
			||||||
    formData.tetes = Misc.arrayOrEmpty(itemTypes['tete']);
 | 
					 | 
				
			||||||
    formData.taches = Misc.arrayOrEmpty(itemTypes['tache']);
 | 
					 | 
				
			||||||
    formData.meditations = Misc.arrayOrEmpty(itemTypes['meditation']);
 | 
					 | 
				
			||||||
    formData.chants = Misc.arrayOrEmpty(itemTypes['chant']);
 | 
					 | 
				
			||||||
    formData.danses = Misc.arrayOrEmpty(itemTypes['danse']);
 | 
					 | 
				
			||||||
    formData.musiques = Misc.arrayOrEmpty(itemTypes['musique']);
 | 
					 | 
				
			||||||
    formData.oeuvres = Misc.arrayOrEmpty(itemTypes['oeuvre']);
 | 
					 | 
				
			||||||
    formData.jeux = Misc.arrayOrEmpty(itemTypes['jeu']);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    formData.services = Misc.arrayOrEmpty(itemTypes['service']);
 | 
					 | 
				
			||||||
    formData.conteneurs = Misc.arrayOrEmpty(itemTypes['conteneur']);
 | 
					 | 
				
			||||||
    formData.materiel = Misc.arrayOrEmpty(itemTypes['objet']);
 | 
					 | 
				
			||||||
    formData.armes = Misc.arrayOrEmpty(itemTypes['arme']);
 | 
					 | 
				
			||||||
    formData.armures = Misc.arrayOrEmpty(itemTypes['armure']);
 | 
					 | 
				
			||||||
    formData.munitions = Misc.arrayOrEmpty(itemTypes['munition']);
 | 
					 | 
				
			||||||
    formData.livres = Misc.arrayOrEmpty(itemTypes['livre']);
 | 
					 | 
				
			||||||
    formData.potions = Misc.arrayOrEmpty(itemTypes['potion']);
 | 
					 | 
				
			||||||
    formData.plantes = Misc.arrayOrEmpty(itemTypes['plante']);
 | 
					 | 
				
			||||||
    formData.ingredients = Misc.arrayOrEmpty(itemTypes['ingredient']);
 | 
					 | 
				
			||||||
    formData.faunes = Misc.arrayOrEmpty(itemTypes['faune']);
 | 
					 | 
				
			||||||
    formData.herbes = Misc.arrayOrEmpty(itemTypes['herbe']);
 | 
					 | 
				
			||||||
    formData.nourritureboissons = Misc.arrayOrEmpty(itemTypes['nourritureboisson']);
 | 
					 | 
				
			||||||
    formData.gemmes = Misc.arrayOrEmpty(itemTypes['gemme']);
 | 
					 | 
				
			||||||
    formData.monnaies = Misc.arrayOrEmpty(itemTypes['monnaie']).sort(Monnaie.triValeurEntiere());
 | 
					 | 
				
			||||||
    formData.objets = Misc.arrayOrEmpty(itemTypes['objet'])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    formData.inventaires = RdDItem.getItemTypesInventaire('all')
 | 
					 | 
				
			||||||
      .map(t => Misc.arrayOrEmpty(itemTypes[t]))
 | 
					 | 
				
			||||||
      .reduce((a, b) => a.concat(b), [])
 | 
					 | 
				
			||||||
      .sort(Misc.ascending(it => it.name));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  /* -------------------------------------------- */  /** @override */
 | 
					  /* -------------------------------------------- */  /** @override */
 | 
				
			||||||
  activateListeners(html) {
 | 
					  activateListeners(html) {
 | 
				
			||||||
    super.activateListeners(html);
 | 
					    super.activateListeners(html);
 | 
				
			||||||
    this.html = html;
 | 
					    this.html = html;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this.html.find('.actionItem').click(async event => await ItemAction.onActionItem(event, this.actor, this.options))
 | 
				
			||||||
 | 
					    this.html.find('.item-edit').click(async event => await this.itemActionEdit(event))
 | 
				
			||||||
    this.html.find('.conteneur-name a').click(async event => {
 | 
					    this.html.find('.conteneur-name a').click(async event => {
 | 
				
			||||||
      RdDUtility.toggleAfficheContenu(this.getItemId(event));
 | 
					      RdDUtility.toggleAfficheContenu(this.getItemId(event))
 | 
				
			||||||
      this.render(true);
 | 
					      this.render(true)
 | 
				
			||||||
    });
 | 
					    })
 | 
				
			||||||
    this.html.find('.actor-montrer').click(async event => this.actor.postActorToChat());
 | 
					
 | 
				
			||||||
    this.html.find('.item-edit').click(async event => this.getItem(event)?.sheet.render(true))
 | 
					    this.html.find('.actor-montrer').click(async event => await this.actor.postActorToChat());
 | 
				
			||||||
    this.html.find('.item-montrer').click(async event => this.getItem(event)?.postItemToChat());
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.recherche')
 | 
					    this.html.find('.recherche')
 | 
				
			||||||
      .each((index, field) => {
 | 
					      .each((index, field) => {
 | 
				
			||||||
        this._rechercheSelectArea(field);
 | 
					        this._rechercheSelectArea(field);
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
      .keyup(async event => this._rechercherKeyup(event))
 | 
					      .keyup(async event => this._rechercherKeyup(event))
 | 
				
			||||||
      .change(async event => this._rechercherKeyup(event));
 | 
					      .change(async event => this._rechercherKeyup(event))
 | 
				
			||||||
    this.html.find('.recherche').prop("disabled", false);
 | 
					
 | 
				
			||||||
 | 
					    this.html.find('.recherche').prop("disabled", false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Everything below here is only needed if the sheet is editable
 | 
					    // Everything below here is only needed if the sheet is editable
 | 
				
			||||||
    if (!this.options.editable) return;
 | 
					    if (!this.options.editable) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.item-action').click(async event => {
 | 
					    this.html.find('.item-equip-armure').click(async event => await this.actor.equiperObjet(this.getItem(event)))
 | 
				
			||||||
      const item = RdDSheetUtility.getItem(event, this.actor);
 | 
					    this.html.find('.item-delete').click(async event => await RdDUtility.confirmActorItemDelete(this.getItem(event), this.actor));
 | 
				
			||||||
      item?.actionPrincipale(this.actor, async () => this.render())
 | 
					    this.html.find('.item-quantite-plus').click(async event => await this.actor.itemQuantiteIncDec(this.getItemId(event), 1));
 | 
				
			||||||
    });
 | 
					    this.html.find('.item-quantite-moins').click(async event => await this.actor.itemQuantiteIncDec(this.getItemId(event), -1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this.html.find('.creer-un-objet').click(async event => await this.selectObjetTypeToCreate())
 | 
				
			||||||
    this.html.find('.item-split').click(async event => {
 | 
					    this.html.find('.nettoyer-conteneurs').click(async event => await this.actor.nettoyerConteneurs())
 | 
				
			||||||
      const item = this.getItem(event);
 | 
					 | 
				
			||||||
      RdDSheetUtility.splitItem(item, this.actor);
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    this.html.find('.item-quantite-plus').click(async event => this.actor.itemQuantiteIncDec(this.getItemId(event), 1));
 | 
					 | 
				
			||||||
    this.html.find('.item-quantite-moins').click(async event => this.actor.itemQuantiteIncDec(this.getItemId(event), -1));
 | 
					 | 
				
			||||||
    this.html.find('.item-delete').click(async event => RdDUtility.confirmActorItemDelete(this, this.getItem(event)));
 | 
					 | 
				
			||||||
    this.html.find('.item-vendre').click(async event => this.vendre(this.getItem(event)));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    this.html.find('.creer-un-objet').click(async event => {
 | 
					 | 
				
			||||||
      this.selectObjetTypeToCreate();
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    this.html.find('.nettoyer-conteneurs').click(async event => {
 | 
					 | 
				
			||||||
      this.actor.nettoyerConteneurs();
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.vue-detaillee').click(async event => {
 | 
					    this.html.find('.vue-detaillee').click(async event => {
 | 
				
			||||||
      this.options.vueDetaillee = !this.options.vueDetaillee;
 | 
					      this.options.vueDetaillee = !this.options.vueDetaillee
 | 
				
			||||||
      this.render(true);
 | 
					      this.render(true)
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  itemActionEdit(event) {
 | 
				
			||||||
 | 
					    const item = this.getItem(event);
 | 
				
			||||||
 | 
					    return item?.sheet.render(true);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _rechercherKeyup(event) {
 | 
					  _rechercherKeyup(event) {
 | 
				
			||||||
    const currentTarget = event.currentTarget;
 | 
					    const currentTarget = event.currentTarget;
 | 
				
			||||||
    const nouvelleRecherche = this._optionRecherche(currentTarget);
 | 
					    const nouvelleRecherche = this._optionRecherche(currentTarget);
 | 
				
			||||||
@@ -245,7 +192,7 @@ export class RdDBaseActorSheet extends ActorSheet {
 | 
				
			|||||||
  /* -------------------------------------------- */
 | 
					  /* -------------------------------------------- */
 | 
				
			||||||
  async selectObjetTypeToCreate() {
 | 
					  async selectObjetTypeToCreate() {
 | 
				
			||||||
    let types = this.getTypesInventaire().sort(Misc.ascending(type => Misc.typeName('Item', type)));
 | 
					    let types = this.getTypesInventaire().sort(Misc.ascending(type => Misc.typeName('Item', type)));
 | 
				
			||||||
    let content = `<span class="competence-label">Selectionnez le type d'équipement</span><select class="item-type">`;
 | 
					    let content = `<span class="generic-label">Selectionnez le type d'équipement</span><select class="item-type">`;
 | 
				
			||||||
    for (let typeName of types) {
 | 
					    for (let typeName of types) {
 | 
				
			||||||
      content += `<option value="${typeName}">${Misc.typeName('Item', typeName)}</option>`
 | 
					      content += `<option value="${typeName}">${Misc.typeName('Item', typeName)}</option>`
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,7 +3,7 @@ import { ChatUtility } from "../chat-utility.js";
 | 
				
			|||||||
import { SYSTEM_SOCKET_ID } from "../constants.js";
 | 
					import { SYSTEM_SOCKET_ID } from "../constants.js";
 | 
				
			||||||
import { Grammar } from "../grammar.js";
 | 
					import { Grammar } from "../grammar.js";
 | 
				
			||||||
import { Monnaie } from "../item-monnaie.js";
 | 
					import { Monnaie } from "../item-monnaie.js";
 | 
				
			||||||
import { ITEM_TYPES } from "../item.js";
 | 
					import { ITEM_TYPES } from "../constants.js";
 | 
				
			||||||
import { Misc } from "../misc.js";
 | 
					import { Misc } from "../misc.js";
 | 
				
			||||||
import { RdDAudio } from "../rdd-audio.js";
 | 
					import { RdDAudio } from "../rdd-audio.js";
 | 
				
			||||||
import { RdDConfirm } from "../rdd-confirm.js";
 | 
					import { RdDConfirm } from "../rdd-confirm.js";
 | 
				
			||||||
@@ -21,7 +21,7 @@ export class RdDBaseActor extends Actor {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  static $findCaracByName(carac, name) {
 | 
					  static $findCaracByName(carac, name) {
 | 
				
			||||||
    const caracList = Object.entries(carac);
 | 
					    const caracList = Object.entries(carac);
 | 
				
			||||||
    let entry = Misc.findFirstLike(name, caracList, { mapper: it => it[0], description: 'caractéristique' });
 | 
					    let entry = Misc.findFirstLike(name, caracList, { mapper: it => it[0], description: 'caractéristique', onMessage: m => { } });
 | 
				
			||||||
    if (!entry || entry.length == 0) {
 | 
					    if (!entry || entry.length == 0) {
 | 
				
			||||||
      entry = Misc.findFirstLike(name, caracList, { mapper: it => it[1].label, description: 'caractéristique' });
 | 
					      entry = Misc.findFirstLike(name, caracList, { mapper: it => it[1].label, description: 'caractéristique' });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -81,7 +81,6 @@ export class RdDBaseActor extends Actor {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
  static getRealActor(actorId, tokenId) {
 | 
					  static getRealActor(actorId, tokenId) {
 | 
				
			||||||
    if (tokenId) {
 | 
					    if (tokenId) {
 | 
				
			||||||
      let token = canvas.tokens.get(tokenId)
 | 
					      let token = canvas.tokens.get(tokenId)
 | 
				
			||||||
@@ -161,8 +160,11 @@ export class RdDBaseActor extends Actor {
 | 
				
			|||||||
    return RdDBaseActor.$findCaracByName(carac, name);
 | 
					    return RdDBaseActor.$findCaracByName(carac, name);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mapCarac(caracCode) { return caracCode }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  getCaracByName(name) {
 | 
					  getCaracByName(name) {
 | 
				
			||||||
    switch (Grammar.toLowerCaseNoAccent(name)) {
 | 
					    name = this.mapCarac(Grammar.toLowerCaseNoAccent(name))
 | 
				
			||||||
 | 
					    switch (name) {
 | 
				
			||||||
      case 'reve-actuel': case 'reve actuel':
 | 
					      case 'reve-actuel': case 'reve actuel':
 | 
				
			||||||
        return this.getCaracReveActuel();
 | 
					        return this.getCaracReveActuel();
 | 
				
			||||||
      case 'chance-actuelle': case 'chance-actuelle':
 | 
					      case 'chance-actuelle': case 'chance-actuelle':
 | 
				
			||||||
@@ -242,16 +244,19 @@ export class RdDBaseActor extends Actor {
 | 
				
			|||||||
  async onUpdateActor(update, options, actorId) { }
 | 
					  async onUpdateActor(update, options, actorId) { }
 | 
				
			||||||
  async onDeleteItem(item, options, id) {
 | 
					  async onDeleteItem(item, options, id) {
 | 
				
			||||||
    if (item.isInventaire()) {
 | 
					    if (item.isInventaire()) {
 | 
				
			||||||
      this._removeItemFromConteneur(item)
 | 
					      await this._removeItemFromConteneur(item)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _removeItemFromConteneur(item) {
 | 
					  async _removeItemFromConteneur(item) {
 | 
				
			||||||
    this.items.filter(it => it.isConteneur() && it.system.contenu.includes(item.id))
 | 
					    const updates = this.items.filter(it => it.isConteneur() && it.system.contenu.includes(item.id))
 | 
				
			||||||
      .forEach(conteneur => {
 | 
					      .map(conteneur => {
 | 
				
			||||||
        const nouveauContenu = conteneur.system.contenu.filter(id => id != item.id);
 | 
					        const nouveauContenu = conteneur.system.contenu.filter(id => id != item.id)
 | 
				
			||||||
        conteneur.update({ 'system.contenu': nouveauContenu });
 | 
					        return { _id: conteneur.id, 'system.contenu': nouveauContenu }
 | 
				
			||||||
      });
 | 
					      })
 | 
				
			||||||
 | 
					    if (updates.length > 0) {
 | 
				
			||||||
 | 
					      await this.updateEmbeddedDocuments('Item', updates)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async onTimeChanging(oldTimestamp, newTimestamp) {
 | 
					  async onTimeChanging(oldTimestamp, newTimestamp) {
 | 
				
			||||||
@@ -412,7 +417,7 @@ export class RdDBaseActor extends Actor {
 | 
				
			|||||||
      user: achat.userId,
 | 
					      user: achat.userId,
 | 
				
			||||||
      speaker: { alias: (acheteur ?? vendeur).getAlias() },
 | 
					      speaker: { alias: (acheteur ?? vendeur).getAlias() },
 | 
				
			||||||
      whisper: ChatUtility.getOwners(this),
 | 
					      whisper: ChatUtility.getOwners(this),
 | 
				
			||||||
      content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-achat-item.html', chatAchatItem)
 | 
					      content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-achat-item.hbs', chatAchatItem)
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!achat.vente.quantiteIllimite) {
 | 
					    if (!achat.vente.quantiteIllimite) {
 | 
				
			||||||
@@ -729,31 +734,26 @@ export class RdDBaseActor extends Actor {
 | 
				
			|||||||
      name: this.getAlias(),
 | 
					      name: this.getAlias(),
 | 
				
			||||||
      system: { description: this.system.description }
 | 
					      system: { description: this.system.description }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    renderTemplate('systems/foundryvtt-reve-de-dragon/templates/post-actor.html', chatData)
 | 
					    foundry.applications.handlebars.renderTemplate('systems/foundryvtt-reve-de-dragon/templates/post-actor.hbs', chatData)
 | 
				
			||||||
      .then(html => ChatMessage.create(RdDUtility.chatDataSetup(html, modeOverride)));
 | 
					      .then(html => ChatMessage.create(RdDUtility.chatDataSetup(html, modeOverride)));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  actionImpossible(action) {
 | 
					  actionImpossible(action) {
 | 
				
			||||||
    ui.notifications.info(`${this.getAlias()} ne peut pas faire cette action: ${action}`)
 | 
					    ui.notifications.info(`${this.getAlias()} ne peut pas faire cette action: ${action}`)
 | 
				
			||||||
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async jetEthylisme() { this.actionImpossible("jet d'éthylisme") }
 | 
					  async jetEthylisme() { this.actionImpossible("jet d'éthylisme") }
 | 
				
			||||||
  async rollAppelChance() { this.actionImpossible("appel à la chance") }
 | 
					  async rollAppelChance() { this.actionImpossible("appel à la chance") }
 | 
				
			||||||
  async jetDeMoral() { this.actionImpossible("jet de moral") }
 | 
					  async jetDeMoral() { this.actionImpossible("jet de moral") }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async actionPrincipale(item, onActionItem = async () => { }) {
 | 
					 | 
				
			||||||
    switch (item.type) {
 | 
					 | 
				
			||||||
      case ITEM_TYPES.conteneur: return await item.sheet.render(true);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return undefined
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  async resetItemUse() { }
 | 
					  async resetItemUse() { }
 | 
				
			||||||
  async incDecItemUse(itemId, inc = 1) { }
 | 
					  async incDecItemUse(itemId, shouldIncrease = true) { }
 | 
				
			||||||
  getItemUse(itemId) { return 0; }
 | 
					  getItemUse(itemId) { return 0; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async finDeRound(options = { terminer: false }) { }
 | 
					  async finDeRound(options = { terminer: false }) { }
 | 
				
			||||||
  isActorCombat() { return false }
 | 
					  isActorCombat() { return false }
 | 
				
			||||||
  getCaracInit(competence) { return 0 }
 | 
					  getCaracInit(competence) { return 0 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  listActionsCombat() { return [] }
 | 
					  listActionsCombat() { return [] }
 | 
				
			||||||
  listActionsPossessions() {
 | 
					  listActionsPossessions() {
 | 
				
			||||||
    return this.itemTypes[ITEM_TYPES.possession]
 | 
					    return this.itemTypes[ITEM_TYPES.possession]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,4 @@
 | 
				
			|||||||
import { DialogItemAchat } from "../achat-vente/dialog-item-achat.js";
 | 
					 | 
				
			||||||
import { RdDItem } from "../item.js";
 | 
					import { RdDItem } from "../item.js";
 | 
				
			||||||
import { RdDUtility } from "../rdd-utility.js";
 | 
					 | 
				
			||||||
import { RdDBaseActorSheet } from "./base-actor-sheet.js";
 | 
					import { RdDBaseActorSheet } from "./base-actor-sheet.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -12,7 +10,7 @@ export class RdDCommerceSheet extends RdDBaseActorSheet {
 | 
				
			|||||||
  /** @override */
 | 
					  /** @override */
 | 
				
			||||||
  static get defaultOptions() {
 | 
					  static get defaultOptions() {
 | 
				
			||||||
    return foundry.utils.mergeObject(super.defaultOptions, {
 | 
					    return foundry.utils.mergeObject(super.defaultOptions, {
 | 
				
			||||||
      template: "systems/foundryvtt-reve-de-dragon/templates/actor/commerce-actor-sheet.html",
 | 
					      template: "systems/foundryvtt-reve-de-dragon/templates/actor/commerce-actor-sheet.hbs",
 | 
				
			||||||
      width: 600, height: 720,
 | 
					      width: 600, height: 720,
 | 
				
			||||||
      tabs: []
 | 
					      tabs: []
 | 
				
			||||||
    }, { inplace: false })
 | 
					    }, { inplace: false })
 | 
				
			||||||
@@ -44,12 +42,8 @@ export class RdDCommerceSheet extends RdDBaseActorSheet {
 | 
				
			|||||||
  activateListeners(html) {
 | 
					  activateListeners(html) {
 | 
				
			||||||
    super.activateListeners(html);
 | 
					    super.activateListeners(html);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('a.item-acheter').click(async event => await this.vente(this.getItem(event)));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!this.options.editable) return;
 | 
					    if (!this.options.editable) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('a.item-quantite-moins').click(async event => await this.getItem(event)?.quantiteIncDec(-1, { supprimerSiZero: false }));
 | 
					 | 
				
			||||||
    this.html.find('a.item-quantite-plus').click(async event => await this.getItem(event)?.quantiteIncDec(1));
 | 
					 | 
				
			||||||
    this.html.find('input.item-quantite').change(async event => {
 | 
					    this.html.find('input.item-quantite').change(async event => {
 | 
				
			||||||
      const newQuantite = Math.max(0, Number.parseInt(this.html.find(event.currentTarget).val()));
 | 
					      const newQuantite = Math.max(0, Number.parseInt(this.html.find(event.currentTarget).val()));
 | 
				
			||||||
      await this.getItem(event)?.update({ "system.quantite": newQuantite });
 | 
					      await this.getItem(event)?.update({ "system.quantite": newQuantite });
 | 
				
			||||||
@@ -63,28 +57,4 @@ export class RdDCommerceSheet extends RdDBaseActorSheet {
 | 
				
			|||||||
  getTypesInventaire() {
 | 
					  getTypesInventaire() {
 | 
				
			||||||
    return RdDItem.getItemTypesInventaire('all');
 | 
					    return RdDItem.getItemTypesInventaire('all');
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  async vente(item) {
 | 
					 | 
				
			||||||
    const acheteur = RdDUtility.getSelectedActor();
 | 
					 | 
				
			||||||
    if (!acheteur) {
 | 
					 | 
				
			||||||
      ui.notifications.warn(`Pas d'acheteur sélectionné`);
 | 
					 | 
				
			||||||
      return;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    const disponible = this.actor.getQuantiteDisponible(item)
 | 
					 | 
				
			||||||
    if (disponible == 0) {
 | 
					 | 
				
			||||||
      ui.notifications.warn(`${this.getAlias()} n'a plus de ${item.name} en vente`);
 | 
					 | 
				
			||||||
      return;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    await DialogItemAchat.onAcheter({
 | 
					 | 
				
			||||||
      item,
 | 
					 | 
				
			||||||
      vendeur: this.actor,
 | 
					 | 
				
			||||||
      acheteur,
 | 
					 | 
				
			||||||
      quantiteIllimite: disponible == undefined,
 | 
					 | 
				
			||||||
      nbLots: disponible ?? 1,
 | 
					 | 
				
			||||||
      tailleLot: 1,
 | 
					 | 
				
			||||||
      prixLot: item.calculerPrixCommercant()
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,6 @@
 | 
				
			|||||||
 | 
					import { DialogItemAchat } from "../achat-vente/dialog-item-achat.js";
 | 
				
			||||||
import { Misc } from "../misc.js";
 | 
					import { Misc } from "../misc.js";
 | 
				
			||||||
 | 
					import { RdDUtility } from "../rdd-utility.js";
 | 
				
			||||||
import { RdDBaseActor } from "./base-actor.js";
 | 
					import { RdDBaseActor } from "./base-actor.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class RdDCommerce extends RdDBaseActor {
 | 
					export class RdDCommerce extends RdDBaseActor {
 | 
				
			||||||
@@ -37,4 +39,27 @@ export class RdDCommerce extends RdDBaseActor {
 | 
				
			|||||||
    const pourcentage = this.system.pourcentage ?? 100;
 | 
					    const pourcentage = this.system.pourcentage ?? 100;
 | 
				
			||||||
    return Misc.keepDecimals(Math.ceil(item.system.cout * pourcentage) / 100, 2);
 | 
					    return Misc.keepDecimals(Math.ceil(item.system.cout * pourcentage) / 100, 2);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  async vente(item) {
 | 
				
			||||||
 | 
					    const acheteur = RdDUtility.getSelectedActor();
 | 
				
			||||||
 | 
					    if (!acheteur) {
 | 
				
			||||||
 | 
					      ui.notifications.warn(`Pas d'acheteur sélectionné`);
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    const disponible = this.getQuantiteDisponible(item)
 | 
				
			||||||
 | 
					    if (disponible == 0) {
 | 
				
			||||||
 | 
					      ui.notifications.warn(`${this.getAlias()} n'a plus de ${item.name} en vente`);
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await DialogItemAchat.onAcheter({
 | 
				
			||||||
 | 
					      item,
 | 
				
			||||||
 | 
					      vendeur: this,
 | 
				
			||||||
 | 
					      acheteur,
 | 
				
			||||||
 | 
					      quantiteIllimite: disponible == undefined,
 | 
				
			||||||
 | 
					      nbLots: disponible ?? 1,
 | 
				
			||||||
 | 
					      tailleLot: 1,
 | 
				
			||||||
 | 
					      prixLot: item.calculerPrixCommercant()
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -10,7 +10,7 @@ export class RdDCreatureSheet extends RdDBaseActorSangSheet {
 | 
				
			|||||||
  /** @override */
 | 
					  /** @override */
 | 
				
			||||||
  static get defaultOptions() {
 | 
					  static get defaultOptions() {
 | 
				
			||||||
    return foundry.utils.mergeObject(RdDBaseActorSangSheet.defaultOptions, {
 | 
					    return foundry.utils.mergeObject(RdDBaseActorSangSheet.defaultOptions, {
 | 
				
			||||||
      template: "systems/foundryvtt-reve-de-dragon/templates/actor-creature-sheet.html",
 | 
					      template: "systems/foundryvtt-reve-de-dragon/templates/actor-creature-sheet.hbs",
 | 
				
			||||||
      width: 640, height: 720
 | 
					      width: 640, height: 720
 | 
				
			||||||
    }, { inplace: false })
 | 
					    }, { inplace: false })
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -26,15 +26,15 @@ export class RdDCreatureSheet extends RdDBaseActorSangSheet {
 | 
				
			|||||||
    // On competence change
 | 
					    // On competence change
 | 
				
			||||||
    this.html.find('.creature-carac').change(async event => {
 | 
					    this.html.find('.creature-carac').change(async event => {
 | 
				
			||||||
      let compName = event.currentTarget.attributes.compname.value;
 | 
					      let compName = event.currentTarget.attributes.compname.value;
 | 
				
			||||||
      this.actor.updateCreatureCompetence(compName, "carac_value", parseInt(event.target.value));
 | 
					      await this.actor.updateCreatureCompetence(compName, "carac_value", parseInt(event.target.value));
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    this.html.find('.creature-niveau').change(async event => {
 | 
					    this.html.find('.creature-niveau').change(async event => {
 | 
				
			||||||
      let compName = event.currentTarget.attributes.compname.value;
 | 
					      let compName = event.currentTarget.attributes.compname.value;
 | 
				
			||||||
      this.actor.updateCreatureCompetence(compName, "niveau", parseInt(event.target.value));
 | 
					      await this.actor.updateCreatureCompetence(compName, "niveau", parseInt(event.target.value));
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    this.html.find('.creature-dommages').change(async event => {
 | 
					    this.html.find('.creature-dommages').change(async event => {
 | 
				
			||||||
      let compName = event.currentTarget.attributes.compname.value;
 | 
					      let compName = event.currentTarget.attributes.compname.value;
 | 
				
			||||||
      this.actor.updateCreatureCompetence(compName, "dommages", parseInt(event.target.value));
 | 
					      await this.actor.updateCreatureCompetence(compName, "dommages", parseInt(event.target.value));
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,6 @@
 | 
				
			|||||||
import { ITEM_TYPES } from "../item.js";
 | 
					import { Grammar } from "../grammar.js";
 | 
				
			||||||
 | 
					import { ITEM_TYPES } from "../constants.js";
 | 
				
			||||||
 | 
					import { LIST_CARAC_AUTRES } from "../rdd-carac.js";
 | 
				
			||||||
import { RdDBaseActorSang } from "./base-actor-sang.js";
 | 
					import { RdDBaseActorSang } from "./base-actor-sang.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class RdDCreature extends RdDBaseActorSang {
 | 
					export class RdDCreature extends RdDBaseActorSang {
 | 
				
			||||||
@@ -32,4 +34,16 @@ export class RdDCreature extends RdDBaseActorSang {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mapCarac(caracCode) {
 | 
				
			||||||
 | 
					    switch (caracCode) {
 | 
				
			||||||
 | 
					      case 'vue': case 'ouie': case 'odoratgout': case 'empathie': case 'perception':
 | 
				
			||||||
 | 
					        return 'perception'
 | 
				
			||||||
 | 
					      case 'agilite':
 | 
				
			||||||
 | 
					        return 'force'
 | 
				
			||||||
 | 
					      case 'force': case 'constitution': case 'taille': case 'reve': case 'volonte':
 | 
				
			||||||
 | 
					        return caracCode
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return undefined
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@ export class RdDActorEntiteSheet extends RdDBaseActorReveSheet {
 | 
				
			|||||||
  /** @override */
 | 
					  /** @override */
 | 
				
			||||||
  static get defaultOptions() {
 | 
					  static get defaultOptions() {
 | 
				
			||||||
    return foundry.utils.mergeObject(RdDBaseActorReveSheet.defaultOptions, {
 | 
					    return foundry.utils.mergeObject(RdDBaseActorReveSheet.defaultOptions, {
 | 
				
			||||||
      template: "systems/foundryvtt-reve-de-dragon/templates/actor-entite-sheet.html",
 | 
					      template: "systems/foundryvtt-reve-de-dragon/templates/actor-entite-sheet.hbs",
 | 
				
			||||||
      width: 640, height: 720,
 | 
					      width: 640, height: 720,
 | 
				
			||||||
    }, { inplace: false })
 | 
					    }, { inplace: false })
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -33,15 +33,15 @@ export class RdDActorEntiteSheet extends RdDBaseActorReveSheet {
 | 
				
			|||||||
    // On competence change
 | 
					    // On competence change
 | 
				
			||||||
    this.html.find('.creature-carac').change(async event => {
 | 
					    this.html.find('.creature-carac').change(async event => {
 | 
				
			||||||
      let compName = event.currentTarget.attributes.compname.value;
 | 
					      let compName = event.currentTarget.attributes.compname.value;
 | 
				
			||||||
      this.actor.updateCreatureCompetence(compName, "carac_value", parseInt(event.target.value));
 | 
					      await this.actor.updateCreatureCompetence(compName, "carac_value", parseInt(event.target.value));
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    this.html.find('.creature-dommages').change(async event => {
 | 
					    this.html.find('.creature-dommages').change(async event => {
 | 
				
			||||||
      let compName = event.currentTarget.attributes.compname.value;
 | 
					      let compName = event.currentTarget.attributes.compname.value;
 | 
				
			||||||
      this.actor.updateCreatureCompetence(compName, "dommages", parseInt(event.target.value));
 | 
					      await this.actor.updateCreatureCompetence(compName, "dommages", parseInt(event.target.value));
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.resonance-add').click(async event =>
 | 
					    this.html.find('.resonance-add').click(async event =>
 | 
				
			||||||
      DialogSelect.select({
 | 
					      await DialogSelect.select({
 | 
				
			||||||
        label: "Choisir un acteur à accorder",
 | 
					        label: "Choisir un acteur à accorder",
 | 
				
			||||||
        list: game.actors.filter(it => it.isPersonnage() && it.prototypeToken.actorLink)
 | 
					        list: game.actors.filter(it => it.isPersonnage() && it.prototypeToken.actorLink)
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
import { ENTITE_INCARNE, ENTITE_NONINCARNE } from "../constants.js";
 | 
					import { ENTITE_INCARNE, ENTITE_NONINCARNE } from "../constants.js";
 | 
				
			||||||
import { ITEM_TYPES } from "../item.js";
 | 
					import { ITEM_TYPES } from "../constants.js";
 | 
				
			||||||
import { Misc } from "../misc.js";
 | 
					import { Misc } from "../misc.js";
 | 
				
			||||||
import { RdDCarac } from "../rdd-carac.js";
 | 
					import { RdDCarac } from "../rdd-carac.js";
 | 
				
			||||||
import { RdDEncaisser } from "../rdd-roll-encaisser.js";
 | 
					import { RdDEncaisser } from "../rdd-roll-encaisser.js";
 | 
				
			||||||
@@ -117,4 +117,14 @@ export class RdDEntite extends RdDBaseActorReve {
 | 
				
			|||||||
      super.setEntiteReveAccordee(actor)
 | 
					      super.setEntiteReveAccordee(actor)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mapCarac(caracCode) {
 | 
				
			||||||
 | 
					    switch (caracCode) {
 | 
				
			||||||
 | 
					      case 'taille':
 | 
				
			||||||
 | 
					      case 'reve':
 | 
				
			||||||
 | 
					        return caracCode
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return 'reve'
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,8 +6,8 @@ import { ExportScriptarium } from "./export-scriptarium.js";
 | 
				
			|||||||
import { CATEGORIES_COMPETENCES, CATEGORIES_DRACONIC, Mapping } from "./mapping.js";
 | 
					import { CATEGORIES_COMPETENCES, CATEGORIES_DRACONIC, Mapping } from "./mapping.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class RdDActorExportSheet extends RdDActorSheet {
 | 
					export class RdDActorExportSheet extends RdDActorSheet {
 | 
				
			||||||
  static async init() {
 | 
					  static init() {
 | 
				
			||||||
    await 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/arme.hbs",
 | 
				
			||||||
      "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/blessure.hbs",
 | 
					      "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/blessure.hbs",
 | 
				
			||||||
      "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/blessures.hbs",
 | 
					      "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/blessures.hbs",
 | 
				
			||||||
@@ -21,8 +21,9 @@ export class RdDActorExportSheet extends RdDActorSheet {
 | 
				
			|||||||
      "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/protection.hbs",
 | 
					      "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/protection.hbs",
 | 
				
			||||||
      "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/sort.hbs",
 | 
					      "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/sort.hbs",
 | 
				
			||||||
    ])
 | 
					    ])
 | 
				
			||||||
    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() {
 | 
					  static get defaultOptions() {
 | 
				
			||||||
    return foundry.utils.mergeObject(RdDActorSheet.defaultOptions, {
 | 
					    return foundry.utils.mergeObject(RdDActorSheet.defaultOptions, {
 | 
				
			||||||
      template: "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/actor-encart-sheet.hbs",
 | 
					      template: "systems/foundryvtt-reve-de-dragon/templates/actor/export-scriptarium/actor-encart-sheet.hbs",
 | 
				
			||||||
@@ -103,13 +104,12 @@ export class RdDActorExportSheet extends RdDActorSheet {
 | 
				
			|||||||
    this.html.find('.click-blessure-add').click(async event =>
 | 
					    this.html.find('.click-blessure-add').click(async event =>
 | 
				
			||||||
      await this.actor.ajouterBlessure({
 | 
					      await this.actor.ajouterBlessure({
 | 
				
			||||||
        gravite: this.html.find(event.currentTarget).data('gravite')
 | 
					        gravite: this.html.find(event.currentTarget).data('gravite')
 | 
				
			||||||
        // event.currentTarget.attributes['data-gravite'].value
 | 
					 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    this.html.find('.button-export').click(async event => {
 | 
					    this.html.find('.button-export').click(async event => await
 | 
				
			||||||
      ExportScriptarium.INSTANCE.exportActors([this.actor],
 | 
					      ExportScriptarium.INSTANCE.exportActors([this.actor],
 | 
				
			||||||
        `${this.actor.uuid}-${this.actor.name}`
 | 
					        `${this.actor.uuid}-${this.actor.name}`
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
    })
 | 
					    )
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,9 +1,9 @@
 | 
				
			|||||||
import { ACTOR_TYPES } from "../../item.js"
 | 
					import { ACTOR_TYPES } from "../../constants.js"
 | 
				
			||||||
import { Misc } from "../../misc.js"
 | 
					import { Misc } from "../../misc.js"
 | 
				
			||||||
import { EXPORT_CSV_SCRIPTARIUM, OptionsAvancees } from "../../settings/options-avancees.js"
 | 
					import { EXPORT_CSV_SCRIPTARIUM, OptionsAvancees } from "../../settings/options-avancees.js"
 | 
				
			||||||
import { Mapping } from "./mapping.js"
 | 
					import { Mapping } from "./mapping.js"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const IMG_SCRIPTARIUM = '<img class="context-menu-img" src="systems/foundryvtt-reve-de-dragon/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 {
 | 
					export class ExportScriptarium {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -12,14 +12,18 @@ export class ExportScriptarium {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  constructor() {
 | 
					  constructor() {
 | 
				
			||||||
    Hooks.on("getActorDirectoryFolderContext", (actorDirectory, menus) => { ExportScriptarium.INSTANCE.onActorDirectoryMenu(actorDirectory, menus) })
 | 
					    //Hooks.on("getActorDirectoryFolderContext", (actorDirectory, menus) => { ExportScriptarium.INSTANCE.onActorDirectoryMenu(actorDirectory, menus) })
 | 
				
			||||||
    Hooks.on("getActorDirectoryEntryContext", (actorDirectory, menus) => { ExportScriptarium.INSTANCE.onActorDirectoryMenu(actorDirectory, menus) })
 | 
					    Hooks.on("getFolderContextOptions", (actorDirectory, menus) => { ExportScriptarium.INSTANCE.onActorDirectoryMenu(actorDirectory, menus) })
 | 
				
			||||||
 | 
					    //Hooks.on("getActorDirectoryEntryContext", (actorDirectory, menus) => { ExportScriptarium.INSTANCE.onActorDirectoryMenu(actorDirectory, menus) })
 | 
				
			||||||
 | 
					    Hooks.on("getActorContextOptions", (actorDirectory, menus) => { ExportScriptarium.INSTANCE.onActorDirectoryMenu(actorDirectory, menus) })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  onActorDirectoryMenu(actorDirectory, menus) {
 | 
					  onActorDirectoryMenu(actorDirectory, menus) {
 | 
				
			||||||
 | 
					    // DEBUG console.log("ExportScriptarium.onActorDirectoryMenu", actorDirectory, menus)
 | 
				
			||||||
    menus.push({
 | 
					    menus.push({
 | 
				
			||||||
      name: 'Export Personnages <i class="fa-regular fa-file-csv"></i>',
 | 
					      name: 'Export Personnages',
 | 
				
			||||||
      icon: IMG_SCRIPTARIUM,
 | 
					      icon: '<i class="fa-solid fa-download"></i>', //IMG_SCRIPTARIUM,
 | 
				
			||||||
      condition: (target) => game.user.isGM &&
 | 
					      condition: (target) => game.user.isGM &&
 | 
				
			||||||
        OptionsAvancees.isUsing(EXPORT_CSV_SCRIPTARIUM) &&
 | 
					        OptionsAvancees.isUsing(EXPORT_CSV_SCRIPTARIUM) &&
 | 
				
			||||||
        this.$getActors(actorDirectory, target).length > 0,
 | 
					        this.$getActors(actorDirectory, target).length > 0,
 | 
				
			||||||
@@ -28,22 +32,28 @@ export class ExportScriptarium {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  $getTargetName(actorDirectory, target) {
 | 
					  $getTargetName(actorDirectory, target) {
 | 
				
			||||||
 | 
					    target = $(target)
 | 
				
			||||||
    const li = target.closest(".directory-item")
 | 
					    const li = target.closest(".directory-item")
 | 
				
			||||||
    const folderId = li.data("folderId")
 | 
					    const folderId = li.data("folderId")
 | 
				
			||||||
    const actorId = li.data("documentId")
 | 
					    const actorId = li.data("entryId")
 | 
				
			||||||
    return actorId
 | 
					    return actorId
 | 
				
			||||||
      ? game.actors.get(actorId).name
 | 
					      ? game.actors.get(actorId).name
 | 
				
			||||||
      : actorDirectory.folders.find(it => it.id == folderId).name
 | 
					      : actorDirectory.collection.filter(it => it.folder.id == folderId).name
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  $getActors(actorDirectory, target) {
 | 
					  $getActors(actorDirectory, target) {
 | 
				
			||||||
 | 
					    if (actorDirectory.id != "actors") {
 | 
				
			||||||
 | 
					      return []
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    // DEBUG console.log("ExportScriptarium.$getActors", actorDirectory, target)
 | 
				
			||||||
 | 
					    target = $(target)
 | 
				
			||||||
    const li = target.closest(".directory-item")
 | 
					    const li = target.closest(".directory-item")
 | 
				
			||||||
    const folderId = li.data("folderId")
 | 
					    const folderId = li.data("folderId")
 | 
				
			||||||
    const actorId = li.data("documentId")
 | 
					    const actorId = li.data("entryId")
 | 
				
			||||||
    const actors = actorId
 | 
					    const actors = actorId
 | 
				
			||||||
      ? [game.actors.get(actorId)]
 | 
					      ? [game.actors.get(actorId)]
 | 
				
			||||||
      : folderId
 | 
					      : folderId
 | 
				
			||||||
        ? actorDirectory.folders.find(it => it.id == folderId).contents
 | 
					        ? actorDirectory.collection.filter(it => it.folder.id == folderId)
 | 
				
			||||||
        : []
 | 
					        : []
 | 
				
			||||||
    return actors.filter(it => it.type == ACTOR_TYPES.personnage)
 | 
					    return actors.filter(it => it.type == ACTOR_TYPES.personnage)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -54,7 +64,7 @@ export class ExportScriptarium {
 | 
				
			|||||||
    const actorLines = actors.map(actor => Misc.join(this.getActorLine(actor), ';'))
 | 
					    const actorLines = actors.map(actor => Misc.join(this.getActorLine(actor), ';'))
 | 
				
			||||||
    const data = Misc.join([header, ...actorLines], eol)
 | 
					    const data = Misc.join([header, ...actorLines], eol)
 | 
				
			||||||
    const filename = `scriptarium-${targetName?.slugify()}.csv`;
 | 
					    const filename = `scriptarium-${targetName?.slugify()}.csv`;
 | 
				
			||||||
    saveDataToFile(data, "text/csv;charset=windows-1252", `${filename}`);
 | 
					    foundry.utils.saveDataToFile(data, "text/csv;charset=windows-1252", `${filename}`);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  getHeaderLine() {
 | 
					  getHeaderLine() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,7 +2,7 @@ import { Grammar } from "../../grammar.js"
 | 
				
			|||||||
import { RdDItemArme } from "../../item-arme.js"
 | 
					import { RdDItemArme } from "../../item-arme.js"
 | 
				
			||||||
import { RdDItemCompetence } from "../../item-competence.js"
 | 
					import { RdDItemCompetence } from "../../item-competence.js"
 | 
				
			||||||
import { RdDItemSort } from "../../item-sort.js"
 | 
					import { RdDItemSort } from "../../item-sort.js"
 | 
				
			||||||
import { ITEM_TYPES } from "../../item.js"
 | 
					import { ITEM_TYPES } from "../../constants.js"
 | 
				
			||||||
import { Misc } from "../../misc.js"
 | 
					import { Misc } from "../../misc.js"
 | 
				
			||||||
import { RdDTimestamp } from "../../time/rdd-timestamp.js"
 | 
					import { RdDTimestamp } from "../../time/rdd-timestamp.js"
 | 
				
			||||||
import { RdDBonus } from "../../rdd-bonus.js"
 | 
					import { RdDBonus } from "../../rdd-bonus.js"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,7 @@ const RANDOM_VALUES = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export class AppPersonnageAleatoire extends FormApplication {
 | 
					export class AppPersonnageAleatoire extends FormApplication {
 | 
				
			||||||
  static preloadHandlebars() {
 | 
					  static preloadHandlebars() {
 | 
				
			||||||
    loadTemplates([
 | 
					    foundry.applications.handlebars.loadTemplates([
 | 
				
			||||||
      'systems/foundryvtt-reve-de-dragon/templates/actor/random/champ-aleatoire.hbs',
 | 
					      'systems/foundryvtt-reve-de-dragon/templates/actor/random/champ-aleatoire.hbs',
 | 
				
			||||||
    ])
 | 
					    ])
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,7 @@ export class RdDActorVehiculeSheet extends RdDBaseActorSheet {
 | 
				
			|||||||
  /** @override */
 | 
					  /** @override */
 | 
				
			||||||
  static get defaultOptions() {
 | 
					  static get defaultOptions() {
 | 
				
			||||||
    return foundry.utils.mergeObject(RdDBaseActorSheet.defaultOptions, {
 | 
					    return foundry.utils.mergeObject(RdDBaseActorSheet.defaultOptions, {
 | 
				
			||||||
      template: "systems/foundryvtt-reve-de-dragon/templates/actor-vehicule-sheet.html",
 | 
					      template: "systems/foundryvtt-reve-de-dragon/templates/actor-vehicule-sheet.hbs",
 | 
				
			||||||
      width: 640, height: 720,
 | 
					      width: 640, height: 720,
 | 
				
			||||||
    }, { inplace: false })
 | 
					    }, { inplace: false })
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -32,18 +32,10 @@ export class RdDActorVehiculeSheet extends RdDBaseActorSheet {
 | 
				
			|||||||
    super.activateListeners(html);
 | 
					    super.activateListeners(html);
 | 
				
			||||||
    if (!this.options.editable) return;
 | 
					    if (!this.options.editable) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.html.find('.resistance-moins').click(async event => {
 | 
					    this.html.find('.resistance-moins').click(async event => await this.actor.vehicleIncDec("resistance", -1))
 | 
				
			||||||
      this.actor.vehicleIncDec("resistance", -1);
 | 
					    this.html.find('.resistance-plus').click(async event => await this.actor.vehicleIncDec("resistance", 1))
 | 
				
			||||||
    });
 | 
					    this.html.find('.structure-moins').click(async event => await this.actor.vehicleIncDec("structure", -1))
 | 
				
			||||||
    this.html.find('.resistance-plus').click(async event => {
 | 
					    this.html.find('.structure-plus').click(async event => await this.actor.vehicleIncDec("structure", 1))
 | 
				
			||||||
      this.actor.vehicleIncDec("resistance", 1);
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    this.html.find('.structure-moins').click(async event => {
 | 
					 | 
				
			||||||
      this.actor.vehicleIncDec("structure", -1);
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    this.html.find('.structure-plus').click(async event => {
 | 
					 | 
				
			||||||
      this.actor.vehicleIncDec("structure", 1);
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										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)
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -6,7 +6,7 @@ import { Grammar } from "../grammar.js";
 | 
				
			|||||||
import { Misc } from "../misc.js";
 | 
					import { Misc } from "../misc.js";
 | 
				
			||||||
import { ENTITE_INCARNE, ENTITE_NONINCARNE } from "../constants.js";
 | 
					import { ENTITE_INCARNE, ENTITE_NONINCARNE } from "../constants.js";
 | 
				
			||||||
import { RdDItemTete } from "../item/tete.js";
 | 
					import { RdDItemTete } from "../item/tete.js";
 | 
				
			||||||
import { ITEM_TYPES } from "../item.js";
 | 
					import { ITEM_TYPES } from "../constants.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const WHITESPACES = "\\s+"
 | 
					const WHITESPACES = "\\s+"
 | 
				
			||||||
const NUMERIC = "[\\+\\-]?\\d+"
 | 
					const NUMERIC = "[\\+\\-]?\\d+"
 | 
				
			||||||
@@ -34,7 +34,6 @@ const XREGEXP_WEAPON_MANIEMENT = "(?<maniement>(" + Misc.join(Object.keys(MANIEM
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
const XREGEXP_SORT_VOIE = "(?<voies>[OHNT](\\/[OHNT])*)"
 | 
					const XREGEXP_SORT_VOIE = "(?<voies>[OHNT](\\/[OHNT])*)"
 | 
				
			||||||
const XREGEXP_SORT_NAME = "(?<name>[^\\(]+)"
 | 
					const XREGEXP_SORT_NAME = "(?<name>[^\\(]+)"
 | 
				
			||||||
// const XREGEXP_SORT_CASE = "(?<coord>([A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+|[A-M]\\d{1,2})+)"
 | 
					 | 
				
			||||||
const XREGEXP_SORT_CASE = "(?<coord>([A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+|[A-M]\\d{1,2}))"
 | 
					const XREGEXP_SORT_CASE = "(?<coord>([A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+|[A-M]\\d{1,2}))"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const XREGEXP_SORT = "(" + XREGEXP_SORT_VOIE
 | 
					const XREGEXP_SORT = "(" + XREGEXP_SORT_VOIE
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										78
									
								
								module/apps/rdd-text-roll-editor.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,78 @@
 | 
				
			|||||||
 | 
					import "./xregexp-all.js";
 | 
				
			||||||
 | 
					import { SystemCompendiums } from "../settings/system-compendiums.js";
 | 
				
			||||||
 | 
					import { ACTOR_TYPES } from "../constants.js";
 | 
				
			||||||
 | 
					import { TextRollAlchimie } from "./textroll/text-roll-alchimie.js";
 | 
				
			||||||
 | 
					import { TextRollCaracCompetence } from "./textroll/text-roll-carac-competence.js";
 | 
				
			||||||
 | 
					import { TextRollFormula } from "./textroll/text-roll-formula.js";
 | 
				
			||||||
 | 
					import { TextRollManager } from "./textroll/text-roll-formatter.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const TEXT_ROLL_MANAGERS = [
 | 
				
			||||||
 | 
					  new TextRollAlchimie(),
 | 
				
			||||||
 | 
					  new TextRollCaracCompetence(),
 | 
				
			||||||
 | 
					  new TextRollFormula()]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export class RdDTextEditor {
 | 
				
			||||||
 | 
					  static registerChatCallbacks(html) {
 | 
				
			||||||
 | 
					    $(html).on("click", '.roll-text', async event => await RdDTextEditor.rollText(event))
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  static async enrichHTML(text, object, options = {showlink:true}) {
 | 
				
			||||||
 | 
					    const context = {
 | 
				
			||||||
 | 
					      text,
 | 
				
			||||||
 | 
					      object,
 | 
				
			||||||
 | 
					      options,
 | 
				
			||||||
 | 
					      competences: await SystemCompendiums.getCompetences(ACTOR_TYPES.personnage),
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (let manager of TEXT_ROLL_MANAGERS) {
 | 
				
			||||||
 | 
					      context.code = manager.code
 | 
				
			||||||
 | 
					      context.template = manager.template
 | 
				
			||||||
 | 
					      context.text = await manager.onReplaceRoll(context);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return await foundry.applications.ux.TextEditor.implementation.enrichHTML(context.text, {
 | 
				
			||||||
 | 
					      relativeTo: object,
 | 
				
			||||||
 | 
					      secrets: object?.isOwner,
 | 
				
			||||||
 | 
					      async: true
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  static async _applyReplaceAll(manager, context) {
 | 
				
			||||||
 | 
					    context.code = manager.code
 | 
				
			||||||
 | 
					    context.template = manager.template
 | 
				
			||||||
 | 
					    context.text = await manager.onReplaceRoll(context);
 | 
				
			||||||
 | 
					    return context.text
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  static getEventElement(event) {
 | 
				
			||||||
 | 
					    return $(event.currentTarget)?.parents(".roll-text-link");
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  static async rollText(event, actor) {
 | 
				
			||||||
 | 
					    const code = TextRollManager.getNode(event)?.data('code')
 | 
				
			||||||
 | 
					    const manager = TEXT_ROLL_MANAGERS.find(it => it.code == code)
 | 
				
			||||||
 | 
					    if (manager) {
 | 
				
			||||||
 | 
					      await manager.onRollText(event, actor)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  static async chatRollText(event) {
 | 
				
			||||||
 | 
					    const node = TextRollManager.getNode(event);
 | 
				
			||||||
 | 
					    if (node) {
 | 
				
			||||||
 | 
					      const code = node.data('code')
 | 
				
			||||||
 | 
					      const param = node.data('json')
 | 
				
			||||||
 | 
					      const manager = TEXT_ROLL_MANAGERS.find(it => it.code == code)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const text = await TextRollManager.createRollText(
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          code,
 | 
				
			||||||
 | 
					          template: manager.template,
 | 
				
			||||||
 | 
					          options: { showLink: false }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        param)
 | 
				
			||||||
 | 
					      ChatMessage.create({
 | 
				
			||||||
 | 
					        content: text
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										79
									
								
								module/apps/textroll/text-roll-alchimie.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,79 @@
 | 
				
			|||||||
 | 
					import "../xregexp-all.js";
 | 
				
			||||||
 | 
					import { ACTOR_TYPES, ITEM_TYPES } from "../../constants.js";
 | 
				
			||||||
 | 
					import { RdDCarac } from "../../rdd-carac.js";
 | 
				
			||||||
 | 
					import { RdDUtility } from "../../rdd-utility.js";
 | 
				
			||||||
 | 
					import { RdDAlchimie } from "../../rdd-alchimie.js";
 | 
				
			||||||
 | 
					import { TextRollManager } from "./text-roll-formatter.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * classe pour gérer les jets d'alchimie
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export class TextRollAlchimie {
 | 
				
			||||||
 | 
					  get code() { return 'alchimie' }
 | 
				
			||||||
 | 
					  get template() { return `systems/foundryvtt-reve-de-dragon/templates/apps/textroll/link-text-roll-alchimie.hbs` }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  async onReplaceRoll(context) {
 | 
				
			||||||
 | 
					    const handler = new AlchimieTextBuilder(context)
 | 
				
			||||||
 | 
					    return await handler.replaceAll()
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  async onRollText(event, actor) {
 | 
				
			||||||
 | 
					    actor = this.getSelectedActor(actor)
 | 
				
			||||||
 | 
					    if (actor) {
 | 
				
			||||||
 | 
					      const node = TextRollManager.getNode(event)
 | 
				
			||||||
 | 
					      const recetteId = node.data('recetteid')
 | 
				
			||||||
 | 
					      const manip = node.data('manip')
 | 
				
			||||||
 | 
					      const termes = node.data('termes')
 | 
				
			||||||
 | 
					      if (recetteId) {
 | 
				
			||||||
 | 
					        await actor.effectuerTacheAlchimie(recetteId, manip, termes)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      else {
 | 
				
			||||||
 | 
					        const carac = RdDCarac.caracDetails(RdDAlchimie.getCaracTache(manip))
 | 
				
			||||||
 | 
					        const diff = RdDAlchimie.getDifficulte(termes)
 | 
				
			||||||
 | 
					        await actor.rollCaracCompetence(carac.code, 'Alchimie', diff)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  getSelectedActor(actor) {
 | 
				
			||||||
 | 
					    actor = actor ?? RdDUtility.getSelectedActor()
 | 
				
			||||||
 | 
					    if (actor && actor.type == ACTOR_TYPES.personnage) {
 | 
				
			||||||
 | 
					      return actor
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return undefined
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class AlchimieTextBuilder {
 | 
				
			||||||
 | 
					  constructor(context) {
 | 
				
			||||||
 | 
					    this.context = context
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  async replaceAll() {
 | 
				
			||||||
 | 
					    await XRegExp.forEach(this.context.text, XREGEXP_ROLL_ALCHIMIE, async (rollMatch, i) => await this.replaceMatch(rollMatch, i))
 | 
				
			||||||
 | 
					    await XRegExp.forEach(this.context.text, XREGEXP_ROLL_ALCHIMIE_MANIP, async (rollMatch, i) => await this.replaceMatch(rollMatch, i))
 | 
				
			||||||
 | 
					    return this.context.text
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  async replaceMatch(rollMatch, i) {
 | 
				
			||||||
 | 
					    if (rollMatch.termes && rollMatch.manip) {
 | 
				
			||||||
 | 
					      const manip = rollMatch.manip
 | 
				
			||||||
 | 
					      const termes = rollMatch.termes
 | 
				
			||||||
 | 
					      const carac = RdDCarac.caracDetails(RdDAlchimie.getCaracTache(manip))
 | 
				
			||||||
 | 
					      const diff = RdDAlchimie.getDifficulte(termes)
 | 
				
			||||||
 | 
					      const recette = (this.context.object instanceof Item && this.context.object.type == ITEM_TYPES.recettealchimique) ? this.context.object : undefined
 | 
				
			||||||
 | 
					      const replacement = await TextRollManager.createRollText(this.context,
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          code: this.context.code,
 | 
				
			||||||
 | 
					          manip, termes, carac, diff, recetteid: recette?.id,
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					      this.context.text = this.context.text.replace(rollMatch[0], replacement);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||