From e6747f12f86f384de9d1f577d178948954f88aca Mon Sep 17 00:00:00 2001 From: Gamaliel Date: Fri, 10 Apr 2026 10:17:27 -0400 Subject: [PATCH 1/7] fix(data): update damage and hitspeed stats for Suspicious Bush - Increase damage values for levels 11, 15, and 16 - Adjust hitspeed from 0.3 to 1.4 to align with balance changes --- cards.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cards.json b/cards.json index 3cb4bf9..8c22857 100644 --- a/cards.json +++ b/cards.json @@ -5268,9 +5268,9 @@ "level16": null }, "damage": { - "level11": 227, - "level15": 331, - "level16": 363 + "level11": 256, + "level15": 372, + "level16": 409 }, "hitpoints": { "level11": 82, @@ -5293,7 +5293,7 @@ "statsHero": { "prestigeCost": null }, - "hitspeed": 0.3, + "hitspeed": 1.4, "radius": null, "generationSpeed": null, "generationUnits": null, From 03a9569a2c9d373c1c1c1bc60985539830cefc08 Mon Sep 17 00:00:00 2001 From: Gamaliel Date: Sun, 12 Apr 2026 10:09:58 -0400 Subject: [PATCH 2/7] fix(data): remove hitspeed stat for Royal Delivery The hitspeed property for Graveyard is set to null as it is a spell that spawns units rather than having a direct attack speed. --- cards.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cards.json b/cards.json index 8c22857..5c537d0 100644 --- a/cards.json +++ b/cards.json @@ -7651,7 +7651,7 @@ "statsHero": { "prestigeCost": null }, - "hitspeed": 1.3, + "hitspeed": null, "radius": 3.0, "generationSpeed": null, "generationUnits": null, From 31b2c969ab9941e56600939c1b7807e60210a475 Mon Sep 17 00:00:00 2001 From: Gamaliel Date: Sun, 12 Apr 2026 10:15:24 -0400 Subject: [PATCH 3/7] fix(data): adjust Battle Ram attributes for balance consistency Update damage, hitpoints, hitspeed, and range values in cards.json. These modifications ensure the Battle Ram's base and evolution stats correctly reflect the intended gameplay balance across all levels. --- cards.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/cards.json b/cards.json index 5c537d0..50ee1ac 100644 --- a/cards.json +++ b/cards.json @@ -2383,21 +2383,21 @@ "level16": null }, "damage": { - "level11": 287, - "level15": 417, - "level16": 458 + "level11": 192, + "level15": 279, + "level16": 307 }, "hitpoints": { - "level11": 968, - "level15": 1406, - "level16": 1546 + "level11": 671, + "level15": 975, + "level16": 1072 }, "statsEvo": { "cycles": 2, "damage": { - "level11": 287, - "level15": 417, - "level16": 458 + "level11": 192, + "level15": 279, + "level16": 307 }, "hitpoints": { "level11": 968, @@ -2408,12 +2408,12 @@ "statsHero": { "prestigeCost": null }, - "hitspeed": 0.4, + "hitspeed": 1.3, "radius": null, "generationSpeed": null, "generationUnits": null, "speed": "medium", - "range": 0.5, + "range": 0.7, "territory": "restricted", "rarity": "rare", "type": "troop" From 4b7f9e35fabbaf35008dd2708866bb4fca2e6442 Mon Sep 17 00:00:00 2001 From: Gamaliel Date: Sun, 12 Apr 2026 10:34:20 -0400 Subject: [PATCH 4/7] fix(data): correct Skeleton Barrel hitpoints and hitspeed values Adjust the hitpoints for both standard and evolved Skeleton Barrel states to match the intended base values across levels 11, 15, and 16. Additionally, update the hitspeed from 0.3 to 1.1 to align with the latest balance specifications. --- cards.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/cards.json b/cards.json index 50ee1ac..e2edebb 100644 --- a/cards.json +++ b/cards.json @@ -3701,9 +3701,9 @@ "level16": 129 }, "hitpoints": { - "level11": 532, - "level15": 774, - "level16": 851 + "level11": 81, + "level15": 119, + "level16": 129 }, "statsEvo": { "cycles": 2, @@ -3713,15 +3713,15 @@ "level16": 129 }, "hitpoints": { - "level11": 532, - "level15": 774, - "level16": 851 + "level11": 81, + "level15": 119, + "level16": 129 } }, "statsHero": { "prestigeCost": null }, - "hitspeed": 0.3, + "hitspeed": 1.1, "radius": null, "generationSpeed": null, "generationUnits": null, From 6e92a6a9ec68ce013c7f2d8d24e65149980844fa Mon Sep 17 00:00:00 2001 From: Gamaliel Date: Sun, 12 Apr 2026 12:38:11 -0400 Subject: [PATCH 5/7] fix(data): adjust card scaling values for level 11, 15, and 16 Modify damage and hitpoints entries in cards.json to fix rounding errors across multiple power levels. These changes ensure that base stats and evolution stats align with the intended scaling progression for high-level gameplay. --- cards.json | 772 ++++++++++++++++++++++++++--------------------------- 1 file changed, 386 insertions(+), 386 deletions(-) diff --git a/cards.json b/cards.json index e2edebb..f2b9f56 100644 --- a/cards.json +++ b/cards.json @@ -31,24 +31,24 @@ }, "damage": { "level11": 202, - "level15": 294, + "level15": 293, "level16": 323 }, "hitpoints": { "level11": 1766, - "level15": 2567, + "level15": 2566, "level16": 2822 }, "statsEvo": { "cycles": 2, "damage": { "level11": 202, - "level15": 294, + "level15": 293, "level16": 323 }, "hitpoints": { "level11": 1766, - "level15": 2567, + "level15": 2566, "level16": 2822 } }, @@ -96,26 +96,26 @@ "level16": null }, "damage": { - "level11": 113, - "level15": 164, - "level16": 180 + "level11": 112, + "level15": 163, + "level16": 179 }, "hitpoints": { - "level11": 305, - "level15": 443, - "level16": 487 + "level11": 304, + "level15": 442, + "level16": 486 }, "statsEvo": { "cycles": 2, "damage": { - "level11": 113, - "level15": 164, - "level16": 180 + "level11": 112, + "level15": 163, + "level16": 179 }, "hitpoints": { - "level11": 305, - "level15": 443, - "level16": 487 + "level11": 304, + "level15": 442, + "level16": 486 } }, "statsHero": { @@ -162,12 +162,12 @@ }, "damage": { "level11": 120, - "level15": 175, + "level15": 174, "level16": 192 }, "hitpoints": { "level11": 202, - "level15": 294, + "level15": 293, "level16": 323 }, "statsEvo": { @@ -228,12 +228,12 @@ "damage": { "level11": 253, "level15": 368, - "level16": 405 + "level16": 404 }, "hitpoints": { "level11": 3968, "level15": 5766, - "level16": 6340 + "level16": 6339 }, "statsEvo": { "cycles": null, @@ -291,25 +291,25 @@ "level16": null }, "damage": { - "level11": 817, - "level15": 1187, - "level16": 1305 + "level11": 816, + "level15": 1186, + "level16": 1304 }, "hitpoints": { - "level11": 3761, - "level15": 5465, + "level11": 3760, + "level15": 5464, "level16": 6008 }, "statsEvo": { "cycles": 1, "damage": { - "level11": 817, - "level15": 1187, - "level16": 1305 + "level11": 816, + "level15": 1186, + "level16": 1304 }, "hitpoints": { - "level11": 3761, - "level15": 5465, + "level11": 3760, + "level15": 5464, "level16": 6008 } }, @@ -357,13 +357,13 @@ "level16": null }, "damage": { - "level11": 108, + "level11": 107, "level15": 156, - "level16": 172 + "level16": 171 }, "hitpoints": { "level11": 230, - "level15": 335, + "level15": 334, "level16": 368 }, "statsEvo": { @@ -407,8 +407,8 @@ "projectile": false, "suicide": false, "fatalDamage": { - "level11": 241, - "level15": 350, + "level11": 240, + "level15": 349, "level16": 384 }, "chargeDamage": { @@ -424,12 +424,12 @@ "damage": { "level11": 640, "level15": 930, - "level16": 1023 + "level16": 1022 }, "hitpoints": { - "level11": 1677, - "level15": 2437, - "level16": 2679 + "level11": 1676, + "level15": 2436, + "level16": 2678 }, "statsEvo": { "cycles": null, @@ -488,26 +488,26 @@ "level16": null }, "damage": { - "level11": 136, + "level11": 135, "level15": 197, - "level16": 217 + "level16": 216 }, "hitpoints": { - "level11": 840, + "level11": 839, "level15": 1220, - "level16": 1342 + "level16": 1341 }, "statsEvo": { "cycles": 1, "damage": { - "level11": 136, + "level11": 135, "level15": 197, - "level16": 217 + "level16": 216 }, "hitpoints": { - "level11": 840, + "level11": 839, "level15": 1220, - "level16": 1342 + "level16": 1341 } }, "statsHero": { @@ -555,24 +555,24 @@ "damage": { "level11": 192, "level15": 279, - "level16": 307 + "level16": 306 }, "hitpoints": { - "level11": 671, - "level15": 975, - "level16": 1072 + "level11": 670, + "level15": 974, + "level16": 1071 }, "statsEvo": { "cycles": 1, "damage": { "level11": 192, "level15": 279, - "level16": 307 + "level16": 306 }, "hitpoints": { "level11": 737, "level15": 1071, - "level16": 1178 + "level16": 1177 } }, "statsHero": { @@ -605,7 +605,7 @@ "fatalDamage": { "level11": 225, "level15": 327, - "level16": 360 + "level16": 359 }, "chargeDamage": { "level11": null, @@ -619,8 +619,8 @@ }, "damage": { "level11": 312, - "level15": 454, - "level16": 499 + "level15": 453, + "level16": 498 }, "hitpoints": { "level11": 5120, @@ -683,26 +683,26 @@ "level16": null }, "damage": { - "level11": 82, + "level11": 81, "level15": 119, - "level16": 131 + "level16": 130 }, "hitpoints": { - "level11": 82, + "level11": 81, "level15": 119, - "level16": 131 + "level16": 130 }, "statsEvo": { "cycles": 2, "damage": { - "level11": 82, + "level11": 81, "level15": 119, - "level16": 131 + "level16": 130 }, "hitpoints": { - "level11": 82, + "level11": 81, "level15": 119, - "level16": 131 + "level16": 130 } }, "statsHero": { @@ -749,7 +749,7 @@ }, "damage": { "level11": 266, - "level15": 387, + "level15": 386, "level16": 425 }, "hitpoints": { @@ -761,7 +761,7 @@ "cycles": 2, "damage": { "level11": 266, - "level15": 387, + "level15": 386, "level16": 425 }, "hitpoints": { @@ -813,26 +813,26 @@ "level16": null }, "damage": { - "level11": 82, + "level11": 81, "level15": 119, - "level16": 131 + "level16": 130 }, "hitpoints": { - "level11": 82, + "level11": 81, "level15": 119, - "level16": 131 + "level16": 130 }, "statsEvo": { "cycles": 2, "damage": { - "level11": 82, + "level11": 81, "level15": 119, - "level16": 131 + "level16": 130 }, "hitpoints": { - "level11": 82, + "level11": 81, "level15": 119, - "level16": 131 + "level16": 130 } }, "statsHero": { @@ -880,24 +880,24 @@ "damage": { "level11": 225, "level15": 327, - "level16": 360 + "level16": 359 }, "hitpoints": { - "level11": 305, - "level15": 443, - "level16": 487 + "level11": 304, + "level15": 442, + "level16": 486 }, "statsEvo": { "cycles": 1, "damage": { "level11": 225, "level15": 327, - "level16": 360 + "level16": 359 }, "hitpoints": { - "level11": 305, - "level15": 443, - "level16": 487 + "level11": 304, + "level15": 442, + "level16": 486 } }, "statsHero": { @@ -944,24 +944,24 @@ "level16": null }, "damage": { - "level11": 218, + "level11": 217, "level15": 316, - "level16": 348 + "level16": 347 }, "hitpoints": { - "level11": 722, + "level11": 721, "level15": 1049, "level16": 1153 }, "statsEvo": { "cycles": 2, "damage": { - "level11": 218, + "level11": 217, "level15": 316, - "level16": 348 + "level16": 347 }, "hitpoints": { - "level11": 722, + "level11": 721, "level15": 1049, "level16": 1153 } @@ -1012,24 +1012,24 @@ "damage": { "level11": 161, "level15": 234, - "level16": 258 + "level16": 257 }, "hitpoints": { "level11": 1152, "level15": 1674, - "level16": 1841 + "level16": 1840 }, "statsEvo": { "cycles": 1, "damage": { "level11": 161, "level15": 234, - "level16": 258 + "level16": 257 }, "hitpoints": { "level11": 1152, "level15": 1674, - "level16": 1841 + "level16": 1840 } }, "statsHero": { @@ -1067,7 +1067,7 @@ "chargeDamage": { "level11": 783, "level15": 1138, - "level16": 1252 + "level16": 1251 }, "towerDamage": { "level11": null, @@ -1075,14 +1075,14 @@ "level16": null }, "damage": { - "level11": 392, + "level11": 391, "level15": 569, - "level16": 626 + "level16": 625 }, "hitpoints": { "level11": 1920, "level15": 2790, - "level16": 3068 + "level16": 3067 }, "statsEvo": { "cycles": null, @@ -1141,26 +1141,26 @@ "level16": null }, "damage": { - "level11": 282, + "level11": 281, "level15": 409, - "level16": 450 + "level16": 449 }, "hitpoints": { "level11": 755, "level15": 1097, - "level16": 1207 + "level16": 1206 }, "statsEvo": { "cycles": 1, "damage": { - "level11": 282, + "level11": 281, "level15": 409, - "level16": 450 + "level16": 449 }, "hitpoints": { "level11": 755, "level15": 1097, - "level16": 1207 + "level16": 1206 } }, "statsHero": { @@ -1208,12 +1208,12 @@ "damage": { "level11": 755, "level15": 1097, - "level16": 1207 + "level16": 1206 }, "hitpoints": { "level11": 1390, - "level15": 2020, - "level16": 2221 + "level15": 2019, + "level16": 2220 }, "statsEvo": { "cycles": null, @@ -1272,14 +1272,14 @@ "level16": null }, "damage": { - "level11": 82, + "level11": 81, "level15": 119, - "level16": 131 + "level16": 130 }, "hitpoints": { "level11": 133, "level15": 193, - "level16": 213 + "level16": 212 }, "statsEvo": { "cycles": null, @@ -1324,7 +1324,7 @@ "fatalDamage": { "level11": 535, "level15": 777, - "level16": 855 + "level16": 854 }, "chargeDamage": { "level11": null, @@ -1338,8 +1338,8 @@ }, "damage": { "level11": 276, - "level15": 402, - "level16": 442 + "level15": 401, + "level16": 441 }, "hitpoints": { "level11": 3617, @@ -1409,7 +1409,7 @@ "hitpoints": { "level11": 1697, "level15": 2466, - "level16": 2712 + "level16": 2711 }, "statsEvo": { "cycles": null, @@ -1468,13 +1468,13 @@ "level16": null }, "damage": { - "level11": 108, + "level11": 107, "level15": 156, - "level16": 172 + "level16": 171 }, "hitpoints": { "level11": 230, - "level15": 335, + "level15": 334, "level16": 368 }, "statsEvo": { @@ -1601,11 +1601,11 @@ "damage": { "level11": 307, "level15": 446, - "level16": 491 + "level16": 490 }, "hitpoints": { "level11": 3164, - "level15": 4598, + "level15": 4597, "level16": 5055 }, "statsEvo": { @@ -1613,11 +1613,11 @@ "damage": { "level11": 307, "level15": 446, - "level16": 491 + "level16": 490 }, "hitpoints": { "level11": 3164, - "level15": 4598, + "level15": 4597, "level16": 5055 } }, @@ -1664,14 +1664,14 @@ "level16": null }, "damage": { - "level11": 118, + "level11": 117, "level15": 171, "level16": 188 }, "hitpoints": { - "level11": 82, + "level11": 81, "level15": 119, - "level16": 131 + "level16": 130 }, "statsEvo": { "cycles": null, @@ -1786,8 +1786,8 @@ }, "chargeDamage": { "level11": 532, - "level15": 774, - "level16": 851 + "level15": 773, + "level16": 850 }, "towerDamage": { "level11": null, @@ -1796,12 +1796,12 @@ }, "damage": { "level11": 266, - "level15": 387, + "level15": 386, "level16": 425 }, "hitpoints": { - "level11": 1201, - "level15": 1745, + "level11": 1200, + "level15": 1744, "level16": 1918 }, "statsEvo": { @@ -1926,14 +1926,14 @@ "level16": null }, "damage": { - "level11": 54, + "level11": 53, "level15": 78, - "level16": 86 + "level16": 85 }, "hitpoints": { "level11": 3581, "level15": 5204, - "level16": 5722 + "level16": 5721 }, "statsEvo": { "cycles": null, @@ -1993,24 +1993,24 @@ }, "damage": { "level11": 110, - "level15": 160, - "level16": 176 + "level15": 159, + "level16": 175 }, "hitpoints": { "level11": 230, - "level15": 335, + "level15": 334, "level16": 368 }, "statsEvo": { "cycles": 2, "damage": { "level11": 110, - "level15": 160, - "level16": 176 + "level15": 159, + "level16": 175 }, "hitpoints": { "level11": 230, - "level15": 335, + "level15": 334, "level16": 368 } }, @@ -2064,7 +2064,7 @@ }, "hitpoints": { "level11": 230, - "level15": 335, + "level15": 334, "level16": 368 }, "statsEvo": { @@ -2118,19 +2118,19 @@ "level16": null }, "towerDamage": { - "level11": 49, - "level15": 71, - "level16": 78 + "level11": 48, + "level15": 70, + "level16": 77 }, "damage": { - "level11": 195, - "level15": 283, - "level16": 311 + "level11": 194, + "level15": 282, + "level16": 310 }, "hitpoints": { - "level11": 1211, - "level15": 1760, - "level16": 1935 + "level11": 1210, + "level15": 1759, + "level16": 1934 }, "statsEvo": { "cycles": null, @@ -2190,10 +2190,10 @@ "damage": { "level11": 1331, "level15": 1934, - "level16": 2127 + "level16": 2126 }, "hitpoints": { - "level11": 1452, + "level11": 1451, "level15": 2109, "level16": 2319 }, @@ -2323,8 +2323,8 @@ "level16": 409 }, "hitpoints": { - "level11": 1283, - "level15": 1864, + "level11": 1282, + "level15": 1863, "level16": 2049 }, "statsEvo": { @@ -2335,8 +2335,8 @@ "level16": 409 }, "hitpoints": { - "level11": 1283, - "level15": 1864, + "level11": 1282, + "level15": 1863, "level16": 2049 } }, @@ -2385,22 +2385,22 @@ "damage": { "level11": 192, "level15": 279, - "level16": 307 + "level16": 306 }, "hitpoints": { - "level11": 671, - "level15": 975, - "level16": 1072 + "level11": 670, + "level15": 974, + "level16": 1071 }, "statsEvo": { "cycles": 2, "damage": { "level11": 192, "level15": 279, - "level16": 307 + "level16": 306 }, "hitpoints": { - "level11": 968, + "level11": 967, "level15": 1406, "level16": 1546 } @@ -2449,26 +2449,26 @@ "level16": null }, "damage": { - "level11": 36, + "level11": 35, "level15": 52, "level16": 57 }, "hitpoints": { "level11": 1295, "level15": 1882, - "level16": 2070 + "level16": 2069 }, "statsEvo": { "cycles": 2, "damage": { - "level11": 36, + "level11": 35, "level15": 52, "level16": 57 }, "hitpoints": { "level11": 1295, "level15": 1882, - "level16": 2070 + "level16": 2069 } }, "statsHero": { @@ -2500,8 +2500,8 @@ "suicide": false, "fatalDamage": { "level11": 84, - "level15": 123, - "level16": 135 + "level15": 122, + "level16": 134 }, "chargeDamage": { "level11": null, @@ -2515,11 +2515,11 @@ }, "damage": { "level11": 84, - "level15": 123, - "level16": 135 + "level15": 122, + "level16": 134 }, "hitpoints": { - "level11": 1316, + "level11": 1315, "level15": 1912, "level16": 2102 }, @@ -2581,8 +2581,8 @@ }, "damage": { "level11": 312, - "level15": 454, - "level16": 499 + "level15": 453, + "level16": 498 }, "hitpoints": { "level11": 837, @@ -2713,12 +2713,12 @@ }, "damage": { "level11": 120, - "level15": 175, + "level15": 174, "level16": 192 }, "hitpoints": { "level11": 202, - "level15": 294, + "level15": 293, "level16": 323 }, "statsEvo": { @@ -2845,7 +2845,7 @@ "damage": { "level11": 384, "level15": 558, - "level16": 614 + "level16": 613 }, "hitpoints": { "level11": 1341, @@ -2910,11 +2910,11 @@ }, "damage": { "level11": 84, - "level15": 123, - "level16": 135 + "level15": 122, + "level16": 134 }, "hitpoints": { - "level11": 886, + "level11": 885, "level15": 1287, "level16": 1415 }, @@ -2922,11 +2922,11 @@ "cycles": 2, "damage": { "level11": 84, - "level15": 123, - "level16": 135 + "level15": 122, + "level16": 134 }, "hitpoints": { - "level11": 886, + "level11": 885, "level15": 1287, "level16": 1415 } @@ -2975,9 +2975,9 @@ "level16": null }, "damage": { - "level11": 169, - "level15": 246, - "level16": 270 + "level11": 168, + "level15": 245, + "level16": 269 }, "hitpoints": { "level11": 1280, @@ -2987,9 +2987,9 @@ "statsEvo": { "cycles": 1, "damage": { - "level11": 169, - "level15": 246, - "level16": 270 + "level11": 168, + "level15": 245, + "level16": 269 }, "hitpoints": { "level11": 1280, @@ -3040,14 +3040,14 @@ "level16": null }, "damage": { - "level11": 195, - "level15": 283, - "level16": 311 + "level11": 194, + "level15": 282, + "level16": 310 }, "hitpoints": { "level11": 906, - "level15": 1317, - "level16": 1448 + "level15": 1316, + "level16": 1447 }, "statsEvo": { "cycles": null, @@ -3107,10 +3107,10 @@ "damage": { "level11": 133, "level15": 193, - "level16": 213 + "level16": 212 }, "hitpoints": { - "level11": 548, + "level11": 547, "level15": 796, "level16": 875 }, @@ -3119,10 +3119,10 @@ "damage": { "level11": 133, "level15": 193, - "level16": 213 + "level16": 212 }, "hitpoints": { - "level11": 548, + "level11": 547, "level15": 796, "level16": 875 } @@ -3171,14 +3171,14 @@ "level16": null }, "damage": { - "level11": 315, - "level15": 458, + "level11": 314, + "level15": 457, "level16": 503 }, "hitpoints": { "level11": 906, - "level15": 1317, - "level16": 1448 + "level15": 1316, + "level16": 1447 }, "statsEvo": { "cycles": null, @@ -3237,25 +3237,25 @@ "level16": null }, "damage": { - "level11": 82, + "level11": 81, "level15": 119, - "level16": 131 + "level16": 130 }, "hitpoints": { - "level11": 82, + "level11": 81, "level15": 119, - "level16": 131 + "level16": 130 }, "statsEvo": { "cycles": 2, "damage": { - "level11": 82, + "level11": 81, "level15": 119, - "level16": 131 + "level16": 130 }, "hitpoints": { - "level11": 123, - "level15": 179, + "level11": 122, + "level15": 178, "level16": 196 } }, @@ -3307,9 +3307,9 @@ "level16": 417 }, "hitpoints": { - "level11": 1211, - "level15": 1760, - "level16": 1935 + "level11": 1210, + "level15": 1759, + "level16": 1934 }, "statsEvo": { "cycles": 2, @@ -3319,9 +3319,9 @@ "level16": 417 }, "hitpoints": { - "level11": 1211, - "level15": 1760, - "level16": 1935 + "level11": 1210, + "level15": 1759, + "level16": 1934 } }, "statsHero": { @@ -3359,9 +3359,9 @@ "level16": null }, "chargeDamage": { - "level11": 502, + "level11": 501, "level15": 729, - "level16": 802 + "level16": 801 }, "towerDamage": { "level11": null, @@ -3369,14 +3369,14 @@ "level16": null }, "damage": { - "level11": 251, - "level15": 365, - "level16": 401 + "level11": 250, + "level15": 364, + "level16": 400 }, "hitpoints": { "level11": 1697, "level15": 2466, - "level16": 2712 + "level16": 2711 }, "statsEvo": { "cycles": null, @@ -3435,14 +3435,14 @@ "level16": null }, "damage": { - "level11": 118, + "level11": 117, "level15": 171, "level16": 188 }, "hitpoints": { - "level11": 530, + "level11": 529, "level15": 770, - "level16": 847 + "level16": 846 }, "statsEvo": { "cycles": null, @@ -3501,13 +3501,13 @@ "level16": null }, "damage": { - "level11": 218, + "level11": 217, "level15": 316, - "level16": 348 + "level16": 347 }, "hitpoints": { "level11": 1940, - "level15": 2820, + "level15": 2819, "level16": 3100 }, "statsEvo": { @@ -3567,13 +3567,13 @@ }, "damage": { "level11": 212, - "level15": 309, + "level15": 308, "level16": 339 }, "hitpoints": { - "level11": 1810, + "level11": 1809, "level15": 2630, - "level16": 2892 + "level16": 2891 }, "statsEvo": { "cycles": null, @@ -3631,24 +3631,24 @@ "level16": null }, "damage": { - "level11": 269, - "level15": 391, + "level11": 268, + "level15": 390, "level16": 429 }, "hitpoints": { - "level11": 3994, + "level11": 3993, "level15": 5803, "level16": 6380 }, "statsEvo": { "cycles": 1, "damage": { - "level11": 269, - "level15": 391, + "level11": 268, + "level15": 390, "level16": 429 }, "hitpoints": { - "level11": 3994, + "level11": 3993, "level15": 5803, "level16": 6380 } @@ -3701,9 +3701,9 @@ "level16": 129 }, "hitpoints": { - "level11": 81, - "level15": 119, - "level16": 129 + "level11": 532, + "level15": 773, + "level16": 850 }, "statsEvo": { "cycles": 2, @@ -3713,9 +3713,9 @@ "level16": 129 }, "hitpoints": { - "level11": 81, - "level15": 119, - "level16": 129 + "level11": 532, + "level15": 773, + "level16": 850 } }, "statsHero": { @@ -3762,14 +3762,14 @@ "level16": null }, "damage": { - "level11": 172, + "level11": 171, "level15": 249, "level16": 274 }, "hitpoints": { "level11": 614, - "level15": 893, - "level16": 982 + "level15": 892, + "level16": 981 }, "statsEvo": { "cycles": null, @@ -3827,26 +3827,26 @@ "level16": null }, "damage": { - "level11": 351, - "level15": 510, + "level11": 350, + "level15": 509, "level16": 560 }, "hitpoints": { "level11": 330, - "level15": 480, - "level16": 528 + "level15": 479, + "level16": 527 }, "statsEvo": { "cycles": 2, "damage": { - "level11": 351, - "level15": 510, + "level11": 350, + "level15": 509, "level16": 560 }, "hitpoints": { "level11": 330, - "level15": 480, - "level16": 528 + "level15": 479, + "level16": 527 } }, "statsHero": { @@ -3893,8 +3893,8 @@ }, "damage": { "level11": 74, - "level15": 108, - "level16": 119 + "level15": 107, + "level16": 118 }, "hitpoints": { "level11": 837, @@ -3905,8 +3905,8 @@ "cycles": 2, "damage": { "level11": 74, - "level15": 108, - "level16": 119 + "level15": 107, + "level16": 118 }, "hitpoints": { "level11": 837, @@ -3959,25 +3959,25 @@ "level16": null }, "damage": { - "level11": 177, - "level15": 257, + "level11": 176, + "level15": 256, "level16": 282 }, "hitpoints": { - "level11": 3021, - "level15": 4390, + "level11": 3020, + "level15": 4389, "level16": 4826 }, "statsEvo": { "cycles": 1, "damage": { - "level11": 177, - "level15": 257, + "level11": 176, + "level15": 256, "level16": 282 }, "hitpoints": { - "level11": 3021, - "level15": 4390, + "level11": 3020, + "level15": 4389, "level16": 4826 } }, @@ -4024,14 +4024,14 @@ "level16": null }, "damage": { - "level11": 195, - "level15": 283, - "level16": 311 + "level11": 194, + "level15": 282, + "level16": 310 }, "hitpoints": { "level11": 870, - "level15": 1265, - "level16": 1391 + "level15": 1264, + "level16": 1390 }, "statsEvo": { "cycles": null, @@ -4095,9 +4095,9 @@ "level16": 229 }, "hitpoints": { - "level11": 530, + "level11": 529, "level15": 770, - "level16": 847 + "level16": 846 }, "statsEvo": { "cycles": null, @@ -4158,10 +4158,10 @@ "damage": { "level11": 192, "level15": 279, - "level16": 307 + "level16": 306 }, "hitpoints": { - "level11": 950, + "level11": 949, "level15": 1380, "level16": 1517 }, @@ -4170,10 +4170,10 @@ "damage": { "level11": 192, "level15": 279, - "level16": 307 + "level16": 306 }, "hitpoints": { - "level11": 950, + "level11": 949, "level15": 1380, "level16": 1517 } @@ -4227,9 +4227,9 @@ "level16": 102 }, "hitpoints": { - "level11": 305, - "level15": 443, - "level16": 487 + "level11": 304, + "level15": 442, + "level16": 486 }, "statsEvo": { "cycles": 2, @@ -4239,9 +4239,9 @@ "level16": 102 }, "hitpoints": { - "level11": 305, - "level15": 443, - "level16": 487 + "level11": 304, + "level15": 442, + "level16": 486 } }, "statsHero": { @@ -4287,13 +4287,13 @@ "level16": null }, "damage": { - "level11": 41, - "level15": 60, + "level11": 40, + "level15": 59, "level16": 65 }, "hitpoints": { "level11": 2250, - "level15": 3270, + "level15": 3269, "level16": 3595 }, "statsEvo": { @@ -4354,7 +4354,7 @@ "damage": { "level11": 253, "level15": 368, - "level16": 405 + "level16": 404 }, "hitpoints": { "level11": 1569, @@ -4418,11 +4418,11 @@ }, "damage": { "level11": 148, - "level15": 216, + "level15": 215, "level16": 237 }, "hitpoints": { - "level11": 1718, + "level11": 1717, "level15": 2496, "level16": 2744 }, @@ -4482,14 +4482,14 @@ "level16": null }, "damage": { - "level11": 205, - "level15": 298, + "level11": 204, + "level15": 297, "level16": 327 }, "hitpoints": { - "level11": 2299, - "level15": 3341, - "level16": 3673 + "level11": 2298, + "level15": 3340, + "level16": 3672 }, "statsEvo": { "cycles": null, @@ -4550,11 +4550,11 @@ "damage": { "level11": 225, "level15": 327, - "level16": 360 + "level16": 359 }, "hitpoints": { - "level11": 1001, - "level15": 1455, + "level11": 1000, + "level15": 1454, "level16": 1599 }, "statsEvo": { @@ -4615,10 +4615,10 @@ "damage": { "level11": 161, "level15": 234, - "level16": 258 + "level16": 257 }, "hitpoints": { - "level11": 1800, + "level11": 1799, "level15": 2615, "level16": 2875 }, @@ -4678,14 +4678,14 @@ "level16": null }, "damage": { - "level11": 141, - "level15": 205, - "level16": 225 + "level11": 140, + "level15": 204, + "level16": 224 }, "hitpoints": { "level11": 2214, - "level15": 3218, - "level16": 3538 + "level15": 3217, + "level16": 3537 }, "statsEvo": { "cycles": null, @@ -4746,12 +4746,12 @@ "damage": { "level11": 161, "level15": 234, - "level16": 258 + "level16": 257 }, "hitpoints": { - "level11": 561, - "level15": 815, - "level16": 896 + "level11": 560, + "level15": 814, + "level16": 895 }, "statsEvo": { "cycles": null, @@ -4812,12 +4812,12 @@ "damage": { "level11": 133, "level15": 193, - "level16": 213 + "level16": 212 }, "hitpoints": { - "level11": 530, + "level11": 529, "level15": 770, - "level16": 847 + "level16": 846 }, "statsEvo": { "cycles": null, @@ -4876,13 +4876,13 @@ "level16": null }, "damage": { - "level11": 100, + "level11": 99, "level15": 145, - "level16": 160 + "level16": 159 }, "hitpoints": { "level11": 230, - "level15": 335, + "level15": 334, "level16": 368 }, "statsEvo": { @@ -4941,14 +4941,14 @@ "level16": null }, "damage": { - "level11": 164, + "level11": 163, "level15": 238, - "level16": 262 + "level16": 261 }, "hitpoints": { "level11": 3855, "level15": 5602, - "level16": 6160 + "level16": 6159 }, "statsEvo": { "cycles": null, @@ -5007,14 +5007,14 @@ "level16": null }, "damage": { - "level11": 218, + "level11": 217, "level15": 316, - "level16": 348 + "level16": 347 }, "hitpoints": { "level11": 1052, - "level15": 1529, - "level16": 1681 + "level15": 1528, + "level16": 1680 }, "statsEvo": { "cycles": null, @@ -5073,14 +5073,14 @@ "level16": null }, "damage": { - "level11": 105, - "level15": 153, - "level16": 168 + "level11": 104, + "level15": 152, + "level16": 167 }, "hitpoints": { - "level11": 699, - "level15": 1016, - "level16": 1117 + "level11": 698, + "level15": 1015, + "level16": 1116 }, "statsEvo": { "cycles": null, @@ -5138,14 +5138,14 @@ "level16": null }, "damage": { - "level11": 187, - "level15": 272, - "level16": 299 + "level11": 186, + "level15": 271, + "level16": 298 }, "hitpoints": { "level11": 1300, - "level15": 1890, - "level16": 2078 + "level15": 1889, + "level16": 2077 }, "statsEvo": { "cycles": null, @@ -5204,13 +5204,13 @@ }, "damage": { "level11": 212, - "level15": 309, + "level15": 308, "level16": 339 }, "hitpoints": { "level11": 2150, - "level15": 3125, - "level16": 3436 + "level15": 3124, + "level16": 3435 }, "statsEvo": { "cycles": null, @@ -5273,9 +5273,9 @@ "level16": 409 }, "hitpoints": { - "level11": 82, + "level11": 81, "level15": 119, - "level16": 131 + "level16": 130 }, "statsEvo": { "cycles": null, @@ -5337,12 +5337,12 @@ "damage": { "level11": 128, "level15": 186, - "level16": 205 + "level16": 204 }, "hitpoints": { - "level11": 2386, + "level11": 2385, "level15": 3467, - "level16": 3812 + "level16": 3811 }, "statsEvo": { "cycles": null, @@ -5401,13 +5401,13 @@ }, "damage": { "level11": 120, - "level15": 175, + "level15": 174, "level16": 192 }, "hitpoints": { "level11": 2662, - "level15": 3869, - "level16": 4254 + "level15": 3868, + "level16": 4253 }, "statsEvo": { "cycles": null, @@ -5472,7 +5472,7 @@ "hitpoints": { "level11": 896, "level15": 1302, - "level16": 1432 + "level16": 1431 }, "statsEvo": { "cycles": null, @@ -5530,9 +5530,9 @@ "level16": null }, "damage": { - "level11": 246, + "level11": 245, "level15": 357, - "level16": 393 + "level16": 392 }, "hitpoints": { "level11": 2624, @@ -5601,8 +5601,8 @@ }, "hitpoints": { "level11": 824, - "level15": 1198, - "level16": 1317 + "level15": 1197, + "level16": 1316 }, "statsEvo": { "cycles": 2, @@ -5613,8 +5613,8 @@ }, "hitpoints": { "level11": 824, - "level15": 1198, - "level16": 1317 + "level15": 1197, + "level16": 1316 } }, "statsHero": { @@ -5667,7 +5667,7 @@ }, "hitpoints": { "level11": 1180, - "level15": 1715, + "level15": 1714, "level16": 1885 }, "statsEvo": { @@ -5727,11 +5727,11 @@ }, "damage": { "level11": 266, - "level15": 387, + "level15": 386, "level16": 425 }, "hitpoints": { - "level11": 1370, + "level11": 1369, "level15": 1990, "level16": 2188 }, @@ -5739,11 +5739,11 @@ "cycles": 2, "damage": { "level11": 266, - "level15": 387, + "level15": 386, "level16": 425 }, "hitpoints": { - "level11": 1370, + "level11": 1369, "level15": 1990, "level16": 2188 } @@ -5792,13 +5792,13 @@ "level16": null }, "damage": { - "level11": 44, + "level11": 43, "level15": 63, - "level16": 70 + "level16": 69 }, "hitpoints": { "level11": 1748, - "level15": 2541, + "level15": 2540, "level16": 2793 }, "statsEvo": { @@ -5842,9 +5842,9 @@ "projectile": true, "suicide": false, "fatalDamage": { - "level11": 223, - "level15": 324, - "level16": 356 + "level11": 222, + "level15": 323, + "level16": 355 }, "chargeDamage": { "level11": null, @@ -5857,14 +5857,14 @@ "level16": null }, "damage": { - "level11": 223, - "level15": 324, - "level16": 356 + "level11": 222, + "level15": 323, + "level16": 355 }, "hitpoints": { - "level11": 1357, - "level15": 1972, - "level16": 2168 + "level11": 1356, + "level15": 1971, + "level16": 2167 }, "statsEvo": { "cycles": null, @@ -5927,9 +5927,9 @@ "level16": 254 }, "hitpoints": { - "level11": 1165, - "level15": 1693, - "level16": 1861 + "level11": 1164, + "level15": 1692, + "level16": 1860 }, "statsEvo": { "cycles": null, @@ -5989,25 +5989,25 @@ }, "damage": { "level11": 220, - "level15": 320, - "level16": 352 + "level15": 319, + "level16": 351 }, "hitpoints": { "level11": 1152, "level15": 1674, - "level16": 1841 + "level16": 1840 }, "statsEvo": { "cycles": 2, "damage": { "level11": 220, - "level15": 320, - "level16": 352 + "level15": 319, + "level16": 351 }, "hitpoints": { "level11": 1152, "level15": 1674, - "level16": 1841 + "level16": 1840 } }, "statsHero": { @@ -6057,8 +6057,8 @@ }, "hitpoints": { "level11": 1070, - "level15": 1555, - "level16": 1710 + "level15": 1554, + "level16": 1709 }, "statsEvo": { "cycles": null, @@ -6116,9 +6116,9 @@ "level16": null }, "damage": { - "level11": 44, + "level11": 43, "level15": 63, - "level16": 70 + "level16": 69 }, "hitpoints": { "level11": 1600, @@ -6186,9 +6186,9 @@ "level16": 129 }, "hitpoints": { - "level11": 530, + "level11": 529, "level15": 770, - "level16": 847 + "level16": 846 }, "statsEvo": { "cycles": null, @@ -6254,7 +6254,7 @@ "hitpoints": { "level11": 727, "level15": 1056, - "level16": 1162 + "level16": 1161 }, "statsEvo": { "cycles": 2, @@ -6266,7 +6266,7 @@ "hitpoints": { "level11": 727, "level15": 1056, - "level16": 1162 + "level16": 1161 } }, "statsHero": { @@ -6317,8 +6317,8 @@ "level16": 489 }, "hitpoints": { - "level11": 781, - "level15": 1135, + "level11": 780, + "level15": 1134, "level16": 1247 }, "statsEvo": { @@ -6329,8 +6329,8 @@ "level16": 489 }, "hitpoints": { - "level11": 781, - "level15": 1135, + "level11": 780, + "level15": 1134, "level16": 1247 } }, @@ -7495,12 +7495,12 @@ }, "damage": { "level11": 110, - "level15": 160, - "level16": 176 + "level15": 159, + "level16": 175 }, "hitpoints": { "level11": 230, - "level15": 335, + "level15": 334, "level16": 368 }, "statsEvo": { From 47453f8b752de3d893f146f34f37dd3eae88ed74 Mon Sep 17 00:00:00 2001 From: Gamaliel Date: Sun, 12 Apr 2026 13:05:41 -0400 Subject: [PATCH 6/7] fix(data): update tower damage and hitpoints for Goblin Drill - Add missing tower damage values for levels 11, 15, and 16 - Correct hitpoints for base and evolution forms across levels 11-16 --- cards.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/cards.json b/cards.json index f2b9f56..aad4bad 100644 --- a/cards.json +++ b/cards.json @@ -6373,9 +6373,9 @@ "level16": null }, "towerDamage": { - "level11": null, - "level15": null, - "level16": null + "level11": 26, + "level15": 37, + "level16": 41 }, "damage": { "level11": 84, @@ -6383,9 +6383,9 @@ "level16": 134 }, "hitpoints": { - "level11": 2560, - "level15": 3720, - "level16": 4090 + "level11": 1313, + "level15": 1908, + "level16": 2098 }, "statsEvo": { "cycles": 2, @@ -6395,9 +6395,9 @@ "level16": 363 }, "hitpoints": { - "level11": 2560, - "level15": 3720, - "level16": 4090 + "level11": 1313, + "level15": 1908, + "level16": 2098 } }, "statsHero": { From 10346c17ed2c0b5762203b3c13c588017eb36eb9 Mon Sep 17 00:00:00 2001 From: Gamaliel Date: Sun, 12 Apr 2026 13:08:24 -0400 Subject: [PATCH 7/7] build(update-cards): update card stat calculation and character aggregation logic - Switch from Math.round to Math.floor for level scaling calculations - Refactor character stat aggregation to track hitspeed associated with damage - Implement special handling for kamikaze death spawn character data - Improve base hitpoints and damage detection priority logic --- scripts/update-cards.js | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/scripts/update-cards.js b/scripts/update-cards.js index 9e468d5..c8646c6 100644 --- a/scripts/update-cards.js +++ b/scripts/update-cards.js @@ -62,7 +62,7 @@ const fetchData = (url) => new Promise((resolve, reject) => { }); const calcStats = (base, m) => base - ? { level11: Math.round(base * m.level11), level15: Math.round(base * m.level15), level16: Math.round(base * m.level16) } + ? { level11: Math.floor(base * m.level11), level15: Math.floor(base * m.level15), level16: Math.floor(base * m.level16) } : { level11: null, level15: null, level16: null }; const mergeStats = (computed, existing) => ({ @@ -95,19 +95,20 @@ function collectCharacters(apiItem) { } function aggregateCharacterStats(characters) { - let maxHP = 0, primaryChar = {}, totalDamage = 0, hasProjectile = false; + let maxHP = 0, primaryChar = {}, totalDamage = 0, hasProjectile = false, hsOfDmg = 0; characters.forEach(({ data }) => { const hp = data.hitpoints || 0; const proj = data.projectileData || {}; const dmg = data.damage || proj.damage || 0; + const hs = data.hitSpeed || 0; if (hp > maxHP) { maxHP = hp; primaryChar = data; } - if (dmg > totalDamage) totalDamage = dmg; + if (dmg > totalDamage) { totalDamage = dmg; hsOfDmg = hs; }; if (Object.keys(proj).length > 0) hasProjectile = true; }); - return { maxHP, primaryChar, totalDamage, hasProjectile }; + return { maxHP, primaryChar, totalDamage, hasProjectile, hsOfDmg }; } function extractAllTargets(apiItem, charData) { @@ -135,6 +136,7 @@ function processCard(card, apiItem, multipliers) { const buffData = areaData.buffData || {}; const spawnProjData = projData.spawnProjectileData || areaData.projectileData || {}; const spawnCharData = projData.spawnCharacterData || areaData.spawnCharacterData || {}; + const deathAreaEffect = charData.deathAreaEffectData || {}; card.elixirCost = apiItem.manaCost ?? card.elixirCost; card.rarity = (apiItem.rarity || card.rarity || '').toLowerCase(); @@ -148,19 +150,18 @@ function processCard(card, apiItem, multipliers) { let baseHP, baseDamage; if (characters.length > 0) { - const { maxHP, primaryChar, totalDamage, hasProjectile } = aggregateCharacterStats(characters); - card.hitspeed = primaryChar.hitSpeed ? (primaryChar.hitSpeed + (projData.pingpongVisualTime ?? 0)) / 1000 : card.hitspeed; + let maxHP, primaryChar, totalDamage, hasProjectile, hsOfDmg; + if (charData.deathSpawnCharacterData && charData.kamikaze) + ({ maxHP, primaryChar, totalDamage, hasProjectile, hsOfDmg } = aggregateCharacterStats([{ data: charData.deathSpawnCharacterData, count: 1 }])); + else + ({ maxHP, primaryChar, totalDamage, hasProjectile, hsOfDmg } = aggregateCharacterStats(characters)); + + card.hitspeed = hsOfDmg ? (hsOfDmg + (projData.pingpongVisualTime ?? 0)) / 1000 : card.hitspeed; card.range = primaryChar.range ? primaryChar.range / 1000 : card.range; card.speed = SPEED_MAP[primaryChar.tidSpeed] || card.speed; card.projectile = hasProjectile || card.projectile; - baseHP = maxHP || charData.hitpoints || spawnCharData.hitpoints; - baseDamage = totalDamage || charData.damage || projData.damage || areaData.damage || buffData.damagePerSecond || spawnProjData.damage || spawnCharData.damage; - } else { - card.hitspeed = charData.hitSpeed ? (charData.hitSpeed + (projData.pingpongVisualTime ?? 0)) / 1000 : card.hitspeed; - card.range = charData.range ? charData.range / 1000 : card.range; - card.speed = SPEED_MAP[charData.tidSpeed] || card.speed; - baseHP = charData.hitpoints || spawnCharData.hitpoints; - baseDamage = charData.damage || projData.damage || areaData.damage || buffData.damagePerSecond || spawnProjData.damage || spawnCharData.damage; + baseHP = charData.spawnPathfindMorphData ? charData.spawnPathfindMorphData.hitpoints : maxHP || charData.hitpoints || spawnCharData.hitpoints; + baseDamage = totalDamage || charData.damage || projData.damage || areaData.damage || buffData.damagePerSecond || spawnProjData.damage || spawnCharData.damage || deathAreaEffect.damage; } baseDamage = baseDamage * (apiItem.projectileWaves || 1); @@ -178,7 +179,7 @@ function processCard(card, apiItem, multipliers) { card.projectile = Object.keys(projData).length > 0 || card.projectile; - const rawDuration = apiItem.lifeTime ?? areaData.lifeDuration; + const rawDuration = apiItem.lifeTime ?? areaData.lifeDuration ?? charData.spawnPathfindMorphData?.lifeTime; if (rawDuration != null) card.duration = rawDuration / 1000; const baseFatal = charData.deathDamage || charData.deathSpawnCharacterData?.deathDamage;