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) - +
+ +
+

Infos zum Charakterbogen

+

Dieser Charakterbogen wird weiterentwickelt. Dabei bleibt es nicht aus, dass alte Daten nicht mehr ohne Weiteres in den veränderten Bogen passen. Wenn es nötig wird, werden die alten Daten automatisch im Hintergrund umgewandelt. Da es aber immer zu Fehlern kommen kann, stehen für jeden Versionssprung hier weiterhin die alten Daten (inklusive ihrer Funktionalität) zur Verfügung. So wird sichergestellt, dass keine Daten verlorengehen und das Spiel weitergehen kann.

+

Videos zu einzelnen Updates:
+ +

+ +

Update auf Version 20190427

+

Gaben und Metatalente wurden verändert, sodass eine Migration der alten Daten notwendig wurde. Spalten für spezielle Erfahrungen (SE) wurden entfernt, da diese ausschließlich für die Steigerung relevant sind, Steigerungen aber seitens Roll20 nicht im Charakterbogen umgesetzt sein dürfen. Um die Information dauerhafter zu speichern, empfiehlt es sich die Notizen zu benutzen. Spezielle Erfahrungen in Metatalenten sind darüber hinaus nicht regelkonform.

+
Gaben
+
+ + + + + + + +
+
Metatalente
+
+ + + + + + + +
+
- „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"