chore(zuma): increase pushSpeed and starScores for all 20 levels

Significantly raise pushSpeed values across all levels (roughly 4x increase)
to make the game more challenging. Updated corresponding star score thresholds
proportionally. Adjusted editor UI max pushSpeed to 400 and updated validation
constraints to match.

Changes affect:
- data/zuma.json: level definitions with new pushSpeed and starScores
- src/games/zuma/ZumaEditor.js: editor input max value
- src/games/zuma/ZumaLogic.js: validation range
- tools/genZuma.js: generator table values
This commit is contained in:
Brian Fertig 2026-07-27 23:15:44 -06:00
parent 8e4e48e540
commit d08b48cdda
4 changed files with 101 additions and 101 deletions

View File

@ -1,5 +1,5 @@
{ {
"generatedAt": "2026-07-28T04:37:09.319Z", "generatedAt": "2026-07-28T05:13:50.748Z",
"count": 20, "count": 20,
"levels": [ "levels": [
{ {
@ -371,13 +371,13 @@
"colors": 4, "colors": 4,
"quota": 22, "quota": 22,
"introBalls": 7, "introBalls": 7,
"pushSpeed": 25, "pushSpeed": 100,
"powerUpRate": 0.07, "powerUpRate": 0.07,
"seed": 8919, "seed": 8919,
"starScores": [ "starScores": [
590, 750,
880, 1130,
1170 1500
] ]
}, },
{ {
@ -525,13 +525,13 @@
"colors": 4, "colors": 4,
"quota": 26, "quota": 26,
"introBalls": 8, "introBalls": 8,
"pushSpeed": 32, "pushSpeed": 128,
"powerUpRate": 0.07, "powerUpRate": 0.07,
"seed": 16838, "seed": 16838,
"starScores": [ "starScores": [
710, 960,
1060, 1430,
1410 1910
] ]
}, },
{ {
@ -919,13 +919,13 @@
"colors": 4, "colors": 4,
"quota": 30, "quota": 30,
"introBalls": 9, "introBalls": 9,
"pushSpeed": 35, "pushSpeed": 140,
"powerUpRate": 0.065, "powerUpRate": 0.065,
"seed": 24757, "seed": 24757,
"starScores": [ "starScores": [
830, 1140,
1240, 1710,
1650 2280
] ]
}, },
{ {
@ -1277,13 +1277,13 @@
"colors": 4, "colors": 4,
"quota": 32, "quota": 32,
"introBalls": 10, "introBalls": 10,
"pushSpeed": 35, "pushSpeed": 140,
"powerUpRate": 0.065, "powerUpRate": 0.065,
"seed": 32676, "seed": 32676,
"starScores": [ "starScores": [
880, 1220,
1320, 1820,
1760 2430
] ]
}, },
{ {
@ -1487,13 +1487,13 @@
"colors": 4, "colors": 4,
"quota": 38, "quota": 38,
"introBalls": 11, "introBalls": 11,
"pushSpeed": 37, "pushSpeed": 148,
"powerUpRate": 0.06, "powerUpRate": 0.06,
"seed": 40595, "seed": 40595,
"starScores": [ "starScores": [
1060, 1480,
1580, 2210,
2110 2950
] ]
}, },
{ {
@ -1713,13 +1713,13 @@
"colors": 4, "colors": 4,
"quota": 34, "quota": 34,
"introBalls": 10, "introBalls": 10,
"pushSpeed": 37, "pushSpeed": 148,
"powerUpRate": 0.06, "powerUpRate": 0.06,
"seed": 48514, "seed": 48514,
"starScores": [ "starScores": [
940, 1320,
1410, 1980,
1880 2640
] ]
}, },
{ {
@ -2091,13 +2091,13 @@
"colors": 4, "colors": 4,
"quota": 26, "quota": 26,
"introBalls": 8, "introBalls": 8,
"pushSpeed": 45, "pushSpeed": 180,
"powerUpRate": 0.06, "powerUpRate": 0.06,
"seed": 56433, "seed": 56433,
"starScores": [ "starScores": [
740, 1090,
1110, 1640,
1480 2180
] ]
}, },
{ {
@ -2245,13 +2245,13 @@
"colors": 5, "colors": 5,
"quota": 30, "quota": 30,
"introBalls": 9, "introBalls": 9,
"pushSpeed": 40, "pushSpeed": 160,
"powerUpRate": 0.055, "powerUpRate": 0.055,
"seed": 64352, "seed": 64352,
"starScores": [ "starScores": [
840, 1200,
1260, 1800,
1680 2400
] ]
}, },
{ {
@ -2603,13 +2603,13 @@
"colors": 5, "colors": 5,
"quota": 36, "quota": 36,
"introBalls": 11, "introBalls": 11,
"pushSpeed": 40, "pushSpeed": 160,
"powerUpRate": 0.055, "powerUpRate": 0.055,
"seed": 72271, "seed": 72271,
"starScores": [ "starScores": [
1010, 1440,
1520, 2160,
2020 2880
] ]
}, },
{ {
@ -2997,13 +2997,13 @@
"colors": 5, "colors": 5,
"quota": 34, "quota": 34,
"introBalls": 10, "introBalls": 10,
"pushSpeed": 43, "pushSpeed": 172,
"powerUpRate": 0.055, "powerUpRate": 0.055,
"seed": 80190, "seed": 80190,
"starScores": [ "starScores": [
960, 1400,
1440, 2100,
1920 2800
] ]
}, },
{ {
@ -3207,13 +3207,13 @@
"colors": 5, "colors": 5,
"quota": 42, "quota": 42,
"introBalls": 12, "introBalls": 12,
"pushSpeed": 43, "pushSpeed": 172,
"powerUpRate": 0.05, "powerUpRate": 0.05,
"seed": 88109, "seed": 88109,
"starScores": [ "starScores": [
1190, 1730,
1790, 2600,
2380 3460
] ]
}, },
{ {
@ -3433,13 +3433,13 @@
"colors": 5, "colors": 5,
"quota": 38, "quota": 38,
"introBalls": 11, "introBalls": 11,
"pushSpeed": 45, "pushSpeed": 180,
"powerUpRate": 0.05, "powerUpRate": 0.05,
"seed": 96028, "seed": 96028,
"starScores": [ "starScores": [
1090, 1600,
1630, 2390,
2170 3190
] ]
}, },
{ {
@ -3791,13 +3791,13 @@
"colors": 5, "colors": 5,
"quota": 34, "quota": 34,
"introBalls": 10, "introBalls": 10,
"pushSpeed": 48, "pushSpeed": 192,
"powerUpRate": 0.05, "powerUpRate": 0.05,
"seed": 103947, "seed": 103947,
"starScores": [ "starScores": [
980,
1470, 1470,
1960 2210,
2940
] ]
}, },
{ {
@ -4001,13 +4001,13 @@
"colors": 5, "colors": 5,
"quota": 46, "quota": 46,
"introBalls": 13, "introBalls": 13,
"pushSpeed": 48, "pushSpeed": 192,
"powerUpRate": 0.05, "powerUpRate": 0.05,
"seed": 111866, "seed": 111866,
"starScores": [ "starScores": [
1330,
1990, 1990,
2650 2980,
3970
] ]
}, },
{ {
@ -4155,13 +4155,13 @@
"colors": 6, "colors": 6,
"quota": 32, "quota": 32,
"introBalls": 9, "introBalls": 9,
"pushSpeed": 51, "pushSpeed": 204,
"powerUpRate": 0.05, "powerUpRate": 0.05,
"seed": 119785, "seed": 119785,
"starScores": [ "starScores": [
930, 1420,
1400, 2130,
1860 2840
] ]
}, },
{ {
@ -4549,13 +4549,13 @@
"colors": 6, "colors": 6,
"quota": 38, "quota": 38,
"introBalls": 11, "introBalls": 11,
"pushSpeed": 53, "pushSpeed": 212,
"powerUpRate": 0.05, "powerUpRate": 0.05,
"seed": 127704, "seed": 127704,
"starScores": [ "starScores": [
1120, 1720,
1670, 2580,
2230 3440
] ]
}, },
{ {
@ -4907,13 +4907,13 @@
"colors": 6, "colors": 6,
"quota": 34, "quota": 34,
"introBalls": 10, "introBalls": 10,
"pushSpeed": 50, "pushSpeed": 200,
"powerUpRate": 0.045, "powerUpRate": 0.045,
"seed": 135623, "seed": 135623,
"starScores": [ "starScores": [
990, 1500,
1480, 2240,
1970 2990
] ]
}, },
{ {
@ -5133,13 +5133,13 @@
"colors": 6, "colors": 6,
"quota": 40, "quota": 40,
"introBalls": 11, "introBalls": 11,
"pushSpeed": 50, "pushSpeed": 200,
"powerUpRate": 0.045, "powerUpRate": 0.045,
"seed": 143542, "seed": 143542,
"starScores": [ "starScores": [
1160, 1760,
1740, 2640,
2320 3520
] ]
}, },
{ {
@ -5343,13 +5343,13 @@
"colors": 6, "colors": 6,
"quota": 50, "quota": 50,
"introBalls": 14, "introBalls": 14,
"pushSpeed": 61, "pushSpeed": 244,
"powerUpRate": 0.045, "powerUpRate": 0.045,
"seed": 151461, "seed": 151461,
"starScores": [ "starScores": [
1510, 2420,
2260, 3630,
3010 4840
] ]
}, },
{ {
@ -5553,13 +5553,13 @@
"colors": 6, "colors": 6,
"quota": 52, "quota": 52,
"introBalls": 14, "introBalls": 14,
"pushSpeed": 64, "pushSpeed": 256,
"powerUpRate": 0.045, "powerUpRate": 0.045,
"seed": 159380, "seed": 159380,
"starScores": [ "starScores": [
1580, 2580,
2370, 3870,
3160 5160
] ]
} }
] ]

View File

@ -205,7 +205,7 @@ export default class ZumaEditor extends Phaser.Scene {
${field('zu-colors', 'COLORS (4-6)', 'number', 'min="4" max="6" step="1"')} ${field('zu-colors', 'COLORS (4-6)', 'number', 'min="4" max="6" step="1"')}
${field('zu-quota', 'QUOTA', 'number', 'min="20" step="1"')} ${field('zu-quota', 'QUOTA', 'number', 'min="20" step="1"')}
${field('zu-intro', 'INTRO BALLS', 'number', 'min="1" step="1"')} ${field('zu-intro', 'INTRO BALLS', 'number', 'min="1" step="1"')}
${field('zu-push', 'PUSH SPEED', 'number', 'min="10" max="100" step="1"')} ${field('zu-push', 'PUSH SPEED', 'number', 'min="10" max="400" step="1"')}
${field('zu-power', 'POWER-UP RATE', 'number', 'min="0" max="0.2" step="0.005"')} ${field('zu-power', 'POWER-UP RATE', 'number', 'min="0" max="0.2" step="0.005"')}
${field('zu-seed', 'SEED', 'number', 'step="1"')} ${field('zu-seed', 'SEED', 'number', 'step="1"')}
${field('zu-star1', '★ SCORE', 'number', 'step="10"')} ${field('zu-star1', '★ SCORE', 'number', 'step="10"')}

View File

@ -180,7 +180,7 @@ export function validateLevelParams(def) {
if (!(def.colors >= 4 && def.colors <= 6)) errs.push('colors must be 4..6'); if (!(def.colors >= 4 && def.colors <= 6)) errs.push('colors must be 4..6');
if (!(def.quota >= 20)) errs.push('quota must be >= 20'); if (!(def.quota >= 20)) errs.push('quota must be >= 20');
if (!(def.introBalls < def.quota)) errs.push('introBalls must be < quota'); if (!(def.introBalls < def.quota)) errs.push('introBalls must be < quota');
if (!(def.pushSpeed >= 10 && def.pushSpeed <= 100)) errs.push('pushSpeed must be 10..100'); if (!(def.pushSpeed >= 10 && def.pushSpeed <= 400)) errs.push('pushSpeed must be 10..400');
if (!(def.powerUpRate >= 0 && def.powerUpRate <= 0.2)) errs.push('powerUpRate must be 0..0.2'); if (!(def.powerUpRate >= 0 && def.powerUpRate <= 0.2)) errs.push('powerUpRate must be 0..0.2');
if (!(Array.isArray(def.starScores) && def.starScores.length === 3 if (!(Array.isArray(def.starScores) && def.starScores.length === 3
&& def.starScores[0] < def.starScores[1] && def.starScores[1] < def.starScores[2])) { && def.starScores[0] < def.starScores[1] && def.starScores[1] < def.starScores[2])) {

View File

@ -170,26 +170,26 @@ const SHAPES = { sCurve, horseshoe, spiral, zigzag, doubleLoop, figureEight };
const TABLE = [ const TABLE = [
// level, name, shape, colors, quota, intro, push, powerUpRate // level, name, shape, colors, quota, intro, push, powerUpRate
[1, 'Riverbend', 'sCurve', 4, 22, 7, 25, 0.07], [1, 'Riverbend', 'sCurve', 4, 22, 7, 100, 0.07],
[2, 'Temple Gate', 'horseshoe', 4, 26, 8, 32, 0.07], [2, 'Temple Gate', 'horseshoe', 4, 26, 8, 128, 0.07],
[3, 'Twin Pools', 'doubleLoop', 4, 30, 9, 35, 0.065], [3, 'Twin Pools', 'doubleLoop', 4, 30, 9, 140, 0.065],
[4, 'Switchbacks', 'zigzag', 4, 32, 10, 35, 0.065], [4, 'Switchbacks', 'zigzag', 4, 32, 10, 140, 0.065],
[5, 'Serpent Coil', 'spiral', 4, 38, 11, 37, 0.06], [5, 'Serpent Coil', 'spiral', 4, 38, 11, 148, 0.06],
[6, 'Crossroads', 'figureEight', 4, 34, 10, 37, 0.06], [6, 'Crossroads', 'figureEight', 4, 34, 10, 148, 0.06],
[7, 'Rapids', 'sCurve', 4, 26, 8, 45, 0.06], [7, 'Rapids', 'sCurve', 4, 26, 8, 180, 0.06],
[8, 'Sun Court', 'horseshoe', 5, 30, 9, 40, 0.055], [8, 'Sun Court', 'horseshoe', 5, 30, 9, 160, 0.055],
[9, 'Thunder Steps', 'zigzag', 5, 36, 11, 40, 0.055], [9, 'Thunder Steps', 'zigzag', 5, 36, 11, 160, 0.055],
[10, 'Twin Serpents', 'doubleLoop', 5, 34, 10, 43, 0.055], [10, 'Twin Serpents', 'doubleLoop', 5, 34, 10, 172, 0.055],
[11, 'Deep Coil', 'spiral', 5, 42, 12, 43, 0.05], [11, 'Deep Coil', 'spiral', 5, 42, 12, 172, 0.05],
[12, 'Tangled Path', 'figureEight', 5, 38, 11, 45, 0.05], [12, 'Tangled Path', 'figureEight', 5, 38, 11, 180, 0.05],
[13, 'Lightning Run', 'zigzag', 5, 34, 10, 48, 0.05], [13, 'Lightning Run', 'zigzag', 5, 34, 10, 192, 0.05],
[14, 'Whirlpool', 'spiral', 5, 46, 13, 48, 0.05], [14, 'Whirlpool', 'spiral', 5, 46, 13, 192, 0.05],
[15, 'Obsidian Gate', 'horseshoe', 6, 32, 9, 51, 0.05], [15, 'Obsidian Gate', 'horseshoe', 6, 32, 9, 204, 0.05],
[16, 'Twin Tempests', 'doubleLoop', 6, 38, 11, 53, 0.05], [16, 'Twin Tempests', 'doubleLoop', 6, 38, 11, 212, 0.05],
[17, 'Stormsteps', 'zigzag', 6, 34, 10, 50, 0.045], [17, 'Stormsteps', 'zigzag', 6, 34, 10, 200, 0.045],
[18, 'Maelstrom Cross', 'figureEight', 6, 40, 11, 50, 0.045], [18, 'Maelstrom Cross', 'figureEight', 6, 40, 11, 200, 0.045],
[19, 'Abyss Coil', 'spiral', 6, 50, 14, 61, 0.045], [19, 'Abyss Coil', 'spiral', 6, 50, 14, 244, 0.045],
[20, 'The Final Coil', 'spiral', 6, 52, 14, 64, 0.045], [20, 'The Final Coil', 'spiral', 6, 52, 14, 256, 0.045],
]; ];
// Calibrated against the headless aimbot in verifyZuma.js, which takes the best // Calibrated against the headless aimbot in verifyZuma.js, which takes the best