diff --git a/README.md b/README.md index 793d746b..7cad7910 100644 --- a/README.md +++ b/README.md @@ -98,6 +98,9 @@
- Foundry VTT support is covered by the following license: [Limited License Agreement for module development 09/02/2020](https://foundryvtt.com/article/license/).

+

+ - A big thank you to AshesToAshe (AshesForAshe#6498) for providing many of the character sheet backgrounds. +

- Additional art under Creative Commons 3.0 BY license: icons by Delapouite and Lorc - More info available at https://game-icons.net

diff --git a/Release_Notes.txt b/Release_Notes.txt index 9c744061..dd37f209 100644 --- a/Release_Notes.txt +++ b/Release_Notes.txt @@ -167,3 +167,11 @@ Version 3.0.8 - Traits integrated in Enhanced combat: corrupting attack, colossal. - Steadfast Adept now works on entangling vines and Anathema - Damage of Massive weapons wielded by NPCs is now correctly calculated in Enhanced combat. + +Version 3.0.9 +- New backgrounds provided by AshesForAshe (AshesForAshe#6498) +- Many improvements on the character sheets (main page weapons & armors) +- Monster character sheet can now show +/- instead of values (configurable under options) +- New configuration settings dialogue for sheet, title backgrounds and editable/non-editable fields (textures or colours). +- These are client based setting so can be adjusted by each user. + diff --git a/asset/image/background.jpg b/asset/image/background.jpg deleted file mode 100644 index 2e14af29..00000000 Binary files a/asset/image/background.jpg and /dev/null differ diff --git a/asset/image/background/blue_light.webp b/asset/image/background/blue_light.webp new file mode 100644 index 00000000..67b4c0b0 Binary files /dev/null and b/asset/image/background/blue_light.webp differ diff --git a/asset/image/background/blue_square_light.webp b/asset/image/background/blue_square_light.webp new file mode 100644 index 00000000..c5947a0c Binary files /dev/null and b/asset/image/background/blue_square_light.webp differ diff --git a/asset/image/background/brown_dark.webp b/asset/image/background/brown_dark.webp new file mode 100644 index 00000000..77b28f28 Binary files /dev/null and b/asset/image/background/brown_dark.webp differ diff --git a/asset/image/background/brown_square_dark.webp b/asset/image/background/brown_square_dark.webp new file mode 100644 index 00000000..8ae096c8 Binary files /dev/null and b/asset/image/background/brown_square_dark.webp differ diff --git a/asset/image/background/editable.webp b/asset/image/background/editable.webp new file mode 100644 index 00000000..182e5c12 Binary files /dev/null and b/asset/image/background/editable.webp differ diff --git a/asset/image/background/foreground.webp b/asset/image/background/foreground.webp new file mode 100644 index 00000000..20254644 Binary files /dev/null and b/asset/image/background/foreground.webp differ diff --git a/asset/image/background/green-scales.webp b/asset/image/background/green-scales.webp new file mode 100644 index 00000000..15704766 Binary files /dev/null and b/asset/image/background/green-scales.webp differ diff --git a/asset/image/background/green_flower.webp b/asset/image/background/green_flower.webp new file mode 100644 index 00000000..d3011f4e Binary files /dev/null and b/asset/image/background/green_flower.webp differ diff --git a/asset/image/background/green_flower_dark.webp b/asset/image/background/green_flower_dark.webp new file mode 100644 index 00000000..ca46aedd Binary files /dev/null and b/asset/image/background/green_flower_dark.webp differ diff --git a/asset/image/background/green_flower_light.webp b/asset/image/background/green_flower_light.webp new file mode 100644 index 00000000..9a91acc0 Binary files /dev/null and b/asset/image/background/green_flower_light.webp differ diff --git a/asset/image/background/green_gold_dark.webp b/asset/image/background/green_gold_dark.webp new file mode 100644 index 00000000..c3b2ecb7 Binary files /dev/null and b/asset/image/background/green_gold_dark.webp differ diff --git a/asset/image/background/light_title.webp b/asset/image/background/light_title.webp new file mode 100644 index 00000000..81748c09 Binary files /dev/null and b/asset/image/background/light_title.webp differ diff --git a/asset/image/background/new-editable.webp b/asset/image/background/new-editable.webp new file mode 100644 index 00000000..35cfe615 Binary files /dev/null and b/asset/image/background/new-editable.webp differ diff --git a/asset/image/background/new-not-editable.webp b/asset/image/background/new-not-editable.webp new file mode 100644 index 00000000..04467299 Binary files /dev/null and b/asset/image/background/new-not-editable.webp differ diff --git a/asset/image/background/new_title.webp b/asset/image/background/new_title.webp new file mode 100644 index 00000000..2bb4688c Binary files /dev/null and b/asset/image/background/new_title.webp differ diff --git a/asset/image/not-editable.jpg b/asset/image/background/not-editable.webp similarity index 54% rename from asset/image/not-editable.jpg rename to asset/image/background/not-editable.webp index 98aaa027..b06d01cf 100644 Binary files a/asset/image/not-editable.jpg and b/asset/image/background/not-editable.webp differ diff --git a/asset/image/background/orange_light.webp b/asset/image/background/orange_light.webp new file mode 100644 index 00000000..bd5e2b24 Binary files /dev/null and b/asset/image/background/orange_light.webp differ diff --git a/asset/image/background/purple_flower_light.webp b/asset/image/background/purple_flower_light.webp new file mode 100644 index 00000000..c40e370a Binary files /dev/null and b/asset/image/background/purple_flower_light.webp differ diff --git a/asset/image/background/red_compass_light.webp b/asset/image/background/red_compass_light.webp new file mode 100644 index 00000000..963a52f0 Binary files /dev/null and b/asset/image/background/red_compass_light.webp differ diff --git a/asset/image/background/red_flower_light.webp b/asset/image/background/red_flower_light.webp new file mode 100644 index 00000000..cec8cf9c Binary files /dev/null and b/asset/image/background/red_flower_light.webp differ diff --git a/asset/image/background/red_square_light.webp b/asset/image/background/red_square_light.webp new file mode 100644 index 00000000..c79376f5 Binary files /dev/null and b/asset/image/background/red_square_light.webp differ diff --git a/asset/image/background/title.webp b/asset/image/background/title.webp new file mode 100644 index 00000000..f76162e8 Binary files /dev/null and b/asset/image/background/title.webp differ diff --git a/asset/image/editable.jpg b/asset/image/editable.jpg deleted file mode 100644 index 197e9e99..00000000 Binary files a/asset/image/editable.jpg and /dev/null differ diff --git a/asset/image/foreground.webp b/asset/image/foreground.webp new file mode 100644 index 00000000..adf1c083 Binary files /dev/null and b/asset/image/foreground.webp differ diff --git a/asset/image/head.png b/asset/image/head.png new file mode 100644 index 00000000..2b0094dd Binary files /dev/null and b/asset/image/head.png differ diff --git a/asset/image/head.webp b/asset/image/head.webp new file mode 100644 index 00000000..cbc6b102 Binary files /dev/null and b/asset/image/head.webp differ diff --git a/asset/image/system-guide/01-01.webp b/asset/image/system-guide/01-01.webp new file mode 100644 index 00000000..e0ff4288 Binary files /dev/null and b/asset/image/system-guide/01-01.webp differ diff --git a/asset/image/system-guide/01.webp b/asset/image/system-guide/01.webp index 0727e032..b6b1a48c 100644 Binary files a/asset/image/system-guide/01.webp and b/asset/image/system-guide/01.webp differ diff --git a/asset/image/system-guide/04.webp b/asset/image/system-guide/04.webp index 74b1882e..855fe8fc 100644 Binary files a/asset/image/system-guide/04.webp and b/asset/image/system-guide/04.webp differ diff --git a/asset/image/system-guide/06.webp b/asset/image/system-guide/06.webp index a703576d..2a230222 100644 Binary files a/asset/image/system-guide/06.webp and b/asset/image/system-guide/06.webp differ diff --git a/asset/image/system-guide/16.webp b/asset/image/system-guide/16.webp index 6d065c6c..0437abdf 100644 Binary files a/asset/image/system-guide/16.webp and b/asset/image/system-guide/16.webp differ diff --git a/asset/image/system-guide/17.webp b/asset/image/system-guide/17.webp index f9c4515f..fb67b858 100644 Binary files a/asset/image/system-guide/17.webp and b/asset/image/system-guide/17.webp differ diff --git a/asset/image/system-guide/19.webp b/asset/image/system-guide/19.webp index fa84a99c..f10be97a 100644 Binary files a/asset/image/system-guide/19.webp and b/asset/image/system-guide/19.webp differ diff --git a/asset/image/system-guide/armor-add.webp b/asset/image/system-guide/armor-add.webp index 855cec7b..f118929c 100644 Binary files a/asset/image/system-guide/armor-add.webp and b/asset/image/system-guide/armor-add.webp differ diff --git a/asset/image/system-guide/character-stats.webp b/asset/image/system-guide/character-stats.webp index 7180ec86..50f9c433 100644 Binary files a/asset/image/system-guide/character-stats.webp and b/asset/image/system-guide/character-stats.webp differ diff --git a/asset/image/system-guide/config-button.webp b/asset/image/system-guide/config-button.webp new file mode 100644 index 00000000..1fbf5815 Binary files /dev/null and b/asset/image/system-guide/config-button.webp differ diff --git a/asset/image/system-guide/configuration-settings-cp.webp b/asset/image/system-guide/configuration-settings-cp.webp new file mode 100644 index 00000000..00302a14 Binary files /dev/null and b/asset/image/system-guide/configuration-settings-cp.webp differ diff --git a/asset/image/system-guide/configuration-settings.webp b/asset/image/system-guide/configuration-settings.webp new file mode 100644 index 00000000..2b5a42da Binary files /dev/null and b/asset/image/system-guide/configuration-settings.webp differ diff --git a/asset/image/system-guide/weapon-state.webp b/asset/image/system-guide/weapon-state.webp index 25967796..c34968d8 100644 Binary files a/asset/image/system-guide/weapon-state.webp and b/asset/image/system-guide/weapon-state.webp differ diff --git a/asset/image/title.jpg b/asset/image/title.jpg deleted file mode 100644 index 8e88c07e..00000000 Binary files a/asset/image/title.jpg and /dev/null differ diff --git a/css/symbaroum.css b/css/symbaroum.css index 0fa6244a..d406b6d9 100644 --- a/css/symbaroum.css +++ b/css/symbaroum.css @@ -9,14 +9,15 @@ .symbaroum.chat.combat .foreground, .symbaroum.chat.ability .foreground { - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; padding: 10px; } .symbaroum.chat.combat .border, .symbaroum.chat.ability .border { border: 1px solid transparent; - border-image: url(../asset/image/title.jpg) 20/5px round; + border-color: var(--title-color); + border-image: var(--title-image) 20/10px; } .symbaroum.chat.combatstrong, @@ -137,12 +138,16 @@ font-weight: bold; color: var(--color-label); font-family: var(--font-text); - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; width: 100%; text-align: center; padding: 5px; } +.symbaroum.dialog .lblfavour .checkbox { + white-space: nowrap; +} + .symbaroum.dialog .weapondamage { padding-left: 5px; } @@ -152,7 +157,7 @@ font-weight: bold; color: var(--color-label); font-family: var(--font-text); - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; width: 10em; min-width: 10em; text-align: center; @@ -160,9 +165,8 @@ } .symbaroum.dialog input[type=checkbox] { - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; border: 1px solid var(--color-border); - box-shadow: inset 0 0 6px black; color: var(--color-text); width: 100%; height: auto; @@ -171,7 +175,7 @@ .symbaroum.dialog input[type=text], .symbaroum.dialog input[type=number], .symbaroum.dialog select { - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; border: 1px solid var(--color-border); box-shadow: inset 0 0 6px black; color: var(--color-text); @@ -220,6 +224,11 @@ margin: 5px 10px; } +.symbaroum.dialog input[type=text][disabled], +.symbaroum.dialog input[type=number][disabled] { + background: var(--box-non-editable) repeat; +} + .symbaroum.chat.item { color: var(--color-text); font-family: var(--font-text); @@ -229,13 +238,14 @@ } .symbaroum.chat.item .foreground { - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; padding: 10px; } .symbaroum.chat.item .border { border: 1px solid transparent; - border-image: url(../asset/image/title.jpg) 20/5px round; + border-color: var(--title-color); + border-image: var(--title-image) 20/10px; } .symbaroum.chat.item strong { @@ -286,13 +296,14 @@ } .symbaroum.chat.roll .foreground { - background: url(../asset/image/editable.jpg) repeat; + background: var(--chat-background) repeat; padding: 10px; } .symbaroum.chat.roll .border { border: 1px solid transparent; - border-image: url(../asset/image/title.jpg) 20/5px round; + border-color: var(--color-border); + border-image: var(--chat-roll-border) 20/10px; } .symbaroum.chat.roll strong { @@ -394,8 +405,12 @@ } /* Common styles */ -.symbaroum.sheet.actor .window-content { - background: url(../asset/image/background.jpg) repeat; +.symbaroum.sheet.actor.player .window-content { + background: var(--color-charBG); +} + +.symbaroum.sheet.actor.monster .window-content { + background: var(--color-npcBG); } .symbaroum.sheet.actor .window-content .editable { @@ -403,12 +418,13 @@ } .symbaroum.sheet.actor .foreground { - background: url(../asset/image/foreground.jpg) repeat; + background: url(../asset/image/foreground.webp) repeat; } .symbaroum.sheet.actor .border { border: 10px solid transparent; - border-image: url(../asset/image/title.jpg) 20/10px round; + border-color: var(--title-color); + border-image: var(--title-image) 20/10px; } .symbaroum.sheet.actor h1 { @@ -419,7 +435,7 @@ font-size: 16px; margin: 0; text-align: center; - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; color: var(--color-title); font-family: var(--font-text); } @@ -429,7 +445,7 @@ font-weight: bold; color: var(--color-label); font-family: var(--font-text); - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; width: 10em; text-align: center; padding: 5px; @@ -440,7 +456,7 @@ font-weight: bold; color: var(--color-label); font-family: var(--font-text); - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; text-align: center; padding: 0; cursor: pointer; @@ -457,7 +473,7 @@ .symbaroum.sheet.actor input[type=text], .symbaroum.sheet.actor input[type=number] { - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; border: 1px solid var(--color-border); box-shadow: inset 0 0 6px black; color: var(--color-text); @@ -474,7 +490,7 @@ } .symbaroum.sheet.actor select { - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; border: 1px solid var(--color-border); box-shadow: inset 0 0 6px black; color: var(--color-text); @@ -486,6 +502,8 @@ border-radius: 0; -moz-appearance: textfield; text-align: center; + border-color: var(--title-color); + border-image: var(--title-image) 20/10px; } .symbaroum.sheet.actor input[type=number]::-webkit-outer-spin-button, @@ -496,7 +514,7 @@ .symbaroum.sheet.actor input[type=text][disabled], .symbaroum.sheet.actor input[type=number][disabled] { - background: url(../asset/image/not-editable.jpg) repeat; + background: var(--box-non-editable) repeat; } .symbaroum.sheet.actor .item-list { @@ -515,7 +533,7 @@ font-weight: bold; color: var(--color-label); font-family: var(--font-text); - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; text-align: center; padding: 5px; border: none; @@ -534,7 +552,7 @@ } .symbaroum.sheet.actor .image-container { - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; border: 1px solid var(--color-border); box-shadow: inset 0 0 6px black; } @@ -589,7 +607,7 @@ } .symbaroum.sheet.item .window-content { - background: url(../asset/image/background.jpg) repeat; + background: var(--color-charBG); } .symbaroum.sheet.item .window-content .editable { @@ -597,12 +615,13 @@ } .symbaroum.sheet.item .foreground { - background: url(../asset/image/foreground.jpg) repeat; + background: url(../asset/image/foreground.webp) repeat; } .symbaroum.sheet.item .border { border: 10px solid transparent; - border-image: url(../asset/image/title.jpg) 20/10px round; + border-color: var(--title-color); + border-image: var(--title-image) 20/10px; } .symbaroum.sheet.item h1 { @@ -613,7 +632,7 @@ font-size: 1.2em; margin: 0; text-align: center; - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; color: var(--color-title); font-family: var(--font-text); } @@ -626,7 +645,7 @@ font-size: 1em; margin: 0; text-align: center; - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; color: var(--color-title); font-family: var(--font-text); } @@ -636,7 +655,7 @@ font-weight: bold; color: var(--color-label); font-family: var(--font-text); - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; width: 100%; text-align: center; padding: 5px; @@ -654,15 +673,35 @@ cursor: pointer; } +.symbaroum.sheet.item button { + font-size: 14px; + font-weight: bold; + color: var(--color-label); + font-family: var(--font-text); + background: var(--title-color) repeat; + text-align: center; + padding: 0; + cursor: pointer; + border: none; + border-radius: 0; + margin: 0; +} + +.symbaroum.sheet.actor button:hover { + color: var(--color-active); + text-shadow: 0 0 10px var(--color-active); + box-shadow: none; +} + .symbaroum.sheet.item input[type=text][disabled], .symbaroum.sheet.item input[type=number][disabled] { - background: url(../asset/image/not-editable.jpg) repeat; + background: var(--box-non-editable) repeat; } .symbaroum.sheet.item input[type=text], .symbaroum.sheet.item input[type=number], .symbaroum.sheet.item select { - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; border: 1px solid var(--color-border); box-shadow: inset 0 0 6px black; color: var(--color-text); @@ -710,7 +749,7 @@ } .symbaroum.sheet.item .sheet-header .avatar { - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; border: 1px solid black; box-shadow: inset 0 0 6px black; flex: 0 0 auto; @@ -767,7 +806,7 @@ color: var(--color-text); height: 100%; width: 100%; - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; box-shadow: inset 0 0 6px black; } @@ -786,7 +825,7 @@ } .symbaroum.sheet.item .editor .tox .tox-toolbar__primary { - background: url(../asset/image/title.jpg) repeat; + background: var(--title-image) repeat; } .symbaroum.sheet.item .editor .tox .tox-tbtn svg:hover { @@ -803,7 +842,7 @@ font-size: 18px; margin: 5px; padding: 5px; - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; font-family: var(--font-text); } @@ -829,8 +868,19 @@ .img01 { display: block; background-image: url("../asset/image/system-guide/01.webp"); - width: 608px; - height: 218px; + width: 750px; + height: 179px; + margin-left: auto; + margin-right: auto; + background-size: 100%; + border: 0; +} + +.img01-01 { + display: block; + background-image: url("../asset/image/system-guide/01-01.webp"); + width: 300px; + height: 550px; margin-left: auto; margin-right: auto; background-size: 100%; @@ -862,8 +912,8 @@ .img04 { display: block; background-image: url("../asset/image/system-guide/04.webp"); - width: 694px; - height: 146px; + width: 654px; + height: 244px; margin-left: auto; margin-right: auto; background-size: 100%; @@ -873,8 +923,8 @@ .img06 { display: block; background-image: url("../asset/image/system-guide/06.webp"); - width: 204px; - height: 176px; + width: 284px; + height: 554px; margin-left: auto; margin-right: auto; background-size: 100%; @@ -983,8 +1033,8 @@ .img16 { display: block; background-image: url("../asset/image/system-guide/16.webp"); - width: 609px; - height: 83px; + width: 750px; + height: 145px; margin-left: auto; margin-right: auto; background-size: 100%; @@ -994,8 +1044,8 @@ .img17 { display: block; background-image: url("../asset/image/system-guide/17.webp"); - width: 280px; - height: 202px; + width: 400px; + height: 278px; margin-left: auto; margin-right: auto; background-size: 100%; @@ -1016,8 +1066,8 @@ .img19 { display: block; background-image: url("../asset/image/system-guide/19.webp"); - width: 399px; - height: 241px; + width: 400px; + height: 201px; margin-left: auto; margin-right: auto; background-size: 100%; @@ -1071,8 +1121,8 @@ .img05 { display: block; background-image: url("../asset/image/system-guide/armor-add.webp"); - width: 477px; - height: 116px; + width: 677px; + height: 218px; margin-left: auto; margin-right: auto; background-size: 100%; @@ -1082,8 +1132,8 @@ .img24 { display: block; background-image: url("../asset/image/system-guide/weapon-state.webp"); - width: 462px; - height: 175px; + width: 682px; + height: 355px; margin-left: auto; margin-right: auto; background-size: 100%; @@ -1112,6 +1162,58 @@ border: 0; } +.config-button { + display: block; + background-image: url("../asset/image/system-guide/config-button.webp"); + width: 293px; + height: 121px; + margin-left: auto; + margin-right: auto; + background-size: 100%; + border: 0; +} + +.configuration-settings { + display: block; + background-image: url("../asset/image/system-guide/configuration-settings.webp"); + width: 499px; + height: 326px; + margin-left: auto; + margin-right: auto; + background-size: 100%; + border: 0; +} + +.configuration-settings-cp { + display: block; + background-image: url("../asset/image/system-guide/configuration-settings-cp.webp"); + width: 495px; + height: 327px; + margin-left: auto; + margin-right: auto; + background-size: 100%; + border: 0; +} + +#pause { + background: none; +} +#pause > img { + content: url("../asset/image/head.webp"); + width: 200px; + height: 200px; + top: -50px; + left: calc(50% - 100px); + opacity: 0.7; + -webkit-animation: rotation 10s infinite linear; + animation: rotation 10s infinite linear; +} +#pause h3 { + font-family: var(--font-text); + font-size: 32px; + text-shadow: 0px 3px 5px black; +} + @font-face { font-family: "Philosopher"; src: url("../asset/font/philosopher-bold.ttf"); @@ -1125,6 +1227,14 @@ --color-border: black; --color-shadow: #a48b02; --font-text: "Philosopher", serif; + --color-charBG: "url(../asset/image/background/green_flower_light.webp) repeat"; + --color-npcBG: "url(../asset/image/background/purple_flower_light.webp) repeat"; + --title-image: "url(../asset/image/background/title.webp)"; + --title-color: black; + --box-editable: "url(../asset/image/background/editable.webp)"; + --box-non-editable: "url(../asset/image/background/not-editable.webp)"; + --chat-background: "url(../asset/image/background/editable.webp)"; + --chat-roll-border: "url(../asset/image/background/title.webp)"; } /* Tabs styles */ @@ -1226,7 +1336,7 @@ color: var(--color-text); height: 100%; width: 100%; - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; box-shadow: inset 0 0 6px black; } @@ -1254,7 +1364,7 @@ } .symbaroum.sheet.actor .player .bio .editor .tox .tox-toolbar__primary { - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; } .symbaroum.sheet.actor .player .bio .editor .tox .tox-tbtn svg:hover { @@ -1339,7 +1449,7 @@ font-weight: bold; color: var(--color-label); font-family: var(--font-text); - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; text-align: center; border: none; border-radius: 0; @@ -1377,7 +1487,7 @@ .symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .artifact td .action, .symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .artifact td .corruption, .symbaroum.sheet.actor .player .gear .wrapper-right .equipments .equipment td .quantity { - background: url(../asset/image/not-editable.jpg) repeat; + background: var(--box-non-editable) repeat; border: 1px solid var(--color-border); box-shadow: inset 0 0 6px black; height: 28px; @@ -1385,24 +1495,38 @@ text-align: center; } +.symbaroum.sheet.actor .player .gear .wrapper-left .armors .armor td .cell, +.symbaroum.sheet.actor .player .gear .wrapper-left .weapons .weapon td .cell, +.symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .artifact td .cell, +.symbaroum.sheet.actor .player .gear .wrapper-right .equipments .equipment td .cell { + background: var(--title-color) repeat; +} + .symbaroum.sheet.actor .player .gear .wrapper-left .armors .armor td .armorname, .symbaroum.sheet.actor .player .gear .wrapper-left .weapons .weapon td .weaponname, .symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .artifact td .artifactname { width: 100%; - max-width: 100%; + max-width: 15em; min-width: 131px; } -.symbaroum.sheet.actor .player .gear .wrapper-right .equipments .equipment td .equipmentname { +.symbaroum.sheet.actor .player .gear .wrapper-right .equipments .equipment td .namefield { width: 108px; + max-width: 10em; } .symbaroum.sheet.actor .player .gear .wrapper-left .armors .armor td .namefield, .symbaroum.sheet.actor .player .gear .wrapper-left .weapons .weapon td .namefield, -.symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .artifact td .namefield, +.symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .artifact td .namefield { + display: flex; + flex-flow: nowrap; + min-width: 131px; +} + .symbaroum.sheet.actor .player .gear .wrapper-right .equipments .equipment td .namefield { display: flex; flex-flow: nowrap; + min-width: 108px; } .symbaroum.sheet.actor .player .gear .wrapper-left .armors .armor td .image-container, @@ -1420,7 +1544,7 @@ .symbaroum.sheet.actor .player .gear .wrapper-left .artifacts table th, .symbaroum.sheet.actor .player .gear .wrapper-right .equipments table td, .symbaroum.sheet.actor .player .gear .wrapper-right .equipments table th { - padding: 2px; + margin: 2px; } .symbaroum.sheet.actor .player .gear .wrapper-left .armors .armor td.protection, @@ -1508,6 +1632,16 @@ flex-basis: 100%; } +.symbaroum.sheet.actor .player .main .attributes .attributes-header { + display: flex; + flex-direction: row; + flex-wrap: nowrap; +} + +.symbaroum.sheet.actor .player .main .attributes .attributes-header .modify-attributes { + width: 3em; +} + .symbaroum.sheet.actor .player .section1 { display: flex; flex-direction: row; @@ -1537,9 +1671,8 @@ display: flex; flex-direction: row; flex-wrap: wrap; - flex-basis: calc(50% - 5px); + flex-basis: calc(50%); border-top: none; - margin-right: 5px; } .symbaroum.sheet.actor .toughness { @@ -1664,7 +1797,6 @@ .symbaroum.sheet.actor .player .main .health2 .corruption-threshold label, .symbaroum.sheet.actor .player .main .health2 .corruption-max label { flex-basis: 70%; - padding: 0px; } .symbaroum.sheet.actor .player .main .health .toughness-current input, @@ -1685,7 +1817,7 @@ .symbaroum.sheet.actor .player .main .health2 .toughness-threshold, .symbaroum.sheet.actor .player .main .health2 .corruption-longterm, .symbaroum.sheet.actor .player .main .health2 .corruption-max { - margin-bottom: 10px; + margin-bottom: 5px; } .symbaroum.sheet.actor .player .main .combat { @@ -1698,6 +1830,38 @@ margin-left: 5px; } +.symbaroum.sheet.actor .player .main .combat .combatheader, +.symbaroum.sheet.actor .player .main .combat .combatheader { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + border-top: none; + width: 100%; + background: var(--title-color) repeat; +} + +.symbaroum.sheet.actor .player .main .combat .combatheader .iniheader { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + border-top: none; +} + +.symbaroum.sheet.actor .player .main .combat .combatheader .iniheader .title { + color: var(--color-title); + text-align: center; + padding: 5px; +} + +.symbaroum.sheet.actor .player .main .combat .combatheader .iniheader label { + width: 3em; +} + +.symbaroum.sheet.actor .player .main .combat .combatheader .iniheader input { + width: 4em; + margin-right: 5px; +} + .symbaroum.sheet.actor .player .main .combat .initiative, .symbaroum.sheet.actor .player .main .combat .defenseAttr { display: flex; @@ -1705,7 +1869,7 @@ justify-content: center; flex-wrap: wrap; flex-basis: 100%; - margin: 5px 0px 5px 0px; + margin-top: 5px; } .symbaroum.sheet.actor .player .main .combat .stat-modifiers .initiative, @@ -1721,71 +1885,85 @@ margin-bottom: 5px; margin-right: 5px; margin-left: 5px; + margin-top: 5px; } .symbaroum.sheet.actor .player .main .combat .armor .roll-armor, -.symbaroum.sheet.actor .player .main .combat .armor .protection, -.symbaroum.sheet.actor .player .main .combat .armor .defense, -.symbaroum.sheet.actor .player .main .combat .armor .quality { +.symbaroum.sheet.actor .player .main .combat .weapons .roll-weapon { display: flex; flex-direction: row; /* justify-content: center; */ } -/* .symbaroum.sheet.actor .player .main .combat .armor .roll-armor, */ -.symbaroum.sheet.actor .player .main .combat .armor .quality { - flex-basis: 100%; +.symbaroum.sheet.actor .player .main .combat .armor .item-header, +.symbaroum.sheet.actor .player .main .combat .weapons .item-header { + margin-top: 5px; + margin-bottom: 5px; } -.symbaroum.sheet.actor .player .main .combat .armor .roll-armor { - justify-content: center; +.symbaroum.sheet.actor .player .main .combat .armor .item-row { + display: flex; + width: 100%; + flex-wrap: nowrap; + background-image: var(--title-color); + background-repeat: repeat; } -.symbaroum.sheet.actor .player .main .combat .armor .quality { - margin-top: 5px; +.symbaroum.sheet.actor .player .main .combat .armor .roll-armor .combatProt, +.symbaroum.sheet.actor .player .main .combat .weapons .roll-weapon .weaponDam { + width: 8em; + min-width: 8em; + height: 28px; + margin-left: 5px; + margin-right: 5px; } -.symbaroum.sheet.actor .player .main .combat .armor .protection { - flex-basis: 50%; +.symbaroum.sheet.actor .player .main .combat .armor .roll-armor .attribute, +.symbaroum.sheet.actor .player .main .combat .weapons .roll-weapon .attribute { + width: 4em; + min-width: 4em; + margin-right: 5px; } -.symbaroum.sheet.actor .player .main .combat .armor .defense { - flex-basis: calc(50% - 5px); +.symbaroum.sheet.actor .player .main .combat .armor .roll-armor .armordefense, +.symbaroum.sheet.actor .player .main .combat .armor .roll-armor .armordefense input, +.symbaroum.sheet.actor .player .main .combat .weapons .roll-weapon .weaponAttribute, +.symbaroum.sheet.actor .player .main .combat .weapons .roll-weapon .weaponAttribute input { + width: 4em; + min-width: 4em; + height: 28px; +} + +.symbaroum.sheet.actor .player .main .combat .armor .roll-armor { + justify-content: center; +} + +.symbaroum.sheet.actor .player .main .combat .armor .quality { margin-top: 5px; - margin-left: 5px; } -.symbaroum.sheet.actor .player .main .combat .armor .initiative label, -.symbaroum.sheet.actor .player .main .combat .armor .quality label, -.symbaroum.sheet.actor .player .main .combat .armor .protection label, -.symbaroum.sheet.actor .player .main .combat .armor .defense label { +.symbaroum.sheet.actor .player .main .combat .armor .initiative label { width: 10em; min-width: 10em; } -.symbaroum.sheet.actor .player .main .combat .armor .protection input, -.symbaroum.sheet.actor .player .main .combat .armor .defense input { - width: 100%; -} - .symbaroum.sheet.actor .player .main .combat .weapons { display: flex; flex-direction: column; flex-basis: 100%; - margin: 0 5px 5px 5px; + margin-left: 0px; + margin-right: 0px; + margin: 5px; height: 120px; } +.symbaroum.sheet.actor .player .main .combat .armor .item-list .name, .symbaroum.sheet.actor .player .main .combat .weapons .item-list .name { display: flex; - flex-basis: 70%; + flex-basis: 100%; justify-content: center; } -.symbaroum.sheet.actor .player .main .combat .weapons .item-list .damage { - flex-basis: 30%; -} - .symbaroum.sheet.actor .player .main .combat .weapons .item-list .weapon { display: flex; flex-direction: row; @@ -1793,7 +1971,7 @@ } .symbaroum.sheet.actor .player .main .combat .weapons .item-list .weapon .damage { - background: url(../asset/image/not-editable.jpg) repeat; + background: var(--box-non-editable) repeat; border: 1px solid var(--color-border); border-left: none; box-shadow: inset 0 0 6px black; @@ -1818,7 +1996,7 @@ left: 618px; font-size: 32px; color: var(--color-text); - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; height: 36px; width: 36px; text-align: center; @@ -1852,7 +2030,7 @@ .symbaroum.sheet.actor .player .main .abilities-powers .traits .trait .actions { flex-basis: 15%; color: var(--color-text); - background: url(../asset/image/not-editable.jpg) repeat; + background: var(--box-non-editable) repeat; text-align: center; border: 1px solid var(--color-border); border-left: none; @@ -1894,7 +2072,7 @@ color: var(--color-text); height: 100%; width: 100%; - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; box-shadow: inset 0 0 6px black; } @@ -1913,7 +2091,7 @@ } .symbaroum.sheet.actor .player .note .wrapper .editor .tox .tox-toolbar__primary { - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; } .symbaroum.sheet.actor .player .note .wrapper .editor .tox .tox-tbtn svg:hover { @@ -2070,6 +2248,10 @@ width: 100%; } +.symbaroum.sheet.item .artifact .power-n .editor { + width: calc(100% - 10px); +} + .symbaroum.sheet.item .artifact .power-n .power-header, .symbaroum.sheet.item .artifact .power-add { display: flex; @@ -2079,7 +2261,7 @@ flex-basis: 100%; height: fit-content; margin: 5px; - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; } .symbaroum.sheet.item .artifact .power-n .power-header .heading, @@ -2400,7 +2582,7 @@ } .symbaroum.sheet.actor .player .sheet-header .avatar { - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; border: 1px solid black; box-shadow: inset 0 0 6px black; flex: 0 0 auto; @@ -2480,7 +2662,7 @@ font-size: 18px; margin: 5px; padding: 5px; - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; font-family: var(--font-text); height: fit-content; } @@ -2627,6 +2809,13 @@ height: 166px; } +.symbaroum.sheet.item .trait .tab .marker { + display: flex; + flex-direction: row; + flex-basis: 100%; + margin: 5px 5px 5px 10px; +} + .symbaroum.sheet.item .trait .tab .active, .symbaroum.sheet.item .trait .tab .action { display: flex; @@ -2738,7 +2927,7 @@ } .symbaroum.attributes { - background: url(../asset/image/background.jpg) repeat; + background: var(--color-charBG); } .symbaroum.attributes .window-content .editable { @@ -2746,12 +2935,12 @@ } .symbaroum.attributes .foreground { - background: url(../asset/image/foreground.jpg) repeat; + background: url(../asset/image/foreground.webp) repeat; } .symbaroum.attributes .border { border: 10px solid transparent; - border-image: url(../asset/image/title.jpg) 20/10px round; + border-image: var(--title-image) 20/10px round; } .symbaroum.attributes h1 { @@ -2762,7 +2951,7 @@ font-size: 16px; margin: 0; text-align: center; - background: url(../asset/image/title.jpg) repeat; + background: var(--title-image) repeat; color: var(--color-title); font-family: var(--font-text); } @@ -2772,7 +2961,7 @@ font-weight: bold; color: var(--color-label); font-family: var(--font-text); - background: url(../asset/image/title.jpg) repeat; + background: var(--title-image) repeat; width: 10em; text-align: center; padding: 5px; @@ -2783,7 +2972,7 @@ font-weight: bold; color: var(--color-label); font-family: var(--font-text); - background: url(../asset/image/title.jpg) repeat; + background: var(--title-image) repeat; text-align: center; padding: 0; cursor: pointer; @@ -2800,7 +2989,7 @@ .symbaroum.attributes input[type=text], .symbaroum.attributes input[type=number] { - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; border: 1px solid var(--color-border); box-shadow: inset 0 0 6px black; color: var(--color-text); @@ -2817,11 +3006,11 @@ } .symbaroum.attributes input[type=number][disabled] { - background: url(../asset/image/not-editable.jpg) repeat; + background: var(--box-non-editable) repeat; } .symbaroum.attributes .fixed { - background: url(../asset/image/not-editable.jpg) repeat; + background: var(--box-non-editable) repeat; border: 1px solid var(--color-border); box-shadow: inset 0 0 6px black; font-size: 14px; @@ -2872,7 +3061,7 @@ } .symbaroum.attributes .col-header { - background: url(../asset/image/not-editable.jpg) repeat; + background: var(--box-non-editable) repeat; border: 1px solid var(--color-border); border-left: none; box-shadow: inset 0 0 6px black; diff --git a/css/symbaroum.css.map b/css/symbaroum.css.map index e0b4d6cd..912f512b 100644 --- a/css/symbaroum.css.map +++ b/css/symbaroum.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["../scss/chat/_ability.scss","../scss/chat/_dialog.scss","../scss/chat/_item.scss","../scss/chat/_roll.scss","../scss/symbaroum.scss","../scss/common/_actor.scss","../scss/common/_item.scss","../scss/common/_system-guide.scss","../scss/common/_variable.scss","../scss/sheet/tab/_player-bio.scss","../scss/sheet/tab/_player-gear.scss","../scss/sheet/tab/_player-main.scss","../scss/sheet/tab/_player-note.scss","../scss/sheet/_ability.scss","../scss/sheet/_armor.scss","../scss/sheet/_artifact.scss","../scss/sheet/_boon.scss","../scss/sheet/_burden.scss","../scss/sheet/_equipment.scss","../scss/sheet/_mystical-power.scss","../scss/sheet/_player.scss","../scss/sheet/_ritual.scss","../scss/sheet/_trait.scss","../scss/sheet/_weapon.scss","../scss/sheet/_attributes.scss"],"names":[],"mappings":"AAAA;AAAA;EAEE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;;;AAGF;AAAA;EAEE;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAGF;EACE;;;AC5HF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;EACA;;;AC7FF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;ACtDF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AC5GF;ACNA;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;;;AAGF;AAAA;EAEE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;AAAA;EAGE;EACA;;;AAGF;EACE;EACA;EACA;;;ACjMF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;;;AAGF;EACE;;;AAGF;AAAA;AAAA;EAGE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;EAGE;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AC5OF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AClQF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EAEA;;;AJFF;AKZA;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;ACpIF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;AAAA;AAAA;AAAA;EAKE;EACA;EACA;;;AAIF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;EAKE;;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;AAAA;AAAA;AAAA;EAKE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;EACA;EACA;EACA;;;AAIF;AAAA;AAAA;EAIE;EACA;EACA;;;AAGF;EAEE;;;AAGF;AAAA;AAAA;AAAA;EAKE;EACA;;;AAGF;AAAA;AAAA;AAAA;EAKE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EASE;;;AAGF;AAAA;AAAA;AAAA;EAKE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAQE;EACA;;;AAGF;AAAA;AAAA;AAAA;EAKE;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EASE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;EACA;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;AAAA;EAGE;;;AAGF;AAAA;AAAA;EAGE;;;ACzPF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;AACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAiBE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAeE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAYE;;;AAGF;AAAA;AAAA;EAGE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;AACA;;;AAGF;AACA;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;AAAA;EAEE;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;AAAa;EACb;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAAmB;;;AAGrB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AC5WF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AR9BF;ASlBA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;EAKI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;EAEI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AC3DJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;EAKI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;AAAA;AAAA;AAAA;EAKI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;EAEI;EACA;EACA;;;AAGJ;AAAA;EAEI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;ACpEJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAEJ;AAAA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;EAGI;;;AAIJ;AAAA;AAAA;EAII;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;EAMK;;;AAIL;AAAA;EAEI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAIJ;AAAA;EAGI;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;EAKI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAIJ;AAAA;EAEI;EACA;EACA;;;AAKJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;ACnIJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;EAEI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;ACzCJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;EAEI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;ACzCJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;EAGI;EACA;EACA;EACA;EACA;;;AAIJ;AAAA;EAEI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;ACvCJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;EAKI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;AAAA;EAEI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AC9DJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;AACA;AACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;AACA;;;AClLF;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;EAEI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AC5CJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;EAKI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;EAEI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AC3DJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;EAKI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;EAMI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;EAEI;EACA;EACA;;;AAGJ;AAAA;EAEI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;ACrEJ;EACI;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;AACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;ApB9GJ","file":"symbaroum.css.map"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["../scss/chat/_ability.scss","../scss/chat/_dialog.scss","../scss/chat/_item.scss","../scss/chat/_roll.scss","../scss/symbaroum.scss","../scss/common/_actor.scss","../scss/common/_item.scss","../scss/common/_system-guide.scss","../scss/common/_system-override.scss","../scss/common/_variable.scss","../scss/sheet/tab/_player-bio.scss","../scss/sheet/tab/_player-gear.scss","../scss/sheet/tab/_player-main.scss","../scss/sheet/tab/_player-note.scss","../scss/sheet/_ability.scss","../scss/sheet/_armor.scss","../scss/sheet/_artifact.scss","../scss/sheet/_boon.scss","../scss/sheet/_burden.scss","../scss/sheet/_equipment.scss","../scss/sheet/_mystical-power.scss","../scss/sheet/_player.scss","../scss/sheet/_ritual.scss","../scss/sheet/_trait.scss","../scss/sheet/_weapon.scss","../scss/sheet/_attributes.scss"],"names":[],"mappings":"AAAA;AAAA;EAEE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;;AAGF;EACE;;;AC7HF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EAEA;EACA;EACA;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;;;ACtGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;ACvDF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AC7GF;ACNA;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;;;AAGF;AAAA;EAEE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAIF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;AAAA;EAGE;EACA;;;AAGF;EACE;EACA;EACA;;;ACzMF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;;;AAGF;EACE;;;AAGF;AAAA;AAAA;EAGE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;EAGE;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AChQF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AC1SF;EACE;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;;;ACfJ;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EAEA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ALVF;AMbA;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;ACpIF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAQE;;;AAGF;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAQE;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAQE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;EACA;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;AAAA;EAGE;;;AAGF;AAAA;AAAA;EAGE;;;ACzPF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;AACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAiBE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAeE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAYE;;;AAGF;AAAA;AAAA;EAGE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;AACA;;;AAGF;AAAA;EAEE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;AAAa;EACb;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAAmB;;;AAGrB;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AClaF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AT7BF;AUnBA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;EAKI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;EAEI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AC3DJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;EAKI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;AAAA;AAAA;AAAA;EAKI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;EAEI;EACA;EACA;;;AAGJ;AAAA;EAEI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;ACpEJ;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAEF;EAEE;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;;;AAGF;AAAA;EAEE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;EAEE;EACA;EACA;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AChIF;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;EAEI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;ACzCJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;EAEI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;ACzCJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;EAGI;EACA;EACA;EACA;EACA;;;AAIJ;AAAA;EAEI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;ACvCJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;EAKI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;AAAA;EAEI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AC9DJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;AACA;AACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;AACA;;;AClLF;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;EAEI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AC5CJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;EAKI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAIJ;EAEI;EACA;EACA;EACA;;;AAGJ;AAAA;EAEI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;ACpEJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;EAKI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;EAMI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;EAEI;EACA;EACA;;;AAGJ;AAAA;EAEI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;ACrEJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;AACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;ArB5GF","file":"symbaroum.css.map"} \ No newline at end of file diff --git a/lang/de.json b/lang/de.json index 1f703fbd..3ca461e0 100644 --- a/lang/de.json +++ b/lang/de.json @@ -254,6 +254,7 @@ "CORRUPTION.CHAT_MAX": " turns into an abomination (max reached).", "CORRUPTION.CHAT_WARNING": " is close to a corruption treshold.", + "DIALOG.SYSTEM_MESSAGE":"Symbaroum system message", "DIALOG.AUTOPARAMS": "einbezogene Modifikatoren: ", "DIALOG.BACKSTAB": "Hinterhältiger Angriff?", "DIALOG.BEASTLORE": "Extra Schaden durch Bestienwissen?", @@ -320,7 +321,8 @@ "HEALTH.CORRUPTION_THRESHOLD_MAX": "Kor. Schwelle", "HEALTH.CORRUPTION_MAX": "Abso.", - "INITIATIVE": "Initiative", + "INITIATIVE.TITLE": "Initiative", + "INITIATIVE.EXPLANATION": "Initiative shown as [initiative attribute.vigilant]", "ITEM.TRAIT": "Merkmale", "ITEM.ABILITY": "Fähigkeit", @@ -444,6 +446,11 @@ "POWER_CURSE.CHAT_FAILURE": " kann den Fluch nicht aufrecht erhalten.", "POWER_CURSE.CHAT_FAIL_FINAL": "Der Fluch hat keinen Effekt mehr auf ", + "POWER_DANCINGWEAPON.CHAT_ACTIVATE": " is using his dancing weapon.", + "POWER_DANCINGWEAPON.CHAT_DESACTIVATE": " isn't using dancing weapon anymore.", + "POWER_DANCINGWEAPON.CHAT_RESULT_ACTIVATE": "Combat stats are replaced by Resolute.", + "POWER_DANCINGWEAPON.CHAT_RESULT_DESACTIVATE": "Combat stats revert to normal.", + "POWER_ENTANGLINGVINES.CHAT_INTRO_M": " tries to break free from the vines.", "POWER_ENTANGLINGVINES.CHAT_SUCCESS": " is entangled in the vines.", "POWER_ENTANGLINGVINES.CHAT_FAILURE": " breaks free from the vines.", @@ -459,11 +466,20 @@ "POWER_INHERITWOUND.CHAT_FAILURE": " kann die Wunden nicht transferieren.", "POWER_INHERITWOUND.CHAT_HEALED": " erhält Zähigkeitsheilung für: ", "POWER_INHERITWOUND.CHAT_DAMAGE": " erhält Schaden: ", + "POWER_INHERITWOUND.CHAT_REDIRECT": "; poison and bleeding are also transfered.", "POWER_LARVAEBOILS.CHAT_INTRO": " beschwört Larven.", "POWER_LARVAEBOILS.CHAT_INTRO_M": " hält den Larvenfrass aufrecht.", "POWER_LARVAEBOILS.CHAT_SUCCESS": " wird von innen von den Larven gefressen.", "POWER_LARVAEBOILS.CHAT_FAILURE": " wiedersteht dem Larvenfrass.", + + "POWER_LAYONHANDS.DIALOG":"How close is your target?", + "POWER_LAYONHANDS.TOUCH":"Touch", + "POWER_LAYONHANDS.REMOTE":"Line of sight", + "POWER_LAYONHANDS.CHAT_INTRO":" awakes the lifeforce.", + "POWER_LAYONHANDS.CHAT_SUCCESS":" heals ", + "POWER_LAYONHANDS.CHAT_FINAL":"Toughness healed: ", + "POWER_LAYONHANDS.CHAT_FAILURE":" fails to heal ", "POWER_PRIOSBURNINGGLASS.CHAT_INTRO":" tries to channel the Light of Prios at a target.", "POWER_PRIOSBURNINGGLASS.CHAT_EXTRA":" might be stunned, test [resolute <-- resolute].", @@ -542,6 +558,7 @@ "TOOLTIP.EXPERIENCE_SPENT": "Deine für Fähigkeiten, Kräfte und Vorteile ausgegebenen Erfahrungspunkte", "TOOLTIP.EXPERIENCE_AVAILABLE": "Deine verfügbaren (nicht ausgegebenen) Erfahrungspunkte", + "TOOLTIP.HEALTH.CORRUPTION_NA_TEXT": "This is thoroughly corrupt", "TOOLTIP.HEALTH.CORRUPTION_CURRENT": "Deine aktuelle Korruption", "TOOLTIP.HEALTH.CORRUPTION_TEMPORARY": "Deine temporäre Korruption", "TOOLTIP.HEALTH.CORRUPTION_LONGTERM": "Deine Corruption die mehr als eine Szene anhält", @@ -556,13 +573,15 @@ "TOOLTIP.COMBAT.INITIATIVE": "Die Eigenschaft auf die deine Initiative basiert", "TOOLTIP.COMBAT.DEFENSE": "Die Eigenschaft auf die deine Verteidigung basiert", + "TOOLTIP.DELETE_ABILITY" : "Delete ability", "TOOLTIP.POWER_ACTIONS" : "Art der Aktivierung (A - Aktiv, P - Passiv, S - Speziell, etc)", "TRAIT.NAME": "Name", "TRAIT.ACTIVE": "Erworben", "TRAIT.ACTION": "Abtion", "TRAIT.DESCRIPTION": "Beschreibung", - + "TRAIT.MARKERTRAIT": "Trait has no levels", + "TRAIT_LABEL.ACIDICATTACK": "Säureangriff", "TRAIT_LABEL.ACIDICBLOOD": "Säureblut", "TRAIT_LABEL.ALTERNATIVEDAMAGE": "Alternativer Schaden", @@ -663,10 +682,38 @@ "SYMBAROUM.OPTIONAL_SAVEATTRIBUTEROLL_HINT": "Markieren um QoL Erweiterungen zu erlauben, damit für Proben alle Attribut Modifizierungen berücksichtigt werden", "SYMBAROUM.OPTIONAL_SHOWMODIFIERSINDIALOGUE": "Zeige Modifikatoren bei den Proben an", "SYMBAROUM.OPTIONAL_SHOWMODIFIERSINDIALOGUE_HINT": "Markieren um QoL Erweiterungen zu aktivieren die Modifikatoren vor dem Wurf anzuzeigen", + "SYMBAROUM.OPTIONAL_NPC_MODIFIERS": "Show NPC modifiers", + "SYMBAROUM.OPTIONAL_NPC_MODIFIERS_HINT": "Check to show NPC modifiers (-5 to +5) instead of attributes for NPCs on character sheet", "SYMBAROUM.OPTIONAL_INIATITIVEROLLS": "Supress Initiative rolls", "SYMBAROUM.OPTIONAL_INIATITIVEROLLS_HINT": "Check to QoL disabling of Initiative rolls in chat", "SYMBAROUM.OPTIONAL_SHOWREFERENCE": "Erlaube Beispiel modifizierungen", "SYMBAROUM.OPTIONAL_SHOWREFERENCE_HINT": "Warnung - NUR FÜR DEN SL- Erlaube die Manuelle einstellung für Referenz Fähigkeiten, Merkmalen und Mystischen Fähigkeiten. Benötigt einen Reload.", "SYMBAROUM.OPTIONAL_INIT_MANUAL": "Manually select initiative attribute", - "SYMBAROUM.OPTIONAL_INIT_MANUAL_HINT": "Check to desactive the automated evaluation of the attribute used for initiative." + "SYMBAROUM.OPTIONAL_INIT_MANUAL_HINT": "Check to desactive the automated evaluation of the attribute used for initiative.", + "SYMBAROUM.OPTIONAL_PC_COLOUR_SELECTOR":"Select PC Background Color", + "SYMBAROUM.OPTIONAL_NPC_COLOUR_SELECTOR":"Select NPC Background Color", + "SYMBAROUM.OPTIONAL_RESET_NOTE": "NOTE: Submit and Reset will cause FVTT to reload.", + "SYMBAROUM.OPTIONAL_SUBMIT_BUTTON":"Submit", + "SYMBAROUM.OPTIONAL_RESET_PC_BUTTON":"Reset PC Config", + "SYMBAROUM.OPTIONAL_RESET_NPC_BUTTON":"Reset NPC Config", + "SYMBAROUM.OPTIONAL_CONFIG_MENULABEL": "Configure Symbaroum Settings", + "SYMBAROUM.OPTIONAL_CONFIG_MENUHINT": "Configure PC and NPC sheet background color (These are Client based settings).", + "SYMBAROUM.OPTIONAL_ADD_MENUNAME": "Add Symbaroum Settings button", + "SYMBAROUM.OPTIONAL_ADD_MENUHINT": "Add Colour setting button to Main Config panel.", + "SYMBAROUM.OPTIONAL_PC_CHAR_BG_IMGS":"Character Background Images", + "SYMBAROUM.OPTIONAL_NPC_CHAR_BG_IMGS":"NPC Background Images", + "SYMBAROUM.OPTIONAL_DEFAULT_IMAGE":"Default Image", + "SYMBAROUM.OPTIONAL_NEW_IMAGE":"New Image", + "SYMBAROUM.OPTIONAL_NEW_LIGHTER":"New Lighter Image", + "SYMBAROUM.OPTIONAL_COLOR_PICKER":"Plain Color Picker", + "SYMBAROUM.OPTIONAL_TITLE_COLOUR_SELECTOR": "Select Title Background Color", + "SYMBAROUM.OPTIONAL_TITLE_BG_IMGS":"Title Background Images", + "SYMBAROUM.OPTIONAL_RESET_TITLE_BUTTON":"Reset Title Config", + "SYMBAROUM.OPTIONAL_RESET_EDITABLE_BUTTON" :"Reset Editable Field", + "SYMBAROUM.OPTIONAL_EDITABLE_COLOUR_SELECTOR": "Select Editable Field Color", + "SYMBAROUM.OPTIONAL_EDITABLE_BG_IMGS": "Editable Field Background Images", + "SYMBAROUM.OPTIONAL_NON_EDITABLE_COLOUR_SELECTOR": "Select Non-Editable Field Color", + "SYMBAROUM.OPTIONAL_NON_EDITABLE_BG_IMGS": "Non-Editable Field Background Images", + "SYMBAROUM.OPTIONAL_RESET_NON_EDITABLE_BUTTON" :"Reset Non-Editable Field", + "SYMBAROUM.OPTIONAL_RESET_ALL_BUTTON": "Reset all settings to defaults" } \ No newline at end of file diff --git a/lang/en.json b/lang/en.json index 082a991e..08378aba 100644 --- a/lang/en.json +++ b/lang/en.json @@ -152,6 +152,7 @@ "ARMOR.QUALITY": "Quality", "ARMOR.DESCRIPTION": "Description", "ARMOR.BONUS_ONLY": "Stackable protection", + "ARMOR.DEFENSE_ATTRIBUTE" : "Defend using", "ARMOR.ADDBUTTON": "Add Armor", "ARMOR.DELETEBUTTON": "Delete Armor", @@ -273,6 +274,7 @@ "CORRUPTION.CHAT_MAX": " turns into an abomination (max reached).", "CORRUPTION.CHAT_WARNING": " is close to a corruption treshold.", + "DIALOG.SYSTEM_MESSAGE":"Symbaroum system message", "DIALOG.AUTOPARAMS": "Included modifiers: ", "DIALOG.BACKSTAB": "Use Backstab?", "DIALOG.BEASTLORE": "Beast Lore dmg?", @@ -325,13 +327,15 @@ "GEAR.OTHER": "Other", "GEAR.STATE": "State", - "HEALTH.TOUGHNESS": "Toughness", + "HEALTH.TOUGHNESS": "TOUGHNESS", "HEALTH.TOUGHNESS_MAX": "Tgh. Max", "HEALTH.TOUGHNESS_CURRENT": "Current", "HEALTH.TOUGHNESS_TOTAL": "Total", "HEALTH.TOUGHNESS_THRESHOLD": "Threshold", - "HEALTH.TOUGHNESS_THRESHOLD_MAX": "Tgh. Threshold", - "HEALTH.CORRUPTION": "Corruption", + "HEALTH.TOUGHNESS_THRESHOLD_MAX": "Tgh. Threshold", + "HEALTH.TOUGHNESS_THRESHOLD_NA": "N/A", + "HEALTH.CORRUPTION": "CORRUPTION", + "HEALTH.CORRUPTION_NA": "N/A", "HEALTH.CORRUPTION_CURRENT": "Current", "HEALTH.CORRUPTION_TEMPORARY": "Temporary", "HEALTH.CORRUPTION_LONGTERM": "Daily", @@ -340,7 +344,8 @@ "HEALTH.CORRUPTION_THRESHOLD_MAX": "Cor. Threshold", "HEALTH.CORRUPTION_MAX": "Abom.", - "INITIATIVE": "Initiative", + "INITIATIVE.TITLE": "Initiative", + "INITIATIVE.EXPLANATION": "Initiative shown as [initiative attribute.vigilant]", "ITEM.TRAIT": "Trait", "ITEM.ABILITY": "Ability", @@ -469,6 +474,11 @@ "POWER_CURSE.CHAT_FAILURE": " can't maintain the curse.", "POWER_CURSE.CHAT_FAIL_FINAL": "The curse has no more effect on ", + "POWER_DANCINGWEAPON.CHAT_ACTIVATE": " is using his dancing weapon.", + "POWER_DANCINGWEAPON.CHAT_DESACTIVATE": " isn't using dancing weapon anymore.", + "POWER_DANCINGWEAPON.CHAT_RESULT_ACTIVATE": "Combat stats are replaced by Resolute.", + "POWER_DANCINGWEAPON.CHAT_RESULT_DESACTIVATE": "Combat stats revert to normal.", + "POWER_ENTANGLINGVINES.CHAT_INTRO_M": " tries to break free from the vines.", "POWER_ENTANGLINGVINES.CHAT_SUCCESS": " is entangled in the vines.", "POWER_ENTANGLINGVINES.CHAT_FAILURE": " breaks free from the vines.", @@ -484,6 +494,7 @@ "POWER_INHERITWOUND.CHAT_FAILURE": " can't transfer the wounds.", "POWER_INHERITWOUND.CHAT_HEALED": " receives toughness healing for: ", "POWER_INHERITWOUND.CHAT_DAMAGE": " recieved damage: ", + "POWER_INHERITWOUND.CHAT_REDIRECT": "; poison and bleeding are also transfered.", "POWER_LARVAEBOILS.CHAT_INTRO": " throws larvaes.", "POWER_LARVAEBOILS.CHAT_INTRO_M": " maintains the larvaes surge.", @@ -585,7 +596,8 @@ "TOOLTIP.EXPERIENCE_SPENT": "Total experience spent on abilities, traits, boons and burdens", "TOOLTIP.EXPERIENCE_AVAILABLE": "Your current available (unspent) experience points", - "TOOLTIP.HEALTH.CORRUPTION_CURRENT": "Your current total corruption", + "TOOLTIP.HEALTH.CORRUPTION_NA_TEXT": "This is thoroughly corrupt", + "TOOLTIP.HEALTH.CORRUPTION_CURRENT": "Your current total corruption", "TOOLTIP.HEALTH.CORRUPTION_TEMPORARY": "Your temporary (scene) corruption", "TOOLTIP.HEALTH.CORRUPTION_LONGTERM": "Your corruption that lasts longer than a scene", "TOOLTIP.HEALTH.CORRUPTION_PERMANENT": "Permanent corruption gained", @@ -599,12 +611,14 @@ "TOOLTIP.COMBAT.INITIATIVE": "The attribute that your initiative is based on", "TOOLTIP.COMBAT.DEFENSE": "The attribute that your defense is based on", + "TOOLTIP.DELETE_ABILITY" : "Delete ability", "TOOLTIP.POWER_ACTIONS" : "Type of activation (A - active, P - passive, S - special, etc)", "TRAIT.NAME": "Name", "TRAIT.ACTIVE": "Acquired", "TRAIT.ACTION": "Action", "TRAIT.DESCRIPTION": "Description", + "TRAIT.MARKERTRAIT": "Trait has no levels", "TRAIT_LABEL.ACIDICATTACK": "Acidic Attack", "TRAIT_LABEL.ACIDICBLOOD": "Acidic Blood", @@ -686,6 +700,7 @@ "WEAPON.ATTRIBUTE": "Attribute", "WEAPON.ATTRIBUTEABBR": "Attr.", "WEAPON.DESCRIPTION": "Description", + "WEAPON.ATTACK_ATTRIBUTE":"Attack using", "WEAPON.ADDBUTTON": "Add Weapon", "WEAPON.DELETEBUTTON": "Delete Weapon", @@ -700,7 +715,7 @@ "WEAPON_CLASS.THROWN": "Thrown", "SYMBAROUM.OPTIONAL_CRIT": "Optional Critical Rolls", - "SYMBAROUM.OPTIONAL_CRIT_HINT": "Check to enable Hit bonus and Defence fumbles on dice rolls of 1 and 20 as detailed Core Book p. 179", + "SYMBAROUM.OPTIONAL_CRIT_HINT": "Check to enable Hit bonus and Defense fumbles on dice rolls of 1 and 20 as detailed Core Book p. 179", "SYMBAROUM.OPTIONAL_ALWAYSSUCCEDONONE": "Always able to succeed of fail", "SYMBAROUM.OPTIONAL_ALWAYSSUCCEDONONE_HINT": "Check to always succeed on a 1 and fail on a 20", "SYMBAROUM.OPTIONAL_RARECRIT": "Optional Rare Critical Rolls", @@ -717,10 +732,38 @@ "SYMBAROUM.OPTIONAL_SAVEATTRIBUTEROLL_HINT": "Check to enable QoL enhancement for keeping all modifiers when rolling attribute tests", "SYMBAROUM.OPTIONAL_SHOWMODIFIERSINDIALOGUE": "Show modifers in targetted attribute rolls", "SYMBAROUM.OPTIONAL_SHOWMODIFIERSINDIALOGUE_HINT": "Check to enable QoL enhancement for showing attribute modifiers before making the roll", + "SYMBAROUM.OPTIONAL_NPC_MODIFIERS": "Show NPC modifiers", + "SYMBAROUM.OPTIONAL_NPC_MODIFIERS_HINT": "Check to show NPC modifiers (-5 to +5) instead of attributes for NPCs on character sheet", "SYMBAROUM.OPTIONAL_INIATITIVEROLLS": "Supress Initiative rolls", "SYMBAROUM.OPTIONAL_INIATITIVEROLLS_HINT": "Check to QoL disabling of Initiative rolls in chat", "SYMBAROUM.OPTIONAL_SHOWREFERENCE": "Allow reference modification", "SYMBAROUM.OPTIONAL_SHOWREFERENCE_HINT": "Warning - GM Only - allow to manually adjust reference implementation for abilities, traits and mystical powers. Requires refresh.", "SYMBAROUM.OPTIONAL_INIT_MANUAL": "Manually select initiative attribute", - "SYMBAROUM.OPTIONAL_INIT_MANUAL_HINT": "Check to desactive the automated evaluation of the attribute used for initiative." + "SYMBAROUM.OPTIONAL_INIT_MANUAL_HINT": "Check to de-active the automated evaluation of the attribute used for initiative.", + "SYMBAROUM.OPTIONAL_PC_COLOUR_SELECTOR":"Select PC Background Color", + "SYMBAROUM.OPTIONAL_NPC_COLOUR_SELECTOR":"Select NPC Background Color", + "SYMBAROUM.OPTIONAL_RESET_NOTE": "NOTE: Submit and Reset will cause FVTT to reload.", + "SYMBAROUM.OPTIONAL_SUBMIT_BUTTON":"Submit", + "SYMBAROUM.OPTIONAL_RESET_PC_BUTTON":"Reset PC Config", + "SYMBAROUM.OPTIONAL_RESET_NPC_BUTTON":"Reset NPC Config", + "SYMBAROUM.OPTIONAL_CONFIG_MENULABEL": "Configure Symbaroum Settings", + "SYMBAROUM.OPTIONAL_CONFIG_MENUHINT": "Configure PC and NPC sheet background color (These are Client based settings).", + "SYMBAROUM.OPTIONAL_ADD_MENUNAME": "Add Symbaroum Settings button", + "SYMBAROUM.OPTIONAL_ADD_MENUHINT": "Add Colour setting button to Main Config panel.", + "SYMBAROUM.OPTIONAL_PC_CHAR_BG_IMGS":"Character Background Images", + "SYMBAROUM.OPTIONAL_NPC_CHAR_BG_IMGS":"NPC Background Images", + "SYMBAROUM.OPTIONAL_DEFAULT_IMAGE":"Default Image", + "SYMBAROUM.OPTIONAL_NEW_IMAGE":"New Image", + "SYMBAROUM.OPTIONAL_NEW_LIGHTER":"New Lighter Image", + "SYMBAROUM.OPTIONAL_COLOR_PICKER":"Plain Color Picker", + "SYMBAROUM.OPTIONAL_TITLE_COLOUR_SELECTOR": "Select Title Background Color", + "SYMBAROUM.OPTIONAL_TITLE_BG_IMGS":"Title Background Images", + "SYMBAROUM.OPTIONAL_RESET_TITLE_BUTTON":"Reset Title Config", + "SYMBAROUM.OPTIONAL_RESET_EDITABLE_BUTTON" :"Reset Editable Field", + "SYMBAROUM.OPTIONAL_EDITABLE_COLOUR_SELECTOR": "Select Editable Field Color", + "SYMBAROUM.OPTIONAL_EDITABLE_BG_IMGS": "Editable Field Background Images", + "SYMBAROUM.OPTIONAL_NON_EDITABLE_COLOUR_SELECTOR": "Select Non-Editable Field Color", + "SYMBAROUM.OPTIONAL_NON_EDITABLE_BG_IMGS": "Non-Editable Field Background Images", + "SYMBAROUM.OPTIONAL_RESET_NON_EDITABLE_BUTTON" :"Reset Non-Editable Field", + "SYMBAROUM.OPTIONAL_RESET_ALL_BUTTON": "Reset all settings to defaults" } diff --git a/lang/es.json b/lang/es.json index 4ba2413c..45d4d75f 100644 --- a/lang/es.json +++ b/lang/es.json @@ -277,8 +277,10 @@ "CORRUPTION.CHAT_MAX": " turns into an abomination (max reached).", "CORRUPTION.CHAT_WARNING": " is close to a corruption treshold.", + "DIALOG.SYSTEM_MESSAGE":"Symbaroum system message", "DIALOG.AUTOPARAMS": "Modificadores incluidos: ", "DIALOG.BACKSTAB": "¿Usar Ataque Traicionero?", + "DIALOG.BEASTLORE": "+BeastLore dmg?", "DIALOG.HUNTERS_INSTINCT": "¿Objetivo del Instinto de Cazador?", "DIALOG.ISMAINTAINED": "¿Nuevo casteo o lo mantienes?", "DIALOG.USE_POISON": "¿Se aplicó el veneno?", @@ -319,6 +321,8 @@ "EQUIPMENT.ADDBUTTON": "Add Equipment", "EQUIPMENT.DELETEBUTTON": "Delete Equipment", + "ERROR.NO_TOKEN_SELECTED": "Select the acting token.", + "EXPERIENCE": "Experiencia", "GEAR.ACTIVE": "Activo", @@ -341,7 +345,8 @@ "HEALTH.CORRUPTION_THRESHOLD_MAX": "Umbral Corrup.", "HEALTH.CORRUPTION_MAX": "Umbral Abom.", - "INITIATIVE": "Iniciativa", + "INITIATIVE.TITLE": "Iniciativa", + "INITIATIVE.EXPLANATION": "Initiative shown as [initiative attribute.vigilant]", "ITEM.TRAIT": "Rasgo", "ITEM.ABILITY": "Habilidad", @@ -470,6 +475,11 @@ "POWER_CURSE.CHAT_FAILURE": " no puede mantener la maldición.", "POWER_CURSE.CHAT_FAIL_FINAL": "La maldición ya no tiene efecto en ", + "POWER_DANCINGWEAPON.CHAT_ACTIVATE": " is using his dancing weapon.", + "POWER_DANCINGWEAPON.CHAT_DESACTIVATE": " isn't using dancing weapon anymore.", + "POWER_DANCINGWEAPON.CHAT_RESULT_ACTIVATE": "Combat stats are replaced by Resolute.", + "POWER_DANCINGWEAPON.CHAT_RESULT_DESACTIVATE": "Combat stats revert to normal.", + "POWER_ENTANGLINGVINES.CHAT_INTRO_M": " tries to break free from the vines.", "POWER_ENTANGLINGVINES.CHAT_SUCCESS": " is entangled in the vines.", "POWER_ENTANGLINGVINES.CHAT_FAILURE": " breaks free from the vines.", @@ -485,11 +495,20 @@ "POWER_INHERITWOUND.CHAT_FAILURE": " no puede transferir las heridas.", "POWER_INHERITWOUND.CHAT_HEALED": " recibe una curación de su resistencia de: ", "POWER_INHERITWOUND.CHAT_DAMAGE": " daños recibidos: ", + "POWER_INHERITWOUND.CHAT_REDIRECT": "; poison and bleeding are also transfered.", "POWER_LARVAEBOILS.CHAT_INTRO": " lanza larvas.", "POWER_LARVAEBOILS.CHAT_INTRO_M": " mantiene la Erupción de Larvas.", "POWER_LARVAEBOILS.CHAT_SUCCESS": " es comido desde el interior por las larvas.", "POWER_LARVAEBOILS.CHAT_FAILURE": " resiste a las larvas.", + + "POWER_LAYONHANDS.DIALOG":"How close is your target?", + "POWER_LAYONHANDS.TOUCH":"Touch", + "POWER_LAYONHANDS.REMOTE":"Line of sight", + "POWER_LAYONHANDS.CHAT_INTRO":" awakes the lifeforce.", + "POWER_LAYONHANDS.CHAT_SUCCESS":" heals ", + "POWER_LAYONHANDS.CHAT_FINAL":"Toughness healed: ", + "POWER_LAYONHANDS.CHAT_FAILURE":" fails to heal ", "POWER_PRIOSBURNINGGLASS.CHAT_INTRO":" tries to channel the Light of Prios at a target.", "POWER_PRIOSBURNINGGLASS.CHAT_EXTRA":" might be stunned, test [resolute <-- resolute].", @@ -578,6 +597,7 @@ "TOOLTIP.EXPERIENCE_SPENT": "Experiencia total gastada en habilidades, rasgos, dones y cargas.", "TOOLTIP.EXPERIENCE_AVAILABLE": "Tus puntos de experiencia (no gastados) disponibles actualmente", + "TOOLTIP.HEALTH.CORRUPTION_NA_TEXT": "This is thoroughly corrupt", "TOOLTIP.HEALTH.CORRUPTION_CURRENT": "Tu corrupción total actual", "TOOLTIP.HEALTH.CORRUPTION_TEMPORARY": "Tu corrupción temporal (escena)", "TOOLTIP.HEALTH.CORRUPTION_LONGTERM": "Tu corrupción que dura más que una escena", @@ -592,12 +612,14 @@ "TOOLTIP.COMBAT.INITIATIVE": "El atributo en el que se basa su iniciativa", "TOOLTIP.COMBAT.DEFENSE": "El atributo en el que se basa su defensa", + "TOOLTIP.DELETE_ABILITY" : "Delete ability", "TOOLTIP.POWER_ACTIONS" : "Tipo de activación (A - activa, P - pasiva, S - especial, etc)", "TRAIT.NAME": "Nombre", "TRAIT.ACTIVE": "Activo", "TRAIT.ACTION": "Acción", "TRAIT.DESCRIPTION": "Descr.", + "TRAIT.MARKERTRAIT": "Trait has no levels", "TRAIT_LABEL.ACIDICATTACK": "Ataque Ácido", "TRAIT_LABEL.ACIDICBLOOD": "Sangre Ácida", @@ -710,12 +732,38 @@ "SYMBAROUM.OPTIONAL_SAVEATTRIBUTEROLL_HINT": "Marcar para permitir mejoras de QoL para mantener todos los modificadores cuando se hagan pruebas de atributos", "SYMBAROUM.OPTIONAL_SHOWMODIFIERSINDIALOGUE": "Mostrar modificadores en tiradas de atributo con objetivo", "SYMBAROUM.OPTIONAL_SHOWMODIFIERSINDIALOGUE_HINT": "Marcar para permitir mejoras de QoL para mostrar los mod de los atributos antes de la tirada", + "SYMBAROUM.OPTIONAL_NPC_MODIFIERS": "Show NPC modifiers", + "SYMBAROUM.OPTIONAL_NPC_MODIFIERS_HINT": "Check to show NPC modifiers (-5 to +5) instead of attributes for NPCs on character sheet", "SYMBAROUM.OPTIONAL_INIATITIVEROLLS": "Supress Initiative rolls", "SYMBAROUM.OPTIONAL_INIATITIVEROLLS_HINT": "Check to QoL disabling of Initiative rolls in chat", "SYMBAROUM.OPTIONAL_SHOWREFERENCE": "Permitir modificaciones de referencias", "SYMBAROUM.OPTIONAL_SHOWREFERENCE_HINT": "Atención - Solo GM - permite ajustar manualmente las referencias en la implementación de habilidades, rasgos y poderes místicos. Requiere reiniciar.", "SYMBAROUM.OPTIONAL_INIT_MANUAL": "Manually select initiative attribute", - "SYMBAROUM.OPTIONAL_INIT_MANUAL_HINT": "Check to desactive the automated evaluation of the attribute used for initiative." - - + "SYMBAROUM.OPTIONAL_INIT_MANUAL_HINT": "Check to desactive the automated evaluation of the attribute used for initiative.", + "SYMBAROUM.OPTIONAL_PC_COLOUR_SELECTOR":"Select PC Background Color", + "SYMBAROUM.OPTIONAL_NPC_COLOUR_SELECTOR":"Select NPC Background Color", + "SYMBAROUM.OPTIONAL_RESET_NOTE": "NOTE: Submit and Reset will cause FVTT to reload.", + "SYMBAROUM.OPTIONAL_SUBMIT_BUTTON":"Submit", + "SYMBAROUM.OPTIONAL_RESET_PC_BUTTON":"Reset PC Config", + "SYMBAROUM.OPTIONAL_RESET_NPC_BUTTON":"Reset NPC Config", + "SYMBAROUM.OPTIONAL_CONFIG_MENULABEL": "Configure Symbaroum Settings", + "SYMBAROUM.OPTIONAL_CONFIG_MENUHINT": "Configure PC and NPC sheet background color (These are Client based settings).", + "SYMBAROUM.OPTIONAL_ADD_MENUNAME": "Add Symbaroum Settings button", + "SYMBAROUM.OPTIONAL_ADD_MENUHINT": "Add Colour setting button to Main Config panel.", + "SYMBAROUM.OPTIONAL_PC_CHAR_BG_IMGS":"Character Background Images", + "SYMBAROUM.OPTIONAL_NPC_CHAR_BG_IMGS":"NPC Background Images", + "SYMBAROUM.OPTIONAL_DEFAULT_IMAGE":"Default Image", + "SYMBAROUM.OPTIONAL_NEW_IMAGE":"New Image", + "SYMBAROUM.OPTIONAL_NEW_LIGHTER":"New Lighter Image", + "SYMBAROUM.OPTIONAL_COLOR_PICKER":"Plain Color Picker", + "SYMBAROUM.OPTIONAL_TITLE_COLOUR_SELECTOR": "Select Title Background Color", + "SYMBAROUM.OPTIONAL_TITLE_BG_IMGS":"Title Background Images", + "SYMBAROUM.OPTIONAL_RESET_TITLE_BUTTON":"Reset Title Config", + "SYMBAROUM.OPTIONAL_RESET_EDITABLE_BUTTON" :"Reset Editable Field", + "SYMBAROUM.OPTIONAL_EDITABLE_COLOUR_SELECTOR": "Select Editable Field Color", + "SYMBAROUM.OPTIONAL_EDITABLE_BG_IMGS": "Editable Field Background Images", + "SYMBAROUM.OPTIONAL_NON_EDITABLE_COLOUR_SELECTOR": "Select Non-Editable Field Color", + "SYMBAROUM.OPTIONAL_NON_EDITABLE_BG_IMGS": "Non-Editable Field Background Images", + "SYMBAROUM.OPTIONAL_RESET_NON_EDITABLE_BUTTON" :"Reset Non-Editable Field", + "SYMBAROUM.OPTIONAL_RESET_ALL_BUTTON": "Reset all settings to defaults" } \ No newline at end of file diff --git a/lang/fr.json b/lang/fr.json index a58e2128..e8b63cdb 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -107,7 +107,7 @@ "ABILITY_MEDICUS.CHAT_TARGET": "Bénéficiaire : ", "ABILITY_MEDICUS.NO_TARGET": "Pas de cible selectionnée, test de médicus sans soins", "DIALOG.MEDICUS_EXAM": "Test de médicus sans soins", - "DIALOG.CUSTOM_HEALING_MODIFIER": "Jet de soins personnalisée", + "DIALOG.CUSTOM_HEALING_MODIFIER": "Jet de soins personnalisé", "ABILITY_STRANGLER.CHAT_INTRO": " tente une prise de strangulation.", "ABILITY_STRANGLER.CHAT_INTRO_M": " essaye de maintenir sa prise.", @@ -133,8 +133,8 @@ "ACTION.MOVEMENT": "Mouvement", "ACTION.FULL_TURN": "Tour Entier", - "ACTOR.TypePlayer": "Player character", - "ACTOR.TypeMonster": "Non-player/monster character", + "ACTOR.TypePlayer": "Personnage Joueur", + "ACTOR.TypeMonster": "Personnage Non-Joueur", "ARMOR.NAME": "Nom", "ARMOR.PROTECTION": "Protection", @@ -151,19 +151,19 @@ "ARMOR.QUALITY": "Qualité", "ARMOR.DESCRIPTION": "Description", "ARMOR.BONUS_ONLY": "Protection additionnelle", - "ARMOR.ADDBUTTON": "Add Armor", - "ARMOR.DELETEBUTTON": "Delete Armor", + "ARMOR.ADDBUTTON": "Ajouter une armure", + "ARMOR.DELETEBUTTON": "Supprimer l'armure", "ARTIFACT.NAME": "Nom", "ARTIFACT.ACTION": "Action", "ARTIFACT.CORRUPTION": "Corruption", "ARTIFACT.CORRUPTIONABBR": "Corr.", "ARTIFACT.DESCRIPTION": "Description", - "ARTIFACT.TITLE":"ARTIFACT POWERS", - "ARTIFACT.ADDBUTTON": "Add Artifact", - "ARTIFACT.DELETEBUTTON": "Delete Artifact", - "ARTIFACT.POWER_ADDBUTTON": "Add artifact power", - "ARTIFACT.POWER_DELETEBUTTON": "Delete artifact power", + "ARTIFACT.TITLE":"POUVOIRS D'ARTEFACT", + "ARTIFACT.ADDBUTTON": "Ajouter un Artefact", + "ARTIFACT.DELETEBUTTON": "Supprimer l'Artefact", + "ARTIFACT.POWER_ADDBUTTON": "Ajouter un pouvoir", + "ARTIFACT.POWER_DELETEBUTTON": "Supprimer ce pouvoir", "ATTRIBUTE.ACCURATE": "Précision", "ATTRIBUTE.CUNNING": "Astuce", @@ -272,6 +272,7 @@ "CORRUPTION.CHAT_MAX": " devient une abomination (max atteint).", "CORRUPTION.CHAT_WARNING": " approche du seuil de soullure.", + "DIALOG.SYSTEM_MESSAGE":"Message du système Symbaroum", "DIALOG.VERSUS": "Versus", "DIALOG.ASK_CORRUPTION": "Cible totalement corrompue?", "DIALOG.ATTRIBUTE": "Attribut", @@ -282,7 +283,7 @@ "DIALOG.FAVOUR_FAVOUR": "Faveur", "DIALOG.FAVOUR_DISFAVOUR": "Défaveur", "DIALOG.DAMAGE_MODIFIER": "Autre mod. dégâts", - "DIALOG.WEAPON_DAMAGE": "Dam. roll", + "DIALOG.WEAPON_DAMAGE": "Jet de dégâts", "DIALOG.CASTING": "Lancement du talent", "DIALOG.MAINTAINING": "Jet pour maintenir le talent", "DIALOG.AUTOPARAMS": "Modificateurs déjà comptés: ", @@ -310,8 +311,8 @@ "EQUIPMENT.NUMBER": "Nombre", "EQUIPMENT.DESCRIPTION": "Description", "EQUIPMENT.QUANTITY_SHORT":"Qté", - "EQUIPMENT.ADDBUTTON": "Add Equipment", - "EQUIPMENT.DELETEBUTTON": "Delete Equipment", + "EQUIPMENT.ADDBUTTON": "Ajouter un équipment", + "EQUIPMENT.DELETEBUTTON": "Supprimer l'équipment", "ERROR.NO_TOKEN_SELECTED": "Selectionnez le token concerné, et uniquement ce token.", @@ -337,7 +338,8 @@ "HEALTH.CORRUPTION_THRESHOLD_MAX": "Seuil de Cor.", "HEALTH.CORRUPTION_MAX": "Maximale", - "INITIATIVE": "Initiative", + "INITIATIVE.TITLE": "Initiative", + "INITIATIVE.EXPLANATION": "Initiative indiquée comme [Attribut utilisé.vigilance]", "ITEM.TRAIT": "Trait", "ITEM.ABILITY": "Talent", @@ -347,8 +349,8 @@ "ITEM.MYSTICAL_POWER": "Pouvoir Mystique", "ITEM.RITUAL": "Rituel", "ITEM.WEAPON": "Arme", - "ITEM.BOON" : "Boon", - "ITEM.BURDEN": "Burden", + "ITEM.BOON" : "Atout", + "ITEM.BURDEN": "Fardeau", "ITEM.TypeTrait": "Trait", "ITEM.TypeAbility": "Talent", @@ -358,8 +360,8 @@ "ITEM.TypeMysticalpower": "Pouvoir Mystique", "ITEM.TypeRitual": "Rituel", "ITEM.TypeWeapon": "Arme", - "ITEM.TypeBoon": "Boon", - "ITEM.TypeBurden": "Burden", + "ITEM.TypeBoon": "Atout", + "ITEM.TypeBurden": "Fardeau", "MONEY.THALER": "Thaler", "MONEY.SHILLING": "Shilling", @@ -466,6 +468,11 @@ "POWER_CURSE.CHAT_FAILURE": " ne parvient pas à maintenir la malédiction.", "POWER_CURSE.CHAT_FAIL_FINAL": "La malédiction n'a plus d'effet sur ", + "POWER_DANCINGWEAPON.CHAT_ACTIVATE": " utilise son arme dansante.", + "POWER_DANCINGWEAPON.CHAT_DESACTIVATE": " n'utilise plus son arme dansante.", + "POWER_DANCINGWEAPON.CHAT_RESULT_ACTIVATE": "Les attributs de combat sont remplacés par Volonté.", + "POWER_DANCINGWEAPON.CHAT_RESULT_DESACTIVATE": "Les attributs de combat redeviennent normaux.", + "POWER_ENTANGLINGVINES.CHAT_INTRO_M": " essaye de briser l'étreinte des plantes.", "POWER_ENTANGLINGVINES.CHAT_SUCCESS": " est enchevêtré dans la végétation.", "POWER_ENTANGLINGVINES.CHAT_FAILURE": " se libère de l'enchevêtrement de plantes.", @@ -481,6 +488,7 @@ "POWER_INHERITWOUND.CHAT_FAILURE": " ne parvient pas à transférer les blessures.", "POWER_INHERITWOUND.CHAT_HEALED": " voit son endurance soignée de: ", "POWER_INHERITWOUND.CHAT_DAMAGE": " reçoit des dégâts: ", + "POWER_INHERITWOUND.CHAT_REDIRECT": "; Les poisons et saignements sont également redirigés.", "POWER_LARVAEBOILS.CHAT_INTRO": " lance des larves grouillantes sur sa victime.", "POWER_LARVAEBOILS.CHAT_INTRO_M": " tente de maintenir les larves grouillantes.", @@ -539,8 +547,8 @@ "RITUAL.TRADITION": "Tradition", "RITUAL.DESCRIPTION": "Description", - "ROLL.CRITSHORT":"crit", - "ROLL.ADVANTAGESHORT":"adv", + "ROLL.CRITSHORT":"Crit", + "ROLL.ADVANTAGESHORT":"Av", "TAB.MAIN": "PRINCIPAL", "TAB.GEAR": "ÉQUIPEMENTS", @@ -579,6 +587,7 @@ "TOOLTIP.EXPERIENCE_SPENT": "Points d'expérience dépensés sur les talents, traits, atouts et fardeaux", "TOOLTIP.EXPERIENCE_AVAILABLE": "Vos points d'expérience disponibles (non dépensés)", + "TOOLTIP.HEALTH.CORRUPTION_NA_TEXT": "Complètement corrompue.", "TOOLTIP.HEALTH.CORRUPTION_CURRENT": "Votre total de corruption actuel", "TOOLTIP.HEALTH.CORRUPTION_TEMPORARY": "Votre corruption temporaire (pour cette scène)", "TOOLTIP.HEALTH.CORRUPTION_LONGTERM": "Votre corruption long-terme (au-delà de la scène)", @@ -593,12 +602,14 @@ "TOOLTIP.COMBAT.INITIATIVE": "L'attribut principal utilisé pour calculer votre initiative", "TOOLTIP.COMBAT.DEFENSE": "L'attribut utilisé pour calculer votre défense", + "TOOLTIP.DELETE_ABILITY" : "Supprimer ce talent", "TOOLTIP.POWER_ACTIONS" : "Type d'action (A - active, P - passive, S - spéciale, etc)", "TRAIT.NAME": "Nom", "TRAIT.ACTIVE": "Acquis", "TRAIT.ACTION": "Action", "TRAIT.DESCRIPTION": "Description", + "TRAIT.MARKERTRAIT": "Trait sans niveau", "TRAIT_LABEL.ACIDICATTACK": "Attaque acide", "TRAIT_LABEL.ACIDICBLOOD": "Sang Acide", @@ -680,8 +691,9 @@ "WEAPON.ATTRIBUTE": "Attribut", "WEAPON.ATTRIBUTEABBR": "Attr.", "WEAPON.DESCRIPTION": "Description", - "WEAPON.ADDBUTTON": "Add Weapon", - "WEAPON.DELETEBUTTON": "Delete Weapon", + "WEAPON.ATTACK_ATTRIBUTE":"Attaque avec", + "WEAPON.ADDBUTTON": "Ajouter une arme", + "WEAPON.DELETEBUTTON": "Supprimer cette arme", "WEAPON_CLASS.LABEL": "Type d'arme", "WEAPON_CLASS.1HANDED": "Arme à une main", @@ -711,12 +723,40 @@ "SYMBAROUM.OPTIONAL_SAVEATTRIBUTEROLL_HINT": "Garder en mémoire les modificateurs d'un jet d'attribut sur l'autre.", "SYMBAROUM.OPTIONAL_SHOWMODIFIERSINDIALOGUE": "Affichage préventif du modificateur", "SYMBAROUM.OPTIONAL_SHOWMODIFIERSINDIALOGUE_HINT": "Affiche le modificateur de l'attribut de l'adversaire dans le menu déroulant de jet resisté d'attribut.", - "SYMBAROUM.OPTIONAL_INIATITIVEROLLS": "Supress Initiative rolls", - "SYMBAROUM.OPTIONAL_INIATITIVEROLLS_HINT": "Check to QoL disabling of Initiative rolls in chat", + "SYMBAROUM.OPTIONAL_NPC_MODIFIERS": "Attributs PNJs simplifiés", + "SYMBAROUM.OPTIONAL_NPC_MODIFIERS_HINT": "Cochez pour que les attributes des PNJs s'affichent sous forme de modificateurs (-5 à +5) sur leurs feuilles de personnage, plutôt qu'en format classique (5 à 15)", + "SYMBAROUM.OPTIONAL_INIATITIVEROLLS": "Cacher les jets d'initiative", + "SYMBAROUM.OPTIONAL_INIATITIVEROLLS_HINT": "Cocher pour que les résultats des jets d'initiatives n'apparaissent pas dans le Chat.", "SYMBAROUM.OPTIONAL_SHOWREFERENCE": "Modification des références", "SYMBAROUM.OPTIONAL_SHOWREFERENCE_HINT": "Attention - MJ seulement - Permet de modifier les références des objets traits, talents et pouvoirs. A n'utiliser que si vous savez ce que vous faites.", - "SYMBAROUM.OPTIONAL_INIT_MANUAL": "Choisir manuellement l'attribut pour l'initiative", - "SYMBAROUM.OPTIONAL_INIT_MANUAL_HINT": "Désactive l'évaluation automatique de l'attribut à utiliser pour l'initiative des personnages. A cocher si vous utilisez vos propres talents." + "SYMBAROUM.OPTIONAL_INIT_MANUAL": "Attribut d'initiative manuel", + "SYMBAROUM.OPTIONAL_INIT_MANUAL_HINT": "Désactive l'évaluation automatique de l'attribut à utiliser pour l'initiative des personnages. A cocher si vous utilisez vos propres talents.", + "SYMBAROUM.OPTIONAL_PC_COLOUR_SELECTOR":"Choisir la couleur de fond PJ", + "SYMBAROUM.OPTIONAL_NPC_COLOUR_SELECTOR":"Choisir la couleur de fond PNJ", + "SYMBAROUM.OPTIONAL_RESET_NOTE": "NOTE: Appliquer et réinitialiser provoquera le rechargement de Foundry.", + "SYMBAROUM.OPTIONAL_SUBMIT_BUTTON":"Appliquer", + "SYMBAROUM.OPTIONAL_RESET_PC_BUTTON":"Réinitialiser Config PJ", + "SYMBAROUM.OPTIONAL_RESET_NPC_BUTTON":"Réinitialiser Config PNJ", + "SYMBAROUM.OPTIONAL_CONFIG_MENULABEL": "Aspect du système", + "SYMBAROUM.OPTIONAL_CONFIG_MENUHINT": "Configuration des couleurs de fond des feuilles de PJ et PNJ (configuration locale).", + "SYMBAROUM.OPTIONAL_ADD_MENUNAME": "Bouton Aspect du système", + "SYMBAROUM.OPTIONAL_ADD_MENUHINT": "Ajoutage un bouton pour le paramètrage de l'aspect du système au panneau de configuration générale.", + "SYMBAROUM.OPTIONAL_PC_CHAR_BG_IMGS":"Texture de fond des feuilles de PJ", + "SYMBAROUM.OPTIONAL_NPC_CHAR_BG_IMGS":"Texture de fond des feuilles de PNJ", + "SYMBAROUM.OPTIONAL_DEFAULT_IMAGE":"Texture par défaut", + "SYMBAROUM.OPTIONAL_NEW_IMAGE":"Nouvelle texture", + "SYMBAROUM.OPTIONAL_NEW_LIGHTER":"Nouvelle texture plus lumineuse", + "SYMBAROUM.OPTIONAL_COLOR_PICKER":"Choisir la couleur", + "SYMBAROUM.OPTIONAL_TITLE_COLOUR_SELECTOR": "Choisir la couleur de fond des titres", + "SYMBAROUM.OPTIONAL_TITLE_BG_IMGS":"Texture de fond des titres", + "SYMBAROUM.OPTIONAL_RESET_TITLE_BUTTON":"Réinitialiser la couleur de fond des titres", + "SYMBAROUM.OPTIONAL_RESET_EDITABLE_BUTTON" :"Réinitialiser la couleur de fond des champs modifiables", + "SYMBAROUM.OPTIONAL_EDITABLE_COLOUR_SELECTOR": "Choisir la couleur de fond des champs modifiables", + "SYMBAROUM.OPTIONAL_EDITABLE_BG_IMGS": "Texture de fond des champs modifiables", + "SYMBAROUM.OPTIONAL_NON_EDITABLE_COLOUR_SELECTOR": "Choisir la couleur de fond des champs fixes", + "SYMBAROUM.OPTIONAL_NON_EDITABLE_BG_IMGS": "Texture de fond des champs fixes", + "SYMBAROUM.OPTIONAL_RESET_NON_EDITABLE_BUTTON" :"Réinitialiser la couleur de fond des champs fixes", + "SYMBAROUM.OPTIONAL_RESET_ALL_BUTTON": "Reinitialiser les paramètres" } diff --git a/lang/sv.json b/lang/sv.json index 08afea1b..a3fcace2 100644 --- a/lang/sv.json +++ b/lang/sv.json @@ -163,8 +163,8 @@ "ARTIFACT.TITLE":"ARTEFAKTKRAFTER", "ARTIFACT.ADDBUTTON": "Lägg till Artefakt", "ARTIFACT.DELETEBUTTON": "Ta bort Artefakt", - "ARTIFACT.POWER_ADDBUTTON": "Lägg till artefakt kraft", - "ARTIFACT.POWER_DELETEBUTTON": "Ta bort artefakt kraft", + "ARTIFACT.POWER_ADDBUTTON": "Lägg till artefaktkraft", + "ARTIFACT.POWER_DELETEBUTTON": "Ta bort artefaktkraft", "ATTRIBUTE.DISCREET": "Diskret", @@ -244,7 +244,7 @@ "COMBAT.CHAT_SUCCESS": " träffar ", "COMBAT.CHAT_FAILURE": " missar.", "COMBAT.CHAT_BLEED": " blöder och förlorar tålighet varje runda: ", - "COMBAT.CHAT_CORRUPTED_ATTACK": "The attack inflict corruption: ", + "COMBAT.CHAT_CORRUPTED_ATTACK": "Attacken vållar korruption: ", "COMBAT.CHAT_POISON": " försöker förgifta ", "COMBAT.CHAT_POISON_FAILURE": "Inte förgiftad.", "COMBAT.CHAT_POISON_EXTEND": "Målet var redan förgiftat, ny varaktighet: rundor: ", @@ -269,11 +269,12 @@ "COMBAT.CHAT_DAMAGE_PAIN": " är bedövad av smärta.", "COMBAT.PARAMS_PRECISE": "[Precist vapen], ", - "CORRUPTION.CHAT_INTRO": " increases his degree of taint.", - "CORRUPTION.CHAT_THRESHOLD": " becomes Blight-marked (theshold reached).", - "CORRUPTION.CHAT_MAX": " turns into an abomination (max reached).", - "CORRUPTION.CHAT_WARNING": " is close to a corruption treshold.", + "CORRUPTION.CHAT_INTRO": " ökar sin korruptionsgrad.", + "CORRUPTION.CHAT_THRESHOLD": " blir styggelsemärkt (når korruptionströskel).", + "CORRUPTION.CHAT_MAX": " förvandlas till en styggelse (max korruption uppnådd).", + "CORRUPTION.CHAT_WARNING": " är nära en korruptionströskel.", + "DIALOG.SYSTEM_MESSAGE":"Symbaroum systemmeddelande", "DIALOG.AUTOPARAMS": "Inkluderade modifieringar: ", "DIALOG.BACKSTAB": "Använda Lönnstöt?", "DIALOG.BEASTLORE": "Monsterlärd extra skada?", @@ -340,8 +341,9 @@ "HEALTH.CORRUPTION_THRESHOLD": "Tröskel", "HEALTH.CORRUPTION_THRESHOLD_MAX": "Korruptionströskel", "HEALTH.CORRUPTION_MAX": "Förstyggelse", - - "INITIATIVE": "Initiativ", + + "INITIATIVE.TITLE": "Initiativ", + "INITIATIVE.EXPLANATION": "Initiativ visas som [initiativ-karaktärsdrag.vaksam]", "ITEM.TRAIT": "Särdrag", "ITEM.ABILITY": "Förmåga", @@ -470,6 +472,11 @@ "POWER_CURSE.CHAT_FAILURE": " kan inte upprätthålla förhäxningen.", "POWER_CURSE.CHAT_FAIL_FINAL": "Förhäxningen har inte längre någon effekt på ", + "POWER_DANCINGWEAPON.CHAT_ACTIVATE": " använder sitt dansande vapen.", + "POWER_DANCINGWEAPON.CHAT_DESACTIVATE": " använder inte dansande vapen längre.", + "POWER_DANCINGWEAPON.CHAT_RESULT_ACTIVATE": "Stridskaraktärsdrag ersätts av Viljestark.", + "POWER_DANCINGWEAPON.CHAT_RESULT_DESACTIVATE": "Stridskaraktärsdrag återgår till de normala.", + "POWER_ENTANGLINGVINES.CHAT_INTRO_M": " försöker bryta sig loss från rankorna.", "POWER_ENTANGLINGVINES.CHAT_SUCCESS": " är intrasslad i rankorna.", "POWER_ENTANGLINGVINES.CHAT_FAILURE": " tar sig loss från rankorna.", @@ -485,11 +492,20 @@ "POWER_INHERITWOUND.CHAT_FAILURE": " kan inte överföra någon skada.", "POWER_INHERITWOUND.CHAT_HEALED": " tar emot Tålighetsläkning för: ", "POWER_INHERITWOUND.CHAT_DAMAGE": " mottagen skada: ", + "POWER_INHERITWOUND.CHAT_REDIRECT": "; poison and bleeding are also transfered.", "POWER_LARVAEBOILS.CHAT_INTRO": " planterar larver inuti fiendens kropp.", "POWER_LARVAEBOILS.CHAT_INTRO_M": " upprätthåller larvernas framfart.", "POWER_LARVAEBOILS.CHAT_SUCCESS": " äts upp inifrån av larverna.", "POWER_LARVAEBOILS.CHAT_FAILURE": " motstår larverna.", + + "POWER_LAYONHANDS.DIALOG":"Hur nära är ditt mål?", + "POWER_LAYONHANDS.TOUCH":"Beröring", + "POWER_LAYONHANDS.REMOTE":"Inom synhåll", + "POWER_LAYONHANDS.CHAT_INTRO":" väcker livskraften.", + "POWER_LAYONHANDS.CHAT_SUCCESS":" helar ", + "POWER_LAYONHANDS.CHAT_FINAL":"Tålighet läkt: ", + "POWER_LAYONHANDS.CHAT_FAILURE":" misslyckas att hela ", "POWER_PRIOSBURNINGGLASS.CHAT_INTRO":" försöker kanalisera Prios ljus mot ett mål.", "POWER_PRIOSBURNINGGLASS.CHAT_EXTRA":" kan bli bedövad, slå [Viljestark <-- Viljestark].", @@ -578,6 +594,7 @@ "TOOLTIP.EXPERIENCE_SPENT": "Alla erfarenhetspoäng som spenderats på förmågor, mystiska krafter, etc", "TOOLTIP.EXPERIENCE_AVAILABLE": "Dina nuvarande tillgängliga erfarenehtspoäng", + "TOOLTIP.HEALTH.CORRUPTION_NA_TEXT": "Är helt genomkorrumperad", "TOOLTIP.HEALTH.CORRUPTION_CURRENT": "Din nuvarande totala korruption", "TOOLTIP.HEALTH.CORRUPTION_TEMPORARY": "Din temporära korruption - varar scenen ut", "TOOLTIP.HEALTH.CORRUPTION_LONGTERM": "Korruption som varar längre än en scen", @@ -592,12 +609,14 @@ "TOOLTIP.COMBAT.INITIATIVE": "Det karaktärsdrag som ditt initiativ baseras på", "TOOLTIP.COMBAT.DEFENSE": "Det karaktärsdrag som ditt försvar baseras på", + "TOOLTIP.DELETE_ABILITY" : "Delete ability", "TOOLTIP.POWER_ACTIONS" : "Typ av aktivering (A - Aktiv, P - Passiv, S - special, etc)", "TRAIT.NAME": "Namn", "TRAIT.ACTIVE": "Aktiv", "TRAIT.ACTION": "Handling", "TRAIT.DESCRIPTION": "Beskrivning", + "TRAIT.MARKERTRAIT": "Särdraget har inga nivåer", "TRAIT_LABEL.ACIDICATTACK": "Frätande attack", "TRAIT_LABEL.ACIDICBLOOD": "Frätande blod", @@ -617,8 +636,7 @@ "TRAIT_LABEL.DEADLYBREATH": "Dödlig andedräkt", "TRAIT_LABEL.DEATHSTRUGGLE": "Dödsryckningar", "TRAIT_LABEL.DEVOUR": "Slukare", - "TRAIT_LABEL.DIMINUTIVE": "Diminutiv", - + "TRAIT_LABEL.DIMINUTIVE": "Diminutiv", "TRAIT_LABEL.EARTHBOUND": "Jordnära", "TRAIT_LABEL.ENTHRALL": "Trollbinda", "TRAIT_LABEL.FREESPIRIT": "Fri själ", @@ -672,15 +690,15 @@ "WEAPON.BONUS_DAMAGE": "Bonusskada", "WEAPON.PC_DAMAGE": "PC skada", "WEAPON.NPC_DAMAGE": "NPC skada", - "WEAPON.NONE": "None", + "WEAPON.NONE": "Inget", "WEAPON.NUMBER": "Nr", "WEAPON.QUALITY": "Kvalitet", "WEAPON.COST": "Kostnad", "WEAPON.ATTRIBUTE": "Karaktärsdrag", "WEAPON.ATTRIBUTEABBR": "Attr.", "WEAPON.DESCRIPTION": "Beskrivning", - "WEAPON.ADDBUTTON": "Lägg till Vapen", - "WEAPON.DELETEBUTTON": "Ta bort Vapen", + "WEAPON.ADDBUTTON": "Lägg till vapen", + "WEAPON.DELETEBUTTON": "Ta bort vapen", "WEAPON_CLASS.LABEL": "Vapentyp", "WEAPON_CLASS.1HANDED": "Enhandsvapen", @@ -710,10 +728,38 @@ "SYMBAROUM.OPTIONAL_SAVEATTRIBUTEROLL_HINT": "Välj för att behålla senaste modifikationer vid framgångsslag för karaktärsdrag", "SYMBAROUM.OPTIONAL_SHOWMODIFIERSINDIALOGUE": "Visa modifikationer vid framgångsslag för karaktärsdrag.", "SYMBAROUM.OPTIONAL_SHOWMODIFIERSINDIALOGUE_HINT": "Välj för att visa modifikationer för karaktärsdrag innan framgångsslag slås.", - "SYMBAROUM.OPTIONAL_INIATITIVEROLLS": "Supress Initiative rolls", - "SYMBAROUM.OPTIONAL_INIATITIVEROLLS_HINT": "Check to QoL disabling of Initiative rolls in chat", + "SYMBAROUM.OPTIONAL_NPC_MODIFIERS": "Visa NPC-modifikationer", + "SYMBAROUM.OPTIONAL_NPC_MODIFIERS_HINT": "Välj för att visa NPC-modifikationer (-5 till +5) istället för karaktärsdragens värden för NPCs på rollformuläret", + "SYMBAROUM.OPTIONAL_INIATITIVEROLLS": "Dölj Initiativ-slag", + "SYMBAROUM.OPTIONAL_INIATITIVEROLLS_HINT": "Välj för att dölja Initiativ-slag i chatten", "SYMBAROUM.OPTIONAL_SHOWREFERENCE": "Tillåt referensmodifikation", "SYMBAROUM.OPTIONAL_SHOWREFERENCE_HINT": "Varning - enbart SL - tillåt att manuellt justera referensimplementation för förmågor, särdrag och mystiska krafter. Kräver omladdning (refresh).", "SYMBAROUM.OPTIONAL_INIT_MANUAL": "Välj karaktärsdrag för Initiativ manuellt", - "SYMBAROUM.OPTIONAL_INIT_MANUAL_HINT": "Välj för att inaktivera automatisk utvärdering av karaktärsdrag för Initiativ." + "SYMBAROUM.OPTIONAL_INIT_MANUAL_HINT": "Välj för att inaktivera automatisk utvärdering av karaktärsdrag för Initiativ." , + "SYMBAROUM.OPTIONAL_PC_COLOUR_SELECTOR":"Select PC Background Color", + "SYMBAROUM.OPTIONAL_NPC_COLOUR_SELECTOR":"Select NPC Background Color", + "SYMBAROUM.OPTIONAL_RESET_NOTE": "NOTE: Submit and Reset will cause FVTT to reload.", + "SYMBAROUM.OPTIONAL_SUBMIT_BUTTON":"Submit", + "SYMBAROUM.OPTIONAL_RESET_PC_BUTTON":"Reset PC Config", + "SYMBAROUM.OPTIONAL_RESET_NPC_BUTTON":"Reset NPC Config", + "SYMBAROUM.OPTIONAL_CONFIG_MENULABEL": "Configure Symbaroum Settings", + "SYMBAROUM.OPTIONAL_CONFIG_MENUHINT": "Configure PC and NPC sheet background color (These are Client based settings).", + "SYMBAROUM.OPTIONAL_ADD_MENUNAME": "Add Symbaroum Settings button", + "SYMBAROUM.OPTIONAL_ADD_MENUHINT": "Add Colour setting button to Main Config panel.", + "SYMBAROUM.OPTIONAL_PC_CHAR_BG_IMGS":"Character Background Images", + "SYMBAROUM.OPTIONAL_NPC_CHAR_BG_IMGS":"NPC Background Images", + "SYMBAROUM.OPTIONAL_DEFAULT_IMAGE":"Default Image", + "SYMBAROUM.OPTIONAL_NEW_IMAGE":"New Image", + "SYMBAROUM.OPTIONAL_NEW_LIGHTER":"New Lighter Image", + "SYMBAROUM.OPTIONAL_COLOR_PICKER":"Plain Color Picker", + "SYMBAROUM.OPTIONAL_TITLE_COLOUR_SELECTOR": "Select Title Background Color", + "SYMBAROUM.OPTIONAL_TITLE_BG_IMGS":"Title Background Images", + "SYMBAROUM.OPTIONAL_RESET_TITLE_BUTTON":"Reset Title Config", + "SYMBAROUM.OPTIONAL_RESET_EDITABLE_BUTTON" :"Reset Editable Field", + "SYMBAROUM.OPTIONAL_EDITABLE_COLOUR_SELECTOR": "Select Editable Field Color", + "SYMBAROUM.OPTIONAL_EDITABLE_BG_IMGS": "Editable Field Background Images", + "SYMBAROUM.OPTIONAL_NON_EDITABLE_COLOUR_SELECTOR": "Select Non-Editable Field Color", + "SYMBAROUM.OPTIONAL_NON_EDITABLE_BG_IMGS": "Non-Editable Field Background Images", + "SYMBAROUM.OPTIONAL_RESET_NON_EDITABLE_BUTTON" :"Reset Non-Editable Field", + "SYMBAROUM.OPTIONAL_RESET_ALL_BUTTON": "Reset all settings to defaults" } \ No newline at end of file diff --git a/packs/systemuserguides.db b/packs/systemuserguides.db index 30bac32b..12ff8634 100644 --- a/packs/systemuserguides.db +++ b/packs/systemuserguides.db @@ -1 +1,3 @@ {"name":"Symbaroum System guide EN","content":"
\n

Symbaroum System
for
Foundry VTT

\n

Introduction

\n

This guide presents the main features of the Symbaroum system for Foundry VTT.
This system is unofficial, so there are no art or text from the rulebooks included. It is assumed that the people using this system for Foundry VTT are in possession of the rulebooks.

\n
\n

Creating Characters

\n

To create a character, go to the Actor and click Create Actor.  It will then prompt you for a name of the actor and what type it is, either player or monster. Once it has been selected, it shows a Character sheet where details of the character can be filled in.  Items such as character name and race can be filled in, as well as the experience it has and how much of it that has been spent on re-rolls or binding to artifacts, how much has been spent on abilities and traits and finally how much is unspent.

Any field that has a blue-ish background can't be edited, this is because they are automatically calculated and the player do not need to change these fields. The portrait can be changed to a picture that the player likes.

\n   \n

Underneath it has a set of tabs, main, gear, bio, etc. which can be used to supply the various information required.
On the main tab, the player can fill in their details of their attributes, how much toughness they have remaining and details of their corruption. In order to modify attributes, click on the \"modify\" button under the attributes label. this will open the attributes windows.

\n   \n

The base attribute is for the base, unmodifed attribute of the character. The \"Modifier\" field is for temporary modifiers, like attribute damage from undead creatures. \"Bonus\" is for bonuses from items. \"Total\" will display the computed attribute.
The corruption fields contains entries for how much Temporary (scene) corruption they've taken, any long term corruption, such as happens when consuming Krusan Berries, or even Permanent corruption they have accumulated.
The combat section allows for selection of the attribute that will be used for initiative or for defense. It also contains information of any worn armor or wielded weapons. See section about combat below.

\n
\n

Adding Abilities, Traits, Boons and Burdens

\n

Please note that this System Module does not contain the details about these abilities, traits, boons and burdens and it is advised that the Game Master sets them up in advance.
There is a Compendium with the names of these in multiple languages that is recommended for use.

To add an ability, trait, boon or burden, the player drags them from the Item's selection to the Abilities & Powers section of the character sheet.
   
Once they are on the character sheet, the player can open it and see more information about it. For abilities and traits, no experience is deducted unless the player has ticked that they have learnt or aquired the ability or trait. For boons and burdens, it deducts experience as per the level, as detailed in APG.
   
The character sheet also shows a summary with a clickable icon, the name of the ability and what actions (Active, Passive, etc) the player can use with the ability or trait.
   

\n

\n

Weapons and Armor

\n

Pre-configured weapons and armors are available in compendiums. We recommand you use them. Just find the compendiums corresponding to your langage in the compendium tab, and select \"import\".
To create an armor or weapon, select the tab GEAR on the character sheet. There is a + at the end of the tables for armor and weapons which when clicked, will create new armor or weapon and details about can be filled in.

\n   \n

Weapons

\n

Weapons have a class : One-handed (default), heavy, unarmed, short, long, ranged, thrown, and shield.
Attributes: The default base attribute is \"Accurate\" but you can select another one. You usually don't have to, since abilities that modify the attribute (Iron fist, Sixth sense...) will automaticaly do it.
There are two fields for the damage :
- Base damage : contains the damage dice of the weapon (1-handed is 1d8, short is 1d6…). You don't need to add passive bonuses from abilities, they will automaticaly added later.
- Bonus damage. This field should be left empty and be used only for exceptional situations, unsupported abilities and house rules.
- A weapon with the quality deep impact, or a weapon masterfully crafted to give it this quality have +1 damage, this damage should not be entered in the bonus field, just check the checkbox « deep impact » in the quality tab and the bonus will be added. The \"massive\" quality will also modify damage (when used by a PC), or armor rolls (when used by a NPC) The calculated damage is printed in the boxes under the weapon name : as in Symbaroum rules, PC damage is the damage roll formula when it’s a PC that wields it, and the NPC damage is the fixed damage used when it’s a NPC.
The \"Alternative damage\" field is used for weapons that do damage on attributes (usually Resolute or Strong). Normal weapons are set on \"none\". When creating a monster that do alternative damage, use the \"wraith claws\" or \"freezing touch\" weapon, and give the \"alternative damage\" ability to the creature. The damage of the weapon will automaticaly upgrade depending of its level in the ability.

\n
\n

Armors

\n

Armors have a fixed base protection value (1d4, 1d6, or 1d8). A reinforced armor should have the \"Reinforced\" quality checkbox scheck in the \"Qualities\" tab. Other bonus to protection can be add in the \"Bonus protection\" field. The \"Impeding\" field should receive the impeding value of the armor. This value will be used in some rolls. Qualities should be checked in the qualities tab. Only those will be used by the system. Any other custom quality can be entered in the \"quality\" field.

\n

Stackable armors can be created, for effects like \"Blessed shield\" that stacks to normal armor. Select the \"stackable armor\" option in the base armor field, then type the added protection value in the bonus field.

\n
\n

Adding weapons and armors to characters

\n

To add an armor or weapon to a character sheet, drag it from the Item's selection to the armor or weapon section of the gear tab of the character sheet. Monsters with the \"Natural weapon\" trait should be given the weapon « Natural weapon » of the compendium, and those with the \"Armored\" trait should be given the \"armored\" Armor.
When a PC or NPC add a weapon or an armor, to its sheet, its damage or protection value is automaticaly recalculated, taking into account the character abilities and traits (Man-at-arms, Robust…). For weapons, the attribute is also evaluated, taking into account the class of the weapon. The weapon/armor then appears on the character sheet with its final value printed. (dice value if it’s a PC sheet (ex: 1d8+1d6), fixed if it’s a monster sheet (ex: 7))
On the gear tab of the sheet, Weapons and armor have 3 states repredented bys a small icon, that you can change by clicking on it:
- stored (house icon): the item is stored out of immediate reach (in the character house, in a pack on a mule...)
- carried (briefcase icon): the item is sheated, or in a backpack
- active (shirt icon): the item is weared (armor) or in hand (weapon), and can be used for combat.

\n   \n

Active weapons, and the active armor, can be seen in the main tab of the character sheet. Click on them to make a roll (cf the combat section). Only one non-stackable armor will be considered active at a time. If there is no active armor, the system will generate a \"no armor\" dummy armor, equipped by the character, with passive bonuses added (robust..). When a stackable armor is activated, it will add its bonus protection to the active armor.

\n   

\n

Making an Attribute Test

\n

Symbaroum often calls for a test to be performed against an attribute. The tests are often denoted within brackets and optionally, where it is a test versus someone else, it contain the attribute that is used as the difficulty of the roll. 

\n
\n

Performing a Simple Attribute Test

\n

To perform a an attribute test, the player clicks on the attribute that is used for the test, for example, if a test for discreet is called, the player clicks on the discreet attribute
   
This will then bring up the attribute test dialogue, see below.

\n
\n

Performing a Versus Attribute Test

\n

If the test is to be performed against a token on the player field, then the player making the test, selects the token as a target.  To select a target, right click on it and tick the \"target icon\". The  selected target will then have arrows pointing at it, to show that it is now a target for the player.
   
Then the player clicks the attribute that the player wants to use. This then presents the attribute test dialogue to the player, where they can select the attribute that the token uses to resist the test. This will automatically then apply any bonus or penalty as normal to the test.

\n
\n

The Attribute Test Dialogue

\n

The roll dialogue is dynamic and shows elements that are relevant for the test. In the majority of the attribute tests, there are three elements. The versus attribute, which is the attribute from the selected target token that is used to resist the attribute that the player is rolling. For example, a player has to make a [Persuasive←Resolute] test against a token on the field. They've selected the token as the target and clicked their Persuasive attribute. In the dialogue, the selected is seen in the title of the window, Persusasive.
   
The player can then select the attribute the test is  against, in the example above, it is the targets Resolute that is the versus attribute. The second field is if this is a normal test, or if the test is made with favour or disfavour. See an explanation for the terms Favour and Disfavour further down in this document.

\nThe last field is any custom modifer that applies to this test, beyond the versus Attribute that was selected. It is important to note that if the versus Attribute is set to Custom then no attribute will be used and any penalties or bonuses will have to be entered in this field.


\n

Abilities, Powers and Traits

\n   \n

All the Abilities, Mystical Powers and Traits are available in the system compendiums. In order to add one of them to a character or monster sheet, simply drag and drop it from the compendium to the sheet. Then you can indicated the levels know by this character by checking the \"learned\" box in the Novice, adept and master tab.
   
You can create your own abilities but in order to use the features of the system, you'll have to use the Abilities, powers and traits included in the compendiums.  This system in unofficial, so we can't include the descriptions of those abilities.

\n

\n

Abilities

\n

Some abilities and traits, when given to a character (PC and NPC), will have effect on her character sheet and / or on dialog windows.

\n

Dominate, Feat of strength, Feint, Knife Play, Sixthsense, Strong gift, Tactician

\n

Defense and attack attribute will be changed when the character uses relevant weapons.

\n

Shield fighter, Staff fighting, Steel throw, Natural warrior, Natural weapon

\n

Damage value of the weapon will be increased, and/or defense value. Please note that the extra bonus of Staff fighting when using a wooden staff or a mystic staff isn't included (please add +1 defense in the bonus tab of the relevant weapons).

\n

Man-at-arms, Armored, Robust, Survival instinct

\n

Protection value of the armor will be increased.

\n

Colossal, Undead, Spirit form, Swarm

\n

Those traits will apply damage reduction when using Enhanced Combat (see Enhanced combat option) Damage value of the weapon will be increased, and defense value. Please note that the extra bonus of Staff fighting when using a wooden staff or a mystic staff isn't included (please add +1 defense in the bonus tab of the relevant weapons).

\n

Beast Lore, Backstab, Colossal, Corrupting attack, Feat of strength, Hunter's instinct, Iron Fist, Knife Play, Natural Warrior, Rapid Fire, Robust

\n

When using Enhanced Combat option, having those abilities or traits and using the right weapon type will make specific options available in the attack window.

\n

\n

Using Powers

\n

Powers can be activated by clicking on the orange dice of the item sheet.
   
Power activation is a WIP.
For now, only those active powers are supported:
Anathema, blessed shield, brimstone cascade, bend will, black bolt, confusion, curse, entangling vines, holy aura, inherit wound, larvae boils, lay on hands, levitate, maltransformation, Prios burning glass, tormenting spirits, unnoticeable
the abilities:
Alchemy, acrobatics, berserker, dominate, leader, loremaster, medicus, quickdraw, recovery, witchsight.
the traits:
Regeneration, Shapeshifter, Wisdom of the ages.

When you activate a power, it will take in account the relevant abilities of the character and its target (leader ability, rapid reflexes, steadfast, traditions, impeding armour...). It will open a dialog window for the acting player asking a few questions:
   

\n\n

Most roll should be left by default.
Than the roll is made, and result is announced in the chat.
   
Corruption is calculated taking into account the level in Theurgy, Wizardry, Witchcraft, Blessings, Sorcery.
If the result have effects on a token (damage, healing, corruption, stutus effects...) the gamemaster gets a chat entry with a button
   
Clicking the button will automaticaly affect the results of the power to the tokens: damage will be substracted from toughness, temporary corruption added, etc.
In order to do chain effects, you'll have to cast the power on each target, checking the \"maintained\" box after the first target.

\n

Power and Abilities specifics:

\n

Anathema

\n

Anathema can be used with or without a target. The target should be the opposing caster.

\n

Berserker

\n

When using this abilities, the effects will automaticaly modify the combat values of the character (armor, defense, damage). Use the abality again to revert to normal.

\n

Brimstone cascade

\n

When striking multiple targets, use the power several times, changing the target each time. After the first target, use the \"maintain power\" option so the casting character won't get corruption.

\n

Blessed Shield

\n

When using the power on 1 or 2 other characters (adept and master level), select them as targets before using the power. If successful, the Mystic and the target will automaticaly get an active \"blessed shield\" stackable armor. At the end of the duration of the power, just delete this item from their inventory.

\n

Entangling vines

\n

It's always the caster that should initiate the roll. After the second round, the strenght of the target will be used as a resist value, as in the rules.

\n

Inherit wound

\n

Target will be healed and damage will apply to the caster. If enhanced combat is used, and the level is adept or master, poison and bleeding effects will also be transfered from target to caster.

\n

Levitate

\n

If no target are selected, the spell will be cast on self. If a target is selected and level is adept or master, the power will be cast on the target.

\n

Leader

\n

When using leader, it will trigger the adept level effect: the target will receive a \"targeted\" status effect. When any character attacks this target, damage will receive a +1d4 bonus (or +2 if attack from a NPC). Just delete the status effect on the token to remove the effect.

\n

\n

Combat

\n

There are 2 options for combat:

\n

Default Combat:

\n

As with normal attribute rolls, combat works almost the same. The player has, based on its abilities and traits, selected which attribute is used for its initiative, defense and attack. The attack is set when you add a weapon to a character, as different weapons can use different attributes.

\n

Make an Attack

\n

To make an attack with a weapon, the player clicks the weilded weapon on their character sheet under the main tab.
   
It will then bring up the attribute test dialogue, where an attribute can be selected, or, which is more common in combat, the targets defense is selected.
   
Beside the normal fields in the attribute test dialogue, the player can also choose to make this attack with Advantage as well as any damage bonuses beyond those bestowed by Advantage or the wearpon, for example Backstab. The result of the attack is then displayed in the chat window which then can be applied to the token on the battlefield.
   

\n

Defend against an attack

\n

To make a defense test against an attack, the player clicks on the equipped armor, which then opens the attribute test dialogue. This dialogue has a subtle difference that it also has a checkmark if the people attacking the player have Advantage, i.e. the player is at Disadvantage.
   
If the defense is unsuccessful, then it will automatically roll the armor roll and display it in the chat window.
   
In the example above, Abesina failed her defense test and her robes protects her for 2 points of damage.

\n



\n

Enhanced Combat:

\n

Enhance combat can be activated by selecting the option in the system settings. The purpose of EC is to accelerate combat, limit Players and GM fidgeting with character sheets, and vastly simplify NPC management.

\n

This quick video explains how to use the enhanced combat

\n



it is still a Work in Progress. Not every passive abilities have been integrated.

Armor and weapons have to be equipped by the PCs and NPCs in order to be taken in account.
It automaticaly processes the attributes, traits  and abilities of the attacker and its target, rolls the dice, evaluate damage.

The attribute used for attacking has to be defined on the weapon sheet. The defense attribute has to be selected on the character sheet. PCs and NPCs armors and weapons value have to be entered as 'dice' (for example a sword damage value would be 1d8 - the system will automaticaly transform this value to a fixed 4 when a NPC attacks a PC)

If a player character attacks a NPC, the player has to select its target, then click on a weapon to do the attack. If a NPC attacks a PC, the GM select the target, then clicks on the NPC weapon.

A dialog window will appear, asking which abilities of the attacker to use (iron fist, hunter's instinct...).
   
Then the attack roll is made, and if it's a hit, damage is roll. Result is printed in the chat. If it's an NPC attack against a PC, then the damage is fixed and the armor is rolled, as per the rules - please note the Player don't have to initiate the defense and armor roll.
   
The gamemaster then gets a chat entry with a button
   
Clicking the button will automaticaly affect the results of the attack to the tokens: damage will be substracted from toughness, status icons like poison and bleed added, etc. We recommend using the \"Status icons counters\" in order to have the duration of those effects displayed on the token and in the combat tracker.
The \"Undead\", \"Spirit form\" and \"swarm\" traits will apply damage reduction. Remember to check the \"magical\" quality box on artifact weapons, so their damage will be evaluated as such.
Alternative damage will reduce the relevant attribute (it will use the \"modifier\" field of the attribute sheet.)

\n



\n

Initiative:

\n

The initiative used in the Symbaroum for FVTT system works the same way than stated in the rulebook, but in order to integrate in FVTT it uses the formula:
initiative = quick + vigilant x 0.01.
This simple formula produces the same order than the rulebook. So initiative 15.10 means Quick 15, Vigilant 10. It is possible to change the base attribute used for the formula in the character sheet (for characters with the Tactician ability, for example).

\n

Favour/Disfavour:

\n

The term favour/disfavour used in dialog boxes refers to situation when the acting character either rolls 2 dice and keeps the best (Hunter's instinct ability, steadfast resistance, ...) or in cases where disfavour (cursed, pariah, ...) is used, it keeps the worst. 

\n

Bonuses

\n

All items can have different bonuses configurable. These can be used by the GM for various purposes, ranging from giving boosts or penalties to attributes, to increasing or decreasing toughness, changing corruption values. It can also be used to reduce the experience cost of something or even give a player experience without changing their total experience earned (only their unspent). When viewing any items, it will have a bonus section where an items behaviour can be changed. 
   
It should be noted that Powers & Abilities give bonuses as soon as they are on the character sheet. Bonuses on armor, weapons and items are only given when they are equipped. If an item gives a bonus to an attribute, then it is included in the printed \"total\" value and listed in the corresponding tooltip. For example, here is a character with ability \"Exc Attribute Vigilant\" novice, and a base Vigilant value of 15:
   

\n



\n

Supported Modules

\n

Dice-so-nice

\n

Status icons counters

\n

Token action hud

\n
","folder":null,"sort":0,"permission":{"default":0,"1qImqL9kPxfUOSjY":3,"eT9Fn0zC6QGMvWEk":3},"flags":{"core":{"sourceId":"JournalEntry.WGo6jbcbdCmTy0su"},"symbaroum":{"ver":"3.0.8"}},"_id":"xzssjKaHcJH0CMaw"} +{"_id":"xzssjKaHcJH0CMaw","name":"Symbaroum System guide EN","content":"
\n

Symbaroum System
for
Foundry VTT

\n

Introduction

\n

This guide presents the main features of the Symbaroum system for Foundry VTT.
This system is official but completely developed, maintained and supported by volunteers.
It is assumed that the people using this system for Foundry VTT are in possession of the Symbaroum rulebooks or purchased the Free League foundry modules.

\n
\n

Creating Characters

\n

To create a character, go to the Actor and click Create Actor.  It will then prompt you for a name of the actor and what type it is, either player or monster. Once it has been selected, it shows a Character sheet where details of the character can be filled in.  Items such as character name and race can be filled in, as well as the experience it has and how much of it that has been spent on re-rolls or binding to artifacts, how much has been spent on abilities and traits and finally how much is unspent.

Any field that has a blue-ish background can't be edited, this is because they are automatically calculated and the player do not need to change these fields. The portrait can be changed to a picture that the player likes.

When generating characters, put the initial point total used for starting abilities in the far left Experience box. You should also update this should the character gain any xp during the scenarios.

\n   \n

Underneath it has a set of tabs, main, gear, bio, etc. which can be used to supply the various information required.
On the main tab, the player can fill in their details of their attributes, how much toughness they have remaining and details of their corruption. In order to modify attributes, click on the cog-wheel on the header and this will open the attributes windows.

\n   
   \n

The base attribute is for the base, unmodifed attribute of the character. The \"Modifier\" field is for temporary modifiers, like attribute damage from undead creatures. \"Bonus\" is for bonuses from items. \"Total\" will display the computed attribute.
The corruption fields contains entries for how much Temporary (scene) corruption they've taken, any long term corruption, such as happens when consuming Krusan Berries, or even Permanent corruption they have accumulated.
The combat section allows for selection of the attribute that will be used for initiative or for defense. It also contains information of any worn armor or wielded weapons. See section about combat below.

\n
\n

Adding Abilities, Traits, Boons and Burdens

\n

Please note that this System Module does not contain the details about these abilities, traits, boons and burdens and it is advised that the Game Master sets them up in advance.
There is a Compendium with the names of these in multiple languages that is recommended for use.

To add an ability, trait, boon or burden, the player drags them from the Item's selection to the Abilities & Powers section of the character sheet.
   
Once they are on the character sheet, the player can open it and see more information about it. For abilities and traits, no experience is deducted unless the player has ticked that they have learnt or aquired the ability or trait. For boons and burdens, it deducts experience as per the level, as detailed in APG.
   
The character sheet also shows a summary with a clickable icon, the name of the ability and what actions (Active, Passive, etc) the player can use with the ability or trait. If the icon of the trait has a green border when hovered over, the ability or trait can be activated by just clicking.
   

\n

\n

Weapons and Armor

\n

Pre-configured weapons and armors are available in compendiums. We recommand you use them. Just find the compendiums corresponding to your langage in the compendium tab, and select \"import\".
To create an armor or weapon, select the tab GEAR on the character sheet. There is a + at the end of the tables for armor and weapons which when clicked, will create new armor or weapon and details about can be filled in.

\n   \n

Weapons

\n

Weapons have a class : One-handed (default), heavy, unarmed, short, long, ranged, thrown, and shield.
Attributes: The default base attribute is \"Accurate\" but you can select another one. You usually don't have to, since abilities that modify the attribute (Iron fist, Sixth sense...) will automaticaly do it.
There are two fields for the damage :
- Base damage : contains the damage dice of the weapon (1-handed is 1d8, short is 1d6…). You don't need to add passive bonuses from abilities, they will automaticaly added later.
- Bonus damage. This field should be left empty and be used only for exceptional situations, unsupported abilities and house rules.
- A weapon with the quality deep impact, or a weapon masterfully crafted to give it this quality have +1 damage, this damage should not be entered in the bonus field, just check the checkbox « deep impact » in the quality tab and the bonus will be added. The \"massive\" quality will also modify damage (when used by a PC), or armor rolls (when used by a NPC) The calculated damage is printed in the boxes under the weapon name : as in Symbaroum rules, PC damage is the damage roll formula when it’s a PC that wields it, and the NPC damage is the fixed damage used when it’s a NPC.
The \"Alternative damage\" field is used for weapons that do damage on attributes (usually Resolute or Strong). Normal weapons are set on \"none\". When creating a monster that do alternative damage, use the \"wraith claws\" or \"freezing touch\" weapon, and give the \"alternative damage\" ability to the creature. The damage of the weapon will automaticaly upgrade depending of its level in the ability.

\n
\n

Armors

\n

Armors have a fixed base protection value (1d4, 1d6, or 1d8). A reinforced armor should have the \"Reinforced\" quality checkbox scheck in the \"Qualities\" tab. Other bonus to protection can be add in the \"Bonus protection\" field. The \"Impeding\" field should receive the impeding value of the armor. This value will be used in some rolls. Qualities should be checked in the qualities tab. Only those will be used by the system. Any other custom quality can be entered in the \"quality\" field.

\n

Stackable armors can be created, for effects like \"Blessed shield\" that stacks to normal armor. Select the \"stackable armor\" option in the base armor field, then type the added protection value in the bonus field.

\n
\n

Adding weapons and armors to characters

\n

To add an armor or weapon to a character sheet, drag it from the Item's selection to the armor or weapon section of the gear tab of the character sheet. Monsters with the \"Natural weapon\" trait should be given the weapon « Natural weapon » of the compendium, and those with the \"Armored\" trait should be given the \"armored\" Armor.
When a PC or NPC add a weapon or an armor, to its sheet, its damage or protection value is automaticaly recalculated, taking into account the character abilities and traits (Man-at-arms, Robust…). For weapons, the attribute is also evaluated, taking into account the class of the weapon. The weapon/armor then appears on the character sheet with its final value printed. (dice value if it’s a PC sheet (ex: 1d8+1d6), fixed if it’s a monster sheet (ex: 7))
On the gear tab of the sheet, Weapons and armor have 3 states repredented bys a small icon, that you can change by clicking on it:
- stored (house icon): the item is stored out of immediate reach (in the character house, in a pack on a mule...)
- carried (briefcase icon): the item is sheated, or in a backpack
- active (shirt icon): the item is weared (armor) or in hand (weapon), and can be used for combat.

\n   \n

Active weapons, and the active armor, can be seen in the main tab of the character sheet. Click on them to make a roll (cf the combat section). Armor and weapons displays their protection or damage as well as what attribute is used and the target value. Only one non-stackable armor will be considered active at a time. If there is no active armor, the system will generate a \"no armor\" dummy armor, equipped by the character, with passive bonuses added (robust..). When a stackable armor is activated, it will add its bonus protection to the active armor.

\n

The combat tab also shows which attribute it uses for initiative, where the format is [primary inititive attribute].[vigilant] - where the primary attribute is quick, unless you have an ability or trait that changes that.

\n   

\n

Making an Attribute Test

\n

Symbaroum often calls for a test to be performed against an attribute. The tests are often denoted within brackets and optionally, where it is a test versus someone else, it contain the attribute that is used as the difficulty of the roll. 

\n
\n

Performing a Simple Attribute Test

\n

To perform a an attribute test, the player clicks on the attribute that is used for the test, for example, if a test for discreet is called, the player clicks on the discreet attribute
   
This will then bring up the attribute test dialogue, see below.

\n
\n

Performing a Versus Attribute Test

\n

If the test is to be performed against a token on the player field, then the player making the test, selects the token as a target.  To select a target, right click on it and tick the \"target icon\". The  selected target will then have arrows pointing at it, to show that it is now a target for the player.
   
Then the player clicks the attribute that the player wants to use. This then presents the attribute test dialogue to the player, where they can select the attribute that the token uses to resist the test. This will automatically then apply any bonus or penalty as normal to the test.

\n
\n

The Attribute Test Dialogue

\n

The roll dialogue is dynamic and shows elements that are relevant for the test. In the majority of the attribute tests, there are three elements. The versus attribute, which is the attribute from the selected target token that is used to resist the attribute that the player is rolling. For example, a player has to make a [Persuasive←Resolute] test against a token on the field. They've selected the token as the target and clicked their Persuasive attribute. In the dialogue, the selected is seen in the title of the window, Persusasive.
   
The player can then select the attribute the test is  against, in the example above, it is the targets Resolute that is the versus attribute. The second field is if this is a normal test, or if the test is made with favour or disfavour. See an explanation for the terms Favour and Disfavour further down in this document.

\nThe last field is any custom modifer that applies to this test, beyond the versus Attribute that was selected. It is important to note that if the versus Attribute is set to Custom then no attribute will be used and any penalties or bonuses will have to be entered in this field.


\n

Abilities, Powers and Traits

\n   \n

All the Abilities, Mystical Powers and Traits are available in the system compendiums, but comes without descriptions. If you want the descriptions, then you can fill them in manually or purchase one of the Free League modules for the Symbaroum system. In order to add one of them to a character or monster sheet, simply drag and drop it from the compendium to the sheet. Then you can indicated the levels know by this character by checking the \"learned\" box in the Novice, adept and master tab.
   
You can create your own abilities but in order to use the features of the system, you'll have to use the Abilities, powers and traits included in the compendiums. 

\n

\n

Abilities

\n

Some abilities and traits, when given to a character (PC and NPC), will have effect on her character sheet and / or on dialog windows.

\n

Dominate, Feat of strength, Feint, Knife Play, Sixthsense, Strong gift, Tactician

\n

Defense and attack attribute will be changed when the character uses relevant weapons.

\n

Shield fighter, Staff fighting, Steel throw, Natural warrior, Natural weapon

\n

Damage value of the weapon will be increased, and/or defense value. Please note that the extra bonus of Staff fighting when using a wooden staff or a mystic staff isn't included (please add +1 defense in the bonus tab of the relevant weapons).

\n

Man-at-arms, Armored, Robust, Survival instinct

\n

Protection value of the armor will be increased.

\n

Colossal, Undead, Spirit form, Swarm

\n

Those traits will apply damage reduction when using Enhanced Combat (see Enhanced combat option) Damage value of the weapon will be increased, and defense value. Please note that the extra bonus of Staff fighting when using a wooden staff or a mystic staff isn't included (please add +1 defense in the bonus tab of the relevant weapons).

\n

Beast Lore, Backstab, Colossal, Corrupting attack, Feat of strength, Hunter's instinct, Iron Fist, Knife Play, Natural Warrior, Rapid Fire, Robust

\n

When using Enhanced Combat option, having those abilities or traits and using the right weapon type will make specific options available in the attack window.

\n

\n

Using Powers

\n

Powers can be activated by clicking on the icon with a green border on the character sheet (see Adding Abilities, Traits, Boons and Burdens), or opening the power and clicking on the orange dice of the item sheet (shown below).
   
Power activation is a WIP.
For now, only those active powers are supported:
Anathema, blessed shield, brimstone cascade, bend will, black bolt, confusion, curse, dancing weapon, entangling vines, holy aura, inherit wound, larvae boils, lay on hands, levitate, maltransformation, Prios burning glass, tormenting spirits, unnoticeable
the abilities:
Alchemy, acrobatics, berserker, dominate, leader, loremaster, medicus, poisoner, quickdraw, recovery, witchsight.
the traits:
Poisonous, Regeneration, Shapeshifter, Wisdom of the ages.

When you activate a power, it will take in account the relevant abilities of the character and its target (leader ability, rapid reflexes, steadfast, traditions, impeding armour...). It will open a dialog window for the acting player asking a few questions:
   

\n\n

Most roll should be left by default.
Than the roll is made, and result is announced in the chat.
   
Corruption is calculated taking into account the level in Theurgy, Wizardry, Witchcraft, Blessings, Sorcery.
If the result have effects on a token (damage, healing, corruption, stutus effects...) the gamemaster gets a chat entry with a button
   
Clicking the button will automaticaly affect the results of the power to the tokens: damage will be substracted from toughness, temporary corruption added, etc.
In order to do chain effects, you'll have to cast the power on each target, checking the \"maintained\" box after the first target.

\n

Power and Abilities specifics:

\n

Anathema

\n

Anathema can be used with or without a target. The target should be the opposing caster.

\n

Berserker

\n

When using this ability, the effects will automaticaly modify the combat values of the character (armor, defense, damage). Use the abality again to revert to normal.

\n

Brimstone cascade

\n

When striking multiple targets, use the power several times, changing the target each time. After the first target, use the \"maintain power\" option so the casting character won't get corruption.

\n

Blessed Shield

\n

When using the power on 1 or 2 other characters (adept and master level), select them as targets before using the power. If successful, the Mystic and the target will automaticaly get an active \"blessed shield\" stackable armor. At the end of the duration of the power, just delete this item from their inventory.

\n

Dancing Weapon

\n

When using this power, the character will enter \"Dancing weapon mode\": his combat stats on defense and melee weapons will be replaced by resolute (or persuasive if relevant). Just use the power again to exit the \"Dancing weapon\" mode. Please note that clicking on the power won't generate corruption - you'll have to take care of this manually.

\n

Entangling vines

\n

It's always the caster that should initiate the roll. After the second round, the strenght of the target will be used as a resist value, as in the rules.

\n

Inherit wound

\n

Target will be healed and damage will apply to the caster. If enhanced combat is used, and the level is adept or master, poison and bleeding effects will also be transfered from target to caster.

\n

Levitate

\n

If no target are selected, the spell will be cast on self. If a target is selected and level is adept or master, the power will be cast on the target.

\n

Leader

\n

When using leader, it will trigger the adept level effect: the target will receive a \"targeted\" status effect. When any character attacks this target, damage will receive a +1d4 bonus (or +2 if attack from a NPC). Just delete the status effect on the token to remove the effect.

\n

\n

Combat

\n

There are 2 options for combat:

\n

Default Combat:

\n

As with normal attribute rolls, combat works almost the same. The player has, based on its abilities and traits, selected which attribute is used for its initiative, defense and attack. The attack is set when you add a weapon to a character, as different weapons can use different attributes.

\n

Make an Attack

\n

To make an attack with a weapon, the player clicks the weilded weapon on their character sheet under the main tab.
   
It will then bring up the attribute test dialogue, where an attribute can be selected, or, which is more common in combat, the targets defense is selected.
   
Beside the normal fields in the attribute test dialogue, the player can also choose to make this attack with Advantage as well as any damage bonuses beyond those bestowed by Advantage or the wearpon, for example Backstab. The result of the attack is then displayed in the chat window which then can be applied to the token on the battlefield.
   

\n

Defend against an attack

\n

To make a defense test against an attack, the player clicks on the equipped armor, which then opens the attribute test dialogue. This dialogue has a subtle difference that it also has a checkmark if the people attacking the player have Advantage, i.e. the player is at Disadvantage.
   
If the defense is unsuccessful, then it will automatically roll the armor roll and display it in the chat window.
   
In the example above, Abesina failed her defense test and her robes protects her for 2 points of damage.

\n



\n

Enhanced Combat:

\n

Enhance combat can be activated by selecting the option in the system settings. The purpose of EC is to accelerate combat, limit Players and GM fidgeting with character sheets, and vastly simplify NPC management.

\n

This quick video explains how to use the enhanced combat

\n



it is still a Work in Progress. Not every passive abilities have been integrated.

Armor and weapons have to be equipped by the PCs and NPCs in order to be taken in account.
It automaticaly processes the attributes, traits  and abilities of the attacker and its target, rolls the dice, evaluate damage.

The attribute used for attacking has to be defined on the weapon sheet. The defense attribute has to be selected on the character sheet. PCs and NPCs armors and weapons value have to be entered as 'dice' (for example a sword damage value would be 1d8 - the system will automaticaly transform this value to a fixed 4 when a NPC attacks a PC)

If a player character attacks a NPC, the player has to select its target, then click on a weapon to do the attack. If a NPC attacks a PC, the GM select the target, then clicks on the NPC weapon.

A dialog window will appear, asking which abilities of the attacker to use (iron fist, hunter's instinct...).
   
Then the attack roll is made, and if it's a hit, damage is roll. Result is printed in the chat. If it's an NPC attack against a PC, then the damage is fixed and the armor is rolled, as per the rules - please note the Player don't have to initiate the defense and armor roll.
   
The gamemaster then gets a chat entry with a button
   
Clicking the button will automaticaly affect the results of the attack to the tokens: damage will be substracted from toughness, status icons like poison and bleed added, etc. We recommend using the \"Status icons counters\" in order to have the duration of those effects displayed on the token and in the combat tracker.
The \"Undead\", \"Spirit form\" and \"swarm\" traits will apply damage reduction. Remember to check the \"magical\" quality box on artifact weapons, so their damage will be evaluated as such.
Alternative damage will reduce the relevant attribute (it will use the \"modifier\" field of the attribute sheet.)

\n



\n

Initiative:

\n

The initiative used in the Symbaroum for FVTT system works the same way than stated in the rulebook, but in order to integrate in FVTT it uses the formula:
initiative = quick + vigilant x 0.01.
This simple formula produces the same order than the rulebook. So initiative 15.10 means Quick 15, Vigilant 10. It is possible to change the base attribute used for the formula in the character sheet (for characters with the Tactician ability, for example).

\n

Favour/Disfavour:

\n

The term favour/disfavour used in dialog boxes refers to situation when the acting character either rolls 2 dice and keeps the best (Hunter's instinct ability, steadfast resistance, ...) or in cases where disfavour (cursed, pariah, ...) is used, it keeps the worst. 

\n

Bonuses

\n

All items can have different bonuses configurable. These can be used by the GM for various purposes, ranging from giving boosts or penalties to attributes, to increasing or decreasing toughness, changing corruption values. It can also be used to reduce the experience cost of something or even give a player experience without changing their total experience earned (only their unspent). When viewing any items, it will have a bonus section where an items behaviour can be changed. 
   
It should be noted that Powers & Abilities give bonuses as soon as they are on the character sheet. Bonuses on armor, weapons and items are only given when they are equipped. If an item gives a bonus to an attribute, then it is included in the printed \"total\" value and listed in the corresponding tooltip. For example, here is a character with ability \"Exc Attribute Vigilant\" novice, and a base Vigilant value of 15:
   

\n

System settings

\n

The following system settings exist - you can turn on and of to your hearts content or as you see fit for running your campaign.
Configure Symbaroum Settings
This is a user setting which allows some modification of sheet backgrounds and colorations (see below).
World Template Version
This is a developer function - do not change unless you really intend it. World System Version
This is a developer function - do not change unless you really intend it. Combat Enhancement
Turns the automated combat enhancement on or off. Please note that if you turn it on, the game will work a bit differently and players no longer rolls defense Always able to succeed or fail
If you want the system to always succeed on a roll of 1 or fail on a roll of 20 Optional Critical Rolls
Enables the normal critical rolls as detailed in the optional rule in the core book. Optional Rare Critical Rolls
Enables the more rarer criticals as detailed in the optional rule in the core book. Allow crits for non-combat
This enables the system to print a message when there is a critical success or failure with normal attribute rolls. Crit ratio is the same as for combat Combat settings for rolls
Enables QoL enhancements for keeping modifiers between strikes Attribute settings for rolls
Enables QoL enhancements for keeping modifiers between specific attribute rolls Show modifiers in targetted
In attribute rolls, or combat rolls, shows the modifier the versus attribute gives Show NPC modifiers
Shows the character sheet for NPC/monster sheets as in the core book (i.e. from +5 to -5) Allow reference modifications
Only shows for GM and shows a reference field on abilities, traits, etc. This reference is used for the automation of abilities.
Supress Iniatiative Rolls
While Symbaroum do not roll for iniatiative, the system has to do so for the tie breaker. This just turns of the visibility of this roll from chat. Manually select iniatiative
Allows manual selection of the iniatiative attribute.
Add Symbaroum Settings button
This adds a Symbaroum setting button under the Foundry Configuration sidebar

\n

 

\n

Configure Symbaroum Settings

\n

Under the configuration sidebar there is a now a \"Configure Symbaroum Settings\" button which is visible to all users.
   
Selecting this a user can change the character/NPC backgrounds as well as the title, editable and non-editable field colours.
   
Selecting the \"Plain Color Picker\" on any of the drop downs will display a color choice box for that item.
A pop-up colour selector will appear when the box is clicked on. From there you can select any colour/brightness combination you want.
   
Once you have made your selection(s) click the \"Submit\" button to enable them. In the event you make a choice you are unhappy with there is a selection of reset buttons to take you back to the default.

\n

 

\n

Macros

\n

The system comes with a set of macros that might be useful at your gaming table.
Add Exp
A macro for the GameMaster to add Experience to a party. You can select tokesn, or if no tokens are selected, it gives you a list of player characters from your actor catalog.
Alternate Damage With this macro, you can deal Alternative Damage to a given token.
Name Generator
The macro will generate and publish a set of 10 Symbaroum-esque names based on the culture selected for a quick generation of names. There are x cultures available - Ambrian (feminine, masculine, noble), Barbarian (feminine, masculine), Symbaroum, Abducted Human (feminine, masculine), Dwarf (firstnames, surname), Elf (feminine, masculine, Goblin (feminine, masculine), Troll (normal, ancient).
NPC Importer
The macro can import NPC or Monsters from the Core book, many adventures and the Monster Codex via copy & paste. All you need to do is validate abilities and put the gear on the character. Check the text on the macro on how to use it.
Pay for re-roll
Using the alternative rules for paying for re-rolls with either experience or permanent corruption. It will prompt the player to select the character they own, or the token they have selected. Note that this macro only pays the cost for the re-roll, it does not perform another re-roll.
Reset temporary corruption
Allows the GM to reset the temporary corruption on the selected token, or if no tokens are selected, to any number of player characters in their actor catalog.
Roll attribute
Allows a player to select attribute and character to roll without opening their character sheet.
Toggle player/monster
Toggles a named player or monster in the actor catalog between being a player or monster character

\n



\n

Supported Modules

\n

Dice-so-nice

\n

Status icons counters

\n

Token action hud

\n
","folder":null,"sort":0,"permission":{"default":0,"1qImqL9kPxfUOSjY":3,"eT9Fn0zC6QGMvWEk":3},"flags":{"core":{"sourceId":"JournalEntry.WGo6jbcbdCmTy0su"},"symbaroum":{"ver":"3.0.8"}}} +{"_id":"xzssjKaHcJH0CMaw","name":"Symbaroum System guide EN","content":"
\n

Symbaroum System
for
Foundry VTT

\n

Introduction

\n

This guide presents the main features of the Symbaroum system for Foundry VTT.
This system is official but completely developed, maintained and supported by volunteers.
It is assumed that the people using this system for Foundry VTT are in possession of the Symbaroum rulebooks or purchased the Free League foundry modules.

\n
\n

Creating Characters

\n

To create a character, go to the Actor and click Create Actor.  It will then prompt you for a name of the actor and what type it is, either player or monster. Once it has been selected, it shows a Character sheet where details of the character can be filled in.  Items such as character name and race can be filled in, as well as the experience it has and how much of it that has been spent on re-rolls or binding to artifacts, how much has been spent on abilities and traits and finally how much is unspent.

Any field that has a blue-ish background can't be edited, this is because they are automatically calculated and the player do not need to change these fields. The portrait can be changed to a picture that the player likes.

When generating characters, put the initial point total used for starting abilities in the far left Experience box. You should also update this should the character gain any xp during the scenarios.

\n   \n

Underneath it has a set of tabs, main, gear, bio, etc. which can be used to supply the various information required.
On the main tab, the player can fill in their details of their attributes, how much toughness they have remaining and details of their corruption. In order to modify attributes, click on the cog-wheel on the header and this will open the attributes windows.

\n   
   \n

The base attribute is for the base, unmodifed attribute of the character. The \"Modifier\" field is for temporary modifiers, like attribute damage from undead creatures. \"Bonus\" is for bonuses from items. \"Total\" will display the computed attribute.
The corruption fields contains entries for how much Temporary (scene) corruption they've taken, any long term corruption, such as happens when consuming Krusan Berries, or even Permanent corruption they have accumulated.
The combat section allows for selection of the attribute that will be used for initiative or for defense. It also contains information of any worn armor or wielded weapons. See section about combat below.

\n
\n

Adding Abilities, Traits, Boons and Burdens

\n

Please note that this System Module does not contain the details about these abilities, traits, boons and burdens and it is advised that the Game Master sets them up in advance.
There is a Compendium with the names of these in multiple languages that is recommended for use.

To add an ability, trait, boon or burden, the player drags them from the Item's selection to the Abilities & Powers section of the character sheet.
   
Once they are on the character sheet, the player can open it and see more information about it. For abilities and traits, no experience is deducted unless the player has ticked that they have learnt or aquired the ability or trait. For boons and burdens, it deducts experience as per the level, as detailed in APG.
   
The character sheet also shows a summary with a clickable icon, the name of the ability and what actions (Active, Passive, etc) the player can use with the ability or trait. If the icon of the trait has a green border when hovered over, the ability or trait can be activated by just clicking.
   

\n

\n

Weapons and Armor

\n

Pre-configured weapons and armors are available in compendiums. We recommand you use them. Just find the compendiums corresponding to your langage in the compendium tab, and select \"import\".
To create an armor or weapon, select the tab GEAR on the character sheet. There is a + at the end of the tables for armor and weapons which when clicked, will create new armor or weapon and details about can be filled in.

\n   \n

Weapons

\n

Weapons have a class : One-handed (default), heavy, unarmed, short, long, ranged, thrown, and shield.
Attributes: The default base attribute is \"Accurate\" but you can select another one. You usually don't have to, since abilities that modify the attribute (Iron fist, Sixth sense...) will automaticaly do it.
There are two fields for the damage :
- Base damage : contains the damage dice of the weapon (1-handed is 1d8, short is 1d6…). You don't need to add passive bonuses from abilities, they will automaticaly added later.
- Bonus damage. This field should be left empty and be used only for exceptional situations, unsupported abilities and house rules.
- A weapon with the quality deep impact, or a weapon masterfully crafted to give it this quality have +1 damage, this damage should not be entered in the bonus field, just check the checkbox « deep impact » in the quality tab and the bonus will be added. The \"massive\" quality will also modify damage (when used by a PC), or armor rolls (when used by a NPC) The calculated damage is printed in the boxes under the weapon name : as in Symbaroum rules, PC damage is the damage roll formula when it’s a PC that wields it, and the NPC damage is the fixed damage used when it’s a NPC.
The \"Alternative damage\" field is used for weapons that do damage on attributes (usually Resolute or Strong). Normal weapons are set on \"none\". When creating a monster that do alternative damage, use the \"wraith claws\" or \"freezing touch\" weapon, and give the \"alternative damage\" ability to the creature. The damage of the weapon will automaticaly upgrade depending of its level in the ability.

\n
\n

Armors

\n

Armors have a fixed base protection value (1d4, 1d6, or 1d8). A reinforced armor should have the \"Reinforced\" quality checkbox scheck in the \"Qualities\" tab. Other bonus to protection can be add in the \"Bonus protection\" field. The \"Impeding\" field should receive the impeding value of the armor. This value will be used in some rolls. Qualities should be checked in the qualities tab. Only those will be used by the system. Any other custom quality can be entered in the \"quality\" field.

\n

Stackable armors can be created, for effects like \"Blessed shield\" that stacks to normal armor. Select the \"stackable armor\" option in the base armor field, then type the added protection value in the bonus field.

\n
\n

Adding weapons and armors to characters

\n

To add an armor or weapon to a character sheet, drag it from the Item's selection to the armor or weapon section of the gear tab of the character sheet. Monsters with the \"Natural weapon\" trait should be given the weapon « Natural weapon » of the compendium, and those with the \"Armored\" trait should be given the \"armored\" Armor.
When a PC or NPC add a weapon or an armor, to its sheet, its damage or protection value is automaticaly recalculated, taking into account the character abilities and traits (Man-at-arms, Robust…). For weapons, the attribute is also evaluated, taking into account the class of the weapon. The weapon/armor then appears on the character sheet with its final value printed. (dice value if it’s a PC sheet (ex: 1d8+1d6), fixed if it’s a monster sheet (ex: 7))
On the gear tab of the sheet, Weapons and armor have 3 states repredented bys a small icon, that you can change by clicking on it:
- stored (house icon): the item is stored out of immediate reach (in the character house, in a pack on a mule...)
- carried (briefcase icon): the item is sheated, or in a backpack
- active (shirt icon): the item is weared (armor) or in hand (weapon), and can be used for combat.

\n   \n

Active weapons, and the active armor, can be seen in the main tab of the character sheet. Click on them to make a roll (cf the combat section). Armor and weapons displays their protection or damage as well as what attribute is used and the target value. Only one non-stackable armor will be considered active at a time. If there is no active armor, the system will generate a \"no armor\" dummy armor, equipped by the character, with passive bonuses added (robust..). When a stackable armor is activated, it will add its bonus protection to the active armor.

\n

The combat tab also shows which attribute it uses for initiative, where the format is [primary inititive attribute].[vigilant] - where the primary attribute is quick, unless you have an ability or trait that changes that.

\n   

\n

Making an Attribute Test

\n

Symbaroum often calls for a test to be performed against an attribute. The tests are often denoted within brackets and optionally, where it is a test versus someone else, it contain the attribute that is used as the difficulty of the roll. 

\n
\n

Performing a Simple Attribute Test

\n

To perform a an attribute test, the player clicks on the attribute that is used for the test, for example, if a test for discreet is called, the player clicks on the discreet attribute
   
This will then bring up the attribute test dialogue, see below.

\n
\n

Performing a Versus Attribute Test

\n

If the test is to be performed against a token on the player field, then the player making the test, selects the token as a target.  To select a target, right click on it and tick the \"target icon\". The  selected target will then have arrows pointing at it, to show that it is now a target for the player.
   
Then the player clicks the attribute that the player wants to use. This then presents the attribute test dialogue to the player, where they can select the attribute that the token uses to resist the test. This will automatically then apply any bonus or penalty as normal to the test.

\n
\n

The Attribute Test Dialogue

\n

The roll dialogue is dynamic and shows elements that are relevant for the test. In the majority of the attribute tests, there are three elements. The versus attribute, which is the attribute from the selected target token that is used to resist the attribute that the player is rolling. For example, a player has to make a [Persuasive←Resolute] test against a token on the field. They've selected the token as the target and clicked their Persuasive attribute. In the dialogue, the selected is seen in the title of the window, Persusasive.
   
The player can then select the attribute the test is  against, in the example above, it is the targets Resolute that is the versus attribute. The second field is if this is a normal test, or if the test is made with favour or disfavour. See an explanation for the terms Favour and Disfavour further down in this document.

\nThe last field is any custom modifer that applies to this test, beyond the versus Attribute that was selected. It is important to note that if the versus Attribute is set to Custom then no attribute will be used and any penalties or bonuses will have to be entered in this field.


\n

Abilities, Powers and Traits

\n   \n

All the Abilities, Mystical Powers and Traits are available in the system compendiums, but comes without descriptions. If you want the descriptions, then you can fill them in manually or purchase one of the Free League modules for the Symbaroum system. In order to add one of them to a character or monster sheet, simply drag and drop it from the compendium to the sheet. Then you can indicated the levels know by this character by checking the \"learned\" box in the Novice, adept and master tab.
   
You can create your own abilities but in order to use the features of the system, you'll have to use the Abilities, powers and traits included in the compendiums. 

\n

\n

Abilities

\n

Some abilities and traits, when given to a character (PC and NPC), will have effect on her character sheet and / or on dialog windows.

\n

Dominate, Feat of strength, Feint, Knife Play, Sixthsense, Strong gift, Tactician

\n

Defense and attack attribute will be changed when the character uses relevant weapons.

\n

Shield fighter, Staff fighting, Steel throw, Natural warrior, Natural weapon

\n

Damage value of the weapon will be increased, and/or defense value. Please note that the extra bonus of Staff fighting when using a wooden staff or a mystic staff isn't included (please add +1 defense in the bonus tab of the relevant weapons).

\n

Man-at-arms, Armored, Robust, Survival instinct

\n

Protection value of the armor will be increased.

\n

Colossal, Undead, Spirit form, Swarm

\n

Those traits will apply damage reduction when using Enhanced Combat (see Enhanced combat option) Damage value of the weapon will be increased, and defense value. Please note that the extra bonus of Staff fighting when using a wooden staff or a mystic staff isn't included (please add +1 defense in the bonus tab of the relevant weapons).

\n

Beast Lore, Backstab, Colossal, Corrupting attack, Feat of strength, Hunter's instinct, Iron Fist, Knife Play, Natural Warrior, Rapid Fire, Robust

\n

When using Enhanced Combat option, having those abilities or traits and using the right weapon type will make specific options available in the attack window.

\n

\n

Using Powers

\n

Powers can be activated by clicking on the icon with a green border on the character sheet (see Adding Abilities, Traits, Boons and Burdens), or opening the power and clicking on the orange dice of the item sheet (shown below).
   
Power activation is a WIP.
For now, only those active powers are supported:
Anathema, blessed shield, brimstone cascade, bend will, black bolt, confusion, curse, dancing weapon, entangling vines, holy aura, inherit wound, larvae boils, lay on hands, levitate, maltransformation, Prios burning glass, tormenting spirits, unnoticeable
the abilities:
Alchemy, acrobatics, berserker, dominate, leader, loremaster, medicus, poisoner, quickdraw, recovery, witchsight.
the traits:
Poisonous, Regeneration, Shapeshifter, Wisdom of the ages.

When you activate a power, it will take in account the relevant abilities of the character and its target (leader ability, rapid reflexes, steadfast, traditions, impeding armour...). It will open a dialog window for the acting player asking a few questions:
   

\n\n

Most roll should be left by default.
Than the roll is made, and result is announced in the chat.
   
Corruption is calculated taking into account the level in Theurgy, Wizardry, Witchcraft, Blessings, Sorcery.
If the result have effects on a token (damage, healing, corruption, stutus effects...) the gamemaster gets a chat entry with a button
   
Clicking the button will automaticaly affect the results of the power to the tokens: damage will be substracted from toughness, temporary corruption added, etc.
In order to do chain effects, you'll have to cast the power on each target, checking the \"maintained\" box after the first target.

\n

Power and Abilities specifics:

\n

Anathema

\n

Anathema can be used with or without a target. The target should be the opposing caster.

\n

Berserker

\n

When using this ability, the effects will automaticaly modify the combat values of the character (armor, defense, damage). Use the abality again to revert to normal.

\n

Brimstone cascade

\n

When striking multiple targets, use the power several times, changing the target each time. After the first target, use the \"maintain power\" option so the casting character won't get corruption.

\n

Blessed Shield

\n

When using the power on 1 or 2 other characters (adept and master level), select them as targets before using the power. If successful, the Mystic and the target will automaticaly get an active \"blessed shield\" stackable armor. At the end of the duration of the power, just delete this item from their inventory.

\n

Dancing Weapon

\n

When using this power, the character will enter \"Dancing weapon mode\": his combat stats on defense and melee weapons will be replaced by resolute (or persuasive if relevant). Just use the power again to exit the \"Dancing weapon\" mode. Please note that clicking on the power won't generate corruption - you'll have to take care of this manually.

\n

Entangling vines

\n

It's always the caster that should initiate the roll. After the second round, the strenght of the target will be used as a resist value, as in the rules.

\n

Inherit wound

\n

Target will be healed and damage will apply to the caster. If enhanced combat is used, and the level is adept or master, poison and bleeding effects will also be transfered from target to caster.

\n

Levitate

\n

If no target are selected, the spell will be cast on self. If a target is selected and level is adept or master, the power will be cast on the target.

\n

Leader

\n

When using leader, it will trigger the adept level effect: the target will receive a \"targeted\" status effect. When any character attacks this target, damage will receive a +1d4 bonus (or +2 if attack from a NPC). Just delete the status effect on the token to remove the effect.

\n

\n

Combat

\n

There are 2 options for combat:

\n

Default Combat:

\n

As with normal attribute rolls, combat works almost the same. The player has, based on its abilities and traits, selected which attribute is used for its initiative, defense and attack. The attack is set when you add a weapon to a character, as different weapons can use different attributes.

\n

Make an Attack

\n

To make an attack with a weapon, the player clicks the weilded weapon on their character sheet under the main tab.
   
It will then bring up the attribute test dialogue, where an attribute can be selected, or, which is more common in combat, the targets defense is selected.
   
Beside the normal fields in the attribute test dialogue, the player can also choose to make this attack with Advantage as well as any damage bonuses beyond those bestowed by Advantage or the wearpon, for example Backstab. The result of the attack is then displayed in the chat window which then can be applied to the token on the battlefield.
   

\n

Defend against an attack

\n

To make a defense test against an attack, the player clicks on the equipped armor, which then opens the attribute test dialogue. This dialogue has a subtle difference that it also has a checkmark if the people attacking the player have Advantage, i.e. the player is at Disadvantage.
   
If the defense is unsuccessful, then it will automatically roll the armor roll and display it in the chat window.
   
In the example above, Abesina failed her defense test and her robes protects her for 2 points of damage.

\n



\n

Enhanced Combat:

\n

Enhance combat can be activated by selecting the option in the system settings. The purpose of EC is to accelerate combat, limit Players and GM fidgeting with character sheets, and vastly simplify NPC management.

\n

This quick video explains how to use the enhanced combat

\n



it is still a Work in Progress. Not every passive abilities have been integrated.

Armor and weapons have to be equipped by the PCs and NPCs in order to be taken in account.
It automaticaly processes the attributes, traits  and abilities of the attacker and its target, rolls the dice, evaluate damage.

The attribute used for attacking has to be defined on the weapon sheet. The defense attribute has to be selected on the character sheet. PCs and NPCs armors and weapons value have to be entered as 'dice' (for example a sword damage value would be 1d8 - the system will automaticaly transform this value to a fixed 4 when a NPC attacks a PC)

If a player character attacks a NPC, the player has to select its target, then click on a weapon to do the attack. If a NPC attacks a PC, the GM select the target, then clicks on the NPC weapon.

A dialog window will appear, asking which abilities of the attacker to use (iron fist, hunter's instinct...).
   
Then the attack roll is made, and if it's a hit, damage is roll. Result is printed in the chat. If it's an NPC attack against a PC, then the damage is fixed and the armor is rolled, as per the rules - please note the Player don't have to initiate the defense and armor roll.
   
The gamemaster then gets a chat entry with a button
   
Clicking the button will automaticaly affect the results of the attack to the tokens: damage will be substracted from toughness, status icons like poison and bleed added, etc. We recommend using the \"Status icons counters\" in order to have the duration of those effects displayed on the token and in the combat tracker.
The \"Undead\", \"Spirit form\" and \"swarm\" traits will apply damage reduction. Remember to check the \"magical\" quality box on artifact weapons, so their damage will be evaluated as such.
Alternative damage will reduce the relevant attribute (it will use the \"modifier\" field of the attribute sheet.)

\n



\n

Initiative:

\n

The initiative used in the Symbaroum for FVTT system works the same way than stated in the rulebook, but in order to integrate in FVTT it uses the formula:
initiative = quick + vigilant x 0.01.
This simple formula produces the same order than the rulebook. So initiative 15.10 means Quick 15, Vigilant 10. It is possible to change the base attribute used for the formula in the character sheet (for characters with the Tactician ability, for example).

\n

Favour/Disfavour:

\n

The term favour/disfavour used in dialog boxes refers to situation when the acting character either rolls 2 dice and keeps the best (Hunter's instinct ability, steadfast resistance, ...) or in cases where disfavour (cursed, pariah, ...) is used, it keeps the worst. 

\n

Bonuses

\n

All items can have different bonuses configurable. These can be used by the GM for various purposes, ranging from giving boosts or penalties to attributes, to increasing or decreasing toughness, changing corruption values. It can also be used to reduce the experience cost of something or even give a player experience without changing their total experience earned (only their unspent). When viewing any items, it will have a bonus section where an items behaviour can be changed. 
   
It should be noted that Powers & Abilities give bonuses as soon as they are on the character sheet. Bonuses on armor, weapons and items are only given when they are equipped. If an item gives a bonus to an attribute, then it is included in the printed \"total\" value and listed in the corresponding tooltip. For example, here is a character with ability \"Exc Attribute Vigilant\" novice, and a base Vigilant value of 15:
   

\n

System settings

\n

The following system settings exist - you can turn on and of to your hearts content or as you see fit for running your campaign.
Configure Symbaroum Settings
This is a user setting which allows some modification of sheet backgrounds and colorations (see below).
World Template Version
This is a developer function - do not change unless you really intend it. World System Version
This is a developer function - do not change unless you really intend it. Combat Enhancement
Turns the automated combat enhancement on or off. Please note that if you turn it on, the game will work a bit differently and players no longer rolls defense Always able to succeed or fail
If you want the system to always succeed on a roll of 1 or fail on a roll of 20 Optional Critical Rolls
Enables the normal critical rolls as detailed in the optional rule in the core book. Optional Rare Critical Rolls
Enables the more rarer criticals as detailed in the optional rule in the core book. Allow crits for non-combat
This enables the system to print a message when there is a critical success or failure with normal attribute rolls. Crit ratio is the same as for combat Combat settings for rolls
Enables QoL enhancements for keeping modifiers between strikes Attribute settings for rolls
Enables QoL enhancements for keeping modifiers between specific attribute rolls Show modifiers in targetted
In attribute rolls, or combat rolls, shows the modifier the versus attribute gives Show NPC modifiers
Shows the character sheet for NPC/monster sheets as in the core book (i.e. from +5 to -5) Allow reference modifications
Only shows for GM and shows a reference field on abilities, traits, etc. This reference is used for the automation of abilities.
Supress Iniatiative Rolls
While Symbaroum do not roll for iniatiative, the system has to do so for the tie breaker. This just turns of the visibility of this roll from chat. Manually select iniatiative
Allows manual selection of the iniatiative attribute.
Add Symbaroum Settings button
This adds a Symbaroum setting button under the Foundry Configuration sidebar

\n

 

\n

Configure Symbaroum Settings

\n

Under the configuration sidebar there is a now a \"Configure Symbaroum Settings\" button which is visible to all users.
   
Selecting this a user can change the character/NPC backgrounds as well as the title, editable and non-editable field colours.
   
Selecting the \"Plain Color Picker\" on any of the drop downs will display a color choice box for that item.
A pop-up colour selector will appear when the box is clicked on. From there you can select any colour/brightness combination you want.
   
Once you have made your selection(s) click the \"Submit\" button to enable them. In the event you make a choice you are unhappy with there is a selection of reset buttons to take you back to the default.

\n

 

\n

Macros

\n

The system comes with a set of macros that might be useful at your gaming table.
Add Exp
A macro for the GameMaster to add Experience to a party. You can select tokesn, or if no tokens are selected, it gives you a list of player characters from your actor catalog.
Alternate Damage With this macro, you can deal Alternative Damage to a given token.
Name Generator
The macro will generate and publish a set of 10 Symbaroum-esque names based on the culture selected for a quick generation of names. There are x cultures available - Ambrian (feminine, masculine, noble), Barbarian (feminine, masculine), Symbaroum, Abducted Human (feminine, masculine), Dwarf (firstnames, surname), Elf (feminine, masculine, Goblin (feminine, masculine), Troll (normal, ancient).
NPC Importer
The macro can import NPC or Monsters from the Core book, many adventures and the Monster Codex via copy & paste. All you need to do is validate abilities and put the gear on the character. Check the text on the macro on how to use it.
Pay for re-roll
Using the alternative rules for paying for re-rolls with either experience or permanent corruption. It will prompt the player to select the character they own, or the token they have selected. Note that this macro only pays the cost for the re-roll, it does not perform another re-roll.
Reset temporary corruption
Allows the GM to reset the temporary corruption on the selected token, or if no tokens are selected, to any number of player characters in their actor catalog.
Roll attribute
Allows a player to select attribute and character to roll without opening their character sheet.
Toggle player/monster
Toggles a named player or monster in the actor catalog between being a player or monster character

\n



\n

Supported Modules

\n

Dice-so-nice

\n

Status icons counters

\n

Token action hud

\n
","folder":null,"sort":0,"permission":{"default":0,"1qImqL9kPxfUOSjY":3,"eT9Fn0zC6QGMvWEk":3},"flags":{"core":{"sourceId":"JournalEntry.WGo6jbcbdCmTy0su"},"symbaroum":{"ver":"3.0.8"}}} diff --git a/script/common/actor.js b/script/common/actor.js index 0e07c976..297359d3 100644 --- a/script/common/actor.js +++ b/script/common/actor.js @@ -1,4 +1,4 @@ -import { attackRoll, getPowerLevel, markScripted } from './item.js'; +import { attackRoll, checkResoluteModifiers, getPowerLevel, markScripted } from './item.js'; import { prepareRollAttribute } from "../common/dialog.js"; import { upgradeDice } from './roll.js'; @@ -99,8 +99,13 @@ export class SymbaroumActor extends Actor { data.data.attributes[aKey].bonus = data.data.bonus[aKey]; data.data.attributes[aKey].total = data.data.attributes[aKey].value + data.data.bonus[aKey] + data.data.attributes[aKey].temporaryMod; + data.data.attributes[aKey].modifier = 10 - data.data.attributes[aKey].total; if(data.type === "monster") { - data.data.attributes[aKey].msg = game.i18n.localize("TOOLTIP.BONUS_TOTAL")+ ` ${data.data.attributes[aKey].total}`+" ("+(10 - data.data.attributes[aKey].total)+")
"+game.i18n.localize("ATTRIBUTE.BASE")+"("+data.data.attributes[aKey].value.toString()+")"+`${data.data.bonus[aKey + "_msg"]}`; + let modSign = ""; + if(data.data.attributes[aKey].modifier > 0) { + modSign = "+"; + } + data.data.attributes[aKey].msg = game.i18n.localize("TOOLTIP.BONUS_TOTAL")+ ` ${data.data.attributes[aKey].total} (${modSign}${data.data.attributes[aKey].modifier})
${game.i18n.localize("ATTRIBUTE.BASE")}(${data.data.attributes[aKey].value.toString()}) ${data.data.bonus[aKey + "_msg"]}`; } else { data.data.attributes[aKey].msg = game.i18n.localize("TOOLTIP.BONUS_TOTAL")+ ` ${data.data.attributes[aKey].total}`+"
"+game.i18n.localize("ATTRIBUTE.BASE")+"("+data.data.attributes[aKey].value.toString()+")"+`${data.data.bonus[aKey + "_msg"]}`; } @@ -112,8 +117,8 @@ export class SymbaroumActor extends Actor { let sturdy = this.data.items.filter(item => item.data.data.reference === "sturdy"); if(sturdy.length != 0){ let sturdyLvl = getPowerLevel(sturdy[0]).level; - if(sturdyLvl == 1) data.data.health.toughness.max = Math.ceil(strong*(1.5)); - else data.data.health.toughness.max = strong*(sturdyLvl) + if(sturdyLvl == 1) data.data.health.toughness.max = Math.ceil(strong*(1.5)) + data.data.bonus.toughness.max; + else data.data.health.toughness.max = strong*(sturdyLvl) + data.data.bonus.toughness.max; } else data.data.health.toughness.max = (strong > 10 ? strong : 10) + data.data.bonus.toughness.max; let featSt = this.data.items.filter(item => item.data.data.reference === "featofstrength"); @@ -123,12 +128,14 @@ export class SymbaroumActor extends Actor { } let noPain = this.data.items.filter(element => element.data.data.reference === "nopainthreshold"); - if(noPain.length > 0){ + data.hasNoPainThreshold = noPain.length > 0; + if(noPain.length > 0){ data.data.health.toughness.threshold = 0; } else data.data.health.toughness.threshold = Math.ceil(strong / 2) + data.data.bonus.toughness.threshold; // Corruption Max let fullCorrupt = (this.data.items.filter(element => element.data.data.reference === "thoroughlycorrupt")); + data.isThoroughlyCorrupt = fullCorrupt.length > 0; if(fullCorrupt.length > 0){ data.data.health.corruption.threshold = 0; data.data.health.corruption.max = 0; @@ -153,7 +160,7 @@ export class SymbaroumActor extends Actor { let activeArmor = this._getActiveArmor(data, extraArmorBonus); let defense = this._getDefenseValue(data, activeArmor); let damageProt = this._getDamageProtection(); - let totDefense = defense.attDefValue - activeArmor.impeding + data.data.bonus.defense; + let totDefense = defense.attDefValue - activeArmor.impeding + data.data.bonus.defense; data.data.combat = { id: activeArmor.id, @@ -165,6 +172,10 @@ export class SymbaroumActor extends Actor { impeding: activeArmor.impeding, tooltipProt: activeArmor.tooltip, defense: totDefense, + defenseAttribute: { + attribute: defense.attribute, + label: data.data.attributes[defense.attribute].label + }, defmod: (10 - totDefense), msg: defense.defMsg, damageProt: damageProt @@ -175,10 +186,11 @@ export class SymbaroumActor extends Actor { data.data.weapons = this.evaluateWeapons(activeWeapons); } if(!game.settings.get('symbaroum', 'manualInitValue')){ - this._getInitiativeAttribute() + this._getInitiativeAttribute(); } let attributeInit = data.data.initiative.attribute.toLowerCase(); data.data.initiative.value = ((data.data.attributes[attributeInit].total) + (data.data.attributes.vigilant.total /100)) ; + data.data.initiative.label = data.data.attributes[attributeInit].label; let rrAbility = this.items.filter(item => item.data.data.reference === "rapidreflexes"); if(rrAbility.length != 0){ @@ -192,7 +204,7 @@ export class SymbaroumActor extends Actor { this.data.numRituals = this.data.numRituals + 1; if( this.data.numRituals > 6 ) { // This needs to check if running with alternative rules for additional rituals, APG p.102 - item.data.bonus.experience.cost = game.settings.get('symbaroum', 'optionalMoreRituals') ? 10 : 0; + item.data.bonus.experience.cost = game.settings.get('symbaroum', 'optionalMoreRituals') ? 10 : 0; } } @@ -263,6 +275,7 @@ export class SymbaroumActor extends Actor { if(colossal.length > 0){ colossalLvl = getPowerLevel(colossal[0]).level; } + let flagDancing = this.getFlag(game.system.id, 'dancingweapon'); // check for abilities that changes attack attribute let dominate = this.data.items.filter(element => element.data.data?.reference === "dominate"); let feint = this.data.items.filter(element => element.data.data?.reference === "feint"); @@ -320,6 +333,11 @@ export class SymbaroumActor extends Actor { attribute = "strong"; } } + if(flagDancing){ + let resoluteMod = checkResoluteModifiers(this, "", true, false); + attribute = resoluteMod.bestAttributeName; + tooltip += game.i18n.localize("POWER_LABEL.DANCING_WEAPON") + ", "; + } if(doAlternativeDamage){ let alternativeDamageLvl = 0; let alternativeDamage = this.data.items.filter(element => element.data.data.reference === "alternativedamage"); @@ -469,6 +487,10 @@ export class SymbaroumActor extends Actor { npcDamageExt+=1; tooltip += game.i18n.localize("QUALITY.DEEPIMPACT") + ", "; } + let attributeMod = 0; + if(item.data.data.qualities.precise) { + attributeMod = 1; + } let itemID = item.id; weaponArray.push({ id: itemID, @@ -477,6 +499,8 @@ export class SymbaroumActor extends Actor { img: item.data.img, attribute: attribute, attributeLabel: this.data.data.attributes[attribute].label, + attributeValue: this.data.data.attributes[attribute].total + attributeMod, + attributeMod: (10 - attributeMod - this.data.data.attributes[attribute].total), tooltip : tooltip, isActive: item.data.isActive, isEquipped: item.data.isEquipped, @@ -634,6 +658,14 @@ export class SymbaroumActor extends Actor { attDefValue = data.data.attributes[attributeDef].total } } + + let flagDancing = this.getFlag(game.system.id, 'dancingweapon'); + if(flagDancing){ + let resoluteMod = checkResoluteModifiers(this, "", true, false); + attributeDef = resoluteMod.bestAttributeName; + attDefValue = data.data.attributes[attributeDef].total; + } + data.data.defense.attribute = attributeDef; data.data.defense.attributelabel = data.data.attributes[attributeDef].label; @@ -668,6 +700,7 @@ export class SymbaroumActor extends Actor { } } return({ + attribute: attributeDef, attDefValue: attDefValue, defMsg: defMsg }) diff --git a/script/common/config.js b/script/common/config.js index b09e8cec..a8275ff6 100644 --- a/script/common/config.js +++ b/script/common/config.js @@ -14,4 +14,200 @@ SYMBAROUM.itemSortOrder = [ "artifact" ]; +// Ability definitions +SYMBAROUM.abilitiesList = { + "none": 'ABILITY_LABEL.DEFAULT', + "acrobatics": 'ABILITY_LABEL.ACROBATICS', + "alchemy": 'ABILITY_LABEL.ALCHEMY', + "agilecombat": 'ABILITY_LABEL.AGILE_COMBAT', + "armoredmystic": 'ABILITY_LABEL.ARMORED_MYSTIC', + "arrowjab": 'ABILITY_LABEL.ARROW_JAB', + "artifactcrafting": 'ABILITY_LABEL.ARTIFACT_CRAFTING', + "axeartist": 'ABILITY_LABEL.AXE_ARTIST', + "backstab": 'ABILITY_LABEL.BACKSTAB', + "beastlore": 'ABILITY_LABEL.BEAST_LORE', + "berserker": 'ABILITY_LABEL.BERSERKER', + "blacksmith": 'ABILITY_LABEL.BLACKSMITH', + "bloodcombat": 'ABILITY_LABEL.BLOOD_COMBAT', + "bodyguard": 'ABILITY_LABEL.BODYGUARD', + "channeling": 'ABILITY_LABEL.CHANNELING', + "cheapshot": 'ABILITY_LABEL.CHEAP_SHOT', + "dominate": 'ABILITY_LABEL.DOMINATE', + "ensnare": 'ABILITY_LABEL.ENSNARE', + "equestrian": 'ABILITY_LABEL.EQUESTRIAN', + "exceptionalattribute": 'ABILITY_LABEL.EX_ATTRIBUTE', + "featofstrength": 'ABILITY_LABEL.FEAT_STRENGTH', + "feint": 'ABILITY_LABEL.FEINT', + "flailer": 'ABILITY_LABEL.FLAILER', + "hammerrhythm": 'ABILITY_LABEL.HAMMER_RHYTHM', + "huntersinstinct": 'ABILITY_LABEL.HUNTER_INSTINCT', + "ironfist": 'ABILITY_LABEL.IRON_FIST', + "knifeplay": 'ABILITY_LABEL.KNIFE_PLAY', + "leader": 'ABILITY_LABEL.LEADER', + "loremaster": 'ABILITY_LABEL.LOREMASTER', + "manatarms": 'ABILITY_LABEL.MAN-AT-ARMS', + "mantledance": 'ABILITY_LABEL.MANTLE_DANCE', + "marksman": 'ABILITY_LABEL.MARKSMAN', + "medicus": 'ABILITY_LABEL.MEDICUS', + "naturalwarrior": 'ABILITY_LABEL.NATURAL_WARRIOR', + "opportunist": 'ABILITY_LABEL.OPPORTUNIST', + "poisoner": 'ABILITY_LABEL.POISONER', + "polearmmastery": 'ABILITY_LABEL.POLEARM_MASTERY', + "pyrotechnics": 'ABILITY_LABEL.PYROTECHNICS', + "quickdraw": 'ABILITY_LABEL.QUICK_DRAW', + "rapidfire": 'ABILITY_LABEL.RAPID_FIRE', + "rapidreflexes": 'ABILITY_LABEL.RAPID_REFLEXES', + "recovery": 'ABILITY_LABEL.RECOVERY', + "ritualist": 'ABILITY_LABEL.RITUALIST', + "runetattoo": 'ABILITY_LABEL.RUNE_TATTOO', + "shieldfighter": 'ABILITY_LABEL.SHIELD_FIGHTER', + "siegeexpert": 'ABILITY_LABEL.SIEGE_EXPERT', + "sixthsense": 'ABILITY_LABEL.SIXTH_SENSE', + "sorcery": 'ABILITY_LABEL.SORCERY', + "stafffighting": 'ABILITY_LABEL.STAFF_FIGHTING', + "staffmagic": 'ABILITY_LABEL.STAFF_MAGIC', + "steadfast": 'ABILITY_LABEL.STEADFAST', + "steelthrow": 'ABILITY_LABEL.STEEL_THROW', + "strangler": 'ABILITY_LABEL.STRANGLER', + "stronggift": 'ABILITY_LABEL.STRONG_GIFT', + "swordsaint": 'ABILITY_LABEL.SWORD_SAINT', + "symbolism": 'ABILITY_LABEL.SYMBOLISM', + "tactician": 'ABILITY_LABEL.TACTICIAN', + "theurgy": 'ABILITY_LABEL.THEURGY', + "trapper": 'ABILITY_LABEL.TRAPPER', + "trickarchery": 'ABILITY_LABEL.TRICK_ARCHERY', + "trollsinging": 'ABILITY_LABEL.TROLL_SINGING', + "twinattack": 'ABILITY_LABEL.TWIN_ATTACK', + "twohandedforce": 'ABILITY_LABEL.2HANDED_FORCE', + "witchcraft": 'ABILITY_LABEL.WITCHCRAFT', + "witchsight": 'ABILITY_LABEL.WITCHSIGHT', + "wizardry": 'ABILITY_LABEL.WIZARDRY', + "whipfighter": 'ABILITY_LABEL.WHIPFIGHTER', + "wrestling": 'ABILITY_LABEL.WRESTLING', + "twohandedfinesse": 'ABILITY_LABEL.2HANDED_FINESSE', + "blessings": 'ABILITY_LABEL.BLESSINGS' +}; + +SYMBAROUM.powersList = { + "none": 'ABILITY_LABEL.DEFAULT', + "anathema": 'POWER_LABEL.ANATHEMA', + "banishingseal": 'POWER_LABEL.BANISHING_SEAL', + "bendwill": 'POWER_LABEL.BEND_WILL', + "blackbolt": 'POWER_LABEL.BLACK_BOLT', + "blackbreath": 'POWER_LABEL.BLACK_BREATH', + "blessedshield": 'POWER_LABEL.BLESSED_SHIELD', + "blindingsymbol": 'POWER_LABEL.BLINDING_SYMBOL', + "brimstonecascade": 'POWER_LABEL.BRIMSTONE_CASCADE', + "combathymn": 'POWER_LABEL.COMBAT_HYMN', + "confusion": 'POWER_LABEL.CONFUSION', + "curse": 'POWER_LABEL.CURSE', + "dancingweapon": 'POWER_LABEL.DANCING_WEAPON', + "drainingglyph": 'POWER_LABEL.DRAINING_GLYPH', + "entanglingvines": 'POWER_LABEL.ENTANGLING_VINES', + "exorcize": 'POWER_LABEL.EXORCIZE', + "firesoul": 'POWER_LABEL.FIRE_SOUL', + "flamewall": 'POWER_LABEL.FLAME_WALL', + "heroichymn": 'POWER_LABEL.HEROIC_HYMN', + "holyaura": 'POWER_LABEL.HOLY_AURA', + "illusorycorrection": 'POWER_LABEL.ILLUSORY_CORRECTION', + "inheritwound": 'POWER_LABEL.INHERIT_WOUND', + "larvaeboils": 'POWER_LABEL.LARVAE_BOILS', + "layonhands": 'POWER_LABEL.LAY_ON_HANDS', + "levitate": 'POWER_LABEL.LEVITATE', + "lifegiver": 'POWER_LABEL.LIFEGIVER', + "maltransformation": 'POWER_LABEL.MALTRANSFORMATION', + "mindthrow": 'POWER_LABEL.MIND-THROW', + "mirroring": 'POWER_LABEL.MIRRORING', + "naturesembrace": 'POWER_LABEL.NATURES_EMBRACE', + "priosburningglass": 'POWER_LABEL.PRIOS_BURNING_GLASS', + "protectiverunes": 'POWER_LABEL.PROTECTIVE_RUNES', + "psychicthrust": 'POWER_LABEL.PSYCHIC_THRUST', + "purgatory": 'POWER_LABEL.PURGATORY', + "retribution": 'POWER_LABEL.RETRIBUTION', + "revenantstrike": 'POWER_LABEL.REVENANT_STRIKE', + "shapeshift": 'POWER_LABEL.SHAPESHIFT', + "sphere": 'POWER_LABEL.SPHERE', + "spiritwalk": 'POWER_LABEL.SPIRIT_WALK', + "staffprojectile": 'POWER_LABEL.STAFF_PROJECTILE', + "stormarrow": 'POWER_LABEL.STORM_ARROW', + "teleport": 'POWER_LABEL.TELEPORT', + "thorncloak": 'POWER_LABEL.THORN_CLOAK', + "tormentingspirits": 'POWER_LABEL.TORMENTING_SPIRITS', + "trueform": 'POWER_LABEL.TRUE_FORM', + "unholyaura": 'POWER_LABEL.UNHOLY_AURA', + "unnoticeable": 'POWER_LABEL.UNNOTICEABLE', + "weakeninghymn": 'POWER_LABEL.WEAKENING_HYMN', + "wildhunt": 'POWER_LABEL.WILD_HUNT', + "battlesymbol": 'POWER_LABEL.BATTLE_SYMBOL', + "earthbinding": 'POWER_LABEL.EARTH_BINDING', + "markoftorment": 'POWER_LABEL.MARK_OF_TORMENT', + "serenity": 'POWER_LABEL.SERENITY', + "earthshot": 'POWER_LABEL.EARTH_SHOT', + "witchhammer": 'POWER_LABEL.WITCH_HAMMER' +}; + +SYMBAROUM.traitsList = { + "acidicattack": 'TRAIT_LABEL.ACIDICATTACK', + "acidicblood": 'TRAIT_LABEL.ACIDICBLOOD', + "alternativedamage": 'TRAIT_LABEL.ALTERNATIVEDAMAGE', + "amphibian": 'TRAIT_LABEL.AMPHIBIAN', + "armored": 'TRAIT_LABEL.ARMORED', + "avengingsuccessor": 'TRAIT_LABEL.AVENGINGSUCCESSOR', + "bloodlust": 'TRAIT_LABEL.BLOODLUST', + "carapace": 'TRAIT_LABEL.CARAPACE', + "collectivepower": 'TRAIT_LABEL.COLLECTIVEPOWER', + "colossal": 'TRAIT_LABEL.COLOSSAL', + "companions": 'TRAIT_LABEL.COMPANIONS', + "corruptingattack": 'TRAIT_LABEL.CORRUPTINGATTACK', + "corruptionhoarder": 'TRAIT_LABEL.CORRUPTIONHOARDER', + "corruptionsensitive": 'TRAIT_LABEL.CORRUPTIONSENSITIVE', + "crushingembrace": 'TRAIT_LABEL.CRUSHINGEMBRACE', + "deadlybreath": 'TRAIT_LABEL.DEADLYBREATH', + "deathstruggle": 'TRAIT_LABEL.DEATHSTRUGGLE', + "devour": 'TRAIT_LABEL.DEVOUR', + "diminutive": 'TRAIT_LABEL.DIMINUTIVE', + "enthrall": 'TRAIT_LABEL.ENTHRALL', + "earthbound": 'TRAIT_LABEL.EARTHBOUND', + "freespirit": 'TRAIT_LABEL.FREESPIRIT', + "grapplingtongue": 'TRAIT_LABEL.GRAPPLINGTONGUE', + "gravelycold": 'TRAIT_LABEL.GRAVELYCOLD', + "harmfulaura": 'TRAIT_LABEL.HARMFULAURA', + "haunting": 'TRAIT_LABEL.HAUNTING', + "infectious": 'TRAIT_LABEL.INFECTIOUS', + "infestation": 'TRAIT_LABEL.INFESTATION', + "invisibility": 'TRAIT_LABEL.INVISIBILITY', + "leap": 'TRAIT_LABEL.LEAP', + "lifesense": 'TRAIT_LABEL.LIFESENSE', + "manifestation": 'TRAIT_LABEL.MANIFESTATION', + "many-headed": 'TRAIT_LABEL.MANYHEADED', + "metamorphosis": 'TRAIT_LABEL.METAMORPHOSIS', + "mysticalresistance": 'TRAIT_LABEL.MYSTICALRESISTANCE', + "naturalweapon": 'TRAIT_LABEL.NATURALWEAPON', + "nightperception": 'TRAIT_LABEL.NIGHTPERCEPTION', + "observant": 'TRAIT_LABEL.OBSERVANT', + "paralyzingvenom": 'TRAIT_LABEL.PARALYZINGVENOM', + "piercingattack": 'TRAIT_LABEL.PIERCINGATTACK', + "poisonous": 'TRAIT_LABEL.POISONOUS', + "poisonspit": 'TRAIT_LABEL.POISONSPIT', + "prehensileclaws": 'TRAIT_LABEL.PREHENSILECLAWS', + "rampage": 'TRAIT_LABEL.RAMPAGE', + "regeneration": 'TRAIT_LABEL.REGENERATION', + "robust": 'TRAIT_LABEL.ROBUST', + "rootwall": 'TRAIT_LABEL.ROOTWALL', + "shapeshifter": 'TRAIT_LABEL.SHAPESHIFTER', + "spiritform": 'TRAIT_LABEL.SPIRITFORM', + "sturdy": 'TRAIT_LABEL.STURDY', + "summoner": 'TRAIT_LABEL.SUMMONER', + "survivalinstinct": 'TRAIT_LABEL.SURVIVALINSTINCT', + "swarm": 'TRAIT_LABEL.SWARM', + "swift": 'TRAIT_LABEL.SWIFT', + "terrify": 'TRAIT_LABEL.TERRIFY', + "tunneler": 'TRAIT_LABEL.TUNNELER', + "undead": 'TRAIT_LABEL.UNDEAD', + "web": 'TRAIT_LABEL.WEB', + "wings": 'TRAIT_LABEL.WINGS', + "wisdomages": 'TRAIT_LABEL.WISDOM_AGES', + "wrecker": 'TRAIT_LABEL.WRECKER' +}; + diff --git a/script/common/devmsg.js b/script/common/devmsg.js index 8ed35949..99482851 100644 --- a/script/common/devmsg.js +++ b/script/common/devmsg.js @@ -26,11 +26,11 @@ export function sendDevMessage() } latestVersion = Math.max(latestVersion, msgenvelope.version); } - console.log("latestVersion after "+latestVersion); + console.info("latestVersion after "+latestVersion); game.settings.set('symbaroum', 'symbaroumDevMessageVersionNumber', latestVersion); }) .fail(function(data) { - console.log("Could not retreive Symbaroum news Message:"+JSON.stringify(data)); + console.error("Could not retreive Symbaroum news Message:"+JSON.stringify(data)); }); } } \ No newline at end of file diff --git a/script/common/dialog.js b/script/common/dialog.js index a24a10f3..f1c02f86 100644 --- a/script/common/dialog.js +++ b/script/common/dialog.js @@ -7,11 +7,22 @@ export async function prepareRollAttribute(actor, attributeName, armor, weapon) let attri_defaults = getRollDefaults(attributeName,armor !== null, weapon !== null); let attri_mods = getVersusModifiers(targetTokens); let askImpeding = actor.data.data.combat.impeding !== 0 && weapon === null && armor === null; + let weaponModifier = {}; + weaponModifier.attribute = []; + weaponModifier.attributeModifiers = []; + weaponModifier.damageChoices = []; + weaponModifier.damageBonus = []; + + if(weapon !== null) + { + calculateWeaponModifiers(actor, weapon, weaponModifier); + } const html = await renderTemplate('systems/symbaroum/template/chat/dialog.html', { "hasTarget": targetTokens.length > 0, "isWeaponRoll" : weapon !== null, "weaponDamage" : weapon !== null ? weapon.damage.pc:"", + "weaponModifier" : weaponModifier, "isArmorRoll" : armor !== null, "askImpeding" : askImpeding, "choices": { "0": game.i18n.localize("DIALOG.FAVOUR_NORMAL"), "-1":game.i18n.localize("DIALOG.FAVOUR_DISFAVOUR"), "1":game.i18n.localize("DIALOG.FAVOUR_FAVOUR")}, @@ -19,8 +30,7 @@ export async function prepareRollAttribute(actor, attributeName, armor, weapon) "attri_mods" : attri_mods, "roll_defaults": attri_defaults }); - console.log(armor); - console.log(weapon); + let dialog = new Dialog({ title: getAttributeLabel(actor, attributeName), content: html, @@ -43,13 +53,33 @@ export async function prepareRollAttribute(actor, attributeName, armor, weapon) } attri_defaults.advantage = hasAdvantage ? "checked":""; const advantage = hasAdvantage; - + let hasDamModifier = html.find("#dammodifier").length > 0; let damModifier = ""; if(hasDamModifier) { damModifier = html.find("#dammodifier")[0].value; } attri_defaults.additionalModifier = damModifier; + + for(let bonus of weaponModifier.damageBonus) { + damModifier += `${bonus.damageModifier}[${bonus.label}]`; + } + for(let optionalBonus of weaponModifier.damageChoices) { + if(optionalBonus.type === "check") { + // Find if the box is checked + let ticked = html.find(`#${optionalBonus.label}`); + if( ticked.length > 0 && ticked[0].checked ) + damModifier += ticked[0].value; + } else if( optionalBonus.type === "radio") { + // Find the selected radio button + let radioSelection = html.find("input[name='"+optionalBonus.identifier+"']"); + for( let f of radioSelection) { + if( f.checked ) + damModifier += f.value; + } + } + } + let favours = html.find("input[name='favour']"); let fvalue = 0; @@ -63,14 +93,15 @@ export async function prepareRollAttribute(actor, attributeName, armor, weapon) if(isNaN(modifier)) { modifier = 0; } - attri_defaults.modifier = modifier; + attri_defaults.modifier = modifier; + if(askImpeding){ if(html.find("#impeding")[0].checked){ modifier = modifier - actor.data.data.combat.impeding; } attri_defaults.impeding = html.find("#impeding")[0].checked ? "checked":""; } - + // console.log("Damage bonus",damModifier); await rollAttribute(actor, attributeName, getTarget(), targetAttributeName, favour, modifier, armor, weapon, advantage, damModifier); }, }, @@ -134,6 +165,95 @@ function getVersusModifiers(targetTokens) { }; } +function calculateWeaponModifiers(actor, weapon, weaponModifier) +{ + let robust = actor.data.items.filter(element => element.data.data?.reference === "robust"); + // If actor has Robust (and weapon is melee) + if(robust.length > 0 && weapon.isMelee) { + let dice = robust[0].getLevel().level; + let choice = {}; + choice["label"] = robust[0].name; + choice["type"] = "check"; + let damMod = `+1d${(dice+1)*2}`; + let damlabel = `(${damMod})`; + damMod = `${damMod}[${robust[0].name}]`; + choice["alternatives"] = { + "label":damlabel, + "damMod":damMod + }; + choice["restrition"] = "1st-attack"; // Only apply damage bonus to first attack + weaponModifier.damageChoices.push(choice); + } + + let ironFist = actor.data.items.filter(element => element.data.data?.reference === "ironfist"); + if( ironFist.length > 0 && weapon.isMelee) { + // If actor has Iron Fist Master (and weapon is melee) + let power = ironFist[0].getLevel(); + if( power.level > 0) { + weaponModifier.attribute.push( { + attribute:"strong", + label: ironFist[0].name + }); + } + if( power.level === 2) { + let bonus = {}; + bonus.label = ironFist[0].name; + bonus.damageModifier = "+1d4"; + // No choice + weaponModifier.damageBonus.push(bonus); + } else if( power.level === 3) { + let choice = {}; + choice["type"] = "radio"; + choice["label"] = ironFist[0].name; + choice["identifier"] = "weapMod_"+ironFist[0].name; + choice["defaultSelect"] = `+1d4[${ironFist[0].name}]`; + choice["alternatives"] = {}; + choice["alternatives"][`+1d4[${ironFist[0].name}]`] = `${ironFist[0].name} - ${power.lvlName} (1d4)`; + choice["alternatives"][`+1d8[${ironFist[0].name}]`] = `${ironFist[0].name} - ${power.lvlName} (1d8)`; + weaponModifier.damageChoices.push(choice); + } + } + + /* + let featOfStr = actor.data.items.filter(element => element.data.data?.reference === "featofstrength"); + if( featOfStr.length > 0 && featOfStr[0].getLevel().level === 3 && weapon.isMelee) { + if(actor.data.data.health.toughness.value <= (actor.data.data.health.toughness.max/2) ) + { + let bonus = {}; + bonus.label = featOfStr[0].name; + bonus.damageModifier = "+1d4"; + weaponModifier.damageBonus.push(bonus); + } + } + */ + + let hunterInstinct = actor.items.filter(item => item.data.data?.reference === "huntersinstinct"); + + if( weapon.isDistance && hunterInstinct.length > 0 && hunterInstinct[0].getLevel().level > 1) { + let choice = {}; + choice["label"] = hunterInstinct[0].name; + choice["type"] = "check"; + let damMod = `+1d4`; + let damlabel = `(${damMod})`; + damMod = `${damMod}[${hunterInstinct[0].name}]`; + choice["alternatives"] = { + "label":damlabel, + "damMod":damMod + }; + weaponModifier.damageChoices.push(choice); + } + + if(true) { + if(weapon.qualities.precise) { + let attributeModifier = { + label: game.i18n.localize("QUALITY.PRECISE"), + modifier: "+1" + } + weaponModifier.attributeModifiers.push(attributeModifier); + } + } +} + function getTarget() { const target = game.user.targets.values().next().value; if (target === undefined) { diff --git a/script/common/handlebars.js b/script/common/handlebars.js index 4b70acb7..c6b2d502 100644 --- a/script/common/handlebars.js +++ b/script/common/handlebars.js @@ -51,7 +51,11 @@ function registerHandlebarsHelpers() { if (v1 !== v2) return options.fn(this); else return options.inverse(this); }); - + // if not + Handlebars.registerHelper('ifn', function (v1, options) { + if (!v1) return options.fn(this); + else return options.inverse(this); + }); // if equal Handlebars.registerHelper('ife', function (v1, v2, options) { if (v1 === v2) return options.fn(this); @@ -62,6 +66,12 @@ function registerHandlebarsHelpers() { if (v1 > v2) return options.fn(this); else return options.inverse(this); }); + // if all true + Handlebars.registerHelper('ifat', function (...args) { + // remove handlebar options + let options = args.pop(); + return args.indexOf(false) === -1 ? options.fn(this) : options.inverse(this); + }); Handlebars.registerHelper('keyIndex', function (str) { return 'data.power.' + str + '.description'; }); @@ -69,4 +79,14 @@ function registerHandlebarsHelpers() { let newOne = parseInt(v1) + 1; return newOne; }); + Handlebars.registerHelper('ifSetting', function (v1, options) { + if(game.settings.get('symbaroum',v1) ) return options.fn(this); + else return options.inverse(this); + }); + Handlebars.registerHelper('toFixed', function (v1, v2) { + return v1.toFixed(v2); + }); + + + } diff --git a/script/common/hooks.js b/script/common/hooks.js index 5671cf13..ed4fa28e 100644 --- a/script/common/hooks.js +++ b/script/common/hooks.js @@ -16,6 +16,9 @@ import { initializeHandlebars } from './handlebars.js'; import { migrateWorld } from './migration.js'; import { sendDevMessage } from './devmsg.js'; import { SYMBAROUM } from './config.js'; +import { MonsterSheet } from '../sheet/monster.js'; +import { SymbaroumConfig } from './symbaroumConfig.js'; +import { SymbaroumCommsListener } from './symbcomms.js'; Hooks.once('init', () => { CONFIG.Actor.documentClass = SymbaroumActor; @@ -23,7 +26,8 @@ Hooks.once('init', () => { Actors.unregisterSheet('core', ActorSheet); Actors.registerSheet('symbaroum', PlayerSheet2, { types: ['player'], makeDefault: true }); Actors.registerSheet('symbaroum', PlayerSheet, { types: ['player'], makeDefault: false }); - Actors.registerSheet('symbaroum', PlayerSheet2, { types: ['monster'], makeDefault: true }); + Actors.registerSheet('symbaroum', MonsterSheet, { types: ['monster'], makeDefault: true }); + Actors.registerSheet('symbaroum', PlayerSheet2, { types: ['monster'], makeDefault: false }); Items.unregisterSheet('core', ItemSheet); Items.registerSheet('symbaroum', TraitSheet, { types: ['trait'], makeDefault: true }); Items.registerSheet('symbaroum', AbilitySheet, { types: ['ability'], makeDefault: true }); @@ -34,14 +38,14 @@ Hooks.once('init', () => { Items.registerSheet('symbaroum', WeaponSheet, { types: ['weapon'], makeDefault: true }); Items.registerSheet('symbaroum', ArmorSheet, { types: ['armor'], makeDefault: true }); Items.registerSheet('symbaroum', EquipmentSheet, { types: ['equipment'], makeDefault: true }); - Items.registerSheet('symbaroum', ArtifactSheet, { types: ['artifact'], makeDefault: true }); + Items.registerSheet('symbaroum', ArtifactSheet, { types: ['artifact'], makeDefault: true }); initializeHandlebars(); - game.symbaroum = { - config: SYMBAROUM + game.symbaroum = { + config: SYMBAROUM, + SymbaroumConfig, }; - game.settings.register('symbaroum', 'worldTemplateVersion', { // worldTemplateVersion is deprecated - not to use anymore name: 'World Template Version', @@ -52,7 +56,7 @@ Hooks.once('init', () => { type: Number, }); - game.settings.register('symbaroum', 'systemMigrationVersion', { + game.settings.register('symbaroum', 'systemMigrationVersion', { name: 'World System Version', hint: 'Used to automatically upgrade worlds data when needed.', scope: 'world', @@ -148,6 +152,14 @@ Hooks.once('init', () => { default: false, config: true, }); + game.settings.register('symbaroum', 'showNpcModifiers', { + name: 'SYMBAROUM.OPTIONAL_NPC_MODIFIERS', + hint: 'SYMBAROUM.OPTIONAL_NPC_MODIFIERS_HINT', + scope: 'world', + type: Boolean, + default: false, + config: true, + }); game.settings.register('symbaroum', 'allowShowReference', { name: 'SYMBAROUM.OPTIONAL_SHOWREFERENCE', hint: 'SYMBAROUM.OPTIONAL_SHOWREFERENCE_HINT', @@ -166,7 +178,6 @@ Hooks.once('init', () => { config: true, }); - game.settings.register('symbaroum', 'manualInitValue', { name: 'SYMBAROUM.OPTIONAL_INIT_MANUAL', hint: 'SYMBAROUM.OPTIONAL_INIT_MANUAL_HINT', @@ -175,13 +186,113 @@ Hooks.once('init', () => { default: false, config: true, }); + + game.settings.register('symbaroum', 'charBGChoice', { + restricted: false, + type: String, + config: false, + scope: 'client', + }); + game.settings.register('symbaroum', 'npcBGChoice', { + restricted: false, + type: String, + config: false, + scope: 'client', + }); + game.settings.register('symbaroum', 'titleBGChoice', { + restricted: false, + type: String, + config: false, + scope: 'client', + }); + game.settings.register('symbaroum', 'editableChoice', { + restricted: false, + type: String, + config: false, + scope: 'client', + }); + game.settings.register('symbaroum', 'nonEditableChoice', { + restricted: false, + type: String, + config: false, + scope: 'client', + }); + + game.settings.register('symbaroum', 'switchCharBGColour', { + name: 'SYMBAROUM.OPTIONAL_PC_COLOUR_SELECTOR', + restricted: false, + type: String, + config: false, + scope: 'client', + default: 'url(../asset/image/background/green_flower_light.webp) repeat', + }); + game.settings.register('symbaroum', 'switchNpcBGColour', { + name: 'SYMBAROUM.OPTIONAL_NPC_COLOUR_SELECTOR', + restricted: false, + type: String, + config: false, + scope: 'client', + default: 'url(../asset/image/background/purple_flower_light.webp) repeat', + }); + game.settings.register('symbaroum', 'switchTitleColour', { + name: 'SYMBAROUM.OPTIONAL_TITLE_COLOUR_SELECTOR', + restricted: false, + type: String, + config: false, + scope: 'client', + default: 'url(../asset/image/background/title.webp)', + }); + game.settings.register('symbaroum', 'switchEditableColour', { + name: 'SYMBAROUM.OPTIONAL_EDITABLE_COLOUR_SELECTOR', + restricted: false, + type: String, + config: false, + scope: 'client', + default: 'url(../asset/image/background/editable.webp)', + }); + game.settings.register('symbaroum', 'switchNoNEditableColour', { + name: 'SYMBAROUM.OPTIONAL_EDITABLE_COLOUR_SELECTOR', + restricted: false, + type: String, + config: false, + scope: 'client', + default: 'url(../asset/image/background/not-editable.webp)', + }); + + game.settings.registerMenu('symbaroum', 'symbaroumSettings', { + name: 'SYMBAROUM.OPTIONAL_CONFIG_MENULABEL', + label: 'SYMBAROUM.OPTIONAL_CONFIG_MENULABEL', + hint: 'SYMBAROUM.OPTIONAL_CONFIG_MENUHINT', + icon: 'fas fa-palette', + type: SymbaroumConfig, + restricted: false, + }); + + // register setting for add/remove menu button + game.settings.register('symbaroum', 'addMenuButton', { + name: 'SYMBAROUM.OPTIONAL_ADD_MENUNAME', + hint: 'SYMBAROUM.OPTIONAL_ADD_MENUHINT', + scope: 'world', + config: true, + default: SymbaroumConfig.getDefaults.addMenuButton, + type: Boolean, + onChange: (enabled) => { + SymbaroumConfig.toggleConfigButton(enabled); + }, + }); }); - Hooks.once('ready', () => { migrateWorld(); sendDevMessage(); showReleaseNotes(); + setupConfigOptions(); + setupEmit(); +}); + +// create/remove the quick access config button +Hooks.once('renderSettings', () => { + SymbaroumConfig.toggleConfigButton(JSON.parse(game.settings.get('symbaroum', 'addMenuButton'))); }); Hooks.on('preCreateActor', (doc, createData, options, userid) => { @@ -226,21 +337,17 @@ Hooks.once('diceSoNiceReady', (dice3d) => { }); Hooks.on('preCreateChatMessage', (doc, message, options, userid) => { - - if(message.flags !== undefined) - { - if( getProperty(message.flags,"core.initiativeRoll") && game.settings.get('symbaroum', 'hideIniativeRolls') ) { + if (message.flags !== undefined) { + if (getProperty(message.flags, 'core.initiativeRoll') && game.settings.get('symbaroum', 'hideIniativeRolls')) { return false; } - } + } }); - /*Hook for the chatMessage that contain a button for the GM to apply status icons or damage to a token.*/ Hooks.on('renderChatMessage', async (chatItem, html, data) => { - const flagDataArray = await chatItem.getFlag(game.system.id, 'abilityRoll'); - if (flagDataArray) { + if (flagDataArray && game.user.isGM) { await html.find('#applyEffect').click(async () => { for (let flagData of flagDataArray) { if (flagData.tokenId) { @@ -293,6 +400,18 @@ Hooks.on('renderChatMessage', async (chatItem, html, data) => { } }); + +// This sets the css DOM objects we will change with the registered settings +async function setupConfigOptions() { + let r = document.querySelector(':root'); + await r.style.setProperty('--color-charBG', game.settings.get('symbaroum', 'switchCharBGColour')); + await r.style.setProperty('--color-npcBG', game.settings.get('symbaroum', 'switchNpcBGColour')); + await r.style.setProperty('--title-image', game.settings.get('symbaroum', 'titleBGChoice')); + await r.style.setProperty('--title-color', game.settings.get('symbaroum', 'switchTitleColour')); + await r.style.setProperty('--box-editable', game.settings.get('symbaroum', 'switchEditableColour')); + await r.style.setProperty('--box-non-editable', game.settings.get('symbaroum', 'switchNoNEditableColour')); +} + async function createBlessedShield(actor, protection = '1d4') { let data = { name: game.i18n.localize('POWER_LABEL.BLESSED_SHIELD'), @@ -312,9 +431,9 @@ async function showReleaseNotes() { if (game.user.isGM) { try { const newVer = game.system.data.version; - const releaseNoteName = "Symbaroum System guide EN"; - const releasePackLabel = "Symbaroum for FVTT system user guides"; - + const releaseNoteName = 'Symbaroum System guide EN'; + const releasePackLabel = 'Symbaroum for FVTT system user guides'; + let currentVer = '0'; let oldReleaseNotes = game.journal.getName(releaseNoteName); if (oldReleaseNotes !== undefined && oldReleaseNotes !== null && oldReleaseNotes.getFlag('symbaroum', 'ver') !== undefined) { @@ -327,7 +446,7 @@ async function showReleaseNotes() { let newReleasePack = game.packs.find((p) => p.metadata.label === releasePackLabel); if (newReleasePack === null || newReleasePack === undefined) { - console.log('No pack found'); + console.error('No pack found'); // This is bad - the symbaroum pack does not exist in the system packages return; } @@ -352,7 +471,7 @@ async function showReleaseNotes() { // Show journal await newReleaseJournal.sheet.render(true, { sheetMode: 'text' }); } catch (error) { - console.log(error); + console.error(error); } // end of try } // end of if(isgm) } // end of function @@ -366,22 +485,29 @@ async function tidyReleaseNotes11() { } } +async function setupEmit() +{ + console.info("Setting up Symbaroum emit system"); + SymbaroumCommsListener.ready(); +} + Hooks.on('createToken', async (token, options, userID) => { let flagBerserk = token.actor.getFlag(game.system.id, 'berserker'); - if(flagBerserk){ - modifyEffectOnToken(token._object,"systems/symbaroum/asset/image/berserker.svg", 1, 1); + if (flagBerserk) { + modifyEffectOnToken(token._object, 'systems/symbaroum/asset/image/berserker.svg', 1, 1); } -}) +}); /* action = 0 : remove effect action = 1 : add effect action = 2 : modify effect duration */ -export async function modifyEffectOnToken(token, effect, action, duration, effectStuff){ +export async function modifyEffectOnToken(token, effect, action, duration, effectStuff) { let statusCounterMod = false; if (game.modules.get('statuscounter')?.active) { statusCounterMod = true; } - if (action == 1) { //add effect + if (action == 1) { + //add effect if (statusCounterMod) { let alreadyHereEffect = await EffectCounter.findCounter(token, effect); if (alreadyHereEffect == undefined) { @@ -396,8 +522,8 @@ export async function modifyEffectOnToken(token, effect, action, duration, effec } else { token.toggleEffect(effect); } - } - else if (action == 0){ //remove effect + } else if (action == 0) { + //remove effect if (statusCounterMod) { let statusEffectCounter = await EffectCounter.findCounter(token, effect); if (statusEffectCounter != undefined) { @@ -406,8 +532,8 @@ export async function modifyEffectOnToken(token, effect, action, duration, effec } else { token.toggleEffect(effect); } - } - else { //modify duration - only with Status counter mod + } else { + //modify duration - only with Status counter mod if (statusCounterMod) { let statusEffectCounter = await EffectCounter.findCounter(token, effect); if (statusEffectCounter != undefined) { diff --git a/script/common/item.js b/script/common/item.js index bca10a65..a8420d38 100644 --- a/script/common/item.js +++ b/script/common/item.js @@ -35,7 +35,6 @@ export class SymbaroumItem extends Item { super.prepareData(); this._initializeData(this.data); this._computeCombatData(this.data); - this.data.isGM = game.user.isGM && game.settings.get('symbaroum', 'allowShowReference'); // Show advanced settings } _initializeData(data) { @@ -56,12 +55,26 @@ export class SymbaroumItem extends Item { data.isArtifact = data.type === "artifact" || data.data?.isArtifact; data.isGear = data.isWeapon || data.isArmor || data.isEquipment || data.isArtifact; + if(data.isTrait && data.data.reference && data.data.reference !== "") { + let label = game.symbaroum.config.traitsList[data.data.reference]; + if(label) + data.itemLabel = game.i18n.localize(label); + } else if(data.isAbility) { + let label = game.symbaroum.config.abilitiesList[data.data.reference]; + if(label) + data.itemLabel = game.i18n.localize(label); + } else if(data.isMysticalPower) { + let label = game.symbaroum.config.powersList[data.data.reference]; + if(label) + data.itemLabel = game.i18n.localize(label); + } + if(data.isGear) { data.isActive = data.data.state === "active"; data.isEquipped = data.data.state === "equipped"; } - if(data.type === "weapon"){ + if(data.type === "weapon") { data.data.pcDamage = ""; data.data.npcDamage = 0; } @@ -84,8 +97,6 @@ export class SymbaroumItem extends Item { } _computeExperienceCost(data) { - // console.log("computeExperienceCost "+JSON.stringify(data)); - let expCost = 0; if (data.isRitual) { @@ -103,16 +114,16 @@ export class SymbaroumItem extends Item { let adept = "-"; let master = "-"; if (data.data.novice.isActive) { - novice = data.data.novice.action; - expCost += 10; + novice = data.data.novice.action; + expCost += 10; } if (data.data.adept.isActive) { - adept = data.data.adept.action; - expCost += 20; + adept = data.data.adept.action; + expCost += 20; } if (data.data.master.isActive) { - master = data.data.master.action; - expCost += 30; + master = data.data.master.action; + expCost += 30; } data.data.actions = `${novice}/${adept}/${master}`; } @@ -261,214 +272,25 @@ export class SymbaroumItem extends Item { ChatMessage.create(chatData); } + /* affect reference on this item */ - async affectReference(){ - const abilitiesList = [ - {label: game.i18n.localize('ABILITY_LABEL.DEFAULT'), value: "none"}, - {label: game.i18n.localize('ABILITY_LABEL.ACROBATICS'), value: "acrobatics"}, - {label: game.i18n.localize('ABILITY_LABEL.ALCHEMY'), value: "alchemy"}, - {label: game.i18n.localize('ABILITY_LABEL.AGILE_COMBAT'), value: "agilecombat"}, - {label: game.i18n.localize('ABILITY_LABEL.ARMORED_MYSTIC'), value: "armoredmystic"}, - {label: game.i18n.localize('ABILITY_LABEL.ARROW_JAB'), value: "arrowjab"}, - {label: game.i18n.localize('ABILITY_LABEL.ARTIFACT_CRAFTING'), value: "artifactcrafting"}, - {label: game.i18n.localize('ABILITY_LABEL.AXE_ARTIST'), value: "axeartist"}, - {label: game.i18n.localize('ABILITY_LABEL.BACKSTAB'), value: "backstab"}, - {label: game.i18n.localize('ABILITY_LABEL.BEAST_LORE'), value: "beastlore"}, - {label: game.i18n.localize('ABILITY_LABEL.BERSERKER'), value: "berserker"}, - {label: game.i18n.localize('ABILITY_LABEL.BLACKSMITH'), value: "blacksmith"}, - {label: game.i18n.localize('ABILITY_LABEL.BLOOD_COMBAT'), value: "bloodcombat"}, - {label: game.i18n.localize('ABILITY_LABEL.BODYGUARD'), value: "bodyguard"}, - {label: game.i18n.localize('ABILITY_LABEL.CHANNELING'), value: "channeling"}, - {label: game.i18n.localize('ABILITY_LABEL.CHEAP_SHOT'), value: "cheapshot"}, - {label: game.i18n.localize('ABILITY_LABEL.DOMINATE'), value: "dominate"}, - {label: game.i18n.localize('ABILITY_LABEL.ENSNARE'), value: "ensnare"}, - {label: game.i18n.localize('ABILITY_LABEL.EQUESTRIAN'), value: "equestrian"}, - {label: game.i18n.localize('ABILITY_LABEL.EX_ATTRIBUTE'), value: "exceptionalattribute"}, - {label: game.i18n.localize('ABILITY_LABEL.FEAT_STRENGTH'), value: "featofstrength"}, - {label: game.i18n.localize('ABILITY_LABEL.FEINT'), value: "feint"}, - {label: game.i18n.localize('ABILITY_LABEL.FLAILER'), value: "flailer"}, - {label: game.i18n.localize('ABILITY_LABEL.HAMMER_RHYTHM'), value: "hammerrhythm"}, - {label: game.i18n.localize('ABILITY_LABEL.HUNTER_INSTINCT'), value: "huntersinstinct"}, - {label: game.i18n.localize('ABILITY_LABEL.IRON_FIST'), value: "ironfist"}, - {label: game.i18n.localize('ABILITY_LABEL.KNIFE_PLAY'), value: "knifeplay"}, - {label: game.i18n.localize('ABILITY_LABEL.LEADER'), value: "leader"}, - {label: game.i18n.localize('ABILITY_LABEL.LOREMASTER'), value: "loremaster"}, - {label: game.i18n.localize('ABILITY_LABEL.MAN-AT-ARMS'), value: "manatarms"}, - {label: game.i18n.localize('ABILITY_LABEL.MANTLE_DANCE'), value: "mantledance"}, - {label: game.i18n.localize('ABILITY_LABEL.MARKSMAN'), value: "marksman"}, - {label: game.i18n.localize('ABILITY_LABEL.MEDICUS'), value: "medicus"}, - {label: game.i18n.localize('ABILITY_LABEL.NATURAL_WARRIOR'), value: "naturalwarrior"}, - {label: game.i18n.localize('ABILITY_LABEL.OPPORTUNIST'), value: "opportunist"}, - {label: game.i18n.localize('ABILITY_LABEL.POISONER'), value: "poisoner"}, - {label: game.i18n.localize('ABILITY_LABEL.POLEARM_MASTERY'), value: "polearmmastery"}, - {label: game.i18n.localize('ABILITY_LABEL.PYROTECHNICS'), value: "pyrotechnics"}, - {label: game.i18n.localize('ABILITY_LABEL.QUICK_DRAW'), value: "quickdraw"}, - {label: game.i18n.localize('ABILITY_LABEL.RAPID_FIRE'), value: "rapidfire"}, - {label: game.i18n.localize('ABILITY_LABEL.RAPID_REFLEXES'), value: "rapidreflexes"}, - {label: game.i18n.localize('ABILITY_LABEL.RECOVERY'), value: "recovery"}, - {label: game.i18n.localize('ABILITY_LABEL.RITUALIST'), value: "ritualist"}, - {label: game.i18n.localize('ABILITY_LABEL.RUNE_TATTOO'), value: "runetattoo"}, - {label: game.i18n.localize('ABILITY_LABEL.SHIELD_FIGHTER'), value: "shieldfighter"}, - {label: game.i18n.localize('ABILITY_LABEL.SIEGE_EXPERT'), value: "siegeexpert"}, - {label: game.i18n.localize('ABILITY_LABEL.SIXTH_SENSE'), value: "sixthsense"}, - {label: game.i18n.localize('ABILITY_LABEL.SORCERY'), value: "sorcery"}, - {label: game.i18n.localize('ABILITY_LABEL.STAFF_FIGHTING'), value: "stafffighting"}, - {label: game.i18n.localize('ABILITY_LABEL.STAFF_MAGIC'), value: "staffmagic"}, - {label: game.i18n.localize('ABILITY_LABEL.STEADFAST'), value: "steadfast"}, - {label: game.i18n.localize('ABILITY_LABEL.STEEL_THROW'), value: "steelthrow"}, - {label: game.i18n.localize('ABILITY_LABEL.STRANGLER'), value: "strangler"}, - {label: game.i18n.localize('ABILITY_LABEL.STRONG_GIFT'), value: "stronggift"}, - {label: game.i18n.localize('ABILITY_LABEL.SWORD_SAINT'), value: "swordsaint"}, - {label: game.i18n.localize('ABILITY_LABEL.SYMBOLISM'), value: "symbolism"}, - {label: game.i18n.localize('ABILITY_LABEL.TACTICIAN'), value: "tactician"}, - {label: game.i18n.localize('ABILITY_LABEL.THEURGY'), value: "theurgy"}, - {label: game.i18n.localize('ABILITY_LABEL.TRAPPER'), value: "trapper"}, - {label: game.i18n.localize('ABILITY_LABEL.TRICK_ARCHERY'), value: "trickarchery"}, - {label: game.i18n.localize('ABILITY_LABEL.TROLL_SINGING'), value: "trollsinging"}, - {label: game.i18n.localize('ABILITY_LABEL.TWIN_ATTACK'), value: "twinattack"}, - {label: game.i18n.localize('ABILITY_LABEL.2HANDED_FORCE'), value: "twohandedforce"}, - {label: game.i18n.localize('ABILITY_LABEL.WITCHCRAFT'), value: "witchcraft"}, - {label: game.i18n.localize('ABILITY_LABEL.WITCHSIGHT'), value: "witchsight"}, - {label: game.i18n.localize('ABILITY_LABEL.WIZARDRY'), value: "wizardry"}, - {label: game.i18n.localize('ABILITY_LABEL.WHIPFIGHTER'), value: "whipfighter"}, - {label: game.i18n.localize('ABILITY_LABEL.WRESTLING'), value: "wrestling"}, - {label: game.i18n.localize('ABILITY_LABEL.2HANDED_FINESSE'), value: "twohandedfinesse"}, - {label: game.i18n.localize('ABILITY_LABEL.BLESSINGS'), value: "blessings"} - ]; - const powersList = [ - {label: game.i18n.localize('ABILITY_LABEL.DEFAULT'), value: "none"}, - {label: game.i18n.localize('POWER_LABEL.ANATHEMA'), value: "anathema"}, - {label: game.i18n.localize('POWER_LABEL.BANISHING_SEAL'), value: "banishingseal"}, - {label: game.i18n.localize('POWER_LABEL.BEND_WILL'), value: "bendwill"}, - {label: game.i18n.localize('POWER_LABEL.BLACK_BOLT'), value: "blackbolt"}, - {label: game.i18n.localize('POWER_LABEL.BLACK_BREATH'), value: "blackbreath"}, - {label: game.i18n.localize('POWER_LABEL.BLESSED_SHIELD'), value: "blessedshield"}, - {label: game.i18n.localize('POWER_LABEL.BLINDING_SYMBOL'), value: "blindingsymbol"}, - {label: game.i18n.localize('POWER_LABEL.BRIMSTONE_CASCADE'), value: "brimstonecascade"}, - {label: game.i18n.localize('POWER_LABEL.COMBAT_HYMN'), value: "combathymn"}, - {label: game.i18n.localize('POWER_LABEL.CONFUSION'), value: "confusion"}, - {label: game.i18n.localize('POWER_LABEL.CURSE'), value: "curse"}, - {label: game.i18n.localize('POWER_LABEL.DANCING_WEAPON'), value: "dancingweapon"}, - {label: game.i18n.localize('POWER_LABEL.DRAINING_GLYPH'), value: "drainingglyph"}, - {label: game.i18n.localize('POWER_LABEL.ENTANGLING_VINES'), value: "entanglingvines"}, - {label: game.i18n.localize('POWER_LABEL.EXORCIZE'), value: "exorcize"}, - {label: game.i18n.localize('POWER_LABEL.FIRE_SOUL'), value: "firesoul"}, - {label: game.i18n.localize('POWER_LABEL.FLAME_WALL'), value: "flamewall"}, - {label: game.i18n.localize('POWER_LABEL.HEROIC_HYMN'), value: "heroichymn"}, - {label: game.i18n.localize('POWER_LABEL.HOLY_AURA'), value: "holyaura"}, - {label: game.i18n.localize('POWER_LABEL.ILLUSORY_CORRECTION'), value: "illusorycorrection"}, - {label: game.i18n.localize('POWER_LABEL.INHERIT_WOUND'), value: "inheritwound"}, - {label: game.i18n.localize('POWER_LABEL.LARVAE_BOILS'), value: "larvaeboils"}, - {label: game.i18n.localize('POWER_LABEL.LAY_ON_HANDS'), value: "layonhands"}, - {label: game.i18n.localize('POWER_LABEL.LEVITATE'), value: "levitate"}, - {label: game.i18n.localize('POWER_LABEL.LIFEGIVER'), value: "lifegiver"}, - {label: game.i18n.localize('POWER_LABEL.MALTRANSFORMATION'), value: "maltransformation"}, - {label: game.i18n.localize('POWER_LABEL.MIND-THROW'), value: "mindthrow"}, - {label: game.i18n.localize('POWER_LABEL.MIRRORING'), value: "mirroring"}, - {label: game.i18n.localize('POWER_LABEL.NATURES_EMBRACE'), value: "naturesembrace"}, - {label: game.i18n.localize('POWER_LABEL.PRIOS_BURNING_GLASS'), value: "priosburningglass"}, - {label: game.i18n.localize('POWER_LABEL.PROTECTIVE_RUNES'), value: "protectiverunes"}, - {label: game.i18n.localize('POWER_LABEL.PSYCHIC_THRUST'), value: "psychicthrust"}, - {label: game.i18n.localize('POWER_LABEL.PURGATORY'), value: "purgatory"}, - {label: game.i18n.localize('POWER_LABEL.RETRIBUTION'), value: "retribution"}, - {label: game.i18n.localize('POWER_LABEL.REVENANT_STRIKE'), value: "revenantstrike"}, - {label: game.i18n.localize('POWER_LABEL.SHAPESHIFT'), value: "shapeshift"}, - {label: game.i18n.localize('POWER_LABEL.SPHERE'), value: "sphere"}, - {label: game.i18n.localize('POWER_LABEL.SPIRIT_WALK'), value: "spiritwalk"}, - {label: game.i18n.localize('POWER_LABEL.STAFF_PROJECTILE'), value: "staffprojectile"}, - {label: game.i18n.localize('POWER_LABEL.STORM_ARROW'), value: "stormarrow"}, - {label: game.i18n.localize('POWER_LABEL.TELEPORT'), value: "teleport"}, - {label: game.i18n.localize('POWER_LABEL.THORN_CLOAK'), value: "thorncloak"}, - {label: game.i18n.localize('POWER_LABEL.TORMENTING_SPIRITS'), value: "tormentingspirits"}, - {label: game.i18n.localize('POWER_LABEL.TRUE_FORM'), value: "trueform"}, - {label: game.i18n.localize('POWER_LABEL.UNHOLY_AURA'), value: "unholyaura"}, - {label: game.i18n.localize('POWER_LABEL.UNNOTICEABLE'), value: "unnoticeable"}, - {label: game.i18n.localize('POWER_LABEL.WEAKENING_HYMN'), value: "weakeninghymn"}, - {label: game.i18n.localize('POWER_LABEL.WILD_HUNT'), value: "wildhunt"}, - {label: game.i18n.localize('POWER_LABEL.BATTLE_SYMBOL'), value: "battlesymbol"}, - {label: game.i18n.localize('POWER_LABEL.EARTH_BINDING'), value: "earthbinding"}, - {label: game.i18n.localize('POWER_LABEL.MARK_OF_TORMENT'), value: "markoftorment"}, - {label: game.i18n.localize('POWER_LABEL.SERENITY'), value: "serenity"}, - {label: game.i18n.localize('POWER_LABEL.EARTH_SHOT'), value: "earthshot"}, - {label: game.i18n.localize('POWER_LABEL.WITCH_HAMMER'), value: "witchhammer"} - ]; - const traitsList = [ - {label: game.i18n.localize('TRAIT_LABEL.ACIDICATTACK'), value: "acidicattack"}, -  {label: game.i18n.localize('TRAIT_LABEL.ACIDICBLOOD'), value: "acidicblood"}, -  {label: game.i18n.localize('TRAIT_LABEL.ALTERNATIVEDAMAGE'), value: "alternativedamage"}, -  {label: game.i18n.localize('TRAIT_LABEL.AMPHIBIAN'), value: "amphibian"}, -  {label: game.i18n.localize('TRAIT_LABEL.ARMORED'), value: "armored"}, -  {label: game.i18n.localize('TRAIT_LABEL.AVENGINGSUCCESSOR'), value: "avengingsuccessor"}, -  {label: game.i18n.localize('TRAIT_LABEL.BLOODLUST'), value: "bloodlust"}, -  {label: game.i18n.localize('TRAIT_LABEL.CARAPACE'), value: "carapace"}, -  {label: game.i18n.localize('TRAIT_LABEL.COLLECTIVEPOWER'), value: "collectivepower"}, -  {label: game.i18n.localize('TRAIT_LABEL.COLOSSAL'), value: "colossal"}, -  {label: game.i18n.localize('TRAIT_LABEL.COMPANIONS'), value: "companions"}, -  {label: game.i18n.localize('TRAIT_LABEL.CORRUPTINGATTACK'), value: "corruptingattack"}, -  {label: game.i18n.localize('TRAIT_LABEL.CORRUPTIONHOARDER'), value: "corruptionhoarder"}, -  {label: game.i18n.localize('TRAIT_LABEL.CORRUPTIONSENSITIVE'), value: "corruptionsensitive"}, -  {label: game.i18n.localize('TRAIT_LABEL.CRUSHINGEMBRACE'), value: "crushingembrace"}, -  {label: game.i18n.localize('TRAIT_LABEL.DEADLYBREATH'), value: "deadlybreath"}, -  {label: game.i18n.localize('TRAIT_LABEL.DEATHSTRUGGLE'), value: "deathstruggle"}, -  {label: game.i18n.localize('TRAIT_LABEL.DEVOUR'), value: "devour"}, -  {label: game.i18n.localize('TRAIT_LABEL.DIMINUTIVE'), value: "diminutive"}, -  {label: game.i18n.localize('TRAIT_LABEL.ENTHRALL'), value: "enthrall"}, -  {label: game.i18n.localize('TRAIT_LABEL.EARTHBOUND'), value: "earthbound"}, -  {label: game.i18n.localize('TRAIT_LABEL.FREESPIRIT'), value: "freespirit"}, -  {label: game.i18n.localize('TRAIT_LABEL.GRAPPLINGTONGUE'), value: "grapplingtongue"}, -  {label: game.i18n.localize('TRAIT_LABEL.GRAVELYCOLD'), value: "gravelycold"}, -  {label: game.i18n.localize('TRAIT_LABEL.HARMFULAURA'), value: "harmfulaura"}, -  {label: game.i18n.localize('TRAIT_LABEL.HAUNTING'), value: "haunting"}, -  {label: game.i18n.localize('TRAIT_LABEL.INFECTIOUS'), value: "infectious"}, -  {label: game.i18n.localize('TRAIT_LABEL.INFESTATION'), value: "infestation"}, -  {label: game.i18n.localize('TRAIT_LABEL.INVISIBILITY'), value: "invisibility"}, -  {label: game.i18n.localize('TRAIT_LABEL.LEAP'), value: "leap"}, -  {label: game.i18n.localize('TRAIT_LABEL.LIFESENSE'), value: "lifesense"}, -  {label: game.i18n.localize('TRAIT_LABEL.MANIFESTATION'), value: "manifestation"}, -  {label: game.i18n.localize('TRAIT_LABEL.MANYHEADED'), value: "many-headed"}, -  {label: game.i18n.localize('TRAIT_LABEL.METAMORPHOSIS'), value: "metamorphosis"}, -  {label: game.i18n.localize('TRAIT_LABEL.MYSTICALRESISTANCE'), value: "mysticalresistance"}, -  {label: game.i18n.localize('TRAIT_LABEL.NATURALWEAPON'), value: "naturalweapon"}, -  {label: game.i18n.localize('TRAIT_LABEL.NIGHTPERCEPTION'), value: "nightperception"}, -  {label: game.i18n.localize('TRAIT_LABEL.OBSERVANT'), value: "observant"}, -  {label: game.i18n.localize('TRAIT_LABEL.PARALYZINGVENOM'), value: "paralyzingvenom"}, -  {label: game.i18n.localize('TRAIT_LABEL.PIERCINGATTACK'), value: "piercingattack"}, -  {label: game.i18n.localize('TRAIT_LABEL.POISONOUS'), value: "poisonous"}, -  {label: game.i18n.localize('TRAIT_LABEL.POISONSPIT'), value: "poisonspit"}, -  {label: game.i18n.localize('TRAIT_LABEL.PREHENSILECLAWS'), value: "prehensileclaws"}, -  {label: game.i18n.localize('TRAIT_LABEL.RAMPAGE'), value: "rampage"}, -  {label: game.i18n.localize('TRAIT_LABEL.REGENERATION'), value: "regeneration"}, -  {label: game.i18n.localize('TRAIT_LABEL.ROBUST'), value: "robust"}, -  {label: game.i18n.localize('TRAIT_LABEL.ROOTWALL'), value: "rootwall"}, - {label: game.i18n.localize('TRAIT_LABEL.SHAPESHIFTER'), value: "shapeshifter"}, -  {label: game.i18n.localize('TRAIT_LABEL.SPIRITFORM'), value: "spiritform"}, -  {label: game.i18n.localize('TRAIT_LABEL.STURDY'), value: "sturdy"}, -  {label: game.i18n.localize('TRAIT_LABEL.SUMMONER'), value: "summoner"}, -  {label: game.i18n.localize('TRAIT_LABEL.SURVIVALINSTINCT'), value: "survivalinstinct"}, -  {label: game.i18n.localize('TRAIT_LABEL.SWARM'), value: "swarm"}, -  {label: game.i18n.localize('TRAIT_LABEL.SWIFT'), value: "swift"}, -  {label: game.i18n.localize('TRAIT_LABEL.TERRIFY'), value: "terrify"}, -  {label: game.i18n.localize('TRAIT_LABEL.TUNNELER'), value: "tunneler"}, -  {label: game.i18n.localize('TRAIT_LABEL.UNDEAD'), value: "undead"}, -  {label: game.i18n.localize('TRAIT_LABEL.WEB'), value: "web"}, -  {label: game.i18n.localize('TRAIT_LABEL.WINGS'), value: "wings"}, -  {label: game.i18n.localize('TRAIT_LABEL.WISDOM_AGES'), value: "wisdomages"}, -  {label: game.i18n.localize('TRAIT_LABEL.WRECKER'), value: "wrecker"} - ]; + async affectReference() + { let list; if(this.data.type === "ability"){ - list = abilitiesList; + list = game.symbaroum.config.abilitiesList; } else if(this.data.type === "mysticalPower"){ - list = powersList; + list = game.symbaroum.config.powersList; } else if(this.data.type === "trait"){ - list = traitsList; + list = game.symbaroum.config.traitsList; } else{return} let referenceOptions = ""; - for(let referenceEntry of list){ - referenceOptions += `` + for (let [key, label] of Object.entries(list)) + { + referenceOptions += `` } let htmlTemplate = ` @@ -496,40 +318,28 @@ export class SymbaroumItem extends Item { }).render(true); } - /*async makeAction(actor, level = 1){ - - if(this.data.data.reference === ""){ - await this.affectReference(); - return}; - - if(actor == undefined || actor == null){ - return; + getLevel() + { + if(!this.data.isPower) { + return {level:0, lvlName : null}; } - let list; - if(this.data.type === "ability"){ - list = scriptedAbilities; - } - else if(this.data.type === "mysticalPower"){ - list = scriptedPowers; + let powerLvl = 0; + let lvlName = game.i18n.localize("Not learned"); // TODO: Proper entry in language file + if(this.data.data.master.isActive){ + powerLvl = 3; + lvlName = game.i18n.localize('ABILITY.MASTER'); } - else if(this.data.type === "trait"){ - list = scriptedTraits; + else if(this.data.data.adept.isActive){ + powerLvl = 2; + lvlName = game.i18n.localize('ABILITY.ADEPT'); } - else{return} - - const ability = list.find(element => (element.reference === this.data.data.reference && element.level.includes(level))); - if(ability){ - try{ability.function(this, actor)} catch(error){ - ui.notifications.error(error); - return; - } + else if(this.data.data.novice.isActive){ + powerLvl = 1; + lvlName = game.i18n.localize('ABILITY.NOVICE'); } - else{ - ui.notifications.error("Not yet implemented"); - return; - } - }*/ + return {level : powerLvl, lvlName : lvlName}; + } } export const scriptedAbilities = @@ -545,6 +355,7 @@ export const scriptedAbilities = {reference: "leader", level: [1, 2, 3], function: leaderPrepare}, {reference: "loremaster", level: [1, 2, 3], function: simpleRollAbility}, {reference: "medicus", level: [1, 2, 3], function: medicusPrepare}, +{reference: "poisoner", level: [1, 2, 3], function: poisonerPrepare}, {reference: "quickdraw", level: [1, 2, 3], function: simpleRollAbility}, //{reference: "shieldfighter", level: [1, 2, 3], function: attackRoll}, {reference: "recovery", level: [1, 2, 3], function: recoveryPrepare}, @@ -559,6 +370,7 @@ export const scriptedPowers = {reference: "blessedshield", level: [1, 2, 3], function: blessedshieldPrepare}, {reference: "confusion", level: [1, 2, 3], function: confusionPrepare}, {reference: "curse", level: [1, 2, 3], function: cursePrepare}, +{reference: "dancingweapon", level: [1, 2, 3], function: dancingweapon}, {reference: "entanglingvines", level: [1, 2, 3], function: entanglingvinesPrepare}, {reference: "holyaura", level: [1, 2, 3], function: holyAuraPrepare}, {reference: "inheritwound", level: [1, 2, 3], function: inheritWound}, @@ -572,7 +384,8 @@ export const scriptedPowers = {reference: "unnoticeable", level: [1, 2, 3], function: unnoticeablePrepare}]; export const scriptedTraits = -[{reference: "regeneration", level: [1, 2, 3], function: regeneration}, +[{reference: "poisonous", level: [1, 2, 3], function: poisonerPrepare}, +{reference: "regeneration", level: [1, 2, 3], function: regeneration}, {reference: "shapeshifter", level: [1, 2, 3], function: simpleRollAbility}, {reference: "wisdomages", level: [1, 2, 3], function: simpleRollAbility}]; @@ -719,6 +532,18 @@ function formatRollResult(rollData){ return(rollResult); } +async function createResultChatMessage(templateHtml, templateData, flagDataArray){ + const html = await renderTemplate(templateHtml, templateData); + const chatData = { + user: game.user.id, + content: html, + } + let chatResultMessage = await ChatMessage.create(chatData); + if(flagDataArray){ + await chatResultMessage.setFlag(game.system.id, 'tokenModification', flagDataArray); + } +} + async function checkCorruptionThreshold(actor, corruptionGained){ let img ="icons/magic/air/wind-vortex-swirl-purple.webp"; let introText = actor.data.name + game.i18n.localize('CORRUPTION.CHAT_WARNING'); @@ -814,7 +639,7 @@ async function buildFunctionStuffDefault(ability, actor) { resultFunction: standardPowerResult }; if(ability.data.type === "mysticalPower"){ - let actorResMod = await checkResoluteModifiers(actor, functionStuff.autoParams, true, false); + let actorResMod = checkResoluteModifiers(actor, functionStuff.autoParams, true, false); functionStuff.castingAttributeName = actorResMod.bestAttributeName; functionStuff.autoParams = actorResMod.autoParams; functionStuff.corruption = true; @@ -953,7 +778,7 @@ async function getCorruption(functionStuff, corruptionFormula = "1d4"){ } } if(functionStuff.casterMysticAbilities.sorcery.hasAbility){ - let castingAttribute = (await checkResoluteModifiers(functionStuff.actor)).bestAttributeName; + let castingAttribute = (checkResoluteModifiers(functionStuff.actor)).bestAttributeName; sorceryRoll = await baseRoll(functionStuff.actor, castingAttribute, null, null, 0, 0); if(sorceryRoll.hasSucceed){ return({value: 1, tradition: "sorcery", sorceryRoll: sorceryRoll}) @@ -974,7 +799,7 @@ async function getCorruption(functionStuff, corruptionFormula = "1d4"){ @Params: {item} ability : the ability or mysticalPower item @returns: {{number} level {lvlName} the localized label (novice, adpet or master)}*/ -export function getPowerLevel(ability){ +export function getPowerLevel(ability) { let powerLvl = 0; let lvlName = "Not learned"; if(ability.data.data.master.isActive){ @@ -1046,6 +871,7 @@ async function modifierDialog(functionStuff){ let contextualDamage = functionStuff.contextualDamage ?? false; let leaderTarget = functionStuff.targetData.leaderTarget ?? false; let medicus = functionStuff.medicus ?? false; + let poisoner = functionStuff.poisoner ?? false; let weaponDamage = ""; let actorWeapons; let askImpeding = false; @@ -1125,7 +951,8 @@ async function modifierDialog(functionStuff){ checkMaintain: functionStuff.checkMaintain, askWeapon: functionStuff.askWeapon, weapons : actorWeapons, - medicus : medicus + medicus : medicus, + poisoner: poisoner }); let title; if(functionStuff.ability){title = functionStuff.ability.name} @@ -1276,6 +1103,9 @@ async function modifierDialog(functionStuff){ } else functionStuff.medicusExam = true; } + if(poisoner){ + functionStuff.poison = Number(html.find("#poisoner")[0].value); + } let rollData = []; functionStuff.favour = finalFavour; /* special case Entangling Vines */ @@ -1334,7 +1164,7 @@ returns:{ useSteadfastAdept {boolean}, useSteadfastMaster {boolean} autoParams {string} detected and used abilities have been appended to autoParams}*/ -async function checkResoluteModifiers(actor, autoParams = "", checkLeader = false, checkSteadfast = false){ +export function checkResoluteModifiers(actor, autoParams = "", checkLeader = false, checkSteadfast = false){ let useLeader = false; let hasSteadfast = false; let useSteadfastAdept = false; @@ -1603,7 +1433,7 @@ export async function attackRoll(weapon, actor){ } } let featSt = actor.items.filter(item => item.data.data.reference === "featofstrength"); - if((featSt.length != 0) && (actor.data.data.health.toughness.value < (actor.data.data.health.toughness.max/2)) && (weapon.attribute == "strong")){ + if((featSt.length != 0) && (actor.data.data.health.toughness.value <= (actor.data.data.health.toughness.max/2)) && (weapon.attribute == "strong")){ let featStLvl = getPowerLevel(featSt[0]).level; if(featStLvl > 1) { functionStuff.featStFavour = true; @@ -1767,87 +1597,10 @@ async function attackResult(rollData, functionStuff){ if(functionStuff.autoParams != ""){templateData.subText += ", " + functionStuff.autoParams}; if(functionStuff.poison > 0 && !targetDies && damageTot > 0){ - - templateData.poisonChatIntro = functionStuff.token.data.name + game.i18n.localize('COMBAT.CHAT_POISON') + functionStuff.targetData.token.data.name; - let poisonDamage = "0"; - let poisonRounds = "0"; - let poisonedTimeLeft = 0; - const effect = "icons/svg/poison.svg"; - switch (functionStuff.poison){ - case 1: - if(functionStuff.attackFromPC){ - poisonDamage = "1d4"; - poisonRounds = "1d4"; - } - else{ - poisonDamage = "2"; - poisonRounds = "2"; - }; - break; - case 2: - if(functionStuff.attackFromPC){ - poisonDamage = "1d6"; - poisonRounds = "1d6"; - } - else{ - poisonDamage = "3"; - poisonRounds = "3"; - }; - break; - case 3: - if(functionStuff.attackFromPC){ - poisonDamage = "1d8"; - poisonRounds = "1d8"; - } - else{ - poisonDamage = "4"; - poisonRounds = "4"; - }; - break; - } - let poisonRoll = await baseRoll(functionStuff.actor, "cunning", functionStuff.targetData.actor, "strong", 0, 0); - - if(!poisonRoll.hasSucceed){ - templateData.poisonChatResult = game.i18n.localize('COMBAT.CHAT_POISON_FAILURE'); - } - else{ - let PoisonRoundsRoll= new Roll(poisonRounds).evaluate(); - let NewPoisonRounds = PoisonRoundsRoll.total; - let poisonedEffectCounter = getEffect(functionStuff.targetData.token, effect); - if(poisonedEffectCounter){ - //target already poisoned - //get the number of rounds left - if(game.modules.get("statuscounter")?.active){ - poisonedTimeLeft = await EffectCounter.findCounterValue(functionStuff.targetData.token, effect); - if(NewPoisonRounds > poisonedTimeLeft){ - flagDataArray.push({ - tokenId: functionStuff.targetData.token.id, - modifyEffectDuration: "icons/svg/poison.svg", - effectDuration: NewPoisonRounds - }) - - templateData.poisonChatResult = game.i18n.localize('COMBAT.CHAT_POISON_EXTEND') + NewPoisonRounds.toString(); - } - else{ - templateData.poisonChatResult = game.i18n.localize('COMBAT.CHAT_POISON_NOTEXTEND'); - } - } - else{templateData.poisonChatResult = game.i18n.localize('COMBAT.CHAT_POISON_NOTEXTEND')} - } - else{ - //new poisonning - flagDataArray.push({ - tokenId: functionStuff.targetData.token.id, - addEffect: "icons/svg/poison.svg", - effectDuration: NewPoisonRounds - }); - templateData.poisonChatResult = functionStuff.targetData.token.data.name + game.i18n.localize('COMBAT.CHAT_POISON_SUCCESS1') + poisonDamage + game.i18n.localize('COMBAT.CHAT_POISON_SUCCESS2') + NewPoisonRounds.toString(); - } - } - templateData.printPoison = true; - templateData.poisonRollString = await formatRollString(poisonRoll, functionStuff.targetData.hasTarget, 0); - templateData.poisonRollResultString = await formatRollResult([poisonRoll]); + let poisonRes= await poisonCalc(functionStuff, poisonRoll); + if(poisonRes.flagData) flagDataArray.push(poisonRes.flagData); + templateData = Object.assign(templateData, poisonRes); } if(functionStuff.bleed > 0 && !targetDies && damageTot > 0){ templateData.printBleed = true; @@ -1874,6 +1627,7 @@ async function attackResult(rollData, functionStuff){ templateData.printFlaming = true; templateData.flamingChat = functionStuff.targetData.token.data.name + game.i18n.localize('COMBAT.CHAT_FLAMING_SUCCESS1') + flamingDamage + game.i18n.localize('COMBAT.CHAT_POISON_SUCCESS2') + flamingRounds.toString(); } + //createResultChatMessage("systems/symbaroum/template/chat/combat.html", templateData, flagDataArray) const html = await renderTemplate("systems/symbaroum/template/chat/combat.html", templateData); const chatData = { user: game.user.id, @@ -1910,13 +1664,13 @@ async function standardPowerActivation(functionStuff) { } } if (functionStuff.targetData.resistAttributeName === "resolute"){ - let targetResMod = await checkResoluteModifiers(functionStuff.targetData.actor, functionStuff.targetData.autoParams, true, functionStuff.checkTargetSteadfast); + let targetResMod = checkResoluteModifiers(functionStuff.targetData.actor, functionStuff.targetData.autoParams, true, functionStuff.checkTargetSteadfast); functionStuff.targetData.resistAttributeName = targetResMod.bestAttributeName; functionStuff.targetData.resistAttributeValue = targetResMod.bestAttributeValue; functionStuff.targetData.autoParams = targetResMod.autoParams; functionStuff.favour += -1*targetResMod.favour; } else if (functionStuff.targetData.resistAttributeName === "strong"){ - let targetResMod = await checkResoluteModifiers(functionStuff.targetData.actor, functionStuff.targetData.autoParams, false, functionStuff.checkTargetSteadfast); + let targetResMod = checkResoluteModifiers(functionStuff.targetData.actor, functionStuff.targetData.autoParams, false, functionStuff.checkTargetSteadfast); functionStuff.favour += -1*targetResMod.favour; functionStuff.targetData.autoParams = targetResMod.autoParams; } @@ -1956,6 +1710,89 @@ async function healing(healFormula, targetToken){ }) } +async function poisonCalc(functionStuff, poisonRoll){ + let poisonRes ={}; + poisonRes.printPoison = false; + poisonRes.poisonChatIntro = functionStuff.token.data.name + game.i18n.localize('COMBAT.CHAT_POISON') + functionStuff.targetData.token.data.name; + let poisonDamage = "0"; + let poisonRounds = "0"; + let poisonedTimeLeft = 0; + const effect = "icons/svg/poison.svg"; + switch (functionStuff.poison){ + case 1: + if(functionStuff.attackFromPC){ + poisonDamage = "1d4"; + poisonRounds = "1d4"; + } + else{ + poisonDamage = "2"; + poisonRounds = "2"; + }; + break; + case 2: + if(functionStuff.attackFromPC){ + poisonDamage = "1d6"; + poisonRounds = "1d6"; + } + else{ + poisonDamage = "3"; + poisonRounds = "3"; + }; + break; + case 3: + if(functionStuff.attackFromPC){ + poisonDamage = "1d8"; + poisonRounds = "1d8"; + } + else{ + poisonDamage = "4"; + poisonRounds = "4"; + }; + break; + } + + if(!poisonRoll.hasSucceed){ + poisonRes.poisonChatResult = game.i18n.localize('COMBAT.CHAT_POISON_FAILURE'); + } + else{ + let PoisonRoundsRoll= new Roll(poisonRounds).evaluate(); + let NewPoisonRounds = PoisonRoundsRoll.total; + let poisonedEffectCounter = getEffect(functionStuff.targetData.token, effect); + if(poisonedEffectCounter){ + //target already poisoned + //get the number of rounds left + if(game.modules.get("statuscounter")?.active){ + poisonedTimeLeft = await EffectCounter.findCounterValue(functionStuff.targetData.token, effect); + if(NewPoisonRounds > poisonedTimeLeft){ + poisonRes.flagData = { + tokenId: functionStuff.targetData.token.id, + modifyEffectDuration: "icons/svg/poison.svg", + effectDuration: NewPoisonRounds + }; + poisonRes.poisonChatResult = game.i18n.localize('COMBAT.CHAT_POISON_EXTEND') + NewPoisonRounds.toString(); + } + else{ + poisonRes.poisonChatResult = game.i18n.localize('COMBAT.CHAT_POISON_NOTEXTEND'); + } + } + else{poisonRes.poisonChatResult = game.i18n.localize('COMBAT.CHAT_POISON_NOTEXTEND')} + } + else{ + //new poisonning + poisonRes.flagData ={ + tokenId: functionStuff.targetData.token.id, + addEffect: "icons/svg/poison.svg", + effectDuration: NewPoisonRounds + }; + poisonRes.poisonChatResult = functionStuff.targetData.token.data.name + game.i18n.localize('COMBAT.CHAT_POISON_SUCCESS1') + poisonDamage + game.i18n.localize('COMBAT.CHAT_POISON_SUCCESS2') + NewPoisonRounds.toString(); + } + } + poisonRes.printPoison = true; + poisonRes.poisonRollString = await formatRollString(poisonRoll, functionStuff.targetData.hasTarget, 0); + poisonRes.poisonRollResultString = await formatRollResult([poisonRoll]); + return(poisonRes); +} + async function standardPowerResult(rollData, functionStuff){ let flagDataArray = functionStuff.flagDataArray ?? []; let haveCorruption = false; @@ -2030,7 +1867,7 @@ async function standardPowerResult(rollData, functionStuff){ } if(healResult){ - console.log(healResult) + // console.log(healResult) templateData.hasDamage = healResult.hasDamage; templateData.damageText = healResult.damageText; templateData.dmgFormula = healResult.dmgFormula; @@ -2281,7 +2118,7 @@ async function bendWillPrepare(ability, actor) { ui.notifications.error(error); return; } - let targetResMod = await checkResoluteModifiers(targetData.actor, targetData.autoParams, true, true); + let targetResMod = checkResoluteModifiers(targetData.actor, targetData.autoParams, true, true); let favour = -1*targetResMod.favour; targetData.resistAttributeName = targetResMod.bestAttributeName; targetData.resistAttributeValue = targetResMod.bestAttributeValue; @@ -2539,7 +2376,7 @@ async function confusionPrepare(ability, actor) { ui.notifications.error(error); return; } - let targetResMod = await checkResoluteModifiers(targetData.actor, targetData.autoParams, true, true); + let targetResMod = checkResoluteModifiers(targetData.actor, targetData.autoParams, true, true); let favour = -1*targetResMod.favour; targetData.resistAttributeName = targetResMod.bestAttributeName; targetData.resistAttributeValue = targetResMod.bestAttributeValue; @@ -2739,6 +2576,35 @@ async function curseResult(rollData, functionStuff){ } } +async function dancingweapon(ability, actor) { + let fsDefault = await buildFunctionStuffDefault(ability, actor); + let specificStuff = { + isMaintained: false, + tradition: ["staffmagic", "trollsinging"], + corruption: false + }; + let functionStuff = Object.assign({}, fsDefault , specificStuff); + + if(!functionStuff.attackFromPC){ + functionStuff.gmOnlyChatResult = true + } + let flagData = await actor.getFlag(game.system.id, 'dancingweapon'); + if(flagData){ + await actor.unsetFlag(game.system.id, 'dancingweapon'); + functionStuff.introText = actor.name + game.i18n.localize('POWER_DANCINGWEAPON.CHAT_DESACTIVATE'); + functionStuff.resultTextSuccess = game.i18n.localize('POWER_DANCINGWEAPON.CHAT_RESULT_DESACTIVATE'); + functionStuff.removeCasterEffect= ["systems/symbaroum/asset/image/powers/dancingweapon.svg"] + } + else{ + flagData = functionStuff.powerLvl.level; + functionStuff.introText = actor.name + game.i18n.localize('POWER_DANCINGWEAPON.CHAT_ACTIVATE'); + await actor.setFlag(game.system.id, 'dancingweapon', flagData); + functionStuff.addCasterEffect = ["systems/symbaroum/asset/image/powers/dancingweapon.svg"]; + functionStuff.resultTextSuccess = game.i18n.localize('POWER_DANCINGWEAPON.CHAT_RESULT_ACTIVATE'); + } + await standardPowerResult(null, functionStuff); +} + async function entanglingvinesPrepare(ability, actor) { let targetData; try{targetData = getTarget("strong")} catch(error){ @@ -2756,7 +2622,7 @@ async function entanglingvinesPrepare(ability, actor) { tradition: ["witchcraft"] } let functionStuff = Object.assign({}, fsDefault , specificStuff); - let targetResMod = await checkResoluteModifiers(functionStuff.targetData.actor, functionStuff.targetData.autoParams, false, true); + let targetResMod = checkResoluteModifiers(functionStuff.targetData.actor, functionStuff.targetData.autoParams, false, true); functionStuff.favour += -1*targetResMod.favour; await modifierDialog(functionStuff) } @@ -2968,7 +2834,7 @@ async function inheritWound(ability, actor){ return; } let powerLvl = getPowerLevel(ability); - let actorResMod = await checkResoluteModifiers(actor, "", true, false); + let actorResMod = checkResoluteModifiers(actor, "", true, false); let favour = 0; let castingAttributeName = actorResMod.bestAttributeName; @@ -3025,7 +2891,7 @@ async function inheritWound(ability, actor){ }); if(powerLvl.level >= 2){ - templateData.finalText += "; Les poisons et saignements sont également redirigés." + templateData.finalText += game.i18n.localize('POWER_INHERITWOUND.CHAT_REDIRECT'); const pEffect = "icons/svg/poison.svg"; let poisonedEffectCounter = await getEffect(targetData.token, pEffect); if(poisonedEffectCounter){ @@ -3088,7 +2954,7 @@ async function larvaeBoilsPrepare(ability, actor) { ui.notifications.error(error); return; } - let targetResMod = await checkResoluteModifiers(targetData.actor, "", false, true); + let targetResMod = checkResoluteModifiers(targetData.actor, "", false, true); targetData.autoParams += targetResMod.autoParams; let fsDefault = await buildFunctionStuffDefault(ability, actor) let specificStuff = { @@ -3313,7 +3179,7 @@ async function maltransformationPrepare(ability, actor) { ui.notifications.error(error); return; } - let targetResMod = await checkResoluteModifiers(targetData.actor, targetData.autoParams, true, true); + let targetResMod = checkResoluteModifiers(targetData.actor, targetData.autoParams, true, true); let favour = -1*targetResMod.favour; targetData.resistAttributeName = targetResMod.bestAttributeName; targetData.resistAttributeValue = targetResMod.bestAttributeValue; @@ -4174,6 +4040,67 @@ async function witchsight(ability, actor) { // ********************************************* TRAITS ***************************************************** +async function poisonerPrepare(ability, actor) { + // get target + let targetData; + try{targetData = getTarget("strong")} catch(error){ + ui.notifications.error(error); + return; + } + let fsDefault = await buildFunctionStuffDefault(ability, actor) + let specificStuff = { + castingAttributeName: "cunning", + targetData: targetData, + resultFunction: poisonerResult + } + let functionStuff = Object.assign({}, fsDefault , specificStuff); + if(ability.data.data.reference === "poisoner") {functionStuff.poisoner = true} + else functionStuff.poison = functionStuff.powerLvl.level; + await modifierDialog(functionStuff) +} + +async function poisonerResult(rollData, functionStuff){ + let flagDataArray = []; + let targetText = ""; + + let poisonRes = await poisonCalc(functionStuff, rollData[0]); + + let introText = poisonRes.poisonChatIntro; + if(functionStuff.targetData.hasTarget){ + targetText = game.i18n.localize('ABILITY.CHAT_TARGET_VICTIM') + functionStuff.targetData.token.data.name; + if (functionStuff.targetData.autoParams != ""){targetText += ": " + functionStuff.targetData.autoParams} + } + let resultText = poisonRes.poisonChatResult; + if(poisonRes.flagData) flagDataArray.push(poisonRes.flagData); + + let templateData = { + targetData : functionStuff.targetData, + hasTarget : functionStuff.targetData.hasTarget, + introText: introText, + introImg: functionStuff.actor.data.img, + targetText: targetText, + subText: functionStuff.ability.name + " (" + functionStuff.powerLvl.lvlName + ")", + subImg: functionStuff.ability.img, + hasRoll: true, + rollString: await formatRollString(rollData[0], functionStuff.targetData.hasTarget, rollData[0].modifier), + rollResult : formatRollResult(rollData), + resultText: resultText, + finalText: "", + hasDamage: false, + haveCorruption: false + } + if(functionStuff.autoParams != ""){templateData.subText += ", " + functionStuff.autoParams}; + const html = await renderTemplate("systems/symbaroum/template/chat/ability.html", templateData); + const chatData = { + user: game.user.id, + content: html, + } + let NewMessage = await ChatMessage.create(chatData); + if(flagDataArray.length > 0){ + await createModifyTokenChatButton(flagDataArray); + } +} + async function regeneration(ability, actor){ let fsDefault = await buildFunctionStuffDefault(ability, actor); let specificStuff = { diff --git a/script/common/migration.js b/script/common/migration.js index 4a3067de..25f30228 100644 --- a/script/common/migration.js +++ b/script/common/migration.js @@ -5,12 +5,12 @@ export const migrateWorld = async () => { let worldTemplateVersion; try{ worldTemplateVersion = Number(game.settings.get("symbaroum", "worldTemplateVersion")); - console.log(`Detected worldTemplateVersion: ${worldTemplateVersion}`); + console.info(`Detected worldTemplateVersion: ${worldTemplateVersion}`); } catch(e){ console.error(e); worldTemplateVersion = 1; - console.log("No template version detected... Default to 1") + console.info("No template version detected... Default to 1") } if(worldTemplateVersion && (worldTemplateVersion < 3.3) && game.user.isGM){ //the world hasn't been properly migrated since foundryVTT0.8 // if((worldTemplateVersion < 3.3) && game.user.isGM){ //the world hasn't been properly migrated since foundryVTT0.8 @@ -24,7 +24,7 @@ export const migrateWorld = async () => { console.error(e); worldSystemVersion = '0'; } - console.log(`Last migration on this world: ${worldSystemVersion}`); + console.info(`Last migration on this world: ${worldSystemVersion}`); // the NEEDS_MIGRATION_VERSION have to be increased for migration to happen const NEEDS_MIGRATION_VERSION = '3.0.8'; const COMPATIBLE_MIGRATION_VERSION = '0' || isNaN('NaN'); @@ -45,7 +45,7 @@ export const migrateWorld = async () => { try { const updateData = migrateActorData(actor.toObject(), worldSystemVersion); if (!foundry.utils.isObjectEmpty(updateData)) { - console.log(`Migrating Actor entity ${actor.name}`); + console.info(`Migrating Actor entity ${actor.name}`); await actor.update(updateData, {enforceTypes: false}); } } catch (e) { @@ -57,7 +57,7 @@ export const migrateWorld = async () => { try { const updateData = migrateItemData(item.toObject(), worldSystemVersion); if (!foundry.utils.isObjectEmpty(updateData)) { - console.log(`Migrating Item entity ${item.name}`); + console.info(`Migrating Item entity ${item.name}`); await item.update(updateData, {enforceTypes: false}); } } catch (e) { @@ -105,7 +105,7 @@ const migrateOldWorld = async (worldTemplateVersion) => { try { const updateData = migrateOldActorData(actor.toObject(), worldTemplateVersion); if (!foundry.utils.isObjectEmpty(updateData)) { - console.log(`Migrating Actor entity ${actor.name}`); + console.info(`Migrating Actor entity ${actor.name}`); await actor.update(updateData, {enforceTypes: false}); } } catch (e) { @@ -117,7 +117,7 @@ const migrateOldWorld = async (worldTemplateVersion) => { try { const updateData = migrateOldItemData(item.toObject(), worldTemplateVersion); if (!foundry.utils.isObjectEmpty(updateData)) { - console.log(`Migrating Item entity ${item.name}`); + console.info(`Migrating Item entity ${item.name}`); await item.update(updateData, {enforceTypes: false}); } } catch (e) { @@ -240,7 +240,7 @@ export const migrateCompendium = async function (pack, worldSystemVersion) { // Save the entry, if data was changed if ( foundry.utils.isObjectEmpty(updateData) ) continue; await ent.update(updateData); - console.log(`Migrated ${entity} entity ${ent.name} in Compendium ${pack.collection}`); + console.info(`Migrated ${entity} entity ${ent.name} in Compendium ${pack.collection}`); } catch(err) { err.message = `Failed system migration for entity ${ent.name} in pack ${pack.collection}: ${err.message}`; @@ -284,7 +284,7 @@ const migrateOldActorData = (actor, worldTemplateVersion) => { }; let itemsChanged = false; - console.log(actor); + // console.log(actor); const items = actor.items.map((item) => { const itemUpdate = migrateOldItemData(item, worldTemplateVersion); if (!isObjectEmpty(itemUpdate)) { @@ -465,7 +465,7 @@ export const migrateOldCompendium = async function (pack, worldTemplateVersion) // Save the entry, if data was changed if ( foundry.utils.isObjectEmpty(updateData) ) continue; await ent.update(updateData); - console.log(`Migrated ${entity} entity ${ent.name} in Compendium ${pack.collection}`); + console.info(`Migrated ${entity} entity ${ent.name} in Compendium ${pack.collection}`); } catch(err) { err.message = `Failed system migration for entity ${ent.name} in pack ${pack.collection}: ${err.message}`; diff --git a/script/common/roll.js b/script/common/roll.js index aabc515b..4cdd7744 100644 --- a/script/common/roll.js +++ b/script/common/roll.js @@ -64,7 +64,7 @@ export async function rollAttribute(actor, actingAttributeName, targetActor, tar weaponResults.value = weaponRoll.total; weaponResults.name = weapon.name; weaponResults.diceBreakdown = tooltip; - console.log(tooltip); + weaponResults.img = weapon.img; } } @@ -295,19 +295,11 @@ To apply temporary corruption on the token } */ export async function createModifyTokenChatButton(actionsDataArray){ - - const html = await renderTemplate("systems/symbaroum/template/chat/applyEffectsButton.html"); - let gmList = ChatMessage.getWhisperRecipients('GM'); - if(gmList.length > 0){ - const chatData = { - user: game.user.id, - content: html, - whisper: gmList, - blind: true - } - let NewMessage = await ChatMessage.create(chatData); - await NewMessage.setFlag(game.system.id, 'abilityRoll', actionsDataArray); - } + game.symbaroum.emit( + { + type: "GMMessage", + data: actionsDataArray + }); } /*formatDice produces a string of any rolls with any ignored dice within a css class of .strike @@ -465,7 +457,7 @@ export async function damageRollWithDiceParams(functionStuff, critSuccess, attac else newRollDmgString += " - 0"; } // final damage - console.log(newRollDmgString); + // console.log(newRollDmgString); let dmgRoll= new Roll(newRollDmgString).evaluate(); return{ diff --git a/script/common/symbaroumConfig.js b/script/common/symbaroumConfig.js new file mode 100644 index 00000000..037cabbf --- /dev/null +++ b/script/common/symbaroumConfig.js @@ -0,0 +1,212 @@ +export class SymbaroumConfig extends FormApplication { + static get getDefaults() { + return { + addMenuButton: true, + }; + } + + // * Creates or removes the quick access config button + // * @param {Boolean} shown true to add, false to remove + + static toggleConfigButton(shown) { + const button = $('#SymbaroumButton'); + if (button) button.remove(); + + if (shown) { + const title = game.i18n.localize('SYMBAROUM.OPTIONAL_CONFIG_MENULABEL'); + + $(``) + .insertAfter('button[data-action="configure"]') + .on('click', (event) => { + const menu = game.settings.menus.get('symbaroum.symbaroumSettings'); + if (!menu) return ui.notifications.error('No submenu found for the provided key'); + const app = new menu.type(); + return app.render(true); + }); + } + } + + static get defaultOptions() { + return foundry.utils.mergeObject(super.defaultOptions, { + title: game.i18n.localize('SYMBAROUM.OPTIONAL_CONFIG_MENULABEL'), + id: 'symbaroumSettings', + icon: 'fas fa-cogs', + template: 'systems/symbaroum/template/symbaroumSettings.html', + width: 700, + closeOnSubmit: true, + }); + } + + getData(options) { + return foundry.utils.mergeObject({ + charBGChoice: game.settings.get('symbaroum', 'charBGChoice'), + charBGColour: game.settings.get('symbaroum', 'switchCharBGColour'), + npcBGChoice: game.settings.get('symbaroum', 'npcBGChoice'), + npcBGColour: game.settings.get('symbaroum', 'switchNpcBGColour'), + titleBGChoice: game.settings.get('symbaroum', 'titleBGChoice'), + titleBGColour: game.settings.get('symbaroum', 'switchTitleColour'), + editableChoice: game.settings.get('symbaroum', 'editableChoice'), + editableColour: game.settings.get('symbaroum', 'switchEditableColour'), + noneditableChoice: game.settings.get('symbaroum', 'nonEditableChoice'), + noneditableColour: game.settings.get('symbaroum', 'switchNoNEditableColour'), + }); + } + + activateListeners(html) { + super.activateListeners(html); + // html.find('#charBGImage').change(this._showPCColOption.bind(this)); + // html.find('#npcBGImage').change(this._showNPCColOption.bind(this)); + html.find('#charBGImage').change((ev) => this._showColOption(ev, '#pcColPanel', charBGImage.value)); + html.find('#npcBGImage').change((ev) => this._showColOption(ev, '#npcColPanel', npcBGImage.value)); + html.find('#titleBGImage').change((ev) => this._showColOption(ev, '#titleColPanel', titleBGImage.value)); + html.find('#editableImage').change((ev) => this._showColOption(ev, '#editableColPanel', editableImage.value)); + html.find('#nonEditableImage').change((ev) => this._showColOption(ev, '#noneditableColPanel', nonEditableImage.value)); + html.find('button[name="resetPC"]').click(this.onResetPC.bind(this)); + html.find('button[name="resetNPC"]').click(this.onResetNPC.bind(this)); + html.find('button[name="resetTitle"]').click(this.onResetTitle.bind(this)); + html.find('button[name="resetEditable"]').click(this.onResetEditable.bind(this)); + html.find('button[name="resetNonEditable"]').click(this.onResetNonEditable.bind(this)); + html.find('button[name="resetAll"]').click(this.onResetAll.bind(this)); + + document.getElementById('charBGImage').value = game.settings.get('symbaroum', 'charBGChoice'); + document.getElementById('npcBGImage').value = game.settings.get('symbaroum', 'npcBGChoice'); + document.getElementById('titleBGImage').value = game.settings.get('symbaroum', 'titleBGChoice'); + document.getElementById('editableImage').value = game.settings.get('symbaroum', 'editableChoice'); + document.getElementById('nonEditableImage').value = game.settings.get('symbaroum', 'nonEditableChoice'); + + if (game.settings.get('symbaroum', 'charBGChoice') === 'none') { + document.getElementById('pcColPanel').style.display = 'block'; + } + if (game.settings.get('symbaroum', 'npcBGChoice') === 'none') { + document.getElementById('npcColPanel').style.display = 'block'; + } + if (game.settings.get('symbaroum', 'titleBGChoice') === 'none') { + document.getElementById('titleColPanel').style.display = 'block'; + } + if (game.settings.get('symbaroum', 'editableChoice') === 'none') { + document.getElementById('editableColPanel').style.display = 'block'; + } + if (game.settings.get('symbaroum', 'nonEditableChoice') === 'none') { + document.getElementById('noneditableColPanel').style.display = 'block'; + } + } + + onResetPC() { + game.settings.set('symbaroum', 'charBGChoice', 'url(../asset/image/background/green_flower_light.webp) repeat'); + game.settings.set('symbaroum', 'switchCharBGColour', 'url(../asset/image/background/green_flower_light.webp) repeat'); + location.reload(); + } + + onResetNPC() { + game.settings.set('symbaroum', 'npcBGChoice', 'url(../asset/image/background/purple_flower_light.webp) repeat'); + game.settings.set('symbaroum', 'switchNpcBGColour', 'url(../asset/image/background/purple_flower_light.webp) repeat'); + location.reload(); + } + + onResetTitle() { + game.settings.set('symbaroum', 'titleBGChoice', 'url(../asset/image/background/title.webp)'); + game.settings.set('symbaroum', 'switchTitleColour', 'url(../asset/image/background/title.webp)'); + location.reload(); + } + + onResetEditable() { + game.settings.set('symbaroum', 'editableChoice', 'url(../asset/image/background/editable.webp)'); + game.settings.set('symbaroum', 'switchEditableColour', 'url(../asset/image/background/editable.webp)'); + location.reload(); + } + onResetNonEditable() { + game.settings.set('symbaroum', 'nonEditableChoice', 'url(../asset/image/background/not-editable.webp)'); + game.settings.set('symbaroum', 'switchNoNEditableColour', 'url(../asset/image/background/not-editable.webp)'); + location.reload(); + } + + onResetAll() { + game.settings.set('symbaroum', 'charBGChoice', 'url(../asset/image/background/green_flower_light.webp) repeat'); + game.settings.set('symbaroum', 'switchCharBGColour', 'url(../asset/image/background/green_flower_light.webp) repeat'); + game.settings.set('symbaroum', 'npcBGChoice', 'url(../asset/image/background/purple_flower_light.webp) repeat'); + game.settings.set('symbaroum', 'switchNpcBGColour', 'url(../asset/image/background/purple_flower_light.webp) repeat'); + game.settings.set('symbaroum', 'titleBGChoice', 'url(../asset/image/background/title.webp)'); + game.settings.set('symbaroum', 'switchTitleColour', 'url(../asset/image/background/title.webp)'); + game.settings.set('symbaroum', 'editableChoice', 'url(../asset/image/background/editable.webp)'); + game.settings.set('symbaroum', 'switchEditableColour', 'url(../asset/image/background/editable.webp)'); + game.settings.set('symbaroum', 'nonEditableChoice', 'url(../asset/image/background/not-editable.webp)'); + game.settings.set('symbaroum', 'switchNoNEditableColour', 'url(../asset/image/background/not-editable.webp)'); + location.reload(); + } + + async _updateObject(event, formData) { + await game.settings.set('symbaroum', 'charBGChoice', formData.charBGImage); + await game.settings.set('symbaroum', 'npcBGChoice', formData.npcBGImage); + await game.settings.set('symbaroum', 'titleBGChoice', formData.titleBGImage); + await game.settings.set('symbaroum', 'editableChoice', formData.editableImage); + await game.settings.set('symbaroum', 'nonEditableChoice', formData.nonEditableImage); + + if (charBGImage.value === 'none') { + if (formData.npcBGColour.length > 0 && formData.charBGColour[0] != '#') { + formData.charBGColour = '#000000'; + } + await game.settings.set('symbaroum', 'switchCharBGColour', formData.charBGColour); + } else { + await game.settings.set('symbaroum', 'switchCharBGColour', formData.charBGImage); + } + + if (npcBGImage.value === 'none') { + if (formData.npcBGColour.length > 0 && formData.npcBGColour[0] != '#') { + formData.npcBGColour = '#000000'; + } + await game.settings.set('symbaroum', 'switchNpcBGColour', formData.npcBGColour); + } else { + await game.settings.set('symbaroum', 'switchNpcBGColour', formData.npcBGImage); + } + if (titleBGImage.value === 'none') { + if (formData.titleBGColour.length > 0 && formData.titleBGColour[0] != '#') { + formData.titleBGColour = '#000000'; + } + await game.settings.set('symbaroum', 'switchTitleColour', formData.titleBGColour); + } else { + await game.settings.set('symbaroum', 'switchTitleColour', formData.titleBGImage); + } + + if (editableImage.value === 'none') { + if (formData.editableColour.length > 0 && formData.editableColour[0] != '#') { + formData.editableColour = '#000000'; + } + await game.settings.set('symbaroum', 'switchEditableColour', formData.editableColour); + } else { + await game.settings.set('symbaroum', 'switchEditableColour', formData.editableImage); + } + + if (nonEditableImage.value === 'none') { + if (formData.noneditableColour.length > 0 && formData.noneditableColour[0] != '#') { + formData.noneditableColour = '#000000'; + } + await game.settings.set('symbaroum', 'switchNoNEditableColour', formData.noneditableColour); + } else { + await game.settings.set('symbaroum', 'switchNoNEditableColour', formData.nonEditableImage); + } + + location.reload(); + } + + close() { + super.close(); + } + + async _showColOption(event, mChild, iValue) { + event.preventDefault(); + let li = $(event.currentTarget).parents('.tab-active'); + let li2 = li.children(mChild); + let tHeight = parseInt(li[0].offsetParent.style.height.replace(/[^0-9]/g, '')); + if (li2[0].style.display === 'none' && iValue === 'none') { + tHeight = tHeight + 30; + li[0].offsetParent.style.height = tHeight.toString() + 'px'; + li2[0].style.display = 'block'; + } else if (li2[0].style.display != 'none') { + tHeight = tHeight - 30; + li[0].offsetParent.style.height = tHeight.toString() + 'px'; + li2[0].style.display = 'none'; + } + } +} diff --git a/script/common/symbcomms.js b/script/common/symbcomms.js new file mode 100644 index 00000000..565ff920 --- /dev/null +++ b/script/common/symbcomms.js @@ -0,0 +1,27 @@ + +export class SymbaroumCommsListener +{ + static async receiveData(data) + { + if(game.user.isGM && data["GMMessage"] !== null ) + { + const html = await renderTemplate("systems/symbaroum/template/chat/applyEffectsButton.html"); + const chatData = { + speaker: ChatMessage.getSpeaker({alias:game.i18n.localize("DIALOG.SYSTEM_MESSAGE")}), + whisper: [game.user], + content: html + }; + let newMessage = await ChatMessage.create(chatData); + await newMessage.setFlag(game.system.id, 'abilityRoll', data.data); + } + } + + static async ready() { + game.socket.on("system.symbaroum",SymbaroumCommsListener.receiveData); + + game.symbaroum.emit = (data) => { + game.socket.emit("system.symbaroum", data ); + SymbaroumCommsListener.receiveData(data); + }; + } +} \ No newline at end of file diff --git a/script/sheet/ability.js b/script/sheet/ability.js index de43bddb..92deff3a 100644 --- a/script/sheet/ability.js +++ b/script/sheet/ability.js @@ -21,7 +21,6 @@ export class AbilitySheet extends SymbaroumItemSheet { getData() { const data = super.getData(); data.isOwned = this.item.isOwned; - console.log(data); return data; } diff --git a/script/sheet/actor.js b/script/sheet/actor.js index fd0614d8..d8629efe 100644 --- a/script/sheet/actor.js +++ b/script/sheet/actor.js @@ -70,7 +70,7 @@ export class SymbaroumActorSheet extends ActorSheet { event.preventDefault(); const div = $(event.currentTarget).parents('.item'); const item = this.actor.items.get(div.data('itemId')); - if (item !== null) item.sheet.render(true); + if (item) item.sheet.render(true); } _onItemDelete(event) { @@ -93,8 +93,7 @@ export class SymbaroumActorSheet extends ActorSheet { event.preventDefault(); const div = $(event.currentTarget).parents('.item'); const item = this.actor.items.get(div.data('itemId')); - console.log(div); - console.log(item); + if (item === null || item === undefined) { return; } @@ -110,7 +109,6 @@ export class SymbaroumActorSheet extends ActorSheet { data = { _id: item.id, id: item.id, 'data.state': 'active' }; break; } - console.log(data); this.actor.updateEmbeddedDocuments("Item", [data]); // Used to have render:false } diff --git a/script/sheet/item.js b/script/sheet/item.js index 9df1e3f4..17f732c3 100644 --- a/script/sheet/item.js +++ b/script/sheet/item.js @@ -7,11 +7,19 @@ export class SymbaroumItemSheet extends ItemSheet { } getData() { - return { + let data = { id:this.item.id, - item:foundry.utils.deepClone(this.item.data), - data: foundry.utils.deepClone(this.item.data.data) + item: this.item.data, + data: foundry.utils.deepClone(this.item.data.data), + cssClass : this.isEditable ? "editable" : "locked", + editable : this.isEditable }; + + data.symbaroumOptions = { + isGM: game.user.isGM, + allowShowReference: game.settings.get('symbaroum', 'allowShowReference') + }; + return data; } _getHeaderButtons() { @@ -69,6 +77,7 @@ export class SymbaroumItemSheet extends ItemSheet { _id:this.item.id, "data.power": arr }; + this.item.update(update); } diff --git a/script/sheet/monster.js b/script/sheet/monster.js new file mode 100644 index 00000000..bb2557de --- /dev/null +++ b/script/sheet/monster.js @@ -0,0 +1,10 @@ +import { PlayerSheet2 } from "./player2.js"; + +export class MonsterSheet extends PlayerSheet2 { + + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + classes: ["symbaroum", "sheet", "actor", "monster"] + }); + } +} \ No newline at end of file diff --git a/script/sheet/player.js b/script/sheet/player.js index 4991ba90..7ca3863c 100644 --- a/script/sheet/player.js +++ b/script/sheet/player.js @@ -32,7 +32,7 @@ export class PlayerSheet extends SymbaroumActorSheet { html.find(".roll-attribute").click(async ev => await this._prepareRollAttribute(ev)); html.find(".roll-armor").click(async ev => await this._prepareRollArmor(ev)); html.find(".roll-weapon").click(async ev => await this._prepareRollWeapon(ev)); - html.find(".modify-attribute").click(async ev => await this._modifyAttributes(ev)); + html.find(".modify-attributes").click(async ev => await this._modifyAttributes(ev)); } _getHeaderButtons() { diff --git a/script/sheet/player2.js b/script/sheet/player2.js index 37d70ae4..6209995d 100644 --- a/script/sheet/player2.js +++ b/script/sheet/player2.js @@ -6,7 +6,7 @@ export class PlayerSheet2 extends PlayerSheet { static get defaultOptions() { return mergeObject(super.defaultOptions, { - classes: ["symbaroum", "sheet", "actor"], + classes: ["symbaroum", "sheet", "actor", "player"], template: "systems/symbaroum/template/sheet/player2.html", width: 800, height: 1000, @@ -40,6 +40,23 @@ export class PlayerSheet2 extends PlayerSheet { data.cssClass = this.isEditable ? "editable" : "locked"; data.editable = this.isEditable; + data.symbaroumOptions = { + isGM: game.user.isGM, + isNPC: this.actor.type === "monster", + showNpcModifiers: game.settings.get('symbaroum', 'showNpcModifiers') + }; + return data; } + + render(args) + { + if(this.actor.type === "monster") { + this.constructor.defaultOptions.classes = ["symbaroum", "sheet", "actor"]; + } else { + this.constructor.defaultOptions.classes = ["symbaroum", "sheet", "actor", "monster"]; + } + + super.render(args); + } } diff --git a/scss/chat/_ability.scss b/scss/chat/_ability.scss index b8de25d5..63fab705 100644 --- a/scss/chat/_ability.scss +++ b/scss/chat/_ability.scss @@ -9,14 +9,15 @@ .symbaroum.chat.combat .foreground, .symbaroum.chat.ability .foreground { - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; padding: 10px; } .symbaroum.chat.combat .border, .symbaroum.chat.ability .border { border: 1px solid transparent; - border-image: url(../asset/image/title.jpg) 20/5px round; + border-color: var(--title-color); + border-image: var(--title-image) 20/10px; } .symbaroum.chat.combatstrong, diff --git a/scss/chat/_dialog.scss b/scss/chat/_dialog.scss index dc26e7ff..b845486d 100644 --- a/scss/chat/_dialog.scss +++ b/scss/chat/_dialog.scss @@ -11,12 +11,16 @@ font-weight: bold; color: var(--color-label); font-family: var(--font-text); - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; width: 100%; text-align: center; padding: 5px; } +.symbaroum.dialog .lblfavour .checkbox { + white-space: nowrap; +} + .symbaroum.dialog .weapondamage { padding-left: 5px; } @@ -26,17 +30,17 @@ font-weight: bold; color: var(--color-label); font-family: var(--font-text); - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; width: 10em; - min-width: 10em; + min-width: 10em; text-align: center; padding: 5px; } .symbaroum.dialog input[type='checkbox'] { - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; border: 1px solid var(--color-border); - box-shadow: inset 0 0 6px black; + // box-shadow: inset 0 0 6px black; color: var(--color-text); width: 100%; height: auto; @@ -45,7 +49,7 @@ .symbaroum.dialog input[type='text'], .symbaroum.dialog input[type='number'], .symbaroum.dialog select { - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; border: 1px solid var(--color-border); box-shadow: inset 0 0 6px black; color: var(--color-text); @@ -93,3 +97,8 @@ flex-basis: 100%; margin: 5px 10px; } + +.symbaroum.dialog input[type='text'][disabled], +.symbaroum.dialog input[type='number'][disabled] { + background: var(--box-non-editable) repeat; +} \ No newline at end of file diff --git a/scss/chat/_item.scss b/scss/chat/_item.scss index d9198b9b..9a615659 100644 --- a/scss/chat/_item.scss +++ b/scss/chat/_item.scss @@ -7,13 +7,14 @@ } .symbaroum.chat.item .foreground { - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; padding: 10px; } .symbaroum.chat.item .border { border: 1px solid transparent; - border-image: url(../asset/image/title.jpg) 20/5px round; + border-color: var(--title-color); + border-image: var(--title-image) 20/10px; } .symbaroum.chat.item strong { diff --git a/scss/chat/_roll.scss b/scss/chat/_roll.scss index 9c027288..f997fe56 100644 --- a/scss/chat/_roll.scss +++ b/scss/chat/_roll.scss @@ -7,13 +7,14 @@ } .symbaroum.chat.roll .foreground { - background: url(../asset/image/editable.jpg) repeat; + background: var(--chat-background) repeat; padding: 10px; } .symbaroum.chat.roll .border { border: 1px solid transparent; - border-image: url(../asset/image/title.jpg) 20/5px round; + border-color: var(--color-border); + border-image: var(--chat-roll-border) 20/10px; } .symbaroum.chat.roll strong { diff --git a/scss/common/_actor.scss b/scss/common/_actor.scss index c49f7ae7..6b0e9738 100644 --- a/scss/common/_actor.scss +++ b/scss/common/_actor.scss @@ -1,5 +1,9 @@ -.symbaroum.sheet.actor .window-content { - background: url(../asset/image/background.jpg) repeat; +.symbaroum.sheet.actor.player .window-content { + background: var(--color-charBG); +} + +.symbaroum.sheet.actor.monster .window-content { + background: var(--color-npcBG); } .symbaroum.sheet.actor .window-content .editable { @@ -7,12 +11,14 @@ } .symbaroum.sheet.actor .foreground { - background: url(../asset/image/foreground.jpg) repeat; + background: url(../asset/image/foreground.webp) repeat; } .symbaroum.sheet.actor .border { border: 10px solid transparent; - border-image: url(../asset/image/title.jpg) 20/10px round; + border-color: var(--title-color); + border-image: var(--title-image) 20/10px; + // border-image: url(../asset/image/title.jpg) 20/10px round; } .symbaroum.sheet.actor h1 { @@ -23,7 +29,7 @@ font-size: 16px; margin: 0; text-align: center; - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; color: var(--color-title); font-family: var(--font-text); } @@ -33,7 +39,7 @@ font-weight: bold; color: var(--color-label); font-family: var(--font-text); - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; width: 10em; text-align: center; padding: 5px; @@ -44,7 +50,7 @@ font-weight: bold; color: var(--color-label); font-family: var(--font-text); - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; text-align: center; padding: 0; cursor: pointer; @@ -61,7 +67,7 @@ .symbaroum.sheet.actor input[type='text'], .symbaroum.sheet.actor input[type='number'] { - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; border: 1px solid var(--color-border); box-shadow: inset 0 0 6px black; color: var(--color-text); @@ -78,7 +84,7 @@ } .symbaroum.sheet.actor select { - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; border: 1px solid var(--color-border); box-shadow: inset 0 0 6px black; color: var(--color-text); @@ -90,6 +96,8 @@ border-radius: 0; -moz-appearance: textfield; text-align: center; + border-color: var(--title-color); + border-image: var(--title-image) 20/10px; } .symbaroum.sheet.actor input[type='number']::-webkit-outer-spin-button, @@ -100,7 +108,7 @@ .symbaroum.sheet.actor input[type='text'][disabled], .symbaroum.sheet.actor input[type='number'][disabled] { - background: url(../asset/image/not-editable.jpg) repeat; + background: var(--box-non-editable) repeat; } .symbaroum.sheet.actor .item-list { @@ -119,7 +127,7 @@ font-weight: bold; color: var(--color-label); font-family: var(--font-text); - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; text-align: center; padding: 5px; border: none; @@ -138,7 +146,7 @@ } .symbaroum.sheet.actor .image-container { - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; border: 1px solid var(--color-border); box-shadow: inset 0 0 6px black; } diff --git a/scss/common/_item.scss b/scss/common/_item.scss index e1aeb1fd..0592bbb7 100644 --- a/scss/common/_item.scss +++ b/scss/common/_item.scss @@ -1,5 +1,5 @@ .symbaroum.sheet.item .window-content { - background: url(../asset/image/background.jpg) repeat; + background: var(--color-charBG); } .symbaroum.sheet.item .window-content .editable { @@ -7,12 +7,13 @@ } .symbaroum.sheet.item .foreground { - background: url(../asset/image/foreground.jpg) repeat; + background: url(../asset/image/foreground.webp) repeat; } .symbaroum.sheet.item .border { border: 10px solid transparent; - border-image: url(../asset/image/title.jpg) 20/10px round; + border-color: var(--title-color); + border-image: var(--title-image) 20/10px; } .symbaroum.sheet.item h1 { @@ -23,7 +24,7 @@ font-size: 1.2em; margin: 0; text-align: center; - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; color: var(--color-title); font-family: var(--font-text); } @@ -33,21 +34,20 @@ height: 1.5em; line-height: 1.5em; border: 0 none; - font-size: 1.0em; + font-size: 1em; margin: 0; text-align: center; - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; color: var(--color-title); font-family: var(--font-text); } - .symbaroum.sheet.item label { font-size: 14px; font-weight: bold; color: var(--color-label); font-family: var(--font-text); - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; width: 100%; text-align: center; padding: 5px; @@ -65,15 +65,35 @@ cursor: pointer; } +.symbaroum.sheet.item button { + font-size: 14px; + font-weight: bold; + color: var(--color-label); + font-family: var(--font-text); + background: var(--title-color) repeat; + text-align: center; + padding: 0; + cursor: pointer; + border: none; + border-radius: 0; + margin: 0; +} + +.symbaroum.sheet.actor button:hover { + color: var(--color-active); + text-shadow: 0 0 10px var(--color-active); + box-shadow: none; +} + .symbaroum.sheet.item input[type='text'][disabled], .symbaroum.sheet.item input[type='number'][disabled] { - background: url(../asset/image/not-editable.jpg) repeat; + background: var(--box-non-editable) repeat; } .symbaroum.sheet.item input[type='text'], .symbaroum.sheet.item input[type='number'], .symbaroum.sheet.item select { - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; border: 1px solid var(--color-border); box-shadow: inset 0 0 6px black; color: var(--color-text); @@ -121,7 +141,7 @@ } .symbaroum.sheet.item .sheet-header .avatar { - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; border: 1px solid black; box-shadow: inset 0 0 6px black; flex: 0 0 auto; @@ -178,7 +198,7 @@ color: var(--color-text); height: 100%; width: 100%; - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; box-shadow: inset 0 0 6px black; } @@ -197,7 +217,7 @@ } .symbaroum.sheet.item .editor .tox .tox-toolbar__primary { - background: url(../asset/image/title.jpg) repeat; + background: var(--title-image) repeat; } .symbaroum.sheet.item .editor .tox .tox-tbtn svg:hover { @@ -214,7 +234,7 @@ font-size: 18px; margin: 5px; padding: 5px; - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; font-family: var(--font-text); } diff --git a/scss/common/_system-guide.scss b/scss/common/_system-guide.scss index 268ef076..3f6bea49 100644 --- a/scss/common/_system-guide.scss +++ b/scss/common/_system-guide.scss @@ -1,8 +1,18 @@ .img01 { display: block; background-image: url('../asset/image/system-guide/01.webp'); - width: 608px; - height: 218px; + width: 750px; + height: 179px; + margin-left: auto; + margin-right: auto; + background-size: 100%; + border: 0; +} +.img01-01 { + display: block; + background-image: url('../asset/image/system-guide/01-01.webp'); + width: 300px; + height: 550px; margin-left: auto; margin-right: auto; background-size: 100%; @@ -31,8 +41,8 @@ .img04 { display: block; background-image: url('../asset/image/system-guide/04.webp'); - width: 694px; - height: 146px; + width: 654px; + height: 244px; margin-left: auto; margin-right: auto; background-size: 100%; @@ -41,8 +51,8 @@ .img06 { display: block; background-image: url('../asset/image/system-guide/06.webp'); - width: 204px; - height: 176px; + width: 284px; + height: 554px; margin-left: auto; margin-right: auto; background-size: 100%; @@ -141,8 +151,8 @@ .img16 { display: block; background-image: url('../asset/image/system-guide/16.webp'); - width: 609px; - height: 83px; + width: 750px; + height: 145px; margin-left: auto; margin-right: auto; background-size: 100%; @@ -151,8 +161,8 @@ .img17 { display: block; background-image: url('../asset/image/system-guide/17.webp'); - width: 280px; - height: 202px; + width: 400px; + height: 278px; margin-left: auto; margin-right: auto; background-size: 100%; @@ -171,8 +181,8 @@ .img19 { display: block; background-image: url('../asset/image/system-guide/19.webp'); - width: 399px; - height: 241px; + width: 400px; + height: 201px; margin-left: auto; margin-right: auto; background-size: 100%; @@ -221,8 +231,8 @@ .img05 { display: block; background-image: url('../asset/image/system-guide/armor-add.webp'); - width: 477px; - height: 116px; + width: 677px; + height: 218px; margin-left: auto; margin-right: auto; background-size: 100%; @@ -231,8 +241,8 @@ .img24 { display: block; background-image: url('../asset/image/system-guide/weapon-state.webp'); - width: 462px; - height: 175px; + width: 682px; + height: 355px; margin-left: auto; margin-right: auto; background-size: 100%; @@ -258,3 +268,33 @@ background-size: 100%; border: 0; } +.config-button { + display: block; + background-image: url('../asset/image/system-guide/config-button.webp'); + width: 293px; + height: 121px; + margin-left: auto; + margin-right: auto; + background-size: 100%; + border: 0; +} +.configuration-settings { + display: block; + background-image: url('../asset/image/system-guide/configuration-settings.webp'); + width: 499px; + height: 326px; + margin-left: auto; + margin-right: auto; + background-size: 100%; + border: 0; +} +.configuration-settings-cp { + display: block; + background-image: url('../asset/image/system-guide/configuration-settings-cp.webp'); + width: 495px; + height: 327px; + margin-left: auto; + margin-right: auto; + background-size: 100%; + border: 0; +} diff --git a/scss/common/_system-override.scss b/scss/common/_system-override.scss new file mode 100644 index 00000000..029c414b --- /dev/null +++ b/scss/common/_system-override.scss @@ -0,0 +1,18 @@ +#pause { + background: none; + & > img { + content: url('../asset/image/head.webp'); + width: 200px; + height: 200px; + top: -50px; + left: calc(50% - 100px); + opacity: 0.7; + -webkit-animation: rotation 10s infinite linear; + animation: rotation 10s infinite linear; + } + h3 { + font-family: var(--font-text); + font-size: 32px; + text-shadow: 0px 3px 5px rgba(0, 0, 0, 1); + } +} diff --git a/scss/common/_variable.scss b/scss/common/_variable.scss index 57368bb7..d5ada06d 100644 --- a/scss/common/_variable.scss +++ b/scss/common/_variable.scss @@ -13,4 +13,13 @@ --color-shadow: #a48b02; --font-text: 'Philosopher', serif; + + --color-charBG: 'url(../asset/image/background/green_flower_light.webp) repeat'; + --color-npcBG: 'url(../asset/image/background/purple_flower_light.webp) repeat'; + --title-image: 'url(../asset/image/background/title.webp)'; + --title-color: black; + --box-editable: 'url(../asset/image/background/editable.webp)'; + --box-non-editable: 'url(../asset/image/background/not-editable.webp)'; + --chat-background: 'url(../asset/image/background/editable.webp)'; + --chat-roll-border: 'url(../asset/image/background/title.webp)'; } diff --git a/scss/sheet/_artifact.scss b/scss/sheet/_artifact.scss index 11ba8ed9..35c55719 100644 --- a/scss/sheet/_artifact.scss +++ b/scss/sheet/_artifact.scss @@ -1,78 +1,76 @@ .symbaroum.sheet.item .artifact { - display: flex; - flex-direction: column; - flex-wrap: nowrap; - width: 100%; + display: flex; + flex-direction: column; + flex-wrap: nowrap; + width: 100%; } .symbaroum.sheet.item .artifact .power-n { - display: flex; - flex-direction: column; - height: fit-content; - width: 100%; + display: flex; + flex-direction: column; + height: fit-content; + width: 100%; } +.symbaroum.sheet.item .artifact .power-n .editor +{ + width: calc(100% - 10px); +} + .symbaroum.sheet.item .artifact .power-n .power-header, .symbaroum.sheet.item .artifact .power-add { - display: flex; - flex: auto; - flex-flow: row; - flex-wrap: nowrap; - flex-basis: 100%; - height:fit-content; - margin: 5px; - background: url(../asset/image/title.jpg) repeat; + display: flex; + flex: auto; + flex-flow: row; + flex-wrap: nowrap; + flex-basis: 100%; + height: fit-content; + margin: 5px; + background: var(--title-color) repeat; } .symbaroum.sheet.item .artifact .power-n .power-header .heading, -.symbaroum.sheet.item .artifact .power-add .button -{ - width:100%; +.symbaroum.sheet.item .artifact .power-add .button { + width: 100%; } - .symbaroum.sheet.item .artifact .power-n .name, .symbaroum.sheet.item .artifact .power-n .action, -.symbaroum.sheet.item .artifact .power-n .corruption -{ - display: flex; - flex-direction: row; - flex-basis: 100%; - margin: 5px; +.symbaroum.sheet.item .artifact .power-n .corruption { + display: flex; + flex-direction: row; + flex-basis: 100%; + margin: 5px; } .symbaroum.sheet.item .artifact .power-n .power-header, .symbaroum.sheet.item .artifact .power-n .name, .symbaroum.sheet.item .artifact .power-n .action, .symbaroum.sheet.item .artifact .power-n .corruption, -.symbaroum.sheet.item .artifact .power-n .editor - { - margin:5px; - } - +.symbaroum.sheet.item .artifact .power-n .editor { + margin: 5px; +} .symbaroum.sheet.item .artifact .power-n .power-header .fas, -.symbaroum.sheet.item .artifact .power-add .fas { - width: 20px; - margin: 5px; - color: var(--color-title); +.symbaroum.sheet.item .artifact .power-add .fas { + width: 20px; + margin: 5px; + color: var(--color-title); } -.symbaroum.sheet.item .artifact .power-add .power-create { - white-space: nowrap; +.symbaroum.sheet.item .artifact .power-add .power-create { + white-space: nowrap; } -.symbaroum.sheet.item .artifact .power-add .power-create label { - padding: 0px; +.symbaroum.sheet.item .artifact .power-add .power-create label { + padding: 0px; } - .symbaroum.sheet.item .artifact .power-n .power-header .heading, -.symbaroum.sheet.item .artifact .power-add -{ - width: 100%; - font-size: 18px; - font-family: var(--font-text); - color: var(--color-title); +.symbaroum.sheet.item .artifact .power-add { + width: 100%; + font-size: 18px; + font-family: var(--font-text); + color: var(--color-title); } .symbaroum.sheet.item .artifact .description, @@ -80,54 +78,53 @@ .symbaroum.sheet.item .artifact .power2, .symbaroum.sheet.item .artifact .power3, .symbaroum.sheet.item .artifact .bonus { - display: flex; - flex-direction: row; - flex-wrap: wrap; - flex-basis: 100%; - border-top: none; + display: flex; + flex-direction: row; + flex-wrap: wrap; + flex-basis: 100%; + border-top: none; } .symbaroum.sheet.item .artifact .description .editor { - height: 166px; + height: 166px; } - .symbaroum.sheet.item .artifact .tab .corruption, .symbaroum.sheet.item .artifact .tab .action { - display: flex; - flex-direction: row; - flex-basis: calc(50% - 15px); + display: flex; + flex-direction: row; + flex-basis: calc(50% - 15px); } // Remove all below once we are happy with the new artifacts .symbaroum.sheet.item .artifact .tab .action { - margin: 10px 5px 0 10px; + margin: 10px 5px 0 10px; } .symbaroum.sheet.item .artifact .tab .corruption { - margin: 10px 10px 0 5px; + margin: 10px 10px 0 5px; } .symbaroum.sheet.item .artifact .tab .bonus .scroll { - overflow-y: scroll; - height: 186px; - display: flex; - flex-basis: 100%; - flex-wrap: wrap; + overflow-y: scroll; + height: 186px; + display: flex; + flex-basis: 100%; + flex-wrap: wrap; } .symbaroum.sheet.item .artifact .tab .bonus .attribute { - display: flex; - flex-direction: row; - flex-basis: 100%; - margin: 5px 10px; + display: flex; + flex-direction: row; + flex-basis: 100%; + margin: 5px 10px; } .symbaroum.sheet.item .artifact .tab .bonus .attribute:first-child { - margin-top: 10px; + margin-top: 10px; } .symbaroum.sheet.item .artifact .tab .bonus .attribute:last-child { - margin-bottom: 10px; + margin-bottom: 10px; } diff --git a/scss/sheet/_attributes.scss b/scss/sheet/_attributes.scss index 014e659b..c4c376ce 100644 --- a/scss/sheet/_attributes.scss +++ b/scss/sheet/_attributes.scss @@ -1,144 +1,143 @@ .symbaroum.attributes { - background: url(../asset/image/background.jpg) repeat; - } - - .symbaroum.attributes .window-content .editable { - flex: 0; - } - - .symbaroum.attributes .foreground { - background: url(../asset/image/foreground.jpg) repeat; - } - - .symbaroum.attributes .border { - border: 10px solid transparent; - border-image: url(../asset/image/title.jpg) 20/10px round; - } - - .symbaroum.attributes h1 { - width: 100%; - height: 30px; - line-height: 30px; - border: 0 none; - font-size: 16px; - margin: 0; - text-align: center; - background: url(../asset/image/title.jpg) repeat; - color: var(--color-title); - font-family: var(--font-text); - } - - .symbaroum.attributes label { - font-size: 14px; - font-weight: bold; - color: var(--color-label); - font-family: var(--font-text); - background: url(../asset/image/title.jpg) repeat; - width: 10em; - text-align: center; - padding: 5px; - } - - .symbaroum.attributes button { - font-size: 14px; - font-weight: bold; - color: var(--color-label); - font-family: var(--font-text); - background: url(../asset/image/title.jpg) repeat; - text-align: center; - padding: 0; - cursor: pointer; - border: none; - border-radius: 0; - margin: 0; - } - - .symbaroum.attributes button:hover { - color: var(--color-active); - text-shadow: 0 0 10px var(--color-active); - box-shadow: none; - } - - .symbaroum.attributes input[type='text'], - .symbaroum.attributes input[type='number'] { - background: url(../asset/image/editable.jpg) repeat; - border: 1px solid var(--color-border); - box-shadow: inset 0 0 6px black; - color: var(--color-text); - font-size: 14px; - height: auto; - line-height: 16px; - width: 100%; - font-family: var(--font-text); - border-left: 0; - border-radius: 0; - -moz-appearance: textfield; - text-align: center; - min-width: 0; - } - - - .symbaroum.attributes input[type='number'][disabled] { - background: url(../asset/image/not-editable.jpg) repeat; - } - - .symbaroum.attributes .fixed { - background: url(../asset/image/not-editable.jpg) repeat; - border: 1px solid var(--color-border); - box-shadow: inset 0 0 6px black; - font-size: 14px; - height: auto; - line-height: 16px; - width: 100%; - font-family: var(--font-text); - border-left: 0; - border-radius: 0; - -moz-appearance: textfield; - text-align: center; - min-width: 0; - } - - .symbaroum.attributes .attArray { - display: flex; - flex-direction: row; - /* justify-content: center; */ - } - - .symbaroum.attributes .attArray { - flex-basis: 100%; - } - - .symbaroum.attributes .attArray { - justify-content: center; - } - - .symbaroum.attributes .attArray { - margin-top: 5px; - margin-bottom: 5px; - } - - .symbaroum.attributes .item { - display: flex; - flex-basis: 25%; - justify-content: center; - } - - .symbaroum.attributes .item-name { - min-width: 10em; - } - - .symbaroum.attributes .col-header { - display: flex; - flex-direction: row; - flex-basis: 100%; - } - - .symbaroum.attributes .col-header { - background: url(../asset/image/not-editable.jpg) repeat; - border: 1px solid var(--color-border); - border-left: none; - box-shadow: inset 0 0 6px black; - height: 28px; - line-height: 28px; - text-align: center; - } + background: var(--color-charBG); +} + +.symbaroum.attributes .window-content .editable { + flex: 0; +} + +.symbaroum.attributes .foreground { + background: url(../asset/image/foreground.webp) repeat; +} + +.symbaroum.attributes .border { + border: 10px solid transparent; + border-image: var(--title-image) 20/10px round; +} + +.symbaroum.attributes h1 { + width: 100%; + height: 30px; + line-height: 30px; + border: 0 none; + font-size: 16px; + margin: 0; + text-align: center; + background: var(--title-image) repeat; + color: var(--color-title); + font-family: var(--font-text); +} + +.symbaroum.attributes label { + font-size: 14px; + font-weight: bold; + color: var(--color-label); + font-family: var(--font-text); + background: var(--title-image) repeat; + width: 10em; + text-align: center; + padding: 5px; +} + +.symbaroum.attributes button { + font-size: 14px; + font-weight: bold; + color: var(--color-label); + font-family: var(--font-text); + background: var(--title-image) repeat; + text-align: center; + padding: 0; + cursor: pointer; + border: none; + border-radius: 0; + margin: 0; +} + +.symbaroum.attributes button:hover { + color: var(--color-active); + text-shadow: 0 0 10px var(--color-active); + box-shadow: none; +} + +.symbaroum.attributes input[type='text'], +.symbaroum.attributes input[type='number'] { + background: var(--box-editable) repeat; + border: 1px solid var(--color-border); + box-shadow: inset 0 0 6px black; + color: var(--color-text); + font-size: 14px; + height: auto; + line-height: 16px; + width: 100%; + font-family: var(--font-text); + border-left: 0; + border-radius: 0; + -moz-appearance: textfield; + text-align: center; + min-width: 0; +} + +.symbaroum.attributes input[type='number'][disabled] { + background: var(--box-non-editable) repeat; +} + +.symbaroum.attributes .fixed { + background: var(--box-non-editable) repeat; + border: 1px solid var(--color-border); + box-shadow: inset 0 0 6px black; + font-size: 14px; + height: auto; + line-height: 16px; + width: 100%; + font-family: var(--font-text); + border-left: 0; + border-radius: 0; + -moz-appearance: textfield; + text-align: center; + min-width: 0; +} + +.symbaroum.attributes .attArray { + display: flex; + flex-direction: row; + /* justify-content: center; */ +} + +.symbaroum.attributes .attArray { + flex-basis: 100%; +} + +.symbaroum.attributes .attArray { + justify-content: center; +} + +.symbaroum.attributes .attArray { + margin-top: 5px; + margin-bottom: 5px; +} + +.symbaroum.attributes .item { + display: flex; + flex-basis: 25%; + justify-content: center; +} + +.symbaroum.attributes .item-name { + min-width: 10em; +} + +.symbaroum.attributes .col-header { + display: flex; + flex-direction: row; + flex-basis: 100%; +} + +.symbaroum.attributes .col-header { + background: var(--box-non-editable) repeat; + border: 1px solid var(--color-border); + border-left: none; + box-shadow: inset 0 0 6px black; + height: 28px; + line-height: 28px; + text-align: center; +} diff --git a/scss/sheet/_player.scss b/scss/sheet/_player.scss index f440b24a..17912ed6 100644 --- a/scss/sheet/_player.scss +++ b/scss/sheet/_player.scss @@ -3,7 +3,7 @@ flex-direction: row; flex-wrap: wrap; align-items: flex-start; - align-content: flex-start; + align-content: flex-start; height: 100%; width: 100%; } @@ -23,7 +23,7 @@ } .symbaroum.sheet.actor .player .sheet-header .avatar { - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; border: 1px solid black; box-shadow: inset 0 0 6px black; flex: 0 0 auto; @@ -103,9 +103,9 @@ font-size: 18px; margin: 5px; padding: 5px; - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; font-family: var(--font-text); - height:fit-content; + height: fit-content; } .symbaroum.sheet.actor .player .sheet-tabs .item { diff --git a/scss/sheet/_trait.scss b/scss/sheet/_trait.scss index 3fcdc4a7..42b90dcd 100644 --- a/scss/sheet/_trait.scss +++ b/scss/sheet/_trait.scss @@ -22,6 +22,15 @@ height: 166px; } + +.symbaroum.sheet.item .trait .tab .marker +{ + display: flex; + flex-direction: row; + flex-basis:100%; + margin: 5px 5px 5px 10px; +} + .symbaroum.sheet.item .trait .tab .active, .symbaroum.sheet.item .trait .tab .action { display: flex; diff --git a/scss/sheet/tab/_player-bio.scss b/scss/sheet/tab/_player-bio.scss index db749e5f..48384430 100644 --- a/scss/sheet/tab/_player-bio.scss +++ b/scss/sheet/tab/_player-bio.scss @@ -96,7 +96,7 @@ color: var(--color-text); height: 100%; width: 100%; - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; box-shadow: inset 0 0 6px black; } @@ -124,7 +124,7 @@ } .symbaroum.sheet.actor .player .bio .editor .tox .tox-toolbar__primary { - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; } .symbaroum.sheet.actor .player .bio .editor .tox .tox-tbtn svg:hover { diff --git a/scss/sheet/tab/_player-gear.scss b/scss/sheet/tab/_player-gear.scss index 7667a3b5..37f3ade5 100644 --- a/scss/sheet/tab/_player-gear.scss +++ b/scss/sheet/tab/_player-gear.scss @@ -46,14 +46,12 @@ .symbaroum.sheet.actor .player .gear .wrapper-left .armors .scrollable, .symbaroum.sheet.actor .player .gear .wrapper-left .weapons .scrollable, .symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .scrollable, -.symbaroum.sheet.actor .player .gear .wrapper-right .equipments .scrollable -{ +.symbaroum.sheet.actor .player .gear .wrapper-right .equipments .scrollable { overflow-y: scroll; width: 100%; padding: 2px; } - .symbaroum.sheet.actor .player .gear .wrapper-left .artifacts { height: 234px; margin-top: 10px; @@ -71,13 +69,12 @@ .symbaroum.sheet.actor .player .gear .wrapper-left .armors th, .symbaroum.sheet.actor .player .gear .wrapper-left .weapons th, .symbaroum.sheet.actor .player .gear .wrapper-left .artifacts th, -.symbaroum.sheet.actor .player .gear .wrapper-right .equipments th -{ +.symbaroum.sheet.actor .player .gear .wrapper-right .equipments th { font-size: 14px; font-weight: bold; color: var(--color-label); font-family: var(--font-text); - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; text-align: center; border: none; border-radius: 0; @@ -88,8 +85,7 @@ .symbaroum.sheet.actor .player .gear .wrapper-left .armors th.addbutton .fas, .symbaroum.sheet.actor .player .gear .wrapper-left .weapons th.addbutton .fas, .symbaroum.sheet.actor .player .gear .wrapper-left .artifacts th.addbutton .fas, -.symbaroum.sheet.actor .player .gear .wrapper-right .equipments th.addbutton .fas -{ +.symbaroum.sheet.actor .player .gear .wrapper-right .equipments th.addbutton .fas { color: var(--color-label); } @@ -104,9 +100,8 @@ .symbaroum.sheet.actor .player .gear .wrapper-left .armors table, .symbaroum.sheet.actor .player .gear .wrapper-left .weapons table, .symbaroum.sheet.actor .player .gear .wrapper-left .artifacts table, -.symbaroum.sheet.actor .player .gear .wrapper-right .equipments table -{ - border: 0px; +.symbaroum.sheet.actor .player .gear .wrapper-right .equipments table { + border: 0px; margin-top: 0px; } @@ -117,7 +112,7 @@ .symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .artifact td .action, .symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .artifact td .corruption, .symbaroum.sheet.actor .player .gear .wrapper-right .equipments .equipment td .quantity { - background: url(../asset/image/not-editable.jpg) repeat; + background: var(--box-non-editable) repeat; border: 1px solid var(--color-border); box-shadow: inset 0 0 6px black; height: 28px; @@ -125,35 +120,44 @@ text-align: center; } +.symbaroum.sheet.actor .player .gear .wrapper-left .armors .armor td .cell, +.symbaroum.sheet.actor .player .gear .wrapper-left .weapons .weapon td .cell, +.symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .artifact td .cell, +.symbaroum.sheet.actor .player .gear .wrapper-right .equipments .equipment td .cell { + background: var(--title-color) repeat; +} .symbaroum.sheet.actor .player .gear .wrapper-left .armors .armor td .armorname, .symbaroum.sheet.actor .player .gear .wrapper-left .weapons .weapon td .weaponname, -.symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .artifact td .artifactname -{ +.symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .artifact td .artifactname { width: 100%; - max-width: 100%; + max-width: 15em; min-width: 131px; } -.symbaroum.sheet.actor .player .gear .wrapper-right .equipments .equipment td .equipmentname -{ +.symbaroum.sheet.actor .player .gear .wrapper-right .equipments .equipment td .namefield { width: 108px; + max-width: 10em; } .symbaroum.sheet.actor .player .gear .wrapper-left .armors .armor td .namefield, .symbaroum.sheet.actor .player .gear .wrapper-left .weapons .weapon td .namefield, -.symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .artifact td .namefield, -.symbaroum.sheet.actor .player .gear .wrapper-right .equipments .equipment td .namefield -{ - display:flex; - flex-flow:nowrap; +.symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .artifact td .namefield { + display: flex; + flex-flow: nowrap; + min-width: 131px; +} + +.symbaroum.sheet.actor .player .gear .wrapper-right .equipments .equipment td .namefield { + display: flex; + flex-flow: nowrap; + min-width: 108px; } .symbaroum.sheet.actor .player .gear .wrapper-left .armors .armor td .image-container, .symbaroum.sheet.actor .player .gear .wrapper-left .weapons .weapon td .image-container, .symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .artifact td .image-container, -.symbaroum.sheet.actor .player .gear .wrapper-right .equipments .equipment td .image-container -{ +.symbaroum.sheet.actor .player .gear .wrapper-right .equipments .equipment td .image-container { width: 28px; } @@ -164,16 +168,14 @@ .symbaroum.sheet.actor .player .gear .wrapper-left .artifacts table td, .symbaroum.sheet.actor .player .gear .wrapper-left .artifacts table th, .symbaroum.sheet.actor .player .gear .wrapper-right .equipments table td, -.symbaroum.sheet.actor .player .gear .wrapper-right .equipments table th -{ - padding: 2px; +.symbaroum.sheet.actor .player .gear .wrapper-right .equipments table th { + margin: 2px; } .symbaroum.sheet.actor .player .gear .wrapper-left .armors .armor td.protection, .symbaroum.sheet.actor .player .gear .wrapper-left .weapons .weapon td.damage, .symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .artifact td.corruption, -.symbaroum.sheet.actor .player .gear .wrapper-right .equipments .equipment td.quantity -{ +.symbaroum.sheet.actor .player .gear .wrapper-right .equipments .equipment td.quantity { max-width: 6em; } @@ -182,8 +184,8 @@ .symbaroum.sheet.actor .player .gear .wrapper-left .armors .armor td.impeding .impeding, .symbaroum.sheet.actor .player .gear .wrapper-left .weapons th.attribute, .symbaroum.sheet.actor .player .gear .wrapper-left .weapons .weapon td.attribute, -.symbaroum.sheet.actor .player .gear .wrapper-left .weapons .weapon td.attribute .attribute, -.symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .artifact td.action, +.symbaroum.sheet.actor .player .gear .wrapper-left .weapons .weapon td.attribute .attribute, +.symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .artifact td.action, .symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .artifact td.action .action { max-width: 4em; width: 4em; @@ -191,9 +193,8 @@ .symbaroum.sheet.actor .player .gear .wrapper-left .armors .armor td.state, .symbaroum.sheet.actor .player .gear .wrapper-left .weapons .weapon td.state, -.symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .artifact td.state, -.symbaroum.sheet.actor .player .gear .wrapper-right .equipments .equipment td.state -{ +.symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .artifact td.state, +.symbaroum.sheet.actor .player .gear .wrapper-right .equipments .equipment td.state { max-width: 2em; width: 2em; font-size: 20px; @@ -206,8 +207,7 @@ .symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .artifact td.button, .symbaroum.sheet.actor .player .gear .wrapper-left .artifacts .artifact td.button button, .symbaroum.sheet.actor .player .gear .wrapper-right .equipments .equipment td.button, -.symbaroum.sheet.actor .player .gear .wrapper-right .equipments .equipment td.button button -{ +.symbaroum.sheet.actor .player .gear .wrapper-right .equipments .equipment td.button button { max-width: 2em; width: 2em; text-align: center; diff --git a/scss/sheet/tab/_player-main.scss b/scss/sheet/tab/_player-main.scss index 1d6d3ac4..c0ecdac9 100644 --- a/scss/sheet/tab/_player-main.scss +++ b/scss/sheet/tab/_player-main.scss @@ -5,6 +5,16 @@ flex-basis: 100%; } +.symbaroum.sheet.actor .player .main .attributes .attributes-header { + display: flex; + flex-direction: row; + flex-wrap: nowrap; +} + +.symbaroum.sheet.actor .player .main .attributes .attributes-header .modify-attributes { + width: 3em; +} + .symbaroum.sheet.actor .player .section1 { display: flex; flex-direction: row; @@ -34,9 +44,8 @@ display: flex; flex-direction: row; flex-wrap: wrap; - flex-basis: calc(50% - 5px); + flex-basis: calc(50%); border-top: none; - margin-right: 5px; } .symbaroum.sheet.actor .toughness { display: flex; @@ -160,7 +169,6 @@ .symbaroum.sheet.actor .player .main .health2 .corruption-threshold label, .symbaroum.sheet.actor .player .main .health2 .corruption-max label { flex-basis: 70%; - padding: 0px; } .symbaroum.sheet.actor .player .main .health .toughness-current input, @@ -181,7 +189,7 @@ .symbaroum.sheet.actor .player .main .health2 .toughness-threshold, .symbaroum.sheet.actor .player .main .health2 .corruption-longterm, .symbaroum.sheet.actor .player .main .health2 .corruption-max { - margin-bottom: 10px; + margin-bottom: 5px; } .symbaroum.sheet.actor .player .main .combat { @@ -194,6 +202,38 @@ margin-left: 5px; } +.symbaroum.sheet.actor .player .main .combat .combatheader, +.symbaroum.sheet.actor .player .main .combat .combatheader { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + border-top: none; + width: 100%; + background: var(--title-color) repeat; +} + +.symbaroum.sheet.actor .player .main .combat .combatheader .iniheader { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + border-top: none; +} + +.symbaroum.sheet.actor .player .main .combat .combatheader .iniheader .title { + color: var(--color-title); + text-align: center; + padding: 5px; +} + +.symbaroum.sheet.actor .player .main .combat .combatheader .iniheader label { + width: 3em; +} + +.symbaroum.sheet.actor .player .main .combat .combatheader .iniheader input { + width: 4em; + margin-right: 5px; +} + .symbaroum.sheet.actor .player .main .combat .initiative, .symbaroum.sheet.actor .player .main .combat .defenseAttr { display: flex; @@ -201,7 +241,7 @@ justify-content: center; flex-wrap: wrap; flex-basis: 100%; - margin: 5px 0px 5px 0px; + margin-top: 5px; } .symbaroum.sheet.actor .player .main .combat .stat-modifiers .initiative, @@ -217,71 +257,85 @@ margin-bottom: 5px; margin-right: 5px; margin-left: 5px; + margin-top: 5px; } .symbaroum.sheet.actor .player .main .combat .armor .roll-armor, -.symbaroum.sheet.actor .player .main .combat .armor .protection, -.symbaroum.sheet.actor .player .main .combat .armor .defense, -.symbaroum.sheet.actor .player .main .combat .armor .quality { +.symbaroum.sheet.actor .player .main .combat .weapons .roll-weapon { display: flex; flex-direction: row; /* justify-content: center; */ } -/* .symbaroum.sheet.actor .player .main .combat .armor .roll-armor, */ -.symbaroum.sheet.actor .player .main .combat .armor .quality { - flex-basis: 100%; +.symbaroum.sheet.actor .player .main .combat .armor .item-header, +.symbaroum.sheet.actor .player .main .combat .weapons .item-header { + margin-top: 5px; + margin-bottom: 5px; } -.symbaroum.sheet.actor .player .main .combat .armor .roll-armor { - justify-content: center; +.symbaroum.sheet.actor .player .main .combat .armor .item-row { + display: flex; + width: 100%; + flex-wrap: nowrap; + background-image: var(--title-color); + background-repeat: repeat; } -.symbaroum.sheet.actor .player .main .combat .armor .quality { - margin-top: 5px; +.symbaroum.sheet.actor .player .main .combat .armor .roll-armor .combatProt, +.symbaroum.sheet.actor .player .main .combat .weapons .roll-weapon .weaponDam { + width: 8em; + min-width: 8em; + height: 28px; + margin-left: 5px; + margin-right: 5px; } -.symbaroum.sheet.actor .player .main .combat .armor .protection { - flex-basis: 50%; +.symbaroum.sheet.actor .player .main .combat .armor .roll-armor .attribute, +.symbaroum.sheet.actor .player .main .combat .weapons .roll-weapon .attribute { + width: 4em; + min-width: 4em; + margin-right: 5px; } -.symbaroum.sheet.actor .player .main .combat .armor .defense { - flex-basis: calc(50% - 5px); +.symbaroum.sheet.actor .player .main .combat .armor .roll-armor .armordefense, +.symbaroum.sheet.actor .player .main .combat .armor .roll-armor .armordefense input, +.symbaroum.sheet.actor .player .main .combat .weapons .roll-weapon .weaponAttribute, +.symbaroum.sheet.actor .player .main .combat .weapons .roll-weapon .weaponAttribute input { + width: 4em; + min-width: 4em; + height: 28px; +} + +.symbaroum.sheet.actor .player .main .combat .armor .roll-armor { + justify-content: center; +} + +.symbaroum.sheet.actor .player .main .combat .armor .quality { margin-top: 5px; - margin-left: 5px; } -.symbaroum.sheet.actor .player .main .combat .armor .initiative label, -.symbaroum.sheet.actor .player .main .combat .armor .quality label, -.symbaroum.sheet.actor .player .main .combat .armor .protection label, -.symbaroum.sheet.actor .player .main .combat .armor .defense label { +.symbaroum.sheet.actor .player .main .combat .armor .initiative label { width: 10em; min-width: 10em; } -.symbaroum.sheet.actor .player .main .combat .armor .protection input, -.symbaroum.sheet.actor .player .main .combat .armor .defense input { - width:100%; -} - .symbaroum.sheet.actor .player .main .combat .weapons { display: flex; flex-direction: column; flex-basis: 100%; - margin: 0 5px 5px 5px; + margin-left: 0px; + margin-right: 0px; + margin: 5px; height: 120px; } +.symbaroum.sheet.actor .player .main .combat .armor .item-list .name, .symbaroum.sheet.actor .player .main .combat .weapons .item-list .name { display: flex; - flex-basis: 70%; + flex-basis: 100%; justify-content: center; } -.symbaroum.sheet.actor .player .main .combat .weapons .item-list .damage { - flex-basis: 30%; -} - .symbaroum.sheet.actor .player .main .combat .weapons .item-list .weapon { display: flex; flex-direction: row; @@ -289,7 +343,7 @@ } .symbaroum.sheet.actor .player .main .combat .weapons .item-list .weapon .damage { - background: url(../asset/image/not-editable.jpg) repeat; + background: var(--box-non-editable) repeat; border: 1px solid var(--color-border); border-left: none; box-shadow: inset 0 0 6px black; @@ -314,7 +368,7 @@ left: 618px; font-size: 32px; color: var(--color-text); - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; height: 36px; width: 36px; text-align: center; @@ -347,7 +401,7 @@ .symbaroum.sheet.actor .player .main .abilities-powers .traits .trait .actions { flex-basis: 15%; color: var(--color-text); - background: url(../asset/image/not-editable.jpg) repeat; + background: var(--box-non-editable) repeat; text-align: center; border: 1px solid var(--color-border); border-left: none; diff --git a/scss/sheet/tab/_player-note.scss b/scss/sheet/tab/_player-note.scss index d4343afb..eaaf36b4 100644 --- a/scss/sheet/tab/_player-note.scss +++ b/scss/sheet/tab/_player-note.scss @@ -21,7 +21,7 @@ color: var(--color-text); height: 100%; width: 100%; - background: url(../asset/image/editable.jpg) repeat; + background: var(--box-editable) repeat; box-shadow: inset 0 0 6px black; } @@ -40,7 +40,7 @@ } .symbaroum.sheet.actor .player .note .wrapper .editor .tox .tox-toolbar__primary { - background: url(../asset/image/title.jpg) repeat; + background: var(--title-color) repeat; } .symbaroum.sheet.actor .player .note .wrapper .editor .tox .tox-tbtn svg:hover { diff --git a/scss/symbaroum.scss b/scss/symbaroum.scss index fd083910..701e6365 100644 --- a/scss/symbaroum.scss +++ b/scss/symbaroum.scss @@ -8,6 +8,7 @@ @import 'common/actor'; @import 'common/item'; @import 'common/system-guide'; +@import 'common/system-override'; @import 'common/variable'; /* Tabs styles */ diff --git a/system.json b/system.json index 061cf56e..2197d105 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "name": "symbaroum", "title": "Symbaroum", "description": "Twilight falls. Davokar darkens.", - "version": "3.0.8", + "version": "3.0.9", "minimumCoreVersion": "0.8.5", "compatibleCoreVersion": "0.8.9", "authors": ["Paul Watson", "Bithir", "Khaali"], @@ -231,7 +231,7 @@ "initiative": "1d20[tiebreaker]/100000 + @initiative.value", "socket": true, "url": "https://github.com/pwatson100/symbaroum", - "manifest": "https://github.com/pwatson100/symbaroum/releases/download/3.0.8/system.json", - "download": "https://github.com/pwatson100/symbaroum/releases/download/3.0.8/master.zip", + "manifest": "https://github.com/pwatson100/symbaroum/releases/download/3.0.9/system.json", + "download": "https://github.com/pwatson100/symbaroum/releases/download/3.0.9/master.zip", "license": "LICENSE.txt" } diff --git a/template.json b/template.json index 60ef3b03..a8b038b7 100644 --- a/template.json +++ b/template.json @@ -219,7 +219,8 @@ "isActive": false, "action": "", "description": "" - } + }, + "marker": false }, "ability": { "templates": [ diff --git a/template/chat/dialog.html b/template/chat/dialog.html index 4e72ce2c..8e1c0eb0 100644 --- a/template/chat/dialog.html +++ b/template/chat/dialog.html @@ -17,17 +17,26 @@ {{/select}} - {{/if}} + {{/if}} -
- - -
+
+ + +
+ + {{#ifgt weaponModifier.attributeModifiers.length 0}} + {{#each weaponModifier.attributeModifiers as |aMod|}} +
+ + +
+ {{/each}} + {{/ifgt}} -
- -
+
+ +
{{#if askImpeding}}
@@ -39,10 +48,25 @@
-
{{weaponDamage}}
-
-
- + +
+ {{#ifgt weaponModifier.damageBonus.length 0}} + {{#each weaponModifier.damageBonus as |bonus|}} +
+ {{/each}} + {{/ifgt}} + {{#ifgt weaponModifier.damageChoices.length 0}} + {{#each weaponModifier.damageChoices as |choicebonus|}} + {{#ife choicebonus.type "radio"}} +
+ {{/ife}} + {{#ife choicebonus.type "check"}} +
+ {{/ife}} + {{/each}} + {{/ifgt}} +
+
{{/if}} diff --git a/template/chat/dialog2.html b/template/chat/dialog2.html index 978e32f7..0fc7d06a 100644 --- a/template/chat/dialog2.html +++ b/template/chat/dialog2.html @@ -168,4 +168,14 @@

{{localize "ABILITY_MEDICUS.NO_TARGET"}}

{{/if}} {{/if}} + {{#if poisoner}} +
+ + +
+ {{/if}} \ No newline at end of file diff --git a/template/sheet/ability.html b/template/sheet/ability.html index 9d7bef02..218e7094 100644 --- a/template/sheet/ability.html +++ b/template/sheet/ability.html @@ -9,12 +9,12 @@ - {{#if item.isGM }} + {{#ifat symbaroumOptions.isGM symbaroumOptions.allowShowReference }}
- {{/if}} + {{/ifat}}
diff --git a/template/sheet/mystical-power.html b/template/sheet/mystical-power.html index e18dac0b..4ddf1142 100644 --- a/template/sheet/mystical-power.html +++ b/template/sheet/mystical-power.html @@ -9,12 +9,12 @@
- {{#if item.isGM }} + {{#ifat symbaroumOptions.isGM symbaroumOptions.allowShowReference }}
- {{/if}} + {{/ifat}}
diff --git a/template/sheet/tab/player-gear.html b/template/sheet/tab/player-gear.html index 565f2534..67ab5e98 100644 --- a/template/sheet/tab/player-gear.html +++ b/template/sheet/tab/player-gear.html @@ -1,6 +1,6 @@
-
+

{{localize "TITLE.ARMORS"}}

@@ -22,12 +22,14 @@

{{localize "TITLE.ARMORS"}}

{{#each actor.data.armors as |item|}}
-
+
+
+
@@ -61,7 +63,7 @@

{{localize "TITLE.ARMORS"}}

-
+

{{localize "TITLE.WEAPONS"}}

@@ -80,12 +82,14 @@

{{localize "TITLE.WEAPONS"}}

{{#each actor.data.weapons as |item|}}
+
+
@@ -113,7 +117,7 @@

{{localize "TITLE.WEAPONS"}}

-
+

{{localize "TITLE.ARTIFACTS"}}

@@ -133,12 +137,14 @@

{{localize "TITLE.ARTIFACTS"}}

{{#if item.data.isArtifact}}
+
+
{{item.getArtifactActions}}
@@ -169,7 +175,7 @@

{{localize "TITLE.ARTIFACTS"}}

-
+

{{localize "TITLE.EQUIPMENTS"}}

@@ -188,12 +194,14 @@

{{localize "TITLE.EQUIPMENTS"}}

{{#if item.data.isEquipment}}
+
+
{{item.data.data.number}}
@@ -217,7 +225,7 @@

{{localize "TITLE.EQUIPMENTS"}}

-
+

{{localize "TITLE.MONEY"}}

diff --git a/template/sheet/tab/player-main.html b/template/sheet/tab/player-main.html index 000918d2..8d497558 100644 --- a/template/sheet/tab/player-main.html +++ b/template/sheet/tab/player-main.html @@ -43,7 +43,7 @@

{{localize "TITLE.HEALTH"}}

{{localize "TITLE.COMBAT"}}

- + + {{{attribute.msg}}}
@@ -24,12 +25,12 @@

{{localize "TITLE.ATTRIBUTES"}}

{{localize "HEALTH.TOUGHNESS"}}

- - + +
- + {{localize "TOOLTIP.BONUS_TOTAL"}} {{data.health.toughness.max}} {{{data.bonus.toughness.max_msg}}} @@ -38,8 +39,12 @@

{{localize "HEALTH.TOUGHNESS"}}

+ {{#if actor.hasNoPainThreshold }} + + {{else}} {{localize "TOOLTIP.BONUS_TOTAL"}} {{data.health.toughness.threshold}} {{{data.bonus.toughness.threshold_msg}}} + {{/if}}
@@ -50,36 +55,48 @@

{{localize "HEALTH.CORRUPTION"}}

-
+
+ {{#if actor.isThoroughlyCorrupt}} + + {{else}} + {{/if}}
- - + +
- - + +
- - + +
+ {{#if actor.isThoroughlyCorrupt}} + + {{else}} {{localize "TOOLTIP.BONUS_TOTAL"}} {{data.health.corruption.threshold}} {{{data.bonus.corruption.threshold_msg}}} + {{/if}}
+ {{#if actor.isThoroughlyCorrupt}} + + {{else}} {{localize "TOOLTIP.BONUS_TOTAL"}} {{data.health.corruption.max}} {{{data.bonus.corruption.max_msg}}} + {{/if}}
@@ -88,11 +105,19 @@

{{localize "HEALTH.CORRUPTION"}}

-

{{localize "TITLE.COMBAT"}}

+
+

{{localize "TITLE.COMBAT"}}

+
+
{{localize "INITIATIVE.TITLE"}}
+ + +
+
+ {{#ifSetting "manualInitValue"}}
- - {{#select data.initiative.attribute}} @@ -106,42 +131,38 @@

{{localize "TITLE.COMBAT"}}

+ {{/ifSetting}}
-
-
-
-
- -
-
- - - - - {{#ife actor.type "monster"}} {{localize "TOOLTIP.BONUS_TOTAL"}} {{data.combat.defense}} ({{data.combat.defmod}})
{{{data.combat.msg}}}
{{/ife}} - {{#ife actor.type "player"}} {{localize "TOOLTIP.BONUS_TOTAL"}} {{data.combat.defense}}
{{{data.combat.msg}}}
{{/ife}} -
-
-
-
- - - {{#ife actor.type "player"}}{{/ife}} - {{#ife actor.type "monster"}}{{/ife}} - {{{data.combat.tooltipProt}}} - +
+
+ {{localize "ITEM.ARMOR"}}
-
- - +
+
+
+
+
-
+
{{localize "WEAPON.HEADER"}} - {{localize "WEAPON.DAMAGE"}}
{{#each actor.data.weapons as |item|}} @@ -151,28 +172,32 @@

{{localize "TITLE.COMBAT"}}

- +
- {{#ife ../actor.type "player"}} -
{{item.damage.pcExtShort}}
- {{/ife}} - {{#ife ../actor.type "monster"}} -
{{item.damage.npcExtended}}
- {{/ife}}
{{/if}} {{/each}}
-
+
-
-
+

{{localize "TITLE.ABILITIES_POWERS"}}

{{#each items as |item key|}} @@ -190,11 +215,11 @@

{{localize "TITLE.ABILITIES_POWERS"}}

{{item.data.data.actions}}
- +
{{/if}} {{/each}}
-
\ No newline at end of file +
diff --git a/template/sheet/trait.html b/template/sheet/trait.html index a890b501..5796c3b8 100644 --- a/template/sheet/trait.html +++ b/template/sheet/trait.html @@ -9,12 +9,12 @@
- {{#if item.isGM }} + {{#ifat symbaroumOptions.isGM symbaroumOptions.allowShowReference }}
- {{/if}} + {{/ifat}}
@@ -23,10 +23,12 @@
{{localize "TAB.DESCRIPTION"}} + {{#ifn data.marker}} {{localize "TAB.NOVICE"}} {{localize "TAB.ADEPT"}} {{localize "TAB.MASTER"}} {{localize "TAB.BONUS"}} + {{/ifn}}
@@ -34,6 +36,9 @@

{{localize "TITLE.DESCRIPTION"}}

{{editor content=data.description target="data.description" button=true owner=owner editable=true}} +
+ +
@@ -55,12 +60,8 @@

{{localize "TITLE.NOVICE"}}

{{#if isOwned}}
- - {{#if data.novice.isActive}} - - {{else}} - - {{/if}} + +
{{/if}} {{editor content=data.novice.description target="data.novice.description" button=true owner=owner editable=true}} diff --git a/template/symbaroumSettings.html b/template/symbaroumSettings.html new file mode 100644 index 00000000..7d3e1c8f --- /dev/null +++ b/template/symbaroumSettings.html @@ -0,0 +1,130 @@ +
+
+
+ + +
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + + +
+ + + +
+ +
+ + + +
+ + + + +
+ +
+ + + +
+ + + +

{{localize "SYMBAROUM.OPTIONAL_RESET_NOTE"}}

+ +
+ +
+
+ + +
+
+ + + +
+
+ +
+ \ No newline at end of file diff --git a/template/user-guide-en.html b/template/user-guide-en.html index 2705cfbc..e653816d 100644 --- a/template/user-guide-en.html +++ b/template/user-guide-en.html @@ -12,8 +12,8 @@

Introduction

This guide presents the main features of the Symbaroum system for Foundry VTT.
- This system is unofficial, so there are no art or text from the rulebooks included. - It is assumed that the people using this system for Foundry VTT are in possession of the rulebooks. + This system is official but completely developed, maintained and supported by volunteers.
+ It is assumed that the people using this system for Foundry VTT are in possession of the Symbaroum rulebooks or purchased the Free League foundry modules.


@@ -25,6 +25,8 @@

Creating Characters

Items such as character name and race can be filled in, as well as the experience it has and how much of it that has been spent on re-rolls or binding to artifacts, how much has been spent on abilities and traits and finally how much is unspent.

Any field that has a blue-ish background can't be edited, this is because they are automatically calculated and the player do not need to change these fields. The portrait can be changed to a picture that the player likes. +

+ When generating characters, put the initial point total used for starting abilities in the far left Experience box. You should also update this should the character gain any xp during the scenarios.

    @@ -32,11 +34,13 @@

Creating Characters

Underneath it has a set of tabs, main, gear, bio, etc. which can be used to supply the various information required.
On the main tab, the player can fill in their details of their attributes, how much toughness they have remaining and details of their corruption. - In order to modify attributes, click on the "modify" button under the attributes label. this will open the attributes windows. -

-     -

- The base attribute is for the base, unmodifed attribute of the character. The "Modifier" field is for temporary modifiers, like attribute damage from undead creatures. "Bonus" is for bonuses from items. "Total" will display the computed attribute. + In order to modify attributes, click on the cog-wheel on the header and this will open the attributes windows. +

+     +
+     +

+ The base attribute is for the base, unmodifed attribute of the character. The "Modifier" field is for temporary modifiers, like attribute damage from undead creatures. "Bonus" is for bonuses from items. "Total" will display the computed attribute.
The corruption fields contains entries for how much Temporary (scene) corruption they've taken, any long term corruption, such as happens when consuming Krusan Berries, or even Permanent corruption they have accumulated.
@@ -62,7 +66,7 @@

Adding Abilities, Traits, Boons and Burdens


   
- The character sheet also shows a summary with a clickable icon, the name of the ability and what actions (Active, Passive, etc) the player can use with the ability or trait. + The character sheet also shows a summary with a clickable icon, the name of the ability and what actions (Active, Passive, etc) the player can use with the ability or trait. If the icon of the trait has a green border when hovered over, the ability or trait can be activated by just clicking.
   

@@ -95,20 +99,20 @@

Weapons


The "Alternative damage" field is used for weapons that do damage on attributes (usually Resolute or Strong). Normal weapons are set on "none". When creating a monster that do alternative damage, use the "wraith claws" or "freezing touch" weapon, and give the "alternative damage" ability to the creature. The damage of the weapon will automaticaly upgrade depending of its level in the ability.

-
+

Armors

-

- Armors have a fixed base protection value (1d4, 1d6, or 1d8). A reinforced armor should have the "Reinforced" quality checkbox scheck in the "Qualities" tab. - Other bonus to protection can be add in the "Bonus protection" field. - The "Impeding" field should receive the impeding value of the armor. This value will be used in some rolls. - Qualities should be checked in the qualities tab. Only those will be used by the system. Any other custom quality can be entered in the "quality" field. -

-

- Stackable armors can be created, for effects like "Blessed shield" that stacks to normal armor. Select the "stackable armor" option in the base armor field, then type the added protection value in the bonus field. -

-
+

+ Armors have a fixed base protection value (1d4, 1d6, or 1d8). A reinforced armor should have the "Reinforced" quality checkbox scheck in the "Qualities" tab. + Other bonus to protection can be add in the "Bonus protection" field. + The "Impeding" field should receive the impeding value of the armor. This value will be used in some rolls. + Qualities should be checked in the qualities tab. Only those will be used by the system. Any other custom quality can be entered in the "quality" field. +

+

+ Stackable armors can be created, for effects like "Blessed shield" that stacks to normal armor. Select the "stackable armor" option in the base armor field, then type the added protection value in the bonus field. +

+

Adding weapons and armors to characters

-

+

To add an armor or weapon to a character sheet, drag it from the Item's selection to the armor or weapon section of the gear tab of the character sheet. Monsters with the "Natural weapon" trait should be given the weapon « Natural weapon » of the compendium, and those with the "Armored" trait should be given the "armored" Armor.
@@ -123,13 +127,16 @@

Adding weapons and armors to characters


- active (shirt icon): the item is weared (armor) or in hand (weapon), and can be used for combat.

-     -

- Active weapons, and the active armor, can be seen in the main tab of the character sheet. Click on them to make a roll (cf the combat section). +     +

+ Active weapons, and the active armor, can be seen in the main tab of the character sheet. Click on them to make a roll (cf the combat section). Armor and weapons displays their protection or damage as well as what attribute is used and the target value. Only one non-stackable armor will be considered active at a time. If there is no active armor, the system will generate a "no armor" dummy armor, equipped by the character, with passive bonuses added (robust..). - When a stackable armor is activated, it will add its bonus protection to the active armor. -

-     + When a stackable armor is activated, it will add its bonus protection to the active armor. +

+

+ The combat tab also shows which attribute it uses for initiative, where the format is [primary inititive attribute].[vigilant] - where the primary attribute is quick, unless you have an ability or trait that changes that. +

+    

Making an Attribute Test

@@ -184,61 +191,61 @@

Abilities, Powers and Traits

   

- All the Abilities, Mystical Powers and Traits are available in the system compendiums. + All the Abilities, Mystical Powers and Traits are available in the system compendiums, but comes without descriptions. + If you want the descriptions, then you can fill them in manually or purchase one of the Free League modules for the Symbaroum system. In order to add one of them to a character or monster sheet, simply drag and drop it from the compendium to the sheet. Then you can indicated the levels know by this character by checking the "learned" box in the Novice, adept and master tab.
   
You can create your own abilities but in order to use the features of the system, you'll have to use the Abilities, powers and traits included in the compendiums.  - This system in unofficial, so we can't include the descriptions of those abilities.



Abilities

- Some abilities and traits, when given to a character (PC and NPC), will have effect on her character sheet and / or on dialog windows. + Some abilities and traits, when given to a character (PC and NPC), will have effect on her character sheet and / or on dialog windows.

-

Dominate, Feat of strength, Feint, Knife Play, Sixthsense, Strong gift, Tactician

-

+

Dominate, Feat of strength, Feint, Knife Play, Sixthsense, Strong gift, Tactician

+

Defense and attack attribute will be changed when the character uses relevant weapons.

Shield fighter, Staff fighting, Steel throw, Natural warrior, Natural weapon

-

+

Damage value of the weapon will be increased, and/or defense value. Please note that the extra bonus of Staff fighting when using a wooden staff or a mystic staff isn't included (please add +1 defense in the bonus tab of the relevant weapons).

Man-at-arms, Armored, Robust, Survival instinct

-

+

Protection value of the armor will be increased.

Colossal, Undead, Spirit form, Swarm

-

+

Those traits will apply damage reduction when using Enhanced Combat (see Enhanced combat option) Damage value of the weapon will be increased, and defense value. Please note that the extra bonus of Staff fighting when using a wooden staff or a mystic staff isn't included (please add +1 defense in the bonus tab of the relevant weapons).

Beast Lore, Backstab, Colossal, Corrupting attack, Feat of strength, Hunter's instinct, Iron Fist, Knife Play, Natural Warrior, Rapid Fire, Robust

-

+

When using Enhanced Combat option, having those abilities or traits and using the right weapon type will make specific options available in the attack window.



Using Powers

- Powers can be activated by clicking on the orange dice of the item sheet. + Powers can be activated by clicking on the icon with a green border on the character sheet (see Adding Abilities, Traits, Boons and Burdens), or opening the power and clicking on the orange dice of the item sheet (shown below).
   
Power activation is a WIP.
For now, only those active powers are supported:
- Anathema, blessed shield, brimstone cascade, bend will, black bolt, confusion, curse, entangling vines, holy aura, inherit wound, larvae boils, lay on hands, levitate, maltransformation, Prios burning glass, tormenting spirits, unnoticeable + Anathema, blessed shield, brimstone cascade, bend will, black bolt, confusion, curse, dancing weapon, entangling vines, holy aura, inherit wound, larvae boils, lay on hands, levitate, maltransformation, Prios burning glass, tormenting spirits, unnoticeable
the abilities:
- Alchemy, acrobatics, berserker, dominate, leader, loremaster, medicus, quickdraw, recovery, witchsight. + Alchemy, acrobatics, berserker, dominate, leader, loremaster, medicus, poisoner, quickdraw, recovery, witchsight.
the traits:
- Regeneration, Shapeshifter, Wisdom of the ages. + Poisonous, Regeneration, Shapeshifter, Wisdom of the ages.

When you activate a power, it will take in account the relevant abilities of the character and its target (leader ability, rapid reflexes, steadfast, traditions, impeding armour...). It will open a dialog window for the acting player asking a few questions: @@ -268,27 +275,30 @@

Using Powers

Power and Abilities specifics:

Anathema

-

Anathema can be used with or without a target. The target should be the opposing caster.

+

Anathema can be used with or without a target. The target should be the opposing caster.

Berserker

-

When using this abilities, the effects will automaticaly modify the combat values of the character (armor, defense, damage). Use the abality again to revert to normal.

+

When using this ability, the effects will automaticaly modify the combat values of the character (armor, defense, damage). Use the abality again to revert to normal.

Brimstone cascade

-

When striking multiple targets, use the power several times, changing the target each time. After the first target, use the "maintain power" option so the casting character won't get corruption.

-

Blessed Shield

-

When using the power on 1 or 2 other characters (adept and master level), select them as targets before using the power. - If successful, the Mystic and the target will automaticaly get an active "blessed shield" stackable armor. At the end of the duration of the power, just delete this item from their inventory. -

+

When striking multiple targets, use the power several times, changing the target each time. After the first target, use the "maintain power" option so the casting character won't get corruption.

+

Blessed Shield

+

When using the power on 1 or 2 other characters (adept and master level), select them as targets before using the power. + If successful, the Mystic and the target will automaticaly get an active "blessed shield" stackable armor. At the end of the duration of the power, just delete this item from their inventory. +

+

Dancing Weapon

+

When using this power, the character will enter "Dancing weapon mode": his combat stats on defense and melee weapons will be replaced by resolute (or persuasive if relevant). Just use the power again to exit the "Dancing weapon" mode. Please note that clicking on the power won't generate corruption - you'll have to take care of this manually. +

Entangling vines

-

It's always the caster that should initiate the roll. After the second round, the strenght of the target will be used as a resist value, as in the rules. -

+

It's always the caster that should initiate the roll. After the second round, the strenght of the target will be used as a resist value, as in the rules. +

Inherit wound

-

Target will be healed and damage will apply to the caster. If enhanced combat is used, and the level is adept or master, poison and bleeding effects will also be transfered from target to caster. -

+

Target will be healed and damage will apply to the caster. If enhanced combat is used, and the level is adept or master, poison and bleeding effects will also be transfered from target to caster. +

Levitate

-

If no target are selected, the spell will be cast on self. If a target is selected and level is adept or master, the power will be cast on the target. -

-

Leader

-

When using leader, it will trigger the adept level effect: the target will receive a "targeted" status effect. When any character attacks this target, damage will receive a +1d4 bonus (or +2 if attack from a NPC). Just delete the status effect on the token to remove the effect.

-

+

If no target are selected, the spell will be cast on self. If a target is selected and level is adept or master, the power will be cast on the target. +

+

Leader

+

When using leader, it will trigger the adept level effect: the target will receive a "targeted" status effect. When any character attacks this target, damage will receive a +1d4 bonus (or +2 if attack from a NPC). Just delete the status effect on the token to remove the effect.

+

Combat

There are 2 options for combat: @@ -330,37 +340,37 @@

Defend against an attack

Enhanced Combat:

Enhance combat can be activated by selecting the option in the system settings. The purpose of EC is to accelerate combat, limit Players and GM fidgeting with character sheets, and vastly simplify NPC management. -

- This quick video explains how to use the enhanced combat -

-

- it is still a Work in Progress. Not every passive abilities have been integrated.

- Armor and weapons have to be equipped by the PCs and NPCs in order to be taken in account.
- It automaticaly processes the attributes, traits  and abilities of the attacker and its target, rolls the dice, evaluate damage.

- The attribute used for attacking has to be defined on the weapon sheet. The defense attribute has to be selected on the character sheet. PCs and NPCs armors and weapons value have to be entered as 'dice' (for example a sword damage value would be 1d8 - the system will automaticaly transform this value to a fixed 4 when a NPC attacks a PC) -

- If a player character attacks a NPC, the player has to select its target, then click on a weapon to do the attack. - If a NPC attacks a PC, the GM select the target, then clicks on the NPC weapon. -

- A dialog window will appear, asking which abilities of the attacker to use (iron fist, hunter's instinct...). -
-     -
- Then the attack roll is made, and if it's a hit, damage is roll. Result is printed in the chat. If it's an NPC attack against a PC, then the damage is fixed and the armor is rolled, as per the rules - please note the Player don't have to initiate the defense and armor roll. -
-     -
- The gamemaster then gets a chat entry with a button -
-     +

+ This quick video explains how to use the enhanced combat +

+

+ it is still a Work in Progress. Not every passive abilities have been integrated.

+ Armor and weapons have to be equipped by the PCs and NPCs in order to be taken in account.
+ It automaticaly processes the attributes, traits  and abilities of the attacker and its target, rolls the dice, evaluate damage.

+ The attribute used for attacking has to be defined on the weapon sheet. The defense attribute has to be selected on the character sheet. PCs and NPCs armors and weapons value have to be entered as 'dice' (for example a sword damage value would be 1d8 - the system will automaticaly transform this value to a fixed 4 when a NPC attacks a PC) +

+ If a player character attacks a NPC, the player has to select its target, then click on a weapon to do the attack. + If a NPC attacks a PC, the GM select the target, then clicks on the NPC weapon. +

+ A dialog window will appear, asking which abilities of the attacker to use (iron fist, hunter's instinct...). +
+     +
+ Then the attack roll is made, and if it's a hit, damage is roll. Result is printed in the chat. If it's an NPC attack against a PC, then the damage is fixed and the armor is rolled, as per the rules - please note the Player don't have to initiate the defense and armor roll. +
+     +
+ The gamemaster then gets a chat entry with a button +
+     -
- Clicking the button will automaticaly affect the results of the attack to the tokens: damage will be substracted from toughness, status icons like poison and bleed added, etc. - We recommend using the "Status icons counters" in order to have the duration of those effects displayed on the token and in the combat tracker. -
- The "Undead", "Spirit form" and "swarm" traits will apply damage reduction. Remember to check the "magical" quality box on artifact weapons, so their damage will be evaluated as such. -
- Alternative damage will reduce the relevant attribute (it will use the "modifier" field of the attribute sheet.) +
+ Clicking the button will automaticaly affect the results of the attack to the tokens: damage will be substracted from toughness, status icons like poison and bleed added, etc. + We recommend using the "Status icons counters" in order to have the duration of those effects displayed on the token and in the combat tracker. +
+ The "Undead", "Spirit form" and "swarm" traits will apply damage reduction. Remember to check the "magical" quality box on artifact weapons, so their damage will be evaluated as such. +
+ Alternative damage will reduce the relevant attribute (it will use the "modifier" field of the attribute sheet.)



@@ -394,6 +404,98 @@

Bonuses

   

+

System settings

+

+ The following system settings exist - you can turn on and of to your hearts content or as you see fit for running your campaign. +
+ Configure Symbaroum Settings
+ This is a user setting which allows some modification of sheet backgrounds and colorations (see below).
+ World Template Version
+ This is a developer function - do not change unless you really intend it.
+ World System Version
+ This is a developer function - do not change unless you really intend it.
+ Combat Enhancement
+ Turns the automated combat enhancement on or off. Please note that if you turn it on, the game will work a bit differently and players no longer rolls defense
+ Always able to succeed or fail
+ If you want the system to always succeed on a roll of 1 or fail on a roll of 20
+ Optional Critical Rolls
+ Enables the normal critical rolls as detailed in the optional rule in the core book.
+ Optional Rare Critical Rolls
+ Enables the more rarer criticals as detailed in the optional rule in the core book.
+ Allow crits for non-combat
+ This enables the system to print a message when there is a critical success or failure with normal attribute rolls. Crit ratio is the same as for combat
+ Combat settings for rolls
+ Enables QoL enhancements for keeping modifiers between strikes
+ Attribute settings for rolls
+ Enables QoL enhancements for keeping modifiers between specific attribute rolls
+ Show modifiers in targetted
+ In attribute rolls, or combat rolls, shows the modifier the versus attribute gives
+ Show NPC modifiers
+ Shows the character sheet for NPC/monster sheets as in the core book (i.e. from +5 to -5)
+ Allow reference modifications
+ Only shows for GM and shows a reference field on abilities, traits, etc. This reference is used for the automation of abilities.
+ Supress Iniatiative Rolls
+ While Symbaroum do not roll for iniatiative, the system has to do so for the tie breaker. This just turns of the visibility of this roll from chat.
+ Manually select iniatiative
+ Allows manual selection of the iniatiative attribute.
+ Add Symbaroum Settings button
+ This adds a Symbaroum setting button under the Foundry Configuration sidebar
+ +

+
+

Configure Symbaroum Settings

+

+ Under the configuration sidebar there is a now a "Configure Symbaroum Settings" button which is visible to all users. +
+     +
+ Selecting this a user can change the character/NPC backgrounds as well as the title, editable and non-editable field colours. +
+     +
+ Selecting the "Plain Color Picker" on any of the drop downs will display a color choice box for that item. +
+ A pop-up colour selector will appear when the box is clicked on. From there you can select any colour/brightness combination you want. +
+     +
+ Once you have made your selection(s) click the "Submit" button to enable them. + In the event you make a choice you are unhappy with there is a selection of reset buttons to take you back to the default. + +

+
+

Macros

+

+ The system comes with a set of macros that might be useful at your gaming table. +
+ Add Exp
+ A macro for the GameMaster to add Experience to a party. You can select tokesn, or if no tokens are selected, it gives you a list of player characters from your actor catalog. +
+ Alternate Damage
+ With this macro, you can deal Alternative Damage to a given token. +
+ Name Generator
+ The macro will generate and publish a set of 10 Symbaroum-esque names based on the culture selected for a quick generation of names. There are x cultures available - + Ambrian (feminine, masculine, noble), Barbarian (feminine, masculine), Symbaroum, Abducted Human (feminine, masculine), Dwarf (firstnames, surname), Elf (feminine, masculine, Goblin (feminine, masculine), + Troll (normal, ancient). +
+ NPC Importer
+ The macro can import NPC or Monsters from the Core book, many adventures and the Monster Codex via copy & paste. All you need to do is validate abilities and put the gear on the character. Check the text on the macro on how to use it. +
+ Pay for re-roll
+ Using the alternative rules for paying for re-rolls with either experience or permanent corruption. It will prompt the player to select the character they own, or the token they have selected. + Note that this macro only pays the cost for the re-roll, it does not perform another re-roll. +
+ Reset temporary corruption
+ Allows the GM to reset the temporary corruption on the selected token, or if no tokens are selected, to any number of player characters in their actor catalog. +
+ Roll attribute
+ Allows a player to select attribute and character to roll without opening their character sheet. +
+ Toggle player/monster
+ Toggles a named player or monster in the actor catalog between being a player or monster character +
+



Supported Modules