From 1cb01d004dd05dfddcdb4378da00c2bfa367eb4a Mon Sep 17 00:00:00 2001 From: Kreuvf Date: Tue, 30 Apr 2019 00:25:56 +0200 Subject: [PATCH] [DSA4.1] Sheet Worker Scripts for Stats & Derived Stats, Gifts and Meta-Talents (#5016) * * Convert stats, derived stats, gifts and meta-talents to sheet worker scripts * * Add apehead to the authors * * Remove unused duplicate attributes of stats * * Fix calculation of wound threshold * * Use sheet worker scripts for wound threshold everywhere * Use sheet worker scripts for showing stats everywhere * * Add trailing newline to end of file * * Use more systematic attribute names for meta-talents * Name_Metatalent: internal name * Name_Metatalent_Anzeige: display name (derived from internal name or user-supplied) * Name_Metatalent_Eigen: user-supplied name for self-made meta-talents * Remove superfluous special experience column for meta-talents * Improve alignment of pseudo-columns of the repeating group for meta-talents * Ignore user-supplied meta-talent names for official meta-talents (instead of deleting them) * * Sort metatalents alphabetically * Use 2D array to store stats used for metatalents and display names * * Set default values for all variables of a custom meta-talent, so that rolling will always work * * Bump version number * * Restructure calculation of stats and derived stats * Allow speed (GS) to be calculated without mathematical tricks * Remove other mathematical tricks as well * Fix: Do no longer take temporary stat modifiers into account when calculating magic resistance, initiative, attack/parry/long range base values * Remove or adapt corresponding sections in formulas.md * * Convert gifts to sheet worker scripts (analogously to meta-talents) * Custom gifts not yet fully supported * * Keep gift stats when selecting "nothing" to prevent data loss * * Add new version field for the character sheet to be used in update/migration scripts * * Migration of gifts data from data version 20171014 to current * * Use a new name for the gifts repeating section * Use previous name for old data * Update scripts accordingly * Move old repeating section to new tab "Infos" * Inform users about the change(s) * Keep old repeating section so users do not lose any data and can manually fix errors introduced during automatic migration * * Prepare gifts section for custom gifts * * Fix: Propagate stats updates to gifts' stats * * Add old meta-talents repeating section to Infos tab to allow users to recover old data * Rename meta-talent repeating section to prevent name clash with old repeating section * * Make HTML a bit more valid * * Remove misleading and troubling attribute 'INI_max' * Restructure calculation of 'INIBasis2' to be independent of 'INI_max' * * Add migration for meta-talents * * Fix: Handle gift/meta-talent "TaW" not set Since this is the last commit regarding gifts/meta-talents: * Fixes kreuvf/roll20-character-sheets#1 * Fixes kreuvf/roll20-character-sheets#22 * Relates to kreuvf/roll20-character-sheets#28 * * Bump version number * * Give correct column for two-hand swords/sabres --- .../dsa4_1_character_sheet_roll20.css | 90 +- .../dsa4_1_character_sheet_roll20.html | 1311 ++++++++++++----- Das_Schwarze_Auge_4-1/formulas.md | 27 +- Das_Schwarze_Auge_4-1/sheet.json | 2 +- 4 files changed, 1043 insertions(+), 387 deletions(-) diff --git a/Das_Schwarze_Auge_4-1/dsa4_1_character_sheet_roll20.css b/Das_Schwarze_Auge_4-1/dsa4_1_character_sheet_roll20.css index 8026be9f07..3d7c9763b7 100644 --- a/Das_Schwarze_Auge_4-1/dsa4_1_character_sheet_roll20.css +++ b/Das_Schwarze_Auge_4-1/dsa4_1_character_sheet_roll20.css @@ -66,6 +66,10 @@ Confirmed Critical Failure: #b39797 (a red) display: none; } +.charsheet .sheet-section-info * { + text-align: left; +} + /* Headings */ .charsheet h1, .charsheet h2, @@ -150,6 +154,45 @@ input[type=number]::-webkit-outer-spin-button { font-weight: bold; } +.charsheet input[type="text"]:read-only, +.charsheet input[type="number"]:read-only { + background-color: #bf9e60; + border-style: solid; + border-color: #806940; + border-width: 0.1em; + font-weight: bold; +} + +.charsheet input[type="number"]:-moz-read-only { + background-color: #bf9e60; + border-style: solid; + border-color: #806940; + border-width: 0.1em; + font-weight: bold; +} + +.charsheet input[type="text"]:-moz-read-only { + background-color: #bf9e60; + border-style: solid; + border-color: #806940; + border-width: 0.1em; + font-weight: bold; +} + +/* Selectable text has to go into */ +.charsheet input[type="text"].sheet-selectable-text { + background-color: inherit; + border: none; + color: inherit; + font-family: inherit; + font-size: inherit; + font-weight: inherit; + padding-left: 0; + padding-right: 0; + padding-top: inherit; + padding-bottom: inherit; +} + .charsheet .sheet-activation-items input[type="checkbox"] { margin: 0.1em 0.3em 0.1em 0em; } @@ -227,6 +270,28 @@ The solution: convert the s to type="text" and make them look like normal vertical-align: bottom; } +.charsheet input[type="text"]:read-only.sheet-stat-immutable { + background-color: #e6be74; + border-style: hidden; + box-shadow: none; + cursor: auto; + font-family: serif; + padding: 0; + width: 2.5em; + vertical-align: bottom; +} + +.charsheet input[type="text"]:-moz-read-only.sheet-stat-immutable { + background-color: #e6be74; + border-style: hidden; + box-shadow: none; + cursor: auto; + font-family: serif; + padding: 0; + width: 2.5em; + vertical-align: bottom; +} + .charsheet input[type="text"]:disabled.sheet-stat-immutable-version { width: 7em; } @@ -236,9 +301,25 @@ The solution: convert the s to type="text" and make them look like normal text-align: left; } +.charsheet th > input[type="text"]:read-only.sheet-stat-immutable { + text-align: left; +} + +.charsheet th > input[type="text"]:-moz-read-only.sheet-stat-immutable { + text-align: left; +} + /* Align text right to match other table cells */ .charsheet td > input[type="text"]:disabled.sheet-stat-immutable { - text-align: right; + text-align: center; +} + +.charsheet td > input[type="text"]:read-only.sheet-stat-immutable { + text-align: center; +} + +.charsheet td > input[type="text"]:-moz-read-only.sheet-stat-immutable { + text-align: center; } /* Style draggable UI buttons */ @@ -460,7 +541,8 @@ The solution: convert the s to type="text" and make them look like normal .charsheet input.sheet-tab83:checked ~ div.sheet-section-Orte, .charsheet input.sheet-tab10:checked ~ div.sheet-section-config, .charsheet input.sheet-tab101:checked ~ div.sheet-section-config1, -.charsheet input.sheet-tab102:checked ~ div.sheet-section-config2 { +.charsheet input.sheet-tab102:checked ~ div.sheet-section-config2, +.charsheet input.sheet-tab11:checked ~ div.sheet-section-info { border-color: #806940; border-style: solid; border-width: 0.2em 0 0.2em 0; @@ -529,7 +611,8 @@ The solution: convert the s to type="text" and make them look like normal .charsheet input.sheet-tab99:checked + span.sheet-tab99, .charsheet input.sheet-tab10:checked + span.sheet-tab10, .charsheet input.sheet-tab101:checked + span.sheet-tab101, -.charsheet input.sheet-tab102:checked + span.sheet-tab102 { +.charsheet input.sheet-tab102:checked + span.sheet-tab102, +.charsheet input.sheet-tab11:checked + span.sheet-tab11 { background-color: #bf9e60; border-color: #806940; color: #000000; @@ -1485,4 +1568,3 @@ The solution: convert the s to type="text" and make them look like normal font-weight: inherit; color: #000000; } - diff --git a/Das_Schwarze_Auge_4-1/dsa4_1_character_sheet_roll20.html b/Das_Schwarze_Auge_4-1/dsa4_1_character_sheet_roll20.html index 89dc19aef9..7a0ee99c0f 100644 --- a/Das_Schwarze_Auge_4-1/dsa4_1_character_sheet_roll20.html +++ b/Das_Schwarze_Auge_4-1/dsa4_1_character_sheet_roll20.html @@ -31,6 +31,9 @@ Konfiguration + + Infos +
@@ -130,55 +133,55 @@ - + - + - + - + - + - + - + - + - +
Geschwindigkeit  
@@ -194,90 +197,89 @@ Aktuell Lebensenergie - - - - + + + + Ausdauer - - - - + + + + - Erschöpfung - - - - + Erschöpfung + + + + - Überanstrengung + Überanstrengung     - - + + Astralenergie - - - - + + + + Karmaenergie - - - - + + + Magieresistenz - + - +   INI-Basiswert - - - + +   AT-Basiswert - +     PA-Basiswert - +     FK-Basiswert - +     Wundschwelle - +     @@ -300,7 +302,7 @@ Verfügbar - + @@ -344,7 +346,7 @@ - + @@ -407,10 +409,10 @@
Kreuzer @@ -426,10 +428,10 @@ @@ -447,10 +449,10 @@
Dirham @@ -462,10 +464,10 @@ @@ -481,10 +483,10 @@ @@ -496,10 +498,10 @@ @@ -511,10 +513,10 @@ @@ -530,10 +532,10 @@ @@ -549,10 +551,10 @@ @@ -568,10 +570,10 @@ @@ -585,10 +587,10 @@ @@ -598,10 +600,10 @@
Tragkraft in U: Tragkraft in U: Last in U: Behinderung aus Last:
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -633,15 +635,15 @@
- - - - - - - - - + + + + + + + + +
MU: KL: IN: CH: FF: GE: KO: KK: BE: MU: KL: IN: CH: FF: GE: KO: KK: BE:

@@ -674,8 +676,8 @@
C
BE−5
- - + +
@@ -685,8 +687,8 @@
D
-
- - + +
@@ -696,8 +698,8 @@
D
BE−5
- - + +
@@ -707,8 +709,8 @@
E
BE−3
- - + +
@@ -718,8 +720,8 @@
D
BE−2
- - + +
@@ -806,8 +808,8 @@
E
BE−1
- - + +
@@ -850,8 +852,8 @@
E
BE−2
- - + +
@@ -894,8 +896,8 @@
D
BE−2
- - + +
@@ -905,8 +907,8 @@
C
BE−3
- - + +
@@ -916,8 +918,8 @@
C
BE−2
- - + +
@@ -946,7 +948,7 @@
Zweihandschwerter/-säbel
-
D
+
E
BE−2
@@ -3587,7 +3589,7 @@
- +
@@ -3595,7 +3597,7 @@
- +
@@ -3603,7 +3605,7 @@
- +
@@ -3611,7 +3613,7 @@
- +
@@ -3619,7 +3621,7 @@
- +
@@ -3627,7 +3629,7 @@
- +
@@ -3635,7 +3637,7 @@
- +
@@ -3643,7 +3645,7 @@
- +
@@ -3651,7 +3653,7 @@
- +
@@ -3659,7 +3661,7 @@
- +
@@ -3667,7 +3669,7 @@
- +
@@ -3675,7 +3677,7 @@
- +
@@ -3683,7 +3685,7 @@
- +
@@ -3691,7 +3693,7 @@
- +
@@ -3699,7 +3701,7 @@
- +
@@ -3707,7 +3709,7 @@
- +
@@ -3715,7 +3717,7 @@
- +
@@ -3723,7 +3725,7 @@
- +
@@ -3731,7 +3733,7 @@
- +
@@ -3739,7 +3741,7 @@
- +
@@ -3747,7 +3749,7 @@
- +
@@ -3755,7 +3757,7 @@
- +
@@ -3763,7 +3765,7 @@
- +
@@ -3771,7 +3773,7 @@
- +
@@ -3779,7 +3781,7 @@
- +
@@ -3787,7 +3789,7 @@
- +
@@ -3795,7 +3797,7 @@
- +
@@ -3803,7 +3805,7 @@
- +
@@ -3811,7 +3813,7 @@
- +
@@ -3819,7 +3821,7 @@
- +
@@ -3827,7 +3829,7 @@
- +
@@ -3835,7 +3837,7 @@
- +
@@ -3843,7 +3845,7 @@
- +
@@ -3851,7 +3853,7 @@
- +
@@ -3859,7 +3861,7 @@
- +
@@ -3867,7 +3869,7 @@
- +
@@ -3875,7 +3877,7 @@
- +
@@ -3960,7 +3962,7 @@
- +
@@ -3968,7 +3970,7 @@
- +
@@ -3976,7 +3978,7 @@
- +
@@ -3984,7 +3986,7 @@
- +
@@ -3992,7 +3994,7 @@
- +
@@ -4000,7 +4002,7 @@
- +
@@ -4008,7 +4010,7 @@
- +
@@ -4016,7 +4018,7 @@
- +
@@ -4024,7 +4026,7 @@
- +
@@ -4032,7 +4034,7 @@
- +
@@ -4040,7 +4042,7 @@
- +
@@ -4048,7 +4050,7 @@
- +
@@ -4056,7 +4058,7 @@
- +
@@ -4064,7 +4066,7 @@
- +
@@ -4072,7 +4074,7 @@
- +
@@ -4080,7 +4082,7 @@
- +
@@ -4088,7 +4090,7 @@
- +
@@ -4096,7 +4098,7 @@
- +
@@ -4104,7 +4106,7 @@
- +
@@ -4112,7 +4114,7 @@
- +
@@ -4120,7 +4122,7 @@
- +
@@ -4128,7 +4130,7 @@
- +
@@ -4136,7 +4138,7 @@
- +
@@ -6194,60 +6196,72 @@ -
SE - Talent - Eigenschaften - TaW - Probe -
-
- - - - - - - + + + + + + + + +
Gabe + Zusatz/Eigene GabeEigenschaftenTaWProbe
+
+ + + + + + + + + + + + + + + +
@@ -6256,60 +6270,72 @@ -
SE - Talent - Eigenschaften - TaW - Probe -
-
- - - - - - - + + + + + + + +
TalentEigenschaftenTaWProbe
+
+ + + / + + + + + + + + + + + + + +
@@ -6326,15 +6352,15 @@
- - - - - - - - - + + + + + + + + +
MU: KL: IN: CH: FF: GE: KO: KK: BE: MU: KL: IN: CH: FF: GE: KO: KK: BE:

@@ -10265,7 +10291,7 @@ - + @@ -10281,10 +10307,10 @@ - + - + @@ -10361,7 +10387,7 @@ - + @@ -10377,10 +10403,10 @@ - + - + @@ -10457,7 +10483,7 @@ - + @@ -10473,10 +10499,10 @@ - + - + @@ -10553,7 +10579,7 @@ - + @@ -10569,10 +10595,10 @@ - + - + @@ -10639,7 +10665,7 @@ - + @@ -10717,7 +10743,7 @@ - + @@ -10795,7 +10821,7 @@ - + @@ -10873,7 +10899,7 @@ - + @@ -11094,34 +11120,34 @@ - + - + - + - + - + - + - + - + - + - + @@ -11133,12 +11159,12 @@ - - - + + - + - - + + - + - - + + - + - - + + - + @@ -11417,29 +11443,29 @@ - + - - + + - + - - + + - - + +
GS - + IB - + BE + BE mit
W6 +
W6 +
W6 +
W6 +
Kopf
Brust Rücken
Bauch
Arm (links) Arm (rechts)
Bein (links) Bein (rechts)
@@ -11450,12 +11476,12 @@ - - + @@ -11499,7 +11525,7 @@ - + @@ -11509,7 +11535,7 @@ - + @@ -11519,7 +11545,7 @@ - + @@ -11537,7 +11563,7 @@ - @@ -11818,29 +11844,29 @@ - + - - + + - + - - + + - - + +
GS - + IB - + BE + BE mit  () W6 + ////  () W6 + ////  () W6 + ////  () W6 + ////Fernkampfangriff
+
Kopf
Brust Rücken
Bauch
Arm (links) Arm (rechts)
Bein (links) Bein (rechts)
@@ -12469,7 +12495,7 @@ TP - + + + Eisern? @@ -12607,25 +12633,25 @@ - + - + - + - + - + - + - + @@ -12765,26 +12791,137 @@
AT-Wert aus aktiver Waffe (bei Wahl mehrerer aktiver Waffen wird addiert!) - + Anzahl an W6 aus aktiver Waffe (bei Wahl mehrerer aktiver Waffen wird addiert!) - + Schadensbonus aus aktiver Waffe inkl. TP/KK (bei Wahl mehrerer aktiver Waffen wird addiert!) - + PA-Wert aus aktiver Waffe (bei Wahl mehrerer aktiver Waffen wird addiert!) - + Ausweichen-Wert für den Kampf (quasi deaktiviert im Zuge der Umstellung auf das WdS-System zum Ausweichen) - +
+ + - „Das Schwarze Auge“-Heldenbogen für Roll20.net, Version -
Autoren: Gereon Heinemann (Original), Patrick Gebhardt, Steven 'Kreuvf' Koenig. + „Das Schwarze Auge“-Heldenbogen für Roll20.net, Version +
Autoren: Gereon Heinemann (Original), Patrick Gebhardt, Steven 'Kreuvf' Koenig, apehead.
Dank an: G V., Kai, SepDepp @@ -15446,4 +15583,464 @@ on("sheet:opened change:fkw_aktiv1 change:fkw_aktiv2 change:fkw_aktiv3 change:fk ); } ); + +on("sheet:opened change:wound_kopf change:wound_ra change:wound_la change:wound_rb change:wound_lb change:wound_brust change:wound_bauch change:mu_basis change:mu_mod change:kl_basis change:kl_mod change:in_basis change:in_mod change:ch_basis change:ch_mod change:ff_basis change:ff_mod change:ge_basis change:ge_mod change:ko_basis change:ko_mod change:kk_basis change:kk_mod change:gs_basis change:gs_mod change:erschoepfung_mod change:eisern change:aspzugek change:auszugek change:lezugek change:mrzugek change:inizugek", function(eventInfo) { + getAttrs(["wound_kopf", "wound_ra", "wound_la", "wound_rb", "wound_lb", "wound_brust", "wound_bauch", "mu_basis", "mu_mod", "kl_basis", "kl_mod", "in_basis", "in_mod", "ch_basis", "ch_mod", "ff_basis", "ff_mod", "ge_basis", "ge_mod", "ko_basis", "ko_mod", "kk_basis", "kk_mod", "gs_basis", "gs_mod", "erschoepfung_mod", "eisern", "aspzugek", "auszugek", "lezugek", "mrzugek", "inizugek"], function(v) { + let wundeKopf = +v.wound_kopf || 0; + let wundeRA = +v.wound_ra || 0; + let wundeLA = +v.wound_la || 0; + let wundeRB = +v.wound_rb || 0; + let wundeLB = +v.wound_lb || 0; + let wundeBrust = +v.wound_brust || 0; + let wundeBauch = +v.wound_bauch || 0; + let update = { + 'MU': +v.mu_basis + +v.mu_mod - wundeKopf, + 'KL': +v.kl_basis + +v.kl_mod - wundeKopf, + 'IN': +v.in_basis + +v.in_mod - wundeKopf, + 'CH': +v.ch_basis + +v.ch_mod, + 'FF': +v.ff_basis + +v.ff_mod - wundeRA - wundeLA, + 'GE': +v.ge_basis + +v.ge_mod - wundeLB - wundeRB, + 'KO': +v.ko_basis + +v.ko_mod - wundeBrust - wundeBauch, + 'KK': +v.kk_basis + +v.kk_mod - wundeBrust - wundeBauch - wundeRA - wundeLA, + 'erschoepfung_basis': +v.ko_basis, + 'erschoepfung_max': +v.ko_basis + +v.erschoepfung_mod, + 'wundschwelle': Math.ceil((+v.ko_basis) / 2) + +v.eisern, + 'aspgrundw': Math.ceil((+v.mu_basis + +v.in_basis + +v.ch_basis) / 2), + 'asp_max': Math.ceil((+v.mu_basis + +v.in_basis + +v.ch_basis) / 2) + +v.aspzugek, + 'ausgrundw': Math.ceil((+v.mu_basis + +v.ko_basis + +v.ge_basis) / 2), + 'aus_max': Math.ceil((+v.mu_basis + +v.ko_basis + +v.ge_basis) / 2) + +v.auszugek, + 'legrundw': Math.ceil((+v.ko_basis + +v.kk_basis) / 2), + 'le_max': Math.ceil((+v.ko_basis + +v.kk_basis) / 2) + +v.lezugek, + 'mrgrundw': Math.round((+v.mu_basis + +v.kl_basis + +v.ko_basis) / 5), + 'mr_max': Math.round((+v.mu_basis + +v.kl_basis + +v.ko_basis) / 5) + +v.mrzugek, + 'ueberanstrengung_max': +v.ko_basis, + 'inibasis': Math.round((+v.mu_basis + +v.mu_basis + +v.in_basis + +v.ge_basis) / 5), + 'atbasis': Math.round(((+v.mu_basis + +v.ge_basis + +v.kk_basis) / 5) - wundeBauch - wundeRA - wundeLA - wundeRB - wundeLB), + 'pabasis': Math.round(((+v.in_basis + +v.ge_basis + +v.kk_basis) / 5) - wundeBrust - wundeBauch - wundeRA - wundeLA - wundeRB - wundeLB), + 'fkbasis': Math.round(((+v.in_basis + +v.ff_basis + +v.kk_basis) / 5) - wundeBrust - wundeBauch - wundeRA - wundeLA - wundeRB - wundeLB) + }; + update['inibasis2'] = update['inibasis'] + +v.inizugek - wundeKopf - wundeBauch - wundeLB - wundeRB; + let GS = { + 'Basis': +v.gs_basis, + 'Mod': +v.gs_mod, + 'GE-Einfluss': 0, + 'Wunden': wundeBauch - (wundeRB / 2) - (wundeLB / 2) + }; + if (update['GE'] < 11) { + GS['GE-Einfluss'] = -1; + } else if (update['GE'] > 15) { + GS['GE-Einfluss'] = 1; + } + update['GS'] = GS['Basis'] + GS['Mod'] + GS['GE-Einfluss'] + GS['Wunden']; + setAttrs(update); + }); +}); + +on("change:repeating_Gaben:Name_Gabe change:repeating_Gaben:Name_Gabe_Zusatz", function(eventInfo) { + getAttrs(["repeating_Gaben_Name_Gabe", "repeating_Gaben_Name_Gabe_Zusatz"], function(v) { + let gabe = v.repeating_Gaben_Name_Gabe; + let gabeZusatz = v.repeating_Gaben_Name_Gabe_Zusatz; + let gaben = { + "empathie": [ ["mu", "in", "in"], "Empathie" ], + "gefahreninstinkt": [ ["kl", "in", "in"], "Gefahreninstinkt" ], + "geraeuschhexerei": [ ["in", "ch", "ko"], "Geräuschhexerei" ], + "kraefteschub/talentschub": [ ["mu", "in", "ko"], "Kräfteschub/Talentschub" ], + "magiegespuer": [ ["mu", "in", "in"], "Magiegespür" ], + "prophezeien": [ ["in", "in", "ch"], "Prophezeien" ], + "tierempathie": [ ["mu", "in", "ch"], "Tierempathie" ], + "zwergennase": [ ["in", "in", "ff"], "Zwergennase" ] + }; + if (gabe != "nothing") { + let update = { + 'repeating_Gaben_eigenschaft1': gaben[gabe][0][0], + 'repeating_Gaben_eigenschaft2': gaben[gabe][0][1], + 'repeating_Gaben_eigenschaft3': gaben[gabe][0][2], + 'repeating_Gaben_Name_Gabe_Anzeige': gaben[gabe][1] + }; + if (gabeZusatz != "") { + update['repeating_Gaben_Name_Gabe_Anzeige'] += " (" + gabeZusatz + ")"; + } + setAttrs(update); + } else { + let update = {}; + if(gabeZusatz !== "") { + update['repeating_Gaben_Name_Gabe_Anzeige'] = gabeZusatz; + } else { + update['repeating_Gaben_Name_Gabe_Anzeige'] = "Eigene Gabe"; + } + setAttrs(update); + } + }); +}); + +on("change:repeating_Metatalente201904:Name_Metatalent change:repeating_Metatalente201904:Name_Metatalent_Eigen", function(eventInfo) { + getAttrs(["repeating_Metatalente201904_Name_Metatalent", "repeating_Metatalente201904_Name_Metatalent_Eigen"], function(v) { + let metatalent = v.repeating_Metatalente201904_Name_Metatalent; + let metatalentEigen = v.repeating_Metatalente201904_Name_Metatalent_Eigen; + let metatalente = { + "ansitzjagd": [ ["mu", "in", "ge"], "Ansitzjagd" ], + "hetzjagd": [ ["mu", "in", "ge"], "Hetzjagd" ], + "kraeutersuchen": [ ["mu", "in", "ff"], "Kräutersuchen" ], + "nahrungsammeln": [ ["mu", "in", "ff"], "Nahrungsammeln" ], + "pirschjagd": [ ["mu", "in", "ge"], "Pirschjagd" ], + "speerfischen": [ ["mu", "in", "ge"], "Speerfischen" ], + "tierfallenstellen": [ ["kl", "in", "ff"], "Tierfallenstellen" ], + "wachehalten": [ ["mu", "in", "ko"], "Wachehalten" ] + }; + if (metatalent != "nothing") { + setAttrs({ + 'repeating_Metatalente201904_eigenschaft1': metatalente[metatalent][0][0], + 'repeating_Metatalente201904_eigenschaft2': metatalente[metatalent][0][1], + 'repeating_Metatalente201904_eigenschaft3': metatalente[metatalent][0][2], + 'repeating_Metatalente201904_Name_Metatalent_Anzeige': metatalente[metatalent][1] + }); + } else { + let update = {}; + if (metatalentEigen != "") { + update['repeating_metatalent_Name_Metatalent_Anzeige'] = metatalentEigen; + } else { + update['repeating_metatalent_Name_Metatalent_Anzeige'] = "Eigenes Metatalent"; + } + setAttrs(update); + } + }); +}); + +on("change:repeating_Gaben:eigenschaft1 change:repeating_Gaben:eigenschaft2 change:repeating_Gaben:eigenschaft3", function(eventInfo) { + getAttrs(["repeating_Gaben_eigenschaft1", "repeating_Gaben_eigenschaft2", "repeating_Gaben_eigenschaft3", "mu", "kl", "in", "ch", "ff", "ge", "ko", "kk"], function(v) { + let attributes = {"mu": +v.mu, "kl": +v.kl, "in": +v.in, "ch": +v.ch, "ff": +v.ff, "ge": +v.ge, "ko": +v.ko, "kk": +v.kk}; + setAttrs({ + 'repeating_Gaben_hiddeneigenschaft1': attributes[v.repeating_Gaben_eigenschaft1] || 0, + 'repeating_Gaben_hiddeneigenschaft2': attributes[v.repeating_Gaben_eigenschaft2] || 0, + 'repeating_Gaben_hiddeneigenschaft3': attributes[v.repeating_Gaben_eigenschaft3] || 0 + }); + }); +}); + +on("change:repeating_Metatalente201904:eigenschaft1 change:repeating_Metatalente201904:eigenschaft2 change:repeating_Metatalente201904:eigenschaft3", function(eventInfo) { + getAttrs(["repeating_Metatalente201904_eigenschaft1", "repeating_Metatalente201904_eigenschaft2", "repeating_Metatalente201904_eigenschaft3", "mu", "kl", "in", "ch", "ff", "ge", "ko", "kk"], function(v) { + let attributes = {"mu": +v.mu, "kl": +v.kl, "in": +v.in, "ch": +v.ch, "ff": +v.ff, "ge": +v.ge, "ko": +v.ko, "kk": +v.kk}; + setAttrs({ + 'repeating_Metatalente201904_hiddeneigenschaft1': attributes[v.repeating_Metatalente201904_eigenschaft1] || 0, + 'repeating_Metatalente201904_hiddeneigenschaft2': attributes[v.repeating_Metatalente201904_eigenschaft2] || 0, + 'repeating_Metatalente201904_hiddeneigenschaft3': attributes[v.repeating_Metatalente201904_eigenschaft3] || 0 + }); + }); +}); + +on("change:mu change:kl change:in change:ch change:ff change:ge change:ko change:kk", function(eventInfo) { + // Aktualisiere Talentwerte + getAttrs(["mu", "kl", "in", "ch", "ff", "ge", "ko", "kk"], function(v) { + let attributes = {"mu": +v.mu, "kl": +v.kl, "in": +v.in, "ch": +v.ch, "ff": +v.ff, "ge": +v.ge, "ko": +v.ko, "kk": +v.kk}; + let update = {}; + + // Aktualisiere Gaben + getSectionIDs("gaben", function(idarray) { + _.each(idarray, function(currentID, i) { + getAttrs(["repeating_Gaben_" + currentID + "_eigenschaft1", "repeating_Gaben_" + currentID + "_eigenschaft2", "repeating_Gaben_" + currentID + "_eigenschaft3"], function(v) { + update["repeating_Gaben_" + currentID + "_hiddeneigenschaft1"] = attributes[v["repeating_Gaben_" + currentID + "_eigenschaft1"]]; + update["repeating_Gaben_" + currentID + "_hiddeneigenschaft2"] = attributes[v["repeating_Gaben_" + currentID + "_eigenschaft2"]]; + update["repeating_Gaben_" + currentID + "_hiddeneigenschaft3"] = attributes[v["repeating_Gaben_" + currentID + "_eigenschaft3"]]; + setAttrs(update); + }); + }); + }); + + // Aktualisiere Metatalente + getSectionIDs("metatalente201904", function(idarray) { + _.each(idarray, function(currentID, i) { + getAttrs(["repeating_Metatalente201904_" + currentID + "_eigenschaft1", "repeating_Metatalente201904_" + currentID + "_eigenschaft2", "repeating_Metatalente201904_" + currentID + "_eigenschaft3"], function(v) { + update["repeating_Metatalente201904_" + currentID + "_hiddeneigenschaft1"] = attributes[v["repeating_Metatalente201904_" + currentID + "_eigenschaft1"]]; + update["repeating_Metatalente201904_" + currentID + "_hiddeneigenschaft2"] = attributes[v["repeating_Metatalente201904_" + currentID + "_eigenschaft2"]]; + update["repeating_Metatalente201904_" + currentID + "_hiddeneigenschaft3"] = attributes[v["repeating_Metatalente201904_" + currentID + "_eigenschaft3"]]; + setAttrs(update); + }); + }); + }); + }); +}); + +on("change:ap_gesamt change:ap_ausgegeben", function(eventInfo) { + getAttrs(["ap_gesamt", "ap_ausgegeben"], function(v) { + setAttrs({ + ap_verfuegbar: +v.ap_gesamt - +v.ap_ausgegeben + }); + }); +}); + +on("change:wound_kopf1 change:wound_kopf2 change:wound_brust1 change:wound_brust2 change:wound_bauch1 change:wound_bauch2 change:wound_ra1 change:wound_ra2 change:wound_la1 change:wound_la2 change:wound_rb1 change:wound_rb2 change:wound_lb1 change:wound_lb2", function(eventInfo) { + getAttrs(["wound_kopf1", "wound_kopf2", "wound_brust1", "wound_brust2", "wound_bauch1", "wound_bauch2", "wound_ra1", "wound_ra2", "wound_la1", "wound_la2", "wound_rb1", "wound_rb2", "wound_lb1", "wound_lb2"], function(v) { + setAttrs({ + wound_kopf: +v.wound_kopf1 + +v.wound_kopf2, + wound_brust: +v.wound_brust1 + +v.wound_brust2, + wound_bauch: +v.wound_bauch1 + +v.wound_bauch2, + wound_ra: +v.wound_ra1 + +v.wound_ra2, + wound_la: +v.wound_la1 + +v.wound_la2, + wound_rb: +v.wound_rb1 + +v.wound_rb2, + wound_lb: +v.wound_lb1 + +v.wound_lb2 + }); + }); +}); + +on("change:kegrundw change:kezugek", function(eventInfo) { + getAttrs(["kegrundw", "kezugek"], function(v) { + setAttrs({ + ke_max: +v.kegrundw + +v.kezugek + }); + }); +}); + +/* +# Old Data Conversion +Always try to migrate as much data as possible + +Relevant character sheet versions +* 20171014: last version before sheet worker scripts conversion +* 20190427: new repeating sections for meta-talents and gifts +*/ +function migrationCheck() { + getAttrs(["character_sheet_version", "data_version"], function(v) { + console.log("Checking versions before attempting data migration ..."); + + let dataVersion = parseInt(v["data_version"]); + let sheetVersion = parseInt(v["character_sheet_version"]); + + if(sheetVersion == dataVersion) { + console.log("Character sheet version (" + sheetVersion + ") matches data version (" + dataVersion + "). Nothing to do."); + } else if(sheetVersion > dataVersion) { + console.log("Character sheet version (" + sheetVersion + ") is newer than data version (" + dataVersion + "). Having a closer look at the data version ..."); + // This needs to be adapted/replaced by a better system + if(dataVersion === 20171014) { + migrate20171014to20190427(); + } else { + console.log("The data version does not indicate the need to migrate old data to new formats. Nothing done."); + } + } else if (sheetVersion < dataVersion) { + console.log("Character sheet version (" + sheetVersion + ") is older than data version (" + dataVersion + "). Version numbers inconsistent, stopping to prevent unwanted effects. Please fix your version number(s)."); + } + }); +} + +/* +## From version 20171014 to 20190427 +* Gifts and meta-talents were changed +*/ +function migrate20171014to20190427 () { + console.log("Migrating sheet data from version 20171014 to 20190427 ..."); + let migrationFinished = 0; + + getSectionIDs("GabenTalente", function(gabenIDs) { + getSectionIDs("MetaTalente", function(metatalenteIDs) { + // GIFTS MIGRATION + if(gabenIDs.length == 0) { + console.log("Migration: No gifts found, nothing to migrate."); + migrationFinished += 1; + } else { + console.log("Migration: Found old gifts, continuing ..."); + let conversion = { + "@{MU}": "mu", + "@{KL}": "kl", + "@{IN}": "in", + "@{CH}": "ch", + "@{FF}": "ff", + "@{GE}": "ge", + "@{KO}": "ko", + "@{KK}": "kk", + "---": "nothing", + "Empathie": "empathie", + "Gefahreninstinkt": "gefahreninstinkt", + "Geräuschhexerei": "geraeuschhexerei", + "Kräfteschub/Talentschub": "kraefteschub/talentschub", + "Magiegespür": "magiegespuer", + "Prophezeien": "prophezeien", + "Tierempathie": "tierempathie", + "Zwergennase": "zwergennase", + }; + let gaben = { + "nothing": [ ["---", "---", "---"], "nothing" ], + "empathie": [ ["mu", "in", "in"], "Empathie" ], + "gefahreninstinkt": [ ["kl", "in", "in"], "Gefahreninstinkt" ], + "geraeuschhexerei": [ ["in", "ch", "ko"], "Geräuschhexerei" ], + "kraefteschub/talentschub": [ ["mu", "in", "ko"], "Kräfteschub/Talentschub" ], + "magiegespuer": [ ["mu", "in", "in"], "Magiegespür" ], + "prophezeien": [ ["in", "in", "ch"], "Prophezeien" ], + "tierempathie": [ ["mu", "in", "ch"], "Tierempathie" ], + "zwergennase": [ ["in", "in", "ff"], "Zwergennase" ] + }; + for(var i=0; i < gabenIDs.length; i++) { + getAttrs( + [ + "repeating_GabenTalente_" + gabenIDs[i] + "_TalentName", + "repeating_GabenTalente_" + gabenIDs[i] + "_Eigenschaft1", + "repeating_GabenTalente_" + gabenIDs[i] + "_Eigenschaft2", + "repeating_GabenTalente_" + gabenIDs[i] + "_Eigenschaft3", + "repeating_GabenTalente_" + gabenIDs[i] + "_TaW", + "repeating_GabenTalente_" + gabenIDs[i] + "_SE", + "mu", "kl", "in", "ch", "ff", "ge", "ko", "kk" + ], function(v) { + console.log(v); + let defaultTaW = 3; + let update = {}; + let newrow = generateRowID(); + let current = Object.keys(v)[0].split("_")[2]; + let prefixNew = "repeating_Gaben_" + newrow; + let prefixOld = "repeating_GabenTalente_" + current; + + // Gather data + // Updating the name will set the stats automatically + // To prevent overwriting of custom stats check that the RAW stats are used + // Need to check that the three correct ones are used, order irrelevant + // Comparison made easy by taking all three stats, sorting them alphabetically and then concatenating them into one string -> simple string comparison will reveal whether the same stats are used (order not important) + let gabeStats = gaben[conversion[v[prefixOld + "_TalentName"]]][0].sort().join(""); + let gabeStatsOld = [conversion[v[prefixOld + "_Eigenschaft1"]], conversion[v[prefixOld + "_Eigenschaft2"]], conversion[v[prefixOld + "_Eigenschaft3"]]].sort().join(""); + if(gabeStats == gabeStatsOld) { + update[prefixNew + "_Name_Gabe"] = conversion[v[prefixOld + "_TalentName"]]; + update[prefixNew + "_Name_Gabe_Zusatz"] = ""; + } else { + update[prefixNew + "_Name_Gabe_Zusatz"] = "urspr. " + v[prefixOld + "_TalentName"] + "; Eigenschaften für Probe aber nicht Standard. "; + console.log("Migration: Found old " + v[prefixOld + "_TalentName"] + " containing non-standard stats. No predefined gift set. Old data preserved."); + } + if(v[prefixOld + "_SE"] == "on") { + update[prefixNew + "_Name_Gabe_Zusatz"] += "[x] SE"; + console.log("Migration: Found old " + v[prefixOld + "_TalentName"] + " marked as having a special experience (SE). This data will no longer be kept in the character sheet as it is only relevant for character advancement. Old data preserved. Please move to notes."); + } else { + update[prefixNew + "_Name_Gabe_Zusatz"] += "[ ] SE"; + } + update[prefixNew + "_Name_Gabe_Anzeige"] = conversion[v[prefixOld + "_TalentName"]]; + update[prefixNew + "_Eigenschaft1"] = conversion[v[prefixOld + "_Eigenschaft1"]]; + update[prefixNew + "_Eigenschaft2"] = conversion[v[prefixOld + "_Eigenschaft2"]]; + update[prefixNew + "_Eigenschaft3"] = conversion[v[prefixOld + "_Eigenschaft3"]]; + update[prefixNew + "_hiddenEigenschaft1"] = v[conversion[v[prefixOld + "_Eigenschaft1"]]]; + update[prefixNew + "_hiddenEigenschaft2"] = v[conversion[v[prefixOld + "_Eigenschaft2"]]]; + update[prefixNew + "_hiddenEigenschaft3"] = v[conversion[v[prefixOld + "_Eigenschaft3"]]]; + if(v[prefixOld + "_TaW"] === "") { + update[prefixNew + "_TaW"] = defaultTaW; + } else { + update[prefixNew + "_TaW"] = parseInt(v[prefixOld + "_TaW"]); + } + console.log(update); + + // Create new row + setAttrs(update); + }); + } + migrationFinished += 1; + } + + // META-TALENTS MIGRATION + if(metatalenteIDs.length == 0) { + console.log("Migration: No meta-talents found, nothing to migrate."); + migrationFinished += 2; + } else { + console.log("Migration: Found old meta-talents, continuing ..."); + let conversion = { + "@{MU}": "mu", + "@{KL}": "kl", + "@{IN}": "in", + "@{CH}": "ch", + "@{FF}": "ff", + "@{GE}": "ge", + "@{KO}": "ko", + "@{KK}": "kk", + "---": "nothing", + "Ansitzjagd": "ansitzjagd", + "Hetzjagd": "hetzjagd", + "Kräutersuchen": "kraeutersuchen", + "Nahrungsammeln": "nahrungsammeln", + "Pirschjagd": "pirschjagd", + "Speerfischen": "speerfischen", + "Tierfallenstellen": "tierfallenstellen", + "Wachehalten": "wachehalten" + }; + let metatalente = { + "nothing": [ ["---", "---", "---"], "nothing" ], + "ansitzjagd": [ ["mu", "in", "ge"], "Ansitzjagd" ], + "hetzjagd": [ ["mu", "in", "ge"], "Hetzjagd" ], + "kraeutersuchen": [ ["mu", "in", "ff"], "Kräutersuchen" ], + "nahrungsammeln": [ ["mu", "in", "ff"], "Nahrungsammeln" ], + "pirschjagd": [ ["mu", "in", "ge"], "Pirschjagd" ], + "speerfischen": [ ["mu", "in", "ge"], "Speerfischen" ], + "tierfallenstellen": [ ["kl", "in", "ff"], "Tierfallenstellen" ], + "wachehalten": [ ["mu", "in", "ko"], "Wachehalten" ] + }; + for(var i=0; i < metatalenteIDs.length; i++) { + getAttrs( + [ + "repeating_MetaTalente_" + metatalenteIDs[i] + "_TalentName", + "repeating_MetaTalente_" + metatalenteIDs[i] + "_Eigenschaft1", + "repeating_MetaTalente_" + metatalenteIDs[i] + "_Eigenschaft2", + "repeating_MetaTalente_" + metatalenteIDs[i] + "_Eigenschaft3", + "repeating_MetaTalente_" + metatalenteIDs[i] + "_TaW", + "repeating_MetaTalente_" + metatalenteIDs[i] + "_SE", + "mu", "kl", "in", "ch", "ff", "ge", "ko", "kk" + ], function(v) { + console.log(v); + let defaultTaW = 0; + let update = {}; + let newrow = generateRowID(); + let current = Object.keys(v)[0].split("_")[2]; + let prefixNew = "repeating_Metatalente201904_" + newrow; + let prefixOld = "repeating_MetaTalente_" + current; + + // Gather data + // Updating the name will set the stats automatically + // To prevent overwriting of custom stats check that the RAW stats are used + // Need to check that the three correct ones are used, order irrelevant + // Comparison made easy by taking all three stats, sorting them alphabetically and then concatenating them into one string -> simple string comparison will reveal whether the same stats are used (order not important) + let metatalentStats = metatalente[conversion[v[prefixOld + "_TalentName"]]][0].sort().join(""); + let metatalentStatsOld = [conversion[v[prefixOld + "_Eigenschaft1"]], conversion[v[prefixOld + "_Eigenschaft2"]], conversion[v[prefixOld + "_Eigenschaft3"]]].sort().join(""); + if(metatalentStats == metatalentStatsOld) { + update[prefixNew + "_Name_Metatalent"] = conversion[v[prefixOld + "_TalentName"]]; + update[prefixNew + "_Name_Metatalent_Eigen"] = ""; + } else { + update[prefixNew + "_Name_Metatalent_Eigen"] = "urspr. " + v[prefixOld + "_TalentName"] + "; Eigenschaften für Probe aber nicht Standard. "; + console.log("Migration: Found old " + v[prefixOld + "_TalentName"] + " containing non-standard stats. No predefined meta-talent set. Old data preserved."); + } + if(v[prefixOld + "_SE"] == "on") { + update[prefixNew + "_Name_Metatalent_Eigen"] += "[x] SE"; + console.log("Migration: Found old " + v[prefixOld + "_TalentName"] + " marked as having a special experience (SE). This data will no longer be kept in the character sheet as SEs for metatalents are not RAW and they are only relevant for character advancement. Old data preserved. Please move to notes."); + } else { + update[prefixNew + "_Name_Metatalent_Eigen"] += "[ ] SE"; + } + update[prefixNew + "_Name_Metatalent_Anzeige"] = conversion[v[prefixOld + "_TalentName"]]; + update[prefixNew + "_Eigenschaft1"] = conversion[v[prefixOld + "_Eigenschaft1"]]; + update[prefixNew + "_Eigenschaft2"] = conversion[v[prefixOld + "_Eigenschaft2"]]; + update[prefixNew + "_Eigenschaft3"] = conversion[v[prefixOld + "_Eigenschaft3"]]; + update[prefixNew + "_hiddenEigenschaft1"] = v[conversion[v[prefixOld + "_Eigenschaft1"]]]; + update[prefixNew + "_hiddenEigenschaft2"] = v[conversion[v[prefixOld + "_Eigenschaft2"]]]; + update[prefixNew + "_hiddenEigenschaft3"] = v[conversion[v[prefixOld + "_Eigenschaft3"]]]; + if(v[prefixOld + "_TaW"] === "") { + update[prefixNew + "_TaW"] = defaultTaW; + } else { + update[prefixNew + "_TaW"] = parseInt(v[prefixOld + "_TaW"]); + } + console.log(update); + + // Create new row + setAttrs(update); + }); + } + migrationFinished += 2; + } + // FINISHING + if (migrationFinished === 1) { + console.log("Migration: Gifts migrated to new version, but there seems to be a problem with meta-talents. See console/log for further hints. Data version not updated to character sheet version."); + } else if (migrationFinished === 2) { + console.log("Migration: Meta-talents migrated to new version, but there seems to be a problem with gifts. See console/log for further hints. Data version not updated to character sheet version."); + } else if (migrationFinished === 3) { + let dataVersionNew = "20190427"; + setAttrs({ "data_version": dataVersionNew }); + console.log("Migration: Data version updated to character sheet version (" + dataVersionNew + "). Migration complete."); + } else { + console.log("Migration: Migration appears to be incomplete. See console/log for further hints. Data version not updated to character sheet version."); + } + }); + }); +} + +on("sheet:opened", function() { + migrationCheck(); +}); + + diff --git a/Das_Schwarze_Auge_4-1/formulas.md b/Das_Schwarze_Auge_4-1/formulas.md index 6822f807fe..3ede748f52 100644 --- a/Das_Schwarze_Auge_4-1/formulas.md +++ b/Das_Schwarze_Auge_4-1/formulas.md @@ -20,37 +20,14 @@ The stat value (`@{MU}`) is increased (easy) or decreased (difficult) by the mod Therefore, the first part is grouped with the roll `@{MU} + 0d1` and the highest value of both is dropped. In the above example, 14 would be higher than 12 and dropped, so that the result would be 12. When the check result is less than the stat value, the second part would be higher and dropped. The same is true for negative results (failures). Automatic successes (1) and failures (20) are handled by the roll template. Since stat values of 20 and higher are possible (and negative modifiers as well), the roll template currently does not show the resulting points in the case of automatic failures. The reasoning behind this is that the result would be non-negative, suggest success to the player and might confuse newbies. It should be noted that automatic success/failures in stat checks are an optional rule according to WdS, p. 7. -## Speed (Geschwindigkeit/GS) -`(@{GS_Basis} + @{GS_Mod} + (floor((@{GE_Basis} + @{GE_Mod} + 100)/111)-1) + (ceil((@{GE_Basis} + @{GE_Mod} + 100)/115)-1) - @{wound_Bauch} - (@{wound_RB}/2 - @{wound_LB}/2))` - -The GS stat is 8 by default and modified by certain advantages/disadvantages (which are not currently respected) and certain wounds. Additionally, the agility stat (GE) influences the speed: GE less than 11 reduces the GS by one, GE greater than 15 increases the GS by one. The above formula contains some magic values to accomplish the correct behaviour. - -`floor((@{GE_Basis} + @{GE_Mod} + 100)/111)-1` - -`@{GE_Basis}` and `@{GE_Mod}` represent the current agility without wound effects. The trick to get this term to be -1 for GE less than 11 lies within floor(). floor() always rounds down. So, 0.999 gets rounded to 0. GE less than 11 also means GE less than or equal to 10 and with GE = 10, the fraction `110/111` will be rounded down to 0. The `-1` after the `floor(...)` makes the whole term become -1. - -`ceil((@{GE_Basis} + @{GE_Mod} + 100)/115)-1` - -Same situation as before, but this time using ceil() to always round up. Until GE = 15, the `ceil(...)` is 1 and the `-1` afterwards reduces it to zero cancelling out any effect. Starting with GE = 16, the `ceil(...)` is 2 and the whole term +1. - ## Life Energy (Lebensenergie/LE), Stamina (Ausdauer/AU) and Astral Energy (Astralenergie/AE) -LE: `round(@{KO_Basis} + (@{KK_Basis}/2) + 0.05)` - -AU: `round((@{MU_Basis} + @{KO_Basis} + @{GE_Basis})/2 + 0.05)` - -AE: `round((@{MU_Basis} + @{IN_Basis} + @{CH_Basis})/2 + 0.05)` - -These formulas are quite straightforward implementations of the official rules with one small change: Prior to rounding, 0.05 is added as a safeguard to ensure that .5 is correctly rounded up by making it 0.55. Not sure, if this is really necessary. - It is important to note that the base values of the stats are used here (`_Basis`). This prevents these base values to change upon temporary effects such as wounds, spells or disease. A side effect of this is that the "Mod" column on the "Grundwerte" tab must not be mistaken for the "Mod" column on the official PDF character sheet which takes boni/mali from the character generation. In its current form, this character sheet assumes that the value entered under `Basis` is the value of the current stat with all permanent modifications already factored in. ## Magic Resistance (Magieresistenz/MR) -`round((@{MU_Basis} + @{MU_Mod} + @{KL_Basis} + @{KL_Mod} + @{KO_Basis} + @{KO_Mod})/5)` - -Since stats are positive integers and are divided by 5, the first decimal place always is an even number (.0, .2, .4, .6 or .8). Therefore, no safeguard is needed. Temporary modifiers without wounds are applied. No source is yet known for this behaviour and therefore, this will likely change in a future release. +No temporary stat modifiers or wounds are applied. ## Initiative/Attack/Parry/Long Range Base Values (INI/AT/PA/FK-Basiswert) -Analog to Magic Resistance, but wound effects are honoured for Attack/Parry/Long Range base values. No source is yet known for the application of temporary modifiers and therefore, this will likely change in a future release. +Wound effects are honoured for Attack/Parry/Long Range base values. No temporary stat modifiers are applied. ## 3d20 Checks Four cases have to be distinguished in order to determine the result of a roll: diff --git a/Das_Schwarze_Auge_4-1/sheet.json b/Das_Schwarze_Auge_4-1/sheet.json index 41e182946d..ad7c558255 100644 --- a/Das_Schwarze_Auge_4-1/sheet.json +++ b/Das_Schwarze_Auge_4-1/sheet.json @@ -1,7 +1,7 @@ { "html": "dsa4_1_character_sheet_roll20.html", "css": "dsa4_1_character_sheet_roll20.css", - "authors": "Gereon Heinemann, Patrick Gebhardt (gebhardthbs@web.de), Kai, Steven 'Kreuvf' Koenig (webmaster@kreuvf.de)", + "authors": "Gereon Heinemann, Patrick Gebhardt (gebhardthbs@web.de), Kai, Steven 'Kreuvf' Koenig (webmaster@kreuvf.de), apehead", "roll20userid": "584207,592673,879287,1411023 ", "preview": "dsa4_1_character_sheet_roll20.png", "instructions": "Charakterbogen für das "Das Schwarze Auge"-Regelwerk 4.1"