From 7bc73459bbb4e9879ffd75d082eef56ab6406b8a Mon Sep 17 00:00:00 2001 From: Koizumi85 Date: Sun, 9 Aug 2020 22:37:27 +0200 Subject: [PATCH] first works on shield attack support --- .../dsa4_1_character_sheet_roll20.css | 2 +- .../dsa4_1_character_sheet_roll20.html | 104 ++++++++++++++++-- 2 files changed, 94 insertions(+), 12 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 5ace99373f..5def7cb8b0 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 @@ -1626,7 +1626,7 @@ The solution: convert the s to type="text" and make them look like normal .charsheet .sheet-hide-shield:not(:checked) ~ span.sheet-hideable-shield-active, .charsheet .sheet-hide-parry-weapon:not(:checked) ~ div.sheet-hideable-parry-weapon-active, .charsheet .sheet-hide-parry-weapon:not(:checked) ~ span.sheet-hideable-parry-weapon-active { - display: none; + display: none; } .charsheet .sheet-hide-melee-weapon-1:checked ~ div.sheet-hideable-melee-weapon-none, 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 331a4ce5bb..85922557d2 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 @@ -16011,19 +16011,37 @@ function migrateTo20200809(migrationChain) { } function migrateTo99999999(migrationChain) { + + getAttrs(["activeShieldRowId"], function(rowIdValues) { + var activeShieldRowId = rowIdValues["activeShieldRowId"]; - getAttrs([ - "kk", "NKW_Aktiv1", "NKW_Aktiv2", "NKW_Aktiv3", "NKW_Aktiv4", "NKW1_Schwellenwert", "NKW1_SchwellenwertKK", "NKW2_Schwellenwert", - "NKW2_SchwellenwertKK", "NKW3_Schwellenwert", "NKW3_SchwellenwertKK", "NKW4_Schwellenwert", "NKW4_SchwellenwertKK"], function(v) { - - let attrsToChange = {}; - - for (var i = 1; i <= 4; i++) { - attrsToChange["NKW" + i + "_SB"] = calculateTpKKMod(v, i); + let variablesToGet = [ "kk", "AT_raufen", "sf_schildkampfI", "sf_schildkampfII", "sf_schmutzigetricks", "sf_knaufschlag", "NKW_Aktiv1", "NKW_Aktiv2", "NKW_Aktiv3", "NKW_Aktiv4", + "NKW1_Schwellenwert", "NKW1_SchwellenwertKK", "NKW2_Schwellenwert", + "NKW2_SchwellenwertKK", "NKW3_Schwellenwert", "NKW3_SchwellenwertKK", "NKW4_Schwellenwert", "NKW4_SchwellenwertKK"]; + + // Wenn es ein aktives Schild (oder Parierwaffe) gibt, möchten wir auch dessen Werte mit laden + if (activeShieldRowId) { + variablesToGet.push("repeating_shields_" + activeShieldRowId + "_shield_at_mod"); + variablesToGet.push("repeating_shields_" + activeShieldRowId + "_shield_pa_mod"); + variablesToGet.push("repeating_shields_" + activeShieldRowId + "_shield_type"); } - - setAttrs(attrsToChange, {}, function(){ - callNextMigration(migrationChain); + + getAttrs(variablesToGet, function(values) { + let attrsToChange = {}; + + for (var i = 1; i <= 4; i++) { + let weaponTpkkModResult = calculateTpKKMod(values, i); + attrsToChange["NKW" + i + "_SB"] = weaponTpkkModResult.tpkkMod; + } + + let result = calculateShieldAttack(values, activeShieldRowId); + + attrsToChange["shield_at"] = result.shieldAt; + attrsToChange["shield_at_available"] = result.shieldAtAvailable; + + setAttrs(attrsToChange, {}, function(){ + callNextMigration(migrationChain); + }); }); }); } @@ -17431,4 +17449,68 @@ function calculateTpKKMod(values, weapon) { } return tpkkMod; } + +// calculate shield attack value +on("change:repeating_shields change:sf_schildkampfI change:sf_schildkampfII change:sf_knaufschlag change:sf_schmutzigetricks", function(eventInfos) { + getAttrs(["activeShieldRowId"], function(rowIdValues) { + var activeShieldRowId = rowIdValues["activeShieldRowId"]; + if (eventInfos.sourceAttribute && eventInfos.sourceAttribute.endsWith("_shield_active")) { + if (eventInfos.newValue === "on") { + activeShieldRowId = extractRowId(eventInfos.sourceAttribute); + } else if (eventInfos.sourceType === "player") { + activeShieldRowId = undefined; + } + } + + let variablesToGet = [ "kk", "AT_raufen", "sf_schildkampfI", "sf_schildkampfII", "sf_schmutzigetricks", "sf_knaufschlag"] + + // Wenn es ein aktives Schild (oder Parierwaffe) gibt, möchten wir auch dessen Werte mit laden + if (activeShieldRowId) { + variablesToGet.push("repeating_shields_" + activeShieldRowId + "_shield_at_mod"); + variablesToGet.push("repeating_shields_" + activeShieldRowId + "_shield_pa_mod"); + variablesToGet.push("repeating_shields_" + activeShieldRowId + "_shield_type"); + } else { + console.log("no active shield found"); + setAttrs({ shield_at_available: "0", shield_at: 0 }); + return; + } + + getAttrs(variablesToGet, function(values) { + let result = calculateShieldAttack(values, activeShieldRowId); + setAttrs({ shield_at: result.shieldAt, shield_at_available: result.shieldAtAvailable }); + }); + + }); +}); + +function calculateShieldAttack(values, activeShieldRowId) { + var shieldAt = 0; + var schildkampfI = values["sf_schildkampfI"]; + if (activeShieldRowId && schildkampfI === "1" && values["repeating_shields_" + activeShieldRowId + "_shield_type"] === "shield") { + var schildkampfII = values["sf_schildkampfII"]; + var knaufschlag = values["sf_knaufschlag"]; + var schmutzigeTricks = values["sf_schmutzigetricks"]; + shieldAt = parseInt(values["AT_raufen"]); + + if (values["repeating_shields_" + activeShieldRowId + "_shield_at_mod"]) { + shieldAt += parseInt(values["repeating_shields_" + activeShieldRowId + "_shield_at_mod"]); + } + if (schildkampfII !== "1" && knaufschlag !== "1" && schmutzigeTricks !== "1") { + shieldAt -= 3; + } + + let kkDifference = parseInt(values["kk"]) - 13; + + var tpkkMod = Math.floor(Math.abs(kkDifference) / 3); + if (kkDifference < 0) { + shieldAt -= tpkkMod; + } + + if (shieldAt < 0) { + shieldAt = 0; + } + } + var shieldAtAvailable = shieldAt > 0 ? "on" : "0"; + return {shieldAt: shieldAt, shieldAtAvailable: shieldAtAvailable }; +}