Fix conflict
12
README.md
|
|
@ -43,3 +43,15 @@ Now you should be able to build the app using `npm start`
|
|||
## Contributing
|
||||
|
||||
Looking to contribute to the project? Look no further, check out our [contributing guide](contributing.md), and keep the [Code of Conduct](coc.md) in mind when working on things.
|
||||
|
||||
## Disclaimer:
|
||||
|
||||
**Daggerheart System**
|
||||
Daggerheart is a trademark of Darrington Press LLC. All original content, mechanics, and intellectual property related to the Daggerheart roleplaying game are © Darrington Press LLC.
|
||||
|
||||
This project is intended for personal or non-commercial use. All rights to Daggerheart’s original materials remain with their respective owners.
|
||||
|
||||
**Free Icons**
|
||||
Some Icons used in this project are provided by https://game-icons.net and are licensed under the Creative Commons Attribution 3.0 Unported (CC BY 3.0).
|
||||
|
||||
This project is an unofficial fan creation and is not affiliated with or endorsed by Darrington Press or Critical Role.
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 45 KiB |
BIN
assets/icons/dice/duality/Daggerheart Foundry_g489.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
assets/icons/dice/duality/Daggerheart Foundry_g495.png
Normal file
|
After Width: | Height: | Size: 4.4 KiB |
BIN
assets/icons/dice/duality/Daggerheart Foundry_g506.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
assets/icons/dice/duality/Daggerheart Foundry_g519.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
assets/icons/dice/duality/Daggerheart Foundry_path490.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
assets/icons/dice/duality/Daggerheart Foundry_path491.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
assets/icons/dice/duality/Daggerheart Foundry_path496.png
Normal file
|
After Width: | Height: | Size: 4.1 KiB |
BIN
assets/icons/dice/duality/Daggerheart Foundry_path501.png
Normal file
|
After Width: | Height: | Size: 4.4 KiB |
BIN
assets/icons/dice/duality/Daggerheart Foundry_path507.png
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
assets/icons/dice/duality/Daggerheart Foundry_path510.png
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
assets/icons/dice/duality/Daggerheart Foundry_path520.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
assets/icons/dice/duality/Daggerheart Foundry_path521.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
1
assets/icons/documents/actors/capybara.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 512px; width: 512px;"><g class="" transform="translate(0,0)" style=""><path d="M374 74.47c-7.1.26-10.8 6.79-4.3 15.89l24-3.41c-6.5-9.11-14.1-12.69-19.7-12.48zm-38 9.1c-3.5 0-6.6 1.01-9 2.73-7.1 5.1-7.6 16.8 7.9 28-8.9 15.9-29.8 45.8-60.2 43.2l32.1 9.8c-2.7 1.6-5.7 3.1-9.2 4.5C118.7 119.4 29.29 275.1 29.29 275.1c51.1 69.9 4.1 98.9 4.1 98.9l7.81 63h28.81l3.19-41s32.5-3 62.8-63.3c29 9.8 71 9.1 102.6 3.3l-4.1 7.1-37.4 11.1c31.2 2.8 58.5-2.3 78.7-8.5-3.4-15.1-4.5-31.5 3.5-52.8L307.2 437h25.9s-4.6-75 34.4-143.5c5-7.8 9.4-15.1 13.1-23.7l2 11.1-10.5 23.2s39-15.7 29.2-96c23 3.9 45.6 1.7 66.6-4.6 5.3-1.7 9.5-5.8 11.2-11 5-15.6 9.5-32.5 10.4-47.3l-9.7.8c-.2-15.3-21.2-13.1-14.9.8l-10.5.5-4.9-15.5s16.9-12.3 38.4-7.1c-.9-3.2-2.2-6-3.9-8.6-13.8-20.8-54.3-27.8-122.4-15.6-8-12.24-17.8-16.96-25.6-16.93zm49.9 33.83c12.4 1.4 21.9 4.3 30.2 9.6h-15.9c-1.6 4.8-7.5 8.4-14.5 8.4s-12.9-3.6-14.5-8.4h-15.5c4.2-3 15.3-9.7 30.2-9.6zm9.6 181.6c-15.2 30.3-34.5 33.8-34.5 33.8-13.4 37.7-10.4 71.8 1.8 103.9H385c-3.8-44.7-3.2-78.4 10.5-137.7zm-251.1 50.3L126.6 376l27.2 25.1 13.9 35.6h29.9l-20.1-81.8z" fill="#fff" fill-opacity="1"></path></g></svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
1
assets/icons/documents/actors/dragon-head.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 512px; width: 512px;"><g class="" transform="translate(0,0)" style=""><path d="M200.947 18.686c-6.98.087-14.64.774-22.85 1.9 27.57 20.468 51.098 45.25 67.594 70.527 1.66 0 3.312.012 4.958.047 18.066.39 35.487 2.906 53.217 7.2-15.695-28.457-29.935-50.19-47.45-63.22-13.817-10.278-30.063-16.168-52.52-16.454-.967-.013-1.95-.013-2.948 0zm-91.66 22.96c-.73-.002-1.46.006-2.195.022-14.045.31-29.36 3.92-46.86 11.13 56.18 18.807 106.985 50.468 133.907 83.585 18.377-5.13 29.44-14.72 36.454-28.817C195.84 78.18 168.118 56.19 140.65 46.96c-10.168-3.418-20.433-5.306-31.363-5.315zm-.203 52.786c-39.42 6.758-74.73 31.854-87.822 74.19v322.345h212.73C100.352 442.58 61.19 206.49 187.115 230.104c5.838-14.164 9.92-28.027 11.018-41.465l18.627 1.522c-1.684 20.592-8.828 40.49-18.033 59.943-.732 2.035-1.472 4.12-2.186 6.063 32.842 85.24 113.77 160.69 169.495 168.197.915.033 1.905-.002 2.953-.09 17.016 1.035 35.86-4.222 52.21-22.304l7.984-8.83-10.473-5.658c-6.507-3.515-14.29-7.094-18.167-10.925-1.938-1.916-2.793-3.47-3.074-5.194-.282-1.725-.13-4.227 2.23-8.578l10.673-19.656-21.484 6.222c-6.304 1.825-17.305-3.032-23.224-10.71-2.96-3.84-4.408-7.907-4.387-10.843.02-2.938.72-5.125 4.747-8.05l19.453-14.125-23.884-2.72c-9.974-1.137-16.37-6.658-19.17-12.294-2.802-5.634-2.312-10.084 1.375-13.31l12.204-10.677-15.358-5.205c-6.717-2.276-10.296-7.555-10.357-10.633-.028-1.373.238-2.666 1.843-4.476 10.93-2.39 21.258-.45 28.088 6.374 6.154 6.146 8.35 15.128 6.977 24.832 8.55-2.254 16.985-1.616 24.112 2.494 9.34 5.387 14.647 15.692 15.67 27.965 15.212-10.132 32.152-12.725 45.262-5.164 15.467 8.92 21.36 29.513 16.805 51.75 23.992-33.355 34.588-75.717 5.617-120.43-46.726-4.442-81.693-30.676-93.293-67.64-5.026-16.016-21.284-28.67-42-37.904l-.08.217c-29.74-10.823-55.575-17.35-82.604-18.733l.08.155c-2.294-.093-4.56-.16-6.762-.172-9.537 22.874-28.662 39.9-57.436 46.054l-5.906 1.262-3.576-4.864c-14.216-19.33-41.23-40.452-74.002-58.074zm156.215 65.26c27.927-.073 44.874 11.617 42.09 44.45-35.844 3.39-51.933-16.683-63.074-42.632 7.507-1.155 14.538-1.8 20.983-1.817zm48.407 66.363c3.708.07 7.14.994 10.014 2.812a35.171 35.171 0 0 0-4.16 3.543c-5.246 5.24-8.087 12.122-7.956 18.742.183 9.322 5.27 17.184 12.68 22.56-3.14 8.103-2.452 17.455 1.407 25.22 3.813 7.668 10.54 14.273 19.302 18.398-1.445 3.366-2.375 6.862-2.4 10.33-.062 8.407 3.38 16.042 8.273 22.39 6.792 8.81 16.862 15.936 28.026 17.91-.183 2.18-.204 4.333.133 6.407 1.05 6.444 4.515 11.66 8.38 15.48 3.41 3.37 7.19 5.892 10.798 7.993-6.345 4.792-12.414 7.056-18.618 7.79-6.515-7.937-9.71-19.084-9.41-31.454-11.767 6.177-24.21 7.156-34.12 1.44-14.668-8.46-19.393-29.036-13.187-50.33-11.336 2.77-22.13.92-29.187-6.132-8.875-8.865-9.535-23.626-3.094-37.95-3.676-.615-6.963-2.166-9.525-4.725-8.808-8.798-5.773-26.09 6.776-38.626 7.843-7.835 17.546-11.957 25.87-11.8z" fill="#fff" fill-opacity="1"></path></g></svg>
|
||||
|
After Width: | Height: | Size: 2.9 KiB |
1
assets/icons/documents/actors/forest.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 512px; width: 512px;"><g class="" transform="translate(0,0)" style=""><path d="M169.92 15.654c-10.512 16.697-22.392 34.058-41.688 50.473.46.447.934.89 1.405 1.336l23.55-.406-3.527 10.7a71.131 71.131 0 0 1-1.678 4.552 183.485 183.485 0 0 0 8.872 5.788l25.052 15.33-45.99-.793c-1.954 2.474-4.06 4.9-6.305 7.275 8.8 11.517 22.045 22.713 38.675 32.766l-12.404-.365-.015 5.678c8.53 6.358 17.792 12.448 27.162 18.48 18.11-11.568 31.79-24.5 39.51-37.616l-57.353.99 25.052-15.33c8.97-5.488 16.525-11.115 23.082-16.867-5.098-5.475-9-10.962-11.257-16.69l-4.04-10.246 29.742-1.823C205.14 54.41 182.44 38.31 169.92 15.654zm234.605 13.223c-6.537 12.962-13.88 29.016-23.638 44.63 10.927 18.367 24.428 35.997 46.773 52.382l20.42 14.97-52.51-1.085c6.956 12.136 19.936 26.858 34.58 40.047 19.157 17.254 40.928 32.572 53.907 39.914l11.34 6.418c.005-4.163.005-7.382.015-13.972-17.176-11.938-29.767-25.795-36.322-42.2l-4.115-10.298 43.605-2.58c-9.91-4.358-19.747-8.263-28.723-12.06-8.498-3.594-16.23-7.107-22.724-11.23-6.495-4.122-12.102-8.954-14.858-15.943l-3.93-9.962 36.077-3.178c-24.245-20.226-47.223-48.756-59.897-75.853zM84.027 34.62c-12.52 22.656-35.22 38.757-57.843 53.234l29.738 1.822-4.037 10.244c-4.78 12.125-16.815 24.123-33.182 36.873-.295 11.21-.392 17.66-.385 17.732.005.044.19 1.1.29 3.127.038.742.04 3.177.066 4.358l13.828.797-.004.55-3.906 9.778c-1.18 2.955-2.498 6.07-4.16 9.232l11.525-7.05c37.376-22.87 50.42-48.163 67.395-74.833l-.233 6.366 4.474-1.875a72.336 72.336 0 0 1-3.305-8.25l-3.528-10.7 26.582.46C107.068 69.66 94.836 51.787 84.027 34.618zM263.06 61.036c-10.808 17.168-23.04 35.04-43.314 51.86l26.582-.458-3.527 10.7c-6.657 20.188-22.772 37.89-44.874 52.91l17.916 11.573 18.273.688-4.127 10.5c-2.305 5.863-5.355 11.4-9.01 16.65l8.737-6.19c17.913-12.69 36.773-27.495 51.8-41.534 10.026-9.365 17.978-18.52 23.083-25.914l-50.537-3.715 16.5-12.773c10.37-8.027 20.973-15.94 30.924-24.178-15.49-11.246-29.53-24.024-38.423-40.12zm93.07.68c-12.76 26.805-36.227 46.04-59.107 63.506l31.39 2.306-3.194 9.726c-4.503 13.7-16.983 27.412-32.783 42.172-10.794 10.083-23.245 20.29-35.896 29.926l49.278 3.494-3.26 9.78c-11.273 33.806-46.845 56.924-75.816 75.597 13.487 8.056 27.67 15.44 39.813 22.318 68.34 18.82 147.594 6.972 200.924-16-13.19-7.554-23.844-14.547-32.748-23.006-11.805-11.216-20.072-24.96-26.377-44.183l-3.017-9.208 51.97-6.61c-11.874-8.21-25.17-18.39-37.867-29.825-20.11-18.113-38.394-38.003-43.915-58.067L372.68 123.3l27.867.577c-21.174-20.07-33.542-41.485-44.416-62.16zM108.78 121.84c-10.807 17.168-23.038 35.04-43.313 51.86l26.582-.456-3.53 10.697c-8.24 24.998-30.974 46.186-61.625 63.185l52.94 1.99-4.126 10.496c-11.05 28.11-29.76 52.974-61.038 71.585 73.885 22.566 156.574 31.568 231.582-3.572-12.908-7.055-26.9-14.653-40.33-23.56-18.07-11.983-34.525-25.736-41.71-43.713l-4.116-10.3 48.4-2.864c-11.828-7.625-23.415-15.48-33.557-23.383-16.245-12.663-29.06-24.086-34.02-36.664l-4.04-10.247 29.74-1.823c-22.62-14.476-45.318-30.576-57.84-53.23zm-40.52 67.816-49.016.844c-.168.218-.32.44-.492.656-.276 21.495-.448 33.384-.502 42.38 23.342-13.057 40.863-28.338 50.01-43.88zm105.674 12.403a189.592 189.592 0 0 0 10.845 9.124 360.036 360.036 0 0 0 11.14 8.308c5.44-5.177 10.084-10.545 13.692-16.092l-35.678-1.34zm41.658 20.428a112.599 112.599 0 0 1-5.947 6.504 619.186 619.186 0 0 0 28.38 17.815l17.645 10.427c11.34-9.42 21.135-19.423 27.215-29.972l-67.293-4.774zm279.803 10.334-68.383 8.698c4.666 11.45 10.047 19.75 17.28 26.992l-.21-9.6c17.455-.996 34.705-3.352 51.4-7.363-.065-7.174-.084-12.42-.087-18.728zm-243.96 27.852-66.394 3.928c3.903 5.187 9.085 10.326 15.097 15.314a495.837 495.837 0 0 0 19.455 3.504c10.638-7.12 21.72-14.713 31.842-22.746zm-219.744 2.64-.29 35.618c10.746-10.37 18.692-21.97 24.83-34.694l-24.54-.924zm413.947 66.534c-14.262 4.577-29.517 8.396-45.38 11.222l5.55 132.18h42.978l-3.148-143.402zm-181.83 7.002a257.23 257.23 0 0 1-8.018 4.046l-.927 114.274h52.682l-2.426-110.496c-13.946-1.552-27.788-4.123-41.313-7.824zm120.54 6.693c-15.085 1.992-30.582 3.05-46.18 2.994l-.386 139.742h52.56l-5.994-142.737zm-353.38 9.146-.924 114.04H74.31l1.975-104.398c-15.362-2.464-30.51-5.75-45.318-9.643zm174.72 6.27c-11.576 2.87-23.226 4.935-34.898 6.284l3.915 66.195h33.065l-2.084-72.48zm-113.443 5.628-2.508 132.56 72.692-2.287-7.584-128.21c-20.97 1.29-41.936.424-62.6-2.062z" fill="#fff" fill-opacity="1"></path></g></svg>
|
||||
|
After Width: | Height: | Size: 4.3 KiB |
1
assets/icons/documents/items/battered-axe.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 512px; width: 512px;"><g class="" transform="translate(0,0)" style=""><path d="M27.47 15.344c62.946 25.422 108.824 61.313 115.843 132.03v.188c52.31 30.132 92.605 72.538 104.28 119.938a109.714 109.714 0 0 1 3.126 22.03c31.737-3.283 64-20.935 87.843-46.624 26.42-28.467 42.056-65.91 36.843-103.03-15.205 1.917-30.855.922-46.5-2.314-50.282-10.398-101.7-42.974-148.562-77.875-4.79-4.21-9.93-8.084-15.406-11.656-34.787-22.69-82.864-32.686-137.47-32.686zM234.687 41.25l-15.72 23c19.23 13.107 38.792 25.095 58.126 34.72l13.437-19.25c-12.406-18.774-34.986-32.363-55.842-38.47zm239.375 21.375c-16.886 31.464-37.035 52.625-59.72 64.875a108.541 108.541 0 0 1-20.593 8.53c6.67 44.027-11.746 87.505-41.5 119.564-27.275 29.387-64.424 49.947-102.53 52.844-4.482 31.48-23.408 62.858-59.75 90.312 40.743 9.164 78.742 9.05 113.436 1.906l7.72-49.03 2.937-18.595 13.03 13.595L359 379.875c27.795-16.753 64.71-44.308 83.22-67.906L413.31 262l-11.468-19.78 22.03 6.093 47.938 13.25c13.232-23.865 21.327-60.527 21.47-98.875.13-34.855-6.22-70.88-19.22-100.063zM146.092 170.97 20.564 354.75l.812 110.625 175.53-251.5c-13.78-15.612-31.054-30.19-50.81-42.906z" fill="#fff" fill-opacity="1"></path></g></svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
1
assets/icons/documents/items/card-play.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 512px; width: 512px;"><g class="" transform="translate(0,0)" style=""><path d="M272.824 24.318c-14.929.312-25.66 3.246-32.767 8.446L142.898 84.91l-54.105 73.514C77.42 175.98 85.517 210 121.111 188.197l38.9-51.351c49.476-42.711 150.485-23.032 102.587 62.591-23.53 49.582-12.457 73.79 17.76 83.95l13.812-46.381c23.949-53.825 68.502-63.51 66.684-106.904l107.302 7.724-.865-112.045-194.467-1.463zm-54.09 103.338c-17.41-.3-34.486 6.898-46.92 17.375l-39.044 51.33c10.713 8.506 21.413 3.96 32.125-6.363 12.626 6.394 22.365-3.522 30.365-23.297 3.317-13.489 8.21-23.037 23.474-39.045zm-32.617 88.324a13.49 13.49 0 0 0-5.232 1.235L51.72 276.725c-6.784 3.13-9.763 11.202-6.633 17.992l85.27 185.08c3.131 6.783 11.204 9.779 18 6.635l129.15-59.504c6.796-3.137 9.776-11.198 6.646-18L198.871 223.86c-2.344-5.097-7.474-8.043-12.754-7.88z" fill="#fff" fill-opacity="1"></path></g></svg>
|
||||
|
After Width: | Height: | Size: 945 B |
1
assets/icons/documents/items/chest-armor.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 512px; width: 512px;"><g class="" transform="translate(0,0)" style=""><path d="M156.7 25.83 89 39.38c-.1 58.57-1.74 119.32-43.49 167.22C104.4 246.5 189 260.7 247 248.8v-99L108.3 88.22l7.4-16.44L256 134.2l140.3-62.42 7.4 16.44L265 149.8v99c58 11.9 142.6-2.3 201.5-42.2-41.8-47.9-43.4-108.65-43.5-167.22l-67.7-13.55c-12.9 13.88-20.6 28.15-32.9 40.53C308.9 79.78 289.5 89 256 89c-33.5 0-52.9-9.22-66.4-22.64-12.3-12.38-20-26.65-32.9-40.53zM53.88 232.9C75.96 281 96.07 336.6 102.7 392.8l65 22.8c4.2-52.7 28.2-104 63.7-146.1-55.1 6.3-122.7-5.8-177.52-36.6zm404.22 0c-54.8 30.8-122.4 42.9-177.5 36.6 35.5 42.1 59.5 93.4 63.7 146.1l65.2-22.9c6.6-56.8 26.6-111.8 48.6-159.8zM256 269c-40.5 43.1-67.7 97.9-70.7 152.7l61.7 21.6V336h18v107.3l61.7-21.6c-3.1-54.8-30.2-109.6-70.7-152.7zm151.7 143.4L297 451.1v18.8l110.2-44.1c.1-4.5.3-8.9.5-13.4zm-303.3.1c.3 4.5.4 8.9.5 13.4l110.1 44v-18.7l-110.6-38.7zM279 457.4l-23 8.1-23-8v19.6l23 9.2 23-9.2v-19.7z" fill="#fff" fill-opacity="1"></path></g></svg>
|
||||
|
After Width: | Height: | Size: 1 KiB |
1
assets/icons/documents/items/family-tree.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 512px; width: 512px;"><g class="" transform="translate(0,0)" style=""><path d="M25.01 49v46H103V49zM153 49v46h78V49zm128 0v46h78V49zm128 0v46h78V49zM55.01 113v64H119v46h18v-46h64v-64h-18v46H73.01v-46zM311 113v64h64v46h18v-46h64v-64h-18v46H329v-46zM89.01 241v46H167v-46zM345 241v46h78v-46zm-226 64v48h128v46h18v-46h128v-48h-18v30H137v-30zm98 112v46h78v-46z" fill="#fff" fill-opacity="1"></path></g></svg>
|
||||
|
After Width: | Height: | Size: 480 B |
1
assets/icons/documents/items/laurel-crown.svg
Normal file
|
After Width: | Height: | Size: 5.6 KiB |
1
assets/icons/documents/items/laurels.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 512px; width: 512px;"><g class="" transform="translate(0,0)" style=""><path d="M234.7 18.05c-21 .2-38.8 2.5-62 10.2-4.1 2-8.2 4.1-12.2 6.2.8 5.26 3.2 10.77 5.5 14.7-4.9 4.2-9.6 8.4-14.1 12.8-3.7-5.5-6.6-11.4-8.3-17.4-14.2 9.2-27.7 19.6-40.1 31.4 1.9 9.5 9.2 18.21 15.2 24.15-3.7 5.2-7.2 10.4-10.5 15.7-8.22-7.2-15.12-15.5-19.32-24.65C74.97 108.1 61.92 126 53.08 142.3c5.29 13 19.01 22.7 29.8 28.4-2 6.1-3.7 12.2-5.1 18.4-13.5-6.4-26.3-15.7-34.5-26.6-8.7 20.1-14.7 40.7-18.2 61.4 9.63 15.5 30.57 22.9 46 25.9.1 6.4.4 12.8.9 19.2-17.79-2.7-37.26-9.6-49.9-20.4-1.6 22.3-.5 44.5 3.4 66.2 15.25 13.7 41.14 15.3 58.6 13.7 2 6.1 4.1 12.2 6.5 18.1-18.61 4.5-43.29 1.1-59.3-6.2 6.6 23.7 16.4 46.4 29.2 67.4 19.33 8.6 44.52 3.6 61.72-2.5 3.7 5.3 7.6 10.5 11.6 15.5-17.8 9.5-39.9 11.5-57.52 10.1 12.3 16.3 26.62 31.2 42.72 44.4 4.9 1.1 10.5 1.1 16.7.3 11.7-1.7 25.2-7 37.9-14.7 16.7 13.5 34.9 24.7 54.1 33.1l7.5-17.2c-16-6.9-31.3-16.2-45.6-27.3 13.3-10.9 24.3-24 30.2-36.5 4.7-9.7 6.3-18.4 4.5-26.3-10.7-5.7-20.6-12.5-29.5-20.3-7.8 20.8-26.4 36.1-43.5 46-4-4.9-7.9-9.9-11.6-15 16.8-9.8 39.9-27.5 39.1-47.1-8.9-10.3-16.6-21.8-22.9-34.1-12 14-30.7 22.5-46.5 26.7-2.4-5.8-4.6-11.6-6.6-17.6 16.8-5.2 37.9-13 44.1-29.7-4.3-11.5-7.5-23.6-9.7-36-13.8 8.4-32 11.1-46.32 10.9-.6-6.2-1-12.4-1.2-18.7 15.52-.6 33.92-2.5 44.92-14.3-.8-12.6-.5-25.5.9-38.5-13.4 2.8-29 .3-40.42-3.2 1.3-6 2.9-12.1 4.8-18.1 12.82 3.2 27.12 6.7 38.82.8 2.7-13.6 6.7-27.3 12-40.8-9.9-1.8-20.2-6.3-27.7-10.7 3.3-5.3 6.8-10.5 10.5-15.7 8.1 4.2 16.3 8.8 25.2 8.4 5.7-11.6 12.3-22.65 19.5-32.75-5.1-2.7-10-6.4-14.4-10.6 4.4-4.3 9.1-8.5 13.9-12.7 3.8 3.54 8 6.18 12.3 8.2 15.9-18.6 35.9-36.23 49-53.8zm38.4 0c15.4 20.75 33.8 35.63 48.9 53.7 4.6-1.76 9.1-5.23 12.3-8.1 4.9 4.2 9.5 8.4 13.9 12.7-4.4 4.2-9.2 7.9-14.4 10.6 7.3 10.1 13.9 21.05 19.6 32.65 9-.1 18.4-4.4 25.2-8.4 3.7 5.2 7.2 10.4 10.4 15.7-8.8 5.9-18.2 9.6-27.6 10.7 5.3 13.5 9.3 27.2 12 40.8 12.3 5.4 27.3 2.7 38.7-.8 1.9 6 3.5 12.1 4.9 18.1-14.2 3.4-27.3 6.2-40.4 3.3 1.4 12.9 1.6 25.8.8 38.5 11.4 12.3 30.2 14.4 44.9 14.2-.2 6.3-.5 12.5-1.2 18.7-17.1-.5-32.8-2.5-46.3-10.9-2.1 12.4-5.3 24.5-9.6 36.1 8.2 17.4 27.8 25.3 44.1 29.6-2 6-4.2 11.8-6.6 17.6-18.5-5.6-34.9-13-46.6-26.7-6.3 12.4-13.9 23.8-22.9 34.1 1.5 22.4 22.4 37.8 39.2 47.1-3.7 5.1-7.6 10.1-11.6 15-19-11.8-36.6-25.8-43.5-46-9 7.8-18.8 14.6-29.6 20.3-1.8 7.9-.1 16.6 4.5 26.3 6 12.5 17 25.6 30.3 36.5-14.3 11.1-29.6 20.4-45.6 27.3l7.4 17.2c19.3-8.4 37.4-19.6 54.1-33.2 12.7 7.8 26.2 13.1 38 14.8 6.2.8 11.8.8 16.7-.3 16.1-13.2 30.4-28.1 42.7-44.4-18 1.7-37.9-2.3-56.5-9.7-.3-.1-.7-.3-1.1-.4 4.1-5 7.9-10.2 11.7-15.5 18.2 7.8 43.7 11.7 61.6 2.5 12.8-21 22.6-43.7 29.2-67.4-.4.2-.8.4-1.2.5-20.5 6.4-40.1 7.6-58.1 5.7 2.4-5.9 4.5-12 6.5-18 19.1 1.7 45.2.1 58.6-13.8 3.9-21.7 5.1-43.9 3.4-66.2-14.4 10.7-34.9 17.9-49.9 20.4.5-6.4.9-12.8 1-19.2 16.8-4.8 37.9-10 45.9-25.9-3.5-20.7-9.5-41.3-18.2-61.4-9.4 11.6-23.1 21-34.4 26.5-1.5-6.1-3.2-12.2-5.2-18.3 12-7.4 25.1-15.3 29.9-28.4-10.1-18.7-22.2-35.8-35.9-51.05-4.2 9.05-11.1 17.45-19.2 24.65-3.3-5.3-6.8-10.5-10.6-15.7 6.2-7.17 14.2-14.71 15.2-24.15-12.4-11.8-25.8-22.2-40-31.4-1.8 6-4.7 11.9-8.3 17.4-4.5-4.4-9.2-8.6-14.1-12.8 2.7-4.82 4.7-9.62 5.4-14.7-4-2.1-8.1-4.2-12.2-6.2-24.7-8.2-43.3-10.3-66.2-10.2z" fill="#fff" fill-opacity="1"></path></g></svg>
|
||||
|
After Width: | Height: | Size: 3.3 KiB |
1
assets/icons/documents/items/open-treasure-chest.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 512px; width: 512px;"><g class="" transform="translate(0,0)" style=""><path d="M410.365 101.005c8.21-22.26 16.21-31.12 20.33-34.45 3.06-2.48 5.73-3.42 7.92-2.81 4 1.13 8.49 7.45 11.88 16.89 10.89 30.34 10 84.28-.93 129.51zm-286 72.92c7.52-31 10.28-66.13 7.77-94.92l-43.6-4.86zm289.46-113-301.2-33.53c-2.5-.28-5.24 1.46-7.11 3-3.67 3-10.42 10.32-17.66 27.64l308.68 34.34c5.16-13.25 11.02-23.89 17.31-31.43zm-228.78 298.71v-70.72l10.76 1.19 42.24 5.18v70.51zm16-40.34a13 13 0 0 0 5.34 10.29l-2.34 24.42 17 1.74-4-25a9.54 9.54 0 0 0 5-9.15 13.64 13.64 0 0 0-11.06-12.59s.17.1.13.1c-5.95-.68-11.07 3.9-10.07 10.1zm53 64.45-85-9.84v-86.72l-1.05-.09a8.14 8.14 0 0 1-7.27 6.71 8 8 0 0 1 5.23 8.9 8 8 0 0 1-8 6.66c8.453 4.004 4.341 16.778-4.86 15.1a8 8 0 0 1-8 13.8 8.01 8.01 0 0 1-12.28 10.29v.09a8 8 0 0 1-3.86 8.37l9.13 5.35v14.25l-12 7.13-12-7.12v-14.26l8.15-4.82a8.21 8.21 0 0 1-5.07-5.92.418.418 0 0 1 0-.1 8 8 0 0 1-15.18-5c-6.851 7.214-18.094-2.065-12.31-10.16-8.346 4.519-16.217-6.676-9.14-13-9.17 2.661-14.453-10.083-6.09-14.69a8 8 0 0 1-3.21-15.67c-9.294-1.047-9.548-14.463-.3-15.86-.669-.164-1.264-.473-1.83-.76l-17.24-1.86.6 167.11 309.18 34.49-.6-165.83-107-13.05zm140.06-164 4.72 1.91.91.58 38.72 4.31-23.26-64.77-12.82 37c-.16.46-3.41 9.8-8.27 20.99zm-208.54-39.74 5 5.49 12.75-11.15 21.45-2.28 16.61 15.35 10.51 8.73 18.54-9.29 3.44.5c.12-.67.25-1.34.38-2 3.08-16.1 7.35-30.16 7.53-30.75l13.39-43.91 16.88 42.71 8.42 21.42 10.66-12.39 22.14-25.73 5.78 33.45 3.29 19.1 17.1-9.64 35.09-19.79-18.48-51.4-247.86-27.61c2.51 34.94-1.85 77.32-12.39 112h2.32l7-12.86h40.46zm-111.29 97.39c7.6 2.1 7.9 12.766.43 15.29 7.737.867 9.802 11.153 3 14.94 7.653-.548 11.614 8.947 5.84 14 7.313-2.115 13.168 6.216 8.7 12.38 6.288-3.518 13.657 2.417 11.56 9.31 4.53-4.723 12.506-2.304 13.65 4.14 2.057-5.713 9.48-7.141 13.51-2.6-1.285-6.404 5.23-11.566 11.17-8.85-4.564-5.77.425-14.123 7.67-12.84-6.419-4.541-3.122-14.648 4.74-14.53-7.316-3.503-5.375-14.415 2.7-15.18a8 8 0 0 1-5.38-8l-76.43-8.26c-.41.19-.746.15-1.16.2zm367.54 139.08-.59-163.86-8.67 7-55.51 46.79.58 162zm-26.23-165.2-24.11-15.27-4.18-1.69c-5.91 11.52-13.39 23-22.66 27.88-5.44 2.88-12.22 4.34-20.16 4.34-11.13 0-24.75-2.91-37.35-8-10-4-23.3-11-30.26-21.34-4.9-7.29-6.64-17.77-5.31-32.92l-21.78 10.93-19-15.8-11.42-10.53-9.16 1-20.45 17.83-11-11.7h-24.21l-17.61 32-5.7-7.2-4.42 4.85-10.76 16.35-12.29 4.91L97.611 256h-12.2l-2.776 6.005 76.9 8.21a8.15 8.15 0 0 1 2-2.9 8 8 0 0 1 10.31-.46 1.657 1.657 0 0 1-.14-.24c-4.955-8.368 6.459-16.62 12.87-9.375 6.412 7.245-3.167 17.571-10.87 11.635a8 8 0 0 1 1.12 2.89l22.62 2.44 168.54 20.57 51.49-43.38zm-28.34-57.73-36.88 20.79-7.14-41.47-28 32.51-18.13-46.11s-16.65 54.58-7 69c7.69 11.45 35.42 22.25 54.33 22.25 5 0 9.43-.76 12.67-2.48 13.8-7.31 30.15-54.49 30.15-54.49zm-317.08 270.8v-.2c0-3.77-8.21-6.83-18.33-6.83-10.12 0-18.33 3.06-18.33 6.83 0 3.21 6 5.9 14 6.63v.2c0 3.77 8.21 6.83 18.33 6.83 10.12 0 18.33-3.06 18.33-6.83-.01-3.21-5.98-5.9-14-6.63zm350 6.63c-10.13 0-18.33 3.06-18.33 6.83s8.21 6.83 18.33 6.83c10.12 0 18.33-3.06 18.33-6.83s-8.25-6.8-18.38-6.8zm40-16.28c-10.13 0-18.33 3.06-18.33 6.83s8.21 6.83 18.33 6.83c10.12 0 18.33-3.06 18.33-6.83s-8.22-6.83-18.34-6.83z" fill="#fff" fill-opacity="1"></path></g></svg>
|
||||
|
After Width: | Height: | Size: 3.2 KiB |
1
assets/icons/documents/items/round-potion.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 512px; width: 512px;"><g class="" transform="translate(0,0)" style=""><path d="m381.7 27-14.5 20.4 49.5 35.1 14.5-20.3L381.7 27zm-57.4 12.3L310.2 60l111.3 76.2 14.1-20.7-111.3-76.2zM317 92.7l-69.9 82.8c-10.3-2.1-20.9-3.2-31.8-3.2-86.8 0-157.25 70.5-157.25 157.3C58.05 416 128.5 487 215.3 487s157.3-71 157.3-157.4c0-37.8-13.4-72.5-35.6-99.6l51.4-86.9L317 92.7zm7.4 39 29.5 19.5-46.5 78c26.1 23.9 42.5 58.2 42.5 96.4 0 72-58.5 130.4-130.6 130.4-72 0-130.55-58.4-130.55-130.4 0-72.1 58.55-130.6 130.55-130.6 22.6 0 43.9 5.8 62.5 15.9l42.6-79.2zm-31.5 180.5c-47.3-.7-126.2 58.3-178.3 13.5.1 57.7 47 104.3 104.7 104.3 56.1 0 102-44 104.6-99.5-7-13.2-17.8-18.1-31-18.3zm-11.5 23.3c5.1-.1 9.7 1.5 12.7 5 6.9 7.9 3.2 22.4-8.3 32.4-11.4 10-26.3 11.7-33.2 3.8-6.9-7.9-3.2-22.4 8.2-32.4 6.5-5.6 14-8.6 20.6-8.8zm-56.5 49.1c1.2 0 2.4.1 3.7.3 9.9 1.5 17.2 8.2 16.2 15.1-1 7-9.8 11-19.8 10-9.9-2-17.2-8-16.2-15.3.9-6 7.7-10.1 16.1-10.1z" fill="#fff" fill-opacity="1"></path></g></svg>
|
||||
|
After Width: | Height: | Size: 1 KiB |
1
assets/icons/documents/items/stars-stack.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 512px; width: 512px;"><g class="" transform="translate(0,0)" style=""><path d="m256.65 38.984-49.697 100.702-111.13 16.146 80.413 78.385-18.982 110.68 99.396-52.256 99.397 52.256-18.983-110.68 80.413-78.384-111.127-16.146-49.7-100.702zM112 308.826l-26.674 54.05-59.646 8.665 43.16 42.073-10.188 59.403L112 444.97l53.348 28.046-10.188-59.403 43.16-42.072-59.646-8.665L112 308.825zm288 0-26.674 54.05-59.646 8.665 43.16 42.073-10.188 59.403L400 444.97l53.348 28.046-10.188-59.403 43.16-42.072-59.646-8.665L400 308.825z" fill="#fff" fill-opacity="1"></path></g></svg>
|
||||
|
After Width: | Height: | Size: 641 B |
1
assets/icons/documents/items/village.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 512px; width: 512px;"><g class="" transform="translate(0,0)" style=""><path d="m109.902 35.87-71.14 59.284h142.28l-71.14-59.285zm288 32-71.14 59.284h142.28l-71.14-59.285zM228.73 84.403l-108.9 90.75h217.8l-108.9-90.75zm-173.828 28.75v62h36.81l73.19-60.992v-1.008h-110zm23 14h16v18h-16v-18zm265 18v10.963l23 19.166v-16.13h16v18h-13.756l.104.087 19.098 15.914h-44.446v14h78v-39h18v39h14v-62h-110zm-194.345 48v20.08l24.095-20.08h-24.095zm28.158 0 105.1 87.582 27.087-22.574v-65.008H176.715zm74.683 14h35.735v34h-35.735v-34zm-76.714 7.74L30.37 335.153H319l-144.314-120.26zm198.046 13.51-76.857 64.047 32.043 26.704H481.63l-108.9-90.75zm-23.214 108.75.103.086 19.095 15.914h-72.248v77.467h60.435v-63.466h50v63.467h46v-93.466H349.516zm-278.614 16V476.13h126v-76.976h50v76.977h31.565V353.155H70.902zm30 30h50v50h-50v-50z" fill="#fff" fill-opacity="1"></path></g></svg>
|
||||
|
After Width: | Height: | Size: 937 B |
1
assets/icons/documents/items/wolf-head.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 512px; width: 512px;"><g class="" transform="translate(0,0)" style=""><path d="M179.3 38.94C154.7 77.7 142.7 139.7 168.4 185.9l-16.3 9.2c-6.7-11.9-11.2-24.4-13.9-37.2-34.5-6.3-69.42-7.5-104.98-2.1 34.07 10.1 52.77 23.7 76.68 46.7-26.82 9.7-60.25 30.2-92.93 70.2 35.47-8.8 64.83-11.5 89.43-6.3-36.94 22.5-64.06 56.1-88.34 114.1 35.9-17.2 64.89-18.8 102.94-18.8-23.07 32.7-35.27 77.2-36.31 112.8 24.51-26 57.61-60.2 87.21-79 3 29.9 15 58.3 35.9 85.3-.2-43.9 10.3-88.3 31.6-133.4-18.8 9-32.4 18.1-49.9 29.3 6.2-27.9 12.4-55.8 18.7-83.7-23.3 2.4-39 10-60.5 18.5 16.3-33.1 32.7-66.1 49.1-99.2l16.8 8.3-28.4 57.4c18.4-4.4 28.7-4.1 45.7-1.3-4.5 20.4-9 40.7-13.6 61 65.3-36.2 148.3-45.9 226.7-50 7.6-12.9 13.8-24.2 18.8-34.8l-6.3-24.4-24.4 30.8-7.8-27.5-22.5 29.2-7.5-26.1-23.9 31.5-7.7-28.2-23.8 31.4 1.2-41.1 22.6-42.7 7.6 28.3 23.9-31.5 7.6 28.2 23.5-30 6.5 26.9 24.5-30.8 7.8 27.5 24.6-32c2.3-10.8 4.6-22.4 7.4-35.7-55.5-3.7-106.3 4.8-154 9.8-38-20.8-80.8-26.8-121.9-18.5-13.6-29.69-27.2-59.38-40.9-89.06zM325.5 158.3c-4.5 14.2-13 18.3-24.7 20.6-16.1-4.4-28.3-15.5-34.4-30.2 20.4-3.8 42.4 3.4 59.1 9.6z" fill="#fff" fill-opacity="1"></path></g></svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
BIN
assets/logos/FoundryBorneLogoFullColor.webp
Normal file
|
After Width: | Height: | Size: 25 KiB |
74
assets/logos/FoundryBorneLogoWhite.svg
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
inkscape:version="1.4.2 (ebf0e94, 2025-05-08)"
|
||||
id="svg919"
|
||||
version="1.1"
|
||||
viewBox="0 0 49.403186 52.916665"
|
||||
height="2.0833333in"
|
||||
width="1.9450073in"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="Daggerheart Foundry.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"><defs
|
||||
id="defs913" /><sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="253"
|
||||
inkscape:window-x="2552"
|
||||
inkscape:window-height="1009"
|
||||
inkscape:window-width="1920"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-units="px"
|
||||
inkscape:cy="2275"
|
||||
inkscape:cx="6663"
|
||||
inkscape:zoom="0.5"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"><inkscape:page
|
||||
x="0"
|
||||
y="-3.53492e-13"
|
||||
width="49.403187"
|
||||
height="52.916668"
|
||||
id="page2"
|
||||
margin="0"
|
||||
bleed="0" /></sodipodi:namedview><metadata
|
||||
id="metadata916"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><g
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1"
|
||||
transform="translate(-2954.7244,-1703.0883)"><g
|
||||
id="g424"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke-width:0.89438"
|
||||
transform="matrix(1.1180958,0,0,1.1180958,1318.8281,980.92923)"
|
||||
inkscape:export-filename="FoundryBorneLogoWhite.svg"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"><path
|
||||
id="path421"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.236637px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 1478.1906,673.36665 v 11.90625 h 3.9687 v 2.64583 l -6.9137,5.29167 h 11.2323 l 2.6009,-19.84375 z m 20.6649,0 -8.2192,19.84375 h 11.0676 l -5.2917,-5.29167 v -5.29166 l 10.882,-5.29167 v -3.96875 z"
|
||||
sodipodi:nodetypes="cccccccccccccccc" /><path
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.236637px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 1476.3382,682.62693 10e-5,-7.93749 h -13.2292 c 0,5.29166 7.8572,7.93749 13.2291,7.93749 z"
|
||||
id="path422"
|
||||
sodipodi:nodetypes="cccc" /><path
|
||||
style="baseline-shift:baseline;display:inline;overflow:visible;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke-width:0.89438;stroke-linecap:round;paint-order:stroke fill markers;enable-background:accumulate;stop-color:#000000"
|
||||
d="m 1498.7465,654.87512 a 2.2596359,2.2596359 0 0 0 -2.7673,1.5978 2.2596359,2.2596359 0 0 0 0.5848,2.18266 l -1.9303,5.87013 a 14.687634,14.687634 0 0 0 -7.9198,0.90281 l 0.1581,2.49393 c 7.7419,-3.61055 7.2253,3.60111 4.5517,2.88473 l -2.9491,22.40308 8.647,-20.87638 c -2.6736,-0.71638 0.4847,-7.21978 5.3843,-0.2223 l 1.3835,-2.08094 a 14.687634,14.687634 0 0 0 -6.4071,-4.74167 l 1.2643,-6.04853 a 2.2596359,2.2596359 0 0 0 1.5978,-1.59786 2.2596359,2.2596359 0 0 0 -1.5979,-2.76746 z"
|
||||
id="path423" /><path
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.236636px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 1486.4514,672.34124 c -0.1886,-5.41976 -4.3166,-5.0954 -4.4306,-8.35242 -0.046,-1.31095 1.9731,-3.45254 4.3601,-0.92188 -0.08,-3.98491 2.6692,-6.84636 2.5802,-8.37909 -0.2241,-3.85762 -3.9755,-2.89642 -1.9133,-8.80494 -2.6497,1.20848 -3.8287,4.1196 -2.9977,8.70472 0.4685,2.5854 -2.517,4.47076 -3.2375,1.0545 -8.2862,7.78045 3.2627,11.60939 5.6388,16.69911 z"
|
||||
id="path424"
|
||||
sodipodi:nodetypes="cscscscc" /></g></g></svg>
|
||||
|
After Width: | Height: | Size: 4.1 KiB |
|
|
@ -19,6 +19,7 @@ import {
|
|||
import { placeables } from './module/canvas/_module.mjs';
|
||||
import { registerRollDiceHooks } from './module/dice/dhRoll.mjs';
|
||||
import './node_modules/@yaireo/tagify/dist/tagify.css';
|
||||
import TemplateManager from './module/documents/templateManager.mjs';
|
||||
|
||||
Hooks.once('init', () => {
|
||||
CONFIG.DH = SYSTEM;
|
||||
|
|
@ -139,6 +140,8 @@ Hooks.once('init', () => {
|
|||
CONFIG.ux.ContextMenu = applications.ux.DHContextMenu;
|
||||
CONFIG.ux.TooltipManager = documents.DhTooltipManager;
|
||||
|
||||
CONFIG.ux.TemplateManager = new TemplateManager();
|
||||
|
||||
game.socket.on(`system.${SYSTEM.id}`, socketRegistration.handleSocketEvent);
|
||||
|
||||
// Make Compendium Dialog resizable
|
||||
|
|
|
|||
41
lang/en.json
|
|
@ -318,6 +318,7 @@
|
|||
"DamageReduction": {
|
||||
"armorMarks": "Armor Marks",
|
||||
"armorWithStress": "Spend 1 stress to use an extra mark",
|
||||
"thresholdImmunities": "Threshold Immunities",
|
||||
"stress": "Stress",
|
||||
"stressReduction": "Reduce By Stress",
|
||||
"title": "Damage Reduction",
|
||||
|
|
@ -374,6 +375,9 @@
|
|||
"description": "Describe how you prepare yourself for the path ahead, then gain a Hope. If you choose to Prepare with one or more members of your party, you each gain 2 Hope."
|
||||
}
|
||||
},
|
||||
"refreshable": {
|
||||
"title": "Refreshing Resources"
|
||||
},
|
||||
"takeDowntime": "Take Downtime"
|
||||
},
|
||||
"HUD": {
|
||||
|
|
@ -893,7 +897,7 @@
|
|||
"name": "Hope",
|
||||
"abbreviation": "HO"
|
||||
},
|
||||
"armorSlot": {
|
||||
"armor": {
|
||||
"name": "Armor Slot",
|
||||
"abbreviation": "AS"
|
||||
},
|
||||
|
|
@ -902,6 +906,10 @@
|
|||
"abbreviation": "FR"
|
||||
}
|
||||
},
|
||||
"ItemResourceProgression": {
|
||||
"increasing": "Increasing",
|
||||
"decreasing": "Decreasing"
|
||||
},
|
||||
"ItemResourceType": {
|
||||
"simple": "Simple",
|
||||
"diceValue": "Dice Value"
|
||||
|
|
@ -952,6 +960,12 @@
|
|||
"name": "Dice Set"
|
||||
}
|
||||
},
|
||||
"RuleChoice": {
|
||||
"off": "Off",
|
||||
"offWithToggle": "Off With Toggle",
|
||||
"on": "On",
|
||||
"onWithToggle": "On With Toggle"
|
||||
},
|
||||
"SelectAction": {
|
||||
"selectType": "Select Action Type",
|
||||
"selectAction": "Action Selection"
|
||||
|
|
@ -1662,7 +1676,8 @@
|
|||
"major": "Major",
|
||||
"severe": "Severe",
|
||||
"majorThreshold": "Major Damage Threshold",
|
||||
"severeThreshold": "Severe Damage Threshold"
|
||||
"severeThreshold": "Severe Damage Threshold",
|
||||
"with": "{threshold} Damage Threshold"
|
||||
},
|
||||
"Dice": {
|
||||
"single": "Die",
|
||||
|
|
@ -1772,6 +1787,10 @@
|
|||
"hint": "If this value is set you can use up to that much stress to spend additional Armor Marks beyond your normal maximum."
|
||||
},
|
||||
"stress": {
|
||||
"any": {
|
||||
"label": "Stress Damage Reduction: Any",
|
||||
"hint": "The cost in stress you can pay to reduce incoming damage down one threshold"
|
||||
},
|
||||
"severe": {
|
||||
"label": "Stress Damage Reduction: Severe",
|
||||
"hint": "The cost in stress you can pay to reduce severe damage down to major."
|
||||
|
|
@ -1850,6 +1869,8 @@
|
|||
},
|
||||
"actorName": "Actor Name",
|
||||
"amount": "Amount",
|
||||
"any": "Any",
|
||||
"armor": "Armor",
|
||||
"armorScore": "Armor Score",
|
||||
"activeEffects": "Active Effects",
|
||||
"armorSlots": "Armor Slots",
|
||||
|
|
@ -1954,6 +1975,7 @@
|
|||
"dieFaces": { "label": "Die Faces" },
|
||||
"icon": { "label": "Icon" },
|
||||
"max": { "label": "Max" },
|
||||
"progression": { "label": "Progression" },
|
||||
"recovery": { "label": "Recovery" },
|
||||
"type": { "label": "Type" },
|
||||
"value": { "label": "Value" }
|
||||
|
|
@ -2059,6 +2081,10 @@
|
|||
"hint": "Automatically increase the GM's fear pool on a fear duality roll result."
|
||||
},
|
||||
"FIELDS": {
|
||||
"damageReductionRulesDefault": {
|
||||
"label": "Damage Reduction Rules Default",
|
||||
"hint": "Wether using armor and reductions has rules on by default"
|
||||
},
|
||||
"hopeFear": {
|
||||
"label": "Hope & Fear",
|
||||
"gm": { "label": "GM" },
|
||||
|
|
@ -2081,6 +2107,10 @@
|
|||
"label": "Effect Range Dependent",
|
||||
"hint": "Effects with defined range dependency will automatically turn on/off depending on range"
|
||||
}
|
||||
},
|
||||
"resourceScrollTexts": {
|
||||
"label": "Show Resource Change Scrolltexts",
|
||||
"hint": "When a character is damaged, uses armor etc, a scrolling text will briefly appear by the token to signify this."
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -2291,7 +2321,8 @@
|
|||
"domainMaxReached": "You've reached the maximum domains for the class. Increase the limit in homebrew settings if desired.",
|
||||
"insufficientResources": "You have insufficient resources",
|
||||
"multiclassAlreadyPresent": "You already have a class and multiclass",
|
||||
"subclassesAlreadyPresent": "You already have a class and multiclass subclass"
|
||||
"subclassesAlreadyPresent": "You already have a class and multiclass subclass",
|
||||
"noDiceSystem": "Your selected dice {system} does not have a {faces} dice"
|
||||
},
|
||||
"Tooltip": {
|
||||
"disableEffect": "Disable Effect",
|
||||
|
|
@ -2313,7 +2344,9 @@
|
|||
"diceIsRerolled": "The dice has been rerolled (x{times})",
|
||||
"pendingSaves": "Pending Reaction Rolls",
|
||||
"openSheetSettings": "Open Settings",
|
||||
"compendiumBrowser": "Compendium Browser"
|
||||
"compendiumBrowser": "Compendium Browser",
|
||||
"rulesOn": "Rules On",
|
||||
"rulesOff": "Rules Off"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
import { abilities } from '../../config/actorConfig.mjs';
|
||||
import { burden } from '../../config/generalConfig.mjs';
|
||||
import { createEmbeddedItemWithEffects } from '../../helpers/utils.mjs';
|
||||
|
||||
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
|
||||
|
||||
|
|
@ -550,34 +551,46 @@ export default class DhCharacterCreation extends HandlebarsApplicationMixin(Appl
|
|||
}
|
||||
};
|
||||
|
||||
await this.character.createEmbeddedDocuments('Item', [ancestry]);
|
||||
await this.character.createEmbeddedDocuments('Item', [this.setup.community]);
|
||||
await this.character.createEmbeddedDocuments('Item', [this.setup.class]);
|
||||
await this.character.createEmbeddedDocuments('Item', [this.setup.subclass]);
|
||||
await this.character.createEmbeddedDocuments('Item', Object.values(this.setup.domainCards));
|
||||
|
||||
if (this.equipment.armor.uuid)
|
||||
await this.character.createEmbeddedDocuments('Item', [
|
||||
{ ...this.equipment.armor, system: { ...this.equipment.armor.system, equipped: true } }
|
||||
]);
|
||||
if (this.equipment.primaryWeapon.uuid)
|
||||
await this.character.createEmbeddedDocuments('Item', [
|
||||
{ ...this.equipment.primaryWeapon, system: { ...this.equipment.primaryWeapon.system, equipped: true } }
|
||||
]);
|
||||
if (this.equipment.secondaryWeapon.uuid)
|
||||
await this.character.createEmbeddedDocuments('Item', [
|
||||
{
|
||||
...this.equipment.secondaryWeapon,
|
||||
system: { ...this.equipment.secondaryWeapon.system, equipped: true }
|
||||
}
|
||||
]);
|
||||
if (this.equipment.inventory.choiceA.uuid)
|
||||
await this.character.createEmbeddedDocuments('Item', [this.equipment.inventory.choiceA]);
|
||||
if (this.equipment.inventory.choiceB.uuid)
|
||||
await this.character.createEmbeddedDocuments('Item', [this.equipment.inventory.choiceB]);
|
||||
await createEmbeddedItemWithEffects(this.character, ancestry);
|
||||
await createEmbeddedItemWithEffects(this.character, this.setup.community);
|
||||
await createEmbeddedItemWithEffects(this.character, this.setup.class);
|
||||
await createEmbeddedItemWithEffects(this.character, this.setup.subclass);
|
||||
await this.character.createEmbeddedDocuments(
|
||||
'Item',
|
||||
this.setup.class.system.inventory.take.filter(x => x)
|
||||
Object.values(this.setup.domainCards).map(x => ({
|
||||
...x,
|
||||
effects: x.effects?.map(effect => effect.toObject())
|
||||
}))
|
||||
);
|
||||
|
||||
if (this.equipment.armor.uuid)
|
||||
await createEmbeddedItemWithEffects(this.character, this.equipment.armor, {
|
||||
...this.equipment.armor,
|
||||
system: { ...this.equipment.armor.system, equipped: true }
|
||||
});
|
||||
if (this.equipment.primaryWeapon.uuid)
|
||||
await createEmbeddedItemWithEffects(this.character, this.equipment.primaryWeapon, {
|
||||
...this.equipment.primaryWeapon,
|
||||
system: { ...this.equipment.primaryWeapon.system, equipped: true }
|
||||
});
|
||||
if (this.equipment.secondaryWeapon.uuid)
|
||||
await createEmbeddedItemWithEffects(this.character, this.equipment.secondaryWeapon, {
|
||||
...this.equipment.secondaryWeapon,
|
||||
system: { ...this.equipment.secondaryWeapon.system, equipped: true }
|
||||
});
|
||||
if (this.equipment.inventory.choiceA.uuid)
|
||||
await createEmbeddedItemWithEffects(this.character, this.equipment.inventory.choiceA);
|
||||
if (this.equipment.inventory.choiceB.uuid)
|
||||
await createEmbeddedItemWithEffects(this.character, this.equipment.inventory.choiceB);
|
||||
|
||||
await this.character.createEmbeddedDocuments(
|
||||
'Item',
|
||||
this.setup.class.system.inventory.take
|
||||
.filter(x => x)
|
||||
.map(x => ({
|
||||
...x,
|
||||
effects: x.effects?.map(effect => effect.toObject())
|
||||
}))
|
||||
);
|
||||
|
||||
await this.character.update({
|
||||
|
|
|
|||
|
|
@ -10,14 +10,18 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap
|
|||
this.reject = reject;
|
||||
this.actor = actor;
|
||||
this.damage = damage;
|
||||
this.rulesDefault = game.settings.get(
|
||||
CONFIG.DH.id,
|
||||
CONFIG.DH.SETTINGS.gameSettings.Automation
|
||||
).damageReductionRulesDefault;
|
||||
|
||||
this.rulesOn = [CONFIG.DH.GENERAL.ruleChoice.on.id, CONFIG.DH.GENERAL.ruleChoice.onWithToggle.id].includes(
|
||||
this.rulesDefault
|
||||
);
|
||||
|
||||
const canApplyArmor = damageType.every(t => actor.system.armorApplicableDamageTypes[t] === true);
|
||||
const maxArmorMarks = canApplyArmor
|
||||
? Math.min(
|
||||
actor.system.armorScore - actor.system.armor.system.marks.value,
|
||||
actor.system.rules.damageReduction.maxArmorMarked.value
|
||||
)
|
||||
: 0;
|
||||
const availableArmor = actor.system.armorScore - actor.system.armor.system.marks.value;
|
||||
const maxArmorMarks = canApplyArmor ? availableArmor : 0;
|
||||
|
||||
const armor = [...Array(maxArmorMarks).keys()].reduce((acc, _) => {
|
||||
acc[foundry.utils.randomID()] = { selected: false };
|
||||
|
|
@ -42,6 +46,7 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap
|
|||
acc[damage] = {
|
||||
cost: dr.cost,
|
||||
selected: false,
|
||||
any: key === 'any',
|
||||
from: getDamageLabel(damage),
|
||||
to: getDamageLabel(damage - 1)
|
||||
};
|
||||
|
|
@ -51,16 +56,28 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap
|
|||
},
|
||||
null
|
||||
);
|
||||
|
||||
this.thresholdImmunities = Object.keys(actor.system.rules.damageReduction.thresholdImmunities).reduce(
|
||||
(acc, key) => {
|
||||
if (actor.system.rules.damageReduction.thresholdImmunities[key])
|
||||
acc[damageKeyToNumber(key)] = game.i18n.format(`DAGGERHEART.GENERAL.DamageThresholds.with`, {
|
||||
threshold: game.i18n.localize(`DAGGERHEART.GENERAL.DamageThresholds.${key}`)
|
||||
});
|
||||
return acc;
|
||||
},
|
||||
{}
|
||||
);
|
||||
}
|
||||
|
||||
static DEFAULT_OPTIONS = {
|
||||
tag: 'form',
|
||||
classes: ['daggerheart', 'views', 'damage-reduction'],
|
||||
position: {
|
||||
width: 240,
|
||||
width: 280,
|
||||
height: 'auto'
|
||||
},
|
||||
actions: {
|
||||
toggleRules: this.toggleRules,
|
||||
setMarks: this.setMarks,
|
||||
useStressReduction: this.useStressReduction,
|
||||
takeDamage: this.takeDamage
|
||||
|
|
@ -89,6 +106,12 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap
|
|||
|
||||
async _prepareContext(_options) {
|
||||
const context = await super._prepareContext(_options);
|
||||
context.rulesOn = this.rulesOn;
|
||||
context.rulesToggleable = [
|
||||
CONFIG.DH.GENERAL.ruleChoice.onWithToggle.id,
|
||||
CONFIG.DH.GENERAL.ruleChoice.offWithToggle.id
|
||||
].includes(this.rulesDefault);
|
||||
context.thresholdImmunities = this.thresholdImmunities;
|
||||
|
||||
const { selectedArmorMarks, selectedStressMarks, stressReductions, currentMarks, currentDamage } =
|
||||
this.getDamageInfo();
|
||||
|
|
@ -110,12 +133,22 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap
|
|||
}
|
||||
: null;
|
||||
|
||||
context.marks = this.marks;
|
||||
const maxArmor = this.actor.system.rules.damageReduction.maxArmorMarked.value;
|
||||
context.marks = {
|
||||
armor: Object.keys(this.marks.armor).reduce((acc, key, index) => {
|
||||
const mark = this.marks.armor[key];
|
||||
if (!this.rulesOn || index + 1 <= maxArmor) acc[key] = mark;
|
||||
|
||||
return acc;
|
||||
}, {}),
|
||||
stress: this.marks.stress
|
||||
};
|
||||
context.availableStressReductions = this.availableStressReductions;
|
||||
|
||||
context.damage = getDamageLabel(this.damage);
|
||||
context.reducedDamage = currentDamage !== this.damage ? getDamageLabel(currentDamage) : null;
|
||||
context.currentDamage = context.reducedDamage ?? context.damage;
|
||||
context.currentDamageNr = currentDamage;
|
||||
|
||||
return context;
|
||||
}
|
||||
|
|
@ -136,23 +169,49 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap
|
|||
|
||||
const armorMarkReduction =
|
||||
selectedArmorMarks.length * this.actor.system.rules.damageReduction.increasePerArmorMark;
|
||||
const currentDamage = this.damage - armorMarkReduction - selectedStressMarks.length - stressReductions.length;
|
||||
let currentDamage = Math.max(
|
||||
this.damage - armorMarkReduction - selectedStressMarks.length - stressReductions.length,
|
||||
0
|
||||
);
|
||||
|
||||
if (this.thresholdImmunities[currentDamage]) currentDamage = 0;
|
||||
|
||||
return { selectedArmorMarks, selectedStressMarks, stressReductions, currentMarks, currentDamage };
|
||||
};
|
||||
|
||||
static toggleRules() {
|
||||
this.rulesOn = !this.rulesOn;
|
||||
|
||||
const maxArmor = this.actor.system.rules.damageReduction.maxArmorMarked.value;
|
||||
this.marks = {
|
||||
armor: Object.keys(this.marks.armor).reduce((acc, key, index) => {
|
||||
const mark = this.marks.armor[key];
|
||||
const keepSelectValue = !this.rulesOn || index + 1 <= maxArmor;
|
||||
acc[key] = { ...mark, selected: keepSelectValue ? mark.selected : false };
|
||||
|
||||
return acc;
|
||||
}, {}),
|
||||
stress: this.marks.stress
|
||||
};
|
||||
|
||||
this.render();
|
||||
}
|
||||
|
||||
static setMarks(_, target) {
|
||||
const currentMark = this.marks[target.dataset.type][target.dataset.key];
|
||||
const { selectedStressMarks, stressReductions, currentMarks, currentDamage } = this.getDamageInfo();
|
||||
|
||||
if (!currentMark.selected && currentDamage === 0) {
|
||||
ui.notifications.info(game.i18n.localize('DAGGERHEART.UI.Notifications.damageAlreadyNone'));
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.rulesOn) {
|
||||
if (!currentMark.selected && currentMarks === this.actor.system.armorScore) {
|
||||
ui.notifications.info(game.i18n.localize('DAGGERHEART.UI.Notifications.noAvailableArmorMarks'));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (currentMark.selected) {
|
||||
const currentDamageLabel = getDamageLabel(currentDamage);
|
||||
|
|
|
|||
|
|
@ -24,6 +24,8 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV
|
|||
actor.system.bonuses.rest[`${shortrest ? 'short' : 'long'}Rest`].longMoves
|
||||
}
|
||||
};
|
||||
|
||||
this.refreshables = this.getRefreshables();
|
||||
}
|
||||
|
||||
get title() {
|
||||
|
|
@ -81,11 +83,56 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV
|
|||
context.shortRestMoves = this.nrChoices.shortRest.max > 0 ? this.moveData.shortRest : null;
|
||||
context.longRestMoves = this.nrChoices.longRest.max > 0 ? this.moveData.longRest : null;
|
||||
|
||||
context.refreshables = this.refreshables;
|
||||
|
||||
context.disabledDowntime = shortRestMovesSelected === 0 && longRestMovesSelected === 0;
|
||||
|
||||
return context;
|
||||
}
|
||||
|
||||
getRefreshables() {
|
||||
const actionItems = this.actor.items.reduce((acc, x) => {
|
||||
if (x.system.actions) {
|
||||
const recoverable = x.system.actions.reduce((acc, action) => {
|
||||
if (action.uses.recovery && (action.uses.recovery === 'shortRest') === this.shortrest) {
|
||||
acc.push({
|
||||
title: x.name,
|
||||
name: action.name,
|
||||
uuid: action.uuid
|
||||
});
|
||||
}
|
||||
|
||||
return acc;
|
||||
}, []);
|
||||
|
||||
if (recoverable) {
|
||||
acc.push(...recoverable);
|
||||
}
|
||||
}
|
||||
|
||||
return acc;
|
||||
}, []);
|
||||
const resourceItems = this.actor.items.reduce((acc, x) => {
|
||||
if (
|
||||
x.system.resource &&
|
||||
x.system.resource.type &&
|
||||
(x.system.resource.recovery === 'shortRest') === this.shortrest
|
||||
) {
|
||||
acc.push({
|
||||
title: game.i18n.localize(`TYPES.Item.${x.type}`),
|
||||
name: x.name,
|
||||
uuid: x.uuid
|
||||
});
|
||||
}
|
||||
|
||||
return acc;
|
||||
}, []);
|
||||
return {
|
||||
actionItems,
|
||||
resourceItems
|
||||
};
|
||||
}
|
||||
|
||||
static selectMove(_, target) {
|
||||
const { category, move } = target.dataset;
|
||||
|
||||
|
|
@ -172,11 +219,24 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV
|
|||
}
|
||||
}
|
||||
|
||||
// We can close the window when all moves are taken
|
||||
// We can close the window and refresh resources when all moves are taken
|
||||
if (
|
||||
this.nrChoices.shortRest.taken >= this.nrChoices.shortRest.max &&
|
||||
this.nrChoices.longRest.taken >= this.nrChoices.longRest.max
|
||||
) {
|
||||
for (var data of this.refreshables.actionItems) {
|
||||
const action = await foundry.utils.fromUuid(data.uuid);
|
||||
await action.parent.parent.update({ [`system.actions.${action.id}.uses.value`]: action.uses.max ?? 1 });
|
||||
}
|
||||
|
||||
for (var data of this.refreshables.resourceItems) {
|
||||
const feature = await foundry.utils.fromUuid(data.uuid);
|
||||
const increasing =
|
||||
feature.system.resource.progression === CONFIG.DH.ITEM.itemResourceProgression.increasing.id;
|
||||
const resetValue = increasing ? 0 : (feature.system.resource.max ?? 0);
|
||||
await feature.update({ 'system.resource.value': resetValue });
|
||||
}
|
||||
|
||||
this.close();
|
||||
} else {
|
||||
this.render();
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@ export default function DHApplicationMixin(Base) {
|
|||
docs.push(doc);
|
||||
}
|
||||
|
||||
docs.filter(doc => doc).map(doc => (doc.apps[this.id] = this));
|
||||
docs.filter(doc => doc).forEach(doc => (doc.apps[this.id] = this));
|
||||
|
||||
if (!!this.options.contextMenus.length) this._createContextMenus();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -80,10 +80,17 @@ export default class ClassSheet extends DHBaseItemSheet {
|
|||
'inventory.choiceB'
|
||||
];
|
||||
|
||||
paths.forEach(path => {
|
||||
const docs = [].concat(foundry.utils.getProperty(this.document, `system.${path}`) ?? []);
|
||||
docs.forEach(doc => (doc.apps[this.id] = this));
|
||||
});
|
||||
for (let path of paths) {
|
||||
const docDatas = [].concat(foundry.utils.getProperty(this.document, `system.${path}`) ?? []);
|
||||
|
||||
const docs = [];
|
||||
for (var docData of docDatas) {
|
||||
const doc = await foundry.utils.fromUuid(docData.uuid);
|
||||
docs.push(doc);
|
||||
}
|
||||
|
||||
docs.filter(doc => doc).forEach(doc => (doc.apps[this.id] = this));
|
||||
}
|
||||
}
|
||||
|
||||
/**@inheritdoc */
|
||||
|
|
|
|||
|
|
@ -55,6 +55,24 @@ export const abilities = {
|
|||
}
|
||||
};
|
||||
|
||||
export const scrollingTextResource = {
|
||||
hitPoints: {
|
||||
label: 'DAGGERHEART.GENERAL.HitPoints.plural',
|
||||
reversed: true
|
||||
},
|
||||
stress: {
|
||||
label: 'DAGGERHEART.GENERAL.stress',
|
||||
reversed: true
|
||||
},
|
||||
hope: {
|
||||
label: 'DAGGERHEART.GENERAL.hope'
|
||||
},
|
||||
armor: {
|
||||
label: 'DAGGERHEART.GENERAL.armor',
|
||||
reversed: true
|
||||
}
|
||||
};
|
||||
|
||||
export const featureProperties = {
|
||||
agility: {
|
||||
name: 'DAGGERHEART.CONFIG.Traits.agility.name',
|
||||
|
|
|
|||
|
|
@ -2,6 +2,25 @@ export const compendiumJournals = {
|
|||
welcome: 'Compendium.daggerheart.journals.JournalEntry.g7NhKvwltwafmMyR'
|
||||
};
|
||||
|
||||
export const ruleChoice = {
|
||||
on: {
|
||||
id: 'on',
|
||||
label: 'DAGGERHEART.CONFIG.RuleChoice.on'
|
||||
},
|
||||
of: {
|
||||
id: 'off',
|
||||
label: 'DAGGERHEART.CONFIG.RuleChoice.off'
|
||||
},
|
||||
onWithToggle: {
|
||||
id: 'onWithToggle',
|
||||
label: 'DAGGERHEART.CONFIG.RuleChoice.onWithToggle'
|
||||
},
|
||||
offWithToggle: {
|
||||
id: 'offWithToggle',
|
||||
label: 'DAGGERHEART.CONFIG.RuleChoice.offWithToggle'
|
||||
}
|
||||
};
|
||||
|
||||
export const range = {
|
||||
self: {
|
||||
id: 'self',
|
||||
|
|
@ -129,10 +148,10 @@ export const healingTypes = {
|
|||
label: 'DAGGERHEART.CONFIG.HealingType.hope.name',
|
||||
abbreviation: 'DAGGERHEART.CONFIG.HealingType.hope.abbreviation'
|
||||
},
|
||||
armorSlot: {
|
||||
id: 'armorSlot',
|
||||
label: 'DAGGERHEART.CONFIG.HealingType.armorSlot.name',
|
||||
abbreviation: 'DAGGERHEART.CONFIG.HealingType.armorSlot.abbreviation'
|
||||
armor: {
|
||||
id: 'armor',
|
||||
label: 'DAGGERHEART.CONFIG.HealingType.armor.name',
|
||||
abbreviation: 'DAGGERHEART.CONFIG.HealingType.armor.abbreviation'
|
||||
},
|
||||
fear: {
|
||||
id: 'fear',
|
||||
|
|
@ -190,7 +209,12 @@ export const defaultRestOptions = {
|
|||
img: 'icons/magic/life/cross-worn-green.webp',
|
||||
actionType: 'action',
|
||||
chatDisplay: false,
|
||||
healing: {
|
||||
target: {
|
||||
type: 'self'
|
||||
},
|
||||
damage: {
|
||||
parts: [
|
||||
{
|
||||
applyTo: healingTypes.hitPoints.id,
|
||||
value: {
|
||||
custom: {
|
||||
|
|
@ -199,6 +223,8 @@ export const defaultRestOptions = {
|
|||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -216,7 +242,12 @@ export const defaultRestOptions = {
|
|||
img: 'icons/magic/perception/eye-ringed-green.webp',
|
||||
actionType: 'action',
|
||||
chatDisplay: false,
|
||||
healing: {
|
||||
target: {
|
||||
type: 'self'
|
||||
},
|
||||
damage: {
|
||||
parts: [
|
||||
{
|
||||
applyTo: healingTypes.stress.id,
|
||||
value: {
|
||||
custom: {
|
||||
|
|
@ -225,6 +256,8 @@ export const defaultRestOptions = {
|
|||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -242,8 +275,13 @@ export const defaultRestOptions = {
|
|||
img: 'icons/skills/trades/smithing-anvil-silver-red.webp',
|
||||
actionType: 'action',
|
||||
chatDisplay: false,
|
||||
healing: {
|
||||
applyTo: healingTypes.armorSlot.id,
|
||||
target: {
|
||||
type: 'self'
|
||||
},
|
||||
damage: {
|
||||
parts: [
|
||||
{
|
||||
applyTo: healingTypes.armor.id,
|
||||
value: {
|
||||
custom: {
|
||||
enabled: true,
|
||||
|
|
@ -251,6 +289,8 @@ export const defaultRestOptions = {
|
|||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -278,7 +318,12 @@ export const defaultRestOptions = {
|
|||
img: 'icons/magic/life/cross-worn-green.webp',
|
||||
actionType: 'action',
|
||||
chatDisplay: false,
|
||||
healing: {
|
||||
target: {
|
||||
type: 'self'
|
||||
},
|
||||
damage: {
|
||||
parts: [
|
||||
{
|
||||
applyTo: healingTypes.hitPoints.id,
|
||||
value: {
|
||||
custom: {
|
||||
|
|
@ -287,6 +332,8 @@ export const defaultRestOptions = {
|
|||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -304,7 +351,12 @@ export const defaultRestOptions = {
|
|||
img: 'icons/magic/perception/eye-ringed-green.webp',
|
||||
actionType: 'action',
|
||||
chatDisplay: false,
|
||||
healing: {
|
||||
target: {
|
||||
type: 'self'
|
||||
},
|
||||
damage: {
|
||||
parts: [
|
||||
{
|
||||
applyTo: healingTypes.stress.id,
|
||||
value: {
|
||||
custom: {
|
||||
|
|
@ -313,6 +365,8 @@ export const defaultRestOptions = {
|
|||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -330,8 +384,13 @@ export const defaultRestOptions = {
|
|||
img: 'icons/skills/trades/smithing-anvil-silver-red.webp',
|
||||
actionType: 'action',
|
||||
chatDisplay: false,
|
||||
healing: {
|
||||
applyTo: healingTypes.armorSlot.id,
|
||||
target: {
|
||||
type: 'self'
|
||||
},
|
||||
damage: {
|
||||
parts: [
|
||||
{
|
||||
applyTo: healingTypes.armor.id,
|
||||
value: {
|
||||
custom: {
|
||||
enabled: true,
|
||||
|
|
@ -339,6 +398,8 @@ export const defaultRestOptions = {
|
|||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -432,8 +493,20 @@ export const getDiceSoNicePresets = async (hopeFaces, fearFaces, advantageFaces
|
|||
const { diceSoNice } = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance);
|
||||
const getPreset = async (type, faces) => {
|
||||
const system = game.dice3d.DiceFactory.systems.get(type.system).dice.get(faces);
|
||||
if (!system.modelLoaded) {
|
||||
if (!system) {
|
||||
ui.notifications.error(
|
||||
game.i18n.format('DAGGERHEART.UI.Notifications.noDiceSystem', {
|
||||
system: game.dice3d.DiceFactory.systems.get(type.system).name,
|
||||
faces: faces
|
||||
})
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (system.modelFile && !system.modelLoaded) {
|
||||
await system.loadModel(game.dice3d.DiceFactory.loaderGLTF);
|
||||
} else {
|
||||
await system.loadTextures();
|
||||
}
|
||||
|
||||
return {
|
||||
|
|
|
|||
|
|
@ -675,7 +675,7 @@ export const weaponFeatures = {
|
|||
},
|
||||
cost: [
|
||||
{
|
||||
type: 'armorSlot',
|
||||
type: 'armor',
|
||||
value: 1
|
||||
}
|
||||
],
|
||||
|
|
@ -886,15 +886,22 @@ export const weaponFeatures = {
|
|||
name: 'DAGGERHEART.CONFIG.WeaponFeature.healing.actions.heal.name',
|
||||
description: 'DAGGERHEART.CONFIG.WeaponFeature.healing.actions.heal.description',
|
||||
img: 'icons/magic/life/cross-beam-green.webp',
|
||||
healing: {
|
||||
type: 'health',
|
||||
target: {
|
||||
type: 'self'
|
||||
},
|
||||
damage: {
|
||||
parts: [
|
||||
{
|
||||
applyTo: 'hitPoints',
|
||||
value: {
|
||||
custom: {
|
||||
enabled: true,
|
||||
formula: '1'
|
||||
formula: 1
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -1473,6 +1480,17 @@ export const itemResourceTypes = {
|
|||
}
|
||||
};
|
||||
|
||||
export const itemResourceProgression = {
|
||||
increasing: {
|
||||
id: 'increasing',
|
||||
label: 'DAGGERHEART.CONFIG.ItemResourceProgression.increasing'
|
||||
},
|
||||
decreasing: {
|
||||
id: 'decreasing',
|
||||
label: 'DAGGERHEART.CONFIG.ItemResourceProgression.decreasing'
|
||||
}
|
||||
};
|
||||
|
||||
export const beastformTypes = {
|
||||
normal: {
|
||||
id: 'normal',
|
||||
|
|
|
|||
|
|
@ -53,8 +53,8 @@ export default class DhpAdversary extends BaseDataActor {
|
|||
})
|
||||
}),
|
||||
resources: new fields.SchemaField({
|
||||
hitPoints: resourceField(0, 'DAGGERHEART.GENERAL.HitPoints.plural', true),
|
||||
stress: resourceField(0, 'DAGGERHEART.GENERAL.stress', true)
|
||||
hitPoints: resourceField(0, 0, 'DAGGERHEART.GENERAL.HitPoints.plural', true),
|
||||
stress: resourceField(0, 0, 'DAGGERHEART.GENERAL.stress', true)
|
||||
}),
|
||||
attack: new ActionField({
|
||||
initial: {
|
||||
|
|
@ -105,6 +105,13 @@ export default class DhpAdversary extends BaseDataActor {
|
|||
};
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**@inheritdoc */
|
||||
static DEFAULT_ICON = 'systems/daggerheart/assets/icons/documents/actors/dragon-head.svg';
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
get attackBonus() {
|
||||
return this.attack.roll.bonus;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
import DHBaseActorSettings from '../../applications/sheets/api/actor-setting.mjs';
|
||||
import { createScrollText, getScrollTextData } from '../../helpers/utils.mjs';
|
||||
|
||||
const resistanceField = (resistanceLabel, immunityLabel, reductionLabel) =>
|
||||
new foundry.data.fields.SchemaField({
|
||||
|
|
@ -69,6 +70,16 @@ export default class BaseDataActor extends foundry.abstract.TypeDataModel {
|
|||
return schema;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**
|
||||
* The default icon used for newly created Actors documents
|
||||
* @type {string}
|
||||
*/
|
||||
static DEFAULT_ICON = null;
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Obtain a data object used to evaluate any dice rolls associated with this Item Type
|
||||
* @param {object} [options] - Options which modify the getRollData method.
|
||||
|
|
@ -78,4 +89,28 @@ export default class BaseDataActor extends foundry.abstract.TypeDataModel {
|
|||
const data = { ...this };
|
||||
return data;
|
||||
}
|
||||
|
||||
async _preUpdate(changes, options, userId) {
|
||||
const allowed = await super._preUpdate(changes, options, userId);
|
||||
if (allowed === false) return;
|
||||
|
||||
const autoSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation);
|
||||
if (changes.system?.resources && autoSettings.resourceScrollTexts) {
|
||||
const textData = Object.keys(changes.system.resources).reduce((acc, key) => {
|
||||
const resource = changes.system.resources[key];
|
||||
if (resource.value !== undefined && resource.value !== this.resources[key].value) {
|
||||
acc.push(getScrollTextData(this.resources, resource, key));
|
||||
}
|
||||
|
||||
return acc;
|
||||
}, []);
|
||||
options.scrollingTextData = textData;
|
||||
}
|
||||
}
|
||||
|
||||
_onUpdate(changes, options, userId) {
|
||||
super._onUpdate(changes, options, userId);
|
||||
|
||||
createScrollText(this.parent, options.scrollingTextData);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,8 +7,10 @@ import { ActionField } from '../fields/actionField.mjs';
|
|||
import DHCharacterSettings from '../../applications/sheets-configs/character-settings.mjs';
|
||||
|
||||
export default class DhCharacter extends BaseDataActor {
|
||||
/**@override */
|
||||
static LOCALIZATION_PREFIXES = ['DAGGERHEART.ACTORS.Character'];
|
||||
|
||||
/**@inheritdoc */
|
||||
static get metadata() {
|
||||
return foundry.utils.mergeObject(super.metadata, {
|
||||
label: 'TYPES.Actor.character',
|
||||
|
|
@ -18,6 +20,7 @@ export default class DhCharacter extends BaseDataActor {
|
|||
});
|
||||
}
|
||||
|
||||
/**@inheritdoc */
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
|
||||
|
|
@ -25,13 +28,14 @@ export default class DhCharacter extends BaseDataActor {
|
|||
...super.defineSchema(),
|
||||
resources: new fields.SchemaField({
|
||||
hitPoints: resourceField(
|
||||
0,
|
||||
0,
|
||||
'DAGGERHEART.GENERAL.HitPoints.plural',
|
||||
true,
|
||||
'DAGGERHEART.ACTORS.Character.maxHPBonus'
|
||||
),
|
||||
stress: resourceField(6, 'DAGGERHEART.GENERAL.stress', true),
|
||||
hope: resourceField(6, 'DAGGERHEART.GENERAL.hope')
|
||||
stress: resourceField(6, 0, 'DAGGERHEART.GENERAL.stress', true),
|
||||
hope: resourceField(6, 2, 'DAGGERHEART.GENERAL.hope')
|
||||
}),
|
||||
traits: new fields.SchemaField({
|
||||
agility: attributeField('DAGGERHEART.CONFIG.Traits.agility.name'),
|
||||
|
|
@ -239,7 +243,8 @@ export default class DhCharacter extends BaseDataActor {
|
|||
stressDamageReduction: new fields.SchemaField({
|
||||
severe: stressDamageReductionRule('DAGGERHEART.GENERAL.Rules.damageReduction.stress.severe'),
|
||||
major: stressDamageReductionRule('DAGGERHEART.GENERAL.Rules.damageReduction.stress.major'),
|
||||
minor: stressDamageReductionRule('DAGGERHEART.GENERAL.Rules.damageReduction.stress.minor')
|
||||
minor: stressDamageReductionRule('DAGGERHEART.GENERAL.Rules.damageReduction.stress.minor'),
|
||||
any: stressDamageReductionRule('DAGGERHEART.GENERAL.Rules.damageReduction.stress.any')
|
||||
}),
|
||||
increasePerArmorMark: new fields.NumberField({
|
||||
integer: true,
|
||||
|
|
@ -248,7 +253,11 @@ export default class DhCharacter extends BaseDataActor {
|
|||
hint: 'DAGGERHEART.GENERAL.Rules.damageReduction.increasePerArmorMark.hint'
|
||||
}),
|
||||
magical: new fields.BooleanField({ initial: false }),
|
||||
physical: new fields.BooleanField({ initial: false })
|
||||
physical: new fields.BooleanField({ initial: false }),
|
||||
thresholdImmunities: new fields.SchemaField({
|
||||
minor: new fields.BooleanField({ initial: false })
|
||||
}),
|
||||
disabledArmor: new fields.BooleanField({ intial: false })
|
||||
}),
|
||||
attack: new fields.SchemaField({
|
||||
damage: new fields.SchemaField({
|
||||
|
|
@ -289,11 +298,16 @@ export default class DhCharacter extends BaseDataActor {
|
|||
*/
|
||||
flipMinDiceValue: new fields.BooleanField({ intial: false })
|
||||
}),
|
||||
runeWard: new fields.BooleanField({ initial: false })
|
||||
runeWard: new fields.BooleanField({ initial: false }),
|
||||
burden: new fields.SchemaField({
|
||||
ignore: new fields.BooleanField()
|
||||
})
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
get tier() {
|
||||
const currentLevel = this.levelData.level.current;
|
||||
return currentLevel === 1
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ import { resourceField, bonusField } from '../fields/actorField.mjs';
|
|||
export default class DhCompanion extends BaseDataActor {
|
||||
static LOCALIZATION_PREFIXES = ['DAGGERHEART.ACTORS.Companion'];
|
||||
|
||||
/**@inheritdoc */
|
||||
static get metadata() {
|
||||
return foundry.utils.mergeObject(super.metadata, {
|
||||
label: 'TYPES.Actor.companion',
|
||||
|
|
@ -18,6 +19,7 @@ export default class DhCompanion extends BaseDataActor {
|
|||
});
|
||||
}
|
||||
|
||||
/**@inheritdoc */
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
|
||||
|
|
@ -25,7 +27,7 @@ export default class DhCompanion extends BaseDataActor {
|
|||
...super.defineSchema(),
|
||||
partner: new ForeignDocumentUUIDField({ type: 'Actor' }),
|
||||
resources: new fields.SchemaField({
|
||||
stress: resourceField(3, 'DAGGERHEART.GENERAL.stress', true),
|
||||
stress: resourceField(3, 0, 'DAGGERHEART.GENERAL.stress', true),
|
||||
hope: new fields.NumberField({ initial: 0, integer: true, label: 'DAGGERHEART.GENERAL.hope' })
|
||||
}),
|
||||
evasion: new fields.NumberField({
|
||||
|
|
@ -87,6 +89,13 @@ export default class DhCompanion extends BaseDataActor {
|
|||
};
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**@inheritdoc */
|
||||
static DEFAULT_ICON = 'systems/daggerheart/assets/icons/documents/actors/capybara.svg';
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
get proficiency() {
|
||||
return this.partner?.system?.proficiency ?? 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,8 +3,10 @@ import ForeignDocumentUUIDArrayField from '../fields/foreignDocumentUUIDArrayFie
|
|||
import DHEnvironmentSettings from '../../applications/sheets-configs/environment-settings.mjs';
|
||||
|
||||
export default class DhEnvironment extends BaseDataActor {
|
||||
/**@override */
|
||||
static LOCALIZATION_PREFIXES = ['DAGGERHEART.ACTORS.Environment'];
|
||||
|
||||
/**@inheritdoc */
|
||||
static get metadata() {
|
||||
return foundry.utils.mergeObject(super.metadata, {
|
||||
label: 'TYPES.Actor.environment',
|
||||
|
|
@ -14,6 +16,7 @@ export default class DhEnvironment extends BaseDataActor {
|
|||
});
|
||||
}
|
||||
|
||||
/**@inheritdoc */
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
|
|
@ -37,6 +40,13 @@ export default class DhEnvironment extends BaseDataActor {
|
|||
};
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**@inheritdoc */
|
||||
static DEFAULT_ICON = 'systems/daggerheart/assets/icons/documents/actors/forest.svg';
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
get features() {
|
||||
return this.parent.items.filter(x => x.type === 'feature');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@ class DhCountdown extends foundry.abstract.DataModel {
|
|||
required: true,
|
||||
choices: CONFIG.DH.GENERAL.countdownTypes,
|
||||
initial: CONFIG.DH.GENERAL.countdownTypes.custom.id,
|
||||
label: 'DAGGERHEART.APPLICATIONS.Countdown.FIELDS.countdowns.element.progress.type.value.label'
|
||||
label: 'DAGGERHEART.GENERAL.type'
|
||||
}),
|
||||
label: new fields.StringField({
|
||||
label: 'DAGGERHEART.APPLICATIONS.Countdown.FIELDS.countdowns.element.progress.type.label.label'
|
||||
|
|
|
|||
|
|
@ -6,9 +6,9 @@ const attributeField = label =>
|
|||
tierMarked: new fields.BooleanField({ initial: false })
|
||||
});
|
||||
|
||||
const resourceField = (max = 0, label, reverse = false, maxLabel) =>
|
||||
const resourceField = (max = 0, initial = 0, label, reverse = false, maxLabel) =>
|
||||
new fields.SchemaField({
|
||||
value: new fields.NumberField({ initial: 0, min: 0, integer: true, label }),
|
||||
value: new fields.NumberField({ initial: initial, min: 0, integer: true, label }),
|
||||
max: new fields.NumberField({
|
||||
initial: max,
|
||||
integer: true,
|
||||
|
|
|
|||
|
|
@ -19,10 +19,26 @@ export default class DHAncestry extends BaseDataItem {
|
|||
};
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**@override */
|
||||
static DEFAULT_ICON = 'systems/daggerheart/assets/icons/documents/items/family-tree.svg';
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Gets the primary feature.
|
||||
* @type {foundry.documents.Item|null} Returns the item of the first feature with type "primary" or null if none is found.
|
||||
*/
|
||||
get primaryFeature() {
|
||||
return this.features.find(x => x.type === CONFIG.DH.ITEM.featureSubTypes.primary)?.item;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the secondary feature.
|
||||
* @type {foundry.documents.Item|null} Returns the item of the first feature with type "secondary" or null if none is found.
|
||||
*/
|
||||
get secondaryFeature() {
|
||||
return this.features.find(x => x.type === CONFIG.DH.ITEM.featureSubTypes.secondary)?.item;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,12 +42,20 @@ export default class DHArmor extends AttachableItem {
|
|||
};
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**@override */
|
||||
static DEFAULT_ICON = 'systems/daggerheart/assets/icons/documents/items/chest-armor.svg';
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
get customActions() {
|
||||
return this.actions.filter(
|
||||
action => !this.armorFeatures.some(feature => feature.actionIds.includes(action.id))
|
||||
);
|
||||
}
|
||||
|
||||
/**@inheritdoc */
|
||||
async _preUpdate(changes, options, user) {
|
||||
const allowed = await super._preUpdate(changes, options, user);
|
||||
if (allowed === false) return false;
|
||||
|
|
@ -68,7 +76,7 @@ export default class DHArmor extends AttachableItem {
|
|||
return acc;
|
||||
}, {});
|
||||
|
||||
for (var feature of added) {
|
||||
for (const feature of added) {
|
||||
const featureData = armorFeatures[feature.value];
|
||||
if (featureData.effects?.length > 0) {
|
||||
const embeddedItems = await this.parent.createEmbeddedDocuments(
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
* @property {boolean} isInventoryItem- Indicates whether items of this type is a Inventory Item
|
||||
*/
|
||||
|
||||
import { addLinkedItemsDiff, updateLinkedItemApps } from '../../helpers/utils.mjs';
|
||||
import { addLinkedItemsDiff, createScrollText, getScrollTextData, updateLinkedItemApps } from '../../helpers/utils.mjs';
|
||||
import { ActionsField } from '../fields/actionField.mjs';
|
||||
import FormulaField from '../fields/formulaField.mjs';
|
||||
|
||||
|
|
@ -56,6 +56,11 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel {
|
|||
initial: null,
|
||||
nullable: true
|
||||
}),
|
||||
progression: new fields.StringField({
|
||||
required: true,
|
||||
choices: CONFIG.DH.ITEM.itemResourceProgression,
|
||||
initial: CONFIG.DH.ITEM.itemResourceProgression.increasing.id
|
||||
}),
|
||||
diceStates: new fields.TypedObjectField(
|
||||
new fields.SchemaField({
|
||||
value: new fields.NumberField({ integer: true, initial: 1, min: 1 }),
|
||||
|
|
@ -79,6 +84,16 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel {
|
|||
return schema;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**
|
||||
* The default icon used for newly created Item documents
|
||||
* @type {string}
|
||||
*/
|
||||
static DEFAULT_ICON = null;
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Convenient access to the item's actor, if it exists.
|
||||
* @returns {foundry.documents.Actor | null}
|
||||
|
|
@ -178,11 +193,20 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel {
|
|||
if (allowed === false) return false;
|
||||
|
||||
addLinkedItemsDiff(changed.system?.features, this.features, options);
|
||||
|
||||
const autoSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation);
|
||||
const armorChanged =
|
||||
changed.system?.marks?.value !== undefined && changed.system.marks.value !== this.marks.value;
|
||||
if (armorChanged && autoSettings.resourceScrollTexts && this.parent.parent?.type === 'character') {
|
||||
const armorData = getScrollTextData(this.parent.parent.system.resources, changed.system.marks, 'armor');
|
||||
options.scrollingTextData = [armorData];
|
||||
}
|
||||
}
|
||||
|
||||
_onUpdate(changed, options, userId) {
|
||||
super._onUpdate(changed, options, userId);
|
||||
|
||||
updateLinkedItemApps(options, this.parent.sheet);
|
||||
createScrollText(this.parent?.parent, options.scrollingTextData);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -81,6 +81,13 @@ export default class DHBeastform extends BaseDataItem {
|
|||
};
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**@override */
|
||||
static DEFAULT_ICON = 'systems/daggerheart/assets/icons/documents/items/wolf-head.svg';
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
async _preCreate() {
|
||||
if (!this.actor) return;
|
||||
|
||||
|
|
|
|||
|
|
@ -53,6 +53,13 @@ export default class DHClass extends BaseDataItem {
|
|||
};
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**@override */
|
||||
static DEFAULT_ICON = 'systems/daggerheart/assets/icons/documents/items/laurel-crown.svg';
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
get hopeFeatures() {
|
||||
return this.features.filter(x => x.type === CONFIG.DH.ITEM.featureSubTypes.hope).map(x => x.item);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,10 +13,15 @@ export default class DHCommunity extends BaseDataItem {
|
|||
|
||||
/** @inheritDoc */
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
return {
|
||||
...super.defineSchema(),
|
||||
features: new ForeignDocumentUUIDArrayField({ type: 'Item' })
|
||||
};
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**@override */
|
||||
static DEFAULT_ICON = 'systems/daggerheart/assets/icons/documents/items/village.svg';
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,4 +22,10 @@ export default class DHConsumable extends BaseDataItem {
|
|||
consumeOnUse: new fields.BooleanField({ initial: false })
|
||||
};
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**@override */
|
||||
static DEFAULT_ICON = 'systems/daggerheart/assets/icons/documents/items/round-potion.svg';
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,18 +33,26 @@ export default class DHDomainCard extends BaseDataItem {
|
|||
};
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**@override */
|
||||
static DEFAULT_ICON = 'systems/daggerheart/assets/icons/documents/items/card-play.svg';
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**@inheritdoc */
|
||||
async _preCreate(data, options, user) {
|
||||
const allowed = await super._preCreate(data, options, user);
|
||||
if (allowed === false) return;
|
||||
|
||||
if (this.actor?.type === 'character') {
|
||||
if (!this.actor.system.class.value) {
|
||||
const actorClasses = this.actor.items.filter(x => x.type === 'class');
|
||||
if (!actorClasses.length) {
|
||||
ui.notifications.error(game.i18n.localize('DAGGERHEART.UI.Notifications.noClassSelected'));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!this.actor.system.domains.find(x => x === this.domain)) {
|
||||
if (!actorClasses.some(c => c.system.domains.find(x => x === this.domain))) {
|
||||
ui.notifications.error(game.i18n.localize('DAGGERHEART.UI.Notifications.lacksDomain'));
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,6 +13,13 @@ export default class DHFeature extends BaseDataItem {
|
|||
});
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**@override */
|
||||
static DEFAULT_ICON = 'systems/daggerheart/assets/icons/documents/items/stars-stack.svg';
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/** @inheritDoc */
|
||||
static defineSchema() {
|
||||
const fields = foundry.data.fields;
|
||||
|
|
|
|||
|
|
@ -19,4 +19,11 @@ export default class DHLoot extends BaseDataItem {
|
|||
...super.defineSchema()
|
||||
};
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**@override */
|
||||
static DEFAULT_ICON = 'systems/daggerheart/assets/icons/documents/items/open-treasure-chest.svg';
|
||||
|
||||
/* -------------------------------------------- */
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,6 +29,13 @@ export default class DHSubclass extends BaseDataItem {
|
|||
};
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**@override */
|
||||
static DEFAULT_ICON = 'systems/daggerheart/assets/icons/documents/items/laurels.svg';
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
get foundationFeatures() {
|
||||
return this.features.filter(x => x.type === CONFIG.DH.ITEM.featureSubTypes.foundation).map(x => x.item);
|
||||
}
|
||||
|
|
@ -43,6 +50,7 @@ export default class DHSubclass extends BaseDataItem {
|
|||
|
||||
async _preCreate(data, options, user) {
|
||||
if (this.actor?.type === 'character') {
|
||||
const dataUuid = data.uuid ?? data._stats?.compendiumSource ?? `Item.${data._id}`;
|
||||
if (this.actor.system.class.subclass) {
|
||||
if (this.actor.system.multiclass.subclass) {
|
||||
ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.subclassesAlreadyPresent'));
|
||||
|
|
@ -54,7 +62,7 @@ export default class DHSubclass extends BaseDataItem {
|
|||
return false;
|
||||
}
|
||||
|
||||
if (multiclass.system.subclasses.every(x => x.uuid !== (data.uuid ?? `Item.${data._id}`))) {
|
||||
if (multiclass.system.subclasses.every(x => x.uuid !== dataUuid)) {
|
||||
ui.notifications.error(
|
||||
game.i18n.localize('DAGGERHEART.UI.Notifications.subclassNotInMulticlass')
|
||||
);
|
||||
|
|
@ -69,7 +77,7 @@ export default class DHSubclass extends BaseDataItem {
|
|||
ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.missingClass'));
|
||||
return false;
|
||||
}
|
||||
if (actorClass.system.subclasses.every(x => x.uuid !== (data.uuid ?? `Item.${data._id}`))) {
|
||||
if (actorClass.system.subclasses.every(x => x.uuid !== dataUuid)) {
|
||||
ui.notifications.error(game.i18n.localize('DAGGERHEART.UI.Notifications.subclassNotInClass'));
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -80,6 +80,13 @@ export default class DHWeapon extends AttachableItem {
|
|||
};
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**@override */
|
||||
static DEFAULT_ICON = 'systems/daggerheart/assets/icons/documents/items/battered-axe.svg';
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
get actionsList() {
|
||||
return [this.attack, ...this.actions];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,6 +34,17 @@ export default class DhAutomation extends foundry.abstract.DataModel {
|
|||
initial: true,
|
||||
label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.effects.rangeDependent.label'
|
||||
})
|
||||
}),
|
||||
damageReductionRulesDefault: new fields.StringField({
|
||||
required: true,
|
||||
choices: CONFIG.DH.GENERAL.ruleChoice,
|
||||
initial: CONFIG.DH.GENERAL.ruleChoice.onWithToggle.id,
|
||||
label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.damageReductionRulesDefault.label'
|
||||
}),
|
||||
resourceScrollTexts: new fields.BooleanField({
|
||||
required: true,
|
||||
initial: true,
|
||||
label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.resourceScrollTexts.label'
|
||||
})
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,3 +5,4 @@ export { default as DhActiveEffect } from './activeEffect.mjs';
|
|||
export { default as DhChatMessage } from './chatMessage.mjs';
|
||||
export { default as DhToken } from './token.mjs';
|
||||
export { default as DhTooltipManager } from './tooltipManager.mjs';
|
||||
export { default as DhTemplateManager } from './templateManager.mjs';
|
||||
|
|
|
|||
|
|
@ -147,4 +147,32 @@ export default class DhActiveEffect extends foundry.documents.ActiveEffect {
|
|||
|
||||
cls.create(msg);
|
||||
}
|
||||
|
||||
prepareDerivedData() {
|
||||
/* Preventing subclass features from transferring to actor if they do not have the right subclass advancement */
|
||||
if (this.parent?.type === 'feature') {
|
||||
const origSubclassParent = this.parent.system.originItemType === 'subclass';
|
||||
if (origSubclassParent) {
|
||||
const subclass = this.parent.parent.items.find(
|
||||
x =>
|
||||
x.type === 'subclass' &&
|
||||
x.system.isMulticlass === (this.parent.system.identifier === 'multiclass')
|
||||
);
|
||||
|
||||
if (subclass) {
|
||||
const featureState = subclass.system.featureState;
|
||||
const featureType = subclass
|
||||
? (subclass.system.features.find(x => x.item?.uuid === this.parent.uuid)?.type ?? null)
|
||||
: null;
|
||||
|
||||
if (
|
||||
(featureType === CONFIG.DH.ITEM.featureSubTypes.specialization && featureState < 2) ||
|
||||
(featureType === CONFIG.DH.ITEM.featureSubTypes.mastery && featureState < 3)
|
||||
) {
|
||||
this.transfer = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,6 +22,23 @@ export default class DhpActor extends Actor {
|
|||
return this.system.metadata.isNPC;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**@inheritdoc */
|
||||
static getDefaultArtwork(actorData) {
|
||||
const { type } = actorData;
|
||||
const Model = CONFIG.Actor.dataModels[type];
|
||||
const img = Model.DEFAULT_ICON ?? this.DEFAULT_ICON;
|
||||
return {
|
||||
img,
|
||||
texture: {
|
||||
src: img
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/** @inheritDoc */
|
||||
getEmbeddedDocument(embeddedName, id, options) {
|
||||
let doc;
|
||||
|
|
@ -39,6 +56,7 @@ export default class DhpActor extends Actor {
|
|||
return doc;
|
||||
}
|
||||
|
||||
/**@inheritdoc */
|
||||
async _preCreate(data, options, user) {
|
||||
if ((await super._preCreate(data, options, user)) === false) return false;
|
||||
|
||||
|
|
@ -455,6 +473,7 @@ export default class DhpActor extends Actor {
|
|||
return ActiveEffect.implementation.create(effect, { parent: this, keepId: true });
|
||||
}
|
||||
|
||||
/**@inheritdoc */
|
||||
getRollData() {
|
||||
const rollData = super.getRollData();
|
||||
rollData.system = this.system.getRollData();
|
||||
|
|
@ -464,14 +483,17 @@ export default class DhpActor extends Actor {
|
|||
}
|
||||
|
||||
#canReduceDamage(hpDamage, type) {
|
||||
const { stressDamageReduction, disabledArmor } = this.system.rules.damageReduction;
|
||||
if (disabledArmor) return false;
|
||||
|
||||
const availableStress = this.system.resources.stress.max - this.system.resources.stress.value;
|
||||
|
||||
const canUseArmor =
|
||||
this.system.armor &&
|
||||
this.system.armor.system.marks.value < this.system.armorScore &&
|
||||
type.every(t => this.system.armorApplicableDamageTypes[t] === true);
|
||||
const canUseStress = Object.keys(this.system.rules.damageReduction.stressDamageReduction).reduce((acc, x) => {
|
||||
const rule = this.system.rules.damageReduction.stressDamageReduction[x];
|
||||
const canUseStress = Object.keys(stressDamageReduction).reduce((acc, x) => {
|
||||
const rule = stressDamageReduction[x];
|
||||
if (damageKeyToNumber(x) <= hpDamage) return acc || (rule.enabled && availableStress >= rule.cost);
|
||||
return acc;
|
||||
}, false);
|
||||
|
|
|
|||
|
|
@ -40,6 +40,8 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage {
|
|||
elements.forEach(e => {
|
||||
const uuid = e.dataset.permId,
|
||||
document = fromUuidSync(uuid);
|
||||
if (!document) return;
|
||||
|
||||
e.setAttribute('data-view-perm', document.testUserPermission(game.user, 'OBSERVER'));
|
||||
e.setAttribute('data-use-perm', document.testUserPermission(game.user, 'OWNER'));
|
||||
});
|
||||
|
|
@ -68,7 +70,7 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage {
|
|||
|
||||
getTargetList() {
|
||||
const targets = this.system.hitTargets;
|
||||
return targets.map(target => game.canvas.tokens.documentCollection.find(t => t.actor.uuid === target.actorId));
|
||||
return targets.map(target => game.canvas.tokens.documentCollection.find(t => t.actor?.uuid === target.actorId));
|
||||
}
|
||||
|
||||
async onDamage(event) {
|
||||
|
|
@ -139,9 +141,9 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage {
|
|||
}
|
||||
|
||||
consumeOnSuccess() {
|
||||
if(!this.system.successConsumed && !this.system.targetSelection) {
|
||||
if (!this.system.successConsumed && !this.system.targetSelection) {
|
||||
const action = this.system.action;
|
||||
if(action) action.consume(this.system, true);
|
||||
if (action) action.consume(this.system, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -112,12 +112,25 @@ export default class DHItem extends foundry.documents.Item {
|
|||
* Generate a localized label array for this item.
|
||||
* @returns {(string | { value: string, icons: string[] })[]} An array of localized strings and damage label objects.
|
||||
*/
|
||||
getLabels() {
|
||||
_getLabels() {
|
||||
const labels = [];
|
||||
if (this.system.getLabels) labels.push(...this.system.getLabels());
|
||||
if (this.system._getLabels) labels.push(...this.system._getLabels());
|
||||
return labels;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**@inheritdoc */
|
||||
static getDefaultArtwork(itemData) {
|
||||
const { type } = itemData;
|
||||
const Model = CONFIG.Item.dataModels[type];
|
||||
const img = Model.DEFAULT_ICON ?? this.DEFAULT_ICON;
|
||||
return { img };
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
|
||||
async use(event) {
|
||||
const actions = new Set(this.system.actionsList);
|
||||
if (actions?.size) {
|
||||
|
|
|
|||
99
module/documents/templateManager.mjs
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
/**
|
||||
* A singleton class that handles preview templates.
|
||||
*/
|
||||
|
||||
export default class DhTemplateManager {
|
||||
#activePreview;
|
||||
|
||||
/**
|
||||
* Create a template preview, deactivating any existing ones.
|
||||
* @param {object} data
|
||||
*/
|
||||
async createPreview(data) {
|
||||
const template = await canvas.templates._createPreview(data, { renderSheet: false });
|
||||
|
||||
this.#activePreview = {
|
||||
document: template.document,
|
||||
object: template,
|
||||
origin: { x: template.document.x, y: template.document.y }
|
||||
};
|
||||
|
||||
this.#activePreview.events = {
|
||||
contextmenu: this.#cancelTemplate.bind(this),
|
||||
mousedown: this.#confirmTemplate.bind(this),
|
||||
mousemove: this.#onDragMouseMove.bind(this),
|
||||
wheel: this.#onMouseWheel.bind(this)
|
||||
};
|
||||
canvas.stage.on('mousemove', this.#activePreview.events.mousemove);
|
||||
canvas.stage.on('mousedown', this.#activePreview.events.mousedown);
|
||||
|
||||
canvas.app.view.addEventListener('wheel', this.#activePreview.events.wheel, true);
|
||||
canvas.app.view.addEventListener('contextmenu', this.#activePreview.events.contextmenu);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the movement of the temlate preview on mousedrag.
|
||||
* @param {mousemove Event} event
|
||||
*/
|
||||
#onDragMouseMove(event) {
|
||||
event.stopPropagation();
|
||||
const { moveTime, object } = this.#activePreview;
|
||||
const update = {};
|
||||
|
||||
const now = Date.now();
|
||||
if (now - (moveTime || 0) <= 16) return;
|
||||
this.#activePreview.moveTime = now;
|
||||
|
||||
let cursor = event.getLocalPosition(canvas.templates);
|
||||
|
||||
Object.assign(update, canvas.grid.getCenterPoint(cursor));
|
||||
|
||||
object.document.updateSource(update);
|
||||
object.renderFlags.set({ refresh: true });
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the rotation of the preview template on scrolling.
|
||||
* @param {wheel Event} event
|
||||
*/
|
||||
#onMouseWheel(event) {
|
||||
if (!event.shiftKey) return;
|
||||
event.stopPropagation();
|
||||
event.preventDefault();
|
||||
const { moveTime, object } = this.#activePreview;
|
||||
|
||||
const now = Date.now();
|
||||
if (now - (moveTime || 0) <= 16) return;
|
||||
this.#activePreview.moveTime = now;
|
||||
|
||||
object.document.updateSource({
|
||||
direction: object.document.direction + event.deltaY * 0.2
|
||||
});
|
||||
object.renderFlags.set({ refresh: true });
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancels the preview template on right-click.
|
||||
* @param {contextmenu Event} event
|
||||
*/
|
||||
#cancelTemplate(event) {
|
||||
const { mousemove, mousedown, contextmenu } = this.#activePreview.events;
|
||||
canvas.templates._onDragLeftCancel(event);
|
||||
|
||||
canvas.stage.off('mousemove', mousemove);
|
||||
canvas.stage.off('mousedown', mousedown);
|
||||
canvas.app.view.removeEventListener('contextmenu', contextmenu);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a real MeasuredTemplate at the preview location and cancels the preview.
|
||||
* @param {click Event} event
|
||||
*/
|
||||
#confirmTemplate(event) {
|
||||
event.stopPropagation();
|
||||
|
||||
canvas.scene.createEmbeddedDocuments('MeasuredTemplate', [this.#activePreview.document.toObject()]);
|
||||
|
||||
this.#cancelTemplate(event);
|
||||
}
|
||||
}
|
||||
|
|
@ -59,14 +59,14 @@ export const renderMeasuredTemplate = async event => {
|
|||
const distance = type === CONFIG.DH.GENERAL.templateTypes.EMANATION ? baseDistance + 2.5 : baseDistance;
|
||||
|
||||
const { width, height } = game.canvas.scene.dimensions;
|
||||
canvas.scene.createEmbeddedDocuments('MeasuredTemplate', [
|
||||
{
|
||||
const data = {
|
||||
x: width / 2,
|
||||
y: height / 2,
|
||||
t: usedType,
|
||||
distance: distance,
|
||||
width: type === CONST.MEASURED_TEMPLATE_TYPES.RAY ? 5 : undefined,
|
||||
angle: angle
|
||||
}
|
||||
]);
|
||||
};
|
||||
|
||||
CONFIG.ux.TemplateManager.createPreview(data);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -324,3 +324,48 @@ export const arraysEqual = (a, b) =>
|
|||
[...new Set([...a, ...b])].every(v => a.filter(e => e === v).length === b.filter(e => e === v).length);
|
||||
|
||||
export const setsEqual = (a, b) => a.size === b.size && [...a].every(value => b.has(value));
|
||||
|
||||
export function getScrollTextData(resources, resource, key) {
|
||||
const { reversed, label } = CONFIG.DH.ACTOR.scrollingTextResource[key];
|
||||
const { BOTTOM, TOP } = CONST.TEXT_ANCHOR_POINTS;
|
||||
const increased = resources[key].value < resource.value;
|
||||
const value = -1 * (resources[key].value - resource.value);
|
||||
|
||||
const text = `${game.i18n.localize(label)} ${value.signedString()}`;
|
||||
|
||||
const stroke = increased ? (reversed ? 0xffffff : 0x000000) : reversed ? 0x000000 : 0xffffff;
|
||||
const fill = increased ? (reversed ? 0x0032b1 : 0xffe760) : reversed ? 0xffe760 : 0x0032b1;
|
||||
const direction = increased ? (reversed ? BOTTOM : TOP) : reversed ? TOP : BOTTOM;
|
||||
|
||||
return { text, stroke, fill, direction };
|
||||
}
|
||||
|
||||
export function createScrollText(actor, optionsData) {
|
||||
if (actor && optionsData?.length) {
|
||||
actor.getDependentTokens().forEach(token => {
|
||||
optionsData.forEach(data => {
|
||||
const { text, ...options } = data;
|
||||
canvas.interface.createScrollingText(token.getCenterPoint(), data.text, {
|
||||
duration: 2000,
|
||||
distance: token.h,
|
||||
jitter: 0,
|
||||
...options
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export async function createEmbeddedItemWithEffects(actor, baseData, update) {
|
||||
const data = baseData.uuid.startsWith('Compendium') ? await foundry.utils.fromUuid(baseData.uuid) : baseData;
|
||||
const [doc] = await actor.createEmbeddedDocuments('Item', [
|
||||
{
|
||||
...(update ?? data),
|
||||
id: data.id,
|
||||
uuid: data.uuid,
|
||||
effects: data.effects?.map(effect => effect.toObject())
|
||||
}
|
||||
]);
|
||||
|
||||
return doc;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -490,7 +490,7 @@
|
|||
"dice": "d6",
|
||||
"bonus": null
|
||||
},
|
||||
"applyTo": "armorSlot",
|
||||
"applyTo": "armor",
|
||||
"base": false,
|
||||
"resultBased": false,
|
||||
"valueAlt": {
|
||||
|
|
|
|||
|
|
@ -255,7 +255,7 @@
|
|||
"dice": "d6",
|
||||
"bonus": null
|
||||
},
|
||||
"applyTo": "armorSlot",
|
||||
"applyTo": "armor",
|
||||
"base": false,
|
||||
"resultBased": false,
|
||||
"valueAlt": {
|
||||
|
|
|
|||
|
|
@ -291,7 +291,7 @@
|
|||
"dice": "d6",
|
||||
"bonus": null
|
||||
},
|
||||
"applyTo": "armorSlot",
|
||||
"applyTo": "armor",
|
||||
"type": [],
|
||||
"base": false,
|
||||
"resultBased": false,
|
||||
|
|
|
|||
|
|
@ -298,7 +298,7 @@
|
|||
"dice": "d6",
|
||||
"bonus": null
|
||||
},
|
||||
"applyTo": "armorSlot",
|
||||
"applyTo": "armor",
|
||||
"base": false,
|
||||
"resultBased": false,
|
||||
"valueAlt": {
|
||||
|
|
|
|||
|
|
@ -296,7 +296,7 @@
|
|||
"dice": "d6",
|
||||
"bonus": null
|
||||
},
|
||||
"applyTo": "armorSlot",
|
||||
"applyTo": "armor",
|
||||
"type": [],
|
||||
"base": false,
|
||||
"resultBased": false,
|
||||
|
|
|
|||
|
|
@ -365,7 +365,7 @@
|
|||
"dice": "d6",
|
||||
"bonus": null
|
||||
},
|
||||
"applyTo": "armorSlot",
|
||||
"applyTo": "armor",
|
||||
"base": false,
|
||||
"resultBased": false,
|
||||
"valueAlt": {
|
||||
|
|
|
|||
|
|
@ -250,7 +250,7 @@
|
|||
"dice": "d6",
|
||||
"bonus": null
|
||||
},
|
||||
"applyTo": "armorSlot",
|
||||
"applyTo": "armor",
|
||||
"type": [],
|
||||
"base": false,
|
||||
"resultBased": false,
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@
|
|||
},
|
||||
"changes": [
|
||||
{
|
||||
"key": "system.resources.hitPoints.value",
|
||||
"key": "system.resources.hitPoints.max",
|
||||
"mode": 2,
|
||||
"value": "1",
|
||||
"priority": null
|
||||
|
|
@ -59,7 +59,7 @@
|
|||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1753996768847,
|
||||
"modifiedTime": 1753999765864,
|
||||
"modifiedTime": 1754310930764,
|
||||
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||
},
|
||||
"_key": "!items.effects!tXWEMdLXafUSZTbK.db8W2Q0Qty84XV0x"
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@
|
|||
},
|
||||
"changes": [
|
||||
{
|
||||
"key": "system.resources.stress.value",
|
||||
"key": "system.resources.stress.max",
|
||||
"mode": 2,
|
||||
"value": "1",
|
||||
"priority": null
|
||||
|
|
@ -59,7 +59,7 @@
|
|||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1753997348303,
|
||||
"modifiedTime": 1753999779490,
|
||||
"modifiedTime": 1754310946414,
|
||||
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||
},
|
||||
"_key": "!items.effects!HMXNJZ7ynzajR2KT.Xl3TsKUJcl6vi1ly"
|
||||
|
|
|
|||
|
|
@ -74,10 +74,10 @@
|
|||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754174600538,
|
||||
"modifiedTime": 1754234842298,
|
||||
"modifiedTime": 1754325498779,
|
||||
"lastModifiedBy": "LgnbNMLaxandgMQq"
|
||||
},
|
||||
"_id": "vegl3bFOq3pcFTWT",
|
||||
"sort": 0,
|
||||
"sort": 300000,
|
||||
"_key": "!items!vegl3bFOq3pcFTWT"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@
|
|||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
"sort": 100000,
|
||||
"sort": 600000,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"LgnbNMLaxandgMQq": 3
|
||||
|
|
@ -76,7 +76,7 @@
|
|||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754222247012,
|
||||
"modifiedTime": 1754246226799,
|
||||
"modifiedTime": 1754325498779,
|
||||
"lastModifiedBy": "LgnbNMLaxandgMQq"
|
||||
},
|
||||
"_key": "!items!ZNwUTCyGCEcidZFv"
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@
|
|||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
"sort": 200000,
|
||||
"sort": 700000,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"LgnbNMLaxandgMQq": 3
|
||||
|
|
@ -72,7 +72,7 @@
|
|||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754246931974,
|
||||
"modifiedTime": 1754247171296,
|
||||
"modifiedTime": 1754325498779,
|
||||
"lastModifiedBy": "LgnbNMLaxandgMQq"
|
||||
},
|
||||
"_key": "!items!nRAyoC0fOzXPDa4z"
|
||||
|
|
|
|||
79
src/packs/classes/class_Ranger_BTyfve69LKqoOi9S.json
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
{
|
||||
"name": "Ranger",
|
||||
"type": "class",
|
||||
"_id": "BTyfve69LKqoOi9S",
|
||||
"img": "icons/weapons/bows/shortbow-recurve-yellow-blue.webp",
|
||||
"system": {
|
||||
"description": "<p>Rangers are highly skilled hunters who, despite their martial abilities, rarely lend their skills to an army. Through mastery of the body and a deep understanding of the wilderness, rangers become sly tacticians, pursuing their quarry with cunning and patience. Many rangers track and fight alongside an animal companion with whom they’ve forged a powerful spiritual bond. By honing their skills in the wild, rangers become expert trackers, as likely to ensnare their foes in a trap as they are to assail them head-on.</p>",
|
||||
"domains": [
|
||||
"bone",
|
||||
"sage"
|
||||
],
|
||||
"classItems": [],
|
||||
"hitPoints": 6,
|
||||
"evasion": 12,
|
||||
"features": [
|
||||
{
|
||||
"type": "hope",
|
||||
"item": "Compendium.daggerheart.classes.Item.2Cyb9ZeuAesf5Sb3"
|
||||
},
|
||||
{
|
||||
"type": "class",
|
||||
"item": "Compendium.daggerheart.classes.Item.ncLx2P8BOUtrAD38"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
"Compendium.daggerheart.subclasses.Item.TIUsIlTS1WkK5vr2",
|
||||
"Compendium.daggerheart.subclasses.Item.zsUglcU4NgZ8tNgZ"
|
||||
],
|
||||
"inventory": {
|
||||
"take": [
|
||||
"Compendium.daggerheart.classes.Item.hMST9iizQP1yz0MG",
|
||||
"Compendium.daggerheart.classes.Item.uoG5iq09mxJPXfmk",
|
||||
"Compendium.daggerheart.classes.Item.zqeXrJTd1geX73Pw"
|
||||
],
|
||||
"choiceA": [
|
||||
"Compendium.daggerheart.consumables.Item.tPfKtKRRjv8qdSqy",
|
||||
"Compendium.daggerheart.consumables.Item.b6vGSPFWOlzZZDLO"
|
||||
],
|
||||
"choiceB": [
|
||||
"Compendium.daggerheart.classes.Item.eslejbiZRH6ODh9U",
|
||||
"Compendium.daggerheart.classes.Item.8k76EgktQXFWHf8r"
|
||||
]
|
||||
},
|
||||
"characterGuide": {
|
||||
"suggestedTraits": {
|
||||
"agility": 2,
|
||||
"strength": 0,
|
||||
"finesse": 1,
|
||||
"instinct": 1,
|
||||
"presence": -1,
|
||||
"knowledge": 0
|
||||
},
|
||||
"suggestedPrimaryWeapon": "Compendium.daggerheart.weapons.Item.p9tdjQr2AZP19RYm",
|
||||
"suggestedSecondaryWeapon": null,
|
||||
"suggestedArmor": "Compendium.daggerheart.armors.Item.nibfdNtp2PtxvbVz"
|
||||
},
|
||||
"isMulticlass": false
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
"sort": 712500,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"LgnbNMLaxandgMQq": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.346",
|
||||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754268869310,
|
||||
"modifiedTime": 1754325517617,
|
||||
"lastModifiedBy": "LgnbNMLaxandgMQq"
|
||||
},
|
||||
"_key": "!items!BTyfve69LKqoOi9S"
|
||||
}
|
||||
83
src/packs/classes/class_Rogue_CvHlkHZfpMiCz5uT.json
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
{
|
||||
"name": "Rogue",
|
||||
"type": "class",
|
||||
"_id": "CvHlkHZfpMiCz5uT",
|
||||
"img": "icons/magic/defensive/shield-barrier-blades-teal.webp",
|
||||
"system": {
|
||||
"description": "<p>Rogues are scoundrels, often in both attitude and practice. Broadly known as liars and thieves, the best among this class move through the world anonymously. Utilizing their sharp wits and blades, rogues trick their foes through social manipulation as easily as breaking locks, climbing through windows, or dealing underhanded blows. These masters of magical craft manipulate shadow and movement, adding an array of useful and deadly tools to their repertoire. Rogues frequently establish guilds to meet future accomplices, hire out jobs, and hone secret skills, proving that there’s honor among thieves for those who know where to look.</p>",
|
||||
"domains": [
|
||||
"midnight",
|
||||
"grace"
|
||||
],
|
||||
"classItems": [],
|
||||
"hitPoints": 6,
|
||||
"evasion": 12,
|
||||
"features": [
|
||||
{
|
||||
"type": "hope",
|
||||
"item": "Compendium.daggerheart.classes.Item.hVaaPIjxoextIgSL"
|
||||
},
|
||||
{
|
||||
"type": "class",
|
||||
"item": "Compendium.daggerheart.classes.Item.5IT8wYa0m1EFw8Zp"
|
||||
},
|
||||
{
|
||||
"type": "class",
|
||||
"item": "Compendium.daggerheart.classes.Item.5QqpEwmwkPfZHpMW"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
"Compendium.daggerheart.subclasses.Item.h161OSIK24Up4qNd",
|
||||
"Compendium.daggerheart.subclasses.Item.95QxNZwgyEm1LqdG"
|
||||
],
|
||||
"inventory": {
|
||||
"take": [
|
||||
"Compendium.daggerheart.classes.Item.hMST9iizQP1yz0MG",
|
||||
"Compendium.daggerheart.classes.Item.uoG5iq09mxJPXfmk",
|
||||
"Compendium.daggerheart.classes.Item.zqeXrJTd1geX73Pw"
|
||||
],
|
||||
"choiceA": [
|
||||
"Compendium.daggerheart.consumables.Item.tPfKtKRRjv8qdSqy",
|
||||
"Compendium.daggerheart.consumables.Item.b6vGSPFWOlzZZDLO"
|
||||
],
|
||||
"choiceB": [
|
||||
"Compendium.daggerheart.classes.Item.yqoO5aqDd4aD13pc",
|
||||
"Compendium.daggerheart.classes.Item.J1c708r5L9TYckER"
|
||||
]
|
||||
},
|
||||
"characterGuide": {
|
||||
"suggestedTraits": {
|
||||
"agility": 1,
|
||||
"strength": -1,
|
||||
"finesse": 0,
|
||||
"instinct": 2,
|
||||
"presence": 1,
|
||||
"knowledge": 0
|
||||
},
|
||||
"suggestedPrimaryWeapon": "Compendium.daggerheart.weapons.Item.iStO0BbeMTTR0rQi",
|
||||
"suggestedSecondaryWeapon": "Compendium.daggerheart.weapons.Item.wKklDxs5nkzILNp4",
|
||||
"suggestedArmor": "Compendium.daggerheart.armors.Item.yJFp1bfpecDcStVK"
|
||||
},
|
||||
"isMulticlass": false
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
"sort": 725000,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"LgnbNMLaxandgMQq": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.346",
|
||||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754325275832,
|
||||
"modifiedTime": 1754325686143,
|
||||
"lastModifiedBy": "LgnbNMLaxandgMQq"
|
||||
},
|
||||
"_key": "!items!CvHlkHZfpMiCz5uT"
|
||||
}
|
||||
79
src/packs/classes/class_Seraph_5ZnlJ5bEoyOTkUJv.json
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
{
|
||||
"name": "Seraph",
|
||||
"type": "class",
|
||||
"_id": "5ZnlJ5bEoyOTkUJv",
|
||||
"img": "icons/magic/holy/barrier-shield-winged-cross.webp",
|
||||
"system": {
|
||||
"description": "<p>Seraphs are divine fighters and healers imbued with sacred purpose. A wide array of deities exist within the realms, and thus numerous kinds of seraphs are appointed by these gods. Their ethos traditionally aligns with the domain or goals of their god, such as defending the weak, exacting vengeance, protecting a land or artifact, or upholding a particular faith. Some seraphs ally themselves with an army or locale, much to the satisfaction of their rulers, but other crusaders fight in opposition to the follies of the Mortal Realm. It is better to be a seraph’s ally than their enemy, as they are terrifying foes to those who defy their purpose.</p>",
|
||||
"domains": [
|
||||
"valor",
|
||||
"splendor"
|
||||
],
|
||||
"classItems": [],
|
||||
"hitPoints": 7,
|
||||
"evasion": 9,
|
||||
"features": [
|
||||
{
|
||||
"type": "hope",
|
||||
"item": "Compendium.daggerheart.classes.Item.lSlvSUHbOoX36q2j"
|
||||
},
|
||||
{
|
||||
"type": "class",
|
||||
"item": "Compendium.daggerheart.classes.Item.Xd7RYhfTxIj9aWI2"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
"Compendium.daggerheart.subclasses.Item.M5mpGoAj8LRkylrY",
|
||||
"Compendium.daggerheart.subclasses.Item.y7ERWRIpJsdP9Re4"
|
||||
],
|
||||
"inventory": {
|
||||
"take": [
|
||||
"Compendium.daggerheart.classes.Item.hMST9iizQP1yz0MG",
|
||||
"Compendium.daggerheart.classes.Item.uoG5iq09mxJPXfmk",
|
||||
"Compendium.daggerheart.classes.Item.zqeXrJTd1geX73Pw"
|
||||
],
|
||||
"choiceA": [
|
||||
"Compendium.daggerheart.consumables.Item.tPfKtKRRjv8qdSqy",
|
||||
"Compendium.daggerheart.consumables.Item.b6vGSPFWOlzZZDLO"
|
||||
],
|
||||
"choiceB": [
|
||||
"Compendium.daggerheart.classes.Item.aLvek22hb5kNg9MF",
|
||||
"Compendium.daggerheart.classes.Item.o3G6szWvPoz7fo6T"
|
||||
]
|
||||
},
|
||||
"characterGuide": {
|
||||
"suggestedTraits": {
|
||||
"agility": 0,
|
||||
"strength": 2,
|
||||
"finesse": 0,
|
||||
"instinct": 1,
|
||||
"presence": 1,
|
||||
"knowledge": -1
|
||||
},
|
||||
"suggestedPrimaryWeapon": "Compendium.daggerheart.weapons.Item.Vayg7CnRTFBrunjM",
|
||||
"suggestedSecondaryWeapon": "Compendium.daggerheart.weapons.Item.mxwWKDujgsRcZWPT",
|
||||
"suggestedArmor": "Compendium.daggerheart.armors.Item.haULhuEg37zUUvhb"
|
||||
},
|
||||
"isMulticlass": false
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"Q9NoTaEarn3VMS6Z": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.346",
|
||||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754351482530,
|
||||
"modifiedTime": 1754355938087,
|
||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
||||
},
|
||||
"_key": "!items!5ZnlJ5bEoyOTkUJv"
|
||||
}
|
||||
87
src/packs/classes/class_Sorcerer_DchOzHcWIJE9FKcR.json
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
{
|
||||
"name": "Sorcerer",
|
||||
"type": "class",
|
||||
"_id": "DchOzHcWIJE9FKcR",
|
||||
"img": "icons/magic/symbols/rune-sigil-horned-white-purple.webp",
|
||||
"system": {
|
||||
"description": "<p>Not all innate magic users choose to hone their craft, but those who do can become powerful sorcerers. The gifts of these wielders are passed down through families, even if the family is unaware of or reluctant to practice them. A sorcerer’s abilities can range from the elemental to the illusionary and beyond, and many practitioners band together into collectives based on their talents. The act of becoming a formidable sorcerer is not the practice of acquiring power, but learning to cultivate and control the power one already possesses. The magic of a misguided or undisciplined sorcerer is a dangerous</p><p>force indeed.</p>",
|
||||
"domains": [
|
||||
"arcana",
|
||||
"midnight"
|
||||
],
|
||||
"classItems": [],
|
||||
"hitPoints": 6,
|
||||
"evasion": 10,
|
||||
"features": [
|
||||
{
|
||||
"type": "hope",
|
||||
"item": "Compendium.daggerheart.classes.Item.ieiQlD0joWSqt53D"
|
||||
},
|
||||
{
|
||||
"type": "class",
|
||||
"item": "Compendium.daggerheart.classes.Item.CHK32dfCTTyuxV1A"
|
||||
},
|
||||
{
|
||||
"type": "class",
|
||||
"item": "Compendium.daggerheart.classes.Item.cshTYdtz9yoXYYB3"
|
||||
},
|
||||
{
|
||||
"type": "class",
|
||||
"item": "Compendium.daggerheart.classes.Item.P02cbN50LIoD662z"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
"Compendium.daggerheart.subclasses.Item.wg1H0hROc2acHwZh",
|
||||
"Compendium.daggerheart.subclasses.Item.GLpRVxnY5E82khxH"
|
||||
],
|
||||
"inventory": {
|
||||
"take": [
|
||||
"Compendium.daggerheart.classes.Item.hMST9iizQP1yz0MG",
|
||||
"Compendium.daggerheart.classes.Item.uoG5iq09mxJPXfmk",
|
||||
"Compendium.daggerheart.classes.Item.zqeXrJTd1geX73Pw"
|
||||
],
|
||||
"choiceA": [
|
||||
"Compendium.daggerheart.consumables.Item.tPfKtKRRjv8qdSqy",
|
||||
"Compendium.daggerheart.consumables.Item.b6vGSPFWOlzZZDLO"
|
||||
],
|
||||
"choiceB": [
|
||||
"Compendium.daggerheart.classes.Item.Yum0uBtnEtTBcpax",
|
||||
"Compendium.daggerheart.classes.Item.9AM1YsPeuWSysdDo"
|
||||
]
|
||||
},
|
||||
"characterGuide": {
|
||||
"suggestedTraits": {
|
||||
"agility": 0,
|
||||
"strength": -1,
|
||||
"finesse": 1,
|
||||
"instinct": 2,
|
||||
"presence": 1,
|
||||
"knowledge": 0
|
||||
},
|
||||
"suggestedPrimaryWeapon": "Compendium.daggerheart.weapons.Item.j8cdNeIUYxxzFVji",
|
||||
"suggestedSecondaryWeapon": null,
|
||||
"suggestedArmor": "Compendium.daggerheart.armors.Item.yJFp1bfpecDcStVK"
|
||||
},
|
||||
"isMulticlass": false
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"Q9NoTaEarn3VMS6Z": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.346",
|
||||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754349743129,
|
||||
"modifiedTime": 1754350005553,
|
||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
||||
},
|
||||
"_key": "!items!DchOzHcWIJE9FKcR"
|
||||
}
|
||||
83
src/packs/classes/class_Warrior_xCUWwJz4WSthvLfy.json
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
{
|
||||
"name": "Warrior",
|
||||
"type": "class",
|
||||
"_id": "xCUWwJz4WSthvLfy",
|
||||
"img": "icons/weapons/swords/sword-broad-crystal-paired.webp",
|
||||
"system": {
|
||||
"description": "<p>Becoming a warrior requires years, often a lifetime, of training and dedication to the mastery of weapons and violence. While many who seek to fight hone only their strength, warriors understand the importance of an agile body and mind, making them some of the most sought-after fighters across the realms. Frequently, warriors find employment within an army, a band of mercenaries, or even a royal guard, but their potential is wasted in any position where they cannot continue to improve and expand their skills. Warriors are known to have a favored weapon; to come between them and their blade would be a grievous mistake.</p>",
|
||||
"domains": [
|
||||
"blade",
|
||||
"bone"
|
||||
],
|
||||
"classItems": [],
|
||||
"hitPoints": 6,
|
||||
"evasion": 11,
|
||||
"features": [
|
||||
{
|
||||
"type": "hope",
|
||||
"item": "Compendium.daggerheart.classes.Item.njj2C3tMDeCHHOoh"
|
||||
},
|
||||
{
|
||||
"type": "class",
|
||||
"item": "Compendium.daggerheart.classes.Item.3hNVqD1c0VIw2Nj5"
|
||||
},
|
||||
{
|
||||
"type": "class",
|
||||
"item": "Compendium.daggerheart.classes.Item.eoSmuAJmgHUyULtp"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
"Compendium.daggerheart.subclasses.Item.NAFU9roaVG7f3RNJ",
|
||||
"Compendium.daggerheart.subclasses.Item.bcNe5qP3o6CKadhK"
|
||||
],
|
||||
"inventory": {
|
||||
"take": [
|
||||
"Compendium.daggerheart.classes.Item.zqeXrJTd1geX73Pw",
|
||||
"Compendium.daggerheart.classes.Item.hMST9iizQP1yz0MG",
|
||||
"Compendium.daggerheart.classes.Item.uoG5iq09mxJPXfmk"
|
||||
],
|
||||
"choiceA": [
|
||||
"Compendium.daggerheart.consumables.Item.tPfKtKRRjv8qdSqy",
|
||||
"Compendium.daggerheart.consumables.Item.b6vGSPFWOlzZZDLO"
|
||||
],
|
||||
"choiceB": [
|
||||
"Compendium.daggerheart.classes.Item.KuPuEAbUK4VKpS2O",
|
||||
"Compendium.daggerheart.classes.Item.LoQH7wpfyKsuMJ5l"
|
||||
]
|
||||
},
|
||||
"characterGuide": {
|
||||
"suggestedTraits": {
|
||||
"agility": 2,
|
||||
"strength": 1,
|
||||
"finesse": 0,
|
||||
"instinct": 1,
|
||||
"presence": -1,
|
||||
"knowledge": 0
|
||||
},
|
||||
"suggestedPrimaryWeapon": "Compendium.daggerheart.weapons.Item.Iv8BZM1R24QMT72M",
|
||||
"suggestedSecondaryWeapon": null,
|
||||
"suggestedArmor": "Compendium.daggerheart.armors.Item.haULhuEg37zUUvhb"
|
||||
},
|
||||
"isMulticlass": false
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
"sort": 750000,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"MQSznptE5yLT7kj8": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.346",
|
||||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754255776706,
|
||||
"modifiedTime": 1754325510730,
|
||||
"lastModifiedBy": "LgnbNMLaxandgMQq"
|
||||
},
|
||||
"_key": "!items!xCUWwJz4WSthvLfy"
|
||||
}
|
||||
83
src/packs/classes/class_Wizard_5LwX4m8ziY3F1ZGC.json
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
{
|
||||
"name": "Wizard",
|
||||
"type": "class",
|
||||
"_id": "5LwX4m8ziY3F1ZGC",
|
||||
"img": "icons/magic/symbols/circled-gem-pink.webp",
|
||||
"system": {
|
||||
"description": "<p>Whether through an institution or individual study, those known as wizards acquire and hone immense magical power over years of learning using a variety of tools, including books, stones, potions, and herbs. Some wizards dedicate their lives to mastering a particular school of magic, while others learn from a wide variety of disciplines. Many wizards become wise and powerful figures in their communities, advising rulers, providing medicines and healing, and even leading war councils. While these mages all work toward the common goal of collecting magical knowledge, wizards often have the most conflict within their own ranks, as the acquisition, keeping, and sharing of powerful secrets is a topic of intense debate that has resulted in innumerable deaths.</p>",
|
||||
"domains": [
|
||||
"codex",
|
||||
"splendor"
|
||||
],
|
||||
"classItems": [],
|
||||
"hitPoints": 5,
|
||||
"evasion": 11,
|
||||
"features": [
|
||||
{
|
||||
"type": "hope",
|
||||
"item": "Compendium.daggerheart.classes.Item.h3VE0jhcM5xHKBs4"
|
||||
},
|
||||
{
|
||||
"type": "class",
|
||||
"item": "Compendium.daggerheart.classes.Item.SG2uw8h5YuwDviCn"
|
||||
},
|
||||
{
|
||||
"type": "class",
|
||||
"item": "Compendium.daggerheart.classes.Item.6YsfFjmCGuFYVhT4"
|
||||
}
|
||||
],
|
||||
"subclasses": [
|
||||
"Compendium.daggerheart.subclasses.Item.qqQlgCqhOivUFoQn",
|
||||
"Compendium.daggerheart.subclasses.Item.4y9Ph7RsCIAbkwTk"
|
||||
],
|
||||
"inventory": {
|
||||
"take": [
|
||||
"Compendium.daggerheart.classes.Item.zqeXrJTd1geX73Pw",
|
||||
"Compendium.daggerheart.classes.Item.hMST9iizQP1yz0MG",
|
||||
"Compendium.daggerheart.classes.Item.uoG5iq09mxJPXfmk"
|
||||
],
|
||||
"choiceA": [
|
||||
"Compendium.daggerheart.consumables.Item.tPfKtKRRjv8qdSqy",
|
||||
"Compendium.daggerheart.consumables.Item.b6vGSPFWOlzZZDLO"
|
||||
],
|
||||
"choiceB": [
|
||||
"Compendium.daggerheart.classes.Item.fhg3NK99tcgYQxdY",
|
||||
"Compendium.daggerheart.classes.Item.UUp0YGFj7E4x7Z6Z"
|
||||
]
|
||||
},
|
||||
"characterGuide": {
|
||||
"suggestedTraits": {
|
||||
"agility": -1,
|
||||
"strength": 0,
|
||||
"finesse": 0,
|
||||
"instinct": 1,
|
||||
"presence": 1,
|
||||
"knowledge": 2
|
||||
},
|
||||
"suggestedPrimaryWeapon": "Compendium.daggerheart.weapons.Item.Yk8pTEmyLLi4095S",
|
||||
"suggestedSecondaryWeapon": null,
|
||||
"suggestedArmor": "Compendium.daggerheart.armors.Item.nibfdNtp2PtxvbVz"
|
||||
},
|
||||
"isMulticlass": false
|
||||
},
|
||||
"effects": [],
|
||||
"folder": null,
|
||||
"sort": 800000,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"MQSznptE5yLT7kj8": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.346",
|
||||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754253505323,
|
||||
"modifiedTime": 1754325500455,
|
||||
"lastModifiedBy": "LgnbNMLaxandgMQq"
|
||||
},
|
||||
"_key": "!items!5LwX4m8ziY3F1ZGC"
|
||||
}
|
||||
33
src/packs/classes/feature_Arcane_Sense_CHK32dfCTTyuxV1A.json
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
{
|
||||
"folder": "oNhnBt8HZ2oaSnSn",
|
||||
"name": "Arcane Sense",
|
||||
"type": "feature",
|
||||
"_id": "CHK32dfCTTyuxV1A",
|
||||
"img": "icons/magic/perception/third-eye-blue-red.webp",
|
||||
"system": {
|
||||
"description": "<p>You can sense the presence of magical people and objects within Close range.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"Q9NoTaEarn3VMS6Z": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.346",
|
||||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754349703843,
|
||||
"modifiedTime": 1754349703843,
|
||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
||||
},
|
||||
"_key": "!items!CHK32dfCTTyuxV1A"
|
||||
}
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
{
|
||||
"folder": "A7yYfCMQ8NMwDLX1",
|
||||
"name": "Attack Of Opportunity",
|
||||
"type": "feature",
|
||||
"_id": "3hNVqD1c0VIw2Nj5",
|
||||
"img": "icons/skills/melee/strike-sword-slashing-red.webp",
|
||||
"system": {
|
||||
"description": "<p>If an adversary within Melee range attempts to leave that range, make a reaction roll using a trait of your choice against their Difficulty. Choose one effect on a success, or two if you critically succeed:</p><ul><li><p>They can’t move from where they are.</p></li><li><p>You deal damage to them equal to your primary weapon’s damage.</p></li><li><p>You move with them.</p></li></ul>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"MQSznptE5yLT7kj8": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.346",
|
||||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754257407143,
|
||||
"modifiedTime": 1754257470399,
|
||||
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||
},
|
||||
"_key": "!items!3hNVqD1c0VIw2Nj5"
|
||||
}
|
||||
|
|
@ -0,0 +1,74 @@
|
|||
{
|
||||
"folder": "oNhnBt8HZ2oaSnSn",
|
||||
"name": "Channel Raw Power",
|
||||
"type": "feature",
|
||||
"_id": "P02cbN50LIoD662z",
|
||||
"img": "icons/magic/unholy/strike-body-explode-disintegrate.webp",
|
||||
"system": {
|
||||
"description": "<p>Once per long rest, you can place a domain card from your loadout into your vault and choose to either:</p><ul><li><p>Gain Hope equal to the level of the card.</p></li><li><p>Enhance a spell that deals damage, gaining a bonus to your damage roll equal to twice the level of the card.</p></li></ul>",
|
||||
"resource": {
|
||||
"type": "simple",
|
||||
"value": 1,
|
||||
"max": "1",
|
||||
"icon": "",
|
||||
"recovery": "longRest",
|
||||
"diceStates": {},
|
||||
"dieFaces": "d4"
|
||||
},
|
||||
"actions": {
|
||||
"YFmqnbMx540su2Ni": {
|
||||
"type": "effect",
|
||||
"_id": "YFmqnbMx540su2Ni",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>Once per long rest, you can place a domain card from your loadout into your vault and choose to either:</p><ul><li><p>Gain Hope equal to the level of the card.</p></li><li><p>Enhance a spell that deals damage, gaining a bonus to your damage roll equal to twice the level of the card.</p></li></ul>",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
{
|
||||
"scalable": false,
|
||||
"key": "P02cbN50LIoD662z",
|
||||
"value": 1,
|
||||
"keyIsID": true,
|
||||
"step": null,
|
||||
"consumeOnSuccess": false
|
||||
}
|
||||
],
|
||||
"uses": {
|
||||
"value": null,
|
||||
"max": "",
|
||||
"recovery": null,
|
||||
"consumeOnSuccess": false
|
||||
},
|
||||
"effects": [],
|
||||
"target": {
|
||||
"type": "any",
|
||||
"amount": null
|
||||
},
|
||||
"name": "Channel",
|
||||
"img": "icons/magic/unholy/strike-body-explode-disintegrate.webp",
|
||||
"range": ""
|
||||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"Q9NoTaEarn3VMS6Z": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.346",
|
||||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754349703843,
|
||||
"modifiedTime": 1754349703843,
|
||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
||||
},
|
||||
"_key": "!items!P02cbN50LIoD662z"
|
||||
}
|
||||
33
src/packs/classes/feature_Cloaked_5IT8wYa0m1EFw8Zp.json
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
{
|
||||
"folder": "5pExRcJAOymlMX9D",
|
||||
"name": "Cloaked",
|
||||
"type": "feature",
|
||||
"_id": "5IT8wYa0m1EFw8Zp",
|
||||
"img": "icons/magic/unholy/silhouette-robe-evil-glow.webp",
|
||||
"system": {
|
||||
"description": "<p>Any time you would be Hidden, you are instead Cloaked. In addition to the benefits of the Hidden condition, while Cloaked you remain unseen if you are stationary when an adversary moves to where they would normally see you. After you make an attack or end a move within line of sight of an adversary, you are no longer Cloaked.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"LgnbNMLaxandgMQq": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.346",
|
||||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754324132841,
|
||||
"modifiedTime": 1754324172617,
|
||||
"lastModifiedBy": "LgnbNMLaxandgMQq"
|
||||
},
|
||||
"_key": "!items!5IT8wYa0m1EFw8Zp"
|
||||
}
|
||||
|
|
@ -0,0 +1,91 @@
|
|||
{
|
||||
"folder": "A7yYfCMQ8NMwDLX1",
|
||||
"name": "Combat Training",
|
||||
"type": "feature",
|
||||
"_id": "eoSmuAJmgHUyULtp",
|
||||
"img": "icons/skills/melee/hand-grip-sword-red.webp",
|
||||
"system": {
|
||||
"description": "<p>You ignore burden when equipping weapons. When you deal physical damage, you gain a bonus to your damage roll equal to your level.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
},
|
||||
"effects": [
|
||||
{
|
||||
"name": "Combat Training",
|
||||
"type": "base",
|
||||
"system": {
|
||||
"rangeDependence": {
|
||||
"enabled": false,
|
||||
"type": "withinRange",
|
||||
"target": "hostile",
|
||||
"range": "melee"
|
||||
}
|
||||
},
|
||||
"_id": "Y7sTM0tw0VpgU6pC",
|
||||
"img": "icons/skills/melee/spear-tips-quintuple-orange.webp",
|
||||
"changes": [
|
||||
{
|
||||
"key": "system.bonuses.damage.physical.bonus",
|
||||
"mode": 2,
|
||||
"value": "@system.levelData.level.current",
|
||||
"priority": null
|
||||
},
|
||||
{
|
||||
"key": "system.rules.burden.ignore",
|
||||
"mode": 5,
|
||||
"value": "1",
|
||||
"priority": null
|
||||
}
|
||||
],
|
||||
"disabled": false,
|
||||
"duration": {
|
||||
"startTime": null,
|
||||
"combat": null,
|
||||
"seconds": null,
|
||||
"rounds": null,
|
||||
"turns": null,
|
||||
"startRound": null,
|
||||
"startTurn": null
|
||||
},
|
||||
"description": "<p>You ignore burden when equipping weapons. When you deal physical damage, you gain a bonus to your damage roll equal to your level.</p>",
|
||||
"origin": null,
|
||||
"tint": "#ffffff",
|
||||
"transfer": true,
|
||||
"statuses": [],
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.346",
|
||||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754257517884,
|
||||
"modifiedTime": 1754257790010,
|
||||
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||
},
|
||||
"_key": "!items.effects!eoSmuAJmgHUyULtp.Y7sTM0tw0VpgU6pC"
|
||||
}
|
||||
],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"MQSznptE5yLT7kj8": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.346",
|
||||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754257489875,
|
||||
"modifiedTime": 1754257512503,
|
||||
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||
},
|
||||
"_key": "!items!eoSmuAJmgHUyULtp"
|
||||
}
|
||||
|
|
@ -57,8 +57,8 @@
|
|||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754221506611,
|
||||
"modifiedTime": 1754246229626,
|
||||
"lastModifiedBy": "LgnbNMLaxandgMQq"
|
||||
"modifiedTime": 1754353698203,
|
||||
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||
},
|
||||
"_key": "!items!6rlxhrRwFaVgq9fe"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@
|
|||
"dice": "d6",
|
||||
"bonus": null
|
||||
},
|
||||
"applyTo": "armorSlot",
|
||||
"applyTo": "armor",
|
||||
"base": false,
|
||||
"resultBased": false,
|
||||
"valueAlt": {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,64 @@
|
|||
{
|
||||
"folder": "onLJZkd7ZOMBaFMG",
|
||||
"name": "Hold Them Off",
|
||||
"type": "feature",
|
||||
"_id": "2Cyb9ZeuAesf5Sb3",
|
||||
"img": "icons/magic/defensive/barrier-shield-dome-deflect-teal.webp",
|
||||
"system": {
|
||||
"description": "<p>Spend 3 Hope when you succeed on an attack with a weapon to use that same roll against two additional adversaries within range of the attack.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"yhVUna5biFAN0o2Y": {
|
||||
"type": "effect",
|
||||
"_id": "yhVUna5biFAN0o2Y",
|
||||
"systemPath": "actions",
|
||||
"description": "<p>Spend 3 Hope when you succeed on an attack with a weapon to use that same roll against two additional adversaries within range of the attack.</p>",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
{
|
||||
"scalable": false,
|
||||
"key": "hope",
|
||||
"value": 3,
|
||||
"keyIsID": false,
|
||||
"step": null
|
||||
}
|
||||
],
|
||||
"uses": {
|
||||
"value": null,
|
||||
"max": "",
|
||||
"recovery": null
|
||||
},
|
||||
"effects": [],
|
||||
"target": {
|
||||
"type": "any",
|
||||
"amount": null
|
||||
},
|
||||
"name": "Spend Hope",
|
||||
"img": "icons/magic/defensive/barrier-shield-dome-deflect-teal.webp",
|
||||
"range": ""
|
||||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"LgnbNMLaxandgMQq": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.346",
|
||||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754268431889,
|
||||
"modifiedTime": 1754268481364,
|
||||
"lastModifiedBy": "LgnbNMLaxandgMQq"
|
||||
},
|
||||
"_key": "!items!2Cyb9ZeuAesf5Sb3"
|
||||
}
|
||||
111
src/packs/classes/feature_Life_Support_lSlvSUHbOoX36q2j.json
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
{
|
||||
"folder": "xIlwXYiea893J5HF",
|
||||
"name": "Life Support",
|
||||
"type": "feature",
|
||||
"_id": "lSlvSUHbOoX36q2j",
|
||||
"img": "icons/magic/life/heart-cross-strong-flame-purple-orange.webp",
|
||||
"system": {
|
||||
"description": "<p><strong>Spend 3 Hope</strong> to clear a Hit Point on an ally within Close range.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"7xzDLC2PrlK1E2XO": {
|
||||
"type": "healing",
|
||||
"_id": "7xzDLC2PrlK1E2XO",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Spend 3 Hope</strong> to clear a Hit Point on an ally within Close range.</p>",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
{
|
||||
"scalable": false,
|
||||
"key": "hope",
|
||||
"value": 3,
|
||||
"keyIsID": false,
|
||||
"step": null,
|
||||
"consumeOnSuccess": false
|
||||
}
|
||||
],
|
||||
"uses": {
|
||||
"value": null,
|
||||
"max": "",
|
||||
"recovery": null,
|
||||
"consumeOnSuccess": false
|
||||
},
|
||||
"damage": {
|
||||
"parts": [
|
||||
{
|
||||
"value": {
|
||||
"custom": {
|
||||
"enabled": true,
|
||||
"formula": "1"
|
||||
},
|
||||
"multiplier": "prof",
|
||||
"flatMultiplier": 1,
|
||||
"dice": "d6",
|
||||
"bonus": null
|
||||
},
|
||||
"applyTo": "hitPoints",
|
||||
"base": false,
|
||||
"resultBased": false,
|
||||
"valueAlt": {
|
||||
"multiplier": "prof",
|
||||
"flatMultiplier": 1,
|
||||
"dice": "d6",
|
||||
"bonus": null,
|
||||
"custom": {
|
||||
"enabled": false
|
||||
}
|
||||
},
|
||||
"type": []
|
||||
}
|
||||
],
|
||||
"includeBase": false
|
||||
},
|
||||
"target": {
|
||||
"type": "any",
|
||||
"amount": null
|
||||
},
|
||||
"effects": [],
|
||||
"roll": {
|
||||
"type": null,
|
||||
"trait": null,
|
||||
"difficulty": null,
|
||||
"bonus": null,
|
||||
"advState": "neutral",
|
||||
"diceRolling": {
|
||||
"multiplier": "prof",
|
||||
"flatMultiplier": 1,
|
||||
"dice": "d6",
|
||||
"compare": null,
|
||||
"treshold": null
|
||||
},
|
||||
"useDefault": false
|
||||
},
|
||||
"name": "Healing",
|
||||
"img": "icons/magic/life/heart-cross-strong-flame-purple-orange.webp",
|
||||
"range": "close"
|
||||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"Q9NoTaEarn3VMS6Z": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.346",
|
||||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754352191693,
|
||||
"modifiedTime": 1754352366258,
|
||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
||||
},
|
||||
"_key": "!items!lSlvSUHbOoX36q2j"
|
||||
}
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
{
|
||||
"folder": "oNhnBt8HZ2oaSnSn",
|
||||
"name": "Minor Illusion",
|
||||
"type": "feature",
|
||||
"_id": "cshTYdtz9yoXYYB3",
|
||||
"img": "icons/magic/unholy/hands-cloud-light-pink.webp",
|
||||
"system": {
|
||||
"description": "<p>Make a <strong>Spellcast Roll (10)</strong>. On a success, you create a minor visual illusion no larger than yourself within Close range. This illusion is convincing to anyone at Close range or farther.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"gLjqQ6KgxVeJljRt": {
|
||||
"type": "attack",
|
||||
"_id": "gLjqQ6KgxVeJljRt",
|
||||
"systemPath": "actions",
|
||||
"description": "",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [],
|
||||
"uses": {
|
||||
"value": null,
|
||||
"max": "",
|
||||
"recovery": null,
|
||||
"consumeOnSuccess": false
|
||||
},
|
||||
"damage": {
|
||||
"parts": [],
|
||||
"includeBase": false
|
||||
},
|
||||
"target": {
|
||||
"type": "any",
|
||||
"amount": null
|
||||
},
|
||||
"effects": [],
|
||||
"roll": {
|
||||
"type": "spellcast",
|
||||
"trait": null,
|
||||
"difficulty": 10,
|
||||
"bonus": null,
|
||||
"advState": "neutral",
|
||||
"diceRolling": {
|
||||
"multiplier": "prof",
|
||||
"flatMultiplier": 1,
|
||||
"dice": "d6",
|
||||
"compare": null,
|
||||
"treshold": null
|
||||
},
|
||||
"useDefault": false
|
||||
},
|
||||
"save": {
|
||||
"trait": null,
|
||||
"difficulty": null,
|
||||
"damageMod": "none"
|
||||
},
|
||||
"name": "Cast",
|
||||
"img": "icons/magic/unholy/hands-cloud-light-pink.webp",
|
||||
"range": ""
|
||||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"Q9NoTaEarn3VMS6Z": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.346",
|
||||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754349703843,
|
||||
"modifiedTime": 1754349703843,
|
||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
||||
},
|
||||
"_key": "!items!cshTYdtz9yoXYYB3"
|
||||
}
|
||||
123
src/packs/classes/feature_No_Mercy_njj2C3tMDeCHHOoh.json
Normal file
|
|
@ -0,0 +1,123 @@
|
|||
{
|
||||
"folder": "A7yYfCMQ8NMwDLX1",
|
||||
"name": "No Mercy",
|
||||
"type": "feature",
|
||||
"_id": "njj2C3tMDeCHHOoh",
|
||||
"img": "icons/skills/melee/blade-tip-chipped-blood-red.webp",
|
||||
"system": {
|
||||
"description": "<p><strong>Spend 3 Hope</strong> to gain a +1 bonus to your attack rolls until your next rest.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"Kwav1cV1xvVO13sR": {
|
||||
"type": "effect",
|
||||
"_id": "Kwav1cV1xvVO13sR",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Spend 3 Hope</strong> to gain a +1 bonus to your attack rolls until your next rest.</p>",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
{
|
||||
"scalable": false,
|
||||
"key": "hope",
|
||||
"value": 3,
|
||||
"keyIsID": false,
|
||||
"step": null,
|
||||
"consumeOnSuccess": false
|
||||
}
|
||||
],
|
||||
"uses": {
|
||||
"value": null,
|
||||
"max": "",
|
||||
"recovery": null,
|
||||
"consumeOnSuccess": false
|
||||
},
|
||||
"effects": [
|
||||
{
|
||||
"_id": "XK4cCcz9sRGDJr0q",
|
||||
"onSave": false
|
||||
}
|
||||
],
|
||||
"target": {
|
||||
"type": "any",
|
||||
"amount": null
|
||||
},
|
||||
"name": "Spend Hope",
|
||||
"img": "icons/magic/holy/barrier-shield-winged-blue.webp",
|
||||
"range": ""
|
||||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
},
|
||||
"effects": [
|
||||
{
|
||||
"name": "No Mercy",
|
||||
"img": "icons/skills/melee/blade-tip-chipped-blood-red.webp",
|
||||
"origin": "Compendium.daggerheart.classes.Item.njj2C3tMDeCHHOoh",
|
||||
"transfer": false,
|
||||
"_id": "XK4cCcz9sRGDJr0q",
|
||||
"type": "base",
|
||||
"system": {
|
||||
"rangeDependence": {
|
||||
"enabled": false,
|
||||
"type": "withinRange",
|
||||
"target": "hostile",
|
||||
"range": "melee"
|
||||
}
|
||||
},
|
||||
"changes": [
|
||||
{
|
||||
"key": "system.bonuses.roll.attack.bonus",
|
||||
"mode": 2,
|
||||
"value": "1",
|
||||
"priority": null
|
||||
}
|
||||
],
|
||||
"disabled": false,
|
||||
"duration": {
|
||||
"startTime": null,
|
||||
"combat": null,
|
||||
"seconds": null,
|
||||
"rounds": null,
|
||||
"turns": null,
|
||||
"startRound": null,
|
||||
"startTurn": null
|
||||
},
|
||||
"description": "<p><strong>G</strong>ain a +1 bonus to your attack rolls until your next rest.</p>",
|
||||
"tint": "#ffffff",
|
||||
"statuses": [],
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.346",
|
||||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754257373200,
|
||||
"modifiedTime": 1754257387570,
|
||||
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||
},
|
||||
"_key": "!items.effects!njj2C3tMDeCHHOoh.XK4cCcz9sRGDJr0q"
|
||||
}
|
||||
],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"MQSznptE5yLT7kj8": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.346",
|
||||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754257270096,
|
||||
"modifiedTime": 1754257373211,
|
||||
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||
},
|
||||
"_key": "!items!njj2C3tMDeCHHOoh"
|
||||
}
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
{
|
||||
"folder": "SwEjiVLbnXT2x9Lz",
|
||||
"name": "Not This Time",
|
||||
"type": "feature",
|
||||
"_id": "h3VE0jhcM5xHKBs4",
|
||||
"img": "icons/magic/control/hypnosis-mesmerism-swirl.webp",
|
||||
"system": {
|
||||
"description": "<p><strong>Spend 3 Hope</strong> to force an adversary within Far range to reroll an attack or damage roll.</p>",
|
||||
"resource": null,
|
||||
"actions": {
|
||||
"lX5FtnuXaKOdRlLF": {
|
||||
"type": "effect",
|
||||
"_id": "lX5FtnuXaKOdRlLF",
|
||||
"systemPath": "actions",
|
||||
"description": "<p><strong>Spend 3 Hope</strong> to force an adversary within Far range to reroll an attack or damage roll.</p>",
|
||||
"chatDisplay": true,
|
||||
"actionType": "action",
|
||||
"cost": [
|
||||
{
|
||||
"scalable": false,
|
||||
"key": "hope",
|
||||
"value": 3,
|
||||
"keyIsID": false,
|
||||
"step": null,
|
||||
"consumeOnSuccess": false
|
||||
}
|
||||
],
|
||||
"uses": {
|
||||
"value": null,
|
||||
"max": "",
|
||||
"recovery": null,
|
||||
"consumeOnSuccess": false
|
||||
},
|
||||
"effects": [],
|
||||
"target": {
|
||||
"type": "any",
|
||||
"amount": null
|
||||
},
|
||||
"name": "Spend Hope",
|
||||
"img": "icons/magic/control/hypnosis-mesmerism-swirl.webp",
|
||||
"range": "far"
|
||||
}
|
||||
},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"MQSznptE5yLT7kj8": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.346",
|
||||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754254821288,
|
||||
"modifiedTime": 1754254888546,
|
||||
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||
},
|
||||
"_key": "!items!h3VE0jhcM5xHKBs4"
|
||||
}
|
||||
39
src/packs/classes/feature_Prayer_Dice_Xd7RYhfTxIj9aWI2.json
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
{
|
||||
"folder": "xIlwXYiea893J5HF",
|
||||
"name": "Prayer Dice",
|
||||
"type": "feature",
|
||||
"_id": "Xd7RYhfTxIj9aWI2",
|
||||
"img": "icons/sundries/gaming/dice-runed-tan.webp",
|
||||
"system": {
|
||||
"description": "<p>At the beginning of each session, roll a number of d4s equal to your subclass’s Spellcast trait and place them on your character sheet in the space provided. These are your Prayer Dice. You can spend any number of Prayer Dice to aid yourself or an ally within Far range. You can use a spent die’s value to reduce incoming damage, add to a roll’s result after the roll is made, or gain Hope equal to the result. At the end of each session, clear all unspent Prayer Dice.</p>",
|
||||
"resource": {
|
||||
"type": "diceValue",
|
||||
"value": 0,
|
||||
"max": "2",
|
||||
"icon": "",
|
||||
"recovery": "session"
|
||||
},
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 100000,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"Q9NoTaEarn3VMS6Z": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.346",
|
||||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754352649696,
|
||||
"modifiedTime": 1754352712334,
|
||||
"lastModifiedBy": "Q9NoTaEarn3VMS6Z"
|
||||
},
|
||||
"_key": "!items!Xd7RYhfTxIj9aWI2"
|
||||
}
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
{
|
||||
"folder": "SwEjiVLbnXT2x9Lz",
|
||||
"name": "Prestidigitation",
|
||||
"type": "feature",
|
||||
"_id": "SG2uw8h5YuwDviCn",
|
||||
"img": "icons/weapons/staves/broom-yellow-purple.webp",
|
||||
"system": {
|
||||
"description": "<p>You can perform harmless, subtle magical effects at will. For example, you can change an object’s color, create a smell, light a candle, cause a tiny object to f loat, illuminate a room, or repair a small object.</p>",
|
||||
"resource": null,
|
||||
"actions": {},
|
||||
"originItemType": null,
|
||||
"originId": null
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"MQSznptE5yLT7kj8": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.346",
|
||||
"systemId": "daggerheart",
|
||||
"systemVersion": "0.0.1",
|
||||
"createdTime": 1754254907799,
|
||||
"modifiedTime": 1754254926599,
|
||||
"lastModifiedBy": "MQSznptE5yLT7kj8"
|
||||
},
|
||||
"_key": "!items!SG2uw8h5YuwDviCn"
|
||||
}
|
||||