diff --git a/Das Schwarze Auge (TDE) 5 OFFICIAL by Ulisses/README.MD b/Das Schwarze Auge (TDE) 5 OFFICIAL by Ulisses/README.MD index 14557e1037..33a8bcf76a 100644 --- a/Das Schwarze Auge (TDE) 5 OFFICIAL by Ulisses/README.MD +++ b/Das Schwarze Auge (TDE) 5 OFFICIAL by Ulisses/README.MD @@ -1,11 +1,11 @@ -# Official Das Schwarze Auge 5/The Dark Eye 5th system for Roll20 +# Official Das Schwarze Auge/The Dark Eye system for Roll20 ![TDE_Roll20](https://user-images.githubusercontent.com/75448500/133844250-62f177c1-af3a-4f1c-bdc1-114162286011.jpg) [Official feedback hub](https://github.com/Plushtoast/TDE-Roll20-Official) for the Roll 20 ulisses TDE character sheet & future compendium books ### Current Version: -1.0.1 Initial Release +1.0.2 Initial Release This system is intended for usage with [Roll20](http://https://roll20.net//) to play "Das Schwarze Auge" / "The Dark Eye" 5th edition. ## Game setup @@ -19,7 +19,7 @@ Our current plans: [Roadmap](https://github.com/Plushtoast/TDE-Roll20-Official/m Aventuria awaits, as TDE 5 is also available on Roll20. The system includes relevant mechanisms to play in the wonderous world of Aventuria and The Dark Eye and create your own adventures, characters and stories. -The core system includes a character sheet and allows you to add your advantages, disadvantages, cultures, professions, special skill, spells, liturgies, rituals and equipment as you see fit. +The character sheet includes TDE compendium integration and allows you to add your advantages, disadvantages, cultures, professions, special skill, spells, liturgies, rituals and equipment as you see fit. ## Discussion & Assistance If you want to discuss TDE for roll20 or need some assistance you can also join the Discord Servers: @@ -27,12 +27,13 @@ If you want to discuss TDE for roll20 or need some assistance you can also join ## Notable Features * Skills, attributes, liturgies, ceremonies, spells, rituals, weapon tests and many more can be rolled. -* Management of inventory with drag and drop and in-depth information on all items. -* Manual modification of rolls and test results. - +* Integration of the TDE Roll20 compendium +* Management of inventory with drag and drop and in-depth information on all items through compendium expansions. ## Official Modules -As of this moment several compendium expansions are in the making. We will inform you as soon as they will be available. +* Core Expansion (EN/DE) +* Aventurian Bestiary (EN/DE) +* Aventurian Armory (EN/DE) ## Feedback and improvements If there is a problem with the character sheet or any compendium books, please check the issue section [Issues](https://github.com/Plushtoast/TDE-Roll20-Official/issues) and open a new issue for us with as much detail as possible. diff --git a/Das Schwarze Auge (TDE) 5 OFFICIAL by Ulisses/dsa5official.css b/Das Schwarze Auge (TDE) 5 OFFICIAL by Ulisses/dsa5official.css index 713df179ee..2eb8eb7079 100644 --- a/Das Schwarze Auge (TDE) 5 OFFICIAL by Ulisses/dsa5official.css +++ b/Das Schwarze Auge (TDE) 5 OFFICIAL by Ulisses/dsa5official.css @@ -289,6 +289,17 @@ background-image: url(https://ulisses-digital.de/R20/dsa5/sheet/dsa5logo.webp) } +.ui-dialog .charsheet .boldRoll:before { + margin-right: 10px; + font-weight: 400 +} + +.ui-dialog .charsheet button.boldRoll[type=roll] { + font-family: Signika; + font-weight: 700; + font-size: 14px +} + .ui-dialog .charsheet input.inventartab1:checked~div.inventartab1, .ui-dialog .charsheet input.inventartab3:checked~div.inventartab3, .ui-dialog .charsheet input.inventartab4:checked~div.inventartab4, @@ -296,7 +307,6 @@ .ui-dialog .charsheet input.kampftab1:checked~div.kampftab1, .ui-dialog .charsheet input.kampftab2:checked~div.kampftab2, .ui-dialog .charsheet input.kampftab3:checked~div.kampftab3, -.ui-dialog .charsheet input.kampftab4:checked~div.kampftab4, .ui-dialog .charsheet input.tab10:checked~div.tab10, .ui-dialog .charsheet input.tab11:checked~div.tab11, .ui-dialog .charsheet input.tab12:checked~div.tab12, @@ -1341,6 +1351,288 @@ color: #0d0b0b } +.sheet-rolltemplate-DSA-Eigenschaft .sheet-dsa-rolltemplate .sheet-singleDie, +.sheet-rolltemplate-DSA-Fernkampf-AT .sheet-dsa-rolltemplate .sheet-singleDie, +.sheet-rolltemplate-DSA-Fernkampf-AT-Patzer .sheet-dsa-rolltemplate .sheet-singleDie, +.sheet-rolltemplate-DSA-Fernkampf-TP .sheet-dsa-rolltemplate .sheet-singleDie, +.sheet-rolltemplate-DSA-Initiative .sheet-dsa-rolltemplate .sheet-singleDie, +.sheet-rolltemplate-DSA-Liturgie .sheet-dsa-rolltemplate .sheet-singleDie, +.sheet-rolltemplate-DSA-Liturgie-Patzer .sheet-dsa-rolltemplate .sheet-singleDie, +.sheet-rolltemplate-DSA-Nahkampf-AT .sheet-dsa-rolltemplate .sheet-singleDie, +.sheet-rolltemplate-DSA-Nahkampf-ATPA-Patzer .sheet-dsa-rolltemplate .sheet-singleDie, +.sheet-rolltemplate-DSA-Nahkampf-Schild-Patzer .sheet-dsa-rolltemplate .sheet-singleDie, +.sheet-rolltemplate-DSA-Nahkampf-TP .sheet-dsa-rolltemplate .sheet-singleDie, +.sheet-rolltemplate-DSA-Nahkampf-VE .sheet-dsa-rolltemplate .sheet-singleDie, +.sheet-rolltemplate-DSA-Talente .sheet-dsa-rolltemplate .sheet-singleDie, +.sheet-rolltemplate-DSA-Zauber .sheet-dsa-rolltemplate .sheet-singleDie, +.sheet-rolltemplate-DSA-Zauber-Patzer .sheet-dsa-rolltemplate .sheet-singleDie, +.sheet-rolltemplate-DSA-selbstverletzt .sheet-dsa-rolltemplate .sheet-singleDie, +.sheet-rolltemplate-Routineprobe .sheet-dsa-rolltemplate .sheet-singleDie, +.sheet-rolltemplate-postLink .sheet-dsa-rolltemplate .sheet-singleDie { + position: relative; + display: inline-block +} + +.sheet-rolltemplate-DSA-Eigenschaft .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult, +.sheet-rolltemplate-DSA-Fernkampf-AT .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult, +.sheet-rolltemplate-DSA-Fernkampf-AT-Patzer .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult, +.sheet-rolltemplate-DSA-Fernkampf-TP .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult, +.sheet-rolltemplate-DSA-Initiative .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult, +.sheet-rolltemplate-DSA-Liturgie .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult, +.sheet-rolltemplate-DSA-Liturgie-Patzer .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult, +.sheet-rolltemplate-DSA-Nahkampf-AT .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult, +.sheet-rolltemplate-DSA-Nahkampf-ATPA-Patzer .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult, +.sheet-rolltemplate-DSA-Nahkampf-Schild-Patzer .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult, +.sheet-rolltemplate-DSA-Nahkampf-TP .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult, +.sheet-rolltemplate-DSA-Nahkampf-VE .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult, +.sheet-rolltemplate-DSA-Talente .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult, +.sheet-rolltemplate-DSA-Zauber .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult, +.sheet-rolltemplate-DSA-Zauber-Patzer .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult, +.sheet-rolltemplate-DSA-selbstverletzt .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult, +.sheet-rolltemplate-Routineprobe .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult, +.sheet-rolltemplate-postLink .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult { + position: absolute; + top: 0; + padding: 0; + line-height: 45px; + right: 0; + z-index: 1 +} + +.sheet-rolltemplate-DSA-Eigenschaft .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult .inlinerollresult, +.sheet-rolltemplate-DSA-Fernkampf-AT .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult .inlinerollresult, +.sheet-rolltemplate-DSA-Fernkampf-AT-Patzer .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult .inlinerollresult, +.sheet-rolltemplate-DSA-Fernkampf-TP .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult .inlinerollresult, +.sheet-rolltemplate-DSA-Initiative .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult .inlinerollresult, +.sheet-rolltemplate-DSA-Liturgie .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult .inlinerollresult, +.sheet-rolltemplate-DSA-Liturgie-Patzer .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult .inlinerollresult, +.sheet-rolltemplate-DSA-Nahkampf-AT .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult .inlinerollresult, +.sheet-rolltemplate-DSA-Nahkampf-ATPA-Patzer .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult .inlinerollresult, +.sheet-rolltemplate-DSA-Nahkampf-Schild-Patzer .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult .inlinerollresult, +.sheet-rolltemplate-DSA-Nahkampf-TP .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult .inlinerollresult, +.sheet-rolltemplate-DSA-Nahkampf-VE .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult .inlinerollresult, +.sheet-rolltemplate-DSA-Talente .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult .inlinerollresult, +.sheet-rolltemplate-DSA-Zauber .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult .inlinerollresult, +.sheet-rolltemplate-DSA-Zauber-Patzer .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult .inlinerollresult, +.sheet-rolltemplate-DSA-selbstverletzt .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult .inlinerollresult, +.sheet-rolltemplate-Routineprobe .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult .inlinerollresult, +.sheet-rolltemplate-postLink .sheet-dsa-rolltemplate .sheet-singleDie .sheet-overlayResult .inlinerollresult { + font-weight: 700; + text-shadow: 0 0 3px #fff +} + +.sheet-rolltemplate-DSA-Eigenschaft .sheet-dsa-rolltemplate .sheet-center, +.sheet-rolltemplate-DSA-Fernkampf-AT .sheet-dsa-rolltemplate .sheet-center, +.sheet-rolltemplate-DSA-Fernkampf-AT-Patzer .sheet-dsa-rolltemplate .sheet-center, +.sheet-rolltemplate-DSA-Fernkampf-TP .sheet-dsa-rolltemplate .sheet-center, +.sheet-rolltemplate-DSA-Initiative .sheet-dsa-rolltemplate .sheet-center, +.sheet-rolltemplate-DSA-Liturgie .sheet-dsa-rolltemplate .sheet-center, +.sheet-rolltemplate-DSA-Liturgie-Patzer .sheet-dsa-rolltemplate .sheet-center, +.sheet-rolltemplate-DSA-Nahkampf-AT .sheet-dsa-rolltemplate .sheet-center, +.sheet-rolltemplate-DSA-Nahkampf-ATPA-Patzer .sheet-dsa-rolltemplate .sheet-center, +.sheet-rolltemplate-DSA-Nahkampf-Schild-Patzer .sheet-dsa-rolltemplate .sheet-center, +.sheet-rolltemplate-DSA-Nahkampf-TP .sheet-dsa-rolltemplate .sheet-center, +.sheet-rolltemplate-DSA-Nahkampf-VE .sheet-dsa-rolltemplate .sheet-center, +.sheet-rolltemplate-DSA-Talente .sheet-dsa-rolltemplate .sheet-center, +.sheet-rolltemplate-DSA-Zauber .sheet-dsa-rolltemplate .sheet-center, +.sheet-rolltemplate-DSA-Zauber-Patzer .sheet-dsa-rolltemplate .sheet-center, +.sheet-rolltemplate-DSA-selbstverletzt .sheet-dsa-rolltemplate .sheet-center, +.sheet-rolltemplate-Routineprobe .sheet-dsa-rolltemplate .sheet-center, +.sheet-rolltemplate-postLink .sheet-dsa-rolltemplate .sheet-center { + text-align: center +} + +.sheet-rolltemplate-DSA-Eigenschaft .sheet-dsa-rolltemplate .sheet-d20, +.sheet-rolltemplate-DSA-Fernkampf-AT .sheet-dsa-rolltemplate .sheet-d20, +.sheet-rolltemplate-DSA-Fernkampf-AT-Patzer .sheet-dsa-rolltemplate .sheet-d20, +.sheet-rolltemplate-DSA-Fernkampf-TP .sheet-dsa-rolltemplate .sheet-d20, +.sheet-rolltemplate-DSA-Initiative .sheet-dsa-rolltemplate .sheet-d20, +.sheet-rolltemplate-DSA-Liturgie .sheet-dsa-rolltemplate .sheet-d20, +.sheet-rolltemplate-DSA-Liturgie-Patzer .sheet-dsa-rolltemplate .sheet-d20, +.sheet-rolltemplate-DSA-Nahkampf-AT .sheet-dsa-rolltemplate .sheet-d20, +.sheet-rolltemplate-DSA-Nahkampf-ATPA-Patzer .sheet-dsa-rolltemplate .sheet-d20, +.sheet-rolltemplate-DSA-Nahkampf-Schild-Patzer .sheet-dsa-rolltemplate .sheet-d20, +.sheet-rolltemplate-DSA-Nahkampf-TP .sheet-dsa-rolltemplate .sheet-d20, +.sheet-rolltemplate-DSA-Nahkampf-VE .sheet-dsa-rolltemplate .sheet-d20, +.sheet-rolltemplate-DSA-Talente .sheet-dsa-rolltemplate .sheet-d20, +.sheet-rolltemplate-DSA-Zauber .sheet-dsa-rolltemplate .sheet-d20, +.sheet-rolltemplate-DSA-Zauber-Patzer .sheet-dsa-rolltemplate .sheet-d20, +.sheet-rolltemplate-DSA-selbstverletzt .sheet-dsa-rolltemplate .sheet-d20, +.sheet-rolltemplate-Routineprobe .sheet-dsa-rolltemplate .sheet-d20, +.sheet-rolltemplate-postLink .sheet-dsa-rolltemplate .sheet-d20 { + font-family: dicefontd20; + font-size: 45px; + line-height: 45px +} + +.sheet-rolltemplate-DSA-Eigenschaft .sheet-dsa-rolltemplate .sheet-d20.sheet-fingerfertigkeit, +.sheet-rolltemplate-DSA-Fernkampf-AT .sheet-dsa-rolltemplate .sheet-d20.sheet-fingerfertigkeit, +.sheet-rolltemplate-DSA-Fernkampf-AT-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-fingerfertigkeit, +.sheet-rolltemplate-DSA-Fernkampf-TP .sheet-dsa-rolltemplate .sheet-d20.sheet-fingerfertigkeit, +.sheet-rolltemplate-DSA-Initiative .sheet-dsa-rolltemplate .sheet-d20.sheet-fingerfertigkeit, +.sheet-rolltemplate-DSA-Liturgie .sheet-dsa-rolltemplate .sheet-d20.sheet-fingerfertigkeit, +.sheet-rolltemplate-DSA-Liturgie-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-fingerfertigkeit, +.sheet-rolltemplate-DSA-Nahkampf-AT .sheet-dsa-rolltemplate .sheet-d20.sheet-fingerfertigkeit, +.sheet-rolltemplate-DSA-Nahkampf-ATPA-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-fingerfertigkeit, +.sheet-rolltemplate-DSA-Nahkampf-Schild-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-fingerfertigkeit, +.sheet-rolltemplate-DSA-Nahkampf-TP .sheet-dsa-rolltemplate .sheet-d20.sheet-fingerfertigkeit, +.sheet-rolltemplate-DSA-Nahkampf-VE .sheet-dsa-rolltemplate .sheet-d20.sheet-fingerfertigkeit, +.sheet-rolltemplate-DSA-Talente .sheet-dsa-rolltemplate .sheet-d20.sheet-fingerfertigkeit, +.sheet-rolltemplate-DSA-Zauber .sheet-dsa-rolltemplate .sheet-d20.sheet-fingerfertigkeit, +.sheet-rolltemplate-DSA-Zauber-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-fingerfertigkeit, +.sheet-rolltemplate-DSA-selbstverletzt .sheet-dsa-rolltemplate .sheet-d20.sheet-fingerfertigkeit, +.sheet-rolltemplate-Routineprobe .sheet-dsa-rolltemplate .sheet-d20.sheet-fingerfertigkeit, +.sheet-rolltemplate-postLink .sheet-dsa-rolltemplate .sheet-d20.sheet-fingerfertigkeit { + color: #d5b467 +} + +.sheet-rolltemplate-DSA-Eigenschaft .sheet-dsa-rolltemplate .sheet-d20.sheet-charisma, +.sheet-rolltemplate-DSA-Fernkampf-AT .sheet-dsa-rolltemplate .sheet-d20.sheet-charisma, +.sheet-rolltemplate-DSA-Fernkampf-AT-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-charisma, +.sheet-rolltemplate-DSA-Fernkampf-TP .sheet-dsa-rolltemplate .sheet-d20.sheet-charisma, +.sheet-rolltemplate-DSA-Initiative .sheet-dsa-rolltemplate .sheet-d20.sheet-charisma, +.sheet-rolltemplate-DSA-Liturgie .sheet-dsa-rolltemplate .sheet-d20.sheet-charisma, +.sheet-rolltemplate-DSA-Liturgie-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-charisma, +.sheet-rolltemplate-DSA-Nahkampf-AT .sheet-dsa-rolltemplate .sheet-d20.sheet-charisma, +.sheet-rolltemplate-DSA-Nahkampf-ATPA-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-charisma, +.sheet-rolltemplate-DSA-Nahkampf-Schild-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-charisma, +.sheet-rolltemplate-DSA-Nahkampf-TP .sheet-dsa-rolltemplate .sheet-d20.sheet-charisma, +.sheet-rolltemplate-DSA-Nahkampf-VE .sheet-dsa-rolltemplate .sheet-d20.sheet-charisma, +.sheet-rolltemplate-DSA-Talente .sheet-dsa-rolltemplate .sheet-d20.sheet-charisma, +.sheet-rolltemplate-DSA-Zauber .sheet-dsa-rolltemplate .sheet-d20.sheet-charisma, +.sheet-rolltemplate-DSA-Zauber-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-charisma, +.sheet-rolltemplate-DSA-selbstverletzt .sheet-dsa-rolltemplate .sheet-d20.sheet-charisma, +.sheet-rolltemplate-Routineprobe .sheet-dsa-rolltemplate .sheet-d20.sheet-charisma, +.sheet-rolltemplate-postLink .sheet-dsa-rolltemplate .sheet-d20.sheet-charisma { + color: #0d0d0d +} + +.sheet-rolltemplate-DSA-Eigenschaft .sheet-dsa-rolltemplate .sheet-d20.sheet-gewandtheit, +.sheet-rolltemplate-DSA-Fernkampf-AT .sheet-dsa-rolltemplate .sheet-d20.sheet-gewandtheit, +.sheet-rolltemplate-DSA-Fernkampf-AT-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-gewandtheit, +.sheet-rolltemplate-DSA-Fernkampf-TP .sheet-dsa-rolltemplate .sheet-d20.sheet-gewandtheit, +.sheet-rolltemplate-DSA-Initiative .sheet-dsa-rolltemplate .sheet-d20.sheet-gewandtheit, +.sheet-rolltemplate-DSA-Liturgie .sheet-dsa-rolltemplate .sheet-d20.sheet-gewandtheit, +.sheet-rolltemplate-DSA-Liturgie-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-gewandtheit, +.sheet-rolltemplate-DSA-Nahkampf-AT .sheet-dsa-rolltemplate .sheet-d20.sheet-gewandtheit, +.sheet-rolltemplate-DSA-Nahkampf-ATPA-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-gewandtheit, +.sheet-rolltemplate-DSA-Nahkampf-Schild-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-gewandtheit, +.sheet-rolltemplate-DSA-Nahkampf-TP .sheet-dsa-rolltemplate .sheet-d20.sheet-gewandtheit, +.sheet-rolltemplate-DSA-Nahkampf-VE .sheet-dsa-rolltemplate .sheet-d20.sheet-gewandtheit, +.sheet-rolltemplate-DSA-Talente .sheet-dsa-rolltemplate .sheet-d20.sheet-gewandtheit, +.sheet-rolltemplate-DSA-Zauber .sheet-dsa-rolltemplate .sheet-d20.sheet-gewandtheit, +.sheet-rolltemplate-DSA-Zauber-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-gewandtheit, +.sheet-rolltemplate-DSA-selbstverletzt .sheet-dsa-rolltemplate .sheet-d20.sheet-gewandtheit, +.sheet-rolltemplate-Routineprobe .sheet-dsa-rolltemplate .sheet-d20.sheet-gewandtheit, +.sheet-rolltemplate-postLink .sheet-dsa-rolltemplate .sheet-d20.sheet-gewandtheit { + color: #688ec4 +} + +.sheet-rolltemplate-DSA-Eigenschaft .sheet-dsa-rolltemplate .sheet-d20.sheet-intuition, +.sheet-rolltemplate-DSA-Fernkampf-AT .sheet-dsa-rolltemplate .sheet-d20.sheet-intuition, +.sheet-rolltemplate-DSA-Fernkampf-AT-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-intuition, +.sheet-rolltemplate-DSA-Fernkampf-TP .sheet-dsa-rolltemplate .sheet-d20.sheet-intuition, +.sheet-rolltemplate-DSA-Initiative .sheet-dsa-rolltemplate .sheet-d20.sheet-intuition, +.sheet-rolltemplate-DSA-Liturgie .sheet-dsa-rolltemplate .sheet-d20.sheet-intuition, +.sheet-rolltemplate-DSA-Liturgie-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-intuition, +.sheet-rolltemplate-DSA-Nahkampf-AT .sheet-dsa-rolltemplate .sheet-d20.sheet-intuition, +.sheet-rolltemplate-DSA-Nahkampf-ATPA-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-intuition, +.sheet-rolltemplate-DSA-Nahkampf-Schild-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-intuition, +.sheet-rolltemplate-DSA-Nahkampf-TP .sheet-dsa-rolltemplate .sheet-d20.sheet-intuition, +.sheet-rolltemplate-DSA-Nahkampf-VE .sheet-dsa-rolltemplate .sheet-d20.sheet-intuition, +.sheet-rolltemplate-DSA-Talente .sheet-dsa-rolltemplate .sheet-d20.sheet-intuition, +.sheet-rolltemplate-DSA-Zauber .sheet-dsa-rolltemplate .sheet-d20.sheet-intuition, +.sheet-rolltemplate-DSA-Zauber-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-intuition, +.sheet-rolltemplate-DSA-selbstverletzt .sheet-dsa-rolltemplate .sheet-d20.sheet-intuition, +.sheet-rolltemplate-Routineprobe .sheet-dsa-rolltemplate .sheet-d20.sheet-intuition, +.sheet-rolltemplate-postLink .sheet-dsa-rolltemplate .sheet-d20.sheet-intuition { + color: #388834 +} + +.sheet-rolltemplate-DSA-Eigenschaft .sheet-dsa-rolltemplate .sheet-d20.sheet-koerperkraft, +.sheet-rolltemplate-DSA-Fernkampf-AT .sheet-dsa-rolltemplate .sheet-d20.sheet-koerperkraft, +.sheet-rolltemplate-DSA-Fernkampf-AT-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-koerperkraft, +.sheet-rolltemplate-DSA-Fernkampf-TP .sheet-dsa-rolltemplate .sheet-d20.sheet-koerperkraft, +.sheet-rolltemplate-DSA-Initiative .sheet-dsa-rolltemplate .sheet-d20.sheet-koerperkraft, +.sheet-rolltemplate-DSA-Liturgie .sheet-dsa-rolltemplate .sheet-d20.sheet-koerperkraft, +.sheet-rolltemplate-DSA-Liturgie-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-koerperkraft, +.sheet-rolltemplate-DSA-Nahkampf-AT .sheet-dsa-rolltemplate .sheet-d20.sheet-koerperkraft, +.sheet-rolltemplate-DSA-Nahkampf-ATPA-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-koerperkraft, +.sheet-rolltemplate-DSA-Nahkampf-Schild-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-koerperkraft, +.sheet-rolltemplate-DSA-Nahkampf-TP .sheet-dsa-rolltemplate .sheet-d20.sheet-koerperkraft, +.sheet-rolltemplate-DSA-Nahkampf-VE .sheet-dsa-rolltemplate .sheet-d20.sheet-koerperkraft, +.sheet-rolltemplate-DSA-Talente .sheet-dsa-rolltemplate .sheet-d20.sheet-koerperkraft, +.sheet-rolltemplate-DSA-Zauber .sheet-dsa-rolltemplate .sheet-d20.sheet-koerperkraft, +.sheet-rolltemplate-DSA-Zauber-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-koerperkraft, +.sheet-rolltemplate-DSA-selbstverletzt .sheet-dsa-rolltemplate .sheet-d20.sheet-koerperkraft, +.sheet-rolltemplate-Routineprobe .sheet-dsa-rolltemplate .sheet-d20.sheet-koerperkraft, +.sheet-rolltemplate-postLink .sheet-dsa-rolltemplate .sheet-d20.sheet-koerperkraft { + color: #d6a878 +} + +.sheet-rolltemplate-DSA-Eigenschaft .sheet-dsa-rolltemplate .sheet-d20.sheet-klugheit, +.sheet-rolltemplate-DSA-Fernkampf-AT .sheet-dsa-rolltemplate .sheet-d20.sheet-klugheit, +.sheet-rolltemplate-DSA-Fernkampf-AT-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-klugheit, +.sheet-rolltemplate-DSA-Fernkampf-TP .sheet-dsa-rolltemplate .sheet-d20.sheet-klugheit, +.sheet-rolltemplate-DSA-Initiative .sheet-dsa-rolltemplate .sheet-d20.sheet-klugheit, +.sheet-rolltemplate-DSA-Liturgie .sheet-dsa-rolltemplate .sheet-d20.sheet-klugheit, +.sheet-rolltemplate-DSA-Liturgie-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-klugheit, +.sheet-rolltemplate-DSA-Nahkampf-AT .sheet-dsa-rolltemplate .sheet-d20.sheet-klugheit, +.sheet-rolltemplate-DSA-Nahkampf-ATPA-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-klugheit, +.sheet-rolltemplate-DSA-Nahkampf-Schild-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-klugheit, +.sheet-rolltemplate-DSA-Nahkampf-TP .sheet-dsa-rolltemplate .sheet-d20.sheet-klugheit, +.sheet-rolltemplate-DSA-Nahkampf-VE .sheet-dsa-rolltemplate .sheet-d20.sheet-klugheit, +.sheet-rolltemplate-DSA-Talente .sheet-dsa-rolltemplate .sheet-d20.sheet-klugheit, +.sheet-rolltemplate-DSA-Zauber .sheet-dsa-rolltemplate .sheet-d20.sheet-klugheit, +.sheet-rolltemplate-DSA-Zauber-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-klugheit, +.sheet-rolltemplate-DSA-selbstverletzt .sheet-dsa-rolltemplate .sheet-d20.sheet-klugheit, +.sheet-rolltemplate-Routineprobe .sheet-dsa-rolltemplate .sheet-d20.sheet-klugheit, +.sheet-rolltemplate-postLink .sheet-dsa-rolltemplate .sheet-d20.sheet-klugheit { + color: #8259a3 +} + +.sheet-rolltemplate-DSA-Eigenschaft .sheet-dsa-rolltemplate .sheet-d20.sheet-konstitution, +.sheet-rolltemplate-DSA-Fernkampf-AT .sheet-dsa-rolltemplate .sheet-d20.sheet-konstitution, +.sheet-rolltemplate-DSA-Fernkampf-AT-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-konstitution, +.sheet-rolltemplate-DSA-Fernkampf-TP .sheet-dsa-rolltemplate .sheet-d20.sheet-konstitution, +.sheet-rolltemplate-DSA-Initiative .sheet-dsa-rolltemplate .sheet-d20.sheet-konstitution, +.sheet-rolltemplate-DSA-Liturgie .sheet-dsa-rolltemplate .sheet-d20.sheet-konstitution, +.sheet-rolltemplate-DSA-Liturgie-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-konstitution, +.sheet-rolltemplate-DSA-Nahkampf-AT .sheet-dsa-rolltemplate .sheet-d20.sheet-konstitution, +.sheet-rolltemplate-DSA-Nahkampf-ATPA-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-konstitution, +.sheet-rolltemplate-DSA-Nahkampf-Schild-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-konstitution, +.sheet-rolltemplate-DSA-Nahkampf-TP .sheet-dsa-rolltemplate .sheet-d20.sheet-konstitution, +.sheet-rolltemplate-DSA-Nahkampf-VE .sheet-dsa-rolltemplate .sheet-d20.sheet-konstitution, +.sheet-rolltemplate-DSA-Talente .sheet-dsa-rolltemplate .sheet-d20.sheet-konstitution, +.sheet-rolltemplate-DSA-Zauber .sheet-dsa-rolltemplate .sheet-d20.sheet-konstitution, +.sheet-rolltemplate-DSA-Zauber-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-konstitution, +.sheet-rolltemplate-DSA-selbstverletzt .sheet-dsa-rolltemplate .sheet-d20.sheet-konstitution, +.sheet-rolltemplate-Routineprobe .sheet-dsa-rolltemplate .sheet-d20.sheet-konstitution, +.sheet-rolltemplate-postLink .sheet-dsa-rolltemplate .sheet-d20.sheet-konstitution { + color: #a3a3a3 +} + +.sheet-rolltemplate-DSA-Eigenschaft .sheet-dsa-rolltemplate .sheet-d20.sheet-mut, +.sheet-rolltemplate-DSA-Fernkampf-AT .sheet-dsa-rolltemplate .sheet-d20.sheet-mut, +.sheet-rolltemplate-DSA-Fernkampf-AT-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-mut, +.sheet-rolltemplate-DSA-Fernkampf-TP .sheet-dsa-rolltemplate .sheet-d20.sheet-mut, +.sheet-rolltemplate-DSA-Initiative .sheet-dsa-rolltemplate .sheet-d20.sheet-mut, +.sheet-rolltemplate-DSA-Liturgie .sheet-dsa-rolltemplate .sheet-d20.sheet-mut, +.sheet-rolltemplate-DSA-Liturgie-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-mut, +.sheet-rolltemplate-DSA-Nahkampf-AT .sheet-dsa-rolltemplate .sheet-d20.sheet-mut, +.sheet-rolltemplate-DSA-Nahkampf-ATPA-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-mut, +.sheet-rolltemplate-DSA-Nahkampf-Schild-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-mut, +.sheet-rolltemplate-DSA-Nahkampf-TP .sheet-dsa-rolltemplate .sheet-d20.sheet-mut, +.sheet-rolltemplate-DSA-Nahkampf-VE .sheet-dsa-rolltemplate .sheet-d20.sheet-mut, +.sheet-rolltemplate-DSA-Talente .sheet-dsa-rolltemplate .sheet-d20.sheet-mut, +.sheet-rolltemplate-DSA-Zauber .sheet-dsa-rolltemplate .sheet-d20.sheet-mut, +.sheet-rolltemplate-DSA-Zauber-Patzer .sheet-dsa-rolltemplate .sheet-d20.sheet-mut, +.sheet-rolltemplate-DSA-selbstverletzt .sheet-dsa-rolltemplate .sheet-d20.sheet-mut, +.sheet-rolltemplate-Routineprobe .sheet-dsa-rolltemplate .sheet-d20.sheet-mut, +.sheet-rolltemplate-postLink .sheet-dsa-rolltemplate .sheet-d20.sheet-mut { + color: #b3241a +} + .sheet-rolltemplate-DSA-Eigenschaft .sheet-dsa-rolltemplate .sheet-row-section:first-child, .sheet-rolltemplate-DSA-Fernkampf-AT .sheet-dsa-rolltemplate .sheet-row-section:first-child, .sheet-rolltemplate-DSA-Fernkampf-AT-Patzer .sheet-dsa-rolltemplate .sheet-row-section:first-child, diff --git a/Das Schwarze Auge (TDE) 5 OFFICIAL by Ulisses/dsa5official.html b/Das Schwarze Auge (TDE) 5 OFFICIAL by Ulisses/dsa5official.html index bc31e4f226..4d743f2dc9 100644 --- a/Das Schwarze Auge (TDE) 5 OFFICIAL by Ulisses/dsa5official.html +++ b/Das Schwarze Auge (TDE) 5 OFFICIAL by Ulisses/dsa5official.html @@ -1,3 +1,4 @@ +
@@ -999,8 +1000,6 @@ - - @@ -1187,8 +1186,6 @@ - - @@ -1378,8 +1375,6 @@ - - @@ -1566,8 +1561,6 @@ - - @@ -1708,14 +1701,6 @@
- - - - - - - - @@ -1755,7 +1740,7 @@ - +
reiten - - + + @@ -1893,7 +1878,7 @@
- +
fliegen - - + + @@ -2031,7 +2016,7 @@
- +
verbergen - - + + @@ -2169,7 +2154,7 @@
- +
schwimmen - - + + @@ -2307,7 +2292,7 @@
- +
sinnesschaerfe - - + + @@ -2444,7 +2429,7 @@
- +
zechen - - + + @@ -2581,7 +2566,7 @@
- +
singen - - + + @@ -2718,7 +2703,7 @@
- +
selbstbeherrschung - - + + @@ -2855,7 +2840,7 @@
- +
taschendiebstahl - - + + @@ -2993,7 +2978,7 @@
- +
gaukeleien - - + + @@ -3131,7 +3116,7 @@
- +
kraftakt - - + + @@ -3269,7 +3254,7 @@
- +
klettern - - + + @@ -3407,7 +3392,7 @@
- +
koerperbeherrschung - - + + @@ -3545,7 +3530,7 @@
- +
tanzen - - + + @@ -3709,7 +3694,7 @@
- +
ueberreden - - + + @@ -3846,7 +3831,7 @@
- +
bekehren - - + + @@ -3983,7 +3968,7 @@
- +
menschenkenntnis - - + + @@ -4120,7 +4105,7 @@
- +
verkleiden - - + + @@ -4258,7 +4243,7 @@
- +
willenskraft - - + + @@ -4395,7 +4380,7 @@
- +
gassenwissen - - + + @@ -4532,7 +4517,7 @@
- +
einschuechtern - - + + @@ -4669,7 +4654,7 @@
- +
betoeren - - + + @@ -4806,7 +4791,7 @@
- +
etikette - - + + @@ -4969,7 +4954,7 @@
- +
orientierung - - + + @@ -5106,7 +5091,7 @@
- +
tierkunde - - + + @@ -5244,7 +5229,7 @@
- +
wildnisleben - - + + @@ -5382,7 +5367,7 @@
- +
faehrtensuchen - - + + @@ -5520,7 +5505,7 @@
- +
fischen - - + + @@ -5657,7 +5642,7 @@
- +
fesseln - - + + @@ -5794,7 +5779,7 @@
- +
pflanzenkunde - - + + @@ -5957,7 +5942,7 @@
- +
sternkunde - - + + @@ -6094,7 +6079,7 @@
- +
rechnen - - + + @@ -6231,7 +6216,7 @@
- +
rechtskunde - - + + @@ -6368,7 +6353,7 @@
- +
geschichtswissen - - + + @@ -6505,7 +6490,7 @@
- +
mechanik - - + + @@ -6642,7 +6627,7 @@
- +
kriegskunst - - + + @@ -6779,7 +6764,7 @@
- +
geographie - - + + @@ -6916,7 +6901,7 @@
- +
goetterkulte - - + + @@ -7053,7 +7038,7 @@
- +
sagenlegenden - - + + @@ -7190,7 +7175,7 @@
- +
magiekunde - - + + @@ -7327,7 +7312,7 @@
- +
sphaerenkunde - - + + @@ -7464,7 +7449,7 @@
- +
glueckspiel - - + + @@ -7627,7 +7612,7 @@
- +
holzbearbeitung - - + + @@ -7765,7 +7750,7 @@
- +
stoffbearbeitung - - + + @@ -7903,7 +7888,7 @@
- +
steinbearbeitung - - + + @@ -8041,7 +8026,7 @@
- +
hkkrankheiten - - + + @@ -8179,7 +8164,7 @@
- +
metallbearbeitung - - + + @@ -8317,7 +8302,7 @@
- +
lederbearbeitung - - + + @@ -8455,7 +8440,7 @@
- +
handel - - + + @@ -8592,7 +8577,7 @@
- +
fahrzeuge - - + + @@ -8730,7 +8715,7 @@
- +
alchemie - - + + @@ -8868,7 +8853,7 @@
- +
lebensmittelbearbeitung - - + + @@ -9006,7 +8991,7 @@
- +
hkgift - - + + @@ -9144,7 +9129,7 @@
- +
schloesserknacken - - + + @@ -9282,7 +9267,7 @@
- +
malenzeichnen - - + + @@ -9420,7 +9405,7 @@
- +
musizieren - - + + @@ -9558,7 +9543,7 @@
- +
hkseele - - + + @@ -9695,7 +9680,7 @@
- +
hkwunden - - + + @@ -9833,7 +9818,7 @@
- +
boote - - + + @@ -10026,10 +10011,15 @@ - + + +
+ + Zauber-Patzer +
- Wirkungsdauer + Zauberdauer
- Dauer + Zauberdauer
@@ -10397,10 +10387,15 @@ - + + +
+ + Liturgie-Patzer +
- Wirkungsdauer + Zauberdauer
- Dauer + Zauberdauer
@@ -11424,8 +11419,6 @@ - - @@ -11612,8 +11605,6 @@ - - @@ -11803,8 +11794,6 @@ - - @@ -11991,8 +11980,6 @@ - - @@ -12133,14 +12120,6 @@ - - - - - - - - @@ -12158,8 +12137,6 @@ Nahkampf Fernkampf - - Patzer

