forked from public/fvtt-cthulhu-eternal
		
	Compare commits
	
		
			35 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 7070d4c1da | |||
| 3b79a19ca5 | |||
| f882a04c0b | |||
| eda24442e8 | |||
| 0ec2d53415 | |||
| 401a94da40 | |||
| 7758085bf8 | |||
| 70c4fd5a74 | |||
| 03a54d86e6 | |||
| 3adb34d721 | |||
| 034a60bf19 | |||
| 522bb08d35 | |||
| c144488d1d | |||
| 704dd83b1b | |||
| 3aab98b4b4 | |||
| 2c05594a7e | |||
| ce1844a070 | |||
| fa7d3ecfca | |||
| adb4923d00 | |||
| 44842ff655 | |||
| 4671f6f9fe | |||
| 50b7bafb43 | |||
| 2c3a92994a | |||
| dfe4aa0c56 | |||
| efc23f466b | |||
| 1b1c2b0cfd | |||
| e0f02ecacb | |||
| 4e39c5d0dc | |||
| 9f13961eaf | |||
| 3d6cd35fa4 | |||
| 33c11e2c05 | |||
| b600148247 | |||
| c0d240c5d0 | |||
| d6a1b2c62a | |||
| 82139eb634 | 
							
								
								
									
										52
									
								
								.gitea/workflows/release.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								.gitea/workflows/release.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | ||||
