Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
461a398965 | ||
|
|
eef0893d1a | ||
|
|
c50f1287b5 | ||
|
|
acd40f3154 | ||
|
|
764f9f81c8 | ||
|
|
70e8cd74a2 | ||
|
|
e96f4e01bd | ||
|
|
c44c2d7c96 | ||
|
|
e2ee73bc4e | ||
|
|
3f19886342 | ||
|
|
9a5afc918e | ||
|
|
2ac35ef5d1 | ||
|
|
33c6b35601 | ||
|
|
82f870db05 | ||
|
|
878efab321 | ||
|
|
659ddbd0a4 | ||
|
|
22b9e11021 | ||
|
|
02ec8880fc | ||
|
|
521cf50b7b | ||
|
|
1cc6fab3a9 | ||
|
|
7baccbabb9 | ||
|
|
d9b24b0f97 | ||
|
|
d504a0e131 | ||
|
|
09ca86a7fd | ||
|
|
5b68837023 | ||
|
|
7452c54c04 | ||
|
|
af1976b9d8 | ||
|
|
9fe45ce99f | ||
|
|
852964e77b | ||
|
|
b87dea1661 | ||
|
|
d2835c7472 | ||
|
|
f3c58424e5 | ||
|
|
c600eb3965 | ||
|
|
4a7848cb04 | ||
|
|
0d62b60e38 | ||
|
|
9b91850731 | ||
|
|
05c7a91f93 | ||
|
|
f83fdb3b8f |
@@ -6,71 +6,70 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: localhost
|
||||||
steps:
|
steps:
|
||||||
- run: echo "💡 The ${{ gitea.repository }} repository will cloned to the runner."
|
- run: echo "💡 The ${{ gitea.repository }} repository will cloned to the runner."
|
||||||
|
|
||||||
#- uses: actions/checkout@v3
|
- name: Add NODE/NPM bin directory to PATH
|
||||||
- uses: RouxAntoine/checkout@v3.5.4
|
shell: bash
|
||||||
with:
|
run: echo "/opt/alt/alt-nodejs20/root/usr/bin/" >> $GITHUB_PATH
|
||||||
ref: 'v13'
|
|
||||||
|
|
||||||
# get part of the tag after the `v`
|
- uses: RouxAntoine/checkout@v3.5.4
|
||||||
- name: Extract tag version number
|
with:
|
||||||
id: get_version
|
ref: "v13"
|
||||||
uses: battila7/get-version-action@v2
|
|
||||||
|
|
||||||
# Substitute the Manifest and Download URLs in the module.json
|
# get part of the tag after the `v`
|
||||||
- name: Substitute Manifest and Download Links For Versioned Ones
|
- name: Extract tag version number
|
||||||
id: sub_manifest_link_version
|
id: get_version
|
||||||
uses: microsoft/variable-substitution@v1
|
uses: battila7/get-version-action@v2
|
||||||
with:
|
|
||||||
files: 'system.json'
|
|
||||||
env:
|
|
||||||
version: ${{steps.get_version.outputs.version-without-v}}
|
|
||||||
url: https://www.uberwald.me/gitea/${{gitea.repository}}
|
|
||||||
manifest: https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/system.json
|
|
||||||
download: https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/rddsystem.zip
|
|
||||||
|
|
||||||
- name: Set up Node.js
|
# Substitute the Manifest and Download URLs in the module.json
|
||||||
uses: actions/setup-node@v2
|
- name: Substitute Manifest and Download Links For Versioned Ones
|
||||||
with:
|
id: sub_manifest_link_version
|
||||||
node-version: '18' # Use the node version your project requires
|
uses: microsoft/variable-substitution@v1
|
||||||
|
with:
|
||||||
|
files: "system.json"
|
||||||
|
env:
|
||||||
|
version: ${{steps.get_version.outputs.version-without-v}}
|
||||||
|
url: https://gitea.scriptarium.org/${{gitea.repository}}
|
||||||
|
manifest: https://gitea.scriptarium.org/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/system.json
|
||||||
|
download: https://gitea.scriptarium.org/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/rddsystem.zip
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Set up Node.js
|
||||||
run: npm install
|
uses: actions/setup-node@v2
|
||||||
|
with:
|
||||||
|
node-version: "18" # Use the node version your project requires
|
||||||
|
|
||||||
- name: Build the compendiums
|
- name: Install dependencies
|
||||||
run: node ./tools/packCompendiumsToDist.mjs
|
run: npm install
|
||||||
|
|
||||||
# Create a zip file with all files required by the module to add to the release
|
- name: Build the compendiums
|
||||||
- run: |
|
run: node ./tools/packCompendiumsToDist.mjs
|
||||||
apt update -y
|
|
||||||
apt install -y zip
|
|
||||||
|
|
||||||
- run: zip -r ./rddsystem.zip system.json template.json README.md LICENSE.txt assets/ css/ fonts/ icons lang/ module/ packs/ pic/ sounds/ styles/ templates/
|
- name: Create ZIP file
|
||||||
|
run: zip -r ./rddsystem.zip system.json template.json README.md LICENSE.txt assets/ css/ fonts/ icons lang/ module/ packs/ pic/ sounds/ styles/ templates/
|
||||||
|
|
||||||
- name: setup go
|
- name: setup go
|
||||||
uses: actions/setup-go@v3
|
uses: actions/setup-go@v3
|
||||||
with:
|
with:
|
||||||
go-version: '>=1.20.1'
|
go-version: ">=1.20.1"
|
||||||
|
|
||||||
- name: Use Go Action
|
- name: Use Go Action
|
||||||
id: use-go-action
|
id: use-go-action
|
||||||
uses: https://gitea.com/actions/release-action@main
|
uses: https://gitea.com/actions/release-action@main
|
||||||
with:
|
with:
|
||||||
files: |-
|
files: |-
|
||||||
./rddsystem.zip
|
./rddsystem.zip
|
||||||
system.json
|
system.json
|
||||||
api_key: '${{secrets.ALLOW_PUSH_RELEASE}}'
|
api_key: "${{secrets.RDD_PUBLISH_RELEASE}}"
|
||||||
|
|
||||||
- name: Publish to Foundry server
|
- name: Publish to Foundry server
|
||||||
uses: djlechuck/foundryvtt-publish-package-action@v1
|
uses: djlechuck/foundryvtt-publish-package-action@v1
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.FOUNDRYVTT_RELEASE_TOKEN }}
|
token: ${{ secrets.RDD_PUBLISH_RELEASE_FOUNDRY }}
|
||||||
id: 'foundryvtt-reve-de-dragon'
|
id: "foundryvtt-reve-de-dragon"
|
||||||
version: ${{github.event.release.tag_name}}
|
version: ${{github.event.release.tag_name}}
|
||||||
manifest: 'https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/system.json'
|
manifest: "https://gitea.scriptarium.org/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/system.json"
|
||||||
notes: 'https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/branch/v13/changelog.md'
|
notes: "https://gitea.scriptarium.org/Scriptarium/foundryvtt-reve-de-dragon/raw/branch/v13/changelog.md"
|
||||||
compatibility-minimum: '13'
|
compatibility-minimum: "13"
|
||||||
compatibility-verified: '13'
|
compatibility-verified: "13"
|
||||||
|
|||||||
@@ -25,4 +25,7 @@ Merci à eux !!
|
|||||||
|
|
||||||
Toute la propriété intellectuelle leur appartient, ce système est une adaptation destinée à fonctionner sous FoundryVTT.
|
Toute la propriété intellectuelle leur appartient, ce système est une adaptation destinée à fonctionner sous FoundryVTT.
|
||||||
|
|
||||||
L'ensemble du code est sous licence Creative Commons.
|
L'ensemble du code est sous licence Creative Commons.
|
||||||
|
|
||||||
|
# Licences
|
||||||
|
- L'export pdf utilise la librairie [pdf-lib](https://pdf-lib.js.org/) sous licence [MIT](pdf-lib-LICENSE.md)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 256px; width: 256px;"><defs><linearGradient x1="0" x2="1" y1="1" y2="0" id="lorc-shattered-sword-gradient-4"><stop offset="0%" stop-color="#4a4a4a" stop-opacity="1"></stop><stop offset="100%" stop-color="#c9c9c9" stop-opacity="1"></stop></linearGradient><radialGradient id="lorc-shattered-sword-gradient-5"><stop offset="0%" stop-color="#9013fe" stop-opacity="1"></stop><stop offset="100%" stop-color="#85562c" stop-opacity="1"></stop></radialGradient><radialGradient id="lorc-shattered-sword-gradient-7"><stop offset="0%" stop-color="#9013fe" stop-opacity="1"></stop><stop offset="100%" stop-color="#85562c" stop-opacity="1"></stop></radialGradient></defs><g class="" transform="translate(1,-2)" style=""><path d="m496.223 16.818-48.475 44.205 48.475 4.575v-48.78zm-41.55 1.22-68.91 11.28-7.04 65.547 75.95-76.828zM352.26 77.907l-87.887 50.3 15.447 41.026 82.662-16.87-10.222-74.456zm64.34 25.022-32.967 67.443 24.842 70.684 54.314-134.19-46.19-3.937zm-271.362 72.808c-10.02.155-20.714 3.165-30.79 9.057 4.143 8.863 3.382 18.708-2.776 24.873-6.158 6.165-15.993 6.927-24.846 2.78-12.923 22.167-11.88 47.34 2.485 61.73l29.84-29.87c58.655 42.87 109.37 92.94 150.57 151.24l-36.19 36.23 6.61-6.604c14.283 14.298 39.192 15.42 61.23 2.732-4.88-9.197-4.366-19.74 2.107-26.22 6.47-6.478 17-6.993 26.185-2.112 12.66-22.062 11.54-47-2.732-61.3l-28.248 28.28c-57.035-42.41-107.91-92.665-151.426-150.386l35.455-35.492-6.61 6.603c-7.834-7.843-18.863-11.726-30.862-11.542zm108.45 4.512c-17.61 17.41-39.674 39.21-62.22 61.375a728.952 728.952 0 0 0 27.407 30.094l59.063-59.126-24.25-32.344zm78.28 32.688L297 219.968l-65 65.063a728.12 728.12 0 0 0 35 32.376c22.02-23.134 43.764-46.41 64.97-69.406v-35.063zM173.47 313.25c-31.146 40.858-67.877 74.323-108.905 101.875 4.13 13.708 16.394 26.374 30.624 30.563 29.466-41.26 61.113-79.902 100.97-109.97a637.777 637.777 0 0 0-22.688-22.468zM44.5 410.28l-20.844 20.845c7.133 24.65 27.843 44.912 53.72 53.438l19.28-19.313c-26.948-4.28-48.314-26.91-51.875-52.938l-.28-2.03z" fill="#fff" fill-opacity="1" transform="translate(51.2, 51.2) scale(0.8, 0.8) rotate(0, 256, 256) skewX(0) skewY(0)"></path></g></svg>
|
||||||
|
After Width: | Height: | Size: 2.2 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 256px; width: 256px;"><defs><linearGradient x1="0" x2="1" y1="1" y2="0" id="delapouite-sparkles-gradient-4"><stop offset="0%" stop-color="#4a4a4a" stop-opacity="1"></stop><stop offset="100%" stop-color="#c9c9c9" stop-opacity="1"></stop></linearGradient><radialGradient id="delapouite-sparkles-gradient-5"><stop offset="0%" stop-color="#9013fe" stop-opacity="1"></stop><stop offset="100%" stop-color="#85562c" stop-opacity="1"></stop></radialGradient><radialGradient id="delapouite-sparkles-gradient-7"><stop offset="0%" stop-color="#9013fe" stop-opacity="1"></stop><stop offset="100%" stop-color="#85562c" stop-opacity="1"></stop></radialGradient></defs><g class="" transform="translate(1,-2)" style=""><path d="M237.4 20.73c-6.1 42.1-26.8 64.2-63.9 64 31.6 4.5 63.8 8 63.9 64.07-.6-46.1 24.5-63.07 64.1-64.07-38-1.5-64.9-16.3-64.1-64zm127.8 11.58c-9.1 14.25-20.8 21.29-38.9 10.28 14.9 11.79 18.6 24.76 10.2 38.97 8.9-11.18 17.5-22.73 39-10.27-17.8-10.06-18.8-23.57-10.3-38.98zM59.68 41.69c-2.7 18.8-12 28.6-28.5 28.5 14.1 2 28.4 3.6 28.5 28.52-.3-20.5 10.9-28.12 28.5-28.52-16.9-.7-28.9-7.3-28.5-28.5zM431 66.28c-2.7 18.8-12 28.6-28.5 28.5 14.1 2 28.4 3.6 28.5 28.52-.3-20.5 10.9-28.12 28.5-28.52-16.9-.7-28.9-7.3-28.5-28.5zM120.3 116.4c-15.8 53.7-47.76 48-79.35 43.4C76.6 170 90.3 197.1 84.28 239.2c12.66-46 42.62-52.6 79.42-43.4-37.6-12.1-56.9-35.4-43.4-79.4zm187 5c-8.8 61.6-39.3 94-93.6 93.7 46.2 6.5 93.6 11.7 93.6 93.7-.8-67.3 35.9-92.2 93.8-93.7-55.5-2.2-94.9-23.9-93.8-93.7zm136.8 38.3c-13.1 21.6-29.5 28.8-49.7 20.1 16.3 9.7 33 19.1 20.1 49.6 10.3-25.2 27.9-28.7 49.7-20-20.3-9.7-31.6-23.9-20.1-49.7zM50.7 243.2c9.16 16.7 7.63 30.1-5.61 40 12.46-6.9 24.85-14.3 39.91 5.6-12.57-16.2-8.2-29 5.61-40-13.92 9.7-27.47 11.6-39.91-5.6zm137.2.3c11.4 26.8-.5 41.3-21.7 50.9 22.7-8.5 40.8-4.5 50.9 21.7-12.7-31.8 4.8-41.2 21.7-50.9-21 8.5-37.8.9-50.9-21.7zm228 12.6c-26.6 64.7-68.7 91.7-127.8 76.4 48.6 19.8 98.8 38.5 76.4 127.9 17.5-73.7 64.4-90.7 127.9-76.5-59.9-17.5-96.9-52-76.5-127.8zM99.94 295.5c15.66 57.8.86 98.1-47.32 118.5 43.46-11.8 87.38-25.2 118.68 47.4-26.4-59.3-3.4-95.4 47.3-118.8-50 19.2-93.1 15-118.66-47.1zm169.36 61c-21.8 20.6-43 23.6-63.2 7.3 15.5 16.3 31.6 32.4 7.2 63.3 19.8-25.6 41.2-24.1 63.3-7.3-20.2-17.4-28.6-37.5-7.3-63.3zM443.2 404c-2.7 18.8-12 28.6-28.5 28.5 14.1 2 28.4 3.6 28.5 28.5-.3-20.5 10.9-28.1 28.5-28.5-16.9-.7-28.9-7.3-28.5-28.5zm-169.7 36c-2.7 18.8-12 28.6-28.5 28.5 14.1 2 28.4 3.6 28.5 28.5-.3-20.5 10.9-28.1 28.5-28.5-16.9-.7-28.9-7.3-28.5-28.5z" fill="#fff" transform="translate(51.2, 51.2) scale(0.8, 0.8) rotate(0, 256, 256) skewX(0) skewY(0)" fill-opacity="1"></path></g></svg>
|
||||||
|
After Width: | Height: | Size: 2.6 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 256px; width: 256px;"><g class="" transform="translate(0,0)" style=""><path d="M256.25 20.313c-108.64 0-196.78 90.592-196.78 202.937 0 84.615 49.994 156.904 121.093 187.438v-16.375c0-25.638-6.2-40.132-13.875-48.47-7.675-8.336-17.567-11.4-27.72-11.937-18.252-.97-32.4-12.266-40.905-27-6.47-11.205-5.975-24.767-.532-36.97 5.444-12.2 15.49-23.71 29.19-33.905 27.394-20.39 69.79-35.56 122.436-35.56 52.702 0 98.475 15.648 129.344 36.218 15.435 10.284 27.24 21.746 34.22 33.968 6.976 12.222 8.93 26.41 2.186 38.094-4.19 7.257-11.026 11.988-18.687 15.938-7.663 3.95-16.085 6.78-24.595 6.78-11.865 0-20.63 2.214-27.438 10.157s-12.437 23.63-12.437 52.688v16.437c71.195-30.488 121.28-102.814 121.28-187.5 0-112.347-88.14-202.938-196.78-202.938zm-76.656 86.718c1.53.02 3.05.078 4.562.157 14.525.766 28.29 4.3 41.063 9.97l17.31 7.687-16.624 9.062-84.062 45.875-8.938-16.405 65.156-35.563c-24.195-5.513-50.92-1.877-82.062 17.532l-9.875-15.844c25.778-16.066 50.528-22.75 73.47-22.47zm150.312 0c22.944-.28 47.722 6.404 73.5 22.47l-9.875 15.844c-31.14-19.41-57.865-23.045-82.06-17.53l65.155 35.56-8.938 16.407-84.062-45.874L267 124.844l17.313-7.688c12.772-5.67 26.506-9.203 41.03-9.97 1.514-.078 3.034-.136 4.563-.155zm-73.594 170.282c-68.947 0-113.104 15.367-116.843 37.907l.5.03c13.487.714 28.843 5.31 40.468 17.938 11.624 12.627 18.812 32.418 18.812 61.125v100.312h113.813V394.312c0-31.4 5.766-51.81 16.937-64.843 11.17-13.034 27.003-16.69 41.625-16.69.352 0 .76-.03 1.156-.06-6.417-22.614-49.872-35.408-116.467-35.408z" fill="#fff" fill-opacity="1"></path></g></svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 7.2 KiB |
@@ -0,0 +1,110 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
viewBox="0 0 378.00079 384.97681"
|
||||||
|
version="1.1"
|
||||||
|
id="svg23"
|
||||||
|
sodipodi:docname="resistance.svg"
|
||||||
|
width="378.00079"
|
||||||
|
height="384.97681"
|
||||||
|
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)">
|
||||||
|
<metadata
|
||||||
|
id="metadata27">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1875"
|
||||||
|
inkscape:window-height="1352"
|
||||||
|
id="namedview25"
|
||||||
|
showgrid="false"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-left="0"
|
||||||
|
fit-margin-right="0"
|
||||||
|
fit-margin-bottom="0"
|
||||||
|
inkscape:zoom="1.4355469"
|
||||||
|
inkscape:cx="186.7504"
|
||||||
|
inkscape:cy="196.1768"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:current-layer="svg23" />
|
||||||
|
<defs
|
||||||
|
id="defs17">
|
||||||
|
<linearGradient
|
||||||
|
x1="0"
|
||||||
|
x2="1"
|
||||||
|
y1="1"
|
||||||
|
y2="0"
|
||||||
|
id="lorc-aura-gradient-4">
|
||||||
|
<stop
|
||||||
|
offset="0%"
|
||||||
|
stop-color="#4a4a4a"
|
||||||
|
stop-opacity="1"
|
||||||
|
id="stop2" />
|
||||||
|
<stop
|
||||||
|
offset="100%"
|
||||||
|
stop-color="#c9c9c9"
|
||||||
|
stop-opacity="1"
|
||||||
|
id="stop4" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient
|
||||||
|
id="lorc-aura-gradient-5">
|
||||||
|
<stop
|
||||||
|
offset="0%"
|
||||||
|
stop-color="#9013fe"
|
||||||
|
stop-opacity="1"
|
||||||
|
id="stop7" />
|
||||||
|
<stop
|
||||||
|
offset="100%"
|
||||||
|
stop-color="#85562c"
|
||||||
|
stop-opacity="1"
|
||||||
|
id="stop9" />
|
||||||
|
</radialGradient>
|
||||||
|
<radialGradient
|
||||||
|
id="lorc-aura-gradient-7">
|
||||||
|
<stop
|
||||||
|
offset="0%"
|
||||||
|
stop-color="#9013fe"
|
||||||
|
stop-opacity="1"
|
||||||
|
id="stop12" />
|
||||||
|
<stop
|
||||||
|
offset="100%"
|
||||||
|
stop-color="#85562c"
|
||||||
|
stop-opacity="1"
|
||||||
|
id="stop14" />
|
||||||
|
</radialGradient>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
class=""
|
||||||
|
transform="translate(-68.2496,-61.8232)"
|
||||||
|
id="g21">
|
||||||
|
<path
|
||||||
|
d="m 320.938,13.28 c -16.646,34.584 -38.466,60.157 -63.094,60.157 -24.522,0 -47.035,-25.275 -63.656,-59.593 0.366,39.358 -9.71,90.884 -30.938,105.125 -21.228,14.24 -49.64,-12.002 -78.844,-32.126 17.455,34.04 42.095,67.5 29.78,92.28 -12.21,24.576 -59.172,35.96 -92.874,35.626 29.338,19.29 78.842,45.803 78.844,74.188 0.002,28.384 -49.504,53.71 -78.844,73 33.702,-0.333 80.663,11.612 92.876,36.187 12.227,24.61 -9.03,56.31 -33.75,85.563 44.826,-15.413 65.142,-5.735 85.374,10.812 h 31.75 C 154.822,459.086 125.5,386.671 125.5,302.936 125.498,184.316 184.42,88.03 256.906,88.03 c 72.488,0 131.406,96.29 131.406,214.907 0,83.74 -29.317,156.153 -72.062,191.563 h 27.313 c 19.847,-14.62 39.796,-25.65 89.687,-9.28 -26.233,-30.264 -42.2,-62.484 -29.97,-87.095 12.257,-24.665 56.658,-36.612 90.533,-36.188 -29.4,-19.297 -75.344,-44.584 -75.344,-73 0,-28.415 45.943,-54.89 75.342,-74.187 -33.874,0.424 -78.273,-10.962 -90.53,-35.625 -12.315,-24.78 9.982,-58.24 27.437,-92.28 -29.202,20.12 -57.583,46.385 -78.845,32.124 -21.262,-14.263 -31.382,-66.13 -30.938,-105.69 z m -68.97,93.75 c -19.56,2.543 -37.343,25.564 -37.343,55.407 0,16.447 5.67,30.986 14,41.032 l 10.156,12.218 -15.593,2.937 c -10.815,2.035 -18.743,7.737 -25.53,17.063 -6.79,9.325 -11.984,22.344 -15.626,37.343 -6.585,27.128 -8.078,60.24 -8.31,89.47 h 36.093 l 0.656,8.656 9.124,122.563 h 76.187 l 8.095,-122.5 0.563,-8.72 h 34.375 c -0.026,-29.592 -0.44,-63.166 -6.407,-90.5 -3.295,-15.095 -8.287,-28.096 -15.156,-37.313 -6.87,-9.216 -15.133,-14.897 -27.28,-16.78 l -15.94,-2.47 10.064,-12.593 c 7.97,-9.996 13.375,-24.36 13.375,-40.406 -0.002,-31.817 -19.884,-55.313 -41.44,-55.313 -2.54,0 -3.96,-0.103 -4.03,-0.094 h -0.03 z"
|
||||||
|
fill="#ffffff"
|
||||||
|
fill-opacity="1"
|
||||||
|
transform="matrix(0.8,0,0,0.8,51.2,51.2)"
|
||||||
|
id="path19" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.4 KiB |
@@ -1,4 +1,56 @@
|
|||||||
# 13.0
|
# 13.0
|
||||||
|
|
||||||
|
## 13.0.20 - L'immobilisme d'Illysis
|
||||||
|
|
||||||
|
- Centrage du logo de pause
|
||||||
|
- Ajout d'un statut malade/empoisonné
|
||||||
|
- Fenêtre de jet v2
|
||||||
|
- correction du compteur empoignade
|
||||||
|
- amélioration des messages liés à l'empoignade
|
||||||
|
- amélioration des choix de perte d'endurance
|
||||||
|
- correction de la dépense de rêve sur lancement de sort
|
||||||
|
- ajustement astrologique sur rituels
|
||||||
|
|
||||||
|
|
||||||
|
## 13.0.19 - L'introspection d'Illysis
|
||||||
|
|
||||||
|
- Ajout d'un bouton pour les jets de résistance sous rêve actuel
|
||||||
|
- Fenêtre de jet v2
|
||||||
|
- restrictions au propriétaire du personnage
|
||||||
|
- ouverture de la fenêtre de jets
|
||||||
|
- appel à la chance
|
||||||
|
- appel à la destinée
|
||||||
|
- fermeture par défaut selon le type de jets:
|
||||||
|
- jets d'attaque
|
||||||
|
- jets de défense
|
||||||
|
- jets imposés par un choix d'action
|
||||||
|
- lancer de sorts
|
||||||
|
- jets suite à appel à la chance
|
||||||
|
- gestion des écailles d'efficacité sur les armes
|
||||||
|
- permettre de faire une attaque même si l'initiative n'est pas faite
|
||||||
|
- les messages de défense s'affichent correctement avec plusieurs joueurs
|
||||||
|
- les particulières en force/rapidité sont correctement affichées dans le tchat
|
||||||
|
- l'expérience sur jet de résistance est limitée à 1 point
|
||||||
|
|
||||||
|
## 13.0.18 - Le reflet d'Illysis
|
||||||
|
|
||||||
|
- Mise à jour de la feuille de personnage pdf template (avec police correcte)
|
||||||
|
- Ajout d'une icône "écurie" pour les services des commerces & auberges
|
||||||
|
- Suppression de message d'erreur sur compétence
|
||||||
|
manquante à l'ouverture des acteurs d'invocation
|
||||||
|
|
||||||
|
## 13.0.17 - Le chant d'Illysis
|
||||||
|
|
||||||
|
- Corrections CSS
|
||||||
|
- Migration Uberwald -> Scriptarium
|
||||||
|
|
||||||
|
## 13.0.16 - La paix d'Illysis
|
||||||
|
|
||||||
|
- Export de personnages sous forme de feuille de personnage pdf
|
||||||
|
- Correction d'un problème à l'ouverture de personnages saisis dans d'anciennes versions
|
||||||
|
- Fenêtre de jet v2
|
||||||
|
- on peut faire des jets en dehors des combats
|
||||||
|
|
||||||
## 13.0.15 - Les pièces d'Illysis
|
## 13.0.15 - Les pièces d'Illysis
|
||||||
|
|
||||||
- On peut de nouveau acheter dans les commerces
|
- On peut de nouveau acheter dans les commerces
|
||||||
@@ -91,7 +143,7 @@
|
|||||||
- ajout d'un status "Force insuffisante"
|
- ajout d'un status "Force insuffisante"
|
||||||
- clarification des maladresses à l'attaque (en demi surprise, ou à cause d'un échec total)
|
- clarification des maladresses à l'attaque (en demi surprise, ou à cause d'un échec total)
|
||||||
- Nouvelle fenêtre de jets de dés
|
- Nouvelle fenêtre de jets de dés
|
||||||
- ajout du statut "Force insuffisante" aux acteurs si la
|
- ajout du statut "Force insuffisante" aux acteurs si la
|
||||||
force est insuffisante pour l'arme
|
force est insuffisante pour l'arme
|
||||||
- avancement du mode attaque
|
- avancement du mode attaque
|
||||||
- choix de tactique
|
- choix de tactique
|
||||||
|
|||||||
@@ -60,8 +60,7 @@
|
|||||||
/* Fonts */
|
/* Fonts */
|
||||||
.sheet header.sheet-header h1 input,
|
.sheet header.sheet-header h1 input,
|
||||||
.window-app .window-header,
|
.window-app .window-header,
|
||||||
#actors .directory-list,
|
#sidebar {
|
||||||
#navigation #scene-list .scene.nav-item {
|
|
||||||
font-family: "GoudyAcc";
|
font-family: "GoudyAcc";
|
||||||
}
|
}
|
||||||
/* For title, sidebar character and scene */
|
/* For title, sidebar character and scene */
|
||||||
@@ -71,9 +70,7 @@
|
|||||||
.sheet header.sheet-header .flex-group-center.flex-fatigue,
|
.sheet header.sheet-header .flex-group-center.flex-fatigue,
|
||||||
select,
|
select,
|
||||||
.item-checkbox,
|
.item-checkbox,
|
||||||
#sidebar,
|
#players {
|
||||||
#players,
|
|
||||||
#navigation #nav-toggle {
|
|
||||||
font-family: "CaslonAntique";
|
font-family: "CaslonAntique";
|
||||||
/* For sheet parts; For nav and title */
|
/* For sheet parts; For nav and title */
|
||||||
}
|
}
|
||||||
@@ -99,7 +96,9 @@ select,
|
|||||||
--gradient-warning: linear-gradient(150deg, hsla(32, 100%, 50%, 0.3), hsla(52, 60%, 50%, 0.1), hsla(32, 60%, 50%, 0.1), hsla(32, 100%, 50%, 0.3));
|
--gradient-warning: linear-gradient(150deg, hsla(32, 100%, 50%, 0.3), hsla(52, 60%, 50%, 0.1), hsla(32, 60%, 50%, 0.1), hsla(32, 100%, 50%, 0.3));
|
||||||
--gradient-silver-light: linear-gradient(30deg, rgba(61, 55, 93, 0.2), rgba(178, 179, 196, 0.1), rgba(59, 62, 63, 0.2), rgba(206, 204, 199, 0.1), rgba(61, 46, 49, 0.2));
|
--gradient-silver-light: linear-gradient(30deg, rgba(61, 55, 93, 0.2), rgba(178, 179, 196, 0.1), rgba(59, 62, 63, 0.2), rgba(206, 204, 199, 0.1), rgba(61, 46, 49, 0.2));
|
||||||
--gradient-daylight: conic-gradient(from 0deg, hsla(50, 100%, 80%, 0.7), hsla(30, 30%, 40%, 0.1) 25%, hsla(250, 50%, 40%, 0.1) 25%, hsla(250, 30%, 30%, 0.7) 50%, hsla(250, 50%, 40%, 0.1) 75%, hsla(30, 30%, 40%, 0.1) 75%, hsla(50, 100%, 80%, 0.7));
|
--gradient-daylight: conic-gradient(from 0deg, hsla(50, 100%, 80%, 0.7), hsla(30, 30%, 40%, 0.1) 25%, hsla(250, 50%, 40%, 0.1) 25%, hsla(250, 30%, 30%, 0.7) 50%, hsla(250, 50%, 40%, 0.1) 75%, hsla(30, 30%, 40%, 0.1) 75%, hsla(50, 100%, 80%, 0.7));
|
||||||
--background-custom-button: linear-gradient(to bottom, hsla(208, 38%, 21%, 0.988) 5%, hsla(202, 42%, 14%, 0.671) 100%);
|
--background-color-button: hsl(25, 5%, 60%);
|
||||||
|
--background-color-custom-button: hsla(208, 38%, 21%, 0.988);
|
||||||
|
--background-custom-button: linear-gradient(to bottom, var(--background-color-custom-button) 5%, hsla(202, 42%, 14%, 0.671) 100%);
|
||||||
--background-custom-button-hover: linear-gradient(to bottom, hsl(0, 100%, 25%) 5%, hsl(0, 97%, 12%) 100%);
|
--background-custom-button-hover: linear-gradient(to bottom, hsl(0, 100%, 25%) 5%, hsl(0, 97%, 12%) 100%);
|
||||||
--background-control-selected: linear-gradient(to bottom, hsla(0, 100%, 25%, 0.5) 5%, hsla(0, 100%, 12%, 0.5) 100%);
|
--background-control-selected: linear-gradient(to bottom, hsla(0, 100%, 25%, 0.5) 5%, hsla(0, 100%, 12%, 0.5) 100%);
|
||||||
--background-tooltip: hsla(60, 12%, 85%, 0.95);
|
--background-tooltip: hsla(60, 12%, 85%, 0.95);
|
||||||
@@ -593,6 +592,9 @@ select,
|
|||||||
font-size: 1.2rem;
|
font-size: 1.2rem;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
.system-foundryvtt-reve-de-dragon .roll-dialog roll-action roll-section[name="resistance"] {
|
||||||
|
align-items: flex-end;
|
||||||
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .roll-dialog roll-action roll-section {
|
.system-foundryvtt-reve-de-dragon .roll-dialog roll-action roll-section {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
@@ -607,6 +609,12 @@ select,
|
|||||||
margin: 0 1rem;
|
margin: 0 1rem;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
.system-foundryvtt-reve-de-dragon .roll-dialog roll-action roll-section img.flag-resistance {
|
||||||
|
max-width: 1.5rem;
|
||||||
|
max-height: 1.5rem;
|
||||||
|
text-align: right;
|
||||||
|
filter: invert(0.6);
|
||||||
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .roll-dialog roll-conditions {
|
.system-foundryvtt-reve-de-dragon .roll-dialog roll-conditions {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@@ -765,6 +773,15 @@ select,
|
|||||||
.system-foundryvtt-reve-de-dragon .window-header {
|
.system-foundryvtt-reve-de-dragon .window-header {
|
||||||
background: rgba(0, 0, 0, 0.75);
|
background: rgba(0, 0, 0, 0.75);
|
||||||
}
|
}
|
||||||
|
.system-foundryvtt-reve-de-dragon .journal-entry-content {
|
||||||
|
background: url(../assets/ui/bg_left.webp) no-repeat left top;
|
||||||
|
color: var(--rdd-color-text-primary);
|
||||||
|
}
|
||||||
|
.system-foundryvtt-reve-de-dragon .journal-page-header h1,
|
||||||
|
.system-foundryvtt-reve-de-dragon .journal-page-header h2 .journal-page-header h3,
|
||||||
|
.system-foundryvtt-reve-de-dragon .journal-page-header h4 {
|
||||||
|
color: var(--rdd-color-text-primary);
|
||||||
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .application .window-content {
|
.system-foundryvtt-reve-de-dragon .application .window-content {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0.2rem;
|
padding: 0.2rem;
|
||||||
@@ -779,7 +796,7 @@ select,
|
|||||||
.system-foundryvtt-reve-de-dragon .strong-text {
|
.system-foundryvtt-reve-de-dragon .strong-text {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon i:is(.fas, .far, .fa-solid, .fa-regular, .fa-sharp ) {
|
.system-foundryvtt-reve-de-dragon i:is(.fas, .far, .fa-solid, .fa-regular, .fa-sharp) {
|
||||||
font-size: smaller;
|
font-size: smaller;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .sheet-header h1.charname {
|
.system-foundryvtt-reve-de-dragon .sheet-header h1.charname {
|
||||||
@@ -818,7 +835,7 @@ select,
|
|||||||
margin-top: -8px;
|
margin-top: -8px;
|
||||||
margin-bottom: -8px;
|
margin-bottom: -8px;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .sheet-header :is(.header-compteurs,.header-etats,.profile-img, .profile-img-token) {
|
.system-foundryvtt-reve-de-dragon .sheet-header :is(.header-compteurs, .header-etats, .profile-img, .profile-img-token) {
|
||||||
padding: 0 0.4rem;
|
padding: 0 0.4rem;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .sheet-header div.header-etats {
|
.system-foundryvtt-reve-de-dragon .sheet-header div.header-etats {
|
||||||
@@ -855,11 +872,11 @@ select,
|
|||||||
object-fit: contain;
|
object-fit: contain;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon img.equipement-inutilisable {
|
.system-foundryvtt-reve-de-dragon img.equipement-inutilisable {
|
||||||
vertical-align: bottom ;
|
vertical-align: bottom;
|
||||||
max-width: 1.4rem;
|
max-width: 1.4rem;
|
||||||
max-height: 1.4rem;
|
max-height: 1.4rem;
|
||||||
border: 1px;
|
border: 1px;
|
||||||
background: center / contain no-repeat url('../../icons/templates/icone_parchement_vierge.webp');
|
background: center / contain no-repeat url("../../icons/templates/icone_parchement_vierge.webp");
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .sheet-header .header-compteurs {
|
.system-foundryvtt-reve-de-dragon .sheet-header .header-compteurs {
|
||||||
width: calc(60% - 110px - 1rem);
|
width: calc(60% - 110px - 1rem);
|
||||||
@@ -927,7 +944,14 @@ select,
|
|||||||
.system-foundryvtt-reve-de-dragon div.tmrdialog div.tmr-actions {
|
.system-foundryvtt-reve-de-dragon div.tmrdialog div.tmr-actions {
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
flex-basis: inherit;
|
flex-basis: inherit;
|
||||||
flex: 'flex-shrink';
|
flex: "flex-shrink";
|
||||||
|
}
|
||||||
|
.system-foundryvtt-reve-de-dragon :is(section.scenes-sidebar, section.compendium-sidebar) li.directory-item.folder a {
|
||||||
|
text-shadow: 1px 1px 2px var(--rdd-color-text-primary);
|
||||||
|
color: var(--color-background-chat-message);
|
||||||
|
}
|
||||||
|
.system-foundryvtt-reve-de-dragon :is(section.scenes-sidebar, section.compendium-sidebar) li.directory-item.folder a:hover {
|
||||||
|
text-shadow: 1px 0px 0px #ff6600;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .tabs .item.active,
|
.system-foundryvtt-reve-de-dragon .tabs .item.active,
|
||||||
.system-foundryvtt-reve-de-dragon .blessures-list li ul li:first-child:hover,
|
.system-foundryvtt-reve-de-dragon .blessures-list li ul li:first-child:hover,
|
||||||
@@ -1054,7 +1078,7 @@ select,
|
|||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .flex-shrink {
|
.system-foundryvtt-reve-de-dragon .flex-shrink {
|
||||||
flex: 'flex-shrink';
|
flex: "flex-shrink";
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .flex-grow,
|
.system-foundryvtt-reve-de-dragon .flex-grow,
|
||||||
@@ -1272,7 +1296,7 @@ select,
|
|||||||
border: 0;
|
border: 0;
|
||||||
vertical-align: bottom;
|
vertical-align: bottom;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon :is(.button-img,.button-effect-img,.tmr-move):hover {
|
.system-foundryvtt-reve-de-dragon :is(.button-img, .button-effect-img, .tmr-move):hover {
|
||||||
color: var(--color-controls-hover);
|
color: var(--color-controls-hover);
|
||||||
border: 1px solid var(--color-control-border-hover);
|
border: 1px solid var(--color-control-border-hover);
|
||||||
text-shadow: 1px 0px 0px #ff6600;
|
text-shadow: 1px 0px 0px #ff6600;
|
||||||
@@ -1414,10 +1438,10 @@ select,
|
|||||||
min-height: 2rem;
|
min-height: 2rem;
|
||||||
padding: 0 3px;
|
padding: 0 3px;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .foundryvtt-reve-de-dragon.sheet :is(.large-editor,.editor,.medium-editor,.small-editor) {
|
.system-foundryvtt-reve-de-dragon .foundryvtt-reve-de-dragon.sheet :is(.large-editor, .editor, .medium-editor, .small-editor) {
|
||||||
align-items: start;
|
align-items: start;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .foundryvtt-reve-de-dragon.sheet :is(.large-editor,.editor,.medium-editor,.small-editor) .editor.prosemirror {
|
.system-foundryvtt-reve-de-dragon .foundryvtt-reve-de-dragon.sheet :is(.large-editor, .editor, .medium-editor, .small-editor) .editor.prosemirror {
|
||||||
align-items: normal;
|
align-items: normal;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .foundryvtt-reve-de-dragon .tox .tox-editor-container {
|
.system-foundryvtt-reve-de-dragon .foundryvtt-reve-de-dragon .tox .tox-editor-container {
|
||||||
@@ -1432,8 +1456,8 @@ select,
|
|||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .foundryvtt-reve-de-dragon .tabs {
|
.system-foundryvtt-reve-de-dragon .foundryvtt-reve-de-dragon .tabs {
|
||||||
height: 40px;
|
height: 40px;
|
||||||
border-top: 1px solid #AAA;
|
border-top: 1px solid #aaa;
|
||||||
border-bottom: 1px solid #AAA;
|
border-bottom: 1px solid #aaa;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .foundryvtt-reve-de-dragon .tabs .item {
|
.system-foundryvtt-reve-de-dragon .foundryvtt-reve-de-dragon .tabs .item {
|
||||||
line-height: 40px;
|
line-height: 40px;
|
||||||
@@ -1589,28 +1613,18 @@ select,
|
|||||||
.system-foundryvtt-reve-de-dragon .journal-entry .journal-sidebar .permissions-list,
|
.system-foundryvtt-reve-de-dragon .journal-entry .journal-sidebar .permissions-list,
|
||||||
.system-foundryvtt-reve-de-dragon .window-app.sheet .window-content .sheet-body nav.tabs,
|
.system-foundryvtt-reve-de-dragon .window-app.sheet .window-content .sheet-body nav.tabs,
|
||||||
.system-foundryvtt-reve-de-dragon .application .window-content nav.tabs,
|
.system-foundryvtt-reve-de-dragon .application .window-content nav.tabs,
|
||||||
.system-foundryvtt-reve-de-dragon .journal-entry .journal-sidebar nav.tabs,
|
.system-foundryvtt-reve-de-dragon .journal-entry .journal-sidebar nav.tabs {
|
||||||
.system-foundryvtt-reve-de-dragon .window-app.sheet .window-content .sheet-body nav.tabs button,
|
color: var(--rdd-color-text-primary);
|
||||||
.system-foundryvtt-reve-de-dragon .application .window-content nav.tabs button,
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .journal-entry .journal-sidebar nav.tabs button,
|
.system-foundryvtt-reve-de-dragon .window-app.sheet .window-content .sheet-body button .count,
|
||||||
.system-foundryvtt-reve-de-dragon .window-app.sheet .window-content .sheet-body nav.tabs button .count,
|
.system-foundryvtt-reve-de-dragon .application .window-content button .count,
|
||||||
.system-foundryvtt-reve-de-dragon .application .window-content nav.tabs button .count,
|
.system-foundryvtt-reve-de-dragon .journal-entry .journal-sidebar button .count,
|
||||||
.system-foundryvtt-reve-de-dragon .journal-entry .journal-sidebar nav.tabs button .count,
|
|
||||||
.system-foundryvtt-reve-de-dragon .window-app.sheet .window-content .sheet-body button,
|
.system-foundryvtt-reve-de-dragon .window-app.sheet .window-content .sheet-body button,
|
||||||
.system-foundryvtt-reve-de-dragon .application .window-content button,
|
.system-foundryvtt-reve-de-dragon .application .window-content button,
|
||||||
.system-foundryvtt-reve-de-dragon .journal-entry .journal-sidebar button {
|
.system-foundryvtt-reve-de-dragon .journal-entry .journal-sidebar button {
|
||||||
|
background-color: var(--background-color-button);
|
||||||
color: var(--rdd-color-text-primary);
|
color: var(--rdd-color-text-primary);
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .window-app.sheet .window-content .sheet-body a,
|
|
||||||
.system-foundryvtt-reve-de-dragon .application .window-content a,
|
|
||||||
.system-foundryvtt-reve-de-dragon .journal-entry .journal-sidebar a {
|
|
||||||
color: var(--color-dark-3);
|
|
||||||
}
|
|
||||||
.system-foundryvtt-reve-de-dragon .window-app.sheet .window-content .sheet-body a.filter.active,
|
|
||||||
.system-foundryvtt-reve-de-dragon .application .window-content a.filter.active,
|
|
||||||
.system-foundryvtt-reve-de-dragon .journal-entry .journal-sidebar a.filter.active {
|
|
||||||
color: var(--color-dark-1);
|
|
||||||
}
|
|
||||||
.system-foundryvtt-reve-de-dragon .window-app .window-content {
|
.system-foundryvtt-reve-de-dragon .window-app .window-content {
|
||||||
background: url(../assets/ui/bg_left.webp) no-repeat left top;
|
background: url(../assets/ui/bg_left.webp) no-repeat left top;
|
||||||
color: var(--rdd-color-text-primary);
|
color: var(--rdd-color-text-primary);
|
||||||
@@ -1641,34 +1655,34 @@ select,
|
|||||||
padding-right: 0.5rem;
|
padding-right: 0.5rem;
|
||||||
max-width: 7rem;
|
max-width: 7rem;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon select:is(.number-x,.number-x2,.number-x3,.number-x4,.number-x5) {
|
.system-foundryvtt-reve-de-dragon select:is(.number-x, .number-x2, .number-x3, .number-x4, .number-x5) {
|
||||||
padding-right: 0.2rem;
|
padding-right: 0.2rem;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon input:is(.number,.number-x,.number-x2,.number-x3,.number-x4,.number-x5) {
|
.system-foundryvtt-reve-de-dragon input:is(.number, .number-x, .number-x2, .number-x3, .number-x4, .number-x5) {
|
||||||
padding-right: 0.2rem;
|
padding-right: 0.2rem;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon :is(input,select).number-x {
|
.system-foundryvtt-reve-de-dragon :is(input, select).number-x {
|
||||||
max-width: 1.4rem;
|
max-width: 1.4rem;
|
||||||
min-width: 1rem;
|
min-width: 1rem;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon :is(input,select).number-x2 {
|
.system-foundryvtt-reve-de-dragon :is(input, select).number-x2 {
|
||||||
max-width: 2.4rem;
|
max-width: 2.4rem;
|
||||||
min-width: 2rem;
|
min-width: 2rem;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon :is(input,select).number-x3 {
|
.system-foundryvtt-reve-de-dragon :is(input, select).number-x3 {
|
||||||
max-width: 3.4rem;
|
max-width: 3.4rem;
|
||||||
min-width: 3rem;
|
min-width: 3rem;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon :is(input,select).number-x4 {
|
.system-foundryvtt-reve-de-dragon :is(input, select).number-x4 {
|
||||||
max-width: 4.4rem;
|
max-width: 4.4rem;
|
||||||
min-width: 4rem;
|
min-width: 4rem;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon :is(input,select).number-x5 {
|
.system-foundryvtt-reve-de-dragon :is(input, select).number-x5 {
|
||||||
max-width: 4.4rem;
|
max-width: 4.4rem;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon form.rdddialogchrono input[type=datetime-local] {
|
.system-foundryvtt-reve-de-dragon form.rdddialogchrono input[type="datetime-local"] {
|
||||||
min-width: 20px;
|
min-width: 20px;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
background: rgba(0, 0, 0, 0.05);
|
background: rgba(0, 0, 0, 0.05);
|
||||||
@@ -1760,7 +1774,7 @@ select,
|
|||||||
text-align: left;
|
text-align: left;
|
||||||
width: 2rem;
|
width: 2rem;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .compteur a i:is(.fas,.far):hover {
|
.system-foundryvtt-reve-de-dragon .compteur a i:is(.fas, .far):hover {
|
||||||
opacity: 0.7;
|
opacity: 0.7;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .select-diff {
|
.system-foundryvtt-reve-de-dragon .select-diff {
|
||||||
@@ -2182,7 +2196,7 @@ select,
|
|||||||
.system-foundryvtt-reve-de-dragon #sidebar-tabs > .collapsed,
|
.system-foundryvtt-reve-de-dragon #sidebar-tabs > .collapsed,
|
||||||
.system-foundryvtt-reve-de-dragon #chat-controls .chat-control-icon {
|
.system-foundryvtt-reve-de-dragon #chat-controls .chat-control-icon {
|
||||||
color: rgba(220, 220, 220, 0.75);
|
color: rgba(220, 220, 220, 0.75);
|
||||||
text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.75);
|
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.75);
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .sidebar-tab .directory-list .entity {
|
.system-foundryvtt-reve-de-dragon .sidebar-tab .directory-list .entity {
|
||||||
border-top: 1px dashed rgba(0, 0, 0, 0.25);
|
border-top: 1px dashed rgba(0, 0, 0, 0.25);
|
||||||
@@ -2238,19 +2252,19 @@ select,
|
|||||||
vertical-align: bottom;
|
vertical-align: bottom;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon #sidebar-tabs menu button:is(
|
.system-foundryvtt-reve-de-dragon #sidebar-tabs menu button:is(
|
||||||
[data-tab="chat"],
|
[data-tab="chat"],
|
||||||
[data-tab="combat"],
|
[data-tab="combat"],
|
||||||
[data-tab="scenes"],
|
[data-tab="scenes"],
|
||||||
[data-tab="actors"],
|
[data-tab="actors"],
|
||||||
[data-tab="items"],
|
[data-tab="items"],
|
||||||
[data-tab="journal"],
|
[data-tab="journal"],
|
||||||
[data-tab="cards"],
|
[data-tab="cards"],
|
||||||
[data-tab="macros"],
|
[data-tab="macros"],
|
||||||
[data-tab="tables"],
|
[data-tab="tables"],
|
||||||
[data-tab="playlists"],
|
[data-tab="playlists"],
|
||||||
[data-tab="compendium"],
|
[data-tab="compendium"],
|
||||||
[data-tab="settings"]
|
[data-tab="settings"]
|
||||||
)::before {
|
)::before {
|
||||||
content: none;
|
content: none;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon #sidebar-tabs menu button {
|
.system-foundryvtt-reve-de-dragon #sidebar-tabs menu button {
|
||||||
@@ -2318,7 +2332,12 @@ select,
|
|||||||
max-height: calc(100vh - 156px);
|
max-height: calc(100vh - 156px);
|
||||||
height: auto;
|
height: auto;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon #controls :is(.scene-control.active,.control-tool.active, .scene-control:hover, .control-tool:hover) {
|
.system-foundryvtt-reve-de-dragon #controls :is(
|
||||||
|
.scene-control.active,
|
||||||
|
.control-tool.active,
|
||||||
|
.scene-control:hover,
|
||||||
|
.control-tool:hover
|
||||||
|
) {
|
||||||
background: #482e1c;
|
background: #482e1c;
|
||||||
background-origin: padding-box;
|
background-origin: padding-box;
|
||||||
border-image: url(../assets/ui/footer-button.webp) 10 repeat;
|
border-image: url(../assets/ui/footer-button.webp) 10 repeat;
|
||||||
@@ -2636,7 +2655,7 @@ select,
|
|||||||
top: calc(50% - 0.4rem + 0.5 * 28%);
|
top: calc(50% - 0.4rem + 0.5 * 28%);
|
||||||
left: calc(50% - 0.4rem + -0.8660254 * 28%);
|
left: calc(50% - 0.4rem + -0.8660254 * 28%);
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .calendar-boutons-heure .calendar-btn:is(.calendar-lyre,.calendar-vaisseau) img {
|
.system-foundryvtt-reve-de-dragon .calendar-boutons-heure .calendar-btn:is(.calendar-lyre, .calendar-vaisseau) img {
|
||||||
color: hsla(0, 0%, 100%, 0.5);
|
color: hsla(0, 0%, 100%, 0.5);
|
||||||
border: none;
|
border: none;
|
||||||
vertical-align: bottom;
|
vertical-align: bottom;
|
||||||
@@ -2676,7 +2695,7 @@ select,
|
|||||||
.system-foundryvtt-reve-de-dragon .calendar-vaisseau {
|
.system-foundryvtt-reve-de-dragon .calendar-vaisseau {
|
||||||
grid-column: 9/10;
|
grid-column: 9/10;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon :is(.calendar-lyre,.calendar-vaisseau) {
|
.system-foundryvtt-reve-de-dragon :is(.calendar-lyre, .calendar-vaisseau) {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
}
|
}
|
||||||
@@ -2688,12 +2707,12 @@ select,
|
|||||||
visibility: hidden;
|
visibility: hidden;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon div.horloge-digitale {
|
.system-foundryvtt-reve-de-dragon div.horloge-digitale {
|
||||||
color: #CCC;
|
color: #ccc;
|
||||||
background: hsl(0, 0%, 20%);
|
background: hsl(0, 0%, 20%);
|
||||||
text-align: center;
|
text-align: center;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon div.horloge-digitale :is(.calendar-heure-texte,.calendar-minute-texte) {
|
.system-foundryvtt-reve-de-dragon div.horloge-digitale :is(.calendar-heure-texte, .calendar-minute-texte) {
|
||||||
font-size: 1rem;
|
font-size: 1rem;
|
||||||
pointer-events: all;
|
pointer-events: all;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
@@ -2786,8 +2805,23 @@ select,
|
|||||||
.system-foundryvtt-reve-de-dragon aside#tooltip .toolclip p.faint {
|
.system-foundryvtt-reve-de-dragon aside#tooltip .toolclip p.faint {
|
||||||
color: var(--color-tooltip-faint);
|
color: var(--color-tooltip-faint);
|
||||||
}
|
}
|
||||||
|
.system-foundryvtt-reve-de-dragon .chat-card-info {
|
||||||
|
font-size: 1.1rem;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
}
|
||||||
|
.system-foundryvtt-reve-de-dragon .chat-card-info img {
|
||||||
|
margin: 0 0.5rem;
|
||||||
|
max-width: 1rem;
|
||||||
|
max-height: 1rem;
|
||||||
|
filter: invert(0.8);
|
||||||
|
}
|
||||||
|
.system-foundryvtt-reve-de-dragon .jet-astrologie {
|
||||||
|
color: var(--major-button-color) !important;
|
||||||
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .chat-card-button,
|
.system-foundryvtt-reve-de-dragon .chat-card-button,
|
||||||
.system-foundryvtt-reve-de-dragon .chat-card-button-pushed {
|
.system-foundryvtt-reve-de-dragon .chat-card-button-checked,
|
||||||
|
.system-foundryvtt-reve-de-dragon select.chat-card-select {
|
||||||
border-radius: 0.2rem;
|
border-radius: 0.2rem;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
font-family: CaslonPro;
|
font-family: CaslonPro;
|
||||||
@@ -2800,29 +2834,27 @@ select,
|
|||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .chat-card-button img,
|
.system-foundryvtt-reve-de-dragon .chat-card-button img,
|
||||||
.system-foundryvtt-reve-de-dragon .chat-card-button-pushed img {
|
.system-foundryvtt-reve-de-dragon .chat-card-button-checked img,
|
||||||
|
.system-foundryvtt-reve-de-dragon select.chat-card-select img {
|
||||||
max-width: 1rem;
|
max-width: 1rem;
|
||||||
max-height: 1rem;
|
max-height: 1rem;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .chat-card-info {
|
.system-foundryvtt-reve-de-dragon select.chat-card-select {
|
||||||
font-size: 1.1rem;
|
width: calc(100% - 0.6rem);
|
||||||
display: flex;
|
color: var(--major-button-color);
|
||||||
flex-direction: row;
|
background-color: var(--background-color-custom-button);
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .chat-card-info img {
|
.system-foundryvtt-reve-de-dragon select.chat-card-select option {
|
||||||
margin: 0 0.5rem;
|
background-color: var(--background-color-custom-button);
|
||||||
max-width: 1rem;
|
|
||||||
max-height: 1rem;
|
|
||||||
filter: invert(0.8);
|
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .chat-card-button {
|
.system-foundryvtt-reve-de-dragon .chat-card-button {
|
||||||
text-shadow: 1px 1px #4d3534;
|
text-shadow: 1px 1px #4d3534;
|
||||||
box-shadow: inset 1x 1px #a6827e;
|
box-shadow: inset 1x 1px #a6827e;
|
||||||
color: var(--major-button-color);
|
color: var(--major-button-color);
|
||||||
background: var(--background-custom-button);
|
background: var(--background-custom-button);
|
||||||
background-color: #7d5d3b00;
|
background-color: var(--background-color-custom-button);
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .chat-card-button-pushed {
|
.system-foundryvtt-reve-de-dragon .chat-card-button-checked {
|
||||||
text-shadow: 1px 1px hsla(202, 30%, 70%, 0.5);
|
text-shadow: 1px 1px hsla(202, 30%, 70%, 0.5);
|
||||||
box-shadow: inset -1px -1px #a6827e;
|
box-shadow: inset -1px -1px #a6827e;
|
||||||
color: hsla(202, 42%, 14%, 0.7);
|
color: hsla(202, 42%, 14%, 0.7);
|
||||||
@@ -2832,11 +2864,11 @@ select,
|
|||||||
.system-foundryvtt-reve-de-dragon .chat-card-button:hover {
|
.system-foundryvtt-reve-de-dragon .chat-card-button:hover {
|
||||||
background: var(--background-custom-button-hover);
|
background: var(--background-custom-button-hover);
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .chat-card-button-pushed:hover {
|
.system-foundryvtt-reve-de-dragon .chat-card-button-checked:hover {
|
||||||
background: var(--background-custom-button-hover);
|
background: var(--background-custom-button-hover);
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon .chat-card-button:active,
|
.system-foundryvtt-reve-de-dragon .chat-card-button:active,
|
||||||
.system-foundryvtt-reve-de-dragon .chat-card-button-pushed:active {
|
.system-foundryvtt-reve-de-dragon .chat-card-button-checked:active {
|
||||||
position: relative;
|
position: relative;
|
||||||
top: 1px;
|
top: 1px;
|
||||||
}
|
}
|
||||||
@@ -2903,7 +2935,7 @@ select,
|
|||||||
background: none;
|
background: none;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon #pause > h3 {
|
.system-foundryvtt-reve-de-dragon #pause > h3 {
|
||||||
color: #CCC;
|
color: #ccc;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon #pause > img {
|
.system-foundryvtt-reve-de-dragon #pause > img {
|
||||||
content: url(../assets/ui/rdd_pause.webp);
|
content: url(../assets/ui/rdd_pause.webp);
|
||||||
@@ -2918,7 +2950,7 @@ select,
|
|||||||
height: 68px;
|
height: 68px;
|
||||||
}
|
}
|
||||||
.system-foundryvtt-reve-de-dragon div.vl {
|
.system-foundryvtt-reve-de-dragon div.vl {
|
||||||
border: 1px solid ;
|
border: 1px solid;
|
||||||
border-color: hsla(0, 0%, 0%, 0.5);
|
border-color: hsla(0, 0%, 0%, 0.5);
|
||||||
height: inherit;
|
height: inherit;
|
||||||
min-height: max-content;
|
min-height: max-content;
|
||||||
|
|||||||
|
After Width: | Height: | Size: 8.3 KiB |
@@ -63,6 +63,7 @@
|
|||||||
"StatusUnarmed": "Désarmé",
|
"StatusUnarmed": "Désarmé",
|
||||||
"StatusGrappling": "Empoignade",
|
"StatusGrappling": "Empoignade",
|
||||||
"StatusGrappled": "Empoigné",
|
"StatusGrappled": "Empoigné",
|
||||||
|
"StatusMalade": "Malade",
|
||||||
"StatusRestrained": "Immobilisé",
|
"StatusRestrained": "Immobilisé",
|
||||||
"StatusComma": "Comma",
|
"StatusComma": "Comma",
|
||||||
"StatusDead": "Mort",
|
"StatusDead": "Mort",
|
||||||
|
|||||||
@@ -44,7 +44,9 @@
|
|||||||
hsla(50, 100%, 80%, 0.7)
|
hsla(50, 100%, 80%, 0.7)
|
||||||
);
|
);
|
||||||
|
|
||||||
--background-custom-button: linear-gradient(to bottom, hsla(208, 38%, 21%, 0.988) 5%, hsla(202, 42%, 14%, 0.671) 100%);
|
--background-color-button: hsl(25, 5%, 60%);
|
||||||
|
--background-color-custom-button: hsla(208, 38%, 21%, 0.988);
|
||||||
|
--background-custom-button: linear-gradient(to bottom, var(--background-color-custom-button) 5%, hsla(202, 42%, 14%, 0.671) 100%);
|
||||||
--background-custom-button-hover: linear-gradient(to bottom, hsla(0, 100%, 25%, 1) 5%, hsla(0, 97%, 12%, 1) 100%);
|
--background-custom-button-hover: linear-gradient(to bottom, hsla(0, 100%, 25%, 1) 5%, hsla(0, 97%, 12%, 1) 100%);
|
||||||
--background-control-selected: linear-gradient(to bottom, hsla(0, 100%, 25%, 0.5) 5%, hsla(0, 100%, 12%, 0.5) 100%);
|
--background-control-selected: linear-gradient(to bottom, hsla(0, 100%, 25%, 0.5) 5%, hsla(0, 100%, 12%, 0.5) 100%);
|
||||||
--background-tooltip: hsla(60, 12%, 85%, 0.95);
|
--background-tooltip: hsla(60, 12%, 85%, 0.95);
|
||||||
|
|||||||
@@ -70,8 +70,7 @@
|
|||||||
/* Fonts */
|
/* Fonts */
|
||||||
.sheet header.sheet-header h1 input,
|
.sheet header.sheet-header h1 input,
|
||||||
.window-app .window-header,
|
.window-app .window-header,
|
||||||
#actors .directory-list,
|
#sidebar {
|
||||||
#navigation #scene-list .scene.nav-item {
|
|
||||||
font-family: "GoudyAcc"
|
font-family: "GoudyAcc"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,6 +79,6 @@
|
|||||||
.window-app input,
|
.window-app input,
|
||||||
.sheet header.sheet-header .header-compteurs,
|
.sheet header.sheet-header .header-compteurs,
|
||||||
.sheet header.sheet-header .flex-group-center.flex-fatigue,
|
.sheet header.sheet-header .flex-group-center.flex-fatigue,
|
||||||
select, .item-checkbox, #sidebar, #players, #navigation #nav-toggle {
|
select, .item-checkbox, #players {
|
||||||
font-family: "CaslonAntique"; /* For sheet parts; For nav and title */
|
font-family: "CaslonAntique"; /* For sheet parts; For nav and title */
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -160,6 +160,9 @@
|
|||||||
font-size: 1.2rem;
|
font-size: 1.2rem;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
|
||||||
|
roll-section[name="resistance"] {
|
||||||
|
align-items: flex-end;
|
||||||
|
}
|
||||||
roll-section {
|
roll-section {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
@@ -174,6 +177,12 @@
|
|||||||
margin: 0 1rem;
|
margin: 0 1rem;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
img.flag-resistance {
|
||||||
|
max-width: 1.5rem;
|
||||||
|
max-height: 1.5rem;
|
||||||
|
text-align: right;
|
||||||
|
filter: invert(0.6);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -208,7 +208,8 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Points de reve actuel
|
// Points de reve actuel
|
||||||
this.html.find('.roll-reve-actuel').click(async event => await this.actor.rollCarac(CARACS.REVE_ACTUEL, { resistance: true }))
|
this.html.find('.roll-reve-actuel').click(async event => await this.actor.rollReveActuel({ resistance: false }))
|
||||||
|
this.html.find('.button-reve-resistance').click(async event => await this.actor.rollReveActuel({ diff: -8, resistance: true }))
|
||||||
this.html.find('.action-empoignade').click(async event => await RdDEmpoignade.onAttaqueEmpoignadeFromItem(RdDSheetUtility.getItem(event, this.actor)))
|
this.html.find('.action-empoignade').click(async event => await RdDEmpoignade.onAttaqueEmpoignadeFromItem(RdDSheetUtility.getItem(event, this.actor)))
|
||||||
|
|
||||||
this.html.find('.roll-arme').click(async event => {
|
this.html.find('.roll-arme').click(async event => {
|
||||||
|
|||||||
@@ -52,7 +52,6 @@ import { PART_TACHE } from "./roll/roll-part-tache.mjs";
|
|||||||
import { PART_COMP } from "./roll/roll-part-comp.mjs";
|
import { PART_COMP } from "./roll/roll-part-comp.mjs";
|
||||||
import { PART_OEUVRE } from "./roll/roll-part-oeuvre.mjs";
|
import { PART_OEUVRE } from "./roll/roll-part-oeuvre.mjs";
|
||||||
import { PART_CUISINE } from "./roll/roll-part-cuisine.mjs";
|
import { PART_CUISINE } from "./roll/roll-part-cuisine.mjs";
|
||||||
import { PART_SORT } from "./roll/roll-part-sort.mjs";
|
|
||||||
|
|
||||||
export const MAINS_DIRECTRICES = ['Droitier', 'Gaucher', 'Ambidextre']
|
export const MAINS_DIRECTRICES = ['Droitier', 'Gaucher', 'Ambidextre']
|
||||||
|
|
||||||
@@ -131,11 +130,6 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
return etatGeneral
|
return etatGeneral
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
getActivePoisons() {
|
|
||||||
return foundry.utils.duplicate(this.items.filter(item => item.type == 'poison' && item.system.active))
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getMalusArmure() {
|
getMalusArmure() {
|
||||||
return this.itemTypes[ITEM_TYPES.armure].filter(it => it.system.equipe)
|
return this.itemTypes[ITEM_TYPES.armure].filter(it => it.system.equipe)
|
||||||
@@ -190,7 +184,10 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
const forceRequise = RdDItemArme.valeurMain(arme.system.force ?? 0, main)
|
const forceRequise = RdDItemArme.valeurMain(arme.system.force ?? 0, main)
|
||||||
const ecaillesEfficacite = arme.system.magique ? arme.system.ecaille_efficacite : 0;
|
const ecaillesEfficacite = arme.system.magique ? arme.system.ecaille_efficacite : 0;
|
||||||
|
|
||||||
const comp = this.getCompetence(RdDActor.$getCompetenceAction(arme, main))
|
const comp = this.getCompetence(arme.getCompetenceAction(main), { onMessage: message => { console.info(message) } })
|
||||||
|
if (!comp) {
|
||||||
|
return
|
||||||
|
}
|
||||||
const unique = [comp.id, arme.name, dommages, forceRequise, ecaillesEfficacite].join('|');
|
const unique = [comp.id, arme.name, dommages, forceRequise, ecaillesEfficacite].join('|');
|
||||||
if (uniques.includes(unique)) {
|
if (uniques.includes(unique)) {
|
||||||
return
|
return
|
||||||
@@ -219,15 +216,12 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
}
|
}
|
||||||
|
|
||||||
addAttaque(RdDItemArme.empoignade(this), ATTAQUE_TYPE.CORPS_A_CORPS)
|
addAttaque(RdDItemArme.empoignade(this), ATTAQUE_TYPE.CORPS_A_CORPS)
|
||||||
|
|
||||||
this.itemTypes[ITEM_TYPES.arme]
|
this.itemTypes[ITEM_TYPES.arme]
|
||||||
.filter(it => it.isAttaque())
|
.filter(it => it.isAttaque())
|
||||||
.sort(Misc.ascending(it => it.name))
|
.sort(Misc.ascending(it => it.name))
|
||||||
.forEach(arme => {
|
.forEach(arme => arme.getTypeAttaques().forEach(t => addAttaque(arme, t)))
|
||||||
if (arme.system.unemain && arme.system.competence && arme.system.resistance > 0) { addAttaque(arme, ATTAQUE_TYPE.UNE_MAIN) }
|
|
||||||
if (arme.system.deuxmains && arme.system.competence && arme.system.resistance > 0) { addAttaque(arme, ATTAQUE_TYPE.DEUX_MAINS) }
|
|
||||||
if (arme.system.lancer && arme.system.resistance > 0) { addAttaque(arme, ATTAQUE_TYPE.LANCER) }
|
|
||||||
if (arme.system.tir) { addAttaque(arme, ATTAQUE_TYPE.TIR) }
|
|
||||||
})
|
|
||||||
addAttaque(RdDItemArme.pugilat(this), ATTAQUE_TYPE.CORPS_A_CORPS)
|
addAttaque(RdDItemArme.pugilat(this), ATTAQUE_TYPE.CORPS_A_CORPS)
|
||||||
|
|
||||||
return actions
|
return actions
|
||||||
@@ -244,16 +238,6 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static $getCompetenceAction(arme, main) {
|
|
||||||
switch (main) {
|
|
||||||
case ATTAQUE_TYPE.UNE_MAIN: return arme.competence1Mains()
|
|
||||||
case ATTAQUE_TYPE.DEUX_MAINS: return arme.competence2Mains()
|
|
||||||
case ATTAQUE_TYPE.LANCER: return arme.system.lancer
|
|
||||||
case ATTAQUE_TYPE.TIR: return arme.system.tir
|
|
||||||
default: return arme.system.competence
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async $perteReveEnchantementsChateauDormants() {
|
async $perteReveEnchantementsChateauDormants() {
|
||||||
const toUpdate = this.items.filter(it => [ITEM_TYPES.potion, ITEM_TYPES.gemme].includes(it.type))
|
const toUpdate = this.items.filter(it => [ITEM_TYPES.potion, ITEM_TYPES.gemme].includes(it.type))
|
||||||
@@ -343,10 +327,6 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
await this._recupererVie(message, isMaladeEmpoisonne);
|
await this._recupererVie(message, isMaladeEmpoisonne);
|
||||||
}
|
}
|
||||||
|
|
||||||
getMaladiesPoisons() {
|
|
||||||
return this.items.filter(item => item.type == 'maladie' || (item.type == 'poison' && item.system.active));
|
|
||||||
}
|
|
||||||
|
|
||||||
_messageRecuperationMaladiePoisons(maladiesPoisons, message) {
|
_messageRecuperationMaladiePoisons(maladiesPoisons, message) {
|
||||||
if (maladiesPoisons.length > 0) {
|
if (maladiesPoisons.length > 0) {
|
||||||
const identifies = maladiesPoisons.filter(it => it.system.identifie);
|
const identifies = maladiesPoisons.filter(it => it.system.identifie);
|
||||||
@@ -1647,7 +1627,8 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
hideChatMessage = hideChatMessage == 'hide' || (Misc.isRollModeHiddenToPlayer() && !game.user.isGM)
|
hideChatMessage = hideChatMessage == 'hide' || (Misc.isRollModeHiddenToPlayer() && !game.user.isGM)
|
||||||
let xpData = await this._appliquerExperience(rollData.rolled, rollData.selectedCarac.label, rollData.competence, rollData.jetResistance);
|
let xpData = await this._appliquerExperience(rollData.rolled, rollData.selectedCarac.label, rollData.competence,
|
||||||
|
rollData.v2 ? rollData.type.resistance : rollData.jetResistance);
|
||||||
if (xpData.length) {
|
if (xpData.length) {
|
||||||
const content = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-gain-xp.hbs`, {
|
const content = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-gain-xp.hbs`, {
|
||||||
actor: this,
|
actor: this,
|
||||||
@@ -1745,16 +1726,16 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
type: { allowed: [ROLL_TYPE_SORT], current: ROLL_TYPE_SORT }
|
type: { allowed: [ROLL_TYPE_SORT], current: ROLL_TYPE_SORT }
|
||||||
};
|
};
|
||||||
const dialog = await RollDialog.create(rollData, {
|
const dialog = await RollDialog.create(rollData, {
|
||||||
callbacks: [roll => {
|
callbacks: [async roll => {
|
||||||
this.tmrApp?.restoreTMRAfterAction();
|
await this.tmrApp?.restoreTMRAfterAction();
|
||||||
if (roll.closeTMR) {
|
if (roll.closeTMR) {
|
||||||
this.tmrApp?.close();
|
await this.tmrApp?.close();
|
||||||
this.tmrApp = undefined;
|
this.tmrApp = undefined;
|
||||||
}
|
}
|
||||||
}],
|
}],
|
||||||
onRollDone: RollDialog.onRollDoneClose,
|
onRollDone: RollDialog.onRollDoneClose,
|
||||||
onClose: () => {
|
onClose: async () => {
|
||||||
this.tmrApp?.restoreTMRAfterAction();
|
await this.tmrApp?.restoreTMRAfterAction();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.tmrApp?.setTMRPendingAction(dialog);
|
this.tmrApp?.setTMRPendingAction(dialog);
|
||||||
@@ -1955,8 +1936,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
diff: { value: diff ?? 0 }
|
diff: { value: diff ?? 0 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RollDialog.create(rollData, foundry.utils.mergeObject(options, { onRollDone: RollDialog.onRollDoneClose }))
|
return await RollDialog.create(rollData)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RdDEmpoignade.checkEmpoignadeEnCours(this)
|
RdDEmpoignade.checkEmpoignadeEnCours(this)
|
||||||
@@ -1990,8 +1970,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
selected: { tache: { key: tache.id, forced: options.forced } },
|
selected: { tache: { key: tache.id, forced: options.forced } },
|
||||||
type: { allowed: [PART_TACHE], current: PART_TACHE }
|
type: { allowed: [PART_TACHE], current: PART_TACHE }
|
||||||
}
|
}
|
||||||
RollDialog.create(rollData, options)
|
return await RollDialog.create(rollData)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const compData = this.getCompetence(tache.system.competence)
|
const compData = this.getCompetence(tache.system.competence)
|
||||||
@@ -2050,8 +2029,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
selected: { jeu: { key: jeu.id } },
|
selected: { jeu: { key: jeu.id } },
|
||||||
type: { allowed: [ROLL_TYPE_JEU], current: ROLL_TYPE_JEU }
|
type: { allowed: [ROLL_TYPE_JEU], current: ROLL_TYPE_JEU }
|
||||||
}
|
}
|
||||||
await RollDialog.create(rollData, { onRollDone: RollDialog.onRollDoneClose })
|
return await RollDialog.create(rollData)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const listCarac = jeu.system.caraccomp.toLowerCase().split(/[.,:\/-]/).map(it => it.trim());
|
const listCarac = jeu.system.caraccomp.toLowerCase().split(/[.,:\/-]/).map(it => it.trim());
|
||||||
@@ -2079,8 +2057,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
selected: { meditation: { key: id } },
|
selected: { meditation: { key: id } },
|
||||||
type: { allowed: [ROLL_TYPE_MEDITATION], current: ROLL_TYPE_MEDITATION }
|
type: { allowed: [ROLL_TYPE_MEDITATION], current: ROLL_TYPE_MEDITATION }
|
||||||
}
|
}
|
||||||
await RollDialog.create(rollData, { onRollDone: RollDialog.onRollDoneClose })
|
return await RollDialog.create(rollData)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const competence = foundry.utils.duplicate(this.getCompetence(meditation.system.competence));
|
const competence = foundry.utils.duplicate(this.getCompetence(meditation.system.competence));
|
||||||
@@ -2279,7 +2256,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
|
|
||||||
const xpCompetence = competence ? xp - xpCarac : 0;
|
const xpCompetence = competence ? xp - xpCarac : 0;
|
||||||
if (jetResistance) {
|
if (jetResistance) {
|
||||||
const message = `Jet de résistance ${jetResistance}, l'expérience est limitée à 1`;
|
const message = `Jet de résistance, l'expérience est limitée à 1`;
|
||||||
ui.notifications.info(message);
|
ui.notifications.info(message);
|
||||||
console.log(message)
|
console.log(message)
|
||||||
// max 1 xp sur jets de résistance
|
// max 1 xp sur jets de résistance
|
||||||
@@ -3159,7 +3136,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
selected: { oeuvre: { key: oeuvre.id } },
|
selected: { oeuvre: { key: oeuvre.id } },
|
||||||
type: { allowed: [PART_OEUVRE], current: PART_OEUVRE, },
|
type: { allowed: [PART_OEUVRE], current: PART_OEUVRE, },
|
||||||
}
|
}
|
||||||
await RollDialog.create(rollData, { onRollDone: RollDialog.onRollDoneClose })
|
return await RollDialog.create(rollData)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -3264,8 +3241,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
cuisine: { key: recette.id }
|
cuisine: { key: recette.id }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RollDialog.create(rollData, { onRollDone: RollDialog.onRollDoneClose })
|
return await RollDialog.create(rollData)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const artData = {
|
const artData = {
|
||||||
@@ -3315,8 +3291,7 @@ export class RdDActor extends RdDBaseActorSang {
|
|||||||
cuisine: { key: item.id }
|
cuisine: { key: item.id }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RollDialog.create(rollData, { onRollDone: RollDialog.onRollDoneClose })
|
return await RollDialog.create(rollData)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item.getUtilisationCuisine() == 'brut') {
|
if (item.getUtilisationCuisine() == 'brut') {
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ import { BASE_CORPS_A_CORPS, BASE_ESQUIVE, POSSESSION_SANS_DRACONIC } from "../i
|
|||||||
import { RollDataAjustements } from "../rolldata-ajustements-v1.js";
|
import { RollDataAjustements } from "../rolldata-ajustements-v1.js";
|
||||||
import { MappingCreatureArme } from "../item/mapping-creature-arme.mjs";
|
import { MappingCreatureArme } from "../item/mapping-creature-arme.mjs";
|
||||||
import RollDialog from "../roll/roll-dialog.mjs";
|
import RollDialog from "../roll/roll-dialog.mjs";
|
||||||
import { ATTAQUE_ROLL_TYPES, DEFAULT_ROLL_TYPES, DIFF, ROLL_TYPE_ATTAQUE, ROLL_TYPE_COMP, ROLL_TYPE_JEU, ROLL_TYPE_MEDITATION, ROLL_TYPE_OEUVRE, ROLL_TYPE_TACHE } from "../roll/roll-constants.mjs";
|
import { ATTAQUE_ROLL_TYPES, DEFAULT_ROLL_TYPES, DIFF, DIFFS, ROLL_TYPE_ATTAQUE, ROLL_TYPE_COMP, ROLL_TYPE_JEU, ROLL_TYPE_MEDITATION, ROLL_TYPE_OEUVRE, ROLL_TYPE_TACHE } from "../roll/roll-constants.mjs";
|
||||||
import { OptionsAvancees, ROLL_DIALOG_V2 } from "../settings/options-avancees.js";
|
import { OptionsAvancees, ROLL_DIALOG_V2 } from "../settings/options-avancees.js";
|
||||||
import { PART_COMP } from "../roll/roll-part-comp.mjs";
|
import { PART_COMP } from "../roll/roll-part-comp.mjs";
|
||||||
|
|
||||||
@@ -157,11 +157,9 @@ export class RdDBaseActorReve extends RdDBaseActor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async $finDeRoundEmpoignade() {
|
async $finDeRoundEmpoignade() {
|
||||||
const immobilisations = this.itemTypes[ITEM_TYPES.empoignade].filter(it => it.system.pointsemp >= 2 && it.system.empoigneurid == this.id);
|
await Promise.all(this.itemTypes[ITEM_TYPES.empoignade]
|
||||||
immobilisations.forEach(emp => RdDEmpoignade.onImmobilisation(this,
|
.filter(it => it.system.pointsemp >= 2 && it.system.empoigneurid == this.id)
|
||||||
game.actors.get(emp.system.empoigneid),
|
.map(async it => await RdDEmpoignade.onImmobilisation(this, it)))
|
||||||
emp
|
|
||||||
))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async setSonne(sonne = true) { }
|
async setSonne(sonne = true) { }
|
||||||
@@ -284,8 +282,7 @@ export class RdDBaseActorReve extends RdDBaseActor {
|
|||||||
diff: { value: diff }
|
diff: { value: diff }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RollDialog.create(rollData, options)
|
return await RollDialog.create(rollData, options)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const competence = this.getCompetence(compName);
|
const competence = this.getCompetence(compName);
|
||||||
@@ -359,6 +356,26 @@ export class RdDBaseActorReve extends RdDBaseActor {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
async rollReveActuel({ diff = 0, resistance = false }) {
|
||||||
|
if (OptionsAvancees.isUsing(ROLL_DIALOG_V2)) {
|
||||||
|
const rollData = {
|
||||||
|
ids: { actorId: this.id },
|
||||||
|
type: {
|
||||||
|
allowed: [PART_COMP],
|
||||||
|
current: PART_COMP,
|
||||||
|
resistance: resistance
|
||||||
|
},
|
||||||
|
selected: {
|
||||||
|
carac: { key: CARACS.REVE_ACTUEL, forced: true },
|
||||||
|
comp: resistance ? { key: undefined, forced: true } : undefined,
|
||||||
|
diff: { type: DIFF.DEFAUT, value: diff }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return await RollDialog.create(rollData)
|
||||||
|
}
|
||||||
|
return this.rollCarac(CARACS.REVE_ACTUEL, { diff, resistance })
|
||||||
|
}
|
||||||
|
|
||||||
async rollCarac(caracName, options = {}) {
|
async rollCarac(caracName, options = {}) {
|
||||||
if (Grammar.equalsInsensitive(caracName, CARACS.TAILLE)) {
|
if (Grammar.equalsInsensitive(caracName, CARACS.TAILLE)) {
|
||||||
return
|
return
|
||||||
@@ -366,14 +383,18 @@ export class RdDBaseActorReve extends RdDBaseActor {
|
|||||||
if (OptionsAvancees.isUsing(ROLL_DIALOG_V2)) {
|
if (OptionsAvancees.isUsing(ROLL_DIALOG_V2)) {
|
||||||
const rollData = {
|
const rollData = {
|
||||||
ids: { actorId: this.id },
|
ids: { actorId: this.id },
|
||||||
type: { allowed: DEFAULT_ROLL_TYPES, current: PART_COMP },
|
type: {
|
||||||
|
allowed: options.resistance ? [PART_COMP] : DEFAULT_ROLL_TYPES,
|
||||||
|
current: PART_COMP,
|
||||||
|
resistance: options.resistance
|
||||||
|
},
|
||||||
selected: {
|
selected: {
|
||||||
carac: { key: caracName },
|
carac: { key: caracName },
|
||||||
comp: options.resistance ? { key: undefined, forced: true } : undefined
|
comp: options.resistance ? { key: undefined, forced: true } : undefined,
|
||||||
|
diff: { type: DIFF.DEFAUT, value: options.diff ?? 0 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RollDialog.create(rollData, options)
|
return await RollDialog.create(rollData, options)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
foundry.utils.mergeObject(options, { resistance: false, diff: 0 }, { overwrite: false })
|
foundry.utils.mergeObject(options, { resistance: false, diff: 0 }, { overwrite: false })
|
||||||
@@ -487,7 +508,7 @@ export class RdDBaseActorReve extends RdDBaseActor {
|
|||||||
allowed: [ROLL_TYPE_ATTAQUE], current: ROLL_TYPE_ATTAQUE
|
allowed: [ROLL_TYPE_ATTAQUE], current: ROLL_TYPE_ATTAQUE
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
return await RollDialog.create(rollData)
|
return await RollDialog.create(rollData, { onRollDone: RollDialog.onRollDoneClose })
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
|
|||||||
let result = {
|
let result = {
|
||||||
sonne: false,
|
sonne: false,
|
||||||
};
|
};
|
||||||
|
let perteEndurance = 0
|
||||||
let minValue = name == "vie" ? -this.getSConst() - 1 : 0;
|
let minValue = name == "vie" ? -this.getSConst() - 1 : 0;
|
||||||
|
|
||||||
result.newValue = Math.max(minValue, Math.min(compteur.value + inc, compteur.max));
|
result.newValue = Math.max(minValue, Math.min(compteur.value + inc, compteur.max));
|
||||||
@@ -145,16 +145,10 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
|
|||||||
if (inc > 0) { // le max d'endurance s'applique seulement à la récupération
|
if (inc > 0) { // le max d'endurance s'applique seulement à la récupération
|
||||||
result.newValue = Math.min(result.newValue, this._computeEnduranceMax())
|
result.newValue = Math.min(result.newValue, this._computeEnduranceMax())
|
||||||
}
|
}
|
||||||
const perte = compteur.value - result.newValue;
|
perteEndurance = compteur.value - result.newValue;
|
||||||
result.perte = perte;
|
result.perte = perteEndurance
|
||||||
if (perte > 1) {
|
|
||||||
// Peut-être sonné si 2 points d'endurance perdus d'un coup
|
|
||||||
foundry.utils.mergeObject(result, await this.jetEndurance(result.newValue));
|
|
||||||
} else if (inc > 0) {
|
|
||||||
await this.setSonne(false);
|
|
||||||
}
|
|
||||||
if (sante.fatigue && inc < 0) { // Each endurance lost -> fatigue lost
|
if (sante.fatigue && inc < 0) { // Each endurance lost -> fatigue lost
|
||||||
fatigue = perte;
|
fatigue = perteEndurance;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
compteur.value = result.newValue;
|
compteur.value = result.newValue;
|
||||||
@@ -163,6 +157,14 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
|
|||||||
sante.fatigue.value = Math.max(sante.fatigue.value + fatigue, this.getFatigueMin());
|
sante.fatigue.value = Math.max(sante.fatigue.value + fatigue, this.getFatigueMin());
|
||||||
}
|
}
|
||||||
await this.update({ "system.sante": sante }, { render: true })
|
await this.update({ "system.sante": sante }, { render: true })
|
||||||
|
|
||||||
|
if (perteEndurance > 1) {
|
||||||
|
// Peut-être sonné si 2 points d'endurance perdus d'un coup
|
||||||
|
foundry.utils.mergeObject(result, await this.jetEndurance(result.newValue));
|
||||||
|
} else if (name == "endurance" && inc > 0) {
|
||||||
|
await this.setSonne(false);
|
||||||
|
}
|
||||||
|
|
||||||
if (this.isDead()) {
|
if (this.isDead()) {
|
||||||
await this.setEffect(STATUSES.StatusComma, true);
|
await this.setEffect(STATUSES.StatusComma, true);
|
||||||
}
|
}
|
||||||
@@ -181,28 +183,46 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async onCreateItem(item, options, id) {
|
async onCreateItem(item, options, id) {
|
||||||
switch (item.type) {
|
await this.changeItemEffects(item)
|
||||||
case ITEM_TYPES.blessure:
|
|
||||||
await this.changeBleedingState()
|
|
||||||
break
|
|
||||||
}
|
|
||||||
await super.onCreateItem(item, options, id)
|
await super.onCreateItem(item, options, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
async onUpdateItem(item, options, id) {
|
async onUpdateItem(item, options, id) {
|
||||||
switch (item.type) {
|
await this.changeItemEffects(item);
|
||||||
case ITEM_TYPES.blessure:
|
|
||||||
await this.changeBleedingState()
|
|
||||||
break
|
|
||||||
}
|
|
||||||
await super.onUpdateItem(item, options, id)
|
await super.onUpdateItem(item, options, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
async changeBleedingState() {
|
async onDeleteItem(item, options, id) {
|
||||||
|
await this.changeItemEffects(item);
|
||||||
|
await super.onDeleteItem(item, options, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async changeItemEffects(item) {
|
||||||
|
switch (item.type) {
|
||||||
|
case ITEM_TYPES.blessure:
|
||||||
|
await this.changeStateBleeding();
|
||||||
|
break;
|
||||||
|
case ITEM_TYPES.maladie:
|
||||||
|
case ITEM_TYPES.poison:
|
||||||
|
await this.changeStateMalade();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async changeStateBleeding() {
|
||||||
const bleeding = this.itemTypes[ITEM_TYPES.blessure].find(it => it.isBleeding())
|
const bleeding = this.itemTypes[ITEM_TYPES.blessure].find(it => it.isBleeding())
|
||||||
await this.setEffect(STATUSES.StatusBleeding, bleeding ? true : false)
|
await this.setEffect(STATUSES.StatusBleeding, bleeding ? true : false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async changeStateMalade() {
|
||||||
|
const maladiePoisons = this.getMaladiesPoisons()
|
||||||
|
await this.setEffect(STATUSES.StatusMalade, maladiePoisons.length > 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
getMaladiesPoisons() {
|
||||||
|
return this.items.filter(it => [ITEM_TYPES.maladie, ITEM_TYPES.poison].includes(it.type))
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async ajouterBlessure(encaissement, attackerToken = undefined) {
|
async ajouterBlessure(encaissement, attackerToken = undefined) {
|
||||||
if (encaissement.gravite < 0) return;
|
if (encaissement.gravite < 0) return;
|
||||||
|
|||||||
@@ -279,11 +279,24 @@ export class RdDBaseActor extends Actor {
|
|||||||
|
|
||||||
async removeEffects(filter = e => true) {
|
async removeEffects(filter = e => true) {
|
||||||
if (game.user.isGM) {
|
if (game.user.isGM) {
|
||||||
const effectsToRemove = this.getEffects(filter);
|
const ids = this.getEffects(filter)
|
||||||
const ids = effectsToRemove.map(it => it.id);
|
.filter(it => this.canRemoveEffects(it))
|
||||||
await this.deleteEmbeddedDocuments('ActiveEffect', ids);
|
.map(it => it.id)
|
||||||
|
if (ids.length > 0) {
|
||||||
|
await this.deleteEmbeddedDocuments('ActiveEffect', ids)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
canRemoveEffects(effect) {
|
||||||
|
if (effect.statuses.has(STATUSES.StatusSurEnc)) {
|
||||||
|
return !this.isSurenc()
|
||||||
|
}
|
||||||
|
if (effect.statuses.has(STATUSES.StatusDemiReve)) {
|
||||||
|
return !this.tmrApp
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async updateCarac(caracName, to) {
|
async updateCarac(caracName, to) {
|
||||||
|
|||||||
@@ -0,0 +1,288 @@
|
|||||||
|
import { ACTOR_TYPES, ITEM_TYPES } from "../../constants.js"
|
||||||
|
import { Grammar } from "../../grammar.js"
|
||||||
|
import { RdDItemArme } from "../../item/arme.js"
|
||||||
|
import { CATEGORIES_COMPETENCE_COMBAT } from "../../item/base-items.js"
|
||||||
|
import { Misc } from "../../misc.js"
|
||||||
|
import { RdDTimestamp } from "../../time/rdd-timestamp.js"
|
||||||
|
import { PDFDocument } from "./pdf-lib/pdf-lib.esm.js"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const copyProperty = (actor, path) => foundry.utils.getProperty(actor, path)
|
||||||
|
|
||||||
|
// const findItem = (actor, itemType, itemName) => actor.itemTypes[itemType].find(it => Grammar.equalsInsensitive(formCompName(it.name), formCompName(itemName)))
|
||||||
|
// const findItemPos = (actor, itemType, pos) => actor.itemTypes[itemType].length <= pos ? actor.itemTypes[itemType][pos] : length
|
||||||
|
// const findProperty = (it, path) => it ? foundry.utils.getProperty(it, path) : undefined
|
||||||
|
|
||||||
|
// const findItemProperty = (actor, itemType, itemName, path) => findProperty(findItem(actor, itemType, itemName), path)
|
||||||
|
// const findItemPosProperty = (actor, itemType, pos, path) => findProperty(findItemPos(actor, itemType, pos), path)
|
||||||
|
|
||||||
|
// const findArmeProperty = (actor, pos, path) => findProperty(findItemPos(actor, ITEM_TYPES.arme, pos), path)
|
||||||
|
// const findSortProperty = (actor, pos, path) => findProperty(findItemPos(actor, ITEM_TYPES.sort, pos), path)
|
||||||
|
|
||||||
|
// const itemFormPath = (type, pos, property) => `${type}s.${pos}.${property}`
|
||||||
|
|
||||||
|
|
||||||
|
const ACTOR_TO_FORM_MAPPING = [
|
||||||
|
{ path: 'name' },
|
||||||
|
{ path: 'system.carac.taille.value' },
|
||||||
|
{ path: 'system.carac.apparence.value' },
|
||||||
|
{ path: 'system.carac.apparence.xp' },
|
||||||
|
{ path: 'system.carac.constitution.value' },
|
||||||
|
{ path: 'system.carac.constitution.xp' },
|
||||||
|
{ path: 'system.carac.force.value' },
|
||||||
|
{ path: 'system.carac.force.value' },
|
||||||
|
{ path: 'system.carac.force.xp' },
|
||||||
|
{ path: 'system.carac.agilite.value' },
|
||||||
|
{ path: 'system.carac.agilite.xp' },
|
||||||
|
{ path: 'system.carac.dexterite.value' },
|
||||||
|
{ path: 'system.carac.dexterite.xp' },
|
||||||
|
{ path: 'system.carac.vue.value' },
|
||||||
|
{ path: 'system.carac.vue.xp' },
|
||||||
|
{ path: 'system.carac.ouie.value' },
|
||||||
|
{ path: 'system.carac.ouie.xp' },
|
||||||
|
{ path: 'system.carac.odoratgout.value' },
|
||||||
|
{ path: 'system.carac.odoratgout.xp' },
|
||||||
|
{ path: 'system.carac.volonte.value' },
|
||||||
|
{ path: 'system.carac.volonte.xp' },
|
||||||
|
{ path: 'system.carac.empathie.value' },
|
||||||
|
{ path: 'system.carac.empathie.xp' },
|
||||||
|
{ path: 'system.carac.intellect.value' },
|
||||||
|
{ path: 'system.carac.intellect.xp' },
|
||||||
|
{ path: 'system.carac.reve.value' },
|
||||||
|
{ path: 'system.carac.reve.xp' },
|
||||||
|
{ path: 'system.carac.chance.value' },
|
||||||
|
{ path: 'system.carac.chance.xp' },
|
||||||
|
|
||||||
|
{ path: 'system.age' },
|
||||||
|
{ path: 'system.sexe' },
|
||||||
|
{ path: 'system.taille' },
|
||||||
|
{ path: 'system.poids' },
|
||||||
|
{ path: 'system.cheveux' },
|
||||||
|
{ path: 'system.yeux' },
|
||||||
|
{ path: 'system.beaute' },
|
||||||
|
{ path: 'system.main' },
|
||||||
|
{ path: 'system.heure' },
|
||||||
|
{ path: 'computed.hn.heure', getter: actor => (RdDTimestamp.definition(actor.system.heure)?.heure ?? 0) + 1 },
|
||||||
|
{ path: 'computed.hn.label', getter: actor => RdDTimestamp.definition(actor.system.heure)?.avecArticle },
|
||||||
|
|
||||||
|
{ path: 'system.carac.melee.value' },
|
||||||
|
{ path: 'system.carac.tir.value' },
|
||||||
|
{ path: 'system.carac.lancer.value' },
|
||||||
|
{ path: 'system.carac.derobee.value' },
|
||||||
|
{ path: 'system.sante.vie.value' },
|
||||||
|
{ path: 'system.sante.endurance.value' },
|
||||||
|
|
||||||
|
{ path: 'system.attributs.sust.value' },
|
||||||
|
{ path: 'system.attributs.sconst.value' },
|
||||||
|
{ path: 'system.attributs.encombrement.value' },
|
||||||
|
{ path: 'system.attributs.plusdom.value', getter: actor => Misc.toSignedString(actor.system.attributs.plusdom.value) },
|
||||||
|
|
||||||
|
// , getter: actor => actor.get
|
||||||
|
]
|
||||||
|
|
||||||
|
export default class ExportPdf {
|
||||||
|
|
||||||
|
static init() {
|
||||||
|
Hooks.on("getActorContextOptions", (actorDirectory, menus) => { ExportPdf.onActorDirectoryMenu(actorDirectory, menus) })
|
||||||
|
}
|
||||||
|
|
||||||
|
static onActorDirectoryMenu(actorDirectory, menus) {
|
||||||
|
menus.push({
|
||||||
|
name: 'Export PDF',
|
||||||
|
icon: '<i class="fa-regular fa-file-pdf"></i>',
|
||||||
|
condition: target => actorDirectory.id == 'actors' && ExportPdf.$isActorPersonnage(this.$getActor(target)),
|
||||||
|
callback: async target => await ExportPdf.exportActor(target)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
static $getActor(target) {
|
||||||
|
const entryId = $(target).closest(".directory-item")?.data("entryId")
|
||||||
|
return game.actors.get(entryId)
|
||||||
|
}
|
||||||
|
|
||||||
|
static $isActorPersonnage(actor) {
|
||||||
|
return actor?.type == ACTOR_TYPES.personnage
|
||||||
|
}
|
||||||
|
|
||||||
|
static async exportActor(target) {
|
||||||
|
const actor = ExportPdf.$getActor(target)
|
||||||
|
if (!ExportPdf.$isActorPersonnage(actor)) {
|
||||||
|
ui.notifications.error("Pas de personnage sélectionné")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const templatePdf = '/systems/foundryvtt-reve-de-dragon/assets/feuille-personnage.pdf';
|
||||||
|
|
||||||
|
const pdfBytes = await fetch(templatePdf).then(res => res.arrayBuffer())
|
||||||
|
const pdfDoc = await PDFDocument.load(pdfBytes)
|
||||||
|
|
||||||
|
const exporter = new ExportPdf(actor, pdfDoc)
|
||||||
|
exporter.generateFeuillePersonnage()
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(actor, pdfDoc) {
|
||||||
|
this.pdfDoc = pdfDoc
|
||||||
|
this.form = this.pdfDoc.getForm()
|
||||||
|
this.actor = actor
|
||||||
|
this.allComps = this.actor.itemTypes[ITEM_TYPES.competence]
|
||||||
|
this.comps = this.allComps
|
||||||
|
.filter(it => !it.isNiveauBase())
|
||||||
|
.sort(Misc.ascending(it => it.name))
|
||||||
|
|
||||||
|
this.compsNonArmes = this.comps.filter(it => !ExportPdf.isCompCombat(it))
|
||||||
|
this.compsArmes = this.comps.filter(it => ExportPdf.isCompCombat(it))
|
||||||
|
this.addedComps = new Set([])
|
||||||
|
}
|
||||||
|
|
||||||
|
static isCompCombat(comp) {
|
||||||
|
return CATEGORIES_COMPETENCE_COMBAT.includes(comp.system.categorie) && !Grammar.includesLowerCaseNoAccent(comp.name, "corps à corps") && !Grammar.includesLowerCaseNoAccent(comp.name, "esquive")
|
||||||
|
}
|
||||||
|
|
||||||
|
async generateFeuillePersonnage() {
|
||||||
|
|
||||||
|
this.$exportActorFields()
|
||||||
|
this.$exportCompetences()
|
||||||
|
this.$exportArchetype()
|
||||||
|
this.$exportArmes()
|
||||||
|
this.$exportSorts()
|
||||||
|
|
||||||
|
const pdfBytes = await this.pdfDoc.save();
|
||||||
|
const filename = `rdd-${this.actor.name.slugify()}.pdf`;
|
||||||
|
foundry.utils.saveDataToFile(pdfBytes, "application/pdf", filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
$exportActorFields() {
|
||||||
|
ACTOR_TO_FORM_MAPPING.forEach(async (mapping) => {
|
||||||
|
const path = mapping.path
|
||||||
|
const value = mapping.getter ? mapping.getter(this.actor) : copyProperty(this.actor, path)
|
||||||
|
this.$setFormValue(path, value)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
$exportCompetences() {
|
||||||
|
this.compsNonArmes
|
||||||
|
.filter(it => !this.addedComps.has(it.id))
|
||||||
|
.forEach(comp => {
|
||||||
|
const formCompName = Grammar.toLowerCaseNoAccent(comp.name.replaceAll(/(\s|-|\')/g, '_'))
|
||||||
|
this.$setFormCompetence(formCompName, comp)
|
||||||
|
})
|
||||||
|
const musique = this.compsNonArmes.filter(it => Grammar.includesLowerCaseNoAccent(it.name, 'musique'))
|
||||||
|
.sort(Misc.descending(it => it.system.niveau))
|
||||||
|
.filter(it => !this.addedComps.has(it.id))
|
||||||
|
.find(it => true)
|
||||||
|
if (musique) {
|
||||||
|
this.$setFormCompetence('musique', musique)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$exportArchetype() {
|
||||||
|
this.allComps.sort(Misc.ascending(it => it.system.niveau_archetype))
|
||||||
|
.forEach(comp => {
|
||||||
|
let formCompName = Grammar.toLowerCaseNoAccent(comp.name.replaceAll(/(\s|-|\')/g, '_'))
|
||||||
|
if (formCompName.includes('musique')) {
|
||||||
|
formCompName = 'musique'
|
||||||
|
}
|
||||||
|
this.$setFormValue(`competences.${formCompName}.niveau_archetype`, comp.system.niveau_archetype)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
$setFormCompetenceArchetype(formCompName, comp, baseFormName = 'competences') {
|
||||||
|
}
|
||||||
|
|
||||||
|
$exportArmes() {
|
||||||
|
const uniques = new Set([])
|
||||||
|
const armes = this.actor.itemTypes[ITEM_TYPES.arme].map(arme => arme.getTypeAttaques()
|
||||||
|
.map(main => {
|
||||||
|
const compName = arme.getCompetenceAction(main)
|
||||||
|
const dommages = RdDItemArme.valeurMain(arme.system.dommages, main)
|
||||||
|
const forceRequise = RdDItemArme.valeurMain(arme.system.force ?? 0, main)
|
||||||
|
const comp = this.compsArmes.find(it => Grammar.equalsInsensitive(it.name, compName)) ?? this.actor.findItemLike(compName, ITEM_TYPES.competence)
|
||||||
|
const unique = [comp.id, arme.name, dommages, forceRequise].join('|');
|
||||||
|
if (uniques.has(unique)) {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
uniques.add(unique)
|
||||||
|
return { arme: arme, comp: comp, main: main }
|
||||||
|
}))
|
||||||
|
.reduce((a, b) => a.concat(b))
|
||||||
|
.filter(it => it != undefined && !it.comp.isNiveauBase())
|
||||||
|
.sort(Misc.descending(it => it.comp.niveau))
|
||||||
|
|
||||||
|
for (let pos = 0; pos < armes.length; pos++) {
|
||||||
|
const it = armes[pos]
|
||||||
|
this.$setFormArmeCompetence(pos, it.comp, it.arme, it.main, it.main)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: list comps without weapons
|
||||||
|
// TODO: list other comps not in the standard list -- use an instance of ExportPdf to hold state/built list
|
||||||
|
const otherComps = this.comps.filter(it => !this.addedComps.has(it.id))
|
||||||
|
for (let pos = 0; pos < otherComps.length; pos++) {
|
||||||
|
const comp = otherComps[pos]
|
||||||
|
this.$setFormCompetence(pos, comp, 'competences')
|
||||||
|
this.$setFormValue(`competences.${pos}.name`, comp.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$setFormCompetence(formCompName, comp, baseFormName = 'competences') {
|
||||||
|
|
||||||
|
if (this.form.getFieldMaybe(`${baseFormName}.${formCompName}.niveau`)) {
|
||||||
|
this.addedComps.add(comp.id)
|
||||||
|
}
|
||||||
|
if (comp.system.niveau != comp.system.base) {
|
||||||
|
this.$setFormValue(`${baseFormName}.${formCompName}.niveau`, comp.system.niveau)
|
||||||
|
}
|
||||||
|
if (comp.system.xp > 0) {
|
||||||
|
this.$setFormValue(`${baseFormName}.${formCompName}.xp`, comp.system.xp)
|
||||||
|
}
|
||||||
|
if (comp.system.xp_sort > 0) {
|
||||||
|
this.$setFormValue(`${baseFormName}.${formCompName}.xp_sort`, comp.system.xp_sort)
|
||||||
|
}
|
||||||
|
if (CATEGORIES_COMPETENCE_COMBAT.includes(comp.system.categorie)) {
|
||||||
|
this.$setFormValue(`${baseFormName}.${formCompName}.init`, comp.getBaseInit())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$setFormArmeCompetence(pos, comp, arme, main) {
|
||||||
|
this.$setFormCompetence(pos, comp, 'armes')
|
||||||
|
this.$setFormValue(`armes.${pos}.name`, arme.name)
|
||||||
|
this.$setFormValue(`armes.${pos}.main`, main)
|
||||||
|
this.$setFormValue(`armes.${pos}.plusdom`, RdDItemArme.valeurMain(arme.system.dommages, main))
|
||||||
|
}
|
||||||
|
|
||||||
|
$exportSorts() {
|
||||||
|
const sorts = this.actor.itemTypes[ITEM_TYPES.sort].sort(Misc.ascending(s => ExportPdf.$orderDraconic(s) + s.name))
|
||||||
|
|
||||||
|
for (let pos = 0; pos < sorts.length; pos++) {
|
||||||
|
const sort = sorts[pos]
|
||||||
|
this.$setFormSort(pos, sort)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$setFormSort(pos, sort) {
|
||||||
|
this.$setFormValue(`sorts.${pos}.name`, sort.name)
|
||||||
|
this.$setFormValue(`sorts.${pos}.voie`, sort.system.draconic)
|
||||||
|
this.$setFormValue(`sorts.${pos}.tmr`, sort.system.caseTMRSpeciale ?? sort.system.caseTMR)
|
||||||
|
this.$setFormValue(`sorts.${pos}.diff`, sort.system.difficulte)
|
||||||
|
this.$setFormValue(`sorts.${pos}.reve`, sort.system.ptreve)
|
||||||
|
this.$setFormValue(`sorts.${pos}.bonuscase`, sort.system.bonuscase)
|
||||||
|
}
|
||||||
|
|
||||||
|
static $orderDraconic(s) {
|
||||||
|
switch (s.system.draconic.substring(0, 1)) {
|
||||||
|
case 'O': return 1
|
||||||
|
case 'H': return 2
|
||||||
|
case 'N': return 3
|
||||||
|
case 'T': return 4
|
||||||
|
}
|
||||||
|
return 5
|
||||||
|
}
|
||||||
|
|
||||||
|
$setFormValue(path, value) {
|
||||||
|
const hasField = this.form.getFieldMaybe(path)
|
||||||
|
if (hasField && value != undefined) {
|
||||||
|
const field = this.form.getTextField(path)
|
||||||
|
field.setText(value.toString())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -63,6 +63,9 @@ export const RDD_CONFIG = {
|
|||||||
empoignade: 'systems/foundryvtt-reve-de-dragon/assets/actions/empoignade.svg',
|
empoignade: 'systems/foundryvtt-reve-de-dragon/assets/actions/empoignade.svg',
|
||||||
forceWeak: 'systems/foundryvtt-reve-de-dragon/assets/actions/weak.svg',
|
forceWeak: 'systems/foundryvtt-reve-de-dragon/assets/actions/weak.svg',
|
||||||
surenc: 'systems/foundryvtt-reve-de-dragon/assets/actions/surenc.svg',
|
surenc: 'systems/foundryvtt-reve-de-dragon/assets/actions/surenc.svg',
|
||||||
|
magique: 'systems/foundryvtt-reve-de-dragon/assets/actions/magique.svg',
|
||||||
|
armebrisee: 'systems/foundryvtt-reve-de-dragon/assets/actions/arme-brisee.svg',
|
||||||
|
malade: 'systems/foundryvtt-reve-de-dragon/assets/actions/malade.svg',
|
||||||
},
|
},
|
||||||
encaissement: {
|
encaissement: {
|
||||||
mortel: 'mortel',
|
mortel: 'mortel',
|
||||||
|
|||||||
@@ -20,11 +20,11 @@ export class RdDInitiative {
|
|||||||
return "1d6" + (base >= 0 ? "+" : "") + base
|
return "1d6" + (base >= 0 ? "+" : "") + base
|
||||||
}
|
}
|
||||||
|
|
||||||
static ajustementInitiative(caracValue, niveau, bonus) {
|
static ajustementInitiative(caracValue, niveau, bonus = 0) {
|
||||||
return niveau + Math.floor(caracValue / 2) + bonus
|
return niveau + Math.floor(caracValue / 2) + bonus
|
||||||
}
|
}
|
||||||
|
|
||||||
static formule(phase, carac, niveau, bonusMalus) {
|
static formule(phase, carac, niveau, bonusMalus = 0) {
|
||||||
const ajustement = RdDInitiative.ajustementInitiative(carac, niveau, bonusMalus)
|
const ajustement = RdDInitiative.ajustementInitiative(carac, niveau, bonusMalus)
|
||||||
return { phase, ajustement }
|
return { phase, ajustement }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
|
|
||||||
import { Grammar } from "./grammar.js";
|
import { Grammar } from "./grammar.js";
|
||||||
|
import { RdDInitiative } from "./initiative.mjs";
|
||||||
import { RdDItem } from "./item.js";
|
import { RdDItem } from "./item.js";
|
||||||
import { CATEGORIES_COMPETENCES, SANS_COMPETENCE } from "./item/base-items.js";
|
import { CATEGORIES_COMPETENCE_COMBAT, CATEGORIES_COMPETENCES, SANS_COMPETENCE } from "./item/base-items.js";
|
||||||
import { Misc } from "./misc.js";
|
import { Misc } from "./misc.js";
|
||||||
|
|
||||||
const competenceTroncs = [["Esquive", "Dague", "Corps à corps"],
|
const competenceTroncs = [["Esquive", "Dague", "Corps à corps"],
|
||||||
@@ -46,6 +47,30 @@ export class RdDItemCompetence extends RdDItem {
|
|||||||
|
|
||||||
static get defaultIcon() { return "systems/foundryvtt-reve-de-dragon/icons/competence_defaut.webp" }
|
static get defaultIcon() { return "systems/foundryvtt-reve-de-dragon/icons/competence_defaut.webp" }
|
||||||
|
|
||||||
|
isNiveauBase() {
|
||||||
|
return this.system.niveau == this.system.base && this.system.xp == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
getBaseInit() {
|
||||||
|
const carac = this.getInitCarac()
|
||||||
|
if (carac == undefined) {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
return RdDInitiative.ajustementInitiative(carac.value, this.system.niveau)
|
||||||
|
}
|
||||||
|
|
||||||
|
getInitCarac() {
|
||||||
|
if (!this.actor) {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
switch (this.system.categorie) {
|
||||||
|
case CATEGORIES_COMPETENCES.melee.key: return this.actor.system.carac.melee
|
||||||
|
case CATEGORIES_COMPETENCES.tir.key: return this.actor.system.carac.tir
|
||||||
|
case CATEGORIES_COMPETENCES.lancer.key: return this.actor.system.carac.lancer
|
||||||
|
case CATEGORIES_COMPETENCES.draconic.key: return this.actor.system.carac.reve
|
||||||
|
}
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getLabelCategorie(category) {
|
static getLabelCategorie(category) {
|
||||||
return CATEGORIES_COMPETENCES[category].label;
|
return CATEGORIES_COMPETENCES[category].label;
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ export class RdDItemSort extends Item {
|
|||||||
|
|
||||||
|
|
||||||
static diffReve(sort) { return RdDItemSort.toVar((sort.system.difficulte.match(/\-?(\d)+/) ? 'R' : 'R ') + sort.system.difficulte) }
|
static diffReve(sort) { return RdDItemSort.toVar((sort.system.difficulte.match(/\-?(\d)+/) ? 'R' : 'R ') + sort.system.difficulte) }
|
||||||
static coutReve(sort) { return RdDItemSort.toVar((sort.system.ptreve.match(/(\d)+\+?/) ? 'r' : 'r ') + sort.system.ptreve) }
|
static coutReve(sort) { return RdDItemSort.toVar((Number.isInteger(sort.system.ptreve || sort.system.ptreve.match(/(\d)+\+?/)) ? 'r' : 'r ') + sort.system.ptreve) }
|
||||||
static getDraconicsSort(competencesDraconic, sort) {
|
static getDraconicsSort(competencesDraconic, sort) {
|
||||||
// se baser sur la voie du sort?
|
// se baser sur la voie du sort?
|
||||||
switch (Grammar.toLowerCaseNoAccent(sort.name)) {
|
switch (Grammar.toLowerCaseNoAccent(sort.name)) {
|
||||||
|
|||||||
@@ -45,6 +45,16 @@ export class RdDItemArme extends RdDItem {
|
|||||||
isParade() { return this.system.resistance > 0 && this.system.categorie_parade }
|
isParade() { return this.system.resistance > 0 && this.system.categorie_parade }
|
||||||
isBouclier() { return RdDItemArme.getCategorieParade(this).includes('bouclier') }
|
isBouclier() { return RdDItemArme.getCategorieParade(this).includes('bouclier') }
|
||||||
|
|
||||||
|
|
||||||
|
getCompetenceAction(main) {
|
||||||
|
switch (main) {
|
||||||
|
case ATTAQUE_TYPE.UNE_MAIN: return this.competence1Mains()
|
||||||
|
case ATTAQUE_TYPE.DEUX_MAINS: return this.competence2Mains()
|
||||||
|
case ATTAQUE_TYPE.LANCER: return this.system.lancer
|
||||||
|
case ATTAQUE_TYPE.TIR: return this.system.tir
|
||||||
|
default: return this.system.competence
|
||||||
|
}
|
||||||
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static valeurMain(valeurs, main) {
|
static valeurMain(valeurs, main) {
|
||||||
valeurs = valeurs?.toString() ?? ""
|
valeurs = valeurs?.toString() ?? ""
|
||||||
@@ -78,17 +88,26 @@ export class RdDItemArme extends RdDItem {
|
|||||||
return arme.name
|
return arme.name
|
||||||
case ITEM_TYPES.arme:
|
case ITEM_TYPES.arme:
|
||||||
switch (maniement) {
|
switch (maniement) {
|
||||||
case ATTAQUE_TYPE.COMPETENCE: return arme.system.competence;
|
case ATTAQUE_TYPE.COMPETENCE: return arme.system.competence
|
||||||
case ATTAQUE_TYPE.UNE_MAIN: return arme.competence1Mains()
|
case ATTAQUE_TYPE.UNE_MAIN: return arme.competence1Mains()
|
||||||
case ATTAQUE_TYPE.DEUX_MAINS: return arme.competence2Mains()
|
case ATTAQUE_TYPE.DEUX_MAINS: return arme.competence2Mains()
|
||||||
case ATTAQUE_TYPE.TIR: case 'tir': return arme.system.tir
|
case ATTAQUE_TYPE.TIR: case 'tir': return arme.system.tir
|
||||||
case ATTAQUE_TYPE.LANCER: case 'lancer': return arme.system.lancer;
|
case ATTAQUE_TYPE.LANCER: case 'lancer': return arme.system.lancer
|
||||||
case ATTAQUE_TYPE.CORPS_A_CORPS: return CORPS_A_CORPS
|
case ATTAQUE_TYPE.CORPS_A_CORPS: return CORPS_A_CORPS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return undefined
|
return undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getTypeAttaques() {
|
||||||
|
return [
|
||||||
|
...(this.system.unemain && this.system.competence && this.system.resistance > 0) ? [ATTAQUE_TYPE.UNE_MAIN] : [],
|
||||||
|
...(this.system.deuxmains && this.system.competence && this.system.resistance > 0) ? [ATTAQUE_TYPE.DEUX_MAINS] : [],
|
||||||
|
...(this.system.lancer && this.system.resistance > 0) ? [ATTAQUE_TYPE.LANCER] : [],
|
||||||
|
...(this.system.tir) ? [ATTAQUE_TYPE.TIR] : [],
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
static computeNiveauArmes(armes, competences) {
|
static computeNiveauArmes(armes, competences) {
|
||||||
for (const arme of armes) {
|
for (const arme of armes) {
|
||||||
arme.system.niveau = RdDItemArme.niveauCompetenceArme(arme, competences);
|
arme.system.niveau = RdDItemArme.niveauCompetenceArme(arme, competences);
|
||||||
|
|||||||
@@ -14,27 +14,28 @@ export const SANS_COMPETENCE = {
|
|||||||
description: "",
|
description: "",
|
||||||
descriptionmj: "",
|
descriptionmj: "",
|
||||||
defaut_carac: "",
|
defaut_carac: "",
|
||||||
},
|
},
|
||||||
img: "systems/foundryvtt-reve-de-dragon/icons/templates/icone_parchement_vierge.webp"
|
img: "systems/foundryvtt-reve-de-dragon/icons/templates/icone_parchement_vierge.webp"
|
||||||
}
|
}
|
||||||
|
|
||||||
export const CATEGORIES_COMPETENCES = {
|
export const CATEGORIES_COMPETENCES = {
|
||||||
"generale": { base: -4, label: "Générales" },
|
generale: { key: 'generale', base: -4, label: "Générales" },
|
||||||
"particuliere": { base: -8, label: "Particulières" },
|
particuliere: { key: 'particuliere', base: -8, label: "Particulières" },
|
||||||
"specialisee": { base: -11, label: "Spécialisées" },
|
specialisee: { key: 'specialisee', base: -11, label: "Spécialisées" },
|
||||||
"connaissance": { base: -11, label: "Connaissances" },
|
connaissance: { key: 'connaissance', base: -11, label: "Connaissances" },
|
||||||
"draconic": { base: -11, label: "Draconic" },
|
draconic: { key: 'draconic', base: -11, label: "Draconic" },
|
||||||
"melee": { base: -6, label: "Mêlée" },
|
melee: { key: 'melee', base: -6, label: "Mêlée" },
|
||||||
"tir": { base: -8, label: "Tir" },
|
tir: { key: 'tir', base: -8, label: "Tir" },
|
||||||
"lancer": { base: -8, label: "Lancer" }
|
lancer: { key: 'lancer', base: -8, label: "Lancer" }
|
||||||
}
|
}
|
||||||
|
export const CATEGORIES_COMPETENCE_COMBAT = [CATEGORIES_COMPETENCES.melee, CATEGORIES_COMPETENCES.tir, CATEGORIES_COMPETENCES.lancer].map(it => it.key)
|
||||||
|
|
||||||
export const CATEGORIES_COMPETENCES_CREATURES = {
|
export const CATEGORIES_COMPETENCES_CREATURES = {
|
||||||
"generale": { base: 0, label: "Générale" },
|
generale: { key: 'generale', base: 0, label: "Générale" },
|
||||||
"naturelle": { base: 0, label: "Arme naturelle" },
|
naturelle: { key: 'naturelle', base: 0, label: "Arme naturelle" },
|
||||||
"melee": { base: 0, label: "Mêlée" },
|
melee: { key: 'melee', base: 0, label: "Mêlée" },
|
||||||
"parade": { base: 0, label: "Parade" },
|
parade: { key: 'parade', base: 0, label: "Parade" },
|
||||||
"tir": { base: 0, label: "Tir" },
|
tir: { key: 'tir', base: 0, label: "Tir" },
|
||||||
"lancer": { base: 0, label: "Lancer" },
|
lancer: { key: 'lancer', base: 0, label: "Lancer" },
|
||||||
"possession": { base: 0, label: "Possession" },
|
possession: { key: 'possession', base: 0, label: "Possession" },
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ export class RdDRencontre extends RdDItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static async appliquer(codes, tmrDialog, rencData) {
|
static async appliquer(codes, tmrDialog, rencData) {
|
||||||
for(const effet of RdDRencontre.mapEffets(codes)){
|
for(let effet of RdDRencontre.mapEffets(codes)){
|
||||||
await effet.method(tmrDialog, rencData);
|
await effet.method(tmrDialog, rencData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -229,6 +229,14 @@ export class Misc {
|
|||||||
return undefined
|
return undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async doIfOwner(document, action, orElse = async it => { ui.notifications.warn(`Vous n'avez pas le droit d'agir pour ${it.name}`) }) {
|
||||||
|
if (Misc.isOwnerPlayer(document)) {
|
||||||
|
return await action(document)
|
||||||
|
} else {
|
||||||
|
return await orElse(document)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static isOwnerPlayer(document) {
|
static isOwnerPlayer(document) {
|
||||||
return document.testUserPermission && document.testUserPermission(game.user, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER)
|
return document.testUserPermission && document.testUserPermission(game.user, CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ export class RdDBonus {
|
|||||||
const dmg = {
|
const dmg = {
|
||||||
total: 0,
|
total: 0,
|
||||||
dmgArme: dmgArme,
|
dmgArme: dmgArme,
|
||||||
penetration: arme?.penetration() ?? 0,
|
penetration: arme?.system.penetration ?? 0,
|
||||||
diff: attaque.diff,
|
diff: attaque.diff,
|
||||||
dmgTactique: attaque.tactique?.dmg ?? 0,
|
dmgTactique: attaque.tactique?.dmg ?? 0,
|
||||||
dmgParticuliere: RdDBonus._dmgParticuliere(rollData),
|
dmgParticuliere: RdDBonus._dmgParticuliere(rollData),
|
||||||
|
|||||||
@@ -58,9 +58,9 @@ export class RdDCombatManager extends Combat {
|
|||||||
|
|
||||||
|
|
||||||
static getCombatant(actorId, tokenId) {
|
static getCombatant(actorId, tokenId) {
|
||||||
return game.combat.combatants.find(it => it.actor.id == actorId &&
|
return game.combat?.combatants.find(it => it.actor.id == actorId &&
|
||||||
it.token.id == tokenId
|
it.token.id == tokenId
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async nextRound() {
|
async nextRound() {
|
||||||
@@ -105,7 +105,7 @@ export class RdDCombatManager extends Combat {
|
|||||||
}
|
}
|
||||||
else if (!combatant.actor.isActorCombat()) {
|
else if (!combatant.actor.isActorCombat()) {
|
||||||
if (options.warning) {
|
if (options.warning) {
|
||||||
ui.notifications.warn(`${combatant.name} ne peut pas combattre!`)
|
ui.notifications.warn(`L'acteur ${combatant.name} ne peut pas combattre!`)
|
||||||
}
|
}
|
||||||
return undefined
|
return undefined
|
||||||
}
|
}
|
||||||
@@ -315,6 +315,7 @@ export class RdDCombat {
|
|||||||
switch (sockmsg.msg) {
|
switch (sockmsg.msg) {
|
||||||
case "msg_encaisser": return RdDCombat.onMsgEncaisser(sockmsg.data);
|
case "msg_encaisser": return RdDCombat.onMsgEncaisser(sockmsg.data);
|
||||||
case "msg_defense": return RdDCombat.onMsgDefense(sockmsg.data);
|
case "msg_defense": return RdDCombat.onMsgDefense(sockmsg.data);
|
||||||
|
case "msg_defense_v2": return RdDCombat.onMsgDefenseV2(sockmsg.data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -367,6 +368,19 @@ export class RdDCombat {
|
|||||||
return new RdDCombat(attacker, attackerTokenId, defender, defenderTokenId, target)
|
return new RdDCombat(attacker, attackerTokenId, defender, defenderTokenId, target)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static rddCombatForAttackV2(attackerRoll) {
|
||||||
|
const defenderRoll = RollBasicParts.prepareDefense(attackerRoll)
|
||||||
|
return RdDCombat.rddCombatForDefenseV2(defenderRoll)
|
||||||
|
}
|
||||||
|
|
||||||
|
static rddCombatForDefenseV2(defenderRoll) {
|
||||||
|
let defenderToken = canvas.tokens.get(defenderRoll.active.tokenId)
|
||||||
|
if (defenderToken) {
|
||||||
|
return RdDCombat.rddCombatForAttackerAndDefender(defenderRoll.opponent.id, defenderRoll.opponent.tokenId, defenderRoll.active.tokenId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static onMsgEncaisser(msg) {
|
static onMsgEncaisser(msg) {
|
||||||
let defender = canvas.tokens.get(msg.defenderToken.id).actor;
|
let defender = canvas.tokens.get(msg.defenderToken.id).actor;
|
||||||
@@ -687,7 +701,7 @@ export class RdDCombat {
|
|||||||
|
|
||||||
async doRollAttaque(rollData, callbacks = []) {
|
async doRollAttaque(rollData, callbacks = []) {
|
||||||
// TODO V2 await this.proposerAjustementTirLancer(rollData)
|
// TODO V2 await this.proposerAjustementTirLancer(rollData)
|
||||||
await RollDialog.create(rollData, {
|
return await RollDialog.create(rollData, {
|
||||||
onRollDone: RollDialog.onRollDoneClose,
|
onRollDone: RollDialog.onRollDoneClose,
|
||||||
callbacks: [
|
callbacks: [
|
||||||
async (roll) => await this.onAttaqueV2(roll),
|
async (roll) => await this.onAttaqueV2(roll),
|
||||||
@@ -722,9 +736,24 @@ export class RdDCombat {
|
|||||||
await this._chatMessageDefenseV2(paramChatDefense);
|
await this._chatMessageDefenseV2(paramChatDefense);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
this._socketSendMessageDefense(paramChatDefense, {});
|
this._socketSendMessageDefenseV2(paramChatDefense);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_socketSendMessageDefenseV2(paramChatDefense) {
|
||||||
|
game.socket.emit(SYSTEM_SOCKET_ID, { msg: "msg_defense_v2", data: {paramChatDefense} })
|
||||||
|
}
|
||||||
|
|
||||||
|
static async onMsgDefenseV2(msg) {
|
||||||
|
if (Misc.isFirstConnectedGM()) {
|
||||||
|
const paramChatDefense = msg.paramChatDefense
|
||||||
|
RollBasicParts.restore(paramChatDefense.attackerRoll)
|
||||||
|
const rddCombat = RdDCombat.rddCombatForAttackV2(paramChatDefense.attackerRoll)
|
||||||
|
rddCombat?.removeChatMessageActionsPasseArme(paramChatDefense.attackerRoll.passeArme)
|
||||||
|
await rddCombat?._chatMessageDefenseV2(paramChatDefense)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async _chatMessageDefenseV2(paramDemandeDefense) {
|
async _chatMessageDefenseV2(paramDemandeDefense) {
|
||||||
const attackerRoll = paramDemandeDefense.attackerRoll;
|
const attackerRoll = paramDemandeDefense.attackerRoll;
|
||||||
RollBasicParts.loadSurprises(attackerRoll)
|
RollBasicParts.loadSurprises(attackerRoll)
|
||||||
@@ -1072,7 +1101,7 @@ export class RdDCombat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async doRollDefense(rollData, callbacks = []) {
|
async doRollDefense(rollData, callbacks = []) {
|
||||||
await RollDialog.create(rollData, {
|
return await RollDialog.create(rollData, {
|
||||||
onRollDone: RollDialog.onRollDoneClose,
|
onRollDone: RollDialog.onRollDoneClose,
|
||||||
callbacks: [
|
callbacks: [
|
||||||
async (roll) => {
|
async (roll) => {
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ export class RdDCommands {
|
|||||||
<br><strong>/rdd 15 -2</strong> effectue un jet 15 à -2
|
<br><strong>/rdd 15 -2</strong> effectue un jet 15 à -2
|
||||||
<br><strong>/rdd 15 0 s</strong> effectue un jet 15 à 0, avec significative requise
|
<br><strong>/rdd 15 0 s</strong> effectue un jet 15 à 0, avec significative requise
|
||||||
<br><strong>/rdd Vue Vigilance -2</strong> effectue un jet de Vue/Vigilance à -2 pour les tokens sélectionnés
|
<br><strong>/rdd Vue Vigilance -2</strong> effectue un jet de Vue/Vigilance à -2 pour les tokens sélectionnés
|
||||||
<br><strong>/rdd vol déser +2</strong> effectue un jet de Volonté/Survie en désert à +2 pour les tokens sélectionnés
|
<br><strong>/rdd vol déser +2</strong> effectue un jet de Volonté/Survie en Désert à +2 pour les tokens sélectionnés
|
||||||
`
|
`
|
||||||
});
|
});
|
||||||
this.registerCommand({
|
this.registerCommand({
|
||||||
@@ -137,7 +137,7 @@ export class RdDCommands {
|
|||||||
<br><strong>/jet Vue</strong> poste une demande de jet de VUE à 0
|
<br><strong>/jet Vue</strong> poste une demande de jet de VUE à 0
|
||||||
<br><strong>/jet Vue -2</strong> poste une demande de jet de VUE à -2
|
<br><strong>/jet Vue -2</strong> poste une demande de jet de VUE à -2
|
||||||
<br><strong>/jet Vue Vigilance -2</strong> poste une demande de jet de VUE / Vigilance à -2
|
<br><strong>/jet Vue Vigilance -2</strong> poste une demande de jet de VUE / Vigilance à -2
|
||||||
<br><strong>/jet vol déser +2</strong> poste une demande de jet de VOLONTÉ / Survie en désert à +2
|
<br><strong>/jet vol déser +2</strong> poste une demande de jet de VOLONTÉ / Survie en Désert à +2
|
||||||
`
|
`
|
||||||
});
|
});
|
||||||
this.registerCommand({ path: ["/ddr"], func: (content, msg, params) => this.rollDeDraconique(msg), descr: "Lance un Dé Draconique" });
|
this.registerCommand({ path: ["/ddr"], func: (content, msg, params) => this.rollDeDraconique(msg), descr: "Lance un Dé Draconique" });
|
||||||
|
|||||||
@@ -17,18 +17,25 @@ export class RdDEmpoignade {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isCombatantEmpoignade(actorId, tokenId) {
|
static isCombatantEmpoignade(actorId, tokenId) {
|
||||||
const combatant = RdDCombatManager.getCombatant(actorId, tokenId)
|
const combatant = RdDCombatManager.getCombatant(actorId, tokenId)
|
||||||
return MAP_PHASE.empoignade.rang == combatant?.system.init.rang
|
return MAP_PHASE.empoignade.rang == combatant?.system.init?.rang
|
||||||
}
|
}
|
||||||
|
|
||||||
static async ajustementEmpoignade(attacker, defender, adjust = 1) {
|
static async ajustementEmpoignade(attacker, defender, adjust = 1) {
|
||||||
const empoignade = RdDEmpoignade.getEmpoignade(attacker, defender)
|
let empoignade = RdDEmpoignade.getEmpoignade(attacker, defender)
|
||||||
const empId = empoignade?.system.empoignadeid ?? foundry.utils.randomID(16)
|
if (empoignade?.system.empoigneurid == defender.id) {
|
||||||
|
let empoignade = RdDEmpoignade.getEmpoignade(defender, attacker)
|
||||||
|
return await RdDEmpoignade.$ajustementEmpoignade(empoignade, defender, attacker, - adjust);
|
||||||
|
}
|
||||||
|
return await RdDEmpoignade.$ajustementEmpoignade(empoignade, attacker, defender, adjust);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static async $ajustementEmpoignade(empoignade, attacker, defender, adjust) {
|
||||||
|
const empId = empoignade?.system.empoignadeid ?? foundry.utils.randomID(16);
|
||||||
|
const empFin = (empoignade?.system.pointsemp ?? 0) + adjust
|
||||||
if (empoignade) {
|
if (empoignade) {
|
||||||
if (empoignade.system.empoigneurid == defender.id) {
|
empoignade.system.pointsemp = empFin;
|
||||||
adjust = - adjust
|
await RdDEmpoignade.$updateEtatEmpoignade(empoignade, attacker, defender);
|
||||||
}
|
|
||||||
empoignade.system.pointsemp += adjust
|
|
||||||
await RdDEmpoignade.$updateEtatEmpoignade(empoignade, attacker, defender)
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
await RdDEmpoignade.$createEtatEmpoignade({
|
await RdDEmpoignade.$createEtatEmpoignade({
|
||||||
@@ -39,24 +46,26 @@ export class RdDEmpoignade {
|
|||||||
empoignadeid: empId,
|
empoignadeid: empId,
|
||||||
empoigneurid: attacker.id,
|
empoigneurid: attacker.id,
|
||||||
empoigneid: defender.id,
|
empoigneid: defender.id,
|
||||||
pointsemp: adjust,
|
pointsemp: empFin,
|
||||||
empoigneurname: attacker.name,
|
empoigneurname: attacker.name,
|
||||||
empoignename: defender.name
|
empoignename: defender.name
|
||||||
}
|
}
|
||||||
}, attacker, defender)
|
}, attacker, defender);
|
||||||
|
}
|
||||||
|
if (adjust != 0 && empFin == 2) {
|
||||||
|
await RdDEmpoignade.proposerEntrainerAuSol(attacker, defender, empoignade);
|
||||||
}
|
}
|
||||||
const result = RdDEmpoignade.getEmpoignadeById(defender, empId);
|
const result = RdDEmpoignade.getEmpoignadeById(defender, empId);
|
||||||
const defGrappled = result.system.pointsemp == (result.system.empoigneid == defender.id ? 2 : -2)
|
const defGrappled = result.system.pointsemp == (result.system.empoigneid == defender.id ? 2 : -2);
|
||||||
const attGrappled = result.system.pointsemp == (result.system.empoigneurid == attacker.id ? -2 : 2)
|
const attGrappled = result.system.pointsemp == (result.system.empoigneurid == attacker.id ? -2 : 2);
|
||||||
const grappling = Math.abs(result.system.pointsemp) > 0
|
const grappling = Math.abs(result.system.pointsemp) > 0;
|
||||||
await defender.setEffect(STATUSES.StatusGrappling, grappling && !defGrappled)
|
await defender.setEffect(STATUSES.StatusGrappling, grappling && !defGrappled);
|
||||||
await attacker.setEffect(STATUSES.StatusGrappling, grappling && !attGrappled)
|
await attacker.setEffect(STATUSES.StatusGrappling, grappling && !attGrappled);
|
||||||
await defender.setEffect(STATUSES.StatusGrappled, defGrappled)
|
await defender.setEffect(STATUSES.StatusGrappled, defGrappled);
|
||||||
await attacker.setEffect(STATUSES.StatusGrappled, attGrappled)
|
await attacker.setEffect(STATUSES.StatusGrappled, attGrappled);
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static registerChatCallbacks(html) {
|
static registerChatCallbacks(html) {
|
||||||
$(html).on("click", '.defense-empoignade-cac', event => {
|
$(html).on("click", '.defense-empoignade-cac', event => {
|
||||||
@@ -93,7 +102,7 @@ export class RdDEmpoignade {
|
|||||||
const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage);
|
const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage);
|
||||||
if (event.currentTarget.value && event.currentTarget.value != "none") {
|
if (event.currentTarget.value && event.currentTarget.value != "none") {
|
||||||
RdDEmpoignade.perteEndurance(rollData, event.currentTarget.value)
|
RdDEmpoignade.perteEndurance(rollData, event.currentTarget.value)
|
||||||
ChatUtility.removeChatMessageId(chatMessage.id)
|
//ChatUtility.removeChatMessageId(chatMessage.id)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -138,8 +147,7 @@ export class RdDEmpoignade {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getEmpoignadeById(actor, id) {
|
static getEmpoignadeById(actor, id) {
|
||||||
let emp = actor.itemTypes[ITEM_TYPES.empoignade].find(it => it.system.empoignadeid == id)
|
return actor.itemTypes[ITEM_TYPES.empoignade].find(it => it.system.empoignadeid == id)
|
||||||
return emp && foundry.utils.duplicate(emp) || undefined;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -233,12 +241,24 @@ export class RdDEmpoignade {
|
|||||||
MappingCreatureArme.setRollDataCreature(rollData)
|
MappingCreatureArme.setRollDataCreature(rollData)
|
||||||
}
|
}
|
||||||
if (empoignade.system.pointsemp >= 2) {
|
if (empoignade.system.pointsemp >= 2) {
|
||||||
if (!empoignade.system.ausol) {
|
await RdDEmpoignade.proposerEntrainerAuSol(attacker, defender, empoignade)
|
||||||
let msg = await RdDRollResult.displayRollData(rollData, attacker, 'chat-empoignade-entrainer.hbs');
|
|
||||||
RdDEmpoignade.$storeRollEmpoignade(msg, rollData);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
await RdDEmpoignade.$rollAttaqueEmpoignade(attacker, rollData, isNouvelle);
|
await RdDEmpoignade.$rollAttaqueEmpoignade(attacker, rollData, isNouvelle)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static async proposerEntrainerAuSol(attacker, defender, empoignade) {
|
||||||
|
if (!empoignade.system.ausol) {
|
||||||
|
const mode = (empoignade && empoignade.system.empoigneurid == attacker.id) ? "empoigner" : "liberer"
|
||||||
|
const rollData = {
|
||||||
|
mode, empoignade, attacker, defender,
|
||||||
|
isEmpoignade: true,
|
||||||
|
competence: attacker.getCompetenceCorpsACorps(),
|
||||||
|
selectedCarac: attacker.system.carac.melee,
|
||||||
|
malusTaille: RdDEmpoignade.getMalusTaille(empoignade, attacker, defender)
|
||||||
|
}
|
||||||
|
const msg = await RdDRollResult.displayRollData(rollData, attacker, 'chat-empoignade-entrainer.hbs');
|
||||||
|
RdDEmpoignade.$storeRollEmpoignade(msg, rollData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -249,7 +269,14 @@ export class RdDEmpoignade {
|
|||||||
await this.onAttaqueEmpoignadeValidee(attacker, defender)
|
await this.onAttaqueEmpoignadeValidee(attacker, defender)
|
||||||
}
|
}
|
||||||
|
|
||||||
static async onImmobilisation(attacker, defender, empoignade) {
|
static async onImmobilisation(attacker, empoignade) {
|
||||||
|
const defender = game.actors.get(empoignade.system.empoigneid)
|
||||||
|
const empDefenseur = defender.itemTypes[ITEM_TYPES.empoignade]
|
||||||
|
.find(it => it.system.empoignadeid == empoignade.system.empoignadeid);
|
||||||
|
await defender.updateEmbeddedDocuments('Item', [{
|
||||||
|
_id: empDefenseur.id,
|
||||||
|
'system.immobilise': true
|
||||||
|
}])
|
||||||
const rollData = {
|
const rollData = {
|
||||||
mode: "immobilise",
|
mode: "immobilise",
|
||||||
empoignade, attacker, defender,
|
empoignade, attacker, defender,
|
||||||
@@ -372,29 +399,35 @@ export class RdDEmpoignade {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async $updateEtatEmpoignade(empoignade, attacker, defender) {
|
static async $updateEtatEmpoignade(empoignade, attacker, defender) {
|
||||||
console.log("UPDATE Empoignade", empoignade)
|
|
||||||
const belligerants = [
|
const belligerants = [
|
||||||
attacker ?? game.actors.get(empoignade.system.empoigneurid),
|
attacker ?? game.actors.get(empoignade.system.empoigneurid),
|
||||||
defender ?? game.actors.get(empoignade.system.empoigneid)]
|
defender ?? game.actors.get(empoignade.system.empoigneid)]
|
||||||
|
const removeEmp = empoignade.system.pointsemp == 0
|
||||||
|
|
||||||
await Promise.all(
|
if (removeEmp) {
|
||||||
belligerants.map(async belligerant => {
|
const emp = RdDEmpoignade.getEmpoignadeById(attacker, empoignade.system.empoignadeid)
|
||||||
const emp = RdDEmpoignade.getEmpoignadeById(belligerant, empoignade.system.empoignadeid)
|
return await attacker.deleteEmbeddedDocuments('Item', [emp.id])
|
||||||
return await belligerant.updateEmbeddedDocuments('Item', [{
|
}
|
||||||
_id: emp._id,
|
else {
|
||||||
"system.pointsemp": empoignade.system.pointsemp,
|
await Promise.all(
|
||||||
"system.ausol": empoignade.system.ausol
|
belligerants.map(async belligerant => {
|
||||||
}])
|
const emp = RdDEmpoignade.getEmpoignadeById(belligerant, empoignade.system.empoignadeid)
|
||||||
}))
|
return await belligerant.updateEmbeddedDocuments('Item', [{
|
||||||
|
_id: emp.id,
|
||||||
|
"system.pointsemp": empoignade.system.pointsemp,
|
||||||
|
"system.ausol": empoignade.system.ausol
|
||||||
|
}])
|
||||||
|
}))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async $deleteEmpoignade(empoignade) {
|
static async $deleteEmpoignade(empoignade) {
|
||||||
console.log("DELETE Empoignade", empoignade)
|
console.log("DELETE Empoignade", empoignade)
|
||||||
|
|
||||||
let defender = game.actors.get(empoignade.system.empoigneid)
|
const defender = game.actors.get(empoignade.system.empoigneid)
|
||||||
let emp = RdDEmpoignade.getEmpoignadeById(defender, empoignade.system.empoignadeid)
|
const emp = RdDEmpoignade.getEmpoignadeById(defender, empoignade.system.empoignadeid)
|
||||||
await defender.deleteEmbeddedDocuments('Item', [emp._id])
|
await defender.deleteEmbeddedDocuments('Item', [emp.id])
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -436,29 +469,28 @@ export class RdDEmpoignade {
|
|||||||
static async perteEndurance(rollData, perteMode) {
|
static async perteEndurance(rollData, perteMode) {
|
||||||
let attacker = game.actors.get(rollData.attacker.id)
|
let attacker = game.actors.get(rollData.attacker.id)
|
||||||
let defender = game.actors.get(rollData.defender.id)
|
let defender = game.actors.get(rollData.defender.id)
|
||||||
if (!RdDEmpoignade.isActionAutorisee("immobilise", attacker, defender)) {
|
if (perteMode == "none" || !RdDEmpoignade.isActionAutorisee("immobilise", attacker, defender)) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
let empoignade = RdDEmpoignade.getEmpoignade(attacker, defender)
|
const perteEndurance = await RdDEmpoignade.$calcPerteEnd(perteMode, defender.system.sante.endurance.value)
|
||||||
|
await defender.santeIncDec("endurance", -perteEndurance)
|
||||||
//console.log("Perte d'endurance :!!!", perteMode)
|
await RdDRollResult.displayRollData({ attacker, defender, perteEndurance },
|
||||||
let endValue = defender.system.sante.endurance.value
|
attacker,
|
||||||
if (perteMode == "end0") {
|
'chat-empoignade-perte-endurance.hbs')
|
||||||
await defender.santeIncDec("endurance", -endValue);
|
|
||||||
}
|
|
||||||
if (perteMode == "end1") {
|
|
||||||
await defender.santeIncDec("endurance", -(endValue - 1));
|
|
||||||
}
|
|
||||||
if (perteMode == "endmoitie") {
|
|
||||||
await defender.santeIncDec("endurance", -Math.floor(endValue / 2));
|
|
||||||
}
|
|
||||||
if (perteMode == "endquart") {
|
|
||||||
await defender.santeIncDec("endurance", -(3 * Math.floor(endValue / 4)));
|
|
||||||
}
|
|
||||||
let msg = await RdDRollResult.displayRollData(rollData, attacker, 'chat-empoignade-perte-endurance.hbs');
|
|
||||||
RdDEmpoignade.$storeRollEmpoignade(msg, rollData);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async $calcPerteEnd(perteMode, endValue) {
|
||||||
|
switch (perteMode) {
|
||||||
|
case "none": return 0
|
||||||
|
case "end0": return endValue
|
||||||
|
case "end1": return (endValue - 1)
|
||||||
|
case "3/4": return Math.floor(3 * endValue / 4)
|
||||||
|
case "1/2": return Math.floor(endValue / 2)
|
||||||
|
case "1/4": return Math.floor(endValue / 4)
|
||||||
|
}
|
||||||
|
const rolled = await (new Roll(perteMode).evaluate())
|
||||||
|
return rolled.total
|
||||||
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async deleteAllEmpoignades() {
|
static async deleteAllEmpoignades() {
|
||||||
for (let actor of game.actors) {
|
for (let actor of game.actors) {
|
||||||
@@ -473,7 +505,7 @@ export class RdDEmpoignade {
|
|||||||
let actor = game.actors.get(actorDeleteId)
|
let actor = game.actors.get(actorDeleteId)
|
||||||
let emp = this.getEmpoignadeById(actor, empoignade.system.empoignadeid)
|
let emp = this.getEmpoignadeById(actor, empoignade.system.empoignadeid)
|
||||||
if (emp) {
|
if (emp) {
|
||||||
await actor.deleteEmbeddedDocuments('Item', [emp._id])
|
await actor.deleteEmbeddedDocuments('Item', [emp.id])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ import { Migrations } from './migrations.js'
|
|||||||
|
|
||||||
import RollDialog from "./roll/roll-dialog.mjs"
|
import RollDialog from "./roll/roll-dialog.mjs"
|
||||||
import ChatRollResult from "./roll/chat-roll-result.mjs"
|
import ChatRollResult from "./roll/chat-roll-result.mjs"
|
||||||
|
import ExportPdf from "./actor/export-pdf/export-pdf.mjs"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RdD system
|
* RdD system
|
||||||
@@ -296,6 +297,7 @@ export class SystemReveDeDragon {
|
|||||||
RdDPossession.init()
|
RdDPossession.init()
|
||||||
TMRRencontres.init()
|
TMRRencontres.init()
|
||||||
ExportScriptarium.init()
|
ExportScriptarium.init()
|
||||||
|
ExportPdf.init()
|
||||||
RollDialog.init()
|
RollDialog.init()
|
||||||
ChatRollResult.init()
|
ChatRollResult.init()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import { PART_DEFENSE } from "./roll-part-defense.mjs"
|
|||||||
import { PART_ATTAQUE } from "./roll-part-attaque.mjs"
|
import { PART_ATTAQUE } from "./roll-part-attaque.mjs"
|
||||||
import { RdDRollTables } from "../rdd-rolltables.js"
|
import { RdDRollTables } from "../rdd-rolltables.js"
|
||||||
import { RdDEmpoignade } from "../rdd-empoignade.js"
|
import { RdDEmpoignade } from "../rdd-empoignade.js"
|
||||||
|
import { Misc } from "../misc.js"
|
||||||
|
|
||||||
export default class ChatRollResult {
|
export default class ChatRollResult {
|
||||||
static init() {
|
static init() {
|
||||||
@@ -171,13 +172,14 @@ export default class ChatRollResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onClickAppelChance(event) {
|
onClickAppelChance(event) {
|
||||||
|
event.preventDefault()
|
||||||
const chatMessage = ChatUtility.getChatMessage(event)
|
const chatMessage = ChatUtility.getChatMessage(event)
|
||||||
const savedRoll = this.loadChatMessageRoll(chatMessage)
|
const savedRoll = this.loadChatMessageRoll(chatMessage)
|
||||||
const actor = game.actors.get(savedRoll.ids.actorId)
|
const actor = game.actors.get(savedRoll.ids.actorId)
|
||||||
actor.rollAppelChance(
|
Misc.doIfOwner(actor, it => it.rollAppelChance(
|
||||||
() => this.onAppelChanceSuccess(savedRoll, chatMessage),
|
() => this.onAppelChanceSuccess(savedRoll, chatMessage),
|
||||||
() => this.onAppelChanceEchec(savedRoll, chatMessage))
|
() => this.onAppelChanceEchec(savedRoll, chatMessage))
|
||||||
event.preventDefault()
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
async onAppelChanceSuccess(savedRoll, chatMessage) {
|
async onAppelChanceSuccess(savedRoll, chatMessage) {
|
||||||
@@ -197,7 +199,7 @@ export default class ChatRollResult {
|
|||||||
this.getCombat(reRoll)?.doRollAttaque(reRoll, callbacks)
|
this.getCombat(reRoll)?.doRollAttaque(reRoll, callbacks)
|
||||||
break
|
break
|
||||||
default: {
|
default: {
|
||||||
RollDialog.create(reRoll, { callbacks: callbacks })
|
await RollDialog.create(reRoll, { onRollDone: RollDialog.onRollDoneClose, callbacks })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -208,16 +210,18 @@ export default class ChatRollResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onClickAppelDestinee(event) {
|
onClickAppelDestinee(event) {
|
||||||
|
event.preventDefault()
|
||||||
|
|
||||||
const chatMessage = ChatUtility.getChatMessage(event)
|
const chatMessage = ChatUtility.getChatMessage(event)
|
||||||
const savedRoll = this.loadChatMessageRoll(chatMessage)
|
const savedRoll = this.loadChatMessageRoll(chatMessage)
|
||||||
const actor = game.actors.get(savedRoll.ids.actorId)
|
const actor = game.actors.get(savedRoll.ids.actorId)
|
||||||
|
|
||||||
actor.appelDestinee(async () => {
|
Misc.doIfOwner(actor, it => it.appelDestinee(async () => {
|
||||||
const reRoll = foundry.utils.duplicate(savedRoll)
|
const reRoll = foundry.utils.duplicate(savedRoll)
|
||||||
reRoll.type.retry = true
|
reRoll.type.retry = true
|
||||||
RdDResolutionTable.significativeRequise(reRoll.rolled)
|
RdDResolutionTable.significativeRequise(reRoll.rolled)
|
||||||
await this.updateChatMessage(chatMessage, reRoll)
|
await this.updateChatMessage(chatMessage, reRoll)
|
||||||
})
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
async onClickDefense(event) {
|
async onClickDefense(event) {
|
||||||
@@ -235,36 +239,40 @@ export default class ChatRollResult {
|
|||||||
const savedRoll = this.loadChatMessageRoll(chatMessage)
|
const savedRoll = this.loadChatMessageRoll(chatMessage)
|
||||||
const attaque = savedRoll.attackerRoll
|
const attaque = savedRoll.attackerRoll
|
||||||
const defenderToken = savedRoll.ids.actorTokenId ? canvas.tokens.get(savedRoll.ids.actorTokenId) : undefined
|
const defenderToken = savedRoll.ids.actorTokenId ? canvas.tokens.get(savedRoll.ids.actorTokenId) : undefined
|
||||||
const attackerToken = savedRoll.ids.opponentTokenId ? canvas.tokens.get(savedRoll.ids.opponentTokenId) : undefined
|
const defender = defenderToken?.actor ?? game.actors.get(savedRoll.ids.actorId)
|
||||||
switch (attaque.dmg.mortalite) {
|
Misc.doIfOwner(defender, async defender => {
|
||||||
case RDD_CONFIG.encaissement.empoignade:
|
const attackerToken = savedRoll.ids.opponentTokenId ? canvas.tokens.get(savedRoll.ids.opponentTokenId) : undefined
|
||||||
savedRoll.done = savedRoll.done ?? {}
|
const attacker = attackerToken?.actor ?? game.actors.get(savedRoll.ids.opponentId)
|
||||||
savedRoll.done.empoignade = await RdDEmpoignade.ajustementEmpoignade(attackerToken.actor, defenderToken.actor)
|
switch (attaque.dmg.mortalite) {
|
||||||
break
|
case RDD_CONFIG.encaissement.empoignade:
|
||||||
case RDD_CONFIG.encaissement.entiteincarnee:
|
savedRoll.done = savedRoll.done ?? {}
|
||||||
case RDD_CONFIG.encaissement.nonmortel:
|
savedRoll.done.empoignade = await RdDEmpoignade.ajustementEmpoignade(attackerToken.actor, defenderToken.actor)
|
||||||
case RDD_CONFIG.encaissement.mortel:
|
break
|
||||||
const defender = defenderToken?.actor ?? game.actors.get(savedRoll.ids.actorId)
|
case RDD_CONFIG.encaissement.entiteincarnee:
|
||||||
const attacker = attackerToken?.actor ?? game.actors.get(savedRoll.ids.opponentId)
|
case RDD_CONFIG.encaissement.nonmortel:
|
||||||
await defender?.encaisserDommages(attaque.dmg, attacker, undefined, attackerToken, defenderToken)
|
case RDD_CONFIG.encaissement.mortel:
|
||||||
break
|
await defender?.encaisserDommages(attaque.dmg, attacker, undefined, attackerToken, defenderToken)
|
||||||
}
|
break
|
||||||
if (isMessageDemande) {
|
}
|
||||||
ChatUtility.removeChatMessageId(chatMessage.id)
|
if (isMessageDemande) {
|
||||||
} else {
|
ChatUtility.removeChatMessageId(chatMessage.id)
|
||||||
savedRoll.done.encaissement = true
|
} else {
|
||||||
await this.updateChatMessage(chatMessage, savedRoll)
|
savedRoll.done.encaissement = true
|
||||||
}
|
await this.updateChatMessage(chatMessage, savedRoll)
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
async onClickRecul(event) {
|
async onClickRecul(event) {
|
||||||
const chatMessage = ChatUtility.getChatMessage(event)
|
const chatMessage = ChatUtility.getChatMessage(event)
|
||||||
const savedRoll = this.loadChatMessageRoll(chatMessage)
|
const savedRoll = this.loadChatMessageRoll(chatMessage)
|
||||||
|
// TODO: gestion sur token non liés?
|
||||||
const defender = game.actors.get(savedRoll.ids.actorId)
|
const defender = game.actors.get(savedRoll.ids.actorId)
|
||||||
const attacker = game.actors.get(savedRoll.ids.opponentId)
|
Misc.doIfOwner(defender, async defender => {
|
||||||
savedRoll.done.recul = await defender.encaisserRecul(attacker.getForce(), savedRoll.attackerRoll.dmg.dmgArme)
|
const attacker = game.actors.get(savedRoll.ids.opponentId)
|
||||||
// const reculChoc = this.getReculChoc(savedRoll, defender, attacker)
|
savedRoll.done.recul = await defender.encaisserRecul(attacker.getForce(), savedRoll.attackerRoll.dmg.dmgArme)
|
||||||
await this.updateChatMessage(chatMessage, savedRoll)
|
await this.updateChatMessage(chatMessage, savedRoll)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
async onClickChoixParticuliere(event) {
|
async onClickChoixParticuliere(event) {
|
||||||
@@ -295,6 +303,7 @@ export default class ChatRollResult {
|
|||||||
await this.updateChatMessage(chatMessage, savedRoll)
|
await this.updateChatMessage(chatMessage, savedRoll)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async onClickTirerMaladresse(event) {
|
async onClickTirerMaladresse(event) {
|
||||||
const chatMessage = ChatUtility.getChatMessage(event)
|
const chatMessage = ChatUtility.getChatMessage(event)
|
||||||
const typeMaladresse = event.currentTarget.attributes['data-maladresse'].value
|
const typeMaladresse = event.currentTarget.attributes['data-maladresse'].value
|
||||||
@@ -303,4 +312,4 @@ export default class ChatRollResult {
|
|||||||
savedRoll.type.retry = true
|
savedRoll.type.retry = true
|
||||||
await this.updateChatMessage(chatMessage, savedRoll)
|
await this.updateChatMessage(chatMessage, savedRoll)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ export class RollDialogAdapter {
|
|||||||
const compKey = rollData.current.comp?.key
|
const compKey = rollData.current.comp?.key
|
||||||
if (compKey) {
|
if (compKey) {
|
||||||
rollData.competence = rollData.refs[PART_COMP].all.find(it => it.key == compKey)?.comp
|
rollData.competence = rollData.refs[PART_COMP].all.find(it => it.key == compKey)?.comp
|
||||||
rollData.jetResistance = rollData.type.jetResistance
|
rollData.jetResistance = rollData.type.resistance
|
||||||
}
|
}
|
||||||
if (rollData.type.current == ROLL_TYPE_OEUVRE) {
|
if (rollData.type.current == ROLL_TYPE_OEUVRE) {
|
||||||
const oeuvreKey = rollData.current.oeuvre?.key
|
const oeuvreKey = rollData.current.oeuvre?.key
|
||||||
|
|||||||
@@ -46,6 +46,8 @@ import { OptionsAvancees, ROLL_DIALOG_V2_TEST } from "../settings/options-avance
|
|||||||
import { ActorImpacts } from "../technical/actor-impacts.mjs";
|
import { ActorImpacts } from "../technical/actor-impacts.mjs";
|
||||||
import { RollPartEmpoignade } from "./roll-part-empoignade.mjs";
|
import { RollPartEmpoignade } from "./roll-part-empoignade.mjs";
|
||||||
import { RollPartEmpoignadeTaille } from "./roll-part-empoignade-taille.mjs";
|
import { RollPartEmpoignadeTaille } from "./roll-part-empoignade-taille.mjs";
|
||||||
|
import { RollPartEcailles } from "./roll-part-ecailles.mjs";
|
||||||
|
import { RollPartResistance } from "./roll-part-resistance.mjs";
|
||||||
|
|
||||||
|
|
||||||
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api
|
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api
|
||||||
@@ -68,6 +70,7 @@ const ROLL_PARTS = [
|
|||||||
new RollPartActor(),
|
new RollPartActor(),
|
||||||
new RollPartAction(),
|
new RollPartAction(),
|
||||||
new RollPartOpponent(),
|
new RollPartOpponent(),
|
||||||
|
new RollPartResistance(),
|
||||||
new RollPartCarac(),
|
new RollPartCarac(),
|
||||||
new RollPartComp(),
|
new RollPartComp(),
|
||||||
|
|
||||||
@@ -83,6 +86,7 @@ const ROLL_PARTS = [
|
|||||||
|
|
||||||
new RollPartSign(),
|
new RollPartSign(),
|
||||||
|
|
||||||
|
new RollPartEcailles(),
|
||||||
new RollPartEtat(),
|
new RollPartEtat(),
|
||||||
new RollPartConditions(),
|
new RollPartConditions(),
|
||||||
new RollPartEthylisme(),
|
new RollPartEthylisme(),
|
||||||
@@ -177,19 +181,25 @@ const ROLL_PARTS = [
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
export default class RollDialog extends HandlebarsApplicationMixin(ApplicationV2)
|
export default class RollDialog extends HandlebarsApplicationMixin(ApplicationV2)
|
||||||
{
|
{
|
||||||
static onCloseDoNothing() {
|
static onCloseDoNothing() { }
|
||||||
}
|
|
||||||
static onRollDoneDoNothing(dialog, roll) {
|
static onRollDoneDoNothing(dialog, roll) {
|
||||||
dialog.render()
|
if (roll.type.retry) {
|
||||||
}
|
|
||||||
static onRollDoneClose(dialog, roll) {
|
|
||||||
if (roll.type.retry || !OptionsAvancees.isUsing(ROLL_DIALOG_V2_TEST))
|
|
||||||
dialog.close()
|
dialog.close()
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
dialog.render()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static init() {
|
static onRollDoneClose(dialog, roll) {
|
||||||
|
if (roll.type.retry || !OptionsAvancees.isUsing(ROLL_DIALOG_V2_TEST)) {
|
||||||
|
dialog.close()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static init() { }
|
||||||
|
|
||||||
static onReady() {
|
static onReady() {
|
||||||
|
|
||||||
foundry.applications.handlebars.loadTemplates({
|
foundry.applications.handlebars.loadTemplates({
|
||||||
@@ -239,9 +249,14 @@ export default class RollDialog extends HandlebarsApplicationMixin(ApplicationV2
|
|||||||
|
|
||||||
|
|
||||||
static async create(rollData, rollOptions = {}) {
|
static async create(rollData, rollOptions = {}) {
|
||||||
const rollDialog = new RollDialog(rollData, rollOptions)
|
rollData = RollDialog.$prepareRollData(rollData)
|
||||||
rollDialog.render(true)
|
return Misc.doIfOwner(rollData.active.actor,
|
||||||
return rollDialog
|
actor => {
|
||||||
|
const rollDialog = new RollDialog(rollData, rollOptions)
|
||||||
|
rollDialog.render(true)
|
||||||
|
return rollDialog
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
static get PARTS() {
|
static get PARTS() {
|
||||||
@@ -321,7 +336,7 @@ export default class RollDialog extends HandlebarsApplicationMixin(ApplicationV2
|
|||||||
super()
|
super()
|
||||||
|
|
||||||
this.hooks = []
|
this.hooks = []
|
||||||
this.rollData = RollDialog.$prepareRollData(rollData)
|
this.rollData = rollData
|
||||||
this.rollOptions = {
|
this.rollOptions = {
|
||||||
callbacks: [
|
callbacks: [
|
||||||
async r => await r.active.actor.appliquerAjoutExperience(r),
|
async r => await r.active.actor.appliquerAjoutExperience(r),
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { Grammar } from "../grammar.js"
|
import { Grammar } from "../grammar.js"
|
||||||
import { ReglesOptionnelles } from "../settings/regles-optionnelles.js"
|
import { ReglesOptionnelles } from "../settings/regles-optionnelles.js"
|
||||||
|
import { ROLL_TYPE_SORT } from "./roll-constants.mjs"
|
||||||
import { RollPartCheckbox } from "./roll-part-checkbox.mjs"
|
import { RollPartCheckbox } from "./roll-part-checkbox.mjs"
|
||||||
|
|
||||||
export const PART_ASTROLOGIQUE = "astrologique"
|
export const PART_ASTROLOGIQUE = "astrologique"
|
||||||
@@ -15,7 +16,7 @@ export class RollPartAstrologique extends RollPartCheckbox {
|
|||||||
}
|
}
|
||||||
|
|
||||||
isLancementRituel(rollData) {
|
isLancementRituel(rollData) {
|
||||||
return false
|
return rollData.type.current == ROLL_TYPE_SORT && rollData.current.sort?.sort?.system.isrituel
|
||||||
}
|
}
|
||||||
|
|
||||||
isJetChance(rollData) {
|
isJetChance(rollData) {
|
||||||
|
|||||||
@@ -142,7 +142,8 @@ export class RollPartAttaque extends RollPartSelect {
|
|||||||
comp: { key: 'Dague', forced: true },
|
comp: { key: 'Dague', forced: true },
|
||||||
diff: { type: DIFF.IMPOSEE, value: -4 }
|
diff: { type: DIFF.IMPOSEE, value: -4 }
|
||||||
}
|
}
|
||||||
})
|
},
|
||||||
|
{ onRollDone: RollDialog.onRollDoneClose })
|
||||||
}
|
}
|
||||||
|
|
||||||
impactOtherPart(part, rollData) {
|
impactOtherPart(part, rollData) {
|
||||||
|
|||||||
@@ -16,11 +16,9 @@ export class RollPartCarac extends RollPartSelect {
|
|||||||
const selected = this.getSelected(rollData)
|
const selected = this.getSelected(rollData)
|
||||||
const actor = rollData.active.actor
|
const actor = rollData.active.actor
|
||||||
refs.all = [...this.$getActorCaracs(actor), ...this.$getCaracCompetenceCreature(actor)]
|
refs.all = [...this.$getActorCaracs(actor), ...this.$getCaracCompetenceCreature(actor)]
|
||||||
.filter(c => !selected.forced ||
|
if (selected.forced && selected.key) {
|
||||||
(selected.key ?
|
refs.all = refs.all.filter(c => c.key == selected.key || Grammar.includesLowerCaseNoAccent(c.label, selected.key))
|
||||||
Grammar.includesLowerCaseNoAccent(c.label, selected.key)
|
}
|
||||||
: c.key == '')
|
|
||||||
)
|
|
||||||
refs.caracs = refs.all
|
refs.caracs = refs.all
|
||||||
this.$selectCarac(rollData)
|
this.$selectCarac(rollData)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
import { RDD_CONFIG } from "../constants.js"
|
||||||
|
import { ROLL_TYPE_ATTAQUE, ROLL_TYPE_DEFENSE } from "./roll-constants.mjs"
|
||||||
|
import { PART_ATTAQUE } from "./roll-part-attaque.mjs"
|
||||||
|
import { RollPartCheckbox } from "./roll-part-checkbox.mjs"
|
||||||
|
import { PART_DEFENSE } from "./roll-part-defense.mjs"
|
||||||
|
|
||||||
|
const ECAILLES = "ecailles"
|
||||||
|
|
||||||
|
export class RollPartEcailles extends RollPartCheckbox {
|
||||||
|
|
||||||
|
get code() { return ECAILLES }
|
||||||
|
|
||||||
|
isValid(rollData) {
|
||||||
|
return this.isRollType(rollData, ROLL_TYPE_ATTAQUE, ROLL_TYPE_DEFENSE)
|
||||||
|
}
|
||||||
|
|
||||||
|
visible(rollData) {
|
||||||
|
return this.getEcailles(rollData) != 0
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
getEcailles(rollData) {
|
||||||
|
const arme = this.getArme(rollData)
|
||||||
|
return arme?.system.magique ? arme?.system.ecaille_efficacite : 0
|
||||||
|
}
|
||||||
|
|
||||||
|
getArme(rollData) {
|
||||||
|
return this.isRollType(rollData, ROLL_TYPE_ATTAQUE)
|
||||||
|
? rollData.current[PART_ATTAQUE]?.arme
|
||||||
|
: this.isRollType(rollData, ROLL_TYPE_DEFENSE)
|
||||||
|
? rollData.current[PART_DEFENSE]?.arme
|
||||||
|
: undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
prepareContext(rollData) {
|
||||||
|
this.loadRefs(rollData)
|
||||||
|
super.prepareContext(rollData)
|
||||||
|
}
|
||||||
|
|
||||||
|
getCheckboxIcon(rollData) {
|
||||||
|
return this.getEcailles(rollData) > 0
|
||||||
|
? `<img src="${RDD_CONFIG.icons.magique}">`
|
||||||
|
: `<img src="${RDD_CONFIG.icons.armebrisee}">`
|
||||||
|
}
|
||||||
|
|
||||||
|
getCheckboxLabel(rollData) {
|
||||||
|
return this.getEcailles(rollData) > 0
|
||||||
|
? "Efficacité"
|
||||||
|
: "Défauts"
|
||||||
|
}
|
||||||
|
|
||||||
|
getCheckboxValue(rollData) { return this.getEcailles(rollData) }
|
||||||
|
}
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
import { RDD_CONFIG } from "../constants.js"
|
import { RDD_CONFIG } from "../constants.js"
|
||||||
import { ATTAQUE_TYPE_MELEE } from "../item/arme.js"
|
|
||||||
import { RdDEmpoignade } from "../rdd-empoignade.js"
|
import { RdDEmpoignade } from "../rdd-empoignade.js"
|
||||||
import { COMBAT_ROLL_TYPES } from "./roll-constants.mjs"
|
import { COMBAT_ROLL_TYPES } from "./roll-constants.mjs"
|
||||||
import { PART_ATTAQUE } from "./roll-part-attaque.mjs"
|
|
||||||
import { RollPartCheckbox } from "./roll-part-checkbox.mjs"
|
import { RollPartCheckbox } from "./roll-part-checkbox.mjs"
|
||||||
|
|
||||||
const EMPOIGNADE_TAILLE = "empoignade-taille"
|
const EMPOIGNADE_TAILLE = "empoignade-taille"
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
import { ROLLDIALOG_SECTION, RollPart } from "./roll-part.mjs"
|
||||||
|
|
||||||
|
export const PART_RESISTANCE = "resistance"
|
||||||
|
|
||||||
|
export class RollPartResistance extends RollPart {
|
||||||
|
|
||||||
|
get code() { return PART_RESISTANCE }
|
||||||
|
get section() { return ROLLDIALOG_SECTION.ACTION }
|
||||||
|
|
||||||
|
isValid(rollData) { return rollData.type.resistance == true }
|
||||||
|
title(rollData) { return "de résistance" }
|
||||||
|
}
|
||||||
@@ -78,7 +78,7 @@ export class RollPart {
|
|||||||
* @returns une chaîne vide si rien ne doit être affiché
|
* @returns une chaîne vide si rien ne doit être affiché
|
||||||
*/
|
*/
|
||||||
title() { return '' }
|
title() { return '' }
|
||||||
isRollType(rollData, type) { return rollData.type.current == type }
|
isRollType(rollData, ...type) { return type.includes(rollData.type.current)}
|
||||||
|
|
||||||
isActive(rollData) { return this.isValid(rollData) && this.visible(rollData) }
|
isActive(rollData) { return this.isValid(rollData) && this.visible(rollData) }
|
||||||
isValid(rollData) { return true }
|
isValid(rollData) { return true }
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ export class RollType {
|
|||||||
|
|
||||||
setRollDataType(rollData) {
|
setRollDataType(rollData) {
|
||||||
rollData.type.opposed = rollData.opponent != undefined
|
rollData.type.opposed = rollData.opponent != undefined
|
||||||
rollData.type.resistance = false /** TODO */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
onSelect(rollData) {
|
onSelect(rollData) {
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ export const STATUSES = {
|
|||||||
StatusDemiReve: 'demi-reve',
|
StatusDemiReve: 'demi-reve',
|
||||||
StatusSurEnc: 'sur-encombrement',
|
StatusSurEnc: 'sur-encombrement',
|
||||||
StatusForceWeak: 'force insuffisante',
|
StatusForceWeak: 'force insuffisante',
|
||||||
|
StatusMalade: 'malade',
|
||||||
}
|
}
|
||||||
|
|
||||||
export const forceWeakStatusEffect = { rdd: true, id: STATUSES.StatusForceWeak, name: 'EFFECT.StatusForceWeak', img: RDD_CONFIG.icons.forceWeak };
|
export const forceWeakStatusEffect = { rdd: true, id: STATUSES.StatusForceWeak, name: 'EFFECT.StatusForceWeak', img: RDD_CONFIG.icons.forceWeak };
|
||||||
@@ -35,11 +36,12 @@ const rddStatusEffects = [
|
|||||||
{ rdd: true, id: STATUSES.StatusComma, name: 'EFFECT.StatusComma', img: 'icons/svg/skull.svg' },
|
{ rdd: true, id: STATUSES.StatusComma, name: 'EFFECT.StatusComma', img: 'icons/svg/skull.svg' },
|
||||||
|
|
||||||
{ rdd: true, id: STATUSES.StatusBleeding, name: 'EFFECT.StatusBleeding', img: 'icons/svg/blood.svg' },
|
{ rdd: true, id: STATUSES.StatusBleeding, name: 'EFFECT.StatusBleeding', img: 'icons/svg/blood.svg' },
|
||||||
|
{ rdd: true, id: STATUSES.StatusMalade, name: 'EFFECT.StatusMalade', img: RDD_CONFIG.icons.malade },
|
||||||
{ rdd: true, id: STATUSES.StatusDead, name: 'EFFECT.StatusDead', img: 'icons/svg/skull.svg' },
|
{ rdd: true, id: STATUSES.StatusDead, name: 'EFFECT.StatusDead', img: 'icons/svg/skull.svg' },
|
||||||
|
surEncEffect,
|
||||||
demiReveStatusEffect,
|
demiReveStatusEffect,
|
||||||
forceWeakStatusEffect,
|
forceWeakStatusEffect,
|
||||||
surEncEffect,
|
]
|
||||||
];
|
|
||||||
|
|
||||||
const statusDemiSurprise = new Set([STATUSES.StatusStunned, STATUSES.StatusProne, STATUSES.StatusRestrained, STATUSES.StatusForceWeak])
|
const statusDemiSurprise = new Set([STATUSES.StatusStunned, STATUSES.StatusProne, STATUSES.StatusRestrained, STATUSES.StatusForceWeak])
|
||||||
const statusSurpriseTotale = new Set([STATUSES.StatusUnconscious, STATUSES.StatusBlind, STATUSES.StatusComma])
|
const statusSurpriseTotale = new Set([STATUSES.StatusUnconscious, STATUSES.StatusBlind, STATUSES.StatusComma])
|
||||||
@@ -73,7 +75,6 @@ export class StatusEffects extends FormApplication {
|
|||||||
CONFIG.RDD.allEffects = rddStatusEffects.concat(CONFIG.statusEffects.filter(it => !rddEffectIds.includes(it.id)))
|
CONFIG.RDD.allEffects = rddStatusEffects.concat(CONFIG.statusEffects.filter(it => !rddEffectIds.includes(it.id)))
|
||||||
|
|
||||||
StatusEffects._setUseStatusEffects(StatusEffects._getUseStatusEffects());
|
StatusEffects._setUseStatusEffects(StatusEffects._getUseStatusEffects());
|
||||||
console.log('statusEffects', CONFIG.statusEffects);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static isSurprise(effect) {
|
static isSurprise(effect) {
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { RollBasicParts } from "../roll/roll-basic-parts.mjs"
|
||||||
|
|
||||||
const ACTOR_EMBEDDED_DOCTYPES = ['Item', 'ActiveEffect']
|
const ACTOR_EMBEDDED_DOCTYPES = ['Item', 'ActiveEffect']
|
||||||
/**
|
/**
|
||||||
@@ -62,14 +63,16 @@ export class ActorImpacts {
|
|||||||
addDelta(document, path, value) {
|
addDelta(document, path, value) {
|
||||||
ActorImpacts.$checkDocType(document)
|
ActorImpacts.$checkDocType(document)
|
||||||
const intValue = Number.parseInt(value)
|
const intValue = Number.parseInt(value)
|
||||||
if (Number.isInteger(intValue) && intValue != 0) {
|
if (Number.isInteger(intValue)) {
|
||||||
const delta = [path, intValue]
|
if (intValue != 0){
|
||||||
const existing = this[docType].updates.find(it => it.id == document.id)
|
const delta = [path, intValue]
|
||||||
if (existing) {
|
const existing = this[docType].updates.find(it => it.id == document.id)
|
||||||
existing.deltas.push(delta)
|
if (existing) {
|
||||||
}
|
existing.deltas.push(delta)
|
||||||
else {
|
}
|
||||||
this[docType].updates.push({ id: document.id, updates: [], deltas: [delta] })
|
else {
|
||||||
|
this[docType].updates.push({ id: document.id, updates: [], deltas: [delta] })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -96,7 +99,9 @@ export class ActorImpacts {
|
|||||||
|
|
||||||
async applyImpacts() {
|
async applyImpacts() {
|
||||||
const actor = this.actorToken.actor
|
const actor = this.actorToken.actor
|
||||||
await Promise.all(ACTOR_EMBEDDED_DOCTYPES.map(async docType => await this.$applyDocumentsImpacts(actor, docType)))
|
for (let docType of ACTOR_EMBEDDED_DOCTYPES) {
|
||||||
|
await this.$applyDocumentsImpacts(actor, docType)
|
||||||
|
}
|
||||||
const updates = ActorImpacts.$computeUpdates(this, id => actor)
|
const updates = ActorImpacts.$computeUpdates(this, id => actor)
|
||||||
await actor.update(updates, { render: true })
|
await actor.update(updates, { render: true })
|
||||||
}
|
}
|
||||||
@@ -122,8 +127,8 @@ export class ActorImpacts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
findCreatedId(docType, origId){
|
findCreatedId(docType, origId) {
|
||||||
return this[docType].creates.find(it => it.id = origId)?.createdId
|
return this[docType].creates.find(it => it.id = origId)?.createdId
|
||||||
}
|
}
|
||||||
|
|
||||||
$getEmbeddedDocument(docType, id) {
|
$getEmbeddedDocument(docType, id) {
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"gulp": "^5.0.0",
|
"gulp": "^5.0.0",
|
||||||
"gulp-less": "^5.0.0",
|
"gulp-less": "^5.0.0",
|
||||||
|
"pdf-lib": "^1.17.1",
|
||||||
"rollup-plugin-visualizer": "^5.12.0"
|
"rollup-plugin-visualizer": "^5.12.0"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -1604,7 +1604,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!ryUZTa17LzNv25UY.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!ryUZTa17LzNv25UY.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
flags: {}
|
flags: {}
|
||||||
|
|||||||
@@ -1604,7 +1604,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!ohmz9Jn4jxD88Kll.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!ohmz9Jn4jxD88Kll.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
flags: {}
|
flags: {}
|
||||||
|
|||||||
@@ -1604,7 +1604,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!JARnWt2MQWDyRwQt.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!JARnWt2MQWDyRwQt.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
flags: {}
|
flags: {}
|
||||||
|
|||||||
@@ -1551,7 +1551,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!SJb0c8FDcYdd41rB.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!SJb0c8FDcYdd41rB.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1604,7 +1604,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!JQCwAOK64Yijwtch.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!JQCwAOK64Yijwtch.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
flags: {}
|
flags: {}
|
||||||
|
|||||||
@@ -1604,7 +1604,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!CRRP8ucJpljX6tq8.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!CRRP8ucJpljX6tq8.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
flags: {}
|
flags: {}
|
||||||
|
|||||||
@@ -1604,7 +1604,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!51vL4MhEE0asjgF2.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!51vL4MhEE0asjgF2.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
flags: {}
|
flags: {}
|
||||||
|
|||||||
@@ -1604,7 +1604,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!NX1nAqKKIcQlyGua.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!NX1nAqKKIcQlyGua.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
flags: {}
|
flags: {}
|
||||||
|
|||||||
@@ -1604,7 +1604,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!2bRaEDuwZezKAyEq.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!2bRaEDuwZezKAyEq.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
flags: {}
|
flags: {}
|
||||||
|
|||||||
@@ -1604,7 +1604,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!IeKSXignUpfUTU4m.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!IeKSXignUpfUTU4m.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
flags: {}
|
flags: {}
|
||||||
|
|||||||
@@ -1552,7 +1552,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!pSM0ku0RJNLvHSvF.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!pSM0ku0RJNLvHSvF.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1552,7 +1552,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!5xPFHgrY5AIP9Mnb.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!5xPFHgrY5AIP9Mnb.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1604,7 +1604,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!U9NNcXQBJmsI9Ttk.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!U9NNcXQBJmsI9Ttk.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
flags: {}
|
flags: {}
|
||||||
|
|||||||
@@ -1551,7 +1551,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!oLDROOdwfctyRusH.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!oLDROOdwfctyRusH.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1551,7 +1551,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!2KN3nKGZ36Qkn7Mf.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!2KN3nKGZ36Qkn7Mf.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1605,7 +1605,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!V2WOs8deCYdBT2Jo.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!V2WOs8deCYdBT2Jo.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
flags: {}
|
flags: {}
|
||||||
|
|||||||
@@ -1605,7 +1605,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!UNs4RBLYiGbfxd1c.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!UNs4RBLYiGbfxd1c.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
flags: {}
|
flags: {}
|
||||||
|
|||||||
@@ -1605,7 +1605,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!jfXs7qaHEWQpIHud.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!jfXs7qaHEWQpIHud.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
flags: {}
|
flags: {}
|
||||||
|
|||||||
@@ -1604,7 +1604,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!awZg7bGbTjEGRMiw.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!awZg7bGbTjEGRMiw.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
flags: {}
|
flags: {}
|
||||||
|
|||||||
@@ -1604,7 +1604,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!dMdBctaRRdGJgced.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!dMdBctaRRdGJgced.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
flags: {}
|
flags: {}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
_id: vDOAyWc2YnuhNnFF
|
_id: vDOAyWc2YnuhNnFF
|
||||||
|
|||||||
@@ -1551,7 +1551,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!qscItDC5z6Hr2Lrh.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!qscItDC5z6Hr2Lrh.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1550,7 +1550,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!zACge7QxwyJkC6nD.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!zACge7QxwyJkC6nD.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5500000
|
sort: 5500000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1551,7 +1551,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!esJWonwDGLFaMRK3.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!esJWonwDGLFaMRK3.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1551,7 +1551,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!gscYFtwk73WrGvA5.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!gscYFtwk73WrGvA5.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1551,7 +1551,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!dW4RMKpz2WaXbW3h.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!dW4RMKpz2WaXbW3h.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1551,7 +1551,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!ncXFs8oaZWG68Tzn.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!ncXFs8oaZWG68Tzn.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1551,7 +1551,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!OKMXH6YpPXUyvqzN.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!OKMXH6YpPXUyvqzN.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1551,7 +1551,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!EzV1Zxuwi7jwa6bj.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!EzV1Zxuwi7jwa6bj.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1551,7 +1551,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!YQ6vavAVyZecPvGQ.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!YQ6vavAVyZecPvGQ.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1551,7 +1551,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!b7ThiitioBVXxU7D.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!b7ThiitioBVXxU7D.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1551,7 +1551,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!XnBXyRyE2BUVVT1k.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!XnBXyRyE2BUVVT1k.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1551,7 +1551,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!kKI9izKrKftYVnvs.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!kKI9izKrKftYVnvs.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1551,7 +1551,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!nzw2q9BHSDN6TIQQ.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!nzw2q9BHSDN6TIQQ.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1551,7 +1551,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!Pf4cLn0kandYzviD.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!Pf4cLn0kandYzviD.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -668,7 +668,7 @@ results:
|
|||||||
- _id: ZhPRAyUuEYcG9X5z
|
- _id: ZhPRAyUuEYcG9X5z
|
||||||
flags: {}
|
flags: {}
|
||||||
type: pack
|
type: pack
|
||||||
text: Survie en désert
|
text: Survie en Désert
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
weight: 1
|
weight: 1
|
||||||
range:
|
range:
|
||||||
|
|||||||
@@ -1552,7 +1552,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!GJWEoGXy5kSd4sT8.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!GJWEoGXy5kSd4sT8.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1552,7 +1552,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!m63oPEPvCrds4akp.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!m63oPEPvCrds4akp.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1552,7 +1552,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!jtJqqegMrF3fuND3.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!jtJqqegMrF3fuND3.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1552,7 +1552,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!8Jeas59CdpnnYabL.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!8Jeas59CdpnnYabL.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1552,7 +1552,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!7WgNJwO7p5QNraXA.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!7WgNJwO7p5QNraXA.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
sort: 5400000
|
sort: 5400000
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
|
|||||||
@@ -1551,7 +1551,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!N5ybrpVwbpL8aPG0.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!N5ybrpVwbpL8aPG0.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
effects: []
|
effects: []
|
||||||
|
|||||||
@@ -1551,7 +1551,7 @@ items:
|
|||||||
coreVersion: '12.331'
|
coreVersion: '12.331'
|
||||||
_key: '!actors.items!X9d5McdSAT1Ivp39.oHnSnCw1RAW5t15S'
|
_key: '!actors.items!X9d5McdSAT1Ivp39.oHnSnCw1RAW5t15S'
|
||||||
- _id: vDOAyWc2YnuhNnFF
|
- _id: vDOAyWc2YnuhNnFF
|
||||||
name: Survie en désert
|
name: Survie en Désert
|
||||||
type: competence
|
type: competence
|
||||||
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp
|
||||||
effects: []
|
effects: []
|
||||||
|
|||||||