Basiswerte

@@ -12260,7 +12237,7 @@ B - + B - + C - + B - + B - +
+
+ Fächer + + C + + + + +
Fechtwaffen C - + B - + C - + C - + B - +
- Peitschen + Peitschen B - + B - + C - + B - + C - +
+
+ Spießwaffen + + C + + + + +
Stangenwaffen C - +
+
Wurfwaffen C - + C - + C - + - +
@@ -12637,7 +12645,7 @@
- +
@@ -12744,12 +12752,11 @@ - Beidhändiger Kampf + Beidhändig -
+ @@ -13068,9 +13094,13 @@ +
+ +
+
@@ -13104,6 +13134,20 @@
+ +
+
+ Patzer +
+
+ + + + + + +
+
Modifikatoren @@ -13138,40 +13182,10 @@ Effekt-Mod. TP
+
- -
-
-

Patzer

-
- - Schaden durch Patzer - erleidet - SP durch einen Patzer - - Attacke/Parade-Patzer - -
-
- - Schild-Patzer - - Fernkampf-Patzer - -
-
- - Zauber-Patzer - - Liturgie-Patzer - - -
- -
-
@@ -13242,6 +13256,8 @@ + + @@ -13409,6 +13425,8 @@ + + @@ -14027,7 +14045,7 @@ {{#dauer}}
- Dauer: {{dauer}} + Dauer: {{dauer}}
{{/dauer}} {{#kosten}} @@ -14092,7 +14110,7 @@ {{#dauer}}
- Dauer: {{dauer}} + Dauer: {{dauer}}
{{/dauer}} {{#kosten}} @@ -14210,6 +14228,33 @@ + +
+
+ {{name}} +
+
+
Eigenschaft
+
+
+
+ {{probe}} +
A
+
+
+
+ modifikatoren:: {{mod}}, {{status}} +
+
+ {{#rollGreater() probe -1}} + Ergebnis: {{#rollWasCrit() probe}}Kritischer{{/rollWasCrit() probe}}Gelungen + {{/rollGreater() probe -1}} + {{#rollLess() probe 0}} + Ergebnis: {{#rollWasFumble() probe}}Kritischer{{/rollWasFumble() probe}}Misslungen {{/rollLess() probe 0}} +
+
+
+
@@ -14238,15 +14283,35 @@
{{/^rollTotal() mod 0}}
- {{#rollGreater() wurf wert}} - Ergebnis: {{#rollWasFumble() wurf}}Kritischer{{/rollWasFumble() wurf}}Misslungen - {{freitext_misslungen}} - {{/rollGreater() wurf wert}} - {{#^rollGreater() wurf wert}} - Ergebnis: {{#rollWasCrit() wurf}}Kritischer{{/rollWasCrit() wurf}}Gelungen - {{freitext_gelungen}} - {{/^rollGreater() wurf wert}} -
+ Ergebnis: + {{#rollGreater() wurf 19}} + KritischerMisslungen + {{#freitext_misslungen}} +
{{freitext_misslungen}} + {{/freitext_misslungen}} + {{/rollGreater() wurf 19}} + {{#rollLess() wurf 2}} + KritischerGelungen + {{#freitext_gelungen}} +
{{freitext_gelungen}} + {{/freitext_gelungen}} + {{/rollLess() wurf 2}} + + {{#rollBetween() wurf 2 19}} + {{#rollGreater() wurf wert}} + Misslungen + {{#freitext_misslungen}} +
{{freitext_misslungen}} + {{/freitext_misslungen}} + {{/rollGreater() wurf wert}} + {{#^rollGreater() wurf wert}} + Gelungen + {{#freitext_gelungen}} +
{{freitext_gelungen}} + {{/freitext_gelungen}} + {{/^rollGreater() wurf wert}} + {{/rollBetween() wurf 2 19}} +
@@ -14267,15 +14332,35 @@ {{/^rollTotal() mod 0}}
- {{#rollGreater() wurf wert}} - Ergebnis: {{#rollWasFumble() wurf}}Kritischer{{/rollWasFumble() wurf}}Misslungen - {{freitext_misslungen}} - {{/rollGreater() wurf wert}} - {{#^rollGreater() wurf wert}} - Ergebnis: {{#rollWasCrit() wurf}}Kritischer{{/rollWasCrit() wurf}}Gelungen - {{freitext_gelungen}} - {{/^rollGreater() wurf wert}} -
+ Ergebnis: + {{#rollGreater() wurf 19}} + KritischerMisslungen + {{#freitext_misslungen}} +
{{freitext_misslungen}} + {{/freitext_misslungen}} + {{/rollGreater() wurf 19}} + {{#rollLess() wurf 2}} + KritischerGelungen + {{#freitext_gelungen}} +
{{freitext_gelungen}} + {{/freitext_gelungen}} + {{/rollLess() wurf 2}} + + {{#rollBetween() wurf 2 19}} + {{#rollGreater() wurf wert}} + Misslungen + {{#freitext_misslungen}} +
{{freitext_misslungen}} + {{/freitext_misslungen}} + {{/rollGreater() wurf wert}} + {{#^rollGreater() wurf wert}} + Gelungen + {{#freitext_gelungen}} +
{{freitext_gelungen}} + {{/freitext_gelungen}} + {{/^rollGreater() wurf wert}} + {{/rollBetween() wurf 2 19}} + @@ -14296,15 +14381,35 @@ {{/^rollTotal() mod 0}}
- {{#rollGreater() wurf wert}} - Ergebnis: {{#rollWasFumble() wurf}}Kritischer{{/rollWasFumble() wurf}}Misslungen - {{freitext_misslungen}} - {{/rollGreater() wurf wert}} - {{#^rollGreater() wurf wert}} - Ergebnis: {{#rollWasCrit() wurf}}Kritischer{{/rollWasCrit() wurf}}Gelungen - {{freitext_gelungen}} - {{/^rollGreater() wurf wert}} -
+ Ergebnis: + {{#rollGreater() wurf 19}} + KritischerMisslungen + {{#freitext_misslungen}} +
{{freitext_misslungen}} + {{/freitext_misslungen}} + {{/rollGreater() wurf 19}} + {{#rollLess() wurf 2}} + KritischerGelungen + {{#freitext_gelungen}} +
{{freitext_gelungen}} + {{/freitext_gelungen}} + {{/rollLess() wurf 2}} + + {{#rollBetween() wurf 2 19}} + {{#rollGreater() wurf wert}} + Misslungen + {{#freitext_misslungen}} +
{{freitext_misslungen}} + {{/freitext_misslungen}} + {{/rollGreater() wurf wert}} + {{#^rollGreater() wurf wert}} + Gelungen + {{#freitext_gelungen}} +
{{freitext_gelungen}} + {{/freitext_gelungen}} + {{/^rollGreater() wurf wert}} + {{/rollBetween() wurf 2 19}} + @@ -14343,7 +14448,7 @@

{{name}}

- +
{{name}}
@@ -14510,7 +14615,7 @@ Schaden durch Patzer
- Auswirkung: + Auswirkung: {{name}} erleidet{{wurf}}Schaden durch Patzer
@@ -14646,6 +14751,1287 @@ getSectionIDsAsync, setAttrsAsync } +})(); + const dsa5sheetFunctions = (() => { + const calcInitiative = () => { + getAttrs(["toggle_npc", "mut_gesamt", "gewandheit_gesamt", "ini_grundwert", "ini_modifikator", "belastung_gesamt", "ini_be_modifikator"], function(values) { + const toggle_npc = values.toggle_npc; + const ini_modifikator = parseInt(values.ini_modifikator) || 0; + const ini_basiswert = Math.round((parseInt(values.mut_gesamt) + parseInt(values.gewandheit_gesamt)) / 2); + const ini_be_modifikator = parseInt(values.ini_be_modifikator) || 0; + const belastung_gesamt = parseInt(values.belastung_gesamt) || 0; + const ini_grundwert = toggle_npc == 'character' ? ini_basiswert : (parseInt(values.ini_grundwert) || 0); + + const ini_gesamt = ini_grundwert + ini_modifikator + ini_be_modifikator - belastung_gesamt; + console.log("DSA5 - calc ini toggle " + toggle_npc + " ini_mod " + ini_modifikator + " grundwert " + ini_grundwert + " ini_basiswert " + ini_basiswert + " ini_be_modifikator " + ini_be_modifikator + " belastung_gesamt " + belastung_gesamt); + setAttrs({ + ini_gesamt, + ini_grundwert + }); + }); + } + + const calcGlaubeMod = () => { + getAttrs(["liturgiedauer_mod", "geste_mod", "reichweite_mod", "formel_mod", "kosten_mod", "fremdtradition_mod", "ritualplatz_mod", "aufrechterhaltung_mod", "zeit_mod", "kleidung_mod", "glaube_entrueckung_akt", "geraetschaften_mod", "glaube_sf_mod", "glaube_effekt_mod", "status_gesamt", "entrueckung_gesamt", "belastung_gesamt"], function(values) { + + const glaube_mod_summe = parseInt(values.liturgiedauer_mod || 0) + + parseInt(values.geste_mod || 0) + + parseInt(values.reichweite_mod || 0) + + parseInt(values.formel_mod || 0) + + parseInt(values.kosten_mod || 0) + + parseInt(values.fremdtradition_mod || 0) + + parseInt(values.ritualplatz_mod || 0) + + (-1 * parseInt(values.aufrechterhaltung_mod || 0)) + + parseInt(values.zeit_mod || 0) + + parseInt(values.kleidung_mod || 0) + + parseInt(values.geraetschaften_mod || 0); + const entrueckung_modifier = getEntruecktModifier(values.glaube_entrueckung_akt, parseInt(values.entrueckung_gesamt || 0)); + const status_modifier = Math.max(-5, parseInt(values.status_gesamt || 0) + parseInt(values.entrueckung_gesamt || 0) + entrueckung_modifier + parseInt(values.belastung_gesamt)); + const glaube_mod_gesamt = glaube_mod_summe + status_modifier; + + setAttrs({ + glaube_mod_summe, + glaube_mod_gesamt, + status_modifier_glaube: status_modifier + }); + }); + } + + const calcMagieMod = () => { + getAttrs(["zauberdauer_mod", "geste_mod", "reichweite_mod", "formel_mod", "kosten_mod", "fremdtradition_mod", "ritualplatz_mod", "aufrechterhaltung_mod", "zeit_mod", "kleidung_mod", "magie_entrueckung_akt", "geraetschaften_mod", "magie_sf_mod", "magie_effekt_mod", "status_gesamt", "entrueckung_gesamt", "belastung_gesamt"], function(values) { + + const magie_mod_summe = parseInt(values.zauberdauer_mod || 0) + + parseInt(values.geste_mod || 0) + + parseInt(values.reichweite_mod || 0) + + parseInt(values.formel_mod || 0) + + parseInt(values.kosten_mod || 0) + + parseInt(values.fremdtradition_mod || 0) + + parseInt(values.ritualplatz_mod || 0) + + (-1 * parseInt(values.aufrechterhaltung_mod || 0)) + + parseInt(values.zeit_mod || 0) + + parseInt(values.kleidung_mod || 0) + + parseInt(values.geraetschaften_mod || 0); + const entrueckung_modifier = getEntruecktModifier(values.magie_entrueckung_akt, parseInt(values.entrueckung_gesamt || 0)); + const status_modifier = Math.max(-5, parseInt(values.status_gesamt || 0) + parseInt(values.entrueckung_gesamt || 0) + entrueckung_modifier + parseInt(values.belastung_gesamt)); + const magie_mod_gesamt = magie_mod_summe + status_modifier; + + setAttrs({ + magie_mod_summe, + magie_mod_gesamt, + status_modifier_magie: status_modifier + }); + }); + } + + const calcTrageLast = async() => { + console.log("Updating Traglast") + const equipmentIds = await dsa5helpers.getSectionIDsAsync("inventory") + const rangeweaponIds = await dsa5helpers.getSectionIDsAsync("rangeweapon") + const armorIds = await dsa5helpers.getSectionIDsAsync("armor") + const meleeweaponIds = await dsa5helpers.getSectionIDsAsync("meleeweapon") + const attrs = [] + for (const id of equipmentIds) { + attrs.push(`repeating_inventory_${id}_weight`, `repeating_inventory_${id}_count`) + } + for (const id of rangeweaponIds) { + attrs.push(`repeating_rangeweapon_${id}_weight`) + } + for (const id of meleeweaponIds) { + attrs.push(`repeating_meleeweapon_${id}_weight`) + } + for (const id of armorIds) { + attrs.push(`repeating_armor_${id}_weight`, `repeating_armor_${id}_ruestung_auswahl`) + } + let traglast = 0.0 + const res = await dsa5helpers.getAttrsAsync(attrs) + for (const id of equipmentIds) { + traglast += Number(res[`repeating_inventory_${id}_weight`]) * Number(res[`repeating_inventory_${id}_count`]) + } + for (const id of rangeweaponIds) { + traglast += Number(res[`repeating_rangeweapon_${id}_weight`]) + } + for (const id of meleeweaponIds) { + traglast += Number(res[`repeating_meleeweapon_${id}_weight`]) + } + for (const id of armorIds) { + traglast += Number(res[`repeating_armor_${id}_weight`]) * (1 - Number(res[`repeating_armor_${id}_ruestung_auswahl`])) + } + traglast = Number(Math.round(traglast + 'e3') + 'e-3') + + setAttrs({ traglast }) + } + + const calcArmor = async() => { + let update = {} + const val = await dsa5helpers.getAttrsAsync(["toggle_npc"]) + if (val.toggle_npc == 'character') { + const idarray = await dsa5helpers.getSectionIDsAsync("armor") + const attrs = ["belastungsgewoehnung_mod"] + idarray.forEach(elem => { + attrs.push(...[`repeating_armor_${elem}_ruestung_auswahl`, `repeating_armor_${elem}_ruestung_rs`, `repeating_armor_${elem}_ruestung_preset`, `repeating_armor_${elem}_ruestung_be_mod`, `repeating_armor_${elem}_ruestung_ini_mod`, `repeating_armor_${elem}_ruestung_gs_mod`, `repeating_armor_${elem}_ruestung_rs_mod`]) + }); + const elems = idarray; + const values_inner = await dsa5helpers.getAttrsAsync(attrs) + let rs = 0; + let rs_be_mod = 0; + let be_gs_mod = 0; + let be_ini_mod = 0; + let belastungsgewoehnung_mod = Math.max(0, Number(values_inner.belastungsgewoehnung_mod) || 0) + for (let i = 0; i < elems.length; i++) { + const elem = elems[i] + + if (values_inner[`repeating_armor_${elem}_ruestung_auswahl`] == "1") { + const ruestung_rs = parseInt(values_inner[`repeating_armor_${elem}_ruestung_rs`]) || 0; + const ruestung_preset = parseInt(values_inner[`repeating_armor_${elem}_ruestung_preset`]) || 0; + const ruestung_be_mod = parseInt(values_inner[`repeating_armor_${elem}_ruestung_be_mod`]) || 0; + const ruestung_ini_mod = parseInt(values_inner[`repeating_armor_${elem}_ruestung_ini_mod`]) || 0; + const ruestung_gs_mod = parseInt(values_inner[`repeating_armor_${elem}_ruestung_gs_mod`]) || 0; + const ruestung_rs_mod = parseInt(values_inner[`repeating_armor_${elem}_ruestung_rs_mod`]) || 0; + + const be = [0, 0, 1, 1, 2, 2, 3, 3][ruestung_preset]; + const ini = ruestung_preset % 2; + const gs = ini; + + rs += ruestung_rs + ruestung_rs_mod; + rs_be_mod += be + ruestung_be_mod; + be_gs_mod += gs + ruestung_gs_mod; + be_ini_mod += gs + ruestung_ini_mod; + } + } + console.log("DSA5 - triggered: Change ruestung: " + "rs: " + rs + " rs_be_mod: " + rs_be_mod + " be_gs_mod: " + be_gs_mod + " be_ini_mod: " + be_ini_mod); + + update = { + rs: rs, + rs_be_mod: rs_be_mod - (rs_be_mod > 0 ? belastungsgewoehnung_mod : 0), + gs_be_modifikator: (be_gs_mod - (be_gs_mod > 0 ? belastungsgewoehnung_mod : 0)) * -1, + ini_be_modifikator: (be_ini_mod - (be_ini_mod > 0 ? belastungsgewoehnung_mod : 0)) * -1 + } + + } else { + const values = await dsa5helpers.getAttrsAsync(["rs_modifikator", "rs_grundwert"]) + const rs_modifikator = parseInt(values.rs_modifikator) || 0; + const rs_grundwert = parseInt(values.rs_grundwert) || 0; + const rs = rs_grundwert + rs_modifikator; + + update = { + rs: rs, + rs_grundwert: rs_grundwert, + rs_modifikator: rs_modifikator + } + } + console.log("DSA5 - Armor update done") + return update + } + + const updateWeaponSelection = (eventInfo, attribute, weapontype) => { + if (eventInfo.newValue == 1) { + const id = dsa5helpers.getRowId(eventInfo.sourceAttribute) + let update = { + [attribute]: id + } + + getSectionIDs(weapontype, function(idarray) { + for (let k of idarray) { + if (k != id) update[`repeating_${weapontype}_${k}_${attribute}`] = 0 + } + setAttrs(update) + }) + } else if (eventInfo.newValue === "0" && eventInfo.previousValue === "1") { + setAttrs({ + [attribute]: "-" + }) + } + } + + const recalcRangeWeapon = (ids) => { + let attrs = dsa5Module().dsa5.conditions.map(x => `${x}_gesamt`) + attrs.push(...dsa5Module().dsa5.combatskills.range.map(x => `at_${x}`)) + attrs.push(...dsa5Module().dsa5.combatskills.range.map(x => `${x}_entrueckung_akt`)) + attrs.push(...["fk_waffe", "gesamt_fk_mod", "gesamt_tp_mod", "fk_ladezeit_mod"]) + for (const id of ids) { + attrs.push(...[`repeating_rangeweapon_${id}_fkwaffe_typ`, `repeating_rangeweapon_${id}_fkwaffe_name`, `repeating_rangeweapon_${id}_fkwaffe_tp_anz_wuerfel`, `repeating_rangeweapon_${id}_fkwaffe_tp_wert`, `repeating_rangeweapon_${id}_fkwaffe_mun`, `repeating_rangeweapon_${id}_fkwaffe_ladezeit`, `repeating_rangeweapon_${id}_fkwaffe_rw`, `repeating_rangeweapon_${id}_fkwaffe_rw`, `repeating_rangeweapon_${id}_fkwaffe_tp_mod`, `repeating_rangeweapon_${id}_fkwaffe_fk_mod`, `repeating_rangeweapon_${id}_fkwaffe_tp_wuerfel`]) + } + + //TODO get data of selected weapon + getAttrs(attrs, function(values) { + let update = {} + + const id = values['fk_waffe'] + + if (!values[`repeating_rangeweapon_${id}_fkwaffe_typ`]) { + update = { + fk_roll: 0, + fk_tp_dice_roll: 0, + fk_tp_zusatz_roll: 0, + fk_reichweite: "-", + fk_ladezeit: 0, + fk_tp_dice_select: 0, + fk_name: "-", + fk_rw: "" + } + } else { + + let fkwaffe_typ = values[`repeating_rangeweapon_${id}_fkwaffe_typ`]; + let fkwaffe_tp_anz_wuerfel = parseInt(values[`repeating_rangeweapon_${id}_fkwaffe_tp_anz_wuerfel`]) || 1; + let fkwaffe_tp_wert = parseInt(values[`repeating_rangeweapon_${id}_fkwaffe_tp_wert`]) || 0; + //let fkwaffe_mun = parseInt(values[`repeating_rangeweapon_${id}_fkwaffe_mun`]) || 0; + let fkwaffe_ladezeit = parseInt(values[`repeating_rangeweapon_${id}_fkwaffe_ladezeit`]) || 0; + let fkwaffe_rw = values[`repeating_rangeweapon_${id}_fkwaffe_rw`]; + //let fkwaffe_tp_mod = parseInt(values[`repeating_rangeweapon_${id}_fkwaffe_tp_mod`]) || 0; + let fkwaffe_fk_mod = parseInt(values[`repeating_rangeweapon_${id}_fkwaffe_fk_mod`]) || 0; + let fk_tp_dice_select = values[`repeating_rangeweapon_${id}_fkwaffe_tp_wuerfel`]; + + let fk = 0; + let entrueckung_modifier = 0; + + if (dsa5Module().dsa5.combatskills.range.includes(fkwaffe_typ)) { + fk = parseInt(values[`at_${fkwaffe_typ}`]); + entrueckung_modifier = getEntruecktModifier(values[`${fkwaffe_typ}_entrueckung_akt`], parseInt(values.entrueckung_gesamt)); + } + let red = dsa5Module().dsa5.conditions.reduce((x, y) => { return x + parseInt(values[`${y}_gesamt`]) }, 0) + let status_modifier = ((-1 * red) + entrueckung_modifier); + if (status_modifier < -5) { status_modifier = -5; }; + //let gesamt_fk_mod = parseInt(values.gesamt_fk_mod) || 0; + //let gesamt_tp_mod = parseInt(values.gesamt_tp_mod) || 0; + let fk_roll = fk + fkwaffe_fk_mod + status_modifier; + let fk_tp_dice_roll = fkwaffe_tp_anz_wuerfel; + let fk_tp_zusatz_roll = fkwaffe_tp_wert; + let fk_reichweite = fkwaffe_rw; + let fk_ladezeit = fkwaffe_ladezeit + parseInt(values.fk_ladezeit_mod); + console.log("Updating", values[`repeating_rangeweapon_${id}_fkwaffe_name`]) + update = { + fk_roll: fk_roll, + fk_tp_dice_roll: fk_tp_dice_roll, + fk_tp_zusatz_roll: fk_tp_zusatz_roll, + fk_reichweite: fk_reichweite, + fk_ladezeit: fk_ladezeit, + fk_tp_dice_select: fk_tp_dice_select, + fk_rw: values[`repeating_rangeweapon_${id}_fkwaffe_rw`], + fk_name: values[`repeating_rangeweapon_${id}_fkwaffe_name`] + } + } + setAttrs(update); + }); + } + + const calcMainHand = (values, nkwaffe) => { + //if (!nkwaffe) return + + const waffe_typ = values[`repeating_meleeweapon_${nkwaffe}_waffe_typ`] || 'raufen'; + //let waffe_leiteigenschaft = values[`waffe_leiteigenschaft_${nk_waffe}`]; + //let waffe_leiteigenschaft_input = parseInt(values[`waffe_leiteigenschaft_input_${nk_waffe}`]) || 0; + const waffe_tp_bonus = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_tp_bonus`]) || 0; + const waffe_tp_anz_wuerfel = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_tp_anz_wuerfel`]) || 1; + const waffe_tp_wert = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_tp_wert`]) || 0; + const waffe_at = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_at`]) || 0; + const waffe_pa = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_pa`]) || 0; + const waffe_tp_mod = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_tp_mod`]) || 0; + const waffe_at_mod = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_at_mod`]) || 0; + const waffe_pa_mod = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_pa_mod`]) || 0; + const nk_tp_dice_select = values[`repeating_meleeweapon_${nkwaffe}_waffe_tp_wuerfel`] || "d6"; + + const at_situation_mod = parseInt(values.at_situation_mod) || 0; + const pa_situation_mod = parseInt(values.pa_situation_mod) || 0; + const tp_situation_mod = parseInt(values.tp_situation_mod) || 0; + + const vw_grundwert = parseInt(values.vw_grundwert) || 0; + const vw_modifikator = parseInt(values.vw_modifikator) || 0; + + let at = 0; + let pa = 0; + let entrueckung_modifier = 0; + + switch (waffe_typ) { + case "0": + break + case "kettenwaffen": + case "lanzen": + at = parseInt(values[`at_${waffe_typ}`]); + entrueckung_modifier = getEntruecktModifier(values[`${waffe_typ}_entrueckung_akt`], parseInt(values.entrueckung_gesamt)); + break; + default: + at = parseInt(values[`at_${waffe_typ}`]); + pa = parseInt(values[`pa_${waffe_typ}`]); + entrueckung_modifier = getEntruecktModifier(values[`${waffe_typ}_entrueckung_akt`], parseInt(values.entrueckung_gesamt)); + }; + const isShield = waffe_typ == "schilde" + const rw = Number(values[`repeating_meleeweapon_${nkwaffe}_waffe_rw`]) || 1 + if (isShield) { + at += _getEingeengtMod(Number(values["eingeengt"]), rw, false, true) + pa += _getEingeengtMod(Number(values["eingeengt"]), rw, true, true) + } else { + const eingeengtModAt = _getEingeengtMod(Number(values["eingeengt"]), rw, true, false) + at += eingeengtModAt + pa += eingeengtModAt + } + + let status_modifier = Math.max(-5, ((-1 * dsa5Module().dsa5.conditions.reduce((x, y) => { return x + parseInt(values[`${y}_gesamt`]) }, 0)) + entrueckung_modifier)); + + let beidhand_kampf_mod = Math.min(0, parseInt(values.beidhand_kampf) == 1 ? parseInt(values.beidhand_kampf_mod) : 0) + + let parade_malus = (-3 * (parseInt(values.parade_malus_select) || 0) + + (parseInt(values.parade_malus_select) || 0) * + (parseInt(values.parade_zweite_mod) || 0)); + let at_roll = at + waffe_at + waffe_at_mod + status_modifier + at_situation_mod + beidhand_kampf_mod + + (parseInt(values.at_sf_mod) || 0) + + (parseInt(values.at_effekt_mod) || 0) + let pa_roll = pa + waffe_pa + waffe_pa_mod + status_modifier + pa_situation_mod + parade_malus + + (parseInt(values.pa_sf_mod) || 0) + + (parseInt(values.pa_effekt_mod) || 0) + + beidhand_kampf_mod + + (parseInt(values.pa_schildpassiv_bonus) || 0); + let ausweichen_malus = (-3 * (parseInt(values.parade_malus_select) || 0) + + (parseInt(values.parade_malus_select) || 0) * (parseInt(values.ausweichen_zweite_mod) || 0)); + let aw_roll = parseInt(values.aw_gesamt) + status_modifier + pa_situation_mod + ausweichen_malus + + (parseInt(values.aw_sf_mod) || 0) + + (parseInt(values.aw_effekt_mod) || 0); + let passierschlag_roll = -4 + at + waffe_at + waffe_at_mod + status_modifier + at_situation_mod + + (parseInt(values.at_effekt_mod) || 0) + beidhand_kampf_mod; + let tp_dice_roll = waffe_tp_anz_wuerfel; + let tp_zusatz_roll = waffe_tp_wert + waffe_tp_bonus + waffe_tp_mod + + (parseInt(values.tp_sf_mod) || 0) + (parseInt(values.tp_effekt_mod) || 0) + tp_situation_mod; + let passierschlag_tp_zusatz_roll = waffe_tp_wert + waffe_tp_bonus + waffe_tp_mod + tp_situation_mod + + (parseInt(values.tp_effekt_mod) || 0) + let vw_roll = vw_grundwert + vw_modifikator + status_modifier + pa_situation_mod + parade_malus + + (parseInt(values.pa_sf_mod) || 0) + + (parseInt(values.pa_effekt_mod) || 0) + + return { + at_roll: at_roll, + pa_roll: pa_roll, + vw_roll: vw_roll, + + aw_roll: aw_roll, + passierschlag_roll: passierschlag_roll, + tp_dice_roll: tp_dice_roll, + tp_zusatz_roll: tp_zusatz_roll, + passierschlag_tp_zusatz_roll: passierschlag_tp_zusatz_roll, + kampfstatus_modifier: status_modifier, + parade_malus: parade_malus, + ausweichen_malus: ausweichen_malus, + nk_tp_dice_select: nk_tp_dice_select, + nk_name: values[`repeating_meleeweapon_${nkwaffe}_waffe_name`] || getTranslationByKey('raufen') + } + } + + const _getEingeengtMod = (eingeengt, weaponsize, parry = false, shield = false) => { + if (eingeengt == 1) { + if (shield) { + if (parry) { + return { + 1: -2, + 2: -3, + 3: -4 + }[weaponsize] + } else { + return { + 1: -2, + 2: -4, + 3: -6 + }[weaponsize] + } + } + + return { + 1: 0, + 2: -4, + 3: -8 + }[weaponsize] + } + return 0 + } + + const calcOffHand = (values, nkwaffe) => { + let schild_typ = values[`repeating_meleeweapon_${nkwaffe}_waffe_typ`] || 'raufen'; + //let schild_leiteigenschaft = values.schild_leiteigenschaft_1; + //let schild_leiteigenschaft_input = parseInt(values.schild_leiteigenschaft_input_1) || 0; + let schild_tp_bonus = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_tp_bonus`]) || 0; + let schild_tp_anz_wuerfel = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_tp_anz_wuerfel`]) || 1; + let schild_tp_wert = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_tp_wert`]) || 0; + let schild_at = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_at`]) || 0; + let schild_pa = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_pa`]) || 0; + let schild_tp_mod = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_tp_mod`]) || 0; + let schild_at_mod = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_at_mod`]) || 0; + let schild_pa_mod = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_pa_mod`]) || 0; + let nh_tp_dice_select = values[`repeating_meleeweapon_${nkwaffe}_waffe_tp_wuerfel`] || "d6"; + + let at_situation_mod = parseInt(values.at_situation_mod) || 0; + let pa_situation_mod = parseInt(values.pa_situation_mod) || 0; + let tp_situation_mod = parseInt(values.tp_situation_mod) || 0; + + let at = 0; + let pa = 0; + let entrueckung_modifier = 0; + + switch (schild_typ) { + case "kettenwaffen": + case "lanzen": + at = parseInt(values[`at_${schild_typ}`]); + entrueckung_modifier = getEntruecktModifier(values[`${schild_typ}_entrueckung_akt`], parseInt(values.entrueckung_gesamt)); + break; + case "0": + break; + default: + at = parseInt(values[`at_${schild_typ}`]); + pa = parseInt(values[`pa_${schild_typ}`]); + entrueckung_modifier = getEntruecktModifier(values[`${schild_typ}_entrueckung_akt`], parseInt(values.entrueckung_gesamt)); + }; + + const isShield = schild_typ == "schilde" + const rw = Number(values[`repeating_meleeweapon_${nkwaffe}_waffe_rw`]) || 1 + if (isShield) { + at += _getEingeengtMod(Number(values["eingeengt"]), rw, false, true) + pa += _getEingeengtMod(Number(values["eingeengt"]), rw, true, true) + } else { + const eingeengtModAt = _getEingeengtMod(Number(values["eingeengt"]), rw, true, false) + at += eingeengtModAt + pa += eingeengtModAt + } + + + let status_modifier = Math.max(-5, ((-1 * dsa5Module().dsa5.conditions.reduce((x, y) => { return x + parseInt(values[`${y}_gesamt`]) }, 0)) + entrueckung_modifier)); + + let beidhand_kampf_mod = Math.min(0, parseInt(values.beidhand_kampf) == 1 ? parseInt(values.beidhand_kampf_mod) : 0) + + let falsche_hand_mod = Math.min(0, parseInt(values.falsche_hand_mod)) + let parade_malus = (-3 * parseInt(values.parade_malus_select || 0)) + + (parseInt(values.parade_malus_select || 0) * parseInt(values.parade_zweite_mod)); + let at_nh_roll = at + schild_at + schild_at_mod + status_modifier + at_situation_mod + + (parseInt(values.at_sf_mod) || 0) + (parseInt(values.at_effekt_mod) || 0) + + beidhand_kampf_mod + falsche_hand_mod + let pa_schildpassiv_bonus = 0; + let pa_nh_roll = pa + schild_pa + schild_pa_mod + status_modifier + pa_situation_mod + parade_malus + + (parseInt(values.pa_sf_mod) || 0) + + (parseInt(values.pa_effekt_mod) || 0) + + beidhand_kampf_mod + falsche_hand_mod; + + if (isShield) { + pa_schildpassiv_bonus = schild_pa; + pa_nh_roll = pa + (schild_pa * 2) + schild_pa_mod + status_modifier + pa_situation_mod + parade_malus + + (parseInt(values.pa_sf_mod) || 0) + + (parseInt(values.pa_effekt_mod) || 0); + } + + let tp_nh_dice_roll = schild_tp_anz_wuerfel; + let tp_nh_zusatz_roll = schild_tp_wert + schild_tp_bonus + schild_tp_mod + tp_situation_mod + + (parseInt(values.tp_sf_mod) || 0) + + (parseInt(values.tp_effekt_mod) || 0) + return { + at_nh_roll: at_nh_roll, + pa_nh_roll: pa_nh_roll, + tp_nh_dice_roll: tp_nh_dice_roll, + tp_nh_zusatz_roll: tp_nh_zusatz_roll, + pa_schildpassiv_bonus: pa_schildpassiv_bonus, + nh_tp_dice_select: nh_tp_dice_select, + nh_name: values[`repeating_meleeweapon_${nkwaffe}_waffe_name`] || getTranslationByKey('raufen') + } + } + + const recalcWeapon = (ids) => { + let attrs = dsa5Module().dsa5.conditions.map(x => `${x}_gesamt`) + attrs.push(...dsa5Module().dsa5.combatskills.melee.map(x => `at_${x}`)) + attrs.push(...dsa5Module().dsa5.combatskills.melee.map(x => `pa_${x}`)) + attrs.push(...dsa5Module().dsa5.combatskills.melee.map(x => `${x}_entrueckung_akt`)) + attrs.push(...["nk_waffe", "nh_waffe", "falsche_hand_mod", "at_effekt_mod", "pa_effekt_mod", "aw_effekt_mod", "at_sf_mod", + "pa_sf_mod", "aw_sf_mod", "tp_sf_mod", "tp_effekt_mod", "at_situation_mod", "pa_situation_mod", "tp_situation_mod", + "parade_malus_select", "parade_zweite_mod", "ausweichen_zweite_mod", "aw_gesamt", "beidhand_kampf", "beidhand_kampf_mod", + "pa_schildpassiv_bonus", "vw_grundwert", "vw_modifikator", "eingeengt" + ]) + for (const id of ids) { + attrs.push(...["waffe_rw", "waffe_name", `waffe_typ`, `waffe_leiteigenschaft`, "waffe_nebenhand", `waffe_leiteigenschaft_input`, `waffe_tp_bonus`, `waffe_tp_anz_wuerfel`, `waffe_tp_wert`, `waffe_at`, `waffe_pa`, `waffe_tp_mod`, `waffe_at_mod`, `waffe_pa_mod`, `waffe_tp_wuerfel`].map(x => `repeating_meleeweapon_${id}_${x}`)) + } + //TODO get only data of selected weapon + getAttrs(attrs, function(values) { + let nk_waffe = values.nk_waffe; + let nh_waffe = values.nh_waffe; + let update = {} + update = calcMainHand(values, nk_waffe) + update = {...update, ...calcOffHand(values, nh_waffe) } + setAttrs(update, console.log("DSA5 - updated weapon")); + }); + } + + const updateTalentModifier = async(talents) => { + const attrs = dsa5Module().dsa5.conditions.map(x => `${x}_gesamt`) + attrs.push("zusatz_gesamt") + for (const skill of talents) { + attrs.push(...[`${skill}_sf_mod`, `${skill}_effekt_mod`, `${skill}_be_akt`, `${skill}_betaeubung_akt`, `${skill}_furcht_akt`, `${skill}_paralyse_akt`, `${skill}_schmerz_akt`, `${skill}_trance_akt`, `${skill}_verwirrung_akt`, `${skill}_entrueckung_akt`, `${skill}_zusatz_akt`]) + } + + const values = await dsa5helpers.getAttrsAsync(attrs) + const update = {} + const belastung_gesamt = parseInt(values.belastung_gesamt) || 0; + const betaeubung_gesamt = parseInt(values.betaeubung_gesamt) || 0; + const entrueckung_gesamt = parseInt(values.entrueckung_gesamt) || 0; + const furcht_gesamt = parseInt(values.furcht_gesamt) || 0; + const paralyse_gesamt = parseInt(values.paralyse_gesamt) || 0; + const schmerz_gesamt = parseInt(values.schmerz_gesamt) || 0; + const trance_gesamt = parseInt(values.trance_gesamt) || 0; + const verwirrung_gesamt = parseInt(values.verwirrung_gesamt) || 0; + const zusatz_gesamt = parseInt(values.zusatz_gesamt) || 0; + for (const skill of talents) { + const sf_mod = parseInt(values[`${skill}_sf_mod`]) || 0; + const effekt_mod = parseInt(values[`${skill}_effekt_mod`]) || 0; + const belastung_akt = parseInt(values[`${skill}_be_akt`]) || 0; + const betaeubung_akt = parseInt(values[`${skill}_betaeubung_akt`]) || 0; + const furcht_akt = parseInt(values[`${skill}_furcht_akt`]) || 0; + const paralyse_akt = parseInt(values[`${skill}_paralyse_akt`]) || 0; + const schmerz_akt = parseInt(values[`${skill}_schmerz_akt`]) || 0; + const trance_akt = parseInt(values[`${skill}_trance_akt`]) || 0; + const verwirrung_akt = parseInt(values[`${skill}_verwirrung_akt`]) || 0; + const entrueckung_akt = values[`${skill}_entrueckung_akt`]; + const zusatz_akt = parseInt(values[`${skill}_zusatz_akt`]) || 0; + const entrueckung_modifier = getEntruecktModifier(entrueckung_akt, entrueckung_gesamt); + + const status_modifier = Math.max(-5, (-1 * ((belastung_gesamt * belastung_akt) + (betaeubung_gesamt * betaeubung_akt) + (furcht_gesamt * furcht_akt) + (paralyse_gesamt * paralyse_akt) + (schmerz_gesamt * schmerz_akt) + (trance_gesamt * trance_akt) + (verwirrung_gesamt * verwirrung_akt) + (zusatz_gesamt * zusatz_akt))) + entrueckung_modifier); + const gesamt_mod = status_modifier + sf_mod + effekt_mod + console.log(`DSA5 - triggered: updateTalentModifier: Talent: ${skill} ## modifier ${status_modifier} gesamt_mod ${gesamt_mod}`); + update[`${skill}_gesamt_mod`] = gesamt_mod; + } + return update + } + + const changeCondition = async(conditions) => { + let update = {} + let attrs = ["tragekraft_belastung"] + conditions.forEach(condition => { + attrs.push(`${condition}_basis`, `${condition}_mod`, `${condition}_gear`) + }) + const values = await dsa5helpers.getAttrsAsync(attrs) + conditions.forEach(condition => { + const basis = parseInt(values[`${condition}_basis`]) || 0; + const mod = parseInt(values[`${condition}_mod`]) || 0; + let gear = parseInt(values[`${condition}_gear`]) || 0; + if (condition == "belastung") gear += parseInt(values.tragekraft_belastung) || 0 + console.log(`Update condition ${condition} ${basis},${mod},${gear}`) + update[`${condition}_gesamt`] = Math.max(0, Math.min(4, basis + mod + gear)) + }) + return update + } + + const change_modifierV2 = async() => { + const specIds = await dsa5helpers.getSectionIDsAsync("sonderfertigkeit") + const efIds = await dsa5helpers.getSectionIDsAsync("effekt") + + let attrs = [] + for (const id of specIds) { + attrs.push( + `repeating_sonderfertigkeit_${id}_sonderfertigkeit_aktiviert`, + ...dsa5Module().dsa5.modifiers.map(x => `repeating_sonderfertigkeit_${id}_sonderfertigkeit_auswahl${x}`), + ...dsa5Module().dsa5.modifiers.map(x => `repeating_sonderfertigkeit_${id}_sonderfertigkeit_mod${x}`) + ) + } + for (const id of efIds) { + attrs.push( + `repeating_effekt_${id}_sonderfertigkeit_aktiviert`, + ...dsa5Module().dsa5.modifiers.map(x => `repeating_effekt_${id}_sonderfertigkeit_auswahl${x}`), + ...dsa5Module().dsa5.modifiers.map(x => `repeating_effekt_${id}_sonderfertigkeit_mod${x}`) + ) + } + const values = await dsa5helpers.getAttrsAsync(attrs) + let data = { + "add_modifikator": 0, + "mu_mod": 0, + "kl_mod": 0, + "in_mod": 0, + "ch_mod": 0, + "ff_mod": 0, + "ge_mod": 0, + "ko_mod": 0, + "kk_mod": 0, + "le_modifikator": 0, + "ae_modifikator": 0, + "ke_modifikator": 0, + "sk_modifikator": 0, + "zk_modifikator": 0, + "ini_modifikator": 0, + "aw_modifikator": 0, + "gs_modifikator": 0, + "schips_modifikator": 0, + "le_regeneration_mod": 0, + "ae_regeneration_mod": 0, + "ke_regeneration_mod": 0, + "belastungsgewoehnung_mod": 0, + "tragekraft_mod": 0, + "at_sf_mod": 0, + "pa_sf_mod": 0, + "aw_sf_mod": 0, + "tp_sf_mod": 0, + "fk_sf_mod": 0, + "nh_at_sf_mod": 0, + "nh_pa_sf_mod": 0, + "nh_tp_sf_mod": 0, + "parade_zweite_mod": 0, + "ausweichen_zweite_mod": 0, + "beidhand_kampf_mod": -2, + "falsche_hand_mod": -4, + "belastung_gear": 0, + "betaebung_gear": 0, + "entrueckung_gear": 0, + "furcht_gear": 0, + "paralyse_gear": 0, + "schmerz_gear": 0, + "trance_gear": 0, + "verwirrung_gear": 0, + "erregung_gear": 0, + "fliegen_sf_mod": 0, + "gaukeleien_sf_mod": 0, + "klettern_sf_mod": 0, + "koerperbeherrschung_sf_mod": 0, + "kraftakt_sf_mod": 0, + "reiten_sf_mod": 0, + "schwimmen_sf_mod": 0, + "selbstbeherrschung_sf_mod": 0, + "singen_sf_mod": 0, + "sinnesschaerfe_sf_mod": 0, + "tanzen_sf_mod": 0, + "taschendiebstahl_sf_mod": 0, + "verbergen_sf_mod": 0, + "zechen_sf_mod": 0, + "bekehren_sf_mod": 0, + "betoeren_sf_mod": 0, + "einschuechtern_sf_mod": 0, + "etikette_sf_mod": 0, + "gassenwissen_sf_mod": 0, + "menschenkenntnis_sf_mod": 0, + "ueberreden_sf_mod": 0, + "verkleiden_sf_mod": 0, + "willenskraft_sf_mod": 0, + "faehrtensuchen_sf_mod": 0, + "fesseln_sf_mod": 0, + "fischen_sf_mod": 0, + "orientierung_sf_mod": 0, + "pflanzenkunde_sf_mod": 0, + "tierkunde_sf_mod": 0, + "wildnisleben_sf_mod": 0, + "glueckspiel_sf_mod": 0, + "geographie_sf_mod": 0, + "geschichtswissen_sf_mod": 0, + "goetterkulte_sf_mod": 0, + "kriegskunst_sf_mod": 0, + "magiekunde_sf_mod": 0, + "mechanik_sf_mod": 0, + "rechnen_sf_mod": 0, + "rechtskunde_sf_mod": 0, + "sagenlegenden_sf_mod": 0, + "sphaerenkunde_sf_mod": 0, + "sternkunde_sf_mod": 0, + "alchemie_sf_mod": 0, + "boote_sf_mod": 0, + "fahrzeuge_sf_mod": 0, + "handel_sf_mod": 0, + "hkgift_sf_mod": 0, + "hkkrankheiten_sf_mod": 0, + "hkseele_sf_mod": 0, + "hkwunden_sf_mod": 0, + "holzbearbeitung_sf_mod": 0, + "lebensmittelbearbeitung_sf_mod": 0, + "lederbearbeitung_sf_mod": 0, + "malenzeichnen_sf_mod": 0, + "metallbearbeitung_sf_mod": 0, + "musizieren_sf_mod": 0, + "schloesserknacken_sf_mod": 0, + "steinbearbeitung_sf_mod": 0, + "stoffbearbeitung_sf_mod": 0, + "magie_sf_mod": 0, + "glaube_sf_mod": 0, + "fliegen_fw": 0, + "gaukeleien_fw": 0, + "klettern_fw": 0, + "koerperbeherrschung_fw": 0, + "kraftakt_fw": 0, + "reiten_fw": 0, + "schwimmen_fw": 0, + "selbstbeherrschung_fw": 0, + "singen_fw": 0, + "sinnesschaerfe_fw": 0, + "tanzen_fw": 0, + "taschendiebstahl_fw": 0, + "verbergen_fw": 0, + "zechen_fw": 0, + "bekehren_fw": 0, + "betoeren_fw": 0, + "einschuechtern_fw": 0, + "etikette_fw": 0, + "gassenwissen_fw": 0, + "menschenkenntnis_fw": 0, + "ueberreden_fw": 0, + "verkleiden_fw": 0, + "willenskraft_fw": 0, + "faehrtensuchen_fw": 0, + "fesseln_fw": 0, + "fischen_fw": 0, + "orientierung_fw": 0, + "pflanzenkunde_fw": 0, + "tierkunde_fw": 0, + "wildnisleben_fw": 0, + "glueckspiel_fw": 0, + "geographie_fw": 0, + "geschichtswissen_fw": 0, + "goetterkulte_fw": 0, + "kriegskunst_fw": 0, + "magiekunde_fw": 0, + "mechanik_fw": 0, + "rechnen_fw": 0, + "rechtskunde_fw": 0, + "sagenlegenden_fw": 0, + "sphaerenkunde_fw": 0, + "sternkunde_fw": 0, + "alchemie_fw": 0, + "boote_fw": 0, + "fahrzeuge_fw": 0, + "handel_fw": 0, + "hkgift_fw": 0, + "hkkrankheiten_fw": 0, + "hkseele_fw": 0, + "hkwunden_fw": 0, + "holzbearbeitung_fw": 0, + "lebensmittelbearbeitung_fw": 0, + "lederbearbeitung_fw": 0, + "malenzeichnen_fw": 0, + "metallbearbeitung_fw": 0, + "musizieren_fw": 0, + "schloesserknacken_fw": 0, + "steinbearbeitung_fw": 0, + "stoffbearbeitung_fw": 0 + } + dsa5Module().dsa5.modifiers.forEach(x => { + for (const id of specIds) { + if (Number(values[`repeating_sonderfertigkeit_${id}_sonderfertigkeit_aktiviert`]) == 1) { + if (_getAttrfromSelection(values[`repeating_sonderfertigkeit_${id}_sonderfertigkeit_auswahl${x}`]) in data) + data[_getAttrfromSelection(values[`repeating_sonderfertigkeit_${id}_sonderfertigkeit_auswahl${x}`])] += Number(values[`repeating_sonderfertigkeit_${id}_sonderfertigkeit_mod${x}`]) + else + console.warn(`change modifier unknown ${values[`repeating_sonderfertigkeit_${id}_sonderfertigkeit_auswahl${x}`]}`) + + } + } + for (const id of efIds) { + if (Number(values[`repeating_effekt_${id}_sonderfertigkeit_aktiviert`]) == 1) { + if (_getAttrfromSelection(values[`repeating_effekt_${id}_effekt_auswahl${x}`]) in data) + data[_getAttrfromSelection(values[`repeating_effekt_${id}_effekt_auswahl${x}`])] += Number(values[`repeating_effekt_${id}_sonderfertigkeit_mod${x}`]) + else + console.warn(`change modifier unknown ${values[`repeating_effekt_${id}_effekt_auswahl${x}`]}`) + + } + } + }) + //console.log(data) + setAttrs(data); + } + + const _getAttrfromSelection = (selection) => { + selection = selection.replace(/fw_mod$/, "fw") + switch (selection) { + case "mu_mod": + case "kl_mod": + case "in_mod": + case "ch_mod": + case "ff_mod": + case "ge_mod": + case "ko_mod": + case "kk_mod": + return `${dsa5Module().dsa5.attributes[selection.replace(/_mod$/, "").toUpperCase()]}_modifier` + case "ae_regeneration_mod": + case "ke_regeneration_mod": + case "le_regeneration_mod": + return selection.replace(/_mod$/, "") + } + return selection + } + + //DEPRECATED + //TODO cleanup _vorher attributes + //TODO test as much as possible + /*const change_modifier = function(selection, modifier_value, oldvalue) { + + console.log(`DSA5 - Change modifier Selection: ${selection} ${oldvalue} ${modifier_value}`); + + selection = selection.replace(/fw_mod$/, "fw") + const update = {} + switch (selection) { + case "mu_mod": + case "kl_mod": + case "in_mod": + case "ch_mod": + case "ff_mod": + case "ge_mod": + case "ko_mod": + case "kk_mod": + { + const attr = `${dsa5Module().dsa5.attributes[selection.replace(/_mod$/, "").toUpperCase()]}_modifier`; + getAttrs([attr], function(target_value) { + update[attr] = parseInt(target_value[attr]) - oldvalue + modifier_value; + setAttrs(update); + }); + } + break; + + case "gs_mod": + getAttrs(["gs_modifikator"], function(target_value) { + setAttrs({ + gs_modifikator: parseInt(target_value.gs_modifikator) - oldvalue + modifier_value + }); + }); + break; + + case "ae_regeneration_mod": + case "ke_regeneration_mod": + case "le_regeneration_mod": + { + const attr = selection.replace(/_mod$/, "") + getAttrs([attr], function(target_value) { + update[attr] = parseInt(target_value[attr]) - oldvalue + modifier_value + setAttrs(update); + }); + } + break; + + case "kt_mod": + getAttrs(["fk_effekt_mod"], function(target_value) { + setAttrs({ + fk_effekt_mod: parseInt(target_value.fk_effekt_mod) - oldvalue + modifier_value + }); + }); + break; + + default: + getAttrs([selection], function(target_value) { + update[selection] = parseInt(target_value[selection]) - oldvalue + modifier_value + setAttrs(update); + }); + break; + } + }*/ + + const meleeweaponLeitwert = async () => { + const idarray = await dsa5helpers.getSectionIDsAsync("meleeweapon") + let update = {} + if (idarray.length > 0) { + const attrs = [] + for (let i = 0; i < idarray.length; i++) { + const elem = idarray[i] + attrs.push(`repeating_meleeweapon_${elem}_waffe_leiteigenschaft`, `repeating_meleeweapon_${elem}_waffe_leiteigenschaft_input`, "koerperkraft_gesamt", "gewandheit_gesamt") + } + const values = await dsa5helpers.getAttrsAsync(attrs) + for (let i = 0; i < idarray.length; i++) { + const elem = idarray[i] + const tp_leitwert = dsa5helpers.getLeitwert(values[`repeating_meleeweapon_${elem}_waffe_leiteigenschaft`], values, values[`repeating_meleeweapon_${elem}_waffe_leiteigenschaft_input`]); + update[`repeating_meleeweapon_${elem}_waffe_tp_bonus`] = tp_leitwert + } + } + + return update + } + + const calcCombatskill = async (skills) => { + const attrs = ["mut_gesamt", "gewandheit_gesamt", "koerperkraft_gesamt", "ktw_change_flag"] + for (const skill of skills) { + attrs.push(skill, `ktw_${skill}`) + } + const values = await dsa5helpers.getAttrsAsync(attrs) + const mut_gesamt = parseInt(values.mut_gesamt); + const ktw_change_flag = parseInt(values.ktw_change_flag) * -1; + let update = { ktw_change_flag } + for (const skill of skills) { + let leiteigenschaft_selector = values[skill]; + let ktw = parseInt(values[`ktw_${skill}`]); + switch (leiteigenschaft_selector) { + case "KK": + leiteigenschaft = parseInt(values.koerperkraft_gesamt); + break; + case "GE": + leiteigenschaft = parseInt(values.gewandheit_gesamt); + break; + case "GE/KK": + leiteigenschaft = Math.max(parseInt(values.gewandheit_gesamt), parseInt(values.koerperkraft_gesamt)); + break + default: + leiteigenschaft = 0; + break; + } + let at = ktw + Math.floor((mut_gesamt - 8) / 3); + let pa = Math.round(ktw / 2) + Math.floor((leiteigenschaft - 8) / 3); + + update[`at_${skill}`] = at + switch (skill) { + case "faecher": + update[`pa_${skill}`] = pa -1 + break + case "kettenwaffen": + case "lanzen": + break; + default: + update[`pa_${skill}`] = pa; + } + } + + return update + } + + const prepareRangeCombatskills = async (skills) => { + let attrs = ["fingerfertigkeit_gesamt", "ktw_change_flag"] + for (let skill of skills) { + attrs.push(skill, `ktw_${skill}`) + } + const values = await dsa5helpers.getAttrsAsync(attrs) + const ktw_change_flag = parseInt(values.ktw_change_flag) * -1; + let update = { ktw_change_flag: ktw_change_flag } + for (let skill of skills) { + const ktw = parseInt(values[`ktw_${skill}`]); + const leiteigenschaft = parseInt(values.fingerfertigkeit_gesamt); + const at = ktw + Math.floor((leiteigenschaft - 8) / 3); + update[`at_${skill}`] = at + } + return update + } + + const getEntruecktModifier = function (selection, value) { + const bonus = Math.min(3, Math.max(0, value - 1)); + const malus = Math.min(4, value * -1); + + switch (selection) { + case "bonus": + return bonus; + case "malus": + return malus; + default: + return 0; + } + } + + const calcSchmerz = async () => { + const values = await dsa5helpers.getAttrsAsync(["calc_schmerz", "le_max", "le", "toggle_npc"]) + let update = {} + if (values.calc_schmerz == "on") { + const le_max = Number(values.le_max) + const le = Number(values.le) + const hasDefaultPain = values.toggle_npc != "npc" || le_max > 20 + let pain = 0 + if (hasDefaultPain) { + pain = Math.floor((1 - le / le_max) * 4) + if (le <= 5) pain = 4 + } else { + pain = Math.floor(5 - 5 * le / le_max) + } + update["schmerz_basis"] = pain + } + return update + } + + const calcSpeed = async () => { + const values = await dsa5helpers.getAttrsAsync(["gs_grundwert", "gs_modifikator", "belastung_gesamt", "gs_be_modifikator"]) + let gs_modifikator = parseInt(values.gs_modifikator) || 0; + let gs_grundwert = parseInt(values.gs_grundwert) || 0; + let gs_be_modifikator = parseInt(values.gs_be_modifikator) || 0; + let belastung_gesamt = parseInt(values.belastung_gesamt) || 0; + let gs_gesamt = gs_grundwert + gs_modifikator + gs_be_modifikator - belastung_gesamt; + + return { + gs_gesamt, + gs_grundwert, + gs_modifikator + } + } + + const apUpdate = async () => { + const values = await dsa5helpers.getAttrsAsync(["ap_ausgegeben", "ap_gesamt"]) + const ap_gesamt = Number(values.ap_gesamt) || 0 + const ap_verfuegbar = ap_gesamt - (Number(values.ap_ausgegeben) || 0) + let erfahrungsgrad = 900 + const grades = [2100, 1700, 1400, 1200, 1100, 1000] + for (const grade of grades) { + if (ap_gesamt >= grade) { + erfahrungsgrad = grade + break + } + } + return { erfahrungsgrad, ap_verfuegbar } + } + + const attributeChange = async (attributes) => { + let attrs = [] + for (const attr of attributes) { + attrs.push(attr, `${attr}_modifier`) + } + const values = await dsa5helpers.getAttrsAsync(attrs) + let update = {} + + for (const attr of attributes) { + update[`${attr}_gesamt`] = parseInt(values[attr]) + parseInt(values[`${attr}_modifier`]) + } + return update + } + + const calcSchips = async () => { + const values = await dsa5helpers.getAttrsAsync(["schips_grundwert", "schips_modifikator", "schips"]) + let schips_modifikator = parseInt(values.schips_modifikator) || 0; + let schips_grundwert = parseInt(values.schips_grundwert); + let schips_max = schips_grundwert + schips_modifikator; + let schips = parseInt(values.schips); + + return { + schips_max, + schips_grundwert, + schips_modifikator, + schips + } + } + + const calcToughness = async () => { + const values = await dsa5helpers.getAttrsAsync(["toggle_npc", "konstitution_gesamt", "koerperkraft_gesamt", "zk_grundwert", "zk_modifikator"]) + let toggle_npc = values.toggle_npc; + let zk_modifikator = parseInt(values.zk_modifikator) || 0; + let zk_grundwert = parseInt(values.zk_grundwert) || 0; + let zk_basiswert = zk_grundwert + Math.round((parseInt(values.konstitution_gesamt) + parseInt(values.konstitution_gesamt) + parseInt(values.koerperkraft_gesamt)) / 6); + let zk_gesamt = toggle_npc == 'character' ? zk_basiswert + zk_modifikator : zk_grundwert + zk_modifikator; + + return { + zk_gesamt, + zk_grundwert, + zk_modifikator + } + } + + const calcDefense = async () => { + const values = await dsa5helpers.getAttrsAsync(["vw_grundwert", "vw_modifikator"]) + let vw_modifikator = parseInt(values.vw_modifikator) || 0; + let vw_grundwert = parseInt(values.vw_grundwert) || 0; + let vw_gesamt = vw_grundwert + vw_modifikator; + + setAttrs({ + vw_gesamt, + vw_grundwert, + vw_modifikator + }); + } + + const calcDodge = async () => { + const values = await dsa5helpers.getAttrsAsync(["toggle_npc", "gewandheit_gesamt", "aw_grundwert", "aw_modifikator"]) + let toggle_npc = values.toggle_npc; + let aw_modifikator = parseInt(values.aw_modifikator) || 0; + let aw_grundwert = parseInt(values.aw_grundwert) || 0; + let aw_basiswert = Math.round(parseInt(values.gewandheit_gesamt) / 2); + let aw_gesamt; + if (toggle_npc == 'character') { + aw_gesamt = aw_basiswert + aw_modifikator; + aw_grundwert = aw_basiswert; + } else { + aw_gesamt = aw_grundwert + aw_modifikator; + } + return { + aw_gesamt, + aw_grundwert, + aw_modifikator + } + } + + const calcSoulpower = async () => { + const values = await dsa5helpers.getAttrsAsync(["toggle_npc", "mut_gesamt", "klugheit_gesamt", "intuition_gesamt", "sk_grundwert", "sk_modifikator"]) + let toggle_npc = values.toggle_npc; + let sk_modifikator = parseInt(values.sk_modifikator) || 0; + let sk_grundwert = parseInt(values.sk_grundwert) || 0; + let sk_basiswert = sk_grundwert + Math.round((parseInt(values.mut_gesamt) + parseInt(values.klugheit_gesamt) + parseInt(values.intuition_gesamt)) / 6); + let sk_gesamt = toggle_npc == 'character' ? sk_basiswert + sk_modifikator : sk_grundwert + sk_modifikator; + + return { + sk_gesamt, + sk_grundwert, + sk_modifikator + } + } + + const calcEncumbranceTotal = async () => { + const values = await dsa5helpers.getAttrsAsync(["belastung_basis", "belastung_mod", "rs_be_mod", "rs_be_mod_vorher"]) + let basis = parseInt(values.belastung_basis) || 0; + let mod = parseInt(values.belastung_mod) || 0; + let rs_be_mod = parseInt(values.rs_be_mod) || 0; + let rs_be_mod_vorher = parseInt(values.rs_be_mod_vorher) || 0; + let belastung_basis_neu = basis - rs_be_mod_vorher + rs_be_mod; + let basis_gesamt = Math.min(4, Math.max(0, belastung_basis_neu + mod)); + + console.log("DSA5 - vorher " + rs_be_mod_vorher + " basis " + belastung_basis_neu + " be_mod " + rs_be_mod + " mod " + mod + " gesamt " + basis_gesamt); + + return { + belastung_gesamt: basis_gesamt, + belastung_basis: belastung_basis_neu, + rs_be_mod_vorher: rs_be_mod + } + } + + const calcCarryCapacity = async () => { + const values = await dsa5helpers.getAttrsAsync(["tragekraft_mod", "koerperkraft_gesamt", "traglast", "calc_tragekraft"]) + const tragekraft = Number(values.koerperkraft_gesamt) * 2 + Number(values.tragekraft_mod) + const encumbrance = Math.max(0, Math.ceil((Number(values.traglast) - tragekraft - 4) / 4)) + return { + tragekraft, + tragekraft_belastung: values.calc_tragekraft == "on" ? encumbrance : 0 + } + } + + const calcDerivedAttributes = async () => { + const v = await dsa5helpers.getAttrsAsync(["toggle_npc", "le_grundwert", "le_ausgangswert", "le_modifikator", "le_verlust_perm", "le_max", "le", "wundschwelle", "konstitution_gesamt"]) + if (v.toggle_npc == 'character') { + let le_grundwert = parseInt(v.le_grundwert) || 8; + let le_modifikator = parseInt(v.le_modifikator) || 0; + let le_verlust_perm = parseInt(v.le_verlust_perm) || 0; + let le = parseInt(v.le) || 0; + let konstitution_gesamt = parseInt(v.konstitution_gesamt) || 8; + let le_ausgangswert = le_grundwert + konstitution_gesamt + konstitution_gesamt; + let le_max = le_ausgangswert + le_modifikator - le_verlust_perm; + let wundschwelle = Math.round(konstitution_gesamt / 2); + + return { + le_grundwert: le_grundwert, + le_ausgangswert: le_ausgangswert, + le_modifikator: le_modifikator, + le_verlust_perm: le_verlust_perm, + le_max: le_max, + le: le, + wundschwelle: wundschwelle, + schmerzstufe1: Math.round(le_max / 4 * 3), + schmerzstufe2: Math.round(le_max / 4 * 2), + schmerzstufe3: Math.round(le_max / 4), + schmerzstufe4: 5 + } + } + return {} + } + + const calcDistanzMod = async () => { + const values = await dsa5helpers.getAttrsAsync(["distanz_mod", "groesse_mod", "sicht_mod", "ziel_bewegung_mod", "schuetze_bewegung_mod", "kampfgetuemmel_mod", "fk_sf_mod", "tp_sf_mod"]) + let distanz_mod = parseInt(values.distanz_mod) || 0; + let groesse_mod = parseInt(values.groesse_mod) || 0; + let sicht_mod = parseInt(values.sicht_mod) || 0; + let ziel_bewegung_mod = parseInt(values.ziel_bewegung_mod) || 0; + let schuetze_bewegung_mod = parseInt(values.schuetze_bewegung_mod) || 0; + let kampfgetuemmel_mod = parseInt(values.kampfgetuemmel_mod) || 0; + let fk_sf_mod = parseInt(values.fk_sf_mod) || 0; + let tp_sf_mod = parseInt(values.tp_sf_mod) || 0; + let distanz_fk_mod = distanz_mod * 2; + let distanz_tp_mod = distanz_mod; + let groesse_fk_mod = groesse_mod * 4; + let groesse_tp_mod = 0; + let sicht_fk_mod = sicht_mod * 2; + let sicht_tp_mod = 0; + let ziel_bewegung_fk_mod = ziel_bewegung_mod * 2; + let ziel_bewegung_tp_mod = 0; + let schuetze_bewegung_fk_mod = schuetze_bewegung_mod * 2; + let schuetze_bewegung_tp_mod = 0; + let kampfgetuemmel_fk_mod = -2 * kampfgetuemmel_mod; + let gesamt_fk_mod = distanz_fk_mod + groesse_fk_mod + sicht_fk_mod + ziel_bewegung_fk_mod + schuetze_bewegung_fk_mod + kampfgetuemmel_fk_mod + fk_sf_mod; + let gesamt_tp_mod = distanz_tp_mod + groesse_tp_mod + sicht_tp_mod + ziel_bewegung_tp_mod + schuetze_bewegung_tp_mod + tp_sf_mod; + + return { + distanz_fk_mod, + distanz_tp_mod, + groesse_fk_mod, + groesse_tp_mod, + sicht_fk_mod, + sicht_tp_mod, + ziel_bewegung_fk_mod, + ziel_bewegung_tp_mod, + schuetze_bewegung_fk_mod, + schuetze_bewegung_tp_mod, + kampfgetuemmel_fk_mod, + gesamt_fk_mod, + gesamt_tp_mod + } + } + + const calcMeleeMod = async () => { + const values = await dsa5helpers.getAttrsAsync(["sicht_mod_nk", "gegnerrw", "gegner_hinten", "gegner_kt", "blutrausch", "liegend", "vorteilhafte_position", "kampf_im_wasser"]) + let sicht_mod_nk = parseInt(values.sicht_mod_nk) || 0; + let gegnerrw = parseInt(values.gegnerrw) || 0; + let gegner_kt = parseInt(values.gegner_kt) || 0; + let blutrausch = parseInt(values.blutrausch) || 0; + // eingeengt --- Waffenabhängige Auswirkung + const vorteilhafte_position = (parseInt(values.vorteilhafte_position) || 0) == 1 ? 2 : 0 + const gegner_hinten = (parseInt(values.gegner_hinten) || 0) == 1 ? -4 : 0 + const liegend = (parseInt(values.liegend) || 0) == 1 ? -2 : 0; + let tp_situation_mod = 0; + if (blutrausch == 1) { + blutrausch = 4; + tp_situation_mod = 2; + }; + let kampf_im_wasser = parseInt(values.kampf_im_wasser) || 0; + let at_situation_mod = sicht_mod_nk + gegnerrw + vorteilhafte_position + kampf_im_wasser + (liegend * 2) + blutrausch; + let pa_situation_mod = sicht_mod_nk + vorteilhafte_position + kampf_im_wasser + liegend + gegner_hinten + gegner_kt; + + return { + at_situation_mod, + pa_situation_mod, + tp_situation_mod + } + } + + const setMageAttr = async (elem) => { + const v = await dsa5helpers.getAttrsAsync(["toggle_npc", `leiteigenschaft_${elem}`, ...dsa5Module().getAttrs().map(x => `${x}_gesamt`), `${elem}_modifikator`, `${elem}_verlust_perm`, `${elem}_rueckkauf`, `${elem}`, `${elem}_regeneration`, `${elem}_faktor`]) + if (v.toggle_npc == 'character') { + let leiteigenschaft = v[`leiteigenschaft_${elem}`]; + let modifikator = parseInt(v[`${elem}_modifikator`]) || 0; + let verlust_perm = parseInt(v[`${elem}_verlust_perm`]) || 0; + let rueckkauf = parseInt(v[`${elem}_rueckkauf`]) || 0; + let ae = parseInt(v[`${elem}`]) || 0; + let regeneration = parseInt(v[`${elem}_regeneration`]) || 0; + let faktor = parseFloat(v[`${elem}_faktor`]) || 1; + + let ausgangswert = 0; + switch (leiteigenschaft) { + case "keine": + ausgangswert = 20; + break; + default: + if (dsa5Module().dsa5.attributes[leiteigenschaft]) + ausgangswert = 20 + Math.ceil((parseInt(v[`${dsa5Module().dsa5.attributes[leiteigenschaft]}_gesamt`]) || 0) * faktor); + + break; + } // Ende switch + let max = ausgangswert + modifikator - verlust_perm + rueckkauf; + + return { + [`${elem}_ausgangswert`]: ausgangswert, + [`${elem}_modifikator`]: modifikator, + [`${elem}_verlust_perm`]: verlust_perm, + [`${elem}_max`]: max, + [`${elem}`]: ae, + [`${elem}_regeneration`]: regeneration, + [`${elem}_rueckkauf`]: rueckkauf + } + } + return {} + } + + return { + setMageAttr, + calcInitiative, + calcGlaubeMod, + calcMagieMod, + calcTrageLast, + calcArmor, + updateWeaponSelection, + recalcRangeWeapon, + recalcWeapon, + updateTalentModifier, + changeCondition, + change_modifierV2, + meleeweaponLeitwert, + calcCombatskill, + prepareRangeCombatskills, + calcSpeed, + calcSchmerz, + apUpdate, + attributeChange, + calcSchips, + calcToughness, + calcDefense, + calcDodge, + calcEncumbranceTotal, + calcCarryCapacity, + calcSoulpower, + calcDerivedAttributes, + calcDistanzMod, + calcMeleeMod + } })(); const dsa5Module = (() => { const dsa5 = { @@ -14737,7 +16123,7 @@ "armbrueste", "blasrohre", "boegen", "feuerspeien", "schleudern", "wurfwaffen", "diskusse" ], melee: [ - "dolche", "fechtwaffen", "hiebwaffen", "kettenwaffen", "lanzen", "raufen", "schilde", "peitschen", "schwerter", "stangenwaffen", "zweihandhiebwaffen", "zweihandschwerter" + "dolche", "fechtwaffen", "hiebwaffen", "kettenwaffen", "lanzen", "raufen", "schilde", "peitschen", "schwerter", "stangenwaffen", "faecher", "spiesswaffen", "zweihandhiebwaffen", "zweihandschwerter" ] }, weapons: [1, 2, 3, 4, 5], @@ -14754,6 +16140,31 @@ } }); +// Main initializing +on('sheet:opened', async() => { + //const attributes = await dsa5sheetFunctions.attributeChange(Object.values(dsa5Module().dsa5.attributes)) + //const talentmodifiers = await dsa5sheetFunctions.updateTalentModifier(dsa5Module().dsa5.skills) + //const armor = await dsa5sheetFunctions.calcArmor() + const translation = await prepareTranslation() + //const leitwerte = await dsa5sheetFunctions.meleeweaponLeitwert() + //const conditions = await dsa5sheetFunctions.changeCondition(dsa5Module().dsa5.conditions) + //const meleeCombatSkills = await dsa5sheetFunctions.calcCombatskill(dsa5Module().dsa5.combatskills.melee) + //const range = await dsa5sheetFunctions.prepareRangeCombatskills(dsa5Module().dsa5.combatskills.range) + //const speed = await dsa5sheetFunctions.calcSpeed() + //const schips = await dsa5sheetFunctions.calcSchips() + //const toughness = await dsa5sheetFunctions.calcToughness() + //const dodge = await dsa5sheetFunctions.calcDodge() + //const defense = await dsa5sheetFunctions.calcDefense() + //const encumbrance = await dsa5sheetFunctions.calcEncumbranceTotal() + //const soulpower = await dsa5sheetFunctions.calcSoulpower() + //const distanceMod = await dsa5sheetFunctions.calcDistanzMod() + //const meleeMod = await dsa5sheetFunctions.calcMeleeMod() + //const update = {...meleeMod, ...distanceMod, ...talentmodifiers, ...translation, ...leitwerte, ...conditions, ...range, ...meleeCombatSkills } + const update = {...translation } + setAttrs(update) + +}) + const prepareTranslation = async() => { return { query_translation: getTranslationByKey('query_trans') @@ -14778,660 +16189,82 @@ on("change:toggle_npc", function() { }); }); -const getEntruecktModifier = function(selection, value) { - const bonus = Math.min(3, Math.max(0, value - 1)); - const malus = Math.min(4, value * -1); - - switch (selection) { - case "bonus": - return bonus; - case "malus": - return malus; - default: - return 0; - } - //console.log("triggered: getEntruecktModifier: "+ret_val); -} - -const change_modifier = function(selection, modifier_value, oldvalue) { - /* Eigenschaften Modifikatoren */ - console.log(`DSA5 - Change modifier Selection: ${selection} ${oldvalue} ${modifier_value}`); - - selection = selection.replace(/fw_mod$/, "fw") - const update = {} - switch (selection) { - case "mu_mod": - case "kl_mod": - case "in_mod": - case "ch_mod": - case "ff_mod": - case "ge_mod": - case "ko_mod": - case "kk_mod": - { - const attr = `${dsa5Module().dsa5.attributes[selection.replace(/_mod$/, "").toUpperCase()]}_modifier`; - getAttrs([attr], function(target_value) { - update[attr] = parseInt(target_value[attr]) - oldvalue + modifier_value; - setAttrs(update); - }); - } - break; - - case "gs_mod": - getAttrs(["gs_modifikator"], function(target_value) { setAttrs({ gs_modifikator: parseInt(target_value.gs_modifikator) - oldvalue + modifier_value }); }); - break; - - case "ae_regeneration_mod": - case "ke_regeneration_mod": - case "le_regeneration_mod": - { - const attr = selection.replace(/_mod$/, "") - getAttrs([attr], function(target_value) { - update[attr] = parseInt(target_value[attr]) - oldvalue + modifier_value - setAttrs(update); - }); - } - break; - - case "kt_mod": - getAttrs(["fk_effekt_mod"], function(target_value) { setAttrs({ fk_effekt_mod: parseInt(target_value.fk_effekt_mod) - oldvalue + modifier_value }); }); - break; - - default: - getAttrs([selection], function(target_value) { - update[selection] = parseInt(target_value[selection]) - oldvalue + modifier_value - setAttrs(update); - }); - break; - } -} - -const updateTalentModifier = async(talents) => { - const attrs = dsa5Module().dsa5.conditions.map(x => `${x}_gesamt`) - attrs.push("zusatz_gesamt") - for (const skill of talents) { - attrs.push(...[`${skill}_sf_mod`, `${skill}_effekt_mod`, `${skill}_be_akt`, `${skill}_betaeubung_akt`, `${skill}_furcht_akt`, `${skill}_paralyse_akt`, `${skill}_schmerz_akt`, `${skill}_trance_akt`, `${skill}_verwirrung_akt`, `${skill}_entrueckung_akt`, `${skill}_zusatz_akt`]) - } - - const values = await dsa5helpers.getAttrsAsync(attrs) - const update = {} - const belastung_gesamt = parseInt(values.belastung_gesamt) || 0; - const betaeubung_gesamt = parseInt(values.betaeubung_gesamt) || 0; - const entrueckung_gesamt = parseInt(values.entrueckung_gesamt) || 0; - const furcht_gesamt = parseInt(values.furcht_gesamt) || 0; - const paralyse_gesamt = parseInt(values.paralyse_gesamt) || 0; - const schmerz_gesamt = parseInt(values.schmerz_gesamt) || 0; - const trance_gesamt = parseInt(values.trance_gesamt) || 0; - const verwirrung_gesamt = parseInt(values.verwirrung_gesamt) || 0; - const zusatz_gesamt = parseInt(values.zusatz_gesamt) || 0; - for (const skill of talents) { - const sf_mod = parseInt(values[`${skill}_sf_mod`]) || 0; - const effekt_mod = parseInt(values[`${skill}_effekt_mod`]) || 0; - const belastung_akt = parseInt(values[`${skill}_be_akt`]) || 0; - const betaeubung_akt = parseInt(values[`${skill}_betaeubung_akt`]) || 0; - const furcht_akt = parseInt(values[`${skill}_furcht_akt`]) || 0; - const paralyse_akt = parseInt(values[`${skill}_paralyse_akt`]) || 0; - const schmerz_akt = parseInt(values[`${skill}_schmerz_akt`]) || 0; - const trance_akt = parseInt(values[`${skill}_trance_akt`]) || 0; - const verwirrung_akt = parseInt(values[`${skill}_verwirrung_akt`]) || 0; - const entrueckung_akt = values[`${skill}_entrueckung_akt`]; - const zusatz_akt = parseInt(values[`${skill}_zusatz_akt`]) || 0; - const entrueckung_modifier = getEntruecktModifier(entrueckung_akt, entrueckung_gesamt); - - const status_modifier = Math.max(-5, (-1 * ((belastung_gesamt * belastung_akt) + (betaeubung_gesamt * betaeubung_akt) + (furcht_gesamt * furcht_akt) + (paralyse_gesamt * paralyse_akt) + (schmerz_gesamt * schmerz_akt) + (trance_gesamt * trance_akt) + (verwirrung_gesamt * verwirrung_akt) + (zusatz_gesamt * zusatz_akt))) + entrueckung_modifier); - const gesamt_mod = status_modifier + sf_mod + effekt_mod - console.log(`DSA5 - triggered: updateTalentModifier: Talent: ${skill} ## modifier ${status_modifier} gesamt_mod ${gesamt_mod}`); - update[`${skill}_gesamt_mod`] = gesamt_mod; - } - return update -} - -on("sheet:opened change:le_max change:ke_max change:ae_max change:le change:ke change:ae change:toggle_npc change:groessekategorie change:leiteigenschaft_ke change:leiteigenschaft_ae change:linkToToken", function(eventinfo) { +on("sheet:opened change:le_max change:ke_max change:ae_max change:le change:ke change:ae change:toggle_npc change:groessekategorie change:leiteigenschaft_ke change:leiteigenschaft_ae change:linkToToken", function() { getAttrs(["le_max", "ke_max", "ae_max", "le", "ke", "ae", "toggle_npc", "groessekategorie", "leiteigenschaft_ke", "leiteigenschaft_ae", "linkToToken"], function(values) { dsa5drop.setTokenValues(values, values.toggle_npc != "character", values.linkToToken == "on") }) }) //Schmerzberechnung -on("change:le_max change:le change:calc_schmerz", function() { - getAttrs(["calc_schmerz", "le_max", "le", "toggle_npc"], function(values) { - if (values.calc_schmerz == "on") { - const le_max = Number(values.le_max) - const le = Number(values.le) - const hasDefaultPain = values.toggle_npc != "npc" || le_max > 20 - let pain = 0 - if (hasDefaultPain) { - pain = Math.floor((1 - le / le_max) * 4) - if (le <= 5) pain = 4 - } else { - pain = Math.floor(5 - 5 * le / le_max) - } - setAttrs({ - schmerz_basis: pain - }) - } - }) +on("change:le_max change:le change:calc_schmerz", async() => { + const update = await dsa5sheetFunctions.calcSchmerz() + setAttrs(update) }) -on("change:ap_ausgegeben change:ap_gesamt", function() { - getAttrs(["ap_ausgegeben", "ap_gesamt"], function(values) { - const ap_gesamt = Number(values.ap_gesamt) || 0 - const ap_verfuegbar = ap_gesamt - (Number(values.ap_ausgegeben) || 0) - let erfahrungsgrad = 900 - const grades = [2100, 1700, 1400, 1200, 1100, 1000] - for (const grade of grades) { - if (ap_gesamt >= grade) { - erfahrungsgrad = grade - break - } - } - setAttrs({ erfahrungsgrad, ap_verfuegbar }) - }) +on("change:ap_ausgegeben change:ap_gesamt", async() => { + const update = await dsa5sheetFunctions.apUpdate() + setAttrs(update) }) - // Eigenschaften for (const [key, value] of Object.entries(dsa5Module().dsa5.attributes)) { - on(`sheet:opened change:${value} change:${value}_modifier`, function() { - getAttrs([value, `${value}_modifier`], function(values) { - let update = {} - update[`${value}_gesamt`] = parseInt(values[value]) + parseInt(values[`${value}_modifier`]) - setAttrs(update); - }); + on(`change:${value} change:${value}_modifier`, async() => { + const update = await dsa5sheetFunctions.attributeChange([value]) + setAttrs(update) }); } -on("sheet:opened change:belastung_basis change:belastung_mod change:rs_be_mod", function() { - getAttrs(["belastung_basis", "belastung_mod", "rs_be_mod", "rs_be_mod_vorher"], function(values) { - let basis = parseInt(values.belastung_basis) || 0; - let mod = parseInt(values.belastung_mod) || 0; - let rs_be_mod = parseInt(values.rs_be_mod) || 0; - let rs_be_mod_vorher = parseInt(values.rs_be_mod_vorher) || 0; - let belastung_basis_neu = basis - rs_be_mod_vorher + rs_be_mod; - let basis_gesamt = Math.min(4, Math.max(0, belastung_basis_neu + mod)); - - console.log("DSA5 - vorher " + rs_be_mod_vorher + " basis " + belastung_basis_neu + " be_mod " + rs_be_mod + " mod " + mod + " gesamt " + basis_gesamt); - - setAttrs({ - belastung_gesamt: basis_gesamt, - belastung_basis: belastung_basis_neu, - rs_be_mod_vorher: rs_be_mod - }); - }); +on("change:belastung_basis change:belastung_mod change:rs_be_mod", async() => { + const update = await dsa5sheetFunctions.calcEncumbranceTotal() + setAttrs(update) }); -//rangeweapon -const recalcRangeWeapon = (ids) => { - let attrs = dsa5Module().dsa5.conditions.map(x => `${x}_gesamt`) - attrs.push(...dsa5Module().dsa5.combatskills.range.map(x => `at_${x}`)) - attrs.push(...dsa5Module().dsa5.combatskills.range.map(x => `${x}_entrueckung_akt`)) - attrs.push(...["fk_waffe", "gesamt_fk_mod", "gesamt_tp_mod", "fk_ladezeit_mod"]) - for (const id of ids) { - attrs.push(...[`repeating_rangeweapon_${id}_fkwaffe_typ`, `repeating_rangeweapon_${id}_fkwaffe_name`, `repeating_rangeweapon_${id}_fkwaffe_tp_anz_wuerfel`, `repeating_rangeweapon_${id}_fkwaffe_tp_wert`, `repeating_rangeweapon_${id}_fkwaffe_mun`, `repeating_rangeweapon_${id}_fkwaffe_ladezeit`, `repeating_rangeweapon_${id}_fkwaffe_rw`, `repeating_rangeweapon_${id}_fkwaffe_rw`, `repeating_rangeweapon_${id}_fkwaffe_tp_mod`, `repeating_rangeweapon_${id}_fkwaffe_fk_mod`, `repeating_rangeweapon_${id}_fkwaffe_tp_wuerfel`]) - } - //TODO get data of selected weapon - getAttrs(attrs, function(values) { - let update = {} - - const id = values['fk_waffe'] - - if (!values[`repeating_rangeweapon_${id}_fkwaffe_typ`]) { - update = { - fk_roll: 0, - fk_tp_dice_roll: 0, - fk_tp_zusatz_roll: 0, - fk_reichweite: "-", - fk_ladezeit: 0, - fk_tp_dice_select: 0, - fk_name: "-", - fk_rw: "" - } - } else { - - let fkwaffe_typ = values[`repeating_rangeweapon_${id}_fkwaffe_typ`]; - let fkwaffe_tp_anz_wuerfel = parseInt(values[`repeating_rangeweapon_${id}_fkwaffe_tp_anz_wuerfel`]) || 1; - let fkwaffe_tp_wert = parseInt(values[`repeating_rangeweapon_${id}_fkwaffe_tp_wert`]) || 0; - //let fkwaffe_mun = parseInt(values[`repeating_rangeweapon_${id}_fkwaffe_mun`]) || 0; - let fkwaffe_ladezeit = parseInt(values[`repeating_rangeweapon_${id}_fkwaffe_ladezeit`]) || 0; - let fkwaffe_rw = values[`repeating_rangeweapon_${id}_fkwaffe_rw`]; - //let fkwaffe_tp_mod = parseInt(values[`repeating_rangeweapon_${id}_fkwaffe_tp_mod`]) || 0; - let fkwaffe_fk_mod = parseInt(values[`repeating_rangeweapon_${id}_fkwaffe_fk_mod`]) || 0; - let fk_tp_dice_select = values[`repeating_rangeweapon_${id}_fkwaffe_tp_wuerfel`]; - - let fk = 0; - let entrueckung_modifier = 0; - - if (dsa5Module().dsa5.combatskills.range.includes(fkwaffe_typ)) { - fk = parseInt(values[`at_${fkwaffe_typ}`]); - entrueckung_modifier = getEntruecktModifier(values[`${fkwaffe_typ}_entrueckung_akt`], parseInt(values.entrueckung_gesamt)); - } - let red = dsa5Module().dsa5.conditions.reduce((x, y) => { return x + parseInt(values[`${y}_gesamt`]) }, 0) - let status_modifier = ((-1 * red) + entrueckung_modifier); - if (status_modifier < -5) { status_modifier = -5; }; - //let gesamt_fk_mod = parseInt(values.gesamt_fk_mod) || 0; - //let gesamt_tp_mod = parseInt(values.gesamt_tp_mod) || 0; - let fk_roll = fk + fkwaffe_fk_mod + status_modifier; - let fk_tp_dice_roll = fkwaffe_tp_anz_wuerfel; - let fk_tp_zusatz_roll = fkwaffe_tp_wert; - let fk_reichweite = fkwaffe_rw; - let fk_ladezeit = fkwaffe_ladezeit + parseInt(values.fk_ladezeit_mod); - console.log(values[`repeating_rangeweapon_${id}_fkwaffe_name`]) - update = { - fk_roll: fk_roll, - fk_tp_dice_roll: fk_tp_dice_roll, - fk_tp_zusatz_roll: fk_tp_zusatz_roll, - fk_reichweite: fk_reichweite, - fk_ladezeit: fk_ladezeit, - fk_tp_dice_select: fk_tp_dice_select, - fk_rw: values[`repeating_rangeweapon_${id}_fkwaffe_rw`], - fk_name: values[`repeating_rangeweapon_${id}_fkwaffe_name`] - } - } - setAttrs(update); - }); -} - -on(`change:repeating_rangeweapon:fkwaffe_typ change:repeating_rangeweapon:fkwaffe_tp_anz_wuerfel change:repeating_rangeweapon:fkwaffe_tp_wert change:repeating_rangeweapon:fkwaffe_mun change:repeating_rangeweapon:fkwaffe_ladezeit change:repeating_rangeweapon:fkwaffe_rw change:repeating_rangeweapon:fkwaffe_tp_mod change:repeating_rangeweapon:fkwaffe_fk_mod change:repeating_rangeweapon:fkwaffe_tp_wuerfel - sheet:opened change:status_gesamt change:ktw_change_flag change:fk_waffe change:gesamt_fk_mod change:gesamt_tp_mod change:fk_ladezeit_mod ${dsa5Module().dsa5.conditions.map(x => `change:${x}_gesamt`).join(" ")} ${dsa5Module().dsa5.combatskills.range.map(x => `change:at_${x} change:${x}_entrueckung_akt`).join(" ")}`, function () { +on(`change:repeating_rangeweapon:fkwaffe_typ change:repeating_rangeweapon:fkwaffe_tp_anz_wuerfel change:repeating_rangeweapon:fkwaffe_tp_wert change:repeating_rangeweapon:fkwaffe_mun change:repeating_rangeweapon:fkwaffe_ladezeit change:repeating_rangeweapon:fkwaffe_rw change:repeating_rangeweapon:fkwaffe_tp_mod change:repeating_rangeweapon:fkwaffe_fk_mod change:repeating_rangeweapon:fkwaffe_tp_wuerfel change:status_gesamt change:ktw_change_flag change:fk_waffe change:gesamt_fk_mod change:gesamt_tp_mod change:fk_ladezeit_mod ${dsa5Module().dsa5.conditions.map(x => `change:${x}_gesamt`).join(" ")} ${dsa5Module().dsa5.combatskills.range.map(x => `change:at_${x} change:${x}_entrueckung_akt`).join(" ")}`, () => { getSectionIDs("rangeweapon", function (idarray) { - recalcRangeWeapon(idarray) + dsa5sheetFunctions.recalcRangeWeapon(idarray) }) }); -const calcMainHand = (values, nkwaffe) => { - //if (!nkwaffe) return - const waffe_typ = values[`repeating_meleeweapon_${nkwaffe}_waffe_typ`] || 'raufen'; - //let waffe_leiteigenschaft = values[`waffe_leiteigenschaft_${nk_waffe}`]; - //let waffe_leiteigenschaft_input = parseInt(values[`waffe_leiteigenschaft_input_${nk_waffe}`]) || 0; - const waffe_tp_bonus = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_tp_bonus`]) || 0; - const waffe_tp_anz_wuerfel = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_tp_anz_wuerfel`]) || 1; - const waffe_tp_wert = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_tp_wert`]) || 0; - const waffe_at = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_at`]) || 0; - const waffe_pa = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_pa`]) || 0; - const waffe_tp_mod = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_tp_mod`]) || 0; - const waffe_at_mod = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_at_mod`]) || 0; - const waffe_pa_mod = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_pa_mod`]) || 0; - const nk_tp_dice_select = values[`repeating_meleeweapon_${nkwaffe}_waffe_tp_wuerfel`] || "d6"; - - const at_situation_mod = parseInt(values.at_situation_mod) || 0; - const pa_situation_mod = parseInt(values.pa_situation_mod) || 0; - const tp_situation_mod = parseInt(values.tp_situation_mod) || 0; - - const vw_grundwert = parseInt(values.vw_grundwert) || 0; - const vw_modifikator = parseInt(values.vw_modifikator) || 0; - - let at = 0; - let pa = 0; - let entrueckung_modifier = 0; - - switch (waffe_typ) { - case "0": - break - case "kettenwaffen": - case "lanzen": - at = parseInt(values[`at_${waffe_typ}`]); - entrueckung_modifier = getEntruecktModifier(values[`${waffe_typ}_entrueckung_akt`], parseInt(values.entrueckung_gesamt)); - break; - default: - at = parseInt(values[`at_${waffe_typ}`]); - pa = parseInt(values[`pa_${waffe_typ}`]); - entrueckung_modifier = getEntruecktModifier(values[`${waffe_typ}_entrueckung_akt`], parseInt(values.entrueckung_gesamt)); - }; - - - let status_modifier = Math.max(-5, ((-1 * dsa5Module().dsa5.conditions.reduce((x, y) => { return x + parseInt(values[`${y}_gesamt`]) }, 0)) + entrueckung_modifier)); - - let beidhand_kampf = parseInt(values.beidhand_kampf); - let beidhand_kampf_mod = 0 - if (beidhand_kampf == 1) { beidhand_kampf_mod = parseInt(values.beidhand_kampf_mod); } - let parade_malus = (-3 * (parseInt(values.parade_malus_select) || 0) - + (parseInt(values.parade_malus_select) || 0) - * (parseInt(values.parade_zweite_mod) || 0)); - let at_roll = at + waffe_at + waffe_at_mod + status_modifier + at_situation_mod + beidhand_kampf_mod - + (parseInt(values.at_sf_mod) || 0) - + (parseInt(values.at_effekt_mod) || 0) - let pa_roll = pa + waffe_pa + waffe_pa_mod + status_modifier + pa_situation_mod + parade_malus - + (parseInt(values.pa_sf_mod) || 0) - + (parseInt(values.pa_effekt_mod) || 0) - + beidhand_kampf_mod - + (parseInt(values.pa_schildpassiv_bonus) || 0); - let ausweichen_malus = (-3 * (parseInt(values.parade_malus_select) || 0) - + (parseInt(values.parade_malus_select) || 0) * (parseInt(values.ausweichen_zweite_mod) || 0)); - let aw_roll = parseInt(values.aw_gesamt) + status_modifier + pa_situation_mod + ausweichen_malus - + (parseInt(values.aw_sf_mod) || 0) - + (parseInt(values.aw_effekt_mod) || 0); - let passierschlag_roll = -4 + at + waffe_at + waffe_at_mod + status_modifier + at_situation_mod - + (parseInt(values.at_effekt_mod) || 0) + beidhand_kampf_mod; - let tp_dice_roll = waffe_tp_anz_wuerfel; - let tp_zusatz_roll = waffe_tp_wert + waffe_tp_bonus + waffe_tp_mod - + (parseInt(values.tp_sf_mod) || 0) + (parseInt(values.tp_effekt_mod) || 0) + tp_situation_mod; - let passierschlag_tp_zusatz_roll = waffe_tp_wert + waffe_tp_bonus + waffe_tp_mod + tp_situation_mod - + (parseInt(values.tp_effekt_mod) || 0) - let vw_roll = vw_grundwert + vw_modifikator + status_modifier + pa_situation_mod + parade_malus - + (parseInt(values.pa_sf_mod) || 0) - + (parseInt(values.pa_effekt_mod) || 0) - - return { - at_roll: at_roll, - pa_roll: pa_roll, - vw_roll: vw_roll, - - aw_roll: aw_roll, - passierschlag_roll: passierschlag_roll, - tp_dice_roll: tp_dice_roll, - tp_zusatz_roll: tp_zusatz_roll, - passierschlag_tp_zusatz_roll: passierschlag_tp_zusatz_roll, - kampfstatus_modifier: status_modifier, - parade_malus: parade_malus, - ausweichen_malus: ausweichen_malus, - nk_tp_dice_select: nk_tp_dice_select, - nk_name: values[`repeating_meleeweapon_${nkwaffe}_waffe_name`] || getTranslationByKey('raufen') - } -} - -const calcOffHand = (values, nkwaffe) => { - var schild_typ = values[`repeating_meleeweapon_${nkwaffe}_waffe_typ`] || 'raufen'; - //var schild_leiteigenschaft = values.schild_leiteigenschaft_1; - //var schild_leiteigenschaft_input = parseInt(values.schild_leiteigenschaft_input_1) || 0; - var schild_tp_bonus = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_tp_bonus`]) || 0; - var schild_tp_anz_wuerfel = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_tp_anz_wuerfel`]) || 1; - var schild_tp_wert = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_tp_wert`]) || 0; - var schild_at = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_at`]) || 0; - var schild_pa = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_pa`]) || 0; - var schild_tp_mod = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_tp_mod`]) || 0; - var schild_at_mod = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_at_mod`]) || 0; - var schild_pa_mod = parseInt(values[`repeating_meleeweapon_${nkwaffe}_waffe_pa_mod`]) || 0; - var nh_tp_dice_select = values[`repeating_meleeweapon_${nkwaffe}_waffe_tp_wuerfel`] || "d6"; - - var at_situation_mod = parseInt(values.at_situation_mod) || 0; - var pa_situation_mod = parseInt(values.pa_situation_mod) || 0; - var tp_situation_mod = parseInt(values.tp_situation_mod) || 0; - - var at = 0; - var pa = 0; - var entrueckung_modifier = 0; - - switch (schild_typ) { - case "kettenwaffen": - case "lanzen": - at = parseInt(values[`at_${schild_typ}`]); - entrueckung_modifier = getEntruecktModifier(values[`${schild_typ}_entrueckung_akt`], parseInt(values.entrueckung_gesamt)); - break; - case "0": - break; - default: - at = parseInt(values[`at_${schild_typ}`]); - pa = parseInt(values[`pa_${schild_typ}`]); - entrueckung_modifier = getEntruecktModifier(values[`${schild_typ}_entrueckung_akt`], parseInt(values.entrueckung_gesamt)); - }; - - let status_modifier = Math.max(-5, ((-1 * dsa5Module().dsa5.conditions.reduce((x, y) => { return x + parseInt(values[`${y}_gesamt`]) }, 0)) + entrueckung_modifier)); - - let beidhand_kampf_mod = 0 - let beidhand_kampf = parseInt(values.beidhand_kampf); - if (beidhand_kampf == 1) { beidhand_kampf_mod = parseInt(values.beidhand_kampf_mod); } - let falsche_hand_mod = parseInt(values.falsche_hand_mod); - let parade_malus = (-3 * parseInt(values.parade_malus_select || 0)) - + (parseInt(values.parade_malus_select || 0) * parseInt(values.parade_zweite_mod)); - let at_nh_roll = at + schild_at + schild_at_mod + status_modifier + at_situation_mod - + (parseInt(values.at_sf_mod) || 0) + (parseInt(values.at_effekt_mod) || 0) - + beidhand_kampf_mod + falsche_hand_mod - let pa_schildpassiv_bonus = 0; - let pa_nh_roll = pa + schild_pa + schild_pa_mod + status_modifier + pa_situation_mod + parade_malus - + (parseInt(values.pa_sf_mod) || 0) - + (parseInt(values.pa_effekt_mod) || 0) - + beidhand_kampf_mod + falsche_hand_mod; - - if (schild_typ == "schilde") { - pa_schildpassiv_bonus = schild_pa; - pa_nh_roll = pa + (schild_pa * 2) + schild_pa_mod + status_modifier + pa_situation_mod + parade_malus - + (parseInt(values.pa_sf_mod) || 0) - + (parseInt(values.pa_effekt_mod) || 0); - } - - let tp_nh_dice_roll = schild_tp_anz_wuerfel; - let tp_nh_zusatz_roll = schild_tp_wert + schild_tp_bonus + schild_tp_mod + tp_situation_mod - + (parseInt(values.tp_sf_mod) || 0) - + (parseInt(values.tp_effekt_mod) || 0) - return { - at_nh_roll: at_nh_roll, - pa_nh_roll: pa_nh_roll, - tp_nh_dice_roll: tp_nh_dice_roll, - tp_nh_zusatz_roll: tp_nh_zusatz_roll, - pa_schildpassiv_bonus: pa_schildpassiv_bonus, - nh_tp_dice_select: nh_tp_dice_select, - nh_name: values[`repeating_meleeweapon_${nkwaffe}_waffe_name`] || getTranslationByKey('raufen') - } -} - -// Meleeweapon -const recalcWeapon = (ids) => { - let attrs = dsa5Module().dsa5.conditions.map(x => `${x}_gesamt`) - attrs.push(...dsa5Module().dsa5.combatskills.melee.map(x => `at_${x}`)) - attrs.push(...dsa5Module().dsa5.combatskills.melee.map(x => `pa_${x}`)) - attrs.push(...dsa5Module().dsa5.combatskills.melee.map(x => `${x}_entrueckung_akt`)) - attrs.push(...["nk_waffe", "nh_waffe", "falsche_hand_mod", "at_effekt_mod", "pa_effekt_mod", "aw_effekt_mod", "at_sf_mod", - "pa_sf_mod", "aw_sf_mod", "tp_sf_mod", "tp_effekt_mod", "at_situation_mod", "pa_situation_mod", "tp_situation_mod", - "parade_malus_select", "parade_zweite_mod", "ausweichen_zweite_mod", "aw_gesamt", "beidhand_kampf", "beidhand_kampf_mod", - "pa_schildpassiv_bonus", "vw_grundwert", "vw_modifikator"]) - for (const id of ids) { - attrs.push(...["waffe_name", `waffe_typ`, `waffe_leiteigenschaft`, "waffe_nebenhand", `waffe_leiteigenschaft_input`, `waffe_tp_bonus`, `waffe_tp_anz_wuerfel`, `waffe_tp_wert`, `waffe_at`, `waffe_pa`, `waffe_tp_mod`, `waffe_at_mod`, `waffe_pa_mod`, `waffe_tp_wuerfel`].map(x => `repeating_meleeweapon_${id}_${x}`)) - } - //TODO get only data of selected weapon - getAttrs(attrs, function (values) { - let nk_waffe = values.nk_waffe; - let nh_waffe = values.nh_waffe; - let update = {} - update = calcMainHand(values, nk_waffe) - update = { ...update, ...calcOffHand(values, nh_waffe) } - setAttrs(update, console.log("DSA5 - updated_weapon")); - }); -} - -on(`sheet:opened change:status_gesamt change:ktw_change_flag change:nk_waffe change:nh_waffe change:koerperkraft_gesamt change:gewandheit_gesamt change:aw_gesamt change:at_sf_mod change:pa_sf_mod change:aw_sf_mod change:tp_sf_mod change:at_effekt_mod change:pa_effekt_mod -change:aw_effekt_mod change:tp_effekt_mod change:at_situation_mod change:pa_situation_mod change:parade_malus_select change:parade_zweite_mod change:ausweichen_zweite_mod change:beidhand_kampf change:beidhand_kampf_mod -change:falsche_hand_mod change:pa_schildpassiv_bonus change:vw_grundwert change:vw_modifikator change:repeating_meleeweapon:waffe_typ change:repeating_meleeweapon:waffe_leiteigenschaft change:repeating_meleeweapon:waffe_leiteigenschaft_input change:repeating_meleeweapon:waffe_tp_bonus change:repeating_meleeweapon:waffe_tp_anz_wuerfel -change:repeating_meleeweapon:waffe_tp_wert change:repeating_meleeweapon:waffe_at change:repeating_meleeweapon:waffe_pa change:repeating_meleeweapon:waffe_tp_mod change:repeating_meleeweapon:waffe_at_mod change:repeating_meleeweapon:waffe_pa_mod change:repeating_meleeweapon:waffe_tp_wuerfel`, function (eventInfo) { +on(`change:status_gesamt change:ktw_change_flag change:nk_waffe change:nh_waffe change:koerperkraft_gesamt change:gewandheit_gesamt change:aw_gesamt change:at_sf_mod change:pa_sf_mod change:aw_sf_mod change:tp_sf_mod change:at_effekt_mod change:pa_effekt_mod change:aw_effekt_mod change:tp_effekt_mod change:at_situation_mod change:pa_situation_mod change:parade_malus_select change:parade_zweite_mod change:ausweichen_zweite_mod change:beidhand_kampf change:beidhand_kampf_mod change:falsche_hand_mod change:pa_schildpassiv_bonus change:vw_grundwert change:vw_modifikator change:repeating_meleeweapon:waffe_typ change:repeating_meleeweapon:waffe_leiteigenschaft change:eingeengt change:repeating_meleeweapon:waffe_leiteigenschaft_input change:repeating_meleeweapon:waffe_tp_bonus change:repeating_meleeweapon:waffe_tp_anz_wuerfel change:repeating_meleeweapon:waffe_tp_wert change:repeating_meleeweapon:waffe_at change:repeating_meleeweapon:waffe_pa change:repeating_meleeweapon:waffe_tp_mod change:repeating_meleeweapon:waffe_at_mod change:repeating_meleeweapon:waffe_pa_mod change:repeating_meleeweapon:waffe_tp_wuerfel`, () => { getSectionIDs("meleeweapon", function (idarray) { - recalcWeapon(idarray) + dsa5sheetFunctions.recalcWeapon(idarray) }) }) on(`change:repeating_rangeweapon:fk_waffe`, function (eventInfo) { - if(eventInfo.newValue == 1){ - const id = dsa5helpers.getRowId(eventInfo.sourceAttribute) - let update = { fk_waffe: id } - getSectionIDs("rangeweapon", function (idarray) { - for (let k of idarray) { - if (k != id) update[`repeating_rangeweapon_${k}_fk_waffe`] = 0 - } - setAttrs(update) - }) - }else if(eventInfo.newValue === "0" && eventInfo.previousValue === "1"){ - setAttrs({fk_waffe: "-"}) - } + dsa5sheetFunctions.updateWeaponSelection(eventInfo, "fk_waffe", "rangeweapon") }) on(`change:repeating_meleeweapon:nh_waffe`, function (eventInfo) { - if (eventInfo.newValue == 1) { - const id = dsa5helpers.getRowId(eventInfo.sourceAttribute) - let update = { nh_waffe: id } - - getSectionIDs("meleeweapon", function (idarray) { - for (let k of idarray) { - if (k != id) update[`repeating_meleeweapon_${k}_nh_waffe`] = 0 - } - setAttrs(update) - })} - else if(eventInfo.newValue === "0" && eventInfo.previousValue === "1"){ - setAttrs({nh_waffe: "-"}) - } + dsa5sheetFunctions.updateWeaponSelection(eventInfo, "nh_waffe", "meleeweapon") }) on(`change:repeating_meleeweapon:nk_waffe`, function (eventInfo) { - if (eventInfo.newValue == 1) { - const id = dsa5helpers.getRowId(eventInfo.sourceAttribute) - let update = { nk_waffe: id } - - getSectionIDs("meleeweapon", function (idarray) { - for (let k of idarray) { - if (k != id) update[`repeating_meleeweapon_${k}_nk_waffe`] = 0 - } - setAttrs(update) - })} - else if(eventInfo.newValue === "0" && eventInfo.previousValue === "1"){ - setAttrs({nk_waffe: "-"}) - } + dsa5sheetFunctions.updateWeaponSelection(eventInfo, "nk_waffe", "meleeweapon") }) -const calcArmor = async() => { - let update = {} - const val = await dsa5helpers.getAttrsAsync(["toggle_npc"]) - if (val.toggle_npc == 'character') { - const idarray = await dsa5helpers.getSectionIDsAsync("armor") - const attrs = ["belastungsgewoehnung_mod"] - idarray.forEach(elem => { - attrs.push(...[`repeating_armor_${elem}_ruestung_auswahl`, `repeating_armor_${elem}_ruestung_rs`, `repeating_armor_${elem}_ruestung_preset`, `repeating_armor_${elem}_ruestung_be_mod`, `repeating_armor_${elem}_ruestung_ini_mod`, `repeating_armor_${elem}_ruestung_gs_mod`, `repeating_armor_${elem}_ruestung_rs_mod`]) - }); - const elems = idarray; - const values_inner = await dsa5helpers.getAttrsAsync(attrs) - let rs = 0; - let rs_be_mod = 0; - let be_gs_mod = 0; - let be_ini_mod = 0; - let belastungsgewoehnung_mod = Math.max(0, Number(values_inner.belastungsgewoehnung_mod) || 0) - for (let i = 0; i < elems.length; i++) { - const elem = elems[i] - - if (values_inner[`repeating_armor_${elem}_ruestung_auswahl`] == "1") { - const ruestung_rs = parseInt(values_inner[`repeating_armor_${elem}_ruestung_rs`]) || 0; - const ruestung_preset = parseInt(values_inner[`repeating_armor_${elem}_ruestung_preset`]) || 0; - const ruestung_be_mod = parseInt(values_inner[`repeating_armor_${elem}_ruestung_be_mod`]) || 0; - const ruestung_ini_mod = parseInt(values_inner[`repeating_armor_${elem}_ruestung_ini_mod`]) || 0; - const ruestung_gs_mod = parseInt(values_inner[`repeating_armor_${elem}_ruestung_gs_mod`]) || 0; - const ruestung_rs_mod = parseInt(values_inner[`repeating_armor_${elem}_ruestung_rs_mod`]) || 0; - - const be = [0, 0, 1, 1, 2, 2, 3, 3][ruestung_preset]; - const ini = ruestung_preset % 2; - const gs = ini; - - rs += ruestung_rs + ruestung_rs_mod; - rs_be_mod += be + ruestung_be_mod; - be_gs_mod += gs + ruestung_gs_mod; - be_ini_mod += gs + ruestung_ini_mod; - } - } - console.log("DSA5 - triggered: Change ruestung: " + "rs: " + rs + " rs_be_mod: " + rs_be_mod + " be_gs_mod: " + be_gs_mod + " be_ini_mod: " + be_ini_mod); - - update = { - rs: rs, - rs_be_mod: rs_be_mod - (rs_be_mod > 0 ? belastungsgewoehnung_mod : 0), - gs_be_modifikator: (be_gs_mod - (be_gs_mod > 0 ? belastungsgewoehnung_mod : 0)) * -1, - ini_be_modifikator: (be_ini_mod - (be_ini_mod > 0 ? belastungsgewoehnung_mod : 0)) * -1 - } - - } else { - const values = await dsa5helpers.getAttrsAsync(["rs_modifikator", "rs_grundwert"]) - const rs_modifikator = parseInt(values.rs_modifikator) || 0; - const rs_grundwert = parseInt(values.rs_grundwert) || 0; - const rs = rs_grundwert + rs_modifikator; - - update = { - rs: rs, - rs_grundwert: rs_grundwert, - rs_modifikator: rs_modifikator - } - } - console.log("DSA5 - Armor update done") - return update -} // Armor -on(`remove:repeating_armor change:toggle_npc change:rs_grundwert change:rs_modifikator change:repeating_armor:ruestung_rs change:belastungsgewoehnung_mod change:repeating_armor:ruestung_auswahl change:repeating_armor:ruestung_preset change:repeating_armor:ruestung_be_mod change:repeating_armor:ruestung_ini_mod change:repeating_armor:ruestung_gs_mod change:repeating_armor:ruestung_rs_mod`, async function () { - const update = await calcArmor() +on(`remove:repeating_armor change:toggle_npc change:rs_grundwert change:rs_modifikator change:repeating_armor:ruestung_rs change:belastungsgewoehnung_mod change:repeating_armor:ruestung_auswahl change:repeating_armor:ruestung_preset change:repeating_armor:ruestung_be_mod change:repeating_armor:ruestung_ini_mod change:repeating_armor:ruestung_gs_mod change:repeating_armor:ruestung_rs_mod`, async () => { + const update = await dsa5sheetFunctions.calcArmor() setAttrs(update) }); -on('change:koerperkraft_gesamt change:tragekraft_mod change:traglast change:calc_tragekraft', function(evInfo){ - getAttrs(["tragekraft_mod", "koerperkraft_gesamt", "traglast", "calc_tragekraft"], values => { - const tragekraft = Number(values.koerperkraft_gesamt) * 2 + Number(values.tragekraft_mod) - const encumbrance = Math.max(0, Math.ceil((Number(values.traglast) - tragekraft - 4) / 4)) - setAttrs({ - tragekraft, - tragekraft_belastung: values.calc_tragekraft == "on" ? encumbrance : 0 - }) - }) +on('change:koerperkraft_gesamt change:tragekraft_mod change:traglast change:calc_tragekraft', async() => { + const update = await dsa5sheetFunctions.calcCarryCapacity() + setAttrs(update) }) -on("remove:repeating_meleeweapon remove:repeating_rangeweapon remove:repeating_armor change:repeating_meleeweapon:weight change:repeating_rangeweapon:weight change:repeating_armor:ruestung_auswahl change:repeating_armor:weight remove:repeating_armor remove:repeating_inventory change:repeating_inventory:weight change:repeating_inventory:count", evInfo => { - calcTrageLast() +on("remove:repeating_meleeweapon remove:repeating_rangeweapon remove:repeating_armor change:repeating_meleeweapon:weight change:repeating_rangeweapon:weight change:repeating_armor:ruestung_auswahl change:repeating_armor:weight remove:repeating_armor remove:repeating_inventory change:repeating_inventory:weight change:repeating_inventory:count", () => { + dsa5sheetFunctions.calcTrageLast() }) -const calcTrageLast = async() => { - console.log("Updating Traglast") - const equipmentIds = await dsa5helpers.getSectionIDsAsync("inventory") - const rangeweaponIds = await dsa5helpers.getSectionIDsAsync("rangeweapon") - const armorIds = await dsa5helpers.getSectionIDsAsync("armor") - const meleeweaponIds = await dsa5helpers.getSectionIDsAsync("meleeweapon") - const attrs = [] - for(const id of equipmentIds){ - attrs.push(`repeating_inventory_${id}_weight`, `repeating_inventory_${id}_count`) - } - for(const id of rangeweaponIds){ - attrs.push(`repeating_rangeweapon_${id}_weight`) - } - for(const id of meleeweaponIds){ - attrs.push(`repeating_meleeweapon_${id}_weight`) - } - for(const id of armorIds){ - attrs.push(`repeating_armor_${id}_weight`, `repeating_armor_${id}_ruestung_auswahl`) - } - let traglast = 0.0 - const res = await dsa5helpers.getAttrsAsync(attrs) - for(const id of equipmentIds){ - traglast += Number(res[`repeating_inventory_${id}_weight`]) * Number(res[`repeating_inventory_${id}_count`]) - } - for(const id of rangeweaponIds){ - traglast += Number(res[`repeating_rangeweapon_${id}_weight`]) - } - for(const id of meleeweaponIds){ - traglast += Number(res[`repeating_meleeweapon_${id}_weight`]) - } - for(const id of armorIds){ - traglast += Number(res[`repeating_armor_${id}_weight`]) * (1 - Number(res[`repeating_armor_${id}_ruestung_auswahl`])) - } - traglast = Number(Math.round(traglast+'e3')+'e-3') - - setAttrs({traglast}) -} - -// Leitwert -const meleeweaponLeitwert = async() => { - const idarray = await dsa5helpers.getSectionIDsAsync("meleeweapon") - let update = {} - if(idarray.length > 0){ - const attrs = [] - for (let i = 0; i < idarray.length; i++) { - const elem = idarray[i] - attrs.push(`repeating_meleeweapon_${elem}_waffe_leiteigenschaft`, `repeating_meleeweapon_${elem}_waffe_leiteigenschaft_input`, "koerperkraft_gesamt", "gewandheit_gesamt") - } - const values = await dsa5helpers.getAttrsAsync(attrs) - for (let i = 0; i < idarray.length; i++) { - const elem = idarray[i] - const tp_leitwert = dsa5helpers.getLeitwert(values[`repeating_meleeweapon_${elem}_waffe_leiteigenschaft`], values, values[`repeating_meleeweapon_${elem}_waffe_leiteigenschaft_input`]); - update[`repeating_meleeweapon_${elem}_waffe_tp_bonus`] = tp_leitwert - } - } - - return update -} - -on("change:koerperkraft_gesamt change:gewandheit_gesamt", async function () { - const update = await meleeweaponLeitwert() +on("change:koerperkraft_gesamt change:gewandheit_gesamt", async () => { + const update = await dsa5sheetFunctions.meleeweaponLeitwert() setAttrs(update) }); @@ -15444,716 +16277,123 @@ on(`change:repeating_meleeweapon:waffe_leiteigenschaft change:repeating_meleewea }); // abgeleitete Werte -on("sheet:opened change:le_grundwert change:le_modifikator change:le_verlust_perm change:konstitution_gesamt", function () { - //init and change lebensenergie - getAttrs(["toggle_npc", "le_grundwert", "le_ausgangswert", "le_modifikator", "le_verlust_perm", "le_max", "le", "wundschwelle", "konstitution_gesamt"], function (v) { - if (v.toggle_npc == 'character') { - let le_grundwert = parseInt(v.le_grundwert) || 8; - let le_modifikator = parseInt(v.le_modifikator) || 0; - let le_verlust_perm = parseInt(v.le_verlust_perm) || 0; - let le = parseInt(v.le) || 0; - let konstitution_gesamt = parseInt(v.konstitution_gesamt) || 8; - let le_ausgangswert = le_grundwert + konstitution_gesamt + konstitution_gesamt; - let le_max = le_ausgangswert + le_modifikator - le_verlust_perm; - let wundschwelle = Math.round(konstitution_gesamt / 2); - - setAttrs({ - le_grundwert: le_grundwert, - le_ausgangswert: le_ausgangswert, - le_modifikator: le_modifikator, - le_verlust_perm: le_verlust_perm, - le_max: le_max, - le: le, - wundschwelle: wundschwelle, - schmerzstufe1: Math.round(le_max / 4 * 3), - schmerzstufe2: Math.round(le_max / 4 * 2), - schmerzstufe3: Math.round(le_max / 4), - schmerzstufe4: 5 - }); - } - }); +on("sheet:opened change:le_grundwert change:le_modifikator change:le_verlust_perm change:konstitution_gesamt", async () => { + const update = await dsa5sheetFunctions.calcDerivedAttributes() + setAttrs(update) }); dsa5Module().dsa5.mageAttrs.forEach(elem => { - on(`sheet:opened change:leiteigenschaft_${elem} ${dsa5Module().getAttrs().map(x => `change:${x}_gesamt`).join(" ")} change:${elem}_ausgangswert change:${elem}_modifikator change:${elem}_verlust_perm change:${elem}_rueckkauf change:${elem}_faktor`, function () { - //init and change astralenergie - getAttrs(["toggle_npc", `leiteigenschaft_${elem}`, ...dsa5Module().getAttrs().map(x => `${x}_gesamt`), `${elem}_modifikator`, `${elem}_verlust_perm`, `${elem}_rueckkauf`, `${elem}`, `${elem}_regeneration`, `${elem}_faktor`], - function (v) { - if (v.toggle_npc == 'character') { - let leiteigenschaft = v[`leiteigenschaft_${elem}`]; - let modifikator = parseInt(v[`${elem}_modifikator`]) || 0; - let verlust_perm = parseInt(v[`${elem}_verlust_perm`]) || 0; - let rueckkauf = parseInt(v[`${elem}_rueckkauf`]) || 0; - let ae = parseInt(v[`${elem}`]) || 0; - let regeneration = parseInt(v[`${elem}_regeneration`]) || 0; - let faktor = parseFloat(v[`${elem}_faktor`]) || 1; - - let ausgangswert = 0; - switch (leiteigenschaft) { - case "keine": - ausgangswert = 20; - break; - default: - if (dsa5Module().dsa5.attributes[leiteigenschaft]) - ausgangswert = 20 + Math.ceil((parseInt(v[`${dsa5Module().dsa5.attributes[leiteigenschaft]}_gesamt`]) || 0) * faktor); - - break; - } // Ende switch - let max = ausgangswert + modifikator - verlust_perm + rueckkauf; - let update = { - [`${elem}_ausgangswert`]: ausgangswert, - [`${elem}_modifikator`]: modifikator, - [`${elem}_verlust_perm`]: verlust_perm, - [`${elem}_max`]: max, - [`${elem}`]: ae, - [`${elem}_regeneration`]: regeneration, - [`${elem}_rueckkauf`]: rueckkauf - }; - - setAttrs(update); - } - }); + on(`change:leiteigenschaft_${elem} ${dsa5Module().getAttrs().map(x => `change:${x}_gesamt`).join(" ")} change:${elem}_ausgangswert change:${elem}_modifikator change:${elem}_verlust_perm change:${elem}_rueckkauf change:${elem}_faktor`, async () => { + const update = await dsa5sheetFunctions.setMageAttr(elem) + setAttrs(update) }); }); // Seelenkraft - -on("sheet:opened change:mut_gesamt change:klugheit_gesamt change:intuition_gesamt change:sk_grundwert change:sk_modifikator", function () { - getAttrs(["toggle_npc", "mut_gesamt", "klugheit_gesamt", "intuition_gesamt", "sk_grundwert", "sk_modifikator"], function (values) { - let toggle_npc = values.toggle_npc; - let sk_modifikator = parseInt(values.sk_modifikator) || 0; - let sk_grundwert = parseInt(values.sk_grundwert) || 0; - let sk_basiswert = sk_grundwert + Math.round((parseInt(values.mut_gesamt) + parseInt(values.klugheit_gesamt) + parseInt(values.intuition_gesamt)) / 6); - let sk_gesamt = toggle_npc == 'character' ? sk_basiswert + sk_modifikator : sk_grundwert + sk_modifikator; - - setAttrs({ - sk_gesamt: sk_gesamt, - sk_grundwert: sk_grundwert, - sk_modifikator: sk_modifikator - }); - }); +on("change:mut_gesamt change:klugheit_gesamt change:intuition_gesamt change:sk_grundwert change:sk_modifikator change:toggle_npc", async () => { + const update = await dsa5sheetFunctions.calcSoulpower() + setAttrs(update) }); // Zähigkeit - -on("sheet:opened change:konstitution_gesamt change:koerperkraft_gesamt change:zk_grundwert change:zk_modifikator", function () { - getAttrs(["toggle_npc", "konstitution_gesamt", "koerperkraft_gesamt", "zk_grundwert", "zk_modifikator"], function (values) { - let toggle_npc = values.toggle_npc; - let zk_modifikator = parseInt(values.zk_modifikator) || 0; - let zk_grundwert = parseInt(values.zk_grundwert) || 0; - let zk_basiswert = zk_grundwert + Math.round((parseInt(values.konstitution_gesamt) + parseInt(values.konstitution_gesamt) + parseInt(values.koerperkraft_gesamt)) / 6); - let zk_gesamt = toggle_npc == 'character' ? zk_basiswert + zk_modifikator : zk_grundwert + zk_modifikator; - - setAttrs({ - zk_gesamt: zk_gesamt, - zk_grundwert: zk_grundwert, - zk_modifikator: zk_modifikator - }); - }); +on("change:konstitution_gesamt change:koerperkraft_gesamt change:zk_grundwert change:zk_modifikator change:toggle_npc", async () => { + const update = await dsa5sheetFunctions.calcToughness() + setAttrs(update) }); // Ausweichen - -on("sheet:opened change:aw_grundwert change:gewandheit_gesamt change:aw_modifikator", function () { - getAttrs(["toggle_npc", "gewandheit_gesamt", "aw_grundwert", "aw_modifikator"], function (values) { - let toggle_npc = values.toggle_npc; - let aw_modifikator = parseInt(values.aw_modifikator) || 0; - let aw_grundwert = parseInt(values.aw_grundwert) || 0; - let aw_basiswert = Math.round(parseInt(values.gewandheit_gesamt) / 2); - let aw_gesamt; - if (toggle_npc == 'character') { - aw_gesamt = aw_basiswert + aw_modifikator; - aw_grundwert = aw_basiswert; - } else { - aw_gesamt = aw_grundwert + aw_modifikator; - } - setAttrs({ - aw_gesamt: aw_gesamt, - aw_grundwert: aw_grundwert, - aw_modifikator: aw_modifikator - }); - }); +on("change:aw_grundwert change:gewandheit_gesamt change:aw_modifikator change:toggle_npc", async () => { + const update = await dsa5sheetFunctions.calcDodge() + setAttrs(update) }); // Geschwindigkeit - -on("sheet:opened change:gs_grundwert change:gs_modifikator change:gs_be_modifikator change:belastung_gesamt", function () { - getAttrs(["gs_grundwert", "gs_modifikator", "belastung_gesamt", "gs_be_modifikator"], function (values) { - let gs_modifikator = parseInt(values.gs_modifikator) || 0; - let gs_grundwert = parseInt(values.gs_grundwert) || 0; - let gs_be_modifikator = parseInt(values.gs_be_modifikator) || 0; - let belastung_gesamt = parseInt(values.belastung_gesamt) || 0; - let gs_gesamt = gs_grundwert + gs_modifikator + gs_be_modifikator - belastung_gesamt; - - setAttrs({ - gs_gesamt: gs_gesamt, - gs_grundwert: gs_grundwert, - gs_modifikator: gs_modifikator - }); - }); +on("change:gs_grundwert change:gs_modifikator change:gs_be_modifikator change:belastung_gesamt change:toggle_npc", async() => { + const update = await dsa5sheetFunctions.calcSpeed() + setAttrs(update) }); -// Rüstungsschutz - // Schips - -on("sheet:opened change:schips_grundwert change:schips_modifikator change:schips", function () { - getAttrs(["schips_grundwert", "schips_modifikator", "schips"], function (values) { - let schips_modifikator = parseInt(values.schips_modifikator) || 0; - let schips_grundwert = parseInt(values.schips_grundwert); - let schips_max = schips_grundwert + schips_modifikator; - let schips = parseInt(values.schips); - - setAttrs({ - schips_max: schips_max, - schips_grundwert: schips_grundwert, - schips_modifikator: schips_modifikator, - schips: schips - }); - }); +on("change:schips_grundwert change:schips_modifikator change:schips", async () => { + const update = await dsa5sheetFunctions.calcSchips() + setAttrs(update) }); // Verteidigungswert -on("sheet:opened change:vw_grundwert change:vw_modifikator", function () { - getAttrs(["vw_grundwert", "vw_modifikator"], function (values) { - let vw_modifikator = parseInt(values.vw_modifikator) || 0; - let vw_grundwert = parseInt(values.vw_grundwert) || 0; - let vw_gesamt = vw_grundwert + vw_modifikator; - - setAttrs({ - vw_gesamt: vw_gesamt, - vw_grundwert: vw_grundwert, - vw_modifikator: vw_modifikator - }); - }); +on("change:vw_grundwert change:vw_modifikator change:toggle_npc", async () => { + const update = await dsa5sheetFunctions.calcDefense() + setAttrs(update) }); // Status und Zustände -const changeCondition = async(conditions) => { - let update = {} - let attrs = ["tragekraft_belastung"] - conditions.forEach(condition => { - attrs.push(`${condition}_basis`, `${condition}_mod`, `${condition}_gear`) - }) - const values = await dsa5helpers.getAttrsAsync(attrs) - conditions.forEach(condition => { - const basis = parseInt(values[`${condition}_basis`]) || 0; - const mod = parseInt(values[`${condition}_mod`]) || 0; - let gear = parseInt(values[`${condition}_gear`]) || 0; - if(condition == "belastung") gear += parseInt(values.tragekraft_belastung) || 0 - console.log(`Update condition ${condition} ${basis},${mod},${gear}`) - update[`${condition}_gesamt`] = Math.max(0, Math.min(4, basis + mod + gear)) - }) - return update -} - dsa5Module().dsa5.conditions.forEach(condition => { - on(`change:${condition}_basis change:${condition}_mod change:${condition}_gear change:tragekraft_belastung`, async function () { - const update = await changeCondition([condition]) + on(`change:${condition}_basis change:${condition}_mod change:${condition}_gear change:tragekraft_belastung`, async () => { + const update = await dsa5sheetFunctions.changeCondition([condition]) setAttrs(update) }); }) - +// Calc condition sum on(`${dsa5Module().dsa5.conditions.map(x => `change:${x}_gesamt`).join(" ")} change:zusatz_gesamt`, function () { - getAttrs([...dsa5Module().dsa5.conditions.map(x => `${x}_gesamt`), "zusatz_gesamt"], function (values) { - const belastung_gesamt = parseInt(values.belastung_gesamt) || 0; - const betaeubung_gesamt = parseInt(values.betaeubung_gesamt) || 0; - const entrueckung_gesamt = parseInt(values.entrueckung_gesamt) || 0; - const furcht_gesamt = parseInt(values.furcht_gesamt) || 0; - const paralyse_gesamt = parseInt(values.paralyse_gesamt) || 0; - const schmerz_gesamt = parseInt(values.schmerz_gesamt) || 0; - const trance_gesamt = parseInt(values.trance_gesamt) || 0; - const verwirrung_gesamt = parseInt(values.verwirrung_gesamt) || 0; - const zusatz_gesamt = parseInt(values.zusatz_gesamt) || 0; - const status_gesamt = -1 * (belastung_gesamt + betaeubung_gesamt + entrueckung_gesamt + furcht_gesamt + paralyse_gesamt + schmerz_gesamt + trance_gesamt + verwirrung_gesamt + zusatz_gesamt); + let conditions = [...dsa5Module().dsa5.conditions.map(x => `${x}_gesamt`), "zusatz_gesamt"] + getAttrs(conditions, function (values) { + const status_gesamt = -1 * conditions.reduce((sum, x) => { + return sum + (parseInt(values[x]) || 0) + },0) const status_maxi = Math.max(status_gesamt, -5) - setAttrs({ status_gesamt, status_maxi }); }); }); -//global sheet:opened -on('sheet:opened', async() => { - const talentmodifiers = await updateTalentModifier(dsa5Module().dsa5.skills) - const armor = await calcArmor() - const translation = await prepareTranslation() - const leitwerte = await meleeweaponLeitwert() - const conditions = await changeCondition(dsa5Module().dsa5.conditions) - const range = await prepareRangeCombatskills(dsa5Module().dsa5.combatskills.range) - const update = { ...talentmodifiers, ...armor, ...translation, ...leitwerte, ...conditions, ...range} - setAttrs(update) -}) - // Talente dsa5Module().dsa5.skills.forEach(skill => { on(`change:${skill}_sf_mod change:${skill}_effekt_mod change:${skill}_be_akt change:${skill}_betaeubung_akt change:${skill}_furcht_akt change:${skill}_paralyse_akt change:${skill}_schmerz_akt change:${skill}_trance_akt change:${skill}_verwirrung_akt change:status_gesamt change:${skill}_entrueckung_akt change:${skill}_zusatz_akt`, async() => { - const update = await updateTalentModifier([skill]) + const update = await dsa5sheetFunctions.updateTalentModifier([skill]) setAttrs(update) }); }); - //Sonderfertigkeiten -dsa5Module().dsa5.modifiers.forEach(x => { - on(`change:repeating_sonderfertigkeit:sonderfertigkeit_auswahl${x}`, function (eventInfo) { - getAttrs([`repeating_sonderfertigkeit_sonderfertigkeit_auswahl${x}`, `repeating_sonderfertigkeit_sonderfertigkeit_mod${x}`, `repeating_sonderfertigkeit_sonderfertigkeit_auswahl_vorher${x}`, "repeating_sonderfertigkeit_sonderfertigkeit_aktiviert"], function (v) { - const aktiviert = parseInt(v.repeating_sonderfertigkeit_sonderfertigkeit_aktiviert); - const update = {}; - const auswahl = v[`repeating_sonderfertigkeit_sonderfertigkeit_auswahl${x}`]; - const wert = parseInt(v[`repeating_sonderfertigkeit_sonderfertigkeit_mod${x}`]); - const auswahl_v = v[`repeating_sonderfertigkeit_sonderfertigkeit_auswahl_vorher${x}`]; - if (aktiviert == 1) { - if (auswahl != auswahl_v) { - change_modifier(auswahl_v, 0, wert); - change_modifier(auswahl, wert, 0); - } - } - update[`repeating_sonderfertigkeit_sonderfertigkeit_auswahl_vorher${x}`] = auswahl - setAttrs(update); - }); - }); -}) - -dsa5Module().dsa5.modifiers.forEach(x => { - on(`change:repeating_sonderfertigkeit:sonderfertigkeit_mod${x}`, function (eventInfo) { - getAttrs([`repeating_sonderfertigkeit_sonderfertigkeit_auswahl${x}`, `repeating_sonderfertigkeit_sonderfertigkeit_mod${x}`, `repeating_sonderfertigkeit_sonderfertigkeit_mod_vorher${x}`, "repeating_sonderfertigkeit_sonderfertigkeit_aktiviert"], function (v) { - const aktiviert = parseInt(v.repeating_sonderfertigkeit_sonderfertigkeit_aktiviert); - const update = {}; - const auswahl = v[`repeating_sonderfertigkeit_sonderfertigkeit_auswahl${x}`]; - const wert_neu = parseInt(v[`repeating_sonderfertigkeit_sonderfertigkeit_mod${x}`]); - const wert_alt = parseInt(v[`repeating_sonderfertigkeit_sonderfertigkeit_mod_vorher${x}`]); - - if (aktiviert == 1) change_modifier(auswahl, wert_neu, wert_alt); - - update[`repeating_sonderfertigkeit_sonderfertigkeit_mod_vorher${x}`] = wert_neu; - setAttrs(update); - }); - }); -}) - - -on("change:repeating_sonderfertigkeit:sonderfertigkeit_aktiviert", function (eventInfo) { - const attrs = ["repeating_sonderfertigkeit_sonderfertigkeit_aktiviert"] - dsa5Module().dsa5.modifiers.forEach(x => { - attrs.push(`repeating_sonderfertigkeit_sonderfertigkeit_auswahl${x}`, `repeating_sonderfertigkeit_sonderfertigkeit_mod${x}`) - }) - getAttrs(attrs, function (v) { - const aktiviert = parseInt(v.repeating_sonderfertigkeit_sonderfertigkeit_aktiviert); - - dsa5Module().dsa5.modifiers.forEach(x => { - const auswahl = v[`repeating_sonderfertigkeit_sonderfertigkeit_auswahl${x}`]; - const wert = parseInt(v[`repeating_sonderfertigkeit_sonderfertigkeit_mod${x}`]); - - if (aktiviert == 1) change_modifier(auswahl, wert, 0); - else change_modifier(auswahl, 0, wert); - }) - }); -}); - - -on("remove:repeating_sonderfertigkeit", function (eventInfo) { - let rid = eventInfo.sourceAttribute; - let aktiviert = parseInt(eventInfo.removedInfo[rid + "_sonderfertigkeit_aktiviert"]); - - if (aktiviert == 1) { - dsa5Module().dsa5.modifiers.forEach(x => { - const auswahl = eventInfo.removedInfo[rid + `_sonderfertigkeit_auswahl${x}`]; - const wert = parseInt(eventInfo.removedInfo[rid + `_sonderfertigkeit_mod${x}`]); - - change_modifier(auswahl, 0, wert); - }) - } -}); - //Effekte -dsa5Module().dsa5.modifiers.forEach(x => { - on(`change:repeating_effekt:effekt_auswahl${x}`, function (eventInfo) { - getAttrs([`repeating_effekt_effekt_auswahl${x}`, `repeating_effekt_effekt_mod${x}`, `repeating_effekt_effekt_auswahl_vorher${x}`, "repeating_effekt_effekt_aktiviert"], function (v) { - const aktiviert = parseInt(v.repeating_effekt_effekt_aktiviert); - const update = {}; - const auswahl = v[`repeating_effekt_effekt_auswahl${x}`]; - const wert = parseInt(v[`repeating_effekt_effekt_mod${x}`]); - const auswahl_v = v[`repeating_effekt_effekt_auswahl_vorher${x}`]; - if (aktiviert == 1) { - // ist aktiviert - if (auswahl != auswahl_v) { - change_modifier(auswahl_v, 0, wert); - change_modifier(auswahl, wert, 0); - } - } - update[`repeating_effekt_effekt_auswahl_vorher${x}`] = auswahl; - setAttrs(update); - }); - }); -}) - - -dsa5Module().dsa5.modifiers.forEach(x => { - on(`change:repeating_effekt:effekt_mod${x}`, function (eventInfo) { - getAttrs([`repeating_effekt_effekt_auswahl${x}`, `repeating_effekt_effekt_mod${x}`, `repeating_effekt_effekt_mod_vorher${x}`, "repeating_effekt_effekt_aktiviert"], function (v) { - const aktiviert = parseInt(v.repeating_effekt_effekt_aktiviert); - const update = {}; - const auswahl = v[`repeating_effekt_effekt_auswahl${x}`]; - const wert_neu = parseInt(v[`repeating_effekt_effekt_mod${x}`]); - const wert_alt = parseInt(v[`repeating_effekt_effekt_mod_vorher${x}`]); - - if (aktiviert == 1) change_modifier(auswahl, wert_neu, wert_alt); - - update[`repeating_effekt_effekt_mod_vorher${x}`] = wert_neu; - setAttrs(update); - }); - }); -}) - - -on("change:repeating_effekt:effekt_aktiviert", function (eventInfo) { - const attrs = ["repeating_effekt_effekt_aktiviert"] - dsa5Module().dsa5.modifiers.forEach(x => { - attrs.push(`repeating_effekt_effekt_auswahl${x}`, `repeating_effekt_effekt_mod${x}`) - }) - getAttrs(attrs, function (v) { - const aktiviert = parseInt(v.repeating_effekt_effekt_aktiviert); - - dsa5Module().dsa5.modifiers.forEach(x => { - const auswahl = v[`repeating_effekt_effekt_auswahl${x}`]; - const wert = parseInt(v[`repeating_effekt_effekt_mod${x}`]); - - if (aktiviert == 1) change_modifier(auswahl, wert, 0); - else change_modifier(auswahl, 0, wert); - }) - }); +on(`remove:repeating_sonderfertigkeit change:repeating_sonderfertigkeit:sonderfertigkeit_aktiviert remove:repeating_effekt change:repeating_effekt:effekt_aktiviert ${dsa5Module().dsa5.modifiers.map(x => `change:repeating_effekt:effekt_auswahl${x} change:repeating_effekt:effekt_mod${x}`).join(" ")} ${dsa5Module().dsa5.modifiers.map(x => `change:repeating_sonderfertigkeit:sonderfertigkeit_auswahl${x} change:repeating_sonderfertigkeit:sonderfertigkeit_mod${x}`).join(" ")}`, async () => { + await dsa5sheetFunctions.change_modifierV2(); }); - -on("remove:repeating_effekt", function (eventInfo) { - const rid = eventInfo.sourceAttribute; - const aktiviert = parseInt(eventInfo.removedInfo[rid + "_effekt_aktiviert"]); - console.log(eventInfo.removedInfo) - if (aktiviert == 1) { - dsa5Module().dsa5.modifiers.forEach(x => { - const auswahl = eventInfo.removedInfo[rid + `_effekt_auswahl${x}`]; - const wert = parseInt(eventInfo.removedInfo[rid + `_effekt_mod${x}`]); - change_modifier(auswahl, 0, wert); - }) - } -}); - -const prepareRangeCombatskills = async(skills) => { - let attrs = ["fingerfertigkeit_gesamt", "ktw_change_flag"] - for(let skill of skills){ - attrs.push(skill, `ktw_${skill}`) - } - const values = await dsa5helpers.getAttrsAsync(attrs) - const ktw_change_flag = parseInt(values.ktw_change_flag) * -1; - let update = { ktw_change_flag: ktw_change_flag } - for (let skill of skills) { - const ktw = parseInt(values[`ktw_${skill}`]); - const leiteigenschaft = parseInt(values.fingerfertigkeit_gesamt); - const at = ktw + Math.floor((leiteigenschaft - 8) / 3); - update[`at_${skill}`] = at - } - return update -} // Kampf dsa5Module().dsa5.combatskills.range.forEach(skill => { - on(`change:${skill} change:ktw_${skill} change:fingerfertigkeit_gesamt`, async function () { - const update = await prepareRangeCombatskills([skill]) + on(`change:${skill} change:ktw_${skill} change:fingerfertigkeit_gesamt`, async () => { + const update = await dsa5sheetFunctions.prepareRangeCombatskills([skill]) setAttrs(update) }); }); dsa5Module().dsa5.combatskills.melee.forEach(skill => { - on(`change:${skill} change:ktw_${skill} change:mut_gesamt change:gewandheit_gesamt change:koerperkraft_gesamt sheet:opened`, function () { - getAttrs([skill, `ktw_${skill}`, "mut_gesamt", "gewandheit_gesamt", "koerperkraft_gesamt", "ktw_change_flag"], function (values) { - let leiteigenschaft_selector = values[skill]; - let ktw = parseInt(values[`ktw_${skill}`]); - let mut_gesamt = parseInt(values.mut_gesamt); - - switch (leiteigenschaft_selector) { - case "KK": - leiteigenschaft = parseInt(values.koerperkraft_gesamt); - break; - case "GE": - leiteigenschaft = parseInt(values.gewandheit_gesamt); - break; - case "GE/KK": - leiteigenschaft = Math.max(parseInt(values.gewandheit_gesamt), parseInt(values.koerperkraft_gesamt)); - break - default: - leiteigenschaft = 0; - break; - } - let at = ktw + Math.floor((mut_gesamt - 8) / 3); - let pa = Math.round(ktw / 2) + Math.floor((leiteigenschaft - 8) / 3); - let ktw_change_flag = parseInt(values.ktw_change_flag) * -1; - let update = { ktw_change_flag: ktw_change_flag } - update[`at_${skill}`] = at - switch (skill) { - case "kettenwaffen": - case "lanzen": - break; - default: - update[`pa_${skill}`] = pa; - } - setAttrs(update); - }); + on(`change:${skill} change:ktw_${skill} change:mut_gesamt change:gewandheit_gesamt change:koerperkraft_gesamt`, async() => { + const update = await dsa5sheetFunctions.calcCombatskill([skill]) + setAttrs(update) }); }); -on("change:sicht_mod_nk change:gegnerrw change:gegner_hinten change:gegner_kt change:blutrausch change:liegend change:vorteilhafte_position change:kampf_im_wasser sheet:opened", function () { - getAttrs(["sicht_mod_nk", "gegnerrw", "gegner_hinten", "gegner_kt", "blutrausch", "liegend", "vorteilhafte_position", "kampf_im_wasser"], function (values) { - let sicht_mod_nk = parseInt(values.sicht_mod_nk) || 0; - let gegnerrw = parseInt(values.gegnerrw) || 0; - let gegner_kt = parseInt(values.gegner_kt) || 0; - let blutrausch = parseInt(values.blutrausch) || 0; - // eingeengt --- Waffenabhängige Auswirkung - let vorteilhafte_position = 0 - let gegner_hinten = 0; - let liegend = 0; - let tp_situation_mod = 0; - if ((parseInt(values.vorteilhafte_position) || 0) == 1) { vorteilhafte_position = 2; }; - if ((parseInt(values.gegner_hinten) || 0) == 1) { gegner_hinten = -4; }; - if ((parseInt(values.liegend) || 0) == 1) { liegend = -2; }; - if ((parseInt(values.blutrausch) || 0) == 1) { blutrausch = 4; tp_situation_mod = 2; }; - let kampf_im_wasser = parseInt(values.kampf_im_wasser) || 0; - let at_situation_mod = sicht_mod_nk + gegnerrw + vorteilhafte_position + kampf_im_wasser + (liegend * 2) + blutrausch; - let pa_situation_mod = sicht_mod_nk + vorteilhafte_position + kampf_im_wasser + liegend + gegner_hinten + gegner_kt; - - setAttrs({ - at_situation_mod: at_situation_mod, - pa_situation_mod: pa_situation_mod, - tp_situation_mod: tp_situation_mod - }); - }); +on("change:sicht_mod_nk change:gegnerrw change:gegner_hinten change:gegner_kt change:blutrausch change:liegend change:vorteilhafte_position change:kampf_im_wasser", async () => { + const update = await dsa5sheetFunctions.calcMeleeMod() + setAttrs(update) }); -on("sheet:opened change:distanz_mod change:groesse_mod change:sicht_mod change:ziel_bewegung_mod change:schuetze_bewegung_mod change:kampfgetuemmel_mod change:fk_sf_mod change:tp_sf_mod", function () { - getAttrs(["distanz_mod", "groesse_mod", "sicht_mod", "ziel_bewegung_mod", "schuetze_bewegung_mod", "kampfgetuemmel_mod", "fk_sf_mod", "tp_sf_mod"], function (values) { - let distanz_mod = parseInt(values.distanz_mod) || 0; - let groesse_mod = parseInt(values.groesse_mod) || 0; - let sicht_mod = parseInt(values.sicht_mod) || 0; - let ziel_bewegung_mod = parseInt(values.ziel_bewegung_mod) || 0; - let schuetze_bewegung_mod = parseInt(values.schuetze_bewegung_mod) || 0; - let kampfgetuemmel_mod = parseInt(values.kampfgetuemmel_mod) || 0; - let fk_sf_mod = parseInt(values.fk_sf_mod) || 0; - let tp_sf_mod = parseInt(values.tp_sf_mod) || 0; - let distanz_fk_mod = distanz_mod * 2; - let distanz_tp_mod = distanz_mod; - let groesse_fk_mod = groesse_mod * 4; - let groesse_tp_mod = 0; - let sicht_fk_mod = sicht_mod * 2; - let sicht_tp_mod = 0; - let ziel_bewegung_fk_mod = ziel_bewegung_mod * 2; - let ziel_bewegung_tp_mod = 0; - let schuetze_bewegung_fk_mod = schuetze_bewegung_mod * 2; - let schuetze_bewegung_tp_mod = 0; - let kampfgetuemmel_fk_mod = -2 * kampfgetuemmel_mod; - let gesamt_fk_mod = distanz_fk_mod + groesse_fk_mod + sicht_fk_mod + ziel_bewegung_fk_mod + schuetze_bewegung_fk_mod + kampfgetuemmel_fk_mod + fk_sf_mod; - let gesamt_tp_mod = distanz_tp_mod + groesse_tp_mod + sicht_tp_mod + ziel_bewegung_tp_mod + schuetze_bewegung_tp_mod + tp_sf_mod; - - setAttrs({ - distanz_fk_mod: distanz_fk_mod, - distanz_tp_mod: distanz_tp_mod, - groesse_fk_mod: groesse_fk_mod, - groesse_tp_mod: groesse_tp_mod, - sicht_fk_mod: sicht_fk_mod, - sicht_tp_mod: sicht_tp_mod, - ziel_bewegung_fk_mod: ziel_bewegung_fk_mod, - ziel_bewegung_tp_mod: ziel_bewegung_tp_mod, - schuetze_bewegung_fk_mod: schuetze_bewegung_fk_mod, - schuetze_bewegung_tp_mod: schuetze_bewegung_tp_mod, - kampfgetuemmel_fk_mod: kampfgetuemmel_fk_mod, - gesamt_fk_mod: gesamt_fk_mod, - gesamt_tp_mod: gesamt_tp_mod - }); - }); +on("change:distanz_mod change:groesse_mod change:sicht_mod change:ziel_bewegung_mod change:schuetze_bewegung_mod change:kampfgetuemmel_mod change:fk_sf_mod change:tp_sf_mod", async () => { + const update = await dsa5sheetFunctions.calcDistanzMod() + setAttrs(update) }); - -on("sheet:opened change:zauberdauer_mod change:geste_mod change:reichweite_mod change:formel_mod change:kosten_mod change:fremdtradition_mod change:ritualplatz_mod change:aufrechterhaltung_mod change:zeit_mod change:kleidung_mod change:magie_entrueckung_akt change:geraetschaften_mod change:magie_sf_mod change:magie_effekt_mod change:status_gesamt change:entrueckung_gesamt", function () { - getAttrs(["zauberdauer_mod", "geste_mod", "reichweite_mod", "formel_mod", "kosten_mod", "fremdtradition_mod", "ritualplatz_mod", "aufrechterhaltung_mod", "zeit_mod", "kleidung_mod", "magie_entrueckung_akt", "geraetschaften_mod", "magie_sf_mod", "magie_effekt_mod", "status_gesamt", "entrueckung_gesamt", "belastung_gesamt"], function (values) { - - const magie_mod_summe = parseInt(values.zauberdauer_mod || 0) - + parseInt(values.geste_mod || 0) - + parseInt(values.reichweite_mod || 0) - + parseInt(values.formel_mod || 0) - + parseInt(values.kosten_mod || 0) - + parseInt(values.fremdtradition_mod || 0) - + parseInt(values.ritualplatz_mod || 0) - + (-1 * parseInt(values.aufrechterhaltung_mod || 0)) - + parseInt(values.zeit_mod || 0) - + parseInt(values.kleidung_mod || 0) - + parseInt(values.geraetschaften_mod || 0); - const entrueckung_modifier = getEntruecktModifier(values.magie_entrueckung_akt, parseInt(values.entrueckung_gesamt || 0)); - const status_modifier = Math.max(-5, parseInt(values.status_gesamt || 0) + parseInt(values.entrueckung_gesamt || 0) + entrueckung_modifier + parseInt(values.belastung_gesamt)); - const magie_mod_gesamt = magie_mod_summe + status_modifier; - - setAttrs({ - magie_mod_summe, - magie_mod_gesamt, - status_modifier_magie: status_modifier - }); - }); +on("change:zauberdauer_mod change:geste_mod change:reichweite_mod change:formel_mod change:kosten_mod change:fremdtradition_mod change:ritualplatz_mod change:aufrechterhaltung_mod change:zeit_mod change:kleidung_mod change:magie_entrueckung_akt change:geraetschaften_mod change:magie_sf_mod change:magie_effekt_mod change:status_gesamt change:entrueckung_gesamt", () => { + dsa5sheetFunctions.calcMagieMod() }); -on("sheet:opened change:liturgiedauer_mod change:geste_mod change:reichweite_mod change:formel_mod change:kosten_mod change:fremdtradition_mod change:ritualplatz_mod change:aufrechterhaltung_mod change:zeit_mod change:kleidung_mod change:glaube_entrueckung_akt change:geraetschaften_mod change:glaube_sf_mod change:glaube_effekt_mod change:status_gesamt change:entrueckung_gesamt", function () { - getAttrs(["liturgiedauer_mod", "geste_mod", "reichweite_mod", "formel_mod", "kosten_mod", "fremdtradition_mod", "ritualplatz_mod", "aufrechterhaltung_mod", "zeit_mod", "kleidung_mod", "glaube_entrueckung_akt", "geraetschaften_mod", "glaube_sf_mod", "glaube_effekt_mod", "status_gesamt", "entrueckung_gesamt", "belastung_gesamt"], function (values) { - - const glaube_mod_summe = parseInt(values.liturgiedauer_mod || 0) - + parseInt(values.geste_mod || 0) - + parseInt(values.reichweite_mod || 0) - + parseInt(values.formel_mod || 0) - + parseInt(values.kosten_mod || 0) - + parseInt(values.fremdtradition_mod || 0) - + parseInt(values.ritualplatz_mod || 0) - + (-1 * parseInt(values.aufrechterhaltung_mod || 0)) - + parseInt(values.zeit_mod || 0) - + parseInt(values.kleidung_mod || 0) - + parseInt(values.geraetschaften_mod || 0); - const entrueckung_modifier = getEntruecktModifier(values.glaube_entrueckung_akt, parseInt(values.entrueckung_gesamt || 0)); - const status_modifier = Math.max(-5, parseInt(values.status_gesamt || 0) + parseInt(values.entrueckung_gesamt || 0) + entrueckung_modifier + parseInt(values.belastung_gesamt)); - const glaube_mod_gesamt = glaube_mod_summe + status_modifier; - - setAttrs({ - glaube_mod_summe, - glaube_mod_gesamt, - status_modifier_glaube: status_modifier - }); - }); +on("change:liturgiedauer_mod change:geste_mod change:reichweite_mod change:formel_mod change:kosten_mod change:fremdtradition_mod change:ritualplatz_mod change:aufrechterhaltung_mod change:zeit_mod change:kleidung_mod change:glaube_entrueckung_akt change:geraetschaften_mod change:glaube_sf_mod change:glaube_effekt_mod change:status_gesamt change:entrueckung_gesamt", () => { + dsa5sheetFunctions.calcGlaubeMod() }); - -// Initiative , ini_grundwert: ini_grundwert, ini_modifikator: ini_modifikator - -on("sheet:opened change:ini_grundwert change:mut_gesamt change:gewandheit_gesamt change:belastung_gesamt change:ini_modifikator change:ini_be_modifikator", function () { - getAttrs(["toggle_npc", "mut_gesamt", "gewandheit_gesamt", "ini_grundwert", "ini_modifikator", "belastung_gesamt", "ini_be_modifikator"], function (values) { - const toggle_npc = values.toggle_npc; - const ini_modifikator = parseInt(values.ini_modifikator) || 0; - const ini_basiswert = Math.round((parseInt(values.mut_gesamt) + parseInt(values.gewandheit_gesamt)) / 2); - const ini_be_modifikator = parseInt(values.ini_be_modifikator) || 0; - const belastung_gesamt = parseInt(values.belastung_gesamt) || 0; - const ini_grundwert = toggle_npc == 'character' ? ini_basiswert : (parseInt(values.ini_grundwert) || 0); - - const ini_gesamt = ini_grundwert + ini_modifikator + ini_be_modifikator - belastung_gesamt; - console.log("DSA5 - calc ini toggle " + toggle_npc + " ini_mod " + ini_modifikator + " grundwert " + ini_grundwert + " ini_basiswert " + ini_basiswert + " ini_be_modifikator " + ini_be_modifikator + " belastung_gesamt " + belastung_gesamt); - setAttrs({ - ini_gesamt, - ini_grundwert - }); - }); -}); - -// NPC-Import button// NPC-Import button -on("clicked:importnpc", function () { - getAttrs(["npc_import"], function (values) { - - console.log("DSA5 - Import Trigger"); - let endtoken = 'ENDTOKEN'; - // strip : - let input = values.npc_import.replace(/:/g, '') + endtoken; - //Keywords to look for - let keywords = ["groesse", "gewicht", "MU", "KL", "IN", "CH", "FF", "GE", "KO", "KK", "lep", "asp", "kap", "INI", "VW", "sk", "zk", "gs", "RS/BE", "aktionen", "sonderfertigkeiten", "talente", "zauber", "gkategorie", "typus", "anrufungsschwierigkeit", "beute", "kampfverhalten", "flucht", "jagd", "schmerzplus1", "sonderregeln", "anzahl", "ENDTOKEN"]; - //array for the results - let multi = []; - - keywords.forEach(function (key, index, keywords) { - let translatedKey = getTranslationByKey(key); - let newArray = []; - newArray[0] = translatedKey; //add keyword - newArray[1] = index; //add keyword index - newArray[2] = input.search(translatedKey); //add position in text - newArray[3] = ''; //result value - multi[index] = newArray; - console.log(key + " " + translatedKey); - //console.log(multi[index][0]+" inloop "+multi[index][1]); - }); - - // sort by position - multi.sort(function (a, b) { - let valueA, valueB; - valueA = a[2]; // Where 1 is your index, from your example - valueB = b[2]; - if (valueA < valueB) { - return -1; - } else if (valueA > valueB) { - return 1; - } - return 0; - }); - - // now extract all other elements - multi.forEach(function (key, index, multi) { - let start = multi[index][2]; - if (start == -1) { multi[index][3] = '' } else { - if (multi[index][0] == endtoken) { - //do nothing - } else { - let next = multi[index + 1][2]; - multi[index][3] = input.substring(start + multi[index][0].length, next).trim(); - //console.log(key+" inloop "+(start+multi[index][0].length)+" "+next+" "+multi[index][3]); - } - } - }); - - // sort back in keyword order - multi.sort(function (a, b) { - let valueA, valueB; - // 1 is the index to sort - valueA = a[1]; - valueB = b[1]; - if (valueA < valueB) { - return -1; - } else if (valueA > valueB) { - return 1; - } - return 0; - }); - - //do the output - multi.forEach(function (row, index, multi) { console.log(multi[index][0] + ' ' + multi[index][3]); }); - - setAttrs({ - toggle_npc: 'npc', - groesse: multi[0][3], - gewicht: multi[1][3], - mut: parseInt(multi[2][3]) || 8, - klugheit: parseInt(multi[3][3]) || 8, - intuition: parseInt(multi[4][3]) || 8, - charisma: parseInt(multi[5][3]) || 8, - fingerfertigkeit: parseInt(multi[6][3]) || 8, - gewandheit: parseInt(multi[7][3]) || 8, - konstitution: parseInt(multi[8][3]) || 8, - koerperkraft: parseInt(multi[9][3]) || 8, - le: parseInt(multi[10][3]) || 0, - le_max: parseInt(multi[10][3]) || 0, - ae: parseInt(multi[11][3]) || 0, - ae_max: parseInt(multi[11][3]) || 0, - ke: parseInt(multi[12][3]) || 0, - ke_max: parseInt(multi[12][3]) || 0, - ini_grundwert: parseInt(multi[13][3]) || 0, - aw_grundwert: parseInt(multi[14][3]) || 0, - vw_grundwert: parseInt(multi[14][3]) || 0, - sk_grundwert: parseInt(multi[15][3]) || 0, - zk_grundwert: parseInt(multi[16][3]) || 0, - gs_grundwert: parseInt(multi[17][3]) || 0, - rs_grundwert: parseInt(multi[18][3]) || 0, - schips_grundwert: 0, - anz_angriffe: parseInt(multi[19][3]) || 1, - sonstiges: multi[20][3], - informationen: multi[21][3], - groessekategorie: multi[23][3], - typus: multi[24][3], - schwierigkeit: multi[25][3], - beute: multi[26][3], - kampfverhalten: multi[27][3], - flucht: multi[28][3], - jagd: multi[29][3], - sonderregeln: multi[31][3], - anzahl: multi[32][3] - }); - - }); +on("change:ini_grundwert change:mut_gesamt change:gewandheit_gesamt change:belastung_gesamt change:ini_modifikator change:ini_be_modifikator", () => { + dsa5sheetFunctions.calcInitiative() }); const dsa5drop = (() => { const meleeRanges = { @@ -16189,6 +16429,9 @@ on("clicked:importnpc", function () { case "advantage": case "disadvantage": case "specialability": + //Special ability fix, Refactor this at some point + drop_uniquename = drop_uniquename.replace("Special%20Ability", "Special%20ability") + update = handleAbility(parsed_data, drop_uniquename, last_id) if (switchTab) update["tab"] = 2 break diff --git a/Das Schwarze Auge (TDE) 5 OFFICIAL by Ulisses/sheet.json b/Das Schwarze Auge (TDE) 5 OFFICIAL by Ulisses/sheet.json index e64813ec98..25f4af0218 100644 --- a/Das Schwarze Auge (TDE) 5 OFFICIAL by Ulisses/sheet.json +++ b/Das Schwarze Auge (TDE) 5 OFFICIAL by Ulisses/sheet.json @@ -5,7 +5,6 @@ "roll20userid": "7913182", "preview": "preview.png", "compendium": "TDE", - "instructions": "This is the official \"Das Schwarze Auge 5.\" (The Dark Eye 5th) Roll20 character sheet by Ulisses Spiele\n* See **[Readme](https://github.com/Roll20/roll20-character-sheets/tree/master/Das%20Schwarze%20Auge%20(TDE)%205%20OFFICIAL%20by%20Ulisses/README.MD)** for more details.", - + "instructions": "### This is the official \"Das Schwarze Auge 5.\" (The Dark Eye 5th) Roll20 character sheet by Ulisses Spiele\nAventuria awaits, as TDE 5 is also available on Roll20.\nThe system includes relevant mechanisms to play in the wonderous world of Aventuria and The Dark Eye and create your own adventures, characters and stories.\n\nThe character sheet includes TDE compendium integration and allows you to add your advantages, disadvantages, cultures, professions, special skill, spells, liturgies, rituals and equipment as you see fit.\n\nSee README for more details.\n\n### Compendium Integration\nThis sheet provides integration for The Dark Eye Compendium\n\n### TSA Character Sheet Migration\nYou can seamlessly exchange the character sheet with the TSA character sheet. Make sure to create a backup of your world in advance.\n\n### Guide and Tutorials\nThe creation of a small Wiki is in progress. In the meantime users can find some Videos in VTToms and Hitdice's Youtube channel in German.\n\n### Feedback and Issues\nIf there is a problem with the character sheet or any compendium books, please check the issue section [Issues](https://github.com/Plushtoast/TDE-Roll20-Official/issues) and open a new issue for us with as much detail as possible.\n\nIf you want to discuss TDE for roll20 or need some assistance you can also join the Discord Servers:\n* [Ulisses Spiele GmbH](https://discord.gg/WXu4m8sc)", "legacy": false } \ No newline at end of file diff --git a/Das Schwarze Auge (TDE) 5 OFFICIAL by Ulisses/translation.json b/Das Schwarze Auge (TDE) 5 OFFICIAL by Ulisses/translation.json index c6a0fa9086..e139a985a9 100644 --- a/Das Schwarze Auge (TDE) 5 OFFICIAL by Ulisses/translation.json +++ b/Das Schwarze Auge (TDE) 5 OFFICIAL by Ulisses/translation.json @@ -1,5 +1,4 @@ { - "---": "---", "1/2": "1/2", "1-kategorie": "1 Kat.", @@ -96,6 +95,7 @@ "furcht": "Furcht", "fw": "FW", "fk-mod": "FK-Mod", + "faecher": "Fächer", "geburtsort": "Geburtsort", "geburtstag": "Tsatag", "gegner-von-hinten": "Gegner von Hinten", @@ -150,7 +150,7 @@ "professionspaket": "Professionspaket hinzufügen?", "kurz": "kurz", "lz": "LZ", - "ladezeit": "Ladezeit in KR", + "ladezeit": "Ladezeit (KR)", "lang": "lang", "lanzen": "Lanzen", "le": "LE", @@ -161,6 +161,7 @@ "leiteigenschaft": "Leiteigenschaft", "leiteigschadensb": "TP-Bonus", "liegend": "Liegend", + "MagieundGlaube": "Magie und Glaube", "magie": "Magie", "malus": "Malus", "max-5": "(max. -5) ", @@ -195,8 +196,8 @@ "pa": "PA", "pa-mod": "PA-Mod", "passierschlag": "Passierschlag", + "passierschlagShort": "P", "parade": "Parade", - "paralyse": "Paralyse", "patzer": "Patzer", "pechmagnet": "Pechmagnet", @@ -212,6 +213,7 @@ "riesig": "riesig", "rituale": "Rituale", "routineprobe": "Routineprobe", + "routineShort": "R", "rs-mod": "RS-Mod.", "rueckkauf": "Rückkauf", "ruestungen": "Rüstungen", @@ -457,6 +459,7 @@ "typ": "Typ", "modifikationen": "Modifikationen", "zauberdauer-in-aktionen": "Zauberdauer in Aktionen", + "zauberdauer": "Zauberdauer", "zaubermodifikationen": "Zaubermodifikationen", "geste-weglassen": "Geste weglassen", "formel-weglassen": "Formel weglassen", @@ -468,6 +471,7 @@ "zeit": "Zeit", "passende-kleidung": "Passende Kleidung", "geeignete-geraetschaften": "Geeignete Gerätschaften", + "peitschen": "Peitschen", "passend": "passend", "unpassend": "unpassend", "heiligtum-magischer-ort": "+1 | Heiligtum/Magischer Ort", @@ -548,6 +552,7 @@ "Selbst-verletzt": "Selbst verletzt", "Stolpern": "Stolpern", "Sturz": "Sturz", + "spiesswaffen": "Spießwaffen", "Verfolgung-durch-Mindergeister": "Verfolgung von Mindergeister", "Verlust-der-Sprache": "Verlust der Sprache", "Verwandlung-in-Kleintier": "Verwandlung in Kleintier", @@ -606,7 +611,7 @@ "keine": "keine", "status-liste": "bewegungsunfaehig,bewusstlos,blind,blutrausch,brennend,eingeengt,fixiert,handlungsunfaehig,krank,liegend,pechmagnet,raserei,stumm,taub,ueberrascht,uebler-geruch,unsichtbar,vergiftet,versteinert", "zustaende-liste": "belastung,betaeubung,entrueckung,furcht,paralyse,schmerz,trance,verwirrung", - "kampftalente-liste": "Armbrüste,Blasrohre,Bögen,Diskusse,Dolche,Fechtwaffen,Feuerspeien,Hiebwaffen,Kettenwaffen,Lanzen,Peitschen,Raufen,Schilde,Schleudern,Schwerter,Stangenwaffen,Wurfwaffen,Zweihandhiebwaffen,Zweihandschwerter", + "kampftalente-liste": "Armbrüste,Blasrohre,Bögen,Diskusse,Dolche,Faecher,Fechtwaffen,Feuerspeien,Hiebwaffen,Kettenwaffen,Lanzen,Peitschen,Raufen,Schilde,Schleudern,Schwerter,Spiesswaffen,Stangenwaffen,Wurfwaffen,Zweihandhiebwaffen,Zweihandschwerter", "koerpertalente-liste": "fliegen,gaukeleien,klettern,koerperbeherrschung,kraftakt,reiten,schwimmen,selbstbeherrschung,singen,sinnesschaerfe,tanzen,taschendiebstahl,verbergen,zechen", "gesellschaftstalente-liste": "bekehren,betoeren,einschuechtern,etikette,gassenwissen,menschenkenntnis,ueberreden,verkleiden,willenskraft", "naturtalente-liste": "faehrtensuchen,fesseln,fischen,orientierung,pflanzenkunde,tierkunde,wildnisleben", @@ -691,6 +696,7 @@ "Magie-TP": "Schaden aus Magie", "Glaube-TP": "Schaden aus Götterwirken", "mitspezialisierung": "Fertigkeitsspezialisierung", + "mitspezialisierungShort": "F", "d2": "W2", "d3": "W3", "d4": "W4",