| name: Release Creation | ||||
|  | ||||
| on:  | ||||
|   release: | ||||
|     types: [published] | ||||
|  | ||||
| jobs: | ||||
|   build: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|     - run: echo "💡 The ${{ gitea.repository }} repository will cloned to the runner." | ||||
|      | ||||
|     #- uses: actions/checkout@v3 | ||||
|     - uses: RouxAntoine/checkout@v3.5.4 | ||||
|  | ||||
|     # get part of the tag after the `v` | ||||
|     - name: Extract tag version number | ||||
|       id: get_version | ||||
|       uses: battila7/get-version-action@v2 | ||||
|  | ||||
|     # Substitute the Manifest and Download URLs in the module.json | ||||
|     - name: Substitute Manifest and Download Links For Versioned Ones | ||||
|       id: sub_manifest_link_version | ||||
|       uses: microsoft/variable-substitution@v1 | ||||
|       with: | ||||
|         files: 'system.json' | ||||
|       env: | ||||
|         version: ${{steps.get_version.outputs.version-without-v}} | ||||
|         url: https://www.uberwald.me/gitea/${{gitea.repository}} | ||||
|         manifest: https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/system.json | ||||
|         download: https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/fvtt-cthulhu-eternal.zip | ||||
|      | ||||
|     # Create a zip file with all files required by the module to add to the release | ||||
|     - run: | | ||||
|          apt update -y | ||||
|          apt install -y zip | ||||
|  | ||||
|     - run: zip -r ./fvtt-cthulhu-eternal.zip system.json README.md LICENSE assets/ css/ fonts/ lang/ module/ packs-system/ templates/ cthulhu-eternal.mjs | ||||
|      | ||||
|     - name: setup go | ||||
|       uses: https://github.com/actions/setup-go@v4 | ||||
|       with: | ||||
|         go-version: '>=1.20.1' | ||||
|      | ||||
|     - name: Use Go Action   | ||||
|       id: use-go-action | ||||
|       uses: https://gitea.com/actions/release-action@main | ||||
|       with: | ||||
|         files: |- | ||||
|           ./fvtt-cthulhu-eternal.zip | ||||
|           system.json | ||||
|         api_key: '${{secrets.ALLOW_PUSH_RELEASE}}' | ||||
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -6,6 +6,3 @@ styles/*.css | ||||
| # Node Modules | ||||
| node_modules/ | ||||
|  | ||||
| # Foundry VTT | ||||
| packs/* | ||||
|  | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								assets/ui/background_01.webp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/ui/background_01.webp
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 77 KiB | 
							
								
								
									
										47
									
								
								assets/ui/d100.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								assets/ui/d100.svg
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| After Width: | Height: | Size: 12 KiB | 
| @@ -110,12 +110,20 @@ | ||||
|   --font-secondary: "RozhaOne"; | ||||
|   --font-title: "Broadway"; | ||||
|   --logo-standard: url("../assets/logos/reanimated-ce-logo.webp"); | ||||
|   --color-success: darkgreen; | ||||
|   --color-success: #12e912; | ||||
|   --color-failure: darkred; | ||||
|   --color-critical-success: lightgreen; | ||||
|   --color-critical-failure: lightcoral; | ||||
|   --color-warning: darkorange; | ||||
|   --color-critical-success: #1527cc; | ||||
|   --color-critical-failure: #8d20e7; | ||||
|   --img-icon-color-filter: brightness(0) saturate(100%) invert(52%) sepia(9%) saturate(2368%) hue-rotate(360deg) brightness(86%) contrast(84%); | ||||
| } | ||||
| .d100 { | ||||
|   width: 18px; | ||||
|   height: 18px; | ||||
|   color: black; | ||||
|   border-width: 0px; | ||||
|   filter: var(--img-icon-color-filter); | ||||
| } | ||||
| .item .thumbnail, | ||||
| .item-img { | ||||
|   /*filter: invert(90%) sepia(10%) saturate(1215%) hue-rotate(55deg) brightness(93%) contrast(89%);*/ | ||||
| @@ -168,10 +176,14 @@ i.fvtt-cthulhu-eternal { | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-sheet-common label { | ||||
|   font-family: var(--font-secondary); | ||||
|   font-size: calc(var(--font-size-standard) * 1.2); | ||||
|   font-size: calc(var(--font-size-standard) * 1); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-sheet-common label { | ||||
|   font-family: var(--font-secondary); | ||||
|   font-size: calc(var(--font-size-standard) * 1); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .item-sheet-common .form-fields { | ||||
|   padding-top: 5px; | ||||
|   padding-top: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .item-sheet-common label { | ||||
|   font-family: var(--font-secondary); | ||||
| @@ -212,7 +224,7 @@ i.fvtt-cthulhu-eternal { | ||||
|   color: var(--color-dark-2); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-content input[name="name"] { | ||||
|   height: 50px; | ||||
|   height: 40px; | ||||
|   margin-right: 10px; | ||||
|   font-family: var(--font-secondary); | ||||
|   font-size: calc(var(--font-size-standard) * 1); | ||||
| @@ -220,8 +232,8 @@ i.fvtt-cthulhu-eternal { | ||||
|   border: none; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-content fieldset { | ||||
|   margin-bottom: 5px; | ||||
|   border-radius: 5px; | ||||
|   margin-bottom: 4px; | ||||
|   border-radius: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-content .form-fields input, | ||||
| .fvtt-cthulhu-eternal .protagonist-content .form-fields select { | ||||
| @@ -240,7 +252,7 @@ i.fvtt-cthulhu-eternal { | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-content label { | ||||
|   font-family: var(--font-secondary); | ||||
|   font-size: calc(var(--font-size-standard) * 1.2); | ||||
|   font-size: calc(var(--font-size-standard) * 1); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .sheet-tabs { | ||||
|   background-color: var(--color-light-1); | ||||
| @@ -296,28 +308,82 @@ i.fvtt-cthulhu-eternal { | ||||
|   font-size: calc(var(--font-size-standard) * 1.4); | ||||
|   width: 400px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .san { | ||||
|   align-content: flex-start; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .san input { | ||||
|   min-width: 2.2rem; | ||||
|   max-width: 2.2rem; | ||||
|   margin-bottom: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .san select { | ||||
|   min-width: 6rem; | ||||
|   max-width: 6rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .san .rollable:hover, | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .san .rollable:focus { | ||||
|   text-shadow: 0 0 8px var(--color-shadow-primary); | ||||
|   cursor: pointer; | ||||
|   font-size: 0.9rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .san .button { | ||||
|   min-width: 4rem; | ||||
|   max-width: 4rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .san .san-checkbox { | ||||
|   min-width: 1rem; | ||||
|   max-width: 1rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .san .label-field { | ||||
|   flex-grow: 0; | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .san .label-short-field { | ||||
|   font-size: 0.9rem; | ||||
|   max-width: 3rem; | ||||
|   min-width: 3rem; | ||||
|   flex-grow: 1; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .san .label-recovery { | ||||
|   margin-left: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .san .label-field { | ||||
|   font-size: 0.9rem; | ||||
|   max-width: 6rem; | ||||
|   min-width: 6rem; | ||||
|   flex-grow: 1; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .san .label-bp { | ||||
|   flex-grow: 1; | ||||
|   max-width: 3rem; | ||||
|   min-width: 3rem; | ||||
|   margin-left: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .san .label-insanity { | ||||
|   flex-grow: 1; | ||||
|   margin-left: 4px; | ||||
|   max-width: 8rem; | ||||
|   min-width: 8rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .san .spacing { | ||||
|   margin-left: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .san .d100 { | ||||
|   flex: 0; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .willpower input { | ||||
|   min-width: 2.2rem; | ||||
|   min-width: 2.4rem; | ||||
|   max-width: 2.4rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .willpower input[type="checkbox"] { | ||||
|   min-width: 1rem; | ||||
|   max-width: 1rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .willpower .label-field { | ||||
|   flex-grow: 0; | ||||
|   flex-grow: 1; | ||||
|   margin-left: 4px; | ||||
|   max-width: 5rem; | ||||
|   min-width: 5rem; | ||||
|   font-size: 0.9rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-pc .protagonist-right .willpower .checkbox { | ||||
|   flex-grow: 0; | ||||
|   min-width: 1rem; | ||||
|   max-width: 1rem; | ||||
| } | ||||
| @@ -381,13 +447,21 @@ i.fvtt-cthulhu-eternal { | ||||
|   text-shadow: 0 0 8px var(--color-shadow-primary); | ||||
|   cursor: pointer; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-characteristics .protagonist-characteristic .rollable { | ||||
|   min-width: 3rem; | ||||
|   max-width: 3rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-characteristics .protagonist-characteristic .char-text { | ||||
|   margin-left: 0.5rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-characteristics .protagonist-characteristic .form-group { | ||||
|   flex: 1; | ||||
|   flex: 0; | ||||
|   padding-left: 5px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-characteristics .protagonist-characteristic .form-group .form-fields { | ||||
|   font-size: 1.1rem; | ||||
|   flex: none; | ||||
|   width: 70px; | ||||
|   width: 40px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-main .protagonist-characteristic-play { | ||||
|   min-width: 225px; | ||||
| @@ -407,11 +481,40 @@ i.fvtt-cthulhu-eternal { | ||||
| .fvtt-cthulhu-eternal .protagonist-biography .field-label { | ||||
|   margin-left: 8px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-biography .biodata { | ||||
| .fvtt-cthulhu-eternal .protagonist-biography .adapted { | ||||
|   display: grid; | ||||
|   grid-template-columns: repeat(2, 1fr); | ||||
|   gap: 8px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-biography .adapted label { | ||||
|   min-width: 20rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-biography .resources { | ||||
|   display: grid; | ||||
|   grid-template-columns: repeat(3, 1fr); | ||||
|   gap: 8px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-biography .resources label { | ||||
|   min-width: 8rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-biography .features, | ||||
| .fvtt-cthulhu-eternal .protagonist-biography .biodata { | ||||
|   display: grid; | ||||
|   grid-template-columns: repeat(2, 1fr); | ||||
|   gap: 8px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-biography .features label, | ||||
| .fvtt-cthulhu-eternal .protagonist-biography .biodata label { | ||||
|   min-width: 3rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-biography .features .feature, | ||||
| .fvtt-cthulhu-eternal .protagonist-biography .biodata .feature { | ||||
|   display: flex; | ||||
|   align-items: center; | ||||
|   gap: 4px; | ||||
|   min-width: 18rem; | ||||
|   max-width: 18rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .protagonist-biography .motivations { | ||||
|   display: grid; | ||||
|   grid-template-columns: repeat(2, 1fr); | ||||
| @@ -472,8 +575,8 @@ i.fvtt-cthulhu-eternal { | ||||
|   max-width: 8rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.protagonist-skills .skills .skill .item-img { | ||||
|   width: 32px; | ||||
|   height: 32px; | ||||
|   width: 24px; | ||||
|   height: 24px; | ||||
|   margin: 4px 0 0 0; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.protagonist-status { | ||||
| @@ -506,16 +609,16 @@ i.fvtt-cthulhu-eternal { | ||||
|   max-width: 12rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.protagonist-status .bonds .bond .type { | ||||
|   min-width: 4rem; | ||||
|   max-width: 4rem; | ||||
|   min-width: 5rem; | ||||
|   max-width: 5rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.protagonist-status .bonds .bond .level { | ||||
|   min-width: 2rem; | ||||
|   max-width: 2rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.protagonist-status .bonds .bond .item-img { | ||||
|   width: 32px; | ||||
|   height: 32px; | ||||
|   width: 24px; | ||||
|   height: 24px; | ||||
|   margin: 4px 0 0 0; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.protagonist-status .mentaldisorders { | ||||
| @@ -539,8 +642,8 @@ i.fvtt-cthulhu-eternal { | ||||
|   max-width: 14rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.protagonist-status .mentaldisorders .mentaldisorder .item-img { | ||||
|   width: 32px; | ||||
|   height: 32px; | ||||
|   width: 24px; | ||||
|   height: 24px; | ||||
|   margin: 4px 0 0 0; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.protagonist-status .injuries { | ||||
| @@ -564,8 +667,8 @@ i.fvtt-cthulhu-eternal { | ||||
|   max-width: 14rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.protagonist-status .injuries .injury .item-img { | ||||
|   width: 32px; | ||||
|   height: 32px; | ||||
|   width: 24px; | ||||
|   height: 24px; | ||||
|   margin: 4px 0 0 0; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.protagonist-equipment { | ||||
| @@ -587,7 +690,7 @@ i.fvtt-cthulhu-eternal { | ||||
|   align-items: center; | ||||
|   gap: 4px; | ||||
|   min-width: 13rem; | ||||
|   max-width: 13srem; | ||||
|   max-width: 13rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.protagonist-equipment .weapons .weapon .rollable:hover, | ||||
| .fvtt-cthulhu-eternal .tab.protagonist-equipment .weapons .weapon .rollable:focus { | ||||
| @@ -599,16 +702,16 @@ i.fvtt-cthulhu-eternal { | ||||
|   max-width: 2rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.protagonist-equipment .weapons .weapon .damage { | ||||
|   min-width: 5rem; | ||||
|   max-width: 5rem; | ||||
|   min-width: 6rem; | ||||
|   max-width: 6rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.protagonist-equipment .weapons .weapon .name { | ||||
|   min-width: 8rem; | ||||
|   max-width: 8rem; | ||||
|   min-width: 10rem; | ||||
|   max-width: 10rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.protagonist-equipment .weapons .weapon .item-img { | ||||
|   width: 32px; | ||||
|   height: 32px; | ||||
|   width: 24px; | ||||
|   height: 24px; | ||||
|   margin: 4px 0 0 0; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.protagonist-equipment .armors { | ||||
| @@ -641,8 +744,8 @@ i.fvtt-cthulhu-eternal { | ||||
|   max-width: 8rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.protagonist-equipment .armors .armor .item-img { | ||||
|   width: 32px; | ||||
|   height: 32px; | ||||
|   width: 24px; | ||||
|   height: 24px; | ||||
|   margin: 4px 0 0 0; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.protagonist-equipment .gears { | ||||
| @@ -675,8 +778,8 @@ i.fvtt-cthulhu-eternal { | ||||
|   max-width: 8rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.protagonist-equipment .gears .gear .item-img { | ||||
|   width: 32px; | ||||
|   height: 32px; | ||||
|   width: 24px; | ||||
|   height: 24px; | ||||
|   margin: 4px 0 0 0; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.protagonist-equipment prose-mirror.inactive { | ||||
| @@ -685,6 +788,253 @@ i.fvtt-cthulhu-eternal { | ||||
| .fvtt-cthulhu-eternal .tab.protagonist-equipment prose-mirror.active { | ||||
|   min-height: 150px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-content { | ||||
|   font-family: var(--font-primary); | ||||
|   font-size: calc(var(--font-size-standard) * 1); | ||||
|   color: var(--color-dark-1); | ||||
|   background-image: var(--background-image-base); | ||||
|   background-repeat: no-repeat; | ||||
|   background-size: 100% 100%; | ||||
|   overflow: scroll; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-content input:disabled, | ||||
| .fvtt-cthulhu-eternal .vehicle-content select:disabled { | ||||
|   background-color: rgba(0, 0, 0, 0.2); | ||||
|   border-color: transparent; | ||||
|   color: var(--color-dark-3); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-content input, | ||||
| .fvtt-cthulhu-eternal .vehicle-content select { | ||||
|   background-color: rgba(0, 0, 0, 0.1); | ||||
|   border-color: var(--color-dark-6); | ||||
|   color: var(--color-dark-2); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-content input[name="name"] { | ||||
|   height: 40px; | ||||
|   margin-right: 10px; | ||||
|   font-family: var(--font-secondary); | ||||
|   font-size: calc(var(--font-size-standard) * 1); | ||||
|   font-weight: bold; | ||||
|   border: none; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-content fieldset { | ||||
|   margin-bottom: 4px; | ||||
|   border-radius: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-content .form-fields input, | ||||
| .fvtt-cthulhu-eternal .vehicle-content .form-fields select { | ||||
|   text-align: center; | ||||
|   font-size: calc(var(--font-size-standard) * 1); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-content .form-fields select { | ||||
|   font-family: var(--font-secondary); | ||||
|   font-size: calc(var(--font-size-standard) * 1); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-content legend { | ||||
|   font-family: var(--font-secondary); | ||||
|   font-size: calc(var(--font-size-standard) * 1.2); | ||||
|   font-weight: bold; | ||||
|   letter-spacing: 1px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-content label { | ||||
|   font-family: var(--font-secondary); | ||||
|   font-size: calc(var(--font-size-standard) * 1); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .sheet-tabs { | ||||
|   background-color: var(--color-light-1); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-main { | ||||
|   background-color: var(--color-light-1); | ||||
|   display: flex; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-main .vehicle-pc { | ||||
|   display: flex; | ||||
|   gap: 4px; | ||||
|   flex: 1; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-main .vehicle-pc .vehicle-left { | ||||
|   min-width: 180px; | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-main .vehicle-pc .vehicle-left .vehicle-left-image { | ||||
|   display: flex; | ||||
|   justify-content: center; | ||||
|   align-items: center; | ||||
|   padding-bottom: 8px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-main .vehicle-pc .vehicle-left .vehicle-left-image .vehicle-img { | ||||
|   height: 140px; | ||||
|   width: auto; | ||||
|   border: none; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-main .vehicle-pc .vehicle-right { | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
|   gap: 5px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-main .vehicle-pc .vehicle-right .vehicle-name { | ||||
|   display: flex; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-main .vehicle-pc .vehicle-right .vehicle-name input { | ||||
|   font-family: var(--font-title); | ||||
|   font-size: calc(var(--font-size-standard) * 1.4); | ||||
|   width: 400px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-main .vehicle-pc .vehicle-right .vehicle-infos { | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
|   gap: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-main .vehicle-pc .vehicle-right .vehicle-infos label { | ||||
|   min-width: 120px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-main .vehicle-pc .vehicle-right .vehicle-infos .vehicle-hp { | ||||
|   display: flex; | ||||
|   gap: 2px; | ||||
|   align-items: center; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-main .vehicle-pc .vehicle-right .vehicle-infos .vehicle-hp .vehicle-hp-value .form-fields input { | ||||
|   flex: none; | ||||
|   width: 50px; | ||||
|   margin-left: 4px; | ||||
|   font-size: calc(var(--font-size-standard) * 1.4); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-main .vehicle-pc .vehicle-right .vehicle-infos .vehicle-hp .vehicle-hp-max { | ||||
|   clear: both; | ||||
|   display: flex; | ||||
|   flex-direction: row; | ||||
|   flex-wrap: wrap; | ||||
|   margin: 3px 0; | ||||
|   align-items: center; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-main .vehicle-pc .vehicle-right .vehicle-infos .vehicle-hp .vehicle-hp-max input { | ||||
|   width: 50px; | ||||
|   text-align: center; | ||||
|   font-size: calc(var(--font-size-standard) * 1.4); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-main .vehicle-pc .vehicle-right .vehicle-infos .vehicle-hp .hp-separator { | ||||
|   font-size: calc(var(--font-size-standard) * 1.2); | ||||
|   display: flex; | ||||
|   align-items: center; | ||||
|   justify-content: center; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-main .vehicle-pc-play { | ||||
|   min-width: 500px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-main .vehicle-pc-edit { | ||||
|   min-width: 650px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-biography { | ||||
|   background-color: var(--color-light-1); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-biography prose-mirror.inactive { | ||||
|   min-height: 40px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-biography prose-mirror.active { | ||||
|   min-height: 150px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-biography .field-label { | ||||
|   margin-left: 8px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-biography .biodata { | ||||
|   display: grid; | ||||
|   grid-template-columns: repeat(2, 1fr); | ||||
|   gap: 8px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-biography .biodata label { | ||||
|   min-width: 3rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .vehicle-biography .biodata .feature { | ||||
|   display: flex; | ||||
|   align-items: center; | ||||
|   gap: 4px; | ||||
|   min-width: 18rem; | ||||
|   max-width: 18rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.vehicle-equipment { | ||||
|   background-color: var(--color-light-1); | ||||
|   display: grid; | ||||
|   grid-template-columns: 1fr; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.vehicle-equipment legend a { | ||||
|   font-size: calc(var(--font-size-standard) * 1.4); | ||||
|   padding-left: 5px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.vehicle-equipment .weapons { | ||||
|   display: grid; | ||||
|   grid-template-columns: repeat(2, 1fr); | ||||
|   gap: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.vehicle-equipment .weapons .weapon { | ||||
|   display: flex; | ||||
|   align-items: center; | ||||
|   gap: 4px; | ||||
|   min-width: 13rem; | ||||
|   max-width: 13srem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.vehicle-equipment .weapons .weapon .rollable:hover, | ||||
| .fvtt-cthulhu-eternal .tab.vehicle-equipment .weapons .weapon .rollable:focus { | ||||
|   text-shadow: 0 0 8px var(--color-shadow-primary); | ||||
|   cursor: pointer; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.vehicle-equipment .weapons .weapon .controls { | ||||
|   min-width: 2rem; | ||||
|   max-width: 2rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.vehicle-equipment .weapons .weapon .damage { | ||||
|   min-width: 5rem; | ||||
|   max-width: 5rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.vehicle-equipment .weapons .weapon .name { | ||||
|   min-width: 8rem; | ||||
|   max-width: 8rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.vehicle-equipment .weapons .weapon .item-img { | ||||
|   width: 32px; | ||||
|   height: 32px; | ||||
|   margin: 4px 0 0 0; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.vehicle-equipment .gears { | ||||
|   display: grid; | ||||
|   grid-template-columns: repeat(3, 1fr); | ||||
|   gap: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.vehicle-equipment .gears .gear { | ||||
|   display: flex; | ||||
|   align-items: center; | ||||
|   gap: 4px; | ||||
|   min-width: 13rem; | ||||
|   max-width: 13srem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.vehicle-equipment .gears .gear .rollable:hover, | ||||
| .fvtt-cthulhu-eternal .tab.vehicle-equipment .gears .gear .rollable:focus { | ||||
|   text-shadow: 0 0 8px var(--color-shadow-primary); | ||||
|   cursor: pointer; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.vehicle-equipment .gears .gear .controls { | ||||
|   min-width: 2rem; | ||||
|   max-width: 2rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.vehicle-equipment .gears .gear .damage { | ||||
|   min-width: 5rem; | ||||
|   max-width: 5rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.vehicle-equipment .gears .gear .name { | ||||
|   min-width: 8rem; | ||||
|   max-width: 8rem; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.vehicle-equipment .gears .gear .item-img { | ||||
|   width: 32px; | ||||
|   height: 32px; | ||||
|   margin: 4px 0 0 0; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.vehicle-equipment prose-mirror.inactive { | ||||
|   min-height: 40px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .tab.vehicle-equipment prose-mirror.active { | ||||
|   min-height: 150px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .skill-content { | ||||
|   font-family: var(--font-primary); | ||||
|   font-size: calc(var(--font-size-standard) * 1); | ||||
| @@ -706,7 +1056,7 @@ i.fvtt-cthulhu-eternal { | ||||
|   color: var(--color-dark-2); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .skill-content input[name="name"] { | ||||
|   height: 50px; | ||||
|   height: 40px; | ||||
|   margin-right: 10px; | ||||
|   font-family: var(--font-secondary); | ||||
|   font-size: calc(var(--font-size-standard) * 1); | ||||
| @@ -714,8 +1064,8 @@ i.fvtt-cthulhu-eternal { | ||||
|   border: none; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .skill-content fieldset { | ||||
|   margin-bottom: 5px; | ||||
|   border-radius: 5px; | ||||
|   margin-bottom: 4px; | ||||
|   border-radius: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .skill-content .form-fields input, | ||||
| .fvtt-cthulhu-eternal .skill-content .form-fields select { | ||||
| @@ -733,7 +1083,7 @@ i.fvtt-cthulhu-eternal { | ||||
|   letter-spacing: 1px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .skill-content .form-fields { | ||||
|   padding-top: 5px; | ||||
|   padding-top: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .skill-content label { | ||||
|   font-family: var(--font-secondary); | ||||
| @@ -796,7 +1146,7 @@ i.fvtt-cthulhu-eternal { | ||||
|   color: var(--color-dark-2); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .injury-content input[name="name"] { | ||||
|   height: 50px; | ||||
|   height: 40px; | ||||
|   margin-right: 10px; | ||||
|   font-family: var(--font-secondary); | ||||
|   font-size: calc(var(--font-size-standard) * 1); | ||||
| @@ -804,8 +1154,8 @@ i.fvtt-cthulhu-eternal { | ||||
|   border: none; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .injury-content fieldset { | ||||
|   margin-bottom: 5px; | ||||
|   border-radius: 5px; | ||||
|   margin-bottom: 4px; | ||||
|   border-radius: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .injury-content .form-fields input, | ||||
| .fvtt-cthulhu-eternal .injury-content .form-fields select { | ||||
| @@ -823,7 +1173,7 @@ i.fvtt-cthulhu-eternal { | ||||
|   letter-spacing: 1px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .injury-content .form-fields { | ||||
|   padding-top: 5px; | ||||
|   padding-top: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .injury-content label { | ||||
|   font-family: var(--font-secondary); | ||||
| @@ -886,7 +1236,7 @@ i.fvtt-cthulhu-eternal { | ||||
|   color: var(--color-dark-2); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .weapon-content input[name="name"] { | ||||
|   height: 50px; | ||||
|   height: 40px; | ||||
|   margin-right: 10px; | ||||
|   font-family: var(--font-secondary); | ||||
|   font-size: calc(var(--font-size-standard) * 1); | ||||
| @@ -894,8 +1244,8 @@ i.fvtt-cthulhu-eternal { | ||||
|   border: none; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .weapon-content fieldset { | ||||
|   margin-bottom: 5px; | ||||
|   border-radius: 5px; | ||||
|   margin-bottom: 4px; | ||||
|   border-radius: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .weapon-content .form-fields input, | ||||
| .fvtt-cthulhu-eternal .weapon-content .form-fields select { | ||||
| @@ -913,7 +1263,7 @@ i.fvtt-cthulhu-eternal { | ||||
|   letter-spacing: 1px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .weapon-content .form-fields { | ||||
|   padding-top: 5px; | ||||
|   padding-top: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .weapon-content label { | ||||
|   font-family: var(--font-secondary); | ||||
| @@ -968,7 +1318,7 @@ i.fvtt-cthulhu-eternal { | ||||
|   color: var(--color-dark-2); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .armor-content input[name="name"] { | ||||
|   height: 50px; | ||||
|   height: 40px; | ||||
|   margin-right: 10px; | ||||
|   font-family: var(--font-secondary); | ||||
|   font-size: calc(var(--font-size-standard) * 1); | ||||
| @@ -976,8 +1326,8 @@ i.fvtt-cthulhu-eternal { | ||||
|   border: none; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .armor-content fieldset { | ||||
|   margin-bottom: 5px; | ||||
|   border-radius: 5px; | ||||
|   margin-bottom: 4px; | ||||
|   border-radius: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .armor-content .form-fields input, | ||||
| .fvtt-cthulhu-eternal .armor-content .form-fields select { | ||||
| @@ -995,7 +1345,7 @@ i.fvtt-cthulhu-eternal { | ||||
|   letter-spacing: 1px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .armor-content .form-fields { | ||||
|   padding-top: 5px; | ||||
|   padding-top: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .armor-content label { | ||||
|   font-family: var(--font-secondary); | ||||
| @@ -1050,7 +1400,7 @@ i.fvtt-cthulhu-eternal { | ||||
|   color: var(--color-dark-2); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .motivation-content input[name="name"] { | ||||
|   height: 50px; | ||||
|   height: 40px; | ||||
|   margin-right: 10px; | ||||
|   font-family: var(--font-secondary); | ||||
|   font-size: calc(var(--font-size-standard) * 1); | ||||
| @@ -1058,8 +1408,8 @@ i.fvtt-cthulhu-eternal { | ||||
|   border: none; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .motivation-content fieldset { | ||||
|   margin-bottom: 5px; | ||||
|   border-radius: 5px; | ||||
|   margin-bottom: 4px; | ||||
|   border-radius: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .motivation-content .form-fields input, | ||||
| .fvtt-cthulhu-eternal .motivation-content .form-fields select { | ||||
| @@ -1077,7 +1427,7 @@ i.fvtt-cthulhu-eternal { | ||||
|   letter-spacing: 1px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .motivation-content .form-fields { | ||||
|   padding-top: 5px; | ||||
|   padding-top: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .motivation-content label { | ||||
|   font-family: var(--font-secondary); | ||||
| @@ -1132,7 +1482,7 @@ i.fvtt-cthulhu-eternal { | ||||
|   color: var(--color-dark-2); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .mentaldisorder-content input[name="name"] { | ||||
|   height: 50px; | ||||
|   height: 40px; | ||||
|   margin-right: 10px; | ||||
|   font-family: var(--font-secondary); | ||||
|   font-size: calc(var(--font-size-standard) * 1); | ||||
| @@ -1140,8 +1490,8 @@ i.fvtt-cthulhu-eternal { | ||||
|   border: none; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .mentaldisorder-content fieldset { | ||||
|   margin-bottom: 5px; | ||||
|   border-radius: 5px; | ||||
|   margin-bottom: 4px; | ||||
|   border-radius: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .mentaldisorder-content .form-fields input, | ||||
| .fvtt-cthulhu-eternal .mentaldisorder-content .form-fields select { | ||||
| @@ -1159,7 +1509,7 @@ i.fvtt-cthulhu-eternal { | ||||
|   letter-spacing: 1px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .mentaldisorder-content .form-fields { | ||||
|   padding-top: 5px; | ||||
|   padding-top: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .mentaldisorder-content label { | ||||
|   font-family: var(--font-secondary); | ||||
| @@ -1214,7 +1564,7 @@ i.fvtt-cthulhu-eternal { | ||||
|   color: var(--color-dark-2); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .bond-content input[name="name"] { | ||||
|   height: 50px; | ||||
|   height: 40px; | ||||
|   margin-right: 10px; | ||||
|   font-family: var(--font-secondary); | ||||
|   font-size: calc(var(--font-size-standard) * 1); | ||||
| @@ -1222,8 +1572,8 @@ i.fvtt-cthulhu-eternal { | ||||
|   border: none; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .bond-content fieldset { | ||||
|   margin-bottom: 5px; | ||||
|   border-radius: 5px; | ||||
|   margin-bottom: 4px; | ||||
|   border-radius: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .bond-content .form-fields input, | ||||
| .fvtt-cthulhu-eternal .bond-content .form-fields select { | ||||
| @@ -1241,7 +1591,7 @@ i.fvtt-cthulhu-eternal { | ||||
|   letter-spacing: 1px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .bond-content .form-fields { | ||||
|   padding-top: 5px; | ||||
|   padding-top: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .bond-content label { | ||||
|   font-family: var(--font-secondary); | ||||
| @@ -1312,7 +1662,7 @@ i.fvtt-cthulhu-eternal { | ||||
|   color: var(--color-dark-2); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .gear-content input[name="name"] { | ||||
|   height: 50px; | ||||
|   height: 40px; | ||||
|   margin-right: 10px; | ||||
|   font-family: var(--font-secondary); | ||||
|   font-size: calc(var(--font-size-standard) * 1); | ||||
| @@ -1320,8 +1670,8 @@ i.fvtt-cthulhu-eternal { | ||||
|   border: none; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .gear-content fieldset { | ||||
|   margin-bottom: 5px; | ||||
|   border-radius: 5px; | ||||
|   margin-bottom: 4px; | ||||
|   border-radius: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .gear-content .form-fields input, | ||||
| .fvtt-cthulhu-eternal .gear-content .form-fields select { | ||||
| @@ -1339,7 +1689,7 @@ i.fvtt-cthulhu-eternal { | ||||
|   letter-spacing: 1px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .gear-content .form-fields { | ||||
|   padding-top: 5px; | ||||
|   padding-top: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .gear-content label { | ||||
|   font-family: var(--font-secondary); | ||||
| @@ -1394,7 +1744,7 @@ i.fvtt-cthulhu-eternal { | ||||
|   color: var(--color-dark-2); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .arcane-content input[name="name"] { | ||||
|   height: 50px; | ||||
|   height: 40px; | ||||
|   margin-right: 10px; | ||||
|   font-family: var(--font-secondary); | ||||
|   font-size: calc(var(--font-size-standard) * 1); | ||||
| @@ -1402,8 +1752,8 @@ i.fvtt-cthulhu-eternal { | ||||
|   border: none; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .arcane-content fieldset { | ||||
|   margin-bottom: 5px; | ||||
|   border-radius: 5px; | ||||
|   margin-bottom: 4px; | ||||
|   border-radius: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .arcane-content .form-fields input, | ||||
| .fvtt-cthulhu-eternal .arcane-content .form-fields select { | ||||
| @@ -1421,7 +1771,7 @@ i.fvtt-cthulhu-eternal { | ||||
|   letter-spacing: 1px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .arcane-content .form-fields { | ||||
|   padding-top: 5px; | ||||
|   padding-top: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .arcane-content label { | ||||
|   font-family: var(--font-secondary); | ||||
| @@ -1476,7 +1826,7 @@ i.fvtt-cthulhu-eternal { | ||||
|   color: var(--color-dark-2); | ||||
| } | ||||
| .fvtt-cthulhu-eternal .archetype-content input[name="name"] { | ||||
|   height: 50px; | ||||
|   height: 40px; | ||||
|   margin-right: 10px; | ||||
|   font-family: var(--font-secondary); | ||||
|   font-size: calc(var(--font-size-standard) * 1); | ||||
| @@ -1484,8 +1834,8 @@ i.fvtt-cthulhu-eternal { | ||||
|   border: none; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .archetype-content fieldset { | ||||
|   margin-bottom: 5px; | ||||
|   border-radius: 5px; | ||||
|   margin-bottom: 4px; | ||||
|   border-radius: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .archetype-content .form-fields input, | ||||
| .fvtt-cthulhu-eternal .archetype-content .form-fields select { | ||||
| @@ -1503,7 +1853,7 @@ i.fvtt-cthulhu-eternal { | ||||
|   letter-spacing: 1px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .archetype-content .form-fields { | ||||
|   padding-top: 5px; | ||||
|   padding-top: 4px; | ||||
| } | ||||
| .fvtt-cthulhu-eternal .archetype-content label { | ||||
|   font-family: var(--font-secondary); | ||||
| @@ -1568,6 +1918,12 @@ i.fvtt-cthulhu-eternal { | ||||
|   width: 60px; | ||||
|   text-align: center; | ||||
| } | ||||
| .red-warning { | ||||
|   color: var(--color-failure); | ||||
| } | ||||
| .orange-warning { | ||||
|   color: var(--color-warning); | ||||
| } | ||||
| .dialog-damage { | ||||
|   display: flex; | ||||
|   justify-content: center; | ||||
|   | ||||
| @@ -12,8 +12,6 @@ import * as documents from "./module/documents/_module.mjs" | ||||
| import * as applications from "./module/applications/_module.mjs" | ||||
|  | ||||
| import { handleSocketEvent } from "./module/socket.mjs" | ||||
| import { Macros } from "./module/macros.mjs" | ||||
| import { setupTextEnrichers } from "./module/enrichers.mjs" | ||||
| import CthulhuEternalUtils from "./module/utils.mjs" | ||||
|  | ||||
| export class ClassCounter{static printHello(){console.log("Hello")}static sendJsonPostRequest(e,s){const t={method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(s)};return fetch(e,t).then((e=>{if(!e.ok)throw new Error("La requête a échoué avec le statut "+e.status);return e.json()})).catch((e=>{throw console.error("Erreur envoi de la requête:",e),e}))}static registerUsageCount(e=game.system.id,s={}){if(game.user.isGM){game.settings.register(e,"world-key",{name:"Unique world key",scope:"world",config:!1,default:"",type:String});let t=game.settings.get(e,"world-key");null!=t&&""!=t&&"NONE"!=t&&"none"!=t.toLowerCase()||(t=foundry.utils.randomID(32),game.settings.set(e,"world-key",t));let a={name:e,system:game.system.id,worldKey:t,version:game.system.version,language:game.settings.get("core","language"),remoteAddr:game.data.addresses.remote,nbInstalledModules:game.modules.size,nbActiveModules:game.modules.filter((e=>e.active)).length,nbPacks:game.world.packs.size,nbUsers:game.users.size,nbScenes:game.scenes.size,nbActors:game.actors.size,nbPlaylist:game.playlists.size,nbTables:game.tables.size,nbCards:game.cards.size,optionsData:s,foundryVersion:`${game.release.generation}.${game.release.build}`};this.sendJsonPostRequest("https://www.uberwald.me/fvtt_appcount/count_post.php",a)}}} | ||||
| @@ -34,7 +32,8 @@ Hooks.once("init", function () { | ||||
|  | ||||
|   CONFIG.Actor.documentClass = documents.CthulhuEternalActor | ||||
|   CONFIG.Actor.dataModels = { | ||||
|     protagonist: models.CthulhuEternalProtagonist | ||||
|     protagonist: models.CthulhuEternalProtagonist, | ||||
|     vehicle: models.CthulhuEternalVehicle | ||||
|   } | ||||
|  | ||||
|   CONFIG.Item.documentClass = documents.CthulhuEternalItem | ||||
| @@ -54,6 +53,7 @@ Hooks.once("init", function () { | ||||
|   // Register sheet application classes | ||||
|   Actors.unregisterSheet("core", ActorSheet) | ||||
|   Actors.registerSheet("fvtt-cthulhu-eternal", applications.CthulhuEternalProtagonistSheet, { types: ["protagonist"], makeDefault: true }) | ||||
|   Actors.registerSheet("fvtt-cthulhu-eternal", applications.CthulhuEternalVehicleSheet, { types: ["vehicle"], makeDefault: true }) | ||||
|  | ||||
|   Items.unregisterSheet("core", ItemSheet) | ||||
|   Items.registerSheet("fvtt-cthulhu-eternal", applications.CthulhuEternalSkillSheet, { types: ["skill"], makeDefault: true }) | ||||
| @@ -84,22 +84,10 @@ Hooks.once("init", function () { | ||||
|   // Activate socket handler | ||||
|   game.socket.on(`system.${SYSTEM.id}`, handleSocketEvent) | ||||
|  | ||||
|   setupTextEnrichers() | ||||
|   CthulhuEternalUtils.registerSettings() | ||||
|   CthulhuEternalUtils.registerHandlebarsHelpers() | ||||
|   CthulhuEternalUtils.setupCSSRootVariables() | ||||
|  | ||||
|   // Gestion des jets de dés depuis les journaux | ||||
|   document.addEventListener("click", (event) => { | ||||
|     const anchor = event.target.closest("a.ask-roll-journal") | ||||
|     if (!anchor) return | ||||
|     event.preventDefault() | ||||
|     event.stopPropagation() | ||||
|     const type = anchor.dataset.rollType | ||||
|     const target = anchor.dataset.rollTarget | ||||
|     const title = anchor.dataset.rollTitle | ||||
|   }) | ||||
|  | ||||
|   console.info("CTHULHU ETERNAL | System Initialized") | ||||
| }) | ||||
|  | ||||
| @@ -118,15 +106,11 @@ function preLocalizeConfig() { | ||||
|  | ||||
| Hooks.once("ready", function () { | ||||
|   console.info("CTHULHU ETERNAL | Ready") | ||||
|   ClassCounter.registerUsageCount("fvtt-cthulhu-eternal", {}) | ||||
|   _showUserGuide() | ||||
|  | ||||
|   /* Display the user guide */ | ||||
|   async function _showUserGuide() { | ||||
|     if (game.user.isGM) { | ||||
|       const newVer = game.system.version | ||||
|     } | ||||
|   if (game.user.isGM) { | ||||
|     ClassCounter.registerUsageCount("fvtt-cthulhu-eternal", {}) | ||||
|   } | ||||
|   preLocalizeConfig() | ||||
|  | ||||
| }) | ||||
|  | ||||
| Hooks.on("renderChatMessage", (message, html, data) => { | ||||
| @@ -152,9 +136,6 @@ Hooks.on("renderChatMessage", (message, html, data) => { | ||||
|   } | ||||
| }) | ||||
|  | ||||
| Hooks.on("updateSetting", async (setting, update, options, id) => { | ||||
| }) | ||||
|  | ||||
| // Dice-so-nice Ready | ||||
| Hooks.once("diceSoNiceReady", (dice3d) => { | ||||
|   configureDiceSoNice(dice3d) | ||||
| @@ -167,18 +148,8 @@ Hooks.once("diceSoNiceReady", (dice3d) => { | ||||
|  * Journal   - open journal sheet | ||||
|  */ | ||||
| Hooks.on("hotbarDrop", (bar, data, slot) => { | ||||
|   if (["Actor", "Item", "JournalEntry", "roll", "rollDamage", "rollAttack"].includes(data.type)) { | ||||
|     Macros.createCthulhuEternalMacro(data, slot); | ||||
|   if (["Actor", "Item", "JournalEntry", "skill", "weapon"].includes(data.type)) { | ||||
|     // TODO -> Manage this | ||||
|     return false | ||||
|   } | ||||
| }) | ||||
|  | ||||
| /** | ||||
|  * Register world usage statistics | ||||
|  * @param {string} registerKey | ||||
|  */ | ||||
| function registerWorldCount(registerKey) { | ||||
|   if (game.user.isGM) { | ||||
|     ClassCounter.registerUsageCount(game.system.id, {}) | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,12 +1,17 @@ | ||||
| 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("styles/fvtt-cthulhu-eternal.less") | ||||
|       .pipe(less()) | ||||
|       .pipe(less()).on('error',console.log.bind(console)) | ||||
|       .pipe(gulp.dest("./css")) | ||||
| } | ||||
| const css = gulp.series(compileLESS); | ||||
|   | ||||
							
								
								
									
										112
									
								
								lang/en.json
									
									
									
									
									
								
							
							
						
						
									
										112
									
								
								lang/en.json
									
									
									
									
									
								
							| @@ -1,7 +1,8 @@ | ||||
| { | ||||
|   "TYPES": { | ||||
|     "Actor": { | ||||
|       "protagonist": "Protagonist" | ||||
|       "protagonist": "Protagonist", | ||||
|       "vehicle": "Vehicle" | ||||
|     }, | ||||
|     "Item": { | ||||
|       "skill": "Skill", | ||||
| @@ -18,6 +19,8 @@ | ||||
|   }, | ||||
|   "CTHULHUETERNAL": { | ||||
|     "Settings": { | ||||
|       "era": "Select the era of your game", | ||||
|       "eraHint": "Select the era of your game", | ||||
|       "Common": "Common", | ||||
|       "Classical": "Classical", | ||||
|       "Medieval": "Medieval", | ||||
| @@ -34,7 +37,30 @@ | ||||
|     }, | ||||
|     "Protagonist": { | ||||
|       "FIELDS": { | ||||
|         "resources": { | ||||
|           "permanentRating": { | ||||
|             "label": "Permanent Rating" | ||||
|           }, | ||||
|           "hand": { | ||||
|             "label": "Hand" | ||||
|           }, | ||||
|           "stowed": { | ||||
|             "label": "Stowed" | ||||
|           }, | ||||
|           "storage": { | ||||
|             "label": "Storage" | ||||
|           } | ||||
|         }, | ||||
|         "biodata": { | ||||
|           "feature": { | ||||
|             "label": "Feature" | ||||
|           }, | ||||
|           "adaptedToViolence": { | ||||
|             "label": "Adapted to violence" | ||||
|           }, | ||||
|           "adaptedToHelplessness": { | ||||
|             "label": "Adapted to helplessness" | ||||
|           }, | ||||
|           "harshness": { | ||||
|             "label": "Harshness" | ||||
|           }, | ||||
| @@ -83,6 +109,12 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "Insanity": { | ||||
|       "None": "None", | ||||
|       "Flee": "Flee", | ||||
|       "Submit": "Submit", | ||||
|       "Struggle": "Struggle" | ||||
|     }, | ||||
|     "Skill": { | ||||
|       "Unnatural": "Unnatural", | ||||
|       "Melee": "Melee Weapons", | ||||
| @@ -120,6 +152,9 @@ | ||||
|         "resourceLevel": { | ||||
|           "label": "Resource level" | ||||
|         }, | ||||
|         "state": { | ||||
|           "label": "State" | ||||
|         }, | ||||
|         "settings": { | ||||
|           "label": "Settings era" | ||||
|         } | ||||
| @@ -148,6 +183,9 @@ | ||||
|         "riflecarabine": "Rifle/Carabine" | ||||
|       }, | ||||
|       "FIELDS": { | ||||
|         "state": { | ||||
|           "label": "State" | ||||
|         }, | ||||
|         "settings": { | ||||
|           "label": "Settings era" | ||||
|         }, | ||||
| @@ -203,10 +241,41 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "Vehicle": { | ||||
|       "FIELDS": { | ||||
|         "description": { | ||||
|           "label": "Description" | ||||
|         }, | ||||
|         "notes": { | ||||
|           "label": "Notes" | ||||
|         }, | ||||
|         "surfaceSpeed": { | ||||
|           "label": "Surface Speed" | ||||
|         }, | ||||
|         "airSpeed": { | ||||
|           "label": "Air Speed" | ||||
|         }, | ||||
|         "armor": { | ||||
|           "label": "Armor" | ||||
|         }, | ||||
|         "settings": { | ||||
|           "label": "Settings era" | ||||
|         }, | ||||
|         "crew": { | ||||
|           "label": "Crew" | ||||
|         }, | ||||
|         "state": { | ||||
|           "label": "State" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "MentalDisorder": { | ||||
|       "FIELDS": { | ||||
|         "description": { | ||||
|           "label": "Description" | ||||
|         }, | ||||
|         "cured": { | ||||
|           "label": "Cured" | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
| @@ -256,8 +325,31 @@ | ||||
|       "veryHarsh": "Very Harsh" | ||||
|     }, | ||||
|     "Label": { | ||||
|       "titleSkill": "Skill", | ||||
|       "titleWeapon": "Weapon", | ||||
|       "Hand": "Hand", | ||||
|       "Stowed": "Stowed", | ||||
|       "Storage": "Storage", | ||||
|       "resourceRating": "Resource rating", | ||||
|       "Resources": "Resources", | ||||
|       "multiplier": "Multiplier", | ||||
|       "setBP": "Set BP", | ||||
|       "Vehicle": "Vehicle", | ||||
|       "Speed": "Speed", | ||||
|       "Slow": "Slow", | ||||
|       "Fast": "Fast", | ||||
|       "Average": "Average", | ||||
|       "None": "None", | ||||
|       "Pristine": "Pristine", | ||||
|       "Worn": "Worn", | ||||
|       "Junk": "Junk", | ||||
|       "resources": "Resources", | ||||
|       "resourceChecks": "Resource Checks", | ||||
|       "sanBPShort": "BP", | ||||
|       "tempInsanity": "Temp. Insanity", | ||||
|       "distinguishingFeatures": "Distinguishing Features", | ||||
|       "titleSkill": "Skill Roll", | ||||
|       "titleWeapon": "Weapon Roll", | ||||
|       "titleCharacteristic": "Characteristic Roll", | ||||
|       "titleSAN": "SAN Roll", | ||||
|       "biodata": "Biodata", | ||||
|       "skill": "Skill", | ||||
|       "modifier": "Modifier", | ||||
| @@ -309,6 +401,7 @@ | ||||
|       "criticalSuccess": "Critical Success", | ||||
|       "criticalFailure": "Critical Failure", | ||||
|       "Characteristic": "Characteristic", | ||||
|       "characteristic": "Characteristic", | ||||
|       "targetScore": "Target Score", | ||||
|       "gears": "Gears", | ||||
|       "armors": "Armors", | ||||
| @@ -333,6 +426,9 @@ | ||||
|       "newArchetype": "New Archetype", | ||||
|       "newSkill": "New Skill" | ||||
|     }, | ||||
|     "ChatMessage": { | ||||
|       "exhausted": "Your protagonist is exhausted. He loses [[/r 1d6]] Willpower Points." | ||||
|     }, | ||||
|     "Edit": "Edit", | ||||
|     "Delete": "Delete", | ||||
|     "ToggleSheet": "Toggle Sheet", | ||||
| @@ -344,11 +440,15 @@ | ||||
|       "roll": "Roll" | ||||
|     }, | ||||
|     "Tooltip": { | ||||
|       "sanBP": ">5 SAN lost in one roll, temporary insanity. If SAN less reaches BP = a Disorder unconscious Breaking and AND reset BP." | ||||
|     }, | ||||
|     "Setting": { | ||||
|       "sanBP": ">5 SAN lost in one roll, temporary insanity. If SAN less reaches BP = a Disorder unconscious Breaking and AND reset BP.", | ||||
|       "setBP": "Set the current Breaking Point based on the current SAN value" | ||||
|     }, | ||||
|     "Chat": { | ||||
|     }, | ||||
|     "Notitications": { | ||||
|       "NoWeaponSkill": "No weapon skill found for this weapon. Check Weapon definition or available skills/era", | ||||
|       "NoWeaponType": "No weapon type found for this weapon subtype. Check Weapon definition or available skills/era", | ||||
|       "skillAlreadyExists": "Skill already exists" | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -9,3 +9,4 @@ export { default as CthulhuEternalMentalDisorderSheet } from "./sheets/mentaldis | ||||
| export { default as CthulhuEternalGearSheet } from "./sheets/gear-sheet.mjs" | ||||
| export { default as CthulhuEternalMotivationSheet } from "./sheets/motivation-sheet.mjs" | ||||
| export { default as CthulhuEternalArchetypeSheet } from "./sheets/archetype-sheet.mjs" | ||||
| export { default as CthulhuEternalVehicleSheet } from "./sheets/vehicle-sheet.mjs" | ||||
|   | ||||
| @@ -18,4 +18,12 @@ export default class CthulhuEternalMentalDisorderSheet extends CthulhuEternalIte | ||||
|       template: "systems/fvtt-cthulhu-eternal/templates/mentaldisorder.hbs", | ||||
|     }, | ||||
|   } | ||||
|  | ||||
|   /** @override */ | ||||
|   async _prepareContext() { | ||||
|     const context = await super._prepareContext() | ||||
|     context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true }) | ||||
|     return context | ||||
|   } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -22,6 +22,8 @@ export default class CthulhuEternalMotivationSheet extends CthulhuEternalItemShe | ||||
|   /** @override */ | ||||
|   async _prepareContext() { | ||||
|     const context = await super._prepareContext() | ||||
|     context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true }) | ||||
|     return context | ||||
|   } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -5,13 +5,14 @@ export default class CthulhuEternalProtagonistSheet extends CthulhuEternalActorS | ||||
|   static DEFAULT_OPTIONS = { | ||||
|     classes: ["protagonist"], | ||||
|     position: { | ||||
|       width: 848, | ||||
|       width: 860, | ||||
|       height: 620, | ||||
|     }, | ||||
|     window: { | ||||
|       contentClasses: ["protagonist-content"], | ||||
|     }, | ||||
|     actions: { | ||||
|       setBP: CthulhuEternalProtagonistSheet.#onSetBP, | ||||
|       createGear: CthulhuEternalProtagonistSheet.#onCreateGear, | ||||
|       createArmor: CthulhuEternalProtagonistSheet.#onCreateArmor, | ||||
|       createWeapon: CthulhuEternalProtagonistSheet.#onCreateWeapon, | ||||
| @@ -73,6 +74,9 @@ export default class CthulhuEternalProtagonistSheet extends CthulhuEternalActorS | ||||
|     const context = await super._prepareContext() | ||||
|     context.tabs = this.#getTabs() | ||||
|  | ||||
|     context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true }) | ||||
|     context.enrichedNotes = await TextEditor.enrichHTML(this.document.system.notes, { async: true }) | ||||
|      | ||||
|     context.tooltipsCharacteristic = { | ||||
|       str: game.i18n.localize("CTHULHUETERNAL.Characteristic.Str"), | ||||
|       dex: game.i18n.localize("CTHULHUETERNAL.Characteristic.Dex"), | ||||
| @@ -82,23 +86,9 @@ export default class CthulhuEternalProtagonistSheet extends CthulhuEternalActorS | ||||
|       cha: game.i18n.localize("CTHULHUETERNAL.Characteristic.Cha") | ||||
|     } | ||||
|  | ||||
|     context.tooltipsRessources = { | ||||
|     } | ||||
|  | ||||
|     context.rollType = { | ||||
|       str: "characteristic", | ||||
|       dex: "characteristic", | ||||
|       con: "characteristic", | ||||
|       int: "characteristic", | ||||
|       pow: "characteristic", | ||||
|       cha: "characteristic" | ||||
|     } | ||||
|     return context | ||||
|   } | ||||
|  | ||||
|   _generateTooltip(type, target) { | ||||
|   } | ||||
|  | ||||
|   /** @override */ | ||||
|   async _preparePartContext(partId, context) { | ||||
|     const doc = this.document | ||||
| @@ -108,22 +98,30 @@ export default class CthulhuEternalProtagonistSheet extends CthulhuEternalActorS | ||||
|       case "skills": | ||||
|         context.tab = context.tabs.skills | ||||
|         context.skills = doc.itemTypes.skill | ||||
|         context.skills.sort((a, b) => a.name.localeCompare(b.name)) | ||||
|         break | ||||
|       case "equipment": | ||||
|         context.tab = context.tabs.equipment | ||||
|         context.weapons = doc.itemTypes.weapon | ||||
|         context.weapons.sort((a, b) => a.name.localeCompare(b.name)) | ||||
|         context.armors = doc.itemTypes.armor | ||||
|         context.armors.sort((a, b) => a.name.localeCompare(b.name)) | ||||
|         context.gears = doc.itemTypes.gear | ||||
|         context.gears.sort((a, b) => a.name.localeCompare(b.name)) | ||||
|         break | ||||
|       case "status": | ||||
|         context.tab = context.tabs.status | ||||
|         context.injuries = doc.itemTypes.injury | ||||
|         context.injuries.sort((a, b) => a.name.localeCompare(b.name)) | ||||
|         context.mentaldisorders = doc.itemTypes.mentaldisorder | ||||
|         context.mentaldisorders.sort((a, b) => a.name.localeCompare(b.name)) | ||||
|         context.bonds = doc.itemTypes.bond | ||||
|         context.bonds.sort((a, b) => a.name.localeCompare(b.name)) | ||||
|         break | ||||
|       case "biography": | ||||
|         context.tab = context.tabs.biography | ||||
|         context.motivations = doc.itemTypes.motivation | ||||
|         context.motivations.sort((a, b) => a.name.localeCompare(b.name)) | ||||
|         context.enrichedDescription = await TextEditor.enrichHTML(doc.system.description, { async: true }) | ||||
|         context.enrichedNotes = await TextEditor.enrichHTML(doc.system.notes, { async: true }) | ||||
|         break | ||||
| @@ -136,6 +134,10 @@ export default class CthulhuEternalProtagonistSheet extends CthulhuEternalActorS | ||||
|    * @param {Event} event             The initiating click event. | ||||
|    * @param {HTMLElement} target      The current target of the event listener. | ||||
|    */ | ||||
|   static #onSetBP(event, target) { | ||||
|     this.document.system.setBP() | ||||
|   } | ||||
|    | ||||
|   static #onCreateGear(event, target) { | ||||
|     this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("CTHULHUETERNAL.Label.newGear"), type: "gear" }]) | ||||
|   } | ||||
| @@ -189,10 +191,15 @@ export default class CthulhuEternalProtagonistSheet extends CthulhuEternalActorS | ||||
|     // Debug : console.log(">>>>", event, target, rollType) | ||||
|     // Deprecated : if (this.isEditMode) return | ||||
|     switch (rollType) { | ||||
|       case "resource":  | ||||
|         item = foundry.utils.duplicate(this.actor.system.resources) | ||||
|         item.name = game.i18n.localize(`CTHULHUETERNAL.Label.Resources`) | ||||
|         item.targetScore = item.permanentRating | ||||
|         break | ||||
|       case "char": | ||||
|         let charId = $(event.currentTarget).data("char-id") | ||||
|         item = foundry.utils.duplicate(this.actor.system.characteristics[charId]) | ||||
|         item.name = game.i18n.localize("CTHULHUETERNAL.Label." + charId + "Long") | ||||
|         item.name = game.i18n.localize(`CTHULHUETERNAL.Label.${charId}Long`) | ||||
|         item.targetScore = item.value * 5 | ||||
|         break | ||||
|       case "skill": | ||||
| @@ -204,6 +211,11 @@ export default class CthulhuEternalProtagonistSheet extends CthulhuEternalActorS | ||||
|         li = $(event.currentTarget).parents(".item"); | ||||
|         item = this.actor.items.get(li.data("item-id")); | ||||
|         break | ||||
|       case "san":  | ||||
|         item = foundry.utils.duplicate(this.actor.system.san) | ||||
|         item.name = game.i18n.localize("CTHULHUETERNAL.Label.SAN") | ||||
|         item.targetScore = item.value | ||||
|         break; | ||||
|       default: | ||||
|         throw new Error(`Unknown roll type ${rollType}`) | ||||
|     } | ||||
|   | ||||
							
								
								
									
										117
									
								
								module/applications/sheets/vehicle-sheet.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								module/applications/sheets/vehicle-sheet.mjs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,117 @@ | ||||
| import CthulhuEternalActorSheet from "./base-actor-sheet.mjs" | ||||
|  | ||||
| export default class CthulhuEternalVehicleSheet extends CthulhuEternalActorSheet { | ||||
|   /** @override */ | ||||
|   static DEFAULT_OPTIONS = { | ||||
|     classes: ["vehicle"], | ||||
|     position: { | ||||
|       width: 680, | ||||
|       height: 540, | ||||
|     }, | ||||
|     window: { | ||||
|       contentClasses: ["vehicle-content"], | ||||
|     }, | ||||
|     actions: { | ||||
|       createGear: CthulhuEternalVehicleSheet.#onCreateGear, | ||||
|       createWeapon: CthulhuEternalVehicleSheet.#onCreateWeapon, | ||||
|     }, | ||||
|   } | ||||
|  | ||||
|   /** @override */ | ||||
|   static PARTS = { | ||||
|     main: { | ||||
|       template: "systems/fvtt-cthulhu-eternal/templates/vehicle-main.hbs", | ||||
|     }, | ||||
|     tabs: { | ||||
|       template: "templates/generic/tab-navigation.hbs", | ||||
|     }, | ||||
|     equipment: { | ||||
|       template: "systems/fvtt-cthulhu-eternal/templates/vehicle-equipment.hbs", | ||||
|     }, | ||||
|     description: { | ||||
|       template: "systems/fvtt-cthulhu-eternal/templates/vehicle-description.hbs", | ||||
|     }, | ||||
|   } | ||||
|  | ||||
|    /** @override */ | ||||
|    tabGroups = { | ||||
|     sheet: "equipment", | ||||
|   } | ||||
|    | ||||
|   /** | ||||
|    * Prepare an array of form header tabs. | ||||
|    * @returns {Record<string, Partial<ApplicationTab>>} | ||||
|    */ | ||||
|   #getTabs() { | ||||
|     const tabs = { | ||||
|       equipment: { id: "equipment", group: "sheet", icon: "fa-solid fa-shapes", label: "CTHULHUETERNAL.Label.equipment" }, | ||||
|       description: { id: "description", group: "sheet", icon: "fa-solid fa-book", label: "CTHULHUETERNAL.Label.description" }, | ||||
|     } | ||||
|     for (const v of Object.values(tabs)) { | ||||
|       v.active = this.tabGroups[v.group] === v.id | ||||
|       v.cssClass = v.active ? "active" : "" | ||||
|     } | ||||
|     return tabs | ||||
|   } | ||||
|  | ||||
|   /** @override */ | ||||
|   async _prepareContext() { | ||||
|     const context = await super._prepareContext() | ||||
|     context.tabs = this.#getTabs() | ||||
|  | ||||
|     context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true }) | ||||
|     context.enrichedNotes = await TextEditor.enrichHTML(this.document.system.notes, { async: true }) | ||||
|      | ||||
|     return context | ||||
|   } | ||||
|  | ||||
|   _generateTooltip(type, target) { | ||||
|   } | ||||
|  | ||||
|   /** @override */ | ||||
|   async _preparePartContext(partId, context) { | ||||
|     const doc = this.document | ||||
|     switch (partId) { | ||||
|       case "main": | ||||
|         break | ||||
|       case "equipment": | ||||
|         context.tab = context.tabs.equipment | ||||
|         context.weapons = doc.itemTypes.weapon | ||||
|         context.gears = doc.itemTypes.gear | ||||
|         break   | ||||
|       case "description": | ||||
|         context.tab = context.tabs.description | ||||
|         context.enrichedDescription = await TextEditor.enrichHTML(doc.system.description, { async: true }) | ||||
|         context.enrichedNotes = await TextEditor.enrichHTML(doc.system.notes, { async: true }) | ||||
|         break | ||||
|     } | ||||
|     return context | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Creates a new attack item directly from the sheet and embeds it into the document. | ||||
|    * @param {Event} event             The initiating click event. | ||||
|    * @param {HTMLElement} target      The current target of the event listener. | ||||
|    */ | ||||
|   static #onCreateGear(event, target) { | ||||
|     this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("CTHULHUETERNAL.Label.newGear"), type: "gear" }]) | ||||
|   } | ||||
|  | ||||
|   static #onCreateWeapon(event, target) { | ||||
|     this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("CTHULHUETERNAL.Label.newWeapon"), type: "weapon" }]) | ||||
|   } | ||||
|  | ||||
|  | ||||
|   async _onDrop(event) { | ||||
|     if (!this.isEditable || !this.isEditMode) return | ||||
|     const data = TextEditor.getDragEventData(event) | ||||
|  | ||||
|     // Handle different data types | ||||
|     switch (data.type) { | ||||
|       case "Item": | ||||
|         const item = await fromUuid(data.uuid) | ||||
|         return super._onDropItem(item) | ||||
|     } | ||||
|   } | ||||
|  | ||||
| } | ||||
| @@ -34,6 +34,13 @@ export const AVAILABLE_SETTINGS = { | ||||
|   postapo: "CTHULHUETERNAL.Settings.PostApo" | ||||
| } | ||||
|  | ||||
| export const INSANITY = { | ||||
|   "none": "CTHULHUETERNAL.Insanity.None", | ||||
|   "flee": "CTHULHUETERNAL.Insanity.Flee", | ||||
|   "struggle": "CTHULHUETERNAL.Insanity.Struggle", | ||||
|   "submit": "CTHULHUETERNAL.Insanity.Submit" | ||||
| } | ||||
|  | ||||
| export const ERA_CSS = { | ||||
|   jazz: { primaryFont: "RozhaOne", secondaryFont: "RozhaOne", titleFont: "Broadway", imgFilter: "brightness(0) saturate(100%) invert(52%) sepia(9%) saturate(2368%) hue-rotate(360deg) brightness(86%) contrast(84%)" }, | ||||
|   modern: { primaryFont: "Georama", secondaryFont: "Georama", titleFont: "Georama", imgFilter: "brightness(0) saturate(100%) invert(92%) sepia(11%) saturate(1214%) hue-rotate(51deg) brightness(93%) contrast(86%)" }, | ||||
| @@ -82,6 +89,43 @@ export const RESOURCE_RATING = { | ||||
|   } | ||||
| } | ||||
|  | ||||
| export const RESOURCE_BREAKDOWN = [ | ||||
|   { value: 0, hand: 0, stowed: 0, storage: 0, checks: 0}, | ||||
|   { value: 1, hand: 1, stowed: 0, storage: 0, checks: 1}, | ||||
|   { value: 2, hand: 2, stowed: 0, storage: 0, checks: 1}, | ||||
|   { value: 3, hand: 3, stowed: 0, storage: 0, checks: 1}, | ||||
|   { value: 4, hand: 4, stowed: 0, storage: 0, checks: 1}, | ||||
|   { value: 5, hand: 5, stowed: 0, storage: 0, checks: 1}, | ||||
|   { value: 6, hand: 6, stowed: 0, storage: 0, checks: 1}, | ||||
|   { value: 7, hand: 6, stowed: 1, storage: 0, checks: 2}, | ||||
|   { value: 8, hand: 6, stowed: 2, storage: 0, checks: 2}, | ||||
|   { value: 9, hand: 6, stowed: 3, storage: 0, checks: 2}, | ||||
|   { value: 10, hand: 6, stowed: 4, storage: 0, checks: 2}, | ||||
|   { value: 11, hand: 6, stowed: 5, storage: 0, checks: 2}, | ||||
|   { value: 12, hand: 6, stowed: 6, storage: 0, checks: 2}, | ||||
|   { value: 13, hand: 6, stowed: 6, storage: 1, checks: 3}, | ||||
|   { value: 14, hand: 6, stowed: 6, storage: 2, checks: 3}, | ||||
|   { value: 15, hand: 6, stowed: 6, storage: 3, checks: 3}, | ||||
|   { value: 16, hand: 6, stowed: 6, storage: 4, checks: 3}, | ||||
|   { value: 17, hand: 6, stowed: 6, storage: 5, checks: 3}, | ||||
|   { value: 18, hand: 6, stowed: 6, storage: 6, checks: 3}, | ||||
|   { value: 19, hand: 6, stowed: 6, storage: 7, checks: 3}, | ||||
|   { value: 20, hand: 6, stowed: 6, storage: 8, checks: 3} | ||||
| ] | ||||
|  | ||||
| export const VEHICLE_SPEED = { | ||||
|   "none": "CTHULHUETERNAL.Label.None", | ||||
|   "slow": "CTHULHUETERNAL.Label.Slow", | ||||
|   "average": "CTHULHUETERNAL.Label.Average", | ||||
|   "fast": "CTHULHUETERNAL.Label.Fast" | ||||
| } | ||||
|  | ||||
| export const EQUIPMENT_STATES = {  | ||||
|   "pristine": "CTHULHUETERNAL.Label.Pristine", | ||||
|   "worn": "CTHULHUETERNAL.Label.Worn", | ||||
|   "junk": "CTHULHUETERNAL.Label.Junk" | ||||
| } | ||||
|  | ||||
| export const MENTAL_ILLNESS_CURE_SKILL = { | ||||
|   jazz: "CTHULHUETERNAL.Skill.Psychoanalyze", | ||||
|   modern: "CTHULHUETERNAL.Skill.Psychoanalyze", | ||||
| @@ -165,6 +209,26 @@ export const WEAPON_SKILL_MAPPING = { | ||||
|     "unarmed": "CTHULHUETERNAL.Skill.UnarmedCombat" | ||||
|   } | ||||
| } | ||||
|  | ||||
| export const MODIFIER_CHOICES = { | ||||
|   "-10": "-10", | ||||
|   "-20": "-20", | ||||
|   "-40": "-40", | ||||
|   "+0": "+0", | ||||
|   "+10": "+10", | ||||
|   "+20": "+20", | ||||
|   "+40": "+40", | ||||
| } | ||||
|  | ||||
| export const MULTIPLIER_CHOICES = { | ||||
|   "0.25": "0.25", | ||||
|   "0.5": "0.5", | ||||
|   "1": "1", | ||||
|   "2": "2", | ||||
|   "4": "4", | ||||
|   "5": "5" | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Include all constant definitions within the SYSTEM global export | ||||
|  * @type {Object} | ||||
| @@ -181,5 +245,11 @@ export const SYSTEM = { | ||||
|   RESOURCE_RATING, | ||||
|   MENTAL_ILLNESS_CURE_SKILL, | ||||
|   ERA_CSS, | ||||
|   INSANITY, | ||||
|   EQUIPMENT_STATES, | ||||
|   RESOURCE_BREAKDOWN, | ||||
|   VEHICLE_SPEED, | ||||
|   MODIFIER_CHOICES, | ||||
|   MULTIPLIER_CHOICES, | ||||
|   ASCII | ||||
| } | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| import CthulhuEternalUtils from "../utils.mjs" | ||||
|  | ||||
| export default class CthulhuEternalActor extends Actor { | ||||
|    | ||||
|  | ||||
|   static async create(data, options) { | ||||
|  | ||||
|     // Case of compendium global import | ||||
| @@ -19,7 +19,7 @@ export default class CthulhuEternalActor extends Actor { | ||||
|       const skills = await CthulhuEternalUtils.loadCompendium("fvtt-cthulhu-eternal.skills") | ||||
|       data.items = data.items || [] | ||||
|       for (let skill of skills) { | ||||
|         if (skill.system.settings === era ) { | ||||
|         if (skill.system.settings === era) { | ||||
|           data.items.push(skill.toObject()) | ||||
|         } | ||||
|       } | ||||
| @@ -28,20 +28,50 @@ export default class CthulhuEternalActor extends Actor { | ||||
|     return super.create(data, options); | ||||
|   } | ||||
|  | ||||
|  | ||||
|   async _preCreate(data, options, user) { | ||||
|     await super._preCreate(data, options, user) | ||||
|  | ||||
|     // Configure prototype token settings | ||||
|     const prototypeToken = {} | ||||
|     if (this.type === "protagonist") { | ||||
|       Object.assign(prototypeToken, { | ||||
|         sight: { enabled: true }, | ||||
|         actorLink: true, | ||||
|         disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY, | ||||
|   _onUpdate(changed, options, userId) { | ||||
|     // DEBUG : console.log("CthulhuEternalActor.update", changed, options, userId) | ||||
|     if (changed?.system?.wp?.exhausted) { | ||||
|       ChatMessage.create({ | ||||
|         user: userId, | ||||
|         speaker: { alias: this.name }, | ||||
|         rollMode: "selfroll", | ||||
|         content: game.i18n.localize("CTHULHUETERNAL.ChatMessage.exhausted"), | ||||
|         type: CONST.CHAT_MESSAGE_STYLES.OTHER | ||||
|       }) | ||||
|       this.updateSource({ prototypeToken }) | ||||
|     } | ||||
|     return super._onUpdate(changed, options, userId) | ||||
|   } | ||||
|  | ||||
|   async createEmbeddedDocuments(embeddedName, data, operation) { | ||||
|     let newData = [] | ||||
|     if (embeddedName === "Item") { | ||||
|       for (let i of data) { | ||||
|         if (i.type === "skill") { | ||||
|           if (this.items.find(item => item.name.toLowerCase() === i.name.toLowerCase())) { | ||||
|             ui.notifications.warn(game.i18n.localize("CTHULHUETERNAL.Notifications.skillAlreadyExists")) | ||||
|             continue | ||||
|           } | ||||
|         } | ||||
|         newData.push(i) | ||||
|       } | ||||
|       return super.createEmbeddedDocuments(embeddedName, newData, operation) | ||||
|     } | ||||
|     return super.createEmbeddedDocuments(embeddedName, data, operation) | ||||
|   } | ||||
|  | ||||
|   async _preCreate(data, options, user) { | ||||
|   await super._preCreate(data, options, user) | ||||
|  | ||||
|   // Configure prototype token settings | ||||
|   const prototypeToken = {} | ||||
|   if (this.type === "protagonist") { | ||||
|     Object.assign(prototypeToken, { | ||||
|       sight: { enabled: true }, | ||||
|       actorLink: true, | ||||
|       disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY, | ||||
|     }) | ||||
|     this.updateSource({ prototypeToken }) | ||||
|   } | ||||
| } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -59,18 +59,6 @@ export default class CthulhuEternalRoll extends Roll { | ||||
|     return this.options.hasTarget | ||||
|   } | ||||
|  | ||||
|   get targetName() { | ||||
|     return this.options.targetName | ||||
|   } | ||||
|  | ||||
|   get targetArmor() { | ||||
|     return this.options.targetArmor | ||||
|   } | ||||
|  | ||||
|   get targetMalus() { | ||||
|     return this.options.targetMalus | ||||
|   } | ||||
|  | ||||
|   get realDamage() { | ||||
|     return this.options.realDamage | ||||
|   } | ||||
| @@ -79,6 +67,35 @@ export default class CthulhuEternalRoll extends Roll { | ||||
|     return this.options.weapon | ||||
|   } | ||||
|  | ||||
|   get isLowWP() { | ||||
|     return this.options.isLowWP | ||||
|   } | ||||
|  | ||||
|   get isZeroWP() { | ||||
|     return this.options.isZeroWP | ||||
|   } | ||||
|  | ||||
|   get isExhausted() { | ||||
|     return this.options.isExhausted | ||||
|   } | ||||
|  | ||||
|   static updateResourceDialog(options) { | ||||
|     let rating = 0 | ||||
|     if (options.rollItem.enableHand) { | ||||
|       rating += options.rollItem.hand | ||||
|     } | ||||
|     if (options.rollItem.enableStowed) { | ||||
|       rating += options.rollItem.stowed | ||||
|     } | ||||
|     if (options.rollItem.enableStorage) { | ||||
|       rating += options.rollItem.storage | ||||
|     } | ||||
|     let multiplier = Number($(`.roll-skill-multiplier`).val()) | ||||
|     options.initialScore = rating | ||||
|     options.percentScore = rating * multiplier | ||||
|     $(".resource-score").text(`${rating} (${options.percentScore}%)`) | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Prompt the user with a dialog to configure and execute a roll. | ||||
|    * | ||||
| @@ -95,37 +112,59 @@ export default class CthulhuEternalRoll extends Roll { | ||||
|    */ | ||||
|   static async prompt(options = {}) { | ||||
|     let formula = "1d100" | ||||
|     let hasModifier = true | ||||
|     let hasMultiplier = false  | ||||
|  | ||||
|     switch (options.rollType) { | ||||
|       case "skill": | ||||
|         console.log(options.rollItem) | ||||
|         options.initialScore = options.rollItem.system.computeScore() | ||||
|         break | ||||
|       case "san": | ||||
|       case "char": | ||||
|         options.initialScore = options.rollItem.targetScore | ||||
|         break | ||||
|       case "damage":  | ||||
|         let formula = options.rollItem.system.damage  | ||||
|       case "resource": | ||||
|         hasModifier = false | ||||
|         hasMultiplier = true | ||||
|         options.initialScore = options.rollItem.targetScore | ||||
|         options.totalRating = options.rollItem.targetScore | ||||
|         options.percentScore = options.rollItem.targetScore * 5 | ||||
|         options.rollItem.enableHand = true | ||||
|         options.rollItem.enableStowed = true | ||||
|         options.rollItem.enableStorage = true | ||||
|         break | ||||
|       case "damage": | ||||
|         let formula = options.rollItem.system.damage | ||||
|         let damageRoll = new Roll(formula) | ||||
|         await damageRoll.evaluate() | ||||
|         await damageRoll.toMessage({ | ||||
|           flavor: `${options.rollItem.name} - Damage Roll` | ||||
|         }); | ||||
|         let isLethal = false | ||||
|         if (options.rollItem.system.lethality > 0 ) { | ||||
|         if (options.rollItem.system.lethality > 0) { | ||||
|           let lethalityRoll = new Roll("1d100") | ||||
|           await lethalityRoll.evaluate() | ||||
|           isLethal = (lethalityRoll.total <= options.rollItem.system.lethality)  | ||||
|           isLethal = (lethalityRoll.total <= options.rollItem.system.lethality) | ||||
|           await lethalityRoll.toMessage({ | ||||
|             flavor: `${options.rollItem.name} - Lethality Roll : ${lethalityRoll.total} <= ${options.rollItem.system.lethality} => ${isLethal}` | ||||
|           }); | ||||
|           } | ||||
|         } | ||||
|         return | ||||
|       case "weapon":   | ||||
|       case "weapon": | ||||
|         let era = game.settings.get("fvtt-cthulhu-eternal", "settings-era") | ||||
|         let skillName = game.i18n.localize(SYSTEM.WEAPON_SKILL_MAPPING[era][options.rollItem.system.weaponType])   | ||||
|         if (!SYSTEM.WEAPON_SKILL_MAPPING[era] || !SYSTEM.WEAPON_SKILL_MAPPING[era][options.rollItem.system.weaponType]) { | ||||
|           ui.notifications.error(game.i18n.localize("CTHULHUETERNAL.Notifications.NoWeaponType")) | ||||
|           return | ||||
|         } | ||||
|         let skillName = game.i18n.localize(SYSTEM.WEAPON_SKILL_MAPPING[era][options.rollItem.system.weaponType]) | ||||
|         let actor = game.actors.get(options.actorId) | ||||
|         options.weapon = options.rollItem | ||||
|         options.rollItem = actor.items.find(i => i.type === "skill" && i.name.toLowerCase() === skillName.toLowerCase()) | ||||
|         if (!options.rollItem) { | ||||
|           ui.notifications.error(game.i18n.localize("CTHULHUETERNAL.Notifications.NoWeaponSkill")) | ||||
|           return | ||||
|         } | ||||
|         options.initialScore = options.rollItem.system.computeScore() | ||||
|         console.log("WEAPON", skillName, era, options.rollItem) | ||||
|         break | ||||
| @@ -141,37 +180,34 @@ export default class CthulhuEternalRoll extends Roll { | ||||
|       default: "public", | ||||
|     }) | ||||
|  | ||||
|     const choiceModifier = { | ||||
|       "-10": "-10", | ||||
|       "-20": "-20", | ||||
|       "-40": "-40", | ||||
|       "0": "0", | ||||
|       "+10": "+10", | ||||
|       "+20": "+20", | ||||
|       "+40": "+40", | ||||
|     } | ||||
|     const choiceModifier = SYSTEM.MODIFIER_CHOICES | ||||
|     const choiceMultiplier = SYSTEM.MULTIPLIER_CHOICES | ||||
|  | ||||
|     let modifier = "0" | ||||
|     let targetMalus = "0" | ||||
|     let targetName | ||||
|     let targetArmor | ||||
|     let modifier = "+0" | ||||
|     let multiplier = "5" | ||||
|  | ||||
|     let dialogContext = { | ||||
|       rollType: options.rollType, | ||||
|       rollItem: foundry.utils.duplicate(options.rollItem), // Object only, no class | ||||
|       weapon: options?.weapon,  | ||||
|       weapon: options?.weapon, | ||||
|       initialScore: options.initialScore, | ||||
|       targetScore: options.initialScore, | ||||
|       isLowWP: options.isLowWP, | ||||
|       isZeroWP: options.isZeroWP, | ||||
|       isExhausted: options.isExhausted, | ||||
|       enableHand: options.rollItem.enableHand, | ||||
|       enableStowed: options.rollItem.enableStowed, | ||||
|       enableStorage: options.rollItem.enableStorage, | ||||
|       rollModes, | ||||
|       fieldRollMode, | ||||
|       choiceModifier, | ||||
|       choiceMultiplier, | ||||
|       formula, | ||||
|       hasTarget: options.hasTarget, | ||||
|       hasModifier, | ||||
|       hasMultiplier, | ||||
|       modifier, | ||||
|       targetName, | ||||
|       targetArmor | ||||
|       multiplier | ||||
|     } | ||||
|     const content = await renderTemplate("systems/fvtt-cthulhu-eternal/templates/roll-dialog.hbs", dialogContext) | ||||
|  | ||||
| @@ -193,30 +229,49 @@ export default class CthulhuEternalRoll extends Roll { | ||||
|           }, | ||||
|         }, | ||||
|       ], | ||||
|       actions: { | ||||
|         "selectHand": (event, button, dialog) => { | ||||
|           options.rollItem.enableHand = !options.rollItem.enableHand | ||||
|           this.updateResourceDialog(options) | ||||
|         }, | ||||
|         "selectStowed": (event, button, dialog) => { | ||||
|           options.rollItem.enableStowed = !options.rollItem.enableStowed | ||||
|           this.updateResourceDialog(options) | ||||
|         }, | ||||
|         "selectStorage": (event, button, dialog) => { | ||||
|           options.rollItem.enableStorage = !options.rollItem.enableStorage | ||||
|           this.updateResourceDialog(options) | ||||
|         } | ||||
|       }, | ||||
|       rejectClose: false, // Click on Close button will not launch an error | ||||
|       render: (event, dialog) => { | ||||
|       }, | ||||
|         $(".roll-skill-multiplier").change(event => { | ||||
|           options.multiplier = Number(event.target.value) | ||||
|           this.updateResourceDialog(options)           | ||||
|         }) | ||||
|       } | ||||
|     }) | ||||
|  | ||||
|     // If the user cancels the dialog, exit | ||||
|     if (rollContext === null) return | ||||
|  | ||||
|     let rollData = foundry.utils.mergeObject(foundry.utils.duplicate(options), rollContext) | ||||
|     rollData.rollMode =  rollContext.visibility | ||||
|     rollData.targetName = targetName | ||||
|     rollData.targetArmor = targetArmor | ||||
|     rollData.targetMalus = targetMalus | ||||
|     rollData.rollMode = rollContext.visibility | ||||
|  | ||||
|     // Update target score | ||||
|     console.log(rollData) | ||||
|     rollData.targetScore =  Math.min( Math.max(options.initialScore + Number(rollData.modifier), 0), 100) | ||||
|     if ( rollData.isLowWP ) { | ||||
|       rollData.targetScore -= 20 | ||||
|     if (options.rollType === "resource" ) { | ||||
|       rollData.targetScore = options.initialScore * Number(rollContext.multiplier) | ||||
|     } else {  | ||||
|       rollData.targetScore = Math.min(Math.max(options.initialScore + Number(rollData.modifier), 0), 100) | ||||
|       if (rollData.isLowWP || rollData.isExhausted) { | ||||
|         rollData.targetScore -= 20 | ||||
|       } | ||||
|       if (rollData.isZeroWP) { | ||||
|         rollData.targetScore = 0 | ||||
|       } | ||||
|       rollData.targetScore = Math.min(Math.max(rollData.targetScore, 0), 100)   | ||||
|     } | ||||
|     if ( rollData.isZeroWP ) { | ||||
|       rollData.targetScore = 0 | ||||
|     } | ||||
|     rollData.targetScore = Math.min( Math.max(rollData.targetScore, 0), 100) | ||||
|  | ||||
|     /** | ||||
|      * A hook event that fires before the roll is made. | ||||
| @@ -227,9 +282,9 @@ export default class CthulhuEternalRoll extends Roll { | ||||
|     await roll.evaluate() | ||||
|  | ||||
|     // Compute the result quality | ||||
|     let resultType = "failure"   | ||||
|     let dec = Math.floor(roll.total/10) | ||||
|     let unit = roll.total - (dec*10) | ||||
|     let resultType = "failure" | ||||
|     let dec = Math.floor(roll.total / 10) | ||||
|     let unit = roll.total - (dec * 10) | ||||
|     if (roll.total <= rollData.targetScore) { | ||||
|       resultType = "success" | ||||
|       // Detect if decimal == unit in the dire total result  | ||||
| @@ -247,6 +302,9 @@ export default class CthulhuEternalRoll extends Roll { | ||||
|     roll.options.isSuccess = resultType === "success" || resultType === "successCritical" | ||||
|     roll.options.isFailure = resultType === "failure" || resultType === "failureCritical" | ||||
|     roll.options.isCritical = resultType === "successCritical" || resultType === "failureCritical" | ||||
|     roll.options.isLowWP = rollData.isLowWP | ||||
|     roll.options.isZeroWP = rollData.isZeroWP | ||||
|     roll.options.isExhausted = rollData.isExhausted | ||||
|  | ||||
|     /** | ||||
|      * A hook event that fires after the roll has been made. | ||||
| @@ -269,6 +327,10 @@ export default class CthulhuEternalRoll extends Roll { | ||||
|         return `${game.i18n.localize("CTHULHUETERNAL.Label.titleSkill")}` | ||||
|       case "weapon": | ||||
|         return `${game.i18n.localize("CTHULHUETERNAL.Label.titleWeapon")}` | ||||
|       case "char": | ||||
|         return `${game.i18n.localize("CTHULHUETERNAL.Label.titleCharacteristic")}` | ||||
|       case "san": | ||||
|         return `${game.i18n.localize("CTHULHUETERNAL.Label.titleSAN")}` | ||||
|       default: | ||||
|         return game.i18n.localize("CTHULHUETERNAL.Label.titleStandard") | ||||
|     } | ||||
| @@ -306,10 +368,10 @@ export default class CthulhuEternalRoll extends Roll { | ||||
|    */ | ||||
|   async _getChatCardData(isPrivate) { | ||||
|     let cardData = foundry.utils.duplicate(this.options) | ||||
|     cardData.css =  [SYSTEM.id, "dice-roll"] | ||||
|     cardData.data =  this.data | ||||
|     cardData.diceTotal =  this.dice.reduce((t, d) => t + d.total, 0) | ||||
|     cardData.isGM =  game.user.isGM | ||||
|     cardData.css = [SYSTEM.id, "dice-roll"] | ||||
|     cardData.data = this.data | ||||
|     cardData.diceTotal = this.dice.reduce((t, d) => t + d.total, 0) | ||||
|     cardData.isGM = game.user.isGM | ||||
|     cardData.formula = this.formula | ||||
|     cardData.total = this.total | ||||
|     cardData.actorId = this.actorId | ||||
| @@ -322,6 +384,10 @@ export default class CthulhuEternalRoll extends Roll { | ||||
|     cardData.realDamage = this.realDamage | ||||
|     cardData.isPrivate = isPrivate | ||||
|     cardData.weapon = this.weapon | ||||
|     cardData.isLowWP = this.isLowWP | ||||
|     cardData.isZeroWP = this.isZeroWP | ||||
|     cardData.isExhausted = this.isExhausted | ||||
|  | ||||
|  | ||||
|     console.log(cardData) | ||||
|  | ||||
| @@ -346,9 +412,6 @@ export default class CthulhuEternalRoll extends Roll { | ||||
|         actingCharName: this.actorName, | ||||
|         actingCharImg: this.actorImage, | ||||
|         hasTarget: this.hasTarget, | ||||
|         targetName: this.targetName, | ||||
|         targetArmor: this.targetArmor, | ||||
|         targetMalus: this.targetMalus, | ||||
|         realDamage: this.realDamage, | ||||
|         ...messageData, | ||||
|       }, | ||||
|   | ||||
| @@ -1,80 +0,0 @@ | ||||
| /** | ||||
|  * Enricher qui permet de transformer un texte en un lien de lancer de dés | ||||
|  * Pour une syntaxe de type @jet[x]{y}(z) avec x la caractéristique, y le titre et z l'avantage | ||||
|  * x de type rob, dex, int, per, vol pour les caractéristiques | ||||
|  * et de type oeil, verbe, san, bourse, magie pour les ressources | ||||
|  * y est le titre du jet et permet de décrire l'action | ||||
|  * z est l'avantage du jet, avec pour valeurs possibles : --, -, +, ++ | ||||
|  */ | ||||
| export function setupTextEnrichers() { | ||||
|   CONFIG.TextEditor.enrichers = CONFIG.TextEditor.enrichers.concat([ | ||||
|     { | ||||
|       // eslint-disable-next-line no-useless-escape | ||||
|       pattern: /\@jet\[(.+?)\]{(.*?)}\((.*?)\)/gm, | ||||
|       enricher: async (match, options) => { | ||||
|         const a = document.createElement("a") | ||||
|         a.classList.add("ask-roll-journal") | ||||
|         const target = match[1] | ||||
|         const title = match[2] | ||||
|         const avantage = match[3] | ||||
|  | ||||
|         let type = "resource" | ||||
|         if (["rob", "dex", "int", "per", "vol"].includes(target)) { | ||||
|           type = "save" | ||||
|         } | ||||
|  | ||||
|         let rollAvantage = "normal" | ||||
|         if (avantage) { | ||||
|           switch (avantage) { | ||||
|             case "++": | ||||
|               rollAvantage = "++" | ||||
|               break | ||||
|             case "+": | ||||
|               rollAvantage = "+" | ||||
|               break | ||||
|             case "-": | ||||
|               rollAvantage = "-" | ||||
|               break | ||||
|             case "--": | ||||
|               rollAvantage = "--" | ||||
|               break | ||||
|             default: | ||||
|               break | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         a.dataset.rollType = type | ||||
|         a.dataset.rollTarget = target | ||||
|         a.dataset.rollTitle = title | ||||
|         a.dataset.rollAvantage = rollAvantage | ||||
|         a.innerHTML = ` | ||||
|             <i class="fas fa-dice-d20"></i> ${getLibelle(target)}${rollAvantage !== "normal" ? rollAvantage : ""} | ||||
|           ` | ||||
|         return a | ||||
|       }, | ||||
|     }, | ||||
|   ]) | ||||
| } | ||||
| const mapLibelles = { | ||||
|   rob: "ROB", | ||||
|   dex: "DEX", | ||||
|   int: "INT", | ||||
|   per: "PER", | ||||
|   vol: "VOL", | ||||
|   oeil: "OEIL", | ||||
|   verbe: "VERBE", | ||||
|   san: "SANTE MENTALE", | ||||
|   bourse: "BOURSE", | ||||
|   magie: "MAGIE", | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Retourne le libellé associé à la valeur qui sera affiché dans le journal | ||||
|  * @param {string} value | ||||
|  */ | ||||
| function getLibelle(value) { | ||||
|   if (mapLibelles[value]) { | ||||
|     return mapLibelles[value] | ||||
|   } | ||||
|   return null | ||||
| } | ||||
| @@ -1,82 +0,0 @@ | ||||
| export class Macros { | ||||
|   /** | ||||
|    * Creates a macro based on the type of data dropped onto the hotbar. | ||||
|    * | ||||
|    * @param {Object} dropData The data object representing the item dropped. | ||||
|    * @param {string} dropData.type The type of the dropped item (e.g., "Actor", "JournalEntry", "roll"). | ||||
|    * @param {string} dropData.uuid The UUID of the dropped item. | ||||
|    * @param {string} [dropData.actorId] The ID of the actor (required if type is "roll"). | ||||
|    * @param {string} [dropData.rollType] The type of roll (required if type is "roll"). | ||||
|    * @param {string} [dropData.rollTarget] The target of the roll (required if type is "roll"). | ||||
|    * @param {string} [dropData.value] The value of the roll (required if type is "roll"). | ||||
|    * @param {number} slot The hotbar slot where the macro will be created. | ||||
|    * | ||||
|    * @returns {Promise<void>} A promise that resolves when the macro is created. | ||||
|    */ | ||||
|   static createCthulhuEternalMacro = async function (dropData, slot) { | ||||
|     switch (dropData.type) { | ||||
|       case "Actor": | ||||
|         const actor = await fromUuid(dropData.uuid) | ||||
|         const actorCommand = `game.actors.get("${actor.id}").sheet.render(true)` | ||||
|         this.createMacro(slot, actor.name, actorCommand, actor.img) | ||||
|         break | ||||
|  | ||||
|       case "JournalEntry": | ||||
|         const journal = await fromUuid(dropData.uuid) | ||||
|         const journalCommand = `game.journal.get("${journal.id}").sheet.render(true)` | ||||
|         this.createMacro(slot, journal.name, journalCommand, journal.img ? journal.img : "icons/svg/book.svg") | ||||
|         break | ||||
|  | ||||
|       case "roll": | ||||
|         const rollCommand = | ||||
|           dropData.rollType === "save" | ||||
|             ? `game.actors.get('${dropData.actorId}').system.roll('${dropData.rollType}', '${dropData.rollTarget}', '=');` | ||||
|             : `game.actors.get('${dropData.actorId}').system.roll('${dropData.rollType}', '${dropData.rollTarget}');` | ||||
|         const rollName = `${game.i18n.localize("TENEBRIS.Label.jet")} ${game.i18n.localize(`TENEBRIS.Manager.${dropData.rollTarget}`)}` | ||||
|         this.createMacro(slot, rollName, rollCommand, "icons/svg/d20-grey.svg") | ||||
|         break | ||||
|  | ||||
|       case "rollDamage": | ||||
|         const weapon = game.actors.get(dropData.actorId).items.get(dropData.rollTarget) | ||||
|         const rollDamageCommand = `game.actors.get('${dropData.actorId}').system.roll('${dropData.rollType}', '${dropData.rollTarget}');` | ||||
|         const rollDamageName = `${game.i18n.localize("TENEBRIS.Label.jet")} ${weapon.name}` | ||||
|         this.createMacro(slot, rollDamageName, rollDamageCommand, weapon.img) | ||||
|         break | ||||
|  | ||||
|       case "rollAttack": | ||||
|         const rollAttackCommand = `game.actors.get('${dropData.actorId}').system.roll('${dropData.rollValue}', '${dropData.rollTarget}');` | ||||
|         const rollAttackName = `${game.i18n.localize("TENEBRIS.Label.jet")} ${dropData.rollTarget}` | ||||
|         this.createMacro(slot, rollAttackName, rollAttackCommand, "icons/svg/d20-grey.svg") | ||||
|         break | ||||
|  | ||||
|       default: | ||||
|         // Handle other cases or do nothing | ||||
|         break | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Create a macro | ||||
|    * All macros are flaged with a tenebris.macro flag at true | ||||
|    * @param {*} slot | ||||
|    * @param {*} name | ||||
|    * @param {*} command | ||||
|    * @param {*} img | ||||
|    */ | ||||
|   static createMacro = async function (slot, name, command, img) { | ||||
|     let macro = game.macros.contents.find((m) => m.name === name && m.command === command) | ||||
|     if (!macro) { | ||||
|       macro = await Macro.create( | ||||
|         { | ||||
|           name: name, | ||||
|           type: "script", | ||||
|           img: img, | ||||
|           command: command, | ||||
|           flags: { "tenebris.macro": true }, | ||||
|         }, | ||||
|         { displaySheet: false }, | ||||
|       ) | ||||
|       game.user.assignHotbarMacro(macro, slot) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -9,3 +9,5 @@ export { default as CthulhuEternalBond } from "./bond.mjs" | ||||
| export { default as CthulhuEternalGear } from "./gear.mjs" | ||||
| export { default as CthulhuEternalMotivation } from "./motivation.mjs" | ||||
| export { default as CthulhuEternalArchetype } from "./archetype.mjs" | ||||
| export { default as CthulhuEternalVehicle } from "./vehicle.mjs" | ||||
|  | ||||
|   | ||||
| @@ -9,6 +9,7 @@ export default class CthulhuEternalGHear extends foundry.abstract.TypeDataModel | ||||
|     schema.description = new fields.HTMLField({ required: true, textSearch: true }) | ||||
|     schema.settings = new fields.StringField({ required: true, initial: "modern", choices: SYSTEM.AVAILABLE_SETTINGS }) | ||||
|     schema.resourceLevel = new fields.NumberField({ required: true, initial: 0, min: 0 }) | ||||
|     schema.state = new fields.StringField({ required: true, initial: "pristine", choices: SYSTEM.EQUIPMENT_STATES }) | ||||
|  | ||||
|     return schema | ||||
|   } | ||||
|   | ||||
| @@ -5,7 +5,8 @@ export default class CthulhuEternalMentalDisorder extends foundry.abstract.TypeD | ||||
|     const schema = {} | ||||
|  | ||||
|     schema.description = new fields.HTMLField({ required: true, textSearch: true }) | ||||
|  | ||||
|     schema.cured = new fields.BooleanField({ required: true, initial: false }) | ||||
|      | ||||
|     return schema | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -33,8 +33,8 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData | ||||
|     }) | ||||
|  | ||||
|     schema.hp = new fields.SchemaField({ | ||||
|       value: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), | ||||
|       max: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), | ||||
|       value: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }), | ||||
|       max: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }), | ||||
|       stunned: new fields.BooleanField({ required: true, initial: false }) | ||||
|     }) | ||||
|  | ||||
| @@ -44,16 +44,23 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData | ||||
|       recovery: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), | ||||
|       violence:  new fields.ArrayField(new fields.BooleanField(), { required: true, initial: [false, false, false], min:3, max:3}), | ||||
|       helplessness: new fields.ArrayField(new fields.BooleanField(), { required: true, initial: [false, false, false], min:3, max:3 }), | ||||
|       breakingPoint: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }) | ||||
|       breakingPoint: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), | ||||
|       insanity: new fields.StringField({ required: true, nullable: false, initial: "none", choices:SYSTEM.INSANITY }), | ||||
|     }) | ||||
|  | ||||
|     schema.damageBonus = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }) | ||||
|  | ||||
|     schema.resources = new fields.SchemaField({ | ||||
|       value: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), | ||||
|       value: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), // Unused but kept for compatibility | ||||
|       permanentRating: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), | ||||
|       hand: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), | ||||
|       currentHand: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), | ||||
|       stowed: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), | ||||
|       storage: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }) | ||||
|       currentStowed: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), | ||||
|       storage: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), | ||||
|       currentStorage: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), | ||||
|       checks: new fields.ArrayField(new fields.BooleanField(), { required: true, initial: [false, false, false], min:3, max:3 }), | ||||
|       nbValidChecks: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }) | ||||
|     }) | ||||
|  | ||||
|     schema.biodata = new fields.SchemaField({ | ||||
| @@ -66,6 +73,8 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData | ||||
|       eyes: new fields.StringField({ required: true, nullable: false, initial: "" }), | ||||
|       hair: new fields.StringField({ required: true, nullable: false, initial: "" }), | ||||
|       harshness: new fields.StringField({ required: true, nullable: false, initial: "normal", choices:SYSTEM.HARSHNESS }), | ||||
|       adaptedToViolence: new fields.BooleanField({ required: true, initial: false }), | ||||
|       adaptedToHelplessness: new fields.BooleanField({ required: true, initial: false }) | ||||
|     }) | ||||
|  | ||||
|     return schema | ||||
| @@ -90,18 +99,13 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData | ||||
|     let unnatural = this.parent.items.find(i => i.type === "skill" && i.name.toLowerCase() === game.i18n.localize("CTHULHUETERNAL.Skill.Unnatural").toLowerCase()) | ||||
|     let minus = 0 | ||||
|     if (unnatural) { | ||||
|       minus = unnatural.data.skillTotal | ||||
|       minus = unnatural.system.skillTotal | ||||
|     } | ||||
|     let maxSan = Math.max(99 - minus, 0) | ||||
|     if ( this.san.max !== maxSan) { | ||||
|       updates[`system.san.max`] = maxSan | ||||
|     } | ||||
|  | ||||
|     let bp = Math.max(this.san.value - this.characteristics.pow.value, 0) | ||||
|     if ( this.san.breakingPoint !== bp) { | ||||
|       updates[`system.san.breakingPoint`] = bp | ||||
|     } | ||||
|  | ||||
|     let recoverySan = this.characteristics.pow.value * 5 | ||||
|     if (recoverySan > this.san.max) { | ||||
|       recoverySan = this.san.max | ||||
| @@ -137,6 +141,25 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData | ||||
|       updates[`system.hp.value`] = this.hp.max | ||||
|     } | ||||
|  | ||||
|     if (this.resources.permanentRating < 0) { | ||||
|       updates[`system.resources.permanentRating`] = 0 | ||||
|     } | ||||
|      | ||||
|     let resourceIndex = Math.max(Math.min(this.resources.permanentRating, 20), 0) | ||||
|     let breakdown = SYSTEM.RESOURCE_BREAKDOWN[resourceIndex]  | ||||
|     if (this.resources.hand !== breakdown.hand) { | ||||
|       updates[`system.resources.hand`] = breakdown.hand | ||||
|     } | ||||
|     if (this.resources.stowed !== breakdown.stowed) { | ||||
|       updates[`system.resources.stowed`] = breakdown.stowed | ||||
|     } | ||||
|     if (this.resources.storage !== breakdown.storage) { | ||||
|       updates[`system.resources.storage`] = breakdown.storage + (this.resources.permanentRating - resourceIndex) | ||||
|     } | ||||
|     if (this.resources.nbValidChecks !== breakdown.checks) { | ||||
|       updates[`system.resources.nbValidChecks`] = breakdown.checks | ||||
|     } | ||||
|      | ||||
|     if (Object.keys(updates).length > 0) { | ||||
|       this.parent.update(updates) | ||||
|     } | ||||
| @@ -151,6 +174,21 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData | ||||
|     return this.wp.value === 0 | ||||
|   } | ||||
|  | ||||
|   isExhausted() {  | ||||
|     return this.wp.exhausted | ||||
|   } | ||||
|  | ||||
|   setBP() { | ||||
|     let updates = {} | ||||
|     let bp = Math.max(this.san.value - this.characteristics.pow.value, 0) | ||||
|     if ( this.san.breakingPoint !== bp) { | ||||
|       updates[`system.san.breakingPoint`] = bp | ||||
|     } | ||||
|     if (Object.keys(updates).length > 0) { | ||||
|       this.parent.update(updates) | ||||
|     } | ||||
|   } | ||||
|    | ||||
|   /** */ | ||||
|   /** | ||||
|    * Rolls a dice for a character. | ||||
| @@ -167,6 +205,7 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData | ||||
|       rollItem, | ||||
|       isLowWP: this.isLowWP(), | ||||
|       isZeroWP: this.isZeroWP(), | ||||
|       isExhausted: this.isExhausted(), | ||||
|       actorId: this.parent.id, | ||||
|       actorName: this.parent.name, | ||||
|       actorImage: this.parent.img, | ||||
|   | ||||
| @@ -20,7 +20,6 @@ export default class CthulhuEternalSkill extends foundry.abstract.TypeDataModel | ||||
|   /** @override */ | ||||
|   static LOCALIZATION_PREFIXES = ["CTHULHUETERNAL.Skill"] | ||||
|  | ||||
|    | ||||
|   prepareDerivedData() { | ||||
|     super.prepareDerivedData(); | ||||
|     this.skillTotal = this.computeScore(); | ||||
|   | ||||
							
								
								
									
										34
									
								
								module/models/vehicle.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								module/models/vehicle.mjs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| import { SYSTEM } from "../config/system.mjs" | ||||
| import CthulhuEternalRoll from "../documents/roll.mjs" | ||||
|  | ||||
| export default class CthulhuEternalVehicle extends foundry.abstract.TypeDataModel { | ||||
|   static defineSchema() { | ||||
|     const fields = foundry.data.fields | ||||
|     const requiredInteger = { required: true, nullable: false, integer: true } | ||||
|     const schema = {} | ||||
|  | ||||
|     schema.settings = new fields.StringField({ required: true, initial: "modern", choices: SYSTEM.AVAILABLE_SETTINGS }) | ||||
|  | ||||
|     schema.hp = new fields.SchemaField({ | ||||
|       value: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }), | ||||
|       max: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }) | ||||
|     }) | ||||
|  | ||||
|     schema.armor = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }) | ||||
|     schema.surfaceSpeed = new fields.StringField({ required: true, initial: "slow", choices: SYSTEM.VEHICLE_SPEED }) | ||||
|     schema.airSpeed = new fields.StringField({ required: true, initial: "none", choices: SYSTEM.VEHICLE_SPEED }) | ||||
|     schema.state = new fields.StringField({ required: true, initial: "pristine", choices: SYSTEM.EQUIPMENT_STATES }) | ||||
|      | ||||
|     schema.crew = new fields.ArrayField(new fields.StringField(), { required: false, initial: [], min:0 }) | ||||
|     schema.resourceLevel = new fields.NumberField({ required: true, initial: 0, min: 0 }) | ||||
|  | ||||
|     schema.description = new fields.HTMLField({ required: true, textSearch: true }) | ||||
|     schema.notes = new fields.HTMLField({ required: true, textSearch: true }) | ||||
|  | ||||
|     return schema | ||||
|   } | ||||
|  | ||||
|   /** @override */ | ||||
|   static LOCALIZATION_PREFIXES = ["CTHULHUETERNAL.Vehicle"] | ||||
|  | ||||
| } | ||||
| @@ -17,6 +17,7 @@ export default class LethalFantasySkill extends foundry.abstract.TypeDataModel { | ||||
|     schema.killRadius = new fields.NumberField({ required: true, initial: 0, min: 0 }) | ||||
|     schema.armorPiercing = new fields.NumberField({ required: true, initial: 0, min: 0 }) | ||||
|     schema.weaponSubtype = new fields.StringField({ required: true, initial: "basicfirearm", choices: SYSTEM.WEAPON_SUBTYPE })   | ||||
|     schema.state = new fields.StringField({ required: true, initial: "pristine", choices: SYSTEM.EQUIPMENT_STATES }) | ||||
|  | ||||
|     schema.resourceLevel = new fields.NumberField({ required: true, initial: 0, min: 0 }) | ||||
|      | ||||
|   | ||||
| @@ -9,24 +9,5 @@ | ||||
|  */ | ||||
| export function handleSocketEvent({ action = null, data = {} } = {}) { | ||||
|   console.debug("handleSocketEvent", action, data) | ||||
|   switch (action) { | ||||
|     case "fortune": | ||||
|       return CthulhuEternalFortune.handleSocketEvent(data) | ||||
|     case "askRoll": | ||||
|       return _askRoll(data) | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Handles the socket event to ask for a roll. | ||||
|  * | ||||
|  * @param {Object} [options={}] The options object. | ||||
|  * @param {string} [options.userId] The ID of the user who initiated the roll. | ||||
|  */ | ||||
| export function _askRoll({ userId } = {}) { | ||||
|   console.debug(`handleSocketEvent _askRoll from ${userId} !`) | ||||
|   const currentUser = game.user._id | ||||
|   if (userId === currentUser) { | ||||
|     foundry.audio.AudioHelper.play({ src: "/systems/fvtt-cthulhu-eternal/sounds/drums.wav", volume: 0.8, autoplay: true, loop: false }, false) | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -3,9 +3,9 @@ export default class CthulhuEternalUtils { | ||||
|  | ||||
|   static registerSettings() { | ||||
|     game.settings.register("fvtt-cthulhu-eternal", "settings-era", { | ||||
|       name: game.i18n.localize("CHTUHLUETERNAL.Settings.era"), | ||||
|       hint: game.i18n.localize("CHTUHLUETERNAL.Settings.eraHint"), | ||||
|       default: true, | ||||
|       name: game.i18n.localize("CTHULHUETERNAL.Settings.era"), | ||||
|       hint: game.i18n.localize("CTHULHUETERNAL.Settings.eraHint"), | ||||
|       default: "jazz", | ||||
|       scope: "world", | ||||
|       type: String, | ||||
|       choices: SYSTEM.AVAILABLE_SETTINGS, | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								packs-system/skills/000005.ldb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								packs-system/skills/000005.ldb
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										0
									
								
								packs-system/skills/000078.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								packs-system/skills/000078.log
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										1
									
								
								packs-system/skills/CURRENT
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								packs-system/skills/CURRENT
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| MANIFEST-000076 | ||||
							
								
								
									
										0
									
								
								packs-system/skills/LOCK
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								packs-system/skills/LOCK
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										8
									
								
								packs-system/skills/LOG
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								packs-system/skills/LOG
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| 2025/01/25-20:17:02.992814 7f697a7fc6c0 Recovering log #74 | ||||
| 2025/01/25-20:17:03.002900 7f697a7fc6c0 Delete type=3 #72 | ||||
| 2025/01/25-20:17:03.002968 7f697a7fc6c0 Delete type=0 #74 | ||||
| 2025/01/25-20:19:31.386247 7f6978bff6c0 Level-0 table #79: started | ||||
| 2025/01/25-20:19:31.386288 7f6978bff6c0 Level-0 table #79: 0 bytes OK | ||||
| 2025/01/25-20:19:31.417028 7f6978bff6c0 Delete type=0 #77 | ||||
| 2025/01/25-20:19:31.593890 7f6978bff6c0 Manual compaction at level-0 from '!folders!DD8331Hda4rhvEf9' @ 72057594037927935 : 1 .. '!items!zplzTG30QXHURusr' @ 0 : 0; will stop at (end) | ||||
| 2025/01/25-20:19:31.593942 7f6978bff6c0 Manual compaction at level-1 from '!folders!DD8331Hda4rhvEf9' @ 72057594037927935 : 1 .. '!items!zplzTG30QXHURusr' @ 0 : 0; will stop at (end) | ||||
							
								
								
									
										8
									
								
								packs-system/skills/LOG.old
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								packs-system/skills/LOG.old
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| 2025/01/25-20:09:49.585129 7f697a7fc6c0 Recovering log #70 | ||||
| 2025/01/25-20:09:49.662901 7f697a7fc6c0 Delete type=3 #68 | ||||
| 2025/01/25-20:09:49.662960 7f697a7fc6c0 Delete type=0 #70 | ||||
| 2025/01/25-20:11:19.050068 7f6978bff6c0 Level-0 table #75: started | ||||
| 2025/01/25-20:11:19.050103 7f6978bff6c0 Level-0 table #75: 0 bytes OK | ||||
| 2025/01/25-20:11:19.078755 7f6978bff6c0 Delete type=0 #73 | ||||
| 2025/01/25-20:11:19.078917 7f6978bff6c0 Manual compaction at level-0 from '!folders!DD8331Hda4rhvEf9' @ 72057594037927935 : 1 .. '!items!zplzTG30QXHURusr' @ 0 : 0; will stop at (end) | ||||
| 2025/01/25-20:11:19.078946 7f6978bff6c0 Manual compaction at level-1 from '!folders!DD8331Hda4rhvEf9' @ 72057594037927935 : 1 .. '!items!zplzTG30QXHURusr' @ 0 : 0; will stop at (end) | ||||
							
								
								
									
										
											BIN
										
									
								
								packs-system/skills/MANIFEST-000076
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								packs-system/skills/MANIFEST-000076
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -4,6 +4,7 @@ | ||||
| .fvtt-cthulhu-eternal { | ||||
|   @import "mixins.less"; | ||||
|   @import "protagonist.less"; | ||||
|   @import "vehicle.less"; | ||||
|   @import "skill.less"; | ||||
|   @import "injury.less"; | ||||
|   @import "weapon.less"; | ||||
| @@ -17,4 +18,4 @@ | ||||
|   @import "archetype.less"; | ||||
| } | ||||
|  | ||||
| @import "roll.less"; | ||||
| @import "roll.less"; | ||||
| @@ -7,13 +7,22 @@ | ||||
|   --font-secondary: "RozhaOne"; | ||||
|   --font-title: "Broadway"; | ||||
|   --logo-standard: url("../assets/logos/reanimated-ce-logo.webp"); | ||||
|   --color-success: darkgreen; | ||||
|   --color-success: rgb(18, 233, 18); | ||||
|   --color-failure: darkred; | ||||
|   --color-critical-success: lightgreen; | ||||
|   --color-critical-failure: lightcoral; | ||||
|   --color-warning: darkorange; | ||||
|   --color-critical-success: rgb(21, 39, 204); | ||||
|   --color-critical-failure: rgb(141, 32, 231); | ||||
|   --img-icon-color-filter: brightness(0) saturate(100%) invert(52%) sepia(9%) saturate(2368%) hue-rotate(360deg) brightness(86%) contrast(84%); | ||||
| } | ||||
|  | ||||
| .d100 { | ||||
|   width: 18px; | ||||
|   height: 18px; | ||||
|   color: black; | ||||
|   border-width: 0px; | ||||
|   filter: var(--img-icon-color-filter); | ||||
| } | ||||
|  | ||||
| .item .thumbnail, | ||||
| .item-img { | ||||
|   /*filter: invert(90%) sepia(10%) saturate(1215%) hue-rotate(55deg) brightness(93%) contrast(89%);*/ | ||||
|   | ||||
| @@ -21,7 +21,7 @@ | ||||
|   } | ||||
|  | ||||
|   input[name="name"] { | ||||
|     height: 50px; | ||||
|     height: 40px; | ||||
|     margin-right: 10px; | ||||
|     font-family: var(--font-secondary); | ||||
|     font-size: calc(var(--font-size-standard) * 1); | ||||
| @@ -30,8 +30,8 @@ | ||||
|   } | ||||
|  | ||||
|   fieldset { | ||||
|     margin-bottom: 5px; | ||||
|     border-radius: 5px; | ||||
|     margin-bottom: 4px; | ||||
|     border-radius: 4px; | ||||
|   } | ||||
|  | ||||
|   .form-fields { | ||||
| @@ -57,13 +57,20 @@ | ||||
| .protagonist-sheet-common { | ||||
|   label { | ||||
|     font-family: var(--font-secondary); | ||||
|     font-size: calc(var(--font-size-standard) * 1.2); | ||||
|     font-size: calc(var(--font-size-standard) * 1.0); | ||||
|   } | ||||
| } | ||||
|  | ||||
| .vehicle-sheet-common { | ||||
|   label { | ||||
|     font-family: var(--font-secondary); | ||||
|     font-size: calc(var(--font-size-standard) * 1.0); | ||||
|   } | ||||
| } | ||||
|  | ||||
| .item-sheet-common { | ||||
|   .form-fields { | ||||
|     padding-top: 5px; | ||||
|     padding-top: 4px; | ||||
|   } | ||||
|  | ||||
|   label { | ||||
|   | ||||
| @@ -67,30 +67,82 @@ | ||||
|         } | ||||
|       } | ||||
|       .san { | ||||
|         align-content: flex-start; | ||||
|         input { | ||||
|           min-width: 2.2rem; | ||||
|           max-width: 2.2rem; | ||||
|           margin-bottom: 4px; | ||||
|         } | ||||
|         select { | ||||
|           min-width: 6rem; | ||||
|           max-width: 6rem; | ||||
|         } | ||||
|         .rollable:hover, | ||||
|         .rollable:focus { | ||||
|           text-shadow: 0 0 8px var(--color-shadow-primary); | ||||
|           cursor: pointer; | ||||
|           font-size: 0.9rem; | ||||
|         }   | ||||
|         .button { | ||||
|           min-width: 4rem; | ||||
|           max-width: 4rem; | ||||
|         } | ||||
|         .san-checkbox { | ||||
|           min-width: 1rem; | ||||
|           max-width: 1rem; | ||||
|         } | ||||
|         .label-field { | ||||
|           flex-grow: 0; | ||||
|         .label-short-field { | ||||
|           font-size: 0.9rem; | ||||
|           max-width: 3rem; | ||||
|           min-width: 3rem; | ||||
|           flex-grow: 1; | ||||
|         } | ||||
|         .label-recovery { | ||||
|           margin-left: 4px; | ||||
|         } | ||||
|         .label-field { | ||||
|           font-size: 0.9rem; | ||||
|           max-width: 6rem; | ||||
|           min-width: 6rem; | ||||
|           flex-grow: 1; | ||||
|         } | ||||
|         .label-bp { | ||||
|           flex-grow: 1; | ||||
|           max-width: 3rem; | ||||
|           min-width: 3rem; | ||||
|           margin-left: 4px; | ||||
|         } | ||||
|         .label-insanity { | ||||
|           flex-grow: 1; | ||||
|           margin-left: 4px; | ||||
|           max-width: 8rem; | ||||
|           min-width: 8rem; | ||||
|         } | ||||
|         .spacing { | ||||
|           margin-left: 4px; | ||||
|         } | ||||
|         .d100 { | ||||
|           flex: 0; | ||||
|         } | ||||
|       } | ||||
|       .willpower { | ||||
|         input { | ||||
|           min-width: 2.2rem; | ||||
|           min-width: 2.4rem; | ||||
|           max-width: 2.4rem; | ||||
|         } | ||||
|         input[type="checkbox"] { | ||||
|           min-width: 1rem; | ||||
|           max-width: 1rem; | ||||
|         } | ||||
|         .label-field { | ||||
|           flex-grow: 0; | ||||
|           flex-grow: 1; | ||||
|           margin-left: 4px; | ||||
|           max-width: 5rem; | ||||
|           min-width: 5rem; | ||||
|           font-size: 0.9rem; | ||||
|         } | ||||
|         .checkbox { | ||||
|         .checkbox {        | ||||
|           flex-grow: 0; | ||||
|           min-width: 1rem; | ||||
|           max-width: 1rem; | ||||
|         } | ||||
| @@ -164,12 +216,20 @@ | ||||
|         text-shadow: 0 0 8px var(--color-shadow-primary); | ||||
|         cursor: pointer; | ||||
|       } | ||||
|       .rollable { | ||||
|         min-width: 3rem; | ||||
|         max-width: 3rem; | ||||
|       } | ||||
|       .char-text { | ||||
|         margin-left: 0.5rem; | ||||
|       } | ||||
|       .form-group { | ||||
|         flex: 1; | ||||
|         flex: 0; | ||||
|         padding-left: 5px; | ||||
|         .form-fields { | ||||
|           font-size: 1.1rem; | ||||
|           flex: none; | ||||
|           width: 70px; | ||||
|           width: 40px; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
| @@ -195,11 +255,42 @@ | ||||
|   .field-label { | ||||
|     margin-left: 8px; | ||||
|   } | ||||
|   .biodata { | ||||
|    | ||||
|   .adapted { | ||||
|     display: grid; | ||||
|     grid-template-columns: repeat(2, 1fr); | ||||
|     gap: 8px; | ||||
|     label { | ||||
|       min-width: 20rem; | ||||
|     } | ||||
|   } | ||||
|    | ||||
|   .resources { | ||||
|     display: grid; | ||||
|     grid-template-columns: repeat(3, 1fr); | ||||
|     gap: 8px; | ||||
|     label { | ||||
|       min-width: 8rem; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .features, | ||||
|   .biodata { | ||||
|     display: grid; | ||||
|     grid-template-columns: repeat(2, 1fr); | ||||
|     gap: 8px; | ||||
|     label { | ||||
|       min-width: 3.0rem; | ||||
|     } | ||||
|     .feature { | ||||
|         display: flex; | ||||
|         align-items: center; | ||||
|         gap: 4px; | ||||
|         min-width: 18rem; | ||||
|         max-width: 18rem;   | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .motivations { | ||||
|     display: grid; | ||||
|     grid-template-columns: repeat(2, 1fr); | ||||
| @@ -261,8 +352,8 @@ | ||||
|         max-width: 8rem; | ||||
|       } | ||||
|       .item-img { | ||||
|         width: 32px; | ||||
|         height: 32px; | ||||
|         width: 24px; | ||||
|         height: 24px; | ||||
|         margin: 4px 0 0 0; | ||||
|       } | ||||
|     } | ||||
| @@ -298,16 +389,16 @@ | ||||
|         max-width: 12rem; | ||||
|       } | ||||
|       .type { | ||||
|         min-width: 4rem; | ||||
|         max-width: 4rem; | ||||
|         min-width: 5rem; | ||||
|         max-width: 5rem; | ||||
|       } | ||||
|       .level { | ||||
|         min-width: 2rem; | ||||
|         max-width: 2rem; | ||||
|       } | ||||
|       .item-img { | ||||
|         width: 32px; | ||||
|         height: 32px; | ||||
|         width: 24px; | ||||
|         height: 24px; | ||||
|         margin: 4px 0 0 0; | ||||
|       } | ||||
|     } | ||||
| @@ -331,8 +422,8 @@ | ||||
|         max-width: 14rem; | ||||
|       } | ||||
|       .item-img { | ||||
|         width: 32px; | ||||
|         height: 32px; | ||||
|         width: 24px; | ||||
|         height: 24px; | ||||
|         margin: 4px 0 0 0; | ||||
|       } | ||||
|     } | ||||
| @@ -356,8 +447,8 @@ | ||||
|         max-width: 14rem; | ||||
|       } | ||||
|       .item-img { | ||||
|         width: 32px; | ||||
|         height: 32px; | ||||
|         width: 24px; | ||||
|         height: 24px; | ||||
|         margin: 4px 0 0 0; | ||||
|       } | ||||
|     } | ||||
| @@ -383,7 +474,7 @@ | ||||
|       align-items: center; | ||||
|       gap: 4px; | ||||
|       min-width: 13rem; | ||||
|       max-width: 13srem; | ||||
|       max-width: 13rem; | ||||
|       .rollable:hover, | ||||
|       .rollable:focus { | ||||
|         text-shadow: 0 0 8px var(--color-shadow-primary); | ||||
| @@ -394,16 +485,16 @@ | ||||
|         max-width: 2rem; | ||||
|       } | ||||
|       .damage { | ||||
|         min-width: 5rem; | ||||
|         max-width: 5rem; | ||||
|         min-width: 6rem; | ||||
|         max-width: 6rem; | ||||
|       } | ||||
|       .name { | ||||
|         min-width: 8rem; | ||||
|         max-width: 8rem; | ||||
|         min-width: 10rem; | ||||
|         max-width: 10rem; | ||||
|       } | ||||
|       .item-img { | ||||
|         width: 32px; | ||||
|         height: 32px; | ||||
|         width: 24px; | ||||
|         height: 24px; | ||||
|         margin: 4px 0 0 0; | ||||
|       } | ||||
|     } | ||||
| @@ -436,8 +527,8 @@ | ||||
|         max-width: 8rem; | ||||
|       } | ||||
|       .item-img { | ||||
|         width: 32px; | ||||
|         height: 32px; | ||||
|         width: 24px; | ||||
|         height: 24px; | ||||
|         margin: 4px 0 0 0; | ||||
|       } | ||||
|     } | ||||
| @@ -470,8 +561,8 @@ | ||||
|         max-width: 8rem; | ||||
|       } | ||||
|       .item-img { | ||||
|         width: 32px; | ||||
|         height: 32px; | ||||
|         width: 24px; | ||||
|         height: 24px; | ||||
|         margin: 4px 0 0 0; | ||||
|       } | ||||
|     } | ||||
|   | ||||
| @@ -36,6 +36,13 @@ | ||||
|   } | ||||
| } | ||||
|  | ||||
| .red-warning { | ||||
|   color: var(--color-failure); | ||||
| } | ||||
|  | ||||
| .orange-warning { | ||||
|   color: var(--color-warning); | ||||
| } | ||||
|  | ||||
| .dialog-damage { | ||||
|   display: flex; | ||||
|   | ||||
							
								
								
									
										223
									
								
								styles/vehicle.less
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										223
									
								
								styles/vehicle.less
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,223 @@ | ||||
| .vehicle-content { | ||||
|   .sheet-common(); | ||||
|   .vehicle-sheet-common(); | ||||
|   overflow: scroll; | ||||
| } | ||||
|  | ||||
| .sheet-tabs { | ||||
|   background-color: var(--color-light-1); | ||||
| } | ||||
|  | ||||
| .vehicle-main { | ||||
|   background-color: var(--color-light-1); | ||||
|   display: flex; | ||||
|  | ||||
|   .vehicle-pc { | ||||
|     display: flex; | ||||
|     gap: 4px; | ||||
|     flex: 1; | ||||
|  | ||||
|     .vehicle-left { | ||||
|       min-width: 180px; | ||||
|       display: flex; | ||||
|       flex-direction: column; | ||||
|  | ||||
|       .vehicle-left-image { | ||||
|         display: flex; | ||||
|         justify-content: center; | ||||
|         align-items: center; | ||||
|         padding-bottom: 8px; | ||||
|         .vehicle-img { | ||||
|           height: 140px; | ||||
|           width: auto; | ||||
|           border: none; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|     } | ||||
|  | ||||
|     .vehicle-right { | ||||
|       display: flex; | ||||
|       flex-direction: column; | ||||
|       gap: 5px; | ||||
|  | ||||
|       .vehicle-name { | ||||
|         display: flex; | ||||
|         input { | ||||
|           font-family: var(--font-title); | ||||
|           font-size: calc(var(--font-size-standard) * 1.4); | ||||
|           width: 400px; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       .vehicle-infos { | ||||
|         display: flex; | ||||
|         flex-direction: column; | ||||
|         gap: 4px; | ||||
|  | ||||
|         label { | ||||
|           min-width: 120px; | ||||
|         } | ||||
|  | ||||
|         .vehicle-hp { | ||||
|           display: flex; | ||||
|           gap: 2px; | ||||
|           align-items: center; | ||||
|           .vehicle-hp-value { | ||||
|             .form-fields input { | ||||
|               flex: none; | ||||
|               width: 50px; | ||||
|               margin-left: 4px; | ||||
|               font-size: calc(var(--font-size-standard) * 1.4); | ||||
|             } | ||||
|           }           | ||||
|           .vehicle-hp-max { | ||||
|             clear: both; | ||||
|             display: flex; | ||||
|             flex-direction: row; | ||||
|             flex-wrap: wrap; | ||||
|             margin: 3px 0; | ||||
|             align-items: center; | ||||
|             input { | ||||
|               width: 50px; | ||||
|               text-align: center; | ||||
|               font-size: calc(var(--font-size-standard) * 1.4); | ||||
|             } | ||||
|           } | ||||
|           .hp-separator { | ||||
|             font-size: calc(var(--font-size-standard) * 1.2); | ||||
|             display: flex; | ||||
|             align-items: center; | ||||
|             justify-content: center; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .vehicle-pc-play { | ||||
|     min-width: 500px; | ||||
|   } | ||||
|  | ||||
|   .vehicle-pc-edit { | ||||
|     min-width: 650px; | ||||
|   } | ||||
| } | ||||
|  | ||||
| .vehicle-biography { | ||||
|   background-color: var(--color-light-1); | ||||
|   prose-mirror.inactive { | ||||
|     min-height: 40px; | ||||
|   } | ||||
|   prose-mirror.active { | ||||
|     min-height: 150px; | ||||
|   } | ||||
|   .field-label { | ||||
|     margin-left: 8px; | ||||
|   } | ||||
|    | ||||
|    | ||||
|   .biodata { | ||||
|     display: grid; | ||||
|     grid-template-columns: repeat(2, 1fr); | ||||
|     gap: 8px; | ||||
|     label { | ||||
|       min-width: 3.0rem; | ||||
|     } | ||||
|     .feature { | ||||
|         display: flex; | ||||
|         align-items: center; | ||||
|         gap: 4px; | ||||
|         min-width: 18rem; | ||||
|         max-width: 18rem;   | ||||
|     } | ||||
|   } | ||||
|  | ||||
| } | ||||
|  | ||||
| .tab.vehicle-equipment { | ||||
|   background-color: var(--color-light-1); | ||||
|   display: grid; | ||||
|   grid-template-columns: 1fr; | ||||
|   legend { | ||||
|     a { | ||||
|       font-size: calc(var(--font-size-standard) * 1.4); | ||||
|       padding-left: 5px; | ||||
|     } | ||||
|   } | ||||
|   .weapons { | ||||
|     display: grid; | ||||
|     grid-template-columns: repeat(2, 1fr); | ||||
|     gap: 4px; | ||||
|     .weapon { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       gap: 4px; | ||||
|       min-width: 13rem; | ||||
|       max-width: 13srem; | ||||
|       .rollable:hover, | ||||
|       .rollable:focus { | ||||
|         text-shadow: 0 0 8px var(--color-shadow-primary); | ||||
|         cursor: pointer; | ||||
|       } | ||||
|       .controls { | ||||
|         min-width: 2rem; | ||||
|         max-width: 2rem; | ||||
|       } | ||||
|       .damage { | ||||
|         min-width: 5rem; | ||||
|         max-width: 5rem; | ||||
|       } | ||||
|       .name { | ||||
|         min-width: 8rem; | ||||
|         max-width: 8rem; | ||||
|       } | ||||
|       .item-img { | ||||
|         width: 32px; | ||||
|         height: 32px; | ||||
|         margin: 4px 0 0 0; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   .gears { | ||||
|     display: grid; | ||||
|     grid-template-columns: repeat(3, 1fr); | ||||
|     gap: 4px; | ||||
|     .gear { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       gap: 4px; | ||||
|       min-width: 13rem; | ||||
|       max-width: 13srem; | ||||
|       .rollable:hover, | ||||
|       .rollable:focus { | ||||
|         text-shadow: 0 0 8px var(--color-shadow-primary); | ||||
|         cursor: pointer; | ||||
|       } | ||||
|       .controls { | ||||
|         min-width: 2rem; | ||||
|         max-width: 2rem; | ||||
|       } | ||||
|       .damage { | ||||
|         min-width: 5rem; | ||||
|         max-width: 5rem; | ||||
|       } | ||||
|       .name { | ||||
|         min-width: 8rem; | ||||
|         max-width: 8rem; | ||||
|       } | ||||
|       .item-img { | ||||
|         width: 32px; | ||||
|         height: 32px; | ||||
|         margin: 4px 0 0 0; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   prose-mirror.inactive { | ||||
|     min-height: 40px; | ||||
|   } | ||||
|   prose-mirror.active { | ||||
|     min-height: 150px; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										11
									
								
								system.json
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								system.json
									
									
									
									
									
								
							| @@ -1,12 +1,12 @@ | ||||
| { | ||||
|   "id": "fvtt-cthulhu-eternal", | ||||
|   "title": "Cthulhu Eternal RPG", | ||||
|   "description": "", | ||||
|   "description": "The OGL Cthulhu Eternal RPG system for Foundry VTT", | ||||
|   "manifest": "https://www.uberwald.me/gitea/public/fvtt-cthulhu-eternal/raw/branch/main/system.json", | ||||
|   "download": "#{DOWNLOAD}#", | ||||
|   "url": "https://www.uberwald.me/gitea/public/fvtt-cthulhu-eternal", | ||||
|   "license": "LICENSE", | ||||
|   "version": "12.0.1", | ||||
|   "version": "12.0.4", | ||||
|   "authors": [ | ||||
|     { | ||||
|       "name": "Uberwald", | ||||
| @@ -34,7 +34,8 @@ | ||||
|   ], | ||||
|   "documentTypes": { | ||||
|     "Actor": { | ||||
|       "protagonist": { "htmlFields": ["description", "notes"] } | ||||
|       "protagonist": { "htmlFields": ["description", "notes"] }, | ||||
|       "vehicle": { "htmlFields": ["description", "notes"] } | ||||
|     }, | ||||
|     "Item": { | ||||
|       "skill": { "htmlFields": ["description"] }, | ||||
| @@ -55,7 +56,7 @@ | ||||
|       "banner": "", | ||||
|       "label": "Skills", | ||||
|       "system": "fvtt-cthulhu-eternal", | ||||
|       "path": "packs/skills", | ||||
|       "path": "packs-system/skills", | ||||
|       "type": "Item" | ||||
|     } | ||||
|   ], | ||||
| @@ -65,5 +66,5 @@ | ||||
|   }, | ||||
|   "primaryTokenAttribute": "hp", | ||||
|   "socket": true, | ||||
|   "background": "systems/fvtt-cthulhu-eternal/assets/background.webp" | ||||
|   "background": "systems/fvtt-cthulhu-eternal/assets/ui/background_01.webp" | ||||
| } | ||||
|   | ||||
| @@ -1,6 +0,0 @@ | ||||
| <div class="tenebris ask-roll"> | ||||
|     <h4 class="ask-roll-title">{{title}}<br>{{text}}</h4> | ||||
|     <a class="ask-roll-dice" data-type="{{rollType}}" data-value="{{value}}" data-avantage="{{avantage}}"> | ||||
|         <i class="fas fa-dice-d20" title="{{localize 'TENEBRIS.Manager.roll'}}"></i>  {{localize 'TENEBRIS.Manager.roll'}} | ||||
|     </a> | ||||
| </div> | ||||
| @@ -1,55 +1,78 @@ | ||||
| {{!log 'chat-message' this}} | ||||
| <div class="{{cssClass}}"> | ||||
|     <div class="intro-chat"> | ||||
|         <div class="intro-img"> | ||||
|           <img src="{{actingCharImg}}" data-tooltip="{{actingCharName}}" /> | ||||
|         </div> | ||||
|         <div class="intro-right"> | ||||
|             <ul> | ||||
|               {{#if (eq rollType "char")}} | ||||
|               <li><strong>{{localize "CTHULHUETERNAL.Label.charRoll"}}</strong></li> | ||||
|               {{/if}} | ||||
|                | ||||
|               {{#if (eq rollType "skill")}} | ||||
|               <li><strong>{{localize "CTHULHUETERNAL.Label.skillRoll"}}</strong></li> | ||||
|               {{/if}}         | ||||
|  | ||||
|               {{#if weapon}} | ||||
|               <li><strong>Weapon : {{weapon.name}}</strong></li> | ||||
|               {{/if}}         | ||||
|  | ||||
|               <li><strong>{{rollItem.name}} : {{initialScore}}%</strong></li> | ||||
|               <li>{{localize "CTHULHUETERNAL.Label.modifier"}} : {{modifier}}%</li> | ||||
|               <li>{{localize "CTHULHUETERNAL.Label.targetScore"}} : {{targetScore}}%</li> | ||||
|               {{#if isSuccess}} | ||||
|                 {{#if isCritical}}   | ||||
|                 <li class="result-critical-success">{{localize "CTHULHUETERNAL.Label.criticalSuccess"}}</li> | ||||
|                 {{else}} | ||||
|                 <li class="result-success">{{localize "CTHULHUETERNAL.Label.success"}}</li> | ||||
|                 {{/if}} | ||||
|               {{/if}} | ||||
|               {{#if isFailure}} | ||||
|                 {{#if isCritical}} | ||||
|                 <li class="result-critical-failure">{{localize "CTHULHUETERNAL.Label.criticalFailure"}}</li> | ||||
|                 {{else}} | ||||
|                 <li class="result-failure">{{localize "CTHULHUETERNAL.Label.failure"}}</li> | ||||
|                 {{/if}}  | ||||
|               {{/if}} | ||||
|             </ul> | ||||
|         </div> | ||||
|   <div class="intro-chat"> | ||||
|     <div class="intro-img"> | ||||
|       <img src="{{actingCharImg}}" data-tooltip="{{actingCharName}}" /> | ||||
|     </div> | ||||
|      {{#if isDamage}} | ||||
|         <div> | ||||
|             {{#if (and isGM hasTarget)}} | ||||
|                     {{{localize "CTHULHUETERNAL.Roll.displayArmor" targetName=targetName targetArmor=targetArmor realDamage=realDamage}}} | ||||
|             {{/if}} | ||||
|         </div> | ||||
|      {{/if}} | ||||
|     {{#unless isPrivate}} | ||||
|         <div class="dice-result"> | ||||
|             <h4 class="dice-total">{{total}}</h4> | ||||
|             <div class="dice-formula">{{formula}}</div> | ||||
|             {{{tooltip}}}         | ||||
|         </div> | ||||
|     {{/unless}} | ||||
| </div> | ||||
|     <div class="intro-right"> | ||||
|       <ul> | ||||
|         {{#if (eq rollType "char")}} | ||||
|         <li><strong>{{localize "CTHULHUETERNAL.Label.charRoll"}}</strong></li> | ||||
|         {{/if}} | ||||
|  | ||||
|         {{#if (eq rollType "skill")}} | ||||
|         <li><strong>{{localize "CTHULHUETERNAL.Label.skillRoll"}}</strong></li> | ||||
|         {{/if}} | ||||
|  | ||||
|         {{#if weapon}} | ||||
|         <li><strong>Weapon : {{weapon.name}}</strong></li> | ||||
|         {{/if}} | ||||
|          | ||||
|         {{#if (eq rollType "resource")}} | ||||
|         <li><strong>{{rollItem.name}} : {{initialScore}}</strong></li> | ||||
|         {{else}} | ||||
|         <li><strong>{{rollItem.name}} : {{initialScore}}%</strong></li> | ||||
|         {{/if}} | ||||
|  | ||||
|         {{#if isZeroWP}} | ||||
|         <li class="red-warning">Zero WP : Automatic failure (ie 0%)</li> | ||||
|         {{else}} | ||||
|         {{#if isLowWP}} | ||||
|         <li class="orange-warning">Low WP : -20%</li> | ||||
|         {{/if}} | ||||
|         {{/if}} | ||||
|  | ||||
|         {{#if isExhausted}} | ||||
|         <li class="orange-warning">Exhausted : -20%</li> | ||||
|         {{/if}} | ||||
|  | ||||
|         {{#if  (eq rollType "resource")}} | ||||
|         <li>{{localize "CTHULHUETERNAL.Label.multiplier"}} : {{multiplier}}</li> | ||||
|         {{else}} | ||||
|         <li>{{localize "CTHULHUETERNAL.Label.modifier"}} : {{modifier}}%</li> | ||||
|         {{/if}} | ||||
|    | ||||
|         <li>{{localize "CTHULHUETERNAL.Label.targetScore"}} : {{targetScore}}%</li> | ||||
|         {{#if isSuccess}} | ||||
|         {{#if isCritical}} | ||||
|         <li class="result-critical-success">{{localize "CTHULHUETERNAL.Label.criticalSuccess"}}</li> | ||||
|         {{else}} | ||||
|         <li class="result-success">{{localize "CTHULHUETERNAL.Label.success"}}</li> | ||||
|         {{/if}} | ||||
|         {{/if}} | ||||
|         {{#if isFailure}} | ||||
|         {{#if isCritical}} | ||||
|         <li class="result-critical-failure">{{localize "CTHULHUETERNAL.Label.criticalFailure"}}</li> | ||||
|         {{else}} | ||||
|         <li class="result-failure">{{localize "CTHULHUETERNAL.Label.failure"}}</li> | ||||
|         {{/if}} | ||||
|         {{/if}} | ||||
|       </ul> | ||||
|     </div> | ||||
|   </div> | ||||
|   {{#if isDamage}} | ||||
|   <div> | ||||
|     {{#if (and isGM hasTarget)}} | ||||
|     {{{localize "CTHULHUETERNAL.Roll.displayArmor" targetName=targetName targetArmor=targetArmor | ||||
|     realDamage=realDamage}}} | ||||
|     {{/if}} | ||||
|   </div> | ||||
|   {{/if}} | ||||
|   {{#unless isPrivate}} | ||||
|   <div class="dice-result"> | ||||
|     <h4 class="dice-total">{{total}}</h4> | ||||
|     <div class="dice-formula">{{formula}}</div> | ||||
|     {{{tooltip}}} | ||||
|   </div> | ||||
|   {{/unless}} | ||||
| </div> | ||||
| @@ -7,6 +7,7 @@ | ||||
|   <fieldset> | ||||
|     {{formField systemFields.settings value=system.settings localize=true}} | ||||
|     {{formField systemFields.resourceLevel value=system.resourceLevel}} | ||||
|     {{formField systemFields.state value=system.state localize=true}} | ||||
|   </fieldset> | ||||
|  | ||||
|   <fieldset> | ||||
|   | ||||
| @@ -4,6 +4,10 @@ | ||||
|     {{formInput fields.name value=source.name}} | ||||
|   </div>  | ||||
|    | ||||
|   <fieldset> | ||||
|     {{formField systemFields.cured value=system.cured localize=true}} | ||||
|   </fieldset> | ||||
|  | ||||
|   <fieldset> | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.description"}}</legend> | ||||
|     {{formInput | ||||
|   | ||||
| @@ -1,7 +1,29 @@ | ||||
| <section class="tab protagonist-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}"> | ||||
|    | ||||
|  | ||||
|   <fieldset> | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.resources"}}</legend> | ||||
|      <div class="resources"> | ||||
|       {{formField systemFields.resources.fields.permanentRating value=system.resources.permanentRating name="system.resources.permanentRating" localize=true}} | ||||
|       <div> | ||||
|         <span class="label-field">{{localize "CTHULHUETERNAL.Label.resourceChecks"}}</span> | ||||
|         {{#each system.resources.checks as |check idx|}} | ||||
|         <input class="san-checkbox" type="checkbox" data-action="updateCheckResource" data-index="{{@index}}" | ||||
|           data-name="checks" {{#if check}} checked {{/if}}   {{#if (gte @index @root.system.resources.nbValidChecks)}} disabled {{/if}}> | ||||
|         {{/each}} | ||||
|       </div> | ||||
|       <button class="resource-roll rollable" data-roll-type="resource"><img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" />Resource roll</button> | ||||
|       {{formField systemFields.resources.fields.hand value=system.resources.hand name="system.resources.hand" localize=true disabled=true}} | ||||
|       {{formField systemFields.resources.fields.stowed value=system.resources.stowed name="system.resources.stowed" localize=true disabled=true}} | ||||
|       {{formField systemFields.resources.fields.storage value=system.resources.storage name="system.resources.storage" localize=true disabled=true}} | ||||
|       </div> | ||||
|   </fieldset> | ||||
|  | ||||
|   <fieldset> | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.biodata"}}</legend> | ||||
|     <div class="adapted"> | ||||
|       {{formField systemFields.biodata.fields.adaptedToViolence value=system.biodata.adaptedToViolence name="system.biodata.adaptedToViolence" localize=true}}       | ||||
|       {{formField systemFields.biodata.fields.adaptedToHelplessness value=system.biodata.adaptedToHelplessness name="system.biodata.adaptedToHelplessness" localize=true}}             | ||||
|     </div> | ||||
|     <div class="biodata"> | ||||
|       {{formField systemFields.biodata.fields.harshness value=system.biodata.harshness name="system.biodata.harshness" localize=true}}       | ||||
|       {{formField systemFields.biodata.fields.age value=system.biodata.age name="system.biodata.age" localize=true classes="field-label"}} | ||||
| @@ -9,38 +31,49 @@ | ||||
|       {{formField systemFields.biodata.fields.height value=system.biodata.height name="system.biodata.height" localize=true classes="field-label"}} | ||||
|       {{formField systemFields.biodata.fields.eyes value=system.biodata.eyes name="system.biodata.eyes" localize=true classes="field-label"}} | ||||
|       {{formField systemFields.biodata.fields.hair value=system.biodata.hair name="system.biodata.hair" localize=true classes="field-label"}} | ||||
|       {{formField systemFields.biodata.fields.gender value=system.biodata.gender name="system.biodata.gender" localize=true classes="field-label"}} | ||||
|       {{formField systemFields.biodata.fields.home value=system.biodata.home name="system.biodata.home" localize=true classes="field-label"}} | ||||
|       {{formField systemFields.biodata.fields.birthplace value=system.biodata.birthplace name="system.biodata.birthplace" localize=true classes="field-label"}} | ||||
|     </div> | ||||
|   </fieldset> | ||||
|  | ||||
|   <fieldset> | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.motivations"}}{{#if isEditMode}} | ||||
|       <a class="action" data-tooltip="{{localize "CTHULHUETERNAL.Tooltip.addMotivation"}}" data-tooltip-direction="UP"><i class="fas fa-plus" data-action="createMotivation"></i></a>{{/if}}</legend> | ||||
|     <div class="motivations"> | ||||
|       {{#each motivations as |item|}} | ||||
|         {{!log 'armor' this}} | ||||
|         <div class="motivation" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"> | ||||
|           <img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" /> | ||||
|           <div class="name" data-tooltip="{{{item.system.description}}}"> | ||||
|             {{item.name}} | ||||
|           </div> | ||||
|           <div class="controls"> | ||||
|             <a data-tooltip="{{localize 'CTHULHUETERNAL.Edit'}}" data-action="edit" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a> | ||||
|             <a data-tooltip="{{localize 'CTHULHUETERNAL.Delete'}}" data-action="delete" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a> | ||||
|           </div> | ||||
|         </div> | ||||
|       {{/each}} | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.distinguishingFeatures"}}</legend> | ||||
|     <div class="features"> | ||||
|       <div class="feature">  | ||||
|         <label>{{localize "CTHULHUETERNAL.Label.strShort"}}</label> | ||||
|         {{formInput systemFields.characteristics.fields.str.fields.feature value=system.characteristics.str.feature localize=true}}  | ||||
|       </div> | ||||
|       <div class="feature">  | ||||
|         <label>{{localize "CTHULHUETERNAL.Label.dexShort"}}</label> | ||||
|         {{formInput systemFields.characteristics.fields.dex.fields.feature value=system.characteristics.dex.feature localize=true}}  | ||||
|       </div> | ||||
|       <div class="feature">  | ||||
|         <label>{{localize "CTHULHUETERNAL.Label.conShort"}}</label> | ||||
|         {{formInput systemFields.characteristics.fields.con.fields.feature value=system.characteristics.con.feature localize=true}}  | ||||
|       </div> | ||||
|       <div class="feature">  | ||||
|         <label>{{localize "CTHULHUETERNAL.Label.intShort"}}</label> | ||||
|         {{formInput systemFields.characteristics.fields.int.fields.feature value=system.characteristics.int.feature localize=true}}  | ||||
|       </div> | ||||
|       <div class="feature">  | ||||
|         <label>{{localize "CTHULHUETERNAL.Label.powShort"}}</label> | ||||
|         {{formInput systemFields.characteristics.fields.pow.fields.feature value=system.characteristics.pow.feature localize=true}}  | ||||
|       </div> | ||||
|       <div class="feature">  | ||||
|         <label>{{localize "CTHULHUETERNAL.Label.chaShort"}}</label> | ||||
|         {{formInput systemFields.characteristics.fields.cha.fields.feature value=system.characteristics.cha.feature localize=true}}  | ||||
|       </div> | ||||
|     </div> | ||||
|   </fieldset> | ||||
|   </fieldset>  | ||||
|  | ||||
|  | ||||
|   <fieldset> | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.description"}}</legend> | ||||
|     {{formInput systemFields.description enriched=description value=system.description name="system.description" toggled=true}} | ||||
|     {{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}} | ||||
|   </fieldset> | ||||
|    | ||||
|   <fieldset> | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.notes"}}</legend> | ||||
|     {{formInput systemFields.notes enriched=notes value=system.notes name="system.notes" toggled=true}} | ||||
|     {{formInput systemFields.notes enriched=enrichedNotes value=system.notes name="system.notes" toggled=true}} | ||||
|   </fieldset> | ||||
| </section> | ||||
| @@ -2,62 +2,81 @@ | ||||
|  | ||||
|   <fieldset> | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.weapons"}}{{#if isEditMode}} | ||||
|       <a class="action" data-tooltip="{{localize "CTHULHUETERNAL.Tooltip.addWeapon"}}" data-tooltip-direction="UP"><i class="fas fa-plus" data-action="createWeapon"></i></a>{{/if}}</legend> | ||||
|       <a class="action" data-tooltip="{{localize " CTHULHUETERNAL.Tooltip.addWeapon"}}" data-tooltip-direction="UP"><i | ||||
|           class="fas fa-plus" data-action="createWeapon"></i></a>{{/if}} | ||||
|     </legend> | ||||
|     <div class="weapons"> | ||||
|       {{#each weapons as |item|}} | ||||
|         {{!log 'weapon' this}} | ||||
|         <div class="weapon item" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true" > | ||||
|           <img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" /> | ||||
|           <div class="name rollable" data-roll-type="weapon" data-tooltip="{{{item.system.description}}}"> | ||||
|             {{item.name}} | ||||
|           </div> | ||||
|           <a class="damage rollable" data-item-id="{{item.id}}" data-action="roll" data-roll-type="damage" data-roll-value="{{item.system.damage}}">{{localize "CTHULHUETERNAL.Label.damageShort"}} : {{item.system.damage}}</a> | ||||
|           <div class="controls"> | ||||
|             <a data-tooltip="{{localize 'CTHULHUETERNAL.Edit'}}" data-action="edit" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a> | ||||
|             <a data-tooltip="{{localize 'CTHULHUETERNAL.Delete'}}" data-action="delete" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a> | ||||
|           </div> | ||||
|       {{!log 'weapon' this}} | ||||
|       <div class="weapon item" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true"> | ||||
|  | ||||
|         <img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" /> | ||||
|         <img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" /> | ||||
|         <div class="name rollable" data-roll-type="weapon" data-tooltip="{{{item.system.description}}}"> | ||||
|           {{item.name}} | ||||
|         </div> | ||||
|  | ||||
|         <img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" /> | ||||
|         <a class="damage rollable" data-item-id="{{item.id}}" data-action="roll" data-roll-type="damage" | ||||
|           data-roll-value="{{item.system.damage}}"> | ||||
|           {{localize "CTHULHUETERNAL.Label.damageShort"}} : | ||||
|           {{item.system.damage}}</a> | ||||
|         <div class="controls"> | ||||
|           <a data-tooltip="{{localize 'CTHULHUETERNAL.Edit'}}" data-action="edit" data-item-id="{{item.id}}" | ||||
|             data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a> | ||||
|           <a data-tooltip="{{localize 'CTHULHUETERNAL.Delete'}}" data-action="delete" data-item-id="{{item.id}}" | ||||
|             data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a> | ||||
|         </div> | ||||
|       </div> | ||||
|       {{/each}} | ||||
|     </div> | ||||
|   </fieldset> | ||||
|  | ||||
|   <fieldset> | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.armors"}}{{#if isEditMode}} | ||||
|       <a class="action" data-tooltip="{{localize "CTHULHUETERNAL.Tooltip.addArmor"}}" data-tooltip-direction="UP"><i class="fas fa-plus" data-action="createArmor"></i></a>{{/if}}</legend> | ||||
|       <a class="action" data-tooltip="{{localize " CTHULHUETERNAL.Tooltip.addArmor"}}" data-tooltip-direction="UP"><i | ||||
|           class="fas fa-plus" data-action="createArmor"></i></a>{{/if}} | ||||
|     </legend> | ||||
|     <div class="armors"> | ||||
|       {{#each armors as |item|}} | ||||
|         {{!log 'armor' this}} | ||||
|         <div class="armor" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"> | ||||
|           <img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" /> | ||||
|           <div class="name" data-tooltip="{{{item.system.description}}}"> | ||||
|             {{item.name}} | ||||
|           </div> | ||||
|           <span class="protection">{{localize "CTHULHUETERNAL.Label.armor"}} : {{item.system.protection}}</span> | ||||
|           <div class="controls"> | ||||
|             <a data-tooltip="{{localize 'CTHULHUETERNAL.Edit'}}" data-action="edit" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a> | ||||
|             <a data-tooltip="{{localize 'CTHULHUETERNAL.Delete'}}" data-action="delete" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a> | ||||
|           </div> | ||||
|       {{!log 'armor' this}} | ||||
|       <div class="armor" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"> | ||||
|         <img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" /> | ||||
|         <div class="name" data-tooltip="{{{item.system.description}}}"> | ||||
|           {{item.name}} | ||||
|         </div> | ||||
|         <span class="protection">{{localize "CTHULHUETERNAL.Label.armor"}} : {{item.system.protection}}</span> | ||||
|         <div class="controls"> | ||||
|           <a data-tooltip="{{localize 'CTHULHUETERNAL.Edit'}}" data-action="edit" data-item-id="{{item.id}}" | ||||
|             data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a> | ||||
|           <a data-tooltip="{{localize 'CTHULHUETERNAL.Delete'}}" data-action="delete" data-item-id="{{item.id}}" | ||||
|             data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a> | ||||
|         </div> | ||||
|       </div> | ||||
|       {{/each}} | ||||
|     </div> | ||||
|   </fieldset> | ||||
|  | ||||
|   <fieldset> | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.gears"}}{{#if isEditMode}} | ||||
|       <a class="action" data-tooltip="{{localize "CTHULHUETERNAL.Tooltip.addGear"}}" data-tooltip-direction="UP"><i class="fas fa-plus" data-action="createGear"></i></a>{{/if}}</legend> | ||||
|       <a class="action" data-tooltip="{{localize " CTHULHUETERNAL.Tooltip.addGear"}}" data-tooltip-direction="UP"><i | ||||
|           class="fas fa-plus" data-action="createGear"></i></a>{{/if}} | ||||
|     </legend> | ||||
|     <div class="gears"> | ||||
|       {{#each gears as |item|}} | ||||
|         {{!log 'armor' this}} | ||||
|         <div class="gear" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"> | ||||
|           <img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" /> | ||||
|           <div class="name" data-tooltip="{{{item.system.description}}}"> | ||||
|             {{item.name}} | ||||
|           </div> | ||||
|           <div class="controls"> | ||||
|             <a data-tooltip="{{localize 'CTHULHUETERNAL.Edit'}}" data-action="edit" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a> | ||||
|             <a data-tooltip="{{localize 'CTHULHUETERNAL.Delete'}}" data-action="delete" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a> | ||||
|           </div> | ||||
|       {{!log 'armor' this}} | ||||
|       <div class="gear" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"> | ||||
|         <img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" /> | ||||
|         <div class="name" data-tooltip="{{{item.system.description}}}"> | ||||
|           {{item.name}} | ||||
|         </div> | ||||
|         <div class="controls"> | ||||
|           <a data-tooltip="{{localize 'CTHULHUETERNAL.Edit'}}" data-action="edit" data-item-id="{{item.id}}" | ||||
|             data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a> | ||||
|           <a data-tooltip="{{localize 'CTHULHUETERNAL.Delete'}}" data-action="delete" data-item-id="{{item.id}}" | ||||
|             data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a> | ||||
|         </div> | ||||
|       </div> | ||||
|       {{/each}} | ||||
|     </div> | ||||
|   </fieldset> | ||||
|   | ||||
| @@ -32,41 +32,63 @@ | ||||
|         <fieldset class="san"> | ||||
|           <legend>{{localize "CTHULHUETERNAL.Label.SAN"}}</legend> | ||||
|           <div class="flexrow"> | ||||
|             <span class="label-field">{{localize "CTHULHUETERNAL.Label.current"}}</span> | ||||
|             {{formField systemFields.san.fields.value value=system.san.value}} | ||||
|              <span class="label-field">{{localize "CTHULHUETERNAL.Label.max"}}</span>  | ||||
|              {{formField systemFields.san.fields.max value=system.san.max rootId=partId disabled=true}} | ||||
|             <span class="label-field">{{localize "CTHULHUETERNAL.Label.recovery"}}</span>  | ||||
|             {{formField systemFields.san.fields.recovery value=system.san.recovery disabled=true}} | ||||
|             <span class="label-field" data-tooltip='{{localize "CTHULHUETERNAL.Tooltip.sanBP"}}'>{{localize | ||||
|               "CTHULHUETERNAL.Label.breakingPoint"}}</span>  | ||||
|               {{formField systemFields.san.fields.breakingPoint value=system.san.breakingPoint disabled=true}} | ||||
|             <img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" /> | ||||
|             <label class="label-field rollable" data-roll-type="san" >{{localize "CTHULHUETERNAL.Label.current"}}</label> | ||||
|             {{formInput systemFields.san.fields.value value=system.san.value}} | ||||
|              | ||||
|             <span class="label-field label-recovery">{{localize "CTHULHUETERNAL.Label.recovery"}}</span>  | ||||
|             {{formInput systemFields.san.fields.recovery value=system.san.recovery disabled=true}} | ||||
|  | ||||
|             <span class="label-bp" data-tooltip='{{localize "CTHULHUETERNAL.Tooltip.sanBPShort"}}'>{{localize | ||||
|               "CTHULHUETERNAL.Label.sanBPShort"}}</span>  | ||||
|             {{formInput systemFields.san.fields.breakingPoint value=system.san.breakingPoint disabled=true}} | ||||
|  | ||||
|           </div> | ||||
|  | ||||
|           <div class="flexrow"> | ||||
|              | ||||
|             <div class="flexrow"> | ||||
|              <span class="label-short-field">{{localize "CTHULHUETERNAL.Label.max"}}</span>  | ||||
|               {{formInput systemFields.san.fields.max value=system.san.max rootId=partId disabled=true}} | ||||
|             </div> | ||||
|  | ||||
|             <span class="label-insanity" > | ||||
|               {{localize "CTHULHUETERNAL.Label.tempInsanity"}} | ||||
|             </span> | ||||
|             {{formInput systemFields.san.fields.insanity value=system.san.insanity localize=true}} | ||||
|  | ||||
|             {{#if (not isPlayMode)}} | ||||
|               <button data-action="setBP" class="button" data-tooltip="{{localize "CTHULHUETERNAL.Tooltip.setBP"}}">{{localize "CTHULHUETERNAL.Label.setBP"}}</button> | ||||
|             {{/if}} | ||||
|  | ||||
|           </div> | ||||
|           <div class="flexrow"> | ||||
|             {{localize "CTHULHUETERNAL.Label.violence"}} | ||||
|  | ||||
|             <span class="label-field">{{localize "CTHULHUETERNAL.Label.violence"}}</span> | ||||
|             {{#each system.san.violence as |violence idx|}} | ||||
|             <input class="san-checkbox" type="checkbox" data-action="updateCheckboxArray" data-index="{{@index}}" | ||||
|               data-name="violence" {{#if violence}} checked {{/if}}> | ||||
|             {{/each}} | ||||
|             <span class="spacing"></span> | ||||
|             {{localize "CTHULHUETERNAL.Label.helplessness"}} | ||||
|              | ||||
|             <span class="label-field">{{localize "CTHULHUETERNAL.Label.helplessness"}}</span> | ||||
|             {{#each system.san.helplessness as |helplessness idx|}} | ||||
|             <input class="san-checkbox" type="checkbox" data-action="updateCheckboxArray" data-index="{{@index}}" | ||||
|               data-name="helplessness" {{#if helplessness}} checked {{/if}}> | ||||
|             {{/each}} | ||||
|  | ||||
|           </div> | ||||
|  | ||||
|         </fieldset> | ||||
|  | ||||
|         <fieldset class="willpower"> | ||||
|           <legend>{{localize "CTHULHUETERNAL.Label.willpower"}}</legend> | ||||
|           <div class="flexrow"> | ||||
|             <span class="label-field">{{localize "CTHULHUETERNAL.Label.current"}}</span> | ||||
|             {{formField systemFields.wp.fields.value value=system.wp.value}} | ||||
|             <span class="label-field">{{localize "CTHULHUETERNAL.Label.max"}}</span> | ||||
|             {{formField systemFields.wp.fields.max value=system.wp.max rootId=partId disabled=true}} | ||||
|             <span class="label-field">{{localize "CTHULHUETERNAL.Label.exhausted"}}</span> | ||||
|             {{formField systemFields.wp.fields.exhausted value=system.wp.exhausted classes=checkbox}} | ||||
|  | ||||
|             <label class="label-field">{{localize "CTHULHUETERNAL.Label.current"}}</label> | ||||
|             {{formInput systemFields.wp.fields.value value=system.wp.value}} | ||||
|             <label class="label-field">{{localize "CTHULHUETERNAL.Label.max"}}</label> | ||||
|             {{formInput systemFields.wp.fields.max value=system.wp.max rootId=partId disabled=true}} | ||||
|             <label class="label-field">{{localize "CTHULHUETERNAL.Label.exhausted"}}</label> | ||||
|             {{formInput systemFields.wp.fields.exhausted value=system.wp.exhausted classes="checkbox"}} | ||||
|           </div> | ||||
|         </fieldset> | ||||
|  | ||||
| @@ -76,47 +98,53 @@ | ||||
|  | ||||
|   <fieldset class="protagonist-characteristics protagonist-characteristics-{{ifThen isPlayMode 'play' 'edit'}}"> | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.characteristics"}}</legend> | ||||
|     <div class="protagonist-characteristic" data-drag="true" data-drag-type="characteristic"> | ||||
|       <label class="rollable" data-roll-type="char" data-char-id="str">{{localize | ||||
|     <div class="protagonist-characteristic" > | ||||
|       <img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" /> | ||||
|       <label class="rollable" data-roll-type="char" data-char-id="str" data-tooltip="{{system.characteristics.str.feature}}">{{localize | ||||
|         "CTHULHUETERNAL.Label.strShort"}}</label> | ||||
|       {{formField systemFields.characteristics.fields.str.fields.value value=system.characteristics.str.value | ||||
|       rootId=partId disabled=isPlayMode }} | ||||
|       {{mul system.characteristics.str.value 5}} | ||||
|       <label class="char-text">{{mul system.characteristics.str.value 5}}</label> | ||||
|     </div> | ||||
|     <div class="protagonist-characteristic" data-drag="true" data-drag-type="characteristic"> | ||||
|       <label class="rollable" data-roll-type="char" data-char-id="dex">{{localize | ||||
|     <div class="protagonist-characteristic"> | ||||
|       <img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" /> | ||||
|       <label class="rollable" data-roll-type="char" data-char-id="dex" data-tooltip="{{system.characteristics.dex.feature}}">{{localize | ||||
|         "CTHULHUETERNAL.Label.dexShort"}}</label> | ||||
|       {{formField systemFields.characteristics.fields.dex.fields.value value=system.characteristics.dex.value | ||||
|       rootId=partId disabled=isPlayMode }} | ||||
|       {{mul system.characteristics.dex.value 5}} | ||||
|       <label class="char-text">{{mul system.characteristics.dex.value 5}}</label> | ||||
|     </div> | ||||
|     <div class="protagonist-characteristic" data-drag="true" data-drag-type="characteristic"> | ||||
|       <label class="rollable" data-roll-type="char" data-char-id="con">{{localize | ||||
|     <div class="protagonist-characteristic" > | ||||
|       <img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" /> | ||||
|       <label class="rollable" data-roll-type="char" data-char-id="con" data-tooltip="{{system.characteristics.con.feature}}">{{localize | ||||
|         "CTHULHUETERNAL.Label.conShort"}}</label> | ||||
|       {{formField systemFields.characteristics.fields.con.fields.value value=system.characteristics.con.value | ||||
|       rootId=partId disabled=isPlayMode }} | ||||
|       {{mul system.characteristics.con.value 5}} | ||||
|        <label class="char-text">{{mul system.characteristics.con.value 5}}</label> | ||||
|     </div> | ||||
|     <div class="protagonist-characteristic" data-drag="true" data-drag-type="characteristic"> | ||||
|       <label class="rollable" data-roll-type="char" data-char-id="int">{{localize | ||||
|     <div class="protagonist-characteristic" > | ||||
|       <img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" /> | ||||
|       <label class="rollable" data-roll-type="char" data-char-id="int" data-tooltip="{{system.characteristics.int.feature}}">{{localize | ||||
|         "CTHULHUETERNAL.Label.intShort"}}</label> | ||||
|       {{formField systemFields.characteristics.fields.int.fields.value value=system.characteristics.int.value | ||||
|       rootId=partId disabled=isPlayMode }} | ||||
|       {{mul system.characteristics.int.value 5}} | ||||
|        <label class="char-text">{{mul system.characteristics.int.value 5}}</label> | ||||
|     </div> | ||||
|     <div class="protagonist-characteristic" data-drag="true" data-drag-type="characteristic"> | ||||
|       <label class="rollable" data-roll-type="char" data-char-id="pow">{{localize | ||||
|     <div class="protagonist-characteristic" > | ||||
|       <img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" /> | ||||
|       <label class="rollable" data-roll-type="char" data-char-id="pow" data-tooltip="{{system.characteristics.pow.feature}}">{{localize | ||||
|         "CTHULHUETERNAL.Label.powShort"}}</label> | ||||
|       {{formField systemFields.characteristics.fields.pow.fields.value value=system.characteristics.pow.value | ||||
|       rootId=partId disabled=isPlayMode }} | ||||
|       {{mul system.characteristics.pow.value 5}} | ||||
|        <label class="char-text">{{mul system.characteristics.pow.value 5}}</label> | ||||
|     </div> | ||||
|     <div class="protagonist-characteristic" data-drag="true" data-drag-type="characteristic"> | ||||
|       <label class="rollable" data-roll-type="char" data-char-id="cha">{{localize | ||||
|     <div class="protagonist-characteristic" > | ||||
|       <img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" /> | ||||
|       <label class="rollable" data-roll-type="char" data-char-id="cha" data-tooltip="{{system.characteristics.cha.feature}}">{{localize | ||||
|         "CTHULHUETERNAL.Label.chaShort"}}</label> | ||||
|       {{formField systemFields.characteristics.fields.cha.fields.value value=system.characteristics.cha.value | ||||
|       rootId=partId disabled=isPlayMode }} | ||||
|       {{mul system.characteristics.cha.value 5}} | ||||
|        <label class="char-text">{{mul system.characteristics.cha.value 5}}</label> | ||||
|     </div> | ||||
|   </fieldset> | ||||
|  | ||||
|   | ||||
| @@ -6,6 +6,7 @@ | ||||
|         {{#each skills as |item|}} | ||||
|           <div class="skill item" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"> | ||||
|             <img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" /> | ||||
|             <img src="systems/fvtt-cthulhu-eternal/assets/ui/d100.svg" class="d100" /> | ||||
|             <div class="name rollable" data-roll-type="skill" data-tooltip="{{{item.description}}}" data-tooltip-direction="UP">{{item.name}} | ||||
|             </div> | ||||
|             <div class="score" > | ||||
|   | ||||
| @@ -65,4 +65,24 @@ | ||||
|     </div> | ||||
|   </fieldset> | ||||
|  | ||||
|   <fieldset> | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.motivations"}}{{#if isEditMode}} | ||||
|       <a class="action" data-tooltip="{{localize "CTHULHUETERNAL.Tooltip.addMotivation"}}" data-tooltip-direction="UP"><i class="fas fa-plus" data-action="createMotivation"></i></a>{{/if}}</legend> | ||||
|     <div class="motivations"> | ||||
|       {{#each motivations as |item|}} | ||||
|         {{!log 'armor' this}} | ||||
|         <div class="motivation" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"> | ||||
|           <img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" /> | ||||
|           <div class="name" data-tooltip="{{{item.system.description}}}"> | ||||
|             {{item.name}} | ||||
|           </div> | ||||
|           <div class="controls"> | ||||
|             <a data-tooltip="{{localize 'CTHULHUETERNAL.Edit'}}" data-action="edit" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a> | ||||
|             <a data-tooltip="{{localize 'CTHULHUETERNAL.Delete'}}" data-action="delete" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a> | ||||
|           </div> | ||||
|         </div> | ||||
|       {{/each}} | ||||
|     </div> | ||||
|   </fieldset> | ||||
|  | ||||
| </section> | ||||
| @@ -1,34 +1,59 @@ | ||||
| {{log "roll-dialog" this}} | ||||
| <div class="fvtt-cthulhu-eternal-roll-dialog"> | ||||
|     <fieldSet> | ||||
|       {{#if (eq rollType "skill")}} | ||||
|       <legend>{{localize "CTHULHUETERNAL.Label.skill"}}</legend> | ||||
|       {{/if}} | ||||
|       {{#if (eq rollType "char")}} | ||||
|       <legend>{{localize "CTHULHUETERNAL.Label.characteristic"}}</legend> | ||||
|       {{/if}} | ||||
|   <fieldSet> | ||||
|     {{#if (eq rollType "skill")}} | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.skill"}}</legend> | ||||
|     {{/if}} | ||||
|     {{#if (eq rollType "char")}} | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.characteristic"}}</legend> | ||||
|     {{/if}} | ||||
|  | ||||
|       <div class="dialog-skill">{{rollItem.name}} : {{initialScore}}%</div> | ||||
|     {{#if (eq rollType "resource")}} | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.resourceRating"}}</legend> | ||||
|     <div class="dialog-skill">{{rollItem.name}} : <span class="resource-score">{{initialScore}} ({{mul initialScore 5}}%)</span></div>   | ||||
|     <div class="dialog-skill">{{localize "CTHULHUETERNAL.Label.Hand"}} : {{rollItem.hand}} <input type="checkbox" data-action="selectHand" {{checked rollItem.enableHand}}></div>   | ||||
|     <div class="dialog-skill">{{localize "CTHULHUETERNAL.Label.Stowed"}} : {{rollItem.stowed}} <input type="checkbox" data-action="selectStowed" {{checked rollItem.enableStowed}}></div>   | ||||
|     <div class="dialog-skill">{{localize "CTHULHUETERNAL.Label.Storage"}} : {{rollItem.storage}} <input type="checkbox" data-action="selectStorage" {{checked rollItem.enableStorage}}></div>   | ||||
|     {{else}} | ||||
|     <div class="dialog-skill">{{rollItem.name}} : {{initialScore}}%</div> | ||||
|     {{/if}} | ||||
|  | ||||
|       {{#if weapon}} | ||||
|       <div class="dialog-skill">Weapon : {{weapon.name}}</div> | ||||
|       {{/if}} | ||||
|     {{#if weapon}} | ||||
|     <div class="dialog-skill">Weapon : {{weapon.name}}</div> | ||||
|     {{/if}} | ||||
|  | ||||
|       {{#if isZeroWP}} | ||||
|       <div class="dialog-skill">Zero WP : Automatic failure (ie 0%)</div> | ||||
|       {{else}} | ||||
|         {{#if isLowWP}} | ||||
|         <div class="dialog-skill">Low WP : -20%</div> | ||||
|         {{/if}} | ||||
|       {{/if}} | ||||
|     </fieldSet> | ||||
|     {{#if isZeroWP}} | ||||
|     <div class="dialog-skill red-warning">Zero WP : Automatic failure (ie 0%)</div> | ||||
|     {{else}} | ||||
|     {{#if isLowWP}} | ||||
|     <div class="dialog-skill orange-warning">Low WP : -20%</div> | ||||
|     {{/if}} | ||||
|     {{/if}} | ||||
|  | ||||
|     {{#if isExhausted}} | ||||
|     <div class="dialog-skill orange-warning">Exhausted : -20%</div> | ||||
|     {{/if}} | ||||
|  | ||||
|   </fieldSet> | ||||
|  | ||||
|   {{#if hasModifier}} | ||||
|   <fieldSet class="dialog-modifier"> | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.modifier"}}</legend> | ||||
|     <select name="modifier" class="roll-skill-modifier"> | ||||
|       {{selectOptions choiceModifier selected=modifier}} | ||||
|     </select> | ||||
|   </fieldSet> | ||||
|   {{/if}} | ||||
|  | ||||
|   {{#if hasMultiplier}} | ||||
|   <fieldSet class="dialog-modifier"> | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.multiplier"}}</legend> | ||||
|     <select name="multiplier" class="roll-skill-modifier roll-skill-multiplier"> | ||||
|       {{selectOptions choiceMultiplier selected=multiplier}} | ||||
|     </select> | ||||
|   </fieldSet> | ||||
|   {{/if}} | ||||
|  | ||||
|     <fieldSet class="dialog-modifier"> | ||||
|       <legend>{{localize "CTHULHUETERNAL.Label.modifier"}}</legend> | ||||
|       <select name="modifier" class="roll-skill-modifier"> | ||||
|         {{selectOptions choiceModifier selected=modifier}} | ||||
|       </select> | ||||
|     </fieldSet> | ||||
|   <fieldSet> | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.rollView"}}</legend> | ||||
|     <select name="visibility"> | ||||
|   | ||||
| @@ -15,9 +15,12 @@ | ||||
|     </div> | ||||
|     {{formField systemFields.isAdversary value=system.isAdversary}} | ||||
|     {{formField systemFields.diceEvolved value=system.diceEvolved}} | ||||
|     {{#if system.diceEvolved}} | ||||
|      | ||||
|     <!-- {{#if system.diceEvolved}} | ||||
|     {{formField systemFields.rollFailed value=system.rollFailed}} | ||||
|     {{/if}} | ||||
|     --> | ||||
|  | ||||
|   </fieldset> | ||||
|  | ||||
|  | ||||
|   | ||||
							
								
								
									
										12
									
								
								templates/vehicle-description.hbs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								templates/vehicle-description.hbs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| <section class="tab vehicle-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}"> | ||||
|  | ||||
|   <fieldset> | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.description"}}</legend> | ||||
|     {{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}} | ||||
|   </fieldset> | ||||
|    | ||||
|   <fieldset> | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.notes"}}</legend> | ||||
|     {{formInput systemFields.notes enriched=enrichedNotes value=system.notes name="system.notes" toggled=true}} | ||||
|   </fieldset> | ||||
| </section> | ||||
							
								
								
									
										54
									
								
								templates/vehicle-equipment.hbs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								templates/vehicle-equipment.hbs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| <section class="tab vehicle-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}"> | ||||
|  | ||||
|   <fieldset> | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.weapons"}}{{#if isEditMode}} | ||||
|       <a class="action" data-tooltip="{{localize " CTHULHUETERNAL.Tooltip.addWeapon"}}" data-tooltip-direction="UP"><i | ||||
|           class="fas fa-plus" data-action="createWeapon"></i></a>{{/if}} | ||||
|     </legend> | ||||
|     <div class="weapons"> | ||||
|       {{#each weapons as |item|}} | ||||
|       {{!log 'weapon' this}} | ||||
|       <div class="weapon item" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true"> | ||||
|         <img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" /> | ||||
|         <div class="name rollable" data-roll-type="weapon" data-tooltip="{{{item.system.description}}}"> | ||||
|           {{item.name}} | ||||
|         </div> | ||||
|         <a class="damage rollable" data-item-id="{{item.id}}" data-action="roll" data-roll-type="damage" | ||||
|           data-roll-value="{{item.system.damage}}">{{localize "CTHULHUETERNAL.Label.damageShort"}} : | ||||
|           {{item.system.damage}}</a> | ||||
|         <div class="controls"> | ||||
|           <a data-tooltip="{{localize 'CTHULHUETERNAL.Edit'}}" data-action="edit" data-item-id="{{item.id}}" | ||||
|             data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a> | ||||
|           <a data-tooltip="{{localize 'CTHULHUETERNAL.Delete'}}" data-action="delete" data-item-id="{{item.id}}" | ||||
|             data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a> | ||||
|         </div> | ||||
|       </div> | ||||
|       {{/each}} | ||||
|     </div> | ||||
|   </fieldset> | ||||
|  | ||||
|   <fieldset> | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.gears"}}{{#if isEditMode}} | ||||
|       <a class="action" data-tooltip="{{localize " CTHULHUETERNAL.Tooltip.addGear"}}" data-tooltip-direction="UP"><i | ||||
|           class="fas fa-plus" data-action="createGear"></i></a>{{/if}} | ||||
|     </legend> | ||||
|     <div class="gears"> | ||||
|       {{#each gears as |item|}} | ||||
|       {{!log 'armor' this}} | ||||
|       <div class="gear" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"> | ||||
|         <img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" /> | ||||
|         <div class="name" data-tooltip="{{{item.system.description}}}"> | ||||
|           {{item.name}} | ||||
|         </div> | ||||
|         <div class="controls"> | ||||
|           <a data-tooltip="{{localize 'CTHULHUETERNAL.Edit'}}" data-action="edit" data-item-id="{{item.id}}" | ||||
|             data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a> | ||||
|           <a data-tooltip="{{localize 'CTHULHUETERNAL.Delete'}}" data-action="delete" data-item-id="{{item.id}}" | ||||
|             data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a> | ||||
|         </div> | ||||
|       </div> | ||||
|       {{/each}} | ||||
|     </div> | ||||
|   </fieldset> | ||||
|  | ||||
| </section> | ||||
							
								
								
									
										52
									
								
								templates/vehicle-main.hbs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								templates/vehicle-main.hbs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | ||||
| <section class="vehicle-main vehicle-main-{{ifThen isPlayMode 'play' 'edit'}}"> | ||||
|  | ||||
|   <fieldset> | ||||
|     <legend>{{localize "CTHULHUETERNAL.Label.vehicle"}}</legend> | ||||
|     <div class="vehicle-pc vehicle-pc-{{ifThen isPlayMode 'play' 'edit'}}"> | ||||
|       <div class="vehicle-left"> | ||||
|         <div class="vehicle-left-image"> | ||||
|           <img class="vehicle-img" src="{{actor.img}}" data-edit="img" data-action="editImage" | ||||
|             data-tooltip="{{actor.name}}" /> | ||||
|         </div> | ||||
|         <fieldset> | ||||
|           <legend>{{localize "CTHULHUETERNAL.Label.HP"}}</legend> | ||||
|           <div class="flexrow"> | ||||
|             {{formField systemFields.hp.fields.value value=system.hp.value}} | ||||
|             / | ||||
|             {{formField systemFields.hp.fields.max value=system.hp.max rootId=partId disabled=true}} | ||||
|           </div> | ||||
|         </fieldset> | ||||
|  | ||||
|       </div> | ||||
|        | ||||
|       <div class="vehicle-right"> | ||||
|         <div class="vehicle-name"> | ||||
|           {{formInput fields.name value=source.name rootId=partId disabled=isPlayMode}} | ||||
|           <a class="control" data-action="toggleSheet" data-tooltip="CTHULHUETERNAL.ToggleSheet" | ||||
|             data-tooltip-direction="UP"> | ||||
|             <i class="fa-solid fa-user-{{ifThen isPlayMode 'lock' 'pen'}}"></i> | ||||
|           </a> | ||||
|         </div> | ||||
|  | ||||
|  | ||||
|         <fieldset class="speed"> | ||||
|           <legend>{{localize "CTHULHUETERNAL.Label.Speed"}}</legend> | ||||
|           <div class="flexrow"> | ||||
|             {{formField systemFields.surfaceSpeed value=system.surfaceSpeed localize=true}} | ||||
|             {{formField systemFields.airSpeed value=system.airSpeed localize=true}} | ||||
|              | ||||
|           </div> | ||||
|         </fieldset> | ||||
|  | ||||
|         <fieldset class="armr "> | ||||
|           <legend>{{localize "CTHULHUETERNAL.Label.armor"}}</legend> | ||||
|           <div class="flexrow"> | ||||
|             {{formField systemFields.armor value=system.armor localize=true}} | ||||
|           </div> | ||||
|         </fieldset> | ||||
|  | ||||
|       </div> | ||||
|     </div> | ||||
|   </fieldset> | ||||
|  | ||||
| </section> | ||||
| @@ -11,6 +11,8 @@ | ||||
|     {{formField systemFields.weaponSubtype value=system.weaponSubtype localize=true}} | ||||
|     {{/if}} | ||||
|  | ||||
|     {{formField systemFields.state value=system.state localize=true}} | ||||
|  | ||||
|     {{formField systemFields.damage value=system.damage}} | ||||
|     {{formField systemFields.baseRange value=system.baseRange}} | ||||
|     {{formField systemFields.rangeUnit value=system.rangeUnit localize=true}} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user