feat(peggle): expand to 25 levels with friend intros and redesigned level select

Expand Peggle from 5 to 25 levels (5 per friend) with unique shapes and
progressive difficulty. Each friend block (Ethel, Kona, Zanthor, Fireball,
Victor) gets distinct names, backgrounds, and level layouts.

- Redesign level select: one row per friend showing portrait, name, power,
  and their 5 level tiles
- Add friend intro screens: video (or portrait fallback), bio, and power
  explainer before each friend's first level
- Intros skip on replay/try-again; input hold prevents accidental cannon
  launches after UI clicks
- Add intro videos for Ethel and Kona; document the video system
- Update level generator with `pentagram()` helper and 5 variants per friend
- Verify block integrity, intro markers (1,6,11,16,21), and level name uniqueness
This commit is contained in:
Brian Fertig 2026-07-11 16:42:44 -06:00
parent 7898d13d18
commit fba1f0c53d
31 changed files with 8273 additions and 1331 deletions

View File

@ -7,359 +7,289 @@
"orangeCount": 25,
"greenCount": 2,
"pegs": [
{
"x": 405,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 383,
"y": 491,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 326,
"y": 524,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 263,
"y": 512,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 221,
"y": 462,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 221,
"y": 398,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 262,
"y": 348,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 326,
"y": 336,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 383,
"y": 369,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 985,
"y": 430,
"y": 359,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 963,
"y": 491,
"x": 930,
"y": 416,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 906,
"y": 524,
"x": 865,
"y": 464,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 843,
"y": 512,
"x": 795,
"y": 501,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 801,
"y": 462,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 801,
"y": 398,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 843,
"y": 348,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 906,
"y": 336,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 963,
"y": 369,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 480,
"y": 390,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 560,
"y": 390,
"x": 719,
"y": 526,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 640,
"y": 390,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 720,
"y": 390,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 480,
"y": 470,
"y": 538,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 560,
"y": 470,
"y": 538,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 640,
"y": 470,
"x": 481,
"y": 526,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 720,
"y": 470,
"x": 405,
"y": 501,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 515,
"y": 430,
"x": 335,
"y": 464,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 270,
"y": 416,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 215,
"y": 359,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 236,
"y": 598,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 290,
"y": 548,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 352,
"y": 506,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 490,
"y": 452,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 563,
"y": 441,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 637,
"y": 441,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 710,
"y": 452,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 848,
"y": 506,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 910,
"y": 548,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 964,
"y": 598,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 782,
"y": 575,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 705,
"y": 652,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 430,
"y": 680,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 685,
"y": 430,
"x": 495,
"y": 652,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 770,
"y": 430,
"x": 418,
"y": 575,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 220,
"y": 240,
"x": 418,
"y": 365,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 495,
"y": 288,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 260,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 705,
"y": 288,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 782,
"y": 365,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 150,
"y": 480,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 372,
"y": 240,
"x": 240,
"y": 480,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 524,
"y": 240,
"x": 960,
"y": 480,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 676,
"y": 240,
"x": 1050,
"y": 480,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 828,
"y": 240,
"x": 380,
"y": 740,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 980,
"y": 240,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 300,
"y": 620,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 450,
"y": 620,
"x": 490,
"y": 740,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 600,
"y": 620,
"y": 740,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 750,
"y": 620,
"x": 710,
"y": 740,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 900,
"y": 620,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 300,
"y": 710,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 450,
"y": 710,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 600,
"y": 710,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 750,
"y": 710,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 900,
"y": 710,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 140,
"y": 320,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 180,
"y": 440,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 220,
"y": 560,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 1060,
"y": 320,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 980,
"y": 560,
"x": 820,
"y": 740,
"shape": "circle",
"r": 16,
"orangeEligible": false

View File

@ -8,323 +8,344 @@
"greenCount": 2,
"pegs": [
{
"x": 600,
"y": 250,
"x": 933,
"y": 238,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 619,
"y": 309,
"x": 900,
"y": 311,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 639,
"y": 369,
"x": 851,
"y": 374,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 658,
"y": 428,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 677,
"y": 488,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 697,
"y": 547,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 716,
"y": 607,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 735,
"y": 666,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 685,
"y": 629,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 634,
"y": 593,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 584,
"y": 556,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 533,
"y": 519,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 482,
"y": 482,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 432,
"y": 446,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 381,
"y": 409,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 444,
"y": 409,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 506,
"y": 409,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 569,
"y": 409,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 694,
"y": 409,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 756,
"y": 409,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 819,
"y": 409,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 768,
"y": 446,
"x": 789,
"y": 424,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 718,
"y": 482,
"y": 460,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 566,
"y": 593,
"x": 640,
"y": 478,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 515,
"y": 629,
"x": 560,
"y": 478,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 465,
"y": 666,
"x": 482,
"y": 460,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 484,
"y": 607,
"x": 411,
"y": 424,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 503,
"y": 547,
"x": 349,
"y": 374,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 561,
"y": 369,
"x": 300,
"y": 311,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 581,
"y": 309,
"x": 267,
"y": 238,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 972,
"y": 577,
"x": 1025,
"y": 330,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 942,
"y": 638,
"x": 980,
"y": 406,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 901,
"y": 693,
"x": 922,
"y": 473,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 852,
"y": 740,
"y": 527,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 796,
"y": 779,
"x": 773,
"y": 567,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 404,
"y": 779,
"x": 688,
"y": 592,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 600,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 512,
"y": 592,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 427,
"y": 567,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 348,
"y": 740,
"y": 527,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 299,
"y": 693,
"x": 278,
"y": 473,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 258,
"y": 638,
"x": 220,
"y": 406,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 228,
"y": 577,
"x": 175,
"y": 330,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 240,
"y": 240,
"x": 1098,
"y": 446,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1044,
"y": 519,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 978,
"y": 583,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 904,
"y": 636,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 822,
"y": 676,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 736,
"y": 704,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 646,
"y": 718,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 554,
"y": 718,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 464,
"y": 704,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 378,
"y": 676,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 296,
"y": 636,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 222,
"y": 583,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 156,
"y": 519,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 102,
"y": 446,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 180,
"y": 260,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 350,
"y": 240,
"x": 180,
"y": 460,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 460,
"y": 240,
"x": 180,
"y": 560,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 740,
"y": 240,
"x": 1020,
"y": 260,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 850,
"y": 240,
"x": 1020,
"y": 460,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 960,
"y": 240,
"x": 1020,
"y": 560,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 420,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 540,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 660,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 780,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false

View File

@ -8,459 +8,263 @@
"greenCount": 2,
"pegs": [
{
"x": 690,
"y": 470,
"x": 538,
"y": 200,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 664,
"y": 534,
"x": 558,
"y": 266,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 560,
"x": 558,
"y": 334,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 536,
"y": 534,
"x": 538,
"y": 400,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 510,
"y": 470,
"x": 501,
"y": 457,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 536,
"y": 406,
"x": 450,
"y": 502,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 380,
"x": 388,
"y": 530,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 664,
"y": 406,
"x": 320,
"y": 540,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 775,
"y": 470,
"x": 812,
"y": 790,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 758,
"y": 546,
"x": 750,
"y": 762,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 709,
"y": 607,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 639,
"y": 641,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 561,
"y": 641,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 491,
"y": 607,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 442,
"y": 546,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 425,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 442,
"y": 394,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 491,
"y": 333,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 561,
"y": 299,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 639,
"y": 299,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 709,
"y": 333,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 758,
"y": 394,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 860,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 847,
"y": 550,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 810,
"y": 623,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 753,
"y": 680,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 680,
"x": 699,
"y": 717,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 730,
"x": 662,
"y": 660,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 520,
"y": 717,
"x": 642,
"y": 594,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 447,
"y": 680,
"x": 642,
"y": 526,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 390,
"y": 623,
"x": 662,
"y": 460,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 353,
"y": 550,
"x": 699,
"y": 403,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 340,
"y": 470,
"x": 750,
"y": 358,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 353,
"y": 390,
"x": 812,
"y": 330,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 390,
"y": 317,
"x": 880,
"y": 320,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 447,
"y": 260,
"x": 300,
"y": 640,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 520,
"y": 223,
"x": 300,
"y": 710,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 300,
"y": 780,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 210,
"y": 620,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 680,
"y": 223,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 753,
"y": 260,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 810,
"y": 317,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 847,
"y": 390,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 829,
"y": 212,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 886,
"y": 278,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 926,
"y": 356,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 944,
"y": 442,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 940,
"y": 529,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 914,
"y": 613,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 868,
"y": 687,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 805,
"y": 748,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 728,
"y": 790,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 472,
"y": 790,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 395,
"y": 748,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 332,
"y": 687,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 286,
"y": 613,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 260,
"y": 529,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 256,
"y": 442,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 274,
"y": 356,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 314,
"y": 278,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 371,
"y": 212,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 600,
"y": 470,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 780,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 160,
"y": 740,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 280,
"y": 740,
"x": 247,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 920,
"y": 740,
"x": 333,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 420,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 780,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 867,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 953,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 1040,
"y": 740,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 480,
"y": 340,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 340,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 440,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 720,
"y": 440,
"shape": "circle",
"r": 16,
"orangeEligible": true
}
],
"walls": [],

View File

@ -8,617 +8,358 @@
"greenCount": 2,
"pegs": [
{
"x": 180,
"y": 250,
"x": 939,
"y": 263,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 300,
"y": 250,
"x": 898,
"y": 326,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 420,
"y": 250,
"x": 845,
"y": 381,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 540,
"y": 250,
"x": 782,
"y": 424,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 660,
"y": 250,
"x": 712,
"y": 453,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 780,
"y": 250,
"x": 638,
"y": 468,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 900,
"y": 250,
"x": 562,
"y": 468,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1020,
"y": 250,
"x": 488,
"y": 453,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 180,
"y": 370,
"x": 418,
"y": 424,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 300,
"y": 370,
"x": 355,
"y": 381,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 420,
"y": 370,
"x": 302,
"y": 326,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 540,
"y": 370,
"x": 261,
"y": 263,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 660,
"y": 370,
"x": 1021,
"y": 396,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 780,
"y": 370,
"x": 968,
"y": 458,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 900,
"y": 370,
"x": 906,
"y": 511,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1020,
"y": 370,
"x": 836,
"y": 553,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 180,
"y": 490,
"x": 761,
"y": 585,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 300,
"y": 490,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 420,
"y": 490,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 540,
"y": 490,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 660,
"y": 490,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 780,
"y": 490,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 900,
"y": 490,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1020,
"y": 490,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 180,
"y": 610,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 300,
"y": 610,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 420,
"y": 610,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 540,
"y": 610,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 660,
"y": 610,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 780,
"y": 610,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 900,
"y": 610,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1020,
"y": 610,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 180,
"y": 730,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 300,
"y": 730,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 420,
"y": 730,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 540,
"y": 730,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 660,
"y": 730,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 780,
"y": 730,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 900,
"y": 730,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1020,
"y": 730,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 240,
"y": 310,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 360,
"y": 310,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 480,
"y": 310,
"x": 681,
"y": 604,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 310,
"y": 610,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 720,
"y": 310,
"x": 519,
"y": 604,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 840,
"y": 310,
"x": 439,
"y": 585,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 960,
"y": 310,
"x": 364,
"y": 553,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1080,
"y": 310,
"x": 294,
"y": 511,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 240,
"y": 430,
"x": 232,
"y": 458,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 360,
"y": 430,
"x": 179,
"y": 396,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 480,
"y": 430,
"x": 280,
"y": 420,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 280,
"y": 570,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 280,
"y": 645,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 280,
"y": 720,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 440,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 440,
"y": 545,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 440,
"y": 695,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 440,
"y": 770,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 720,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 840,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 960,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1080,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 240,
"y": 550,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 360,
"y": 550,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 480,
"y": 550,
"y": 500,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 550,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 720,
"y": 550,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 840,
"y": 550,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 960,
"y": 550,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1080,
"y": 550,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 240,
"y": 670,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 360,
"y": 670,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 480,
"y": 670,
"y": 570,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 670,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 720,
"y": 670,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 840,
"y": 670,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 960,
"y": 670,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1080,
"y": 670,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 240,
"y": 790,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 360,
"y": 790,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 480,
"y": 790,
"y": 710,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 790,
"y": 780,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 720,
"y": 790,
"x": 760,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 760,
"y": 545,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 760,
"y": 695,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 760,
"y": 770,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 920,
"y": 420,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 920,
"y": 570,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 920,
"y": 645,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 920,
"y": 720,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 200,
"y": 250,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 360,
"y": 250,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 520,
"y": 250,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 680,
"y": 250,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 840,
"y": 790,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 960,
"y": 790,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1080,
"y": 790,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 160,
"y": 210,
"y": 250,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 286,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 411,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 537,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 663,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 789,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 914,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 1040,
"y": 210,
"x": 1000,
"y": 250,
"shape": "circle",
"r": 16,
"orangeEligible": false

View File

@ -0,0 +1,370 @@
{
"version": 1,
"board": {
"width": 1200,
"height": 900
},
"orangeCount": 25,
"greenCount": 2,
"pegs": [
{
"x": 405,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 383,
"y": 491,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 326,
"y": 524,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 263,
"y": 512,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 221,
"y": 462,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 221,
"y": 398,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 262,
"y": 348,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 326,
"y": 336,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 383,
"y": 369,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 985,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 963,
"y": 491,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 906,
"y": 524,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 843,
"y": 512,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 801,
"y": 462,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 801,
"y": 398,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 843,
"y": 348,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 906,
"y": 336,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 963,
"y": 369,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 480,
"y": 390,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 560,
"y": 390,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 640,
"y": 390,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 720,
"y": 390,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 480,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 560,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 640,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 720,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 515,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 685,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 770,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 220,
"y": 240,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 372,
"y": 240,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 524,
"y": 240,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 676,
"y": 240,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 828,
"y": 240,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 980,
"y": 240,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 300,
"y": 620,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 450,
"y": 620,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 600,
"y": 620,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 750,
"y": 620,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 900,
"y": 620,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 300,
"y": 710,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 450,
"y": 710,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 600,
"y": 710,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 750,
"y": 710,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 900,
"y": 710,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 140,
"y": 320,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 180,
"y": 440,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 220,
"y": 560,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 1060,
"y": 320,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 980,
"y": 560,
"shape": "circle",
"r": 16,
"orangeEligible": false
}
],
"walls": [],
"moving": []
}

View File

@ -0,0 +1,370 @@
{
"version": 1,
"board": {
"width": 1200,
"height": 900
},
"orangeCount": 25,
"greenCount": 2,
"pegs": [
{
"x": 500,
"y": 520,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 479,
"y": 585,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 424,
"y": 625,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 356,
"y": 625,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 301,
"y": 585,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 280,
"y": 520,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 301,
"y": 455,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 356,
"y": 415,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 424,
"y": 415,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 479,
"y": 455,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 300,
"y": 370,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 272,
"y": 408,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 228,
"y": 394,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 228,
"y": 346,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 272,
"y": 332,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 385,
"y": 330,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 357,
"y": 368,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 313,
"y": 306,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 357,
"y": 292,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 475,
"y": 330,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 447,
"y": 368,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 447,
"y": 292,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 560,
"y": 370,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 532,
"y": 408,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 488,
"y": 394,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 532,
"y": 332,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 968,
"y": 620,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 951,
"y": 672,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 907,
"y": 704,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 853,
"y": 704,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 809,
"y": 672,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 792,
"y": 620,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 809,
"y": 568,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 853,
"y": 536,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 907,
"y": 536,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 951,
"y": 568,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 808,
"y": 500,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 750,
"y": 519,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 750,
"y": 481,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 876,
"y": 468,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 818,
"y": 449,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 948,
"y": 468,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1016,
"y": 500,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 958,
"y": 519,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 700,
"y": 240,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 817,
"y": 240,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 933,
"y": 240,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 1050,
"y": 240,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 150,
"y": 740,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 250,
"y": 740,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 350,
"y": 740,
"shape": "circle",
"r": 16,
"orangeEligible": false
}
],
"walls": [],
"moving": []
}

View File

@ -0,0 +1,363 @@
{
"version": 1,
"board": {
"width": 1200,
"height": 900
},
"orangeCount": 25,
"greenCount": 2,
"pegs": [
{
"x": 340,
"y": 300,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 310,
"y": 352,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 250,
"y": 352,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 220,
"y": 300,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 250,
"y": 248,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 310,
"y": 248,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 980,
"y": 640,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 950,
"y": 692,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 890,
"y": 692,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 860,
"y": 640,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 890,
"y": 588,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 950,
"y": 588,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 350,
"y": 340,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 421,
"y": 377,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 493,
"y": 414,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 564,
"y": 451,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 636,
"y": 489,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 707,
"y": 526,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 779,
"y": 563,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 850,
"y": 600,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 980,
"y": 300,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 950,
"y": 352,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 890,
"y": 352,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 860,
"y": 300,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 890,
"y": 248,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 950,
"y": 248,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 340,
"y": 640,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 310,
"y": 692,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 250,
"y": 692,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 220,
"y": 640,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 250,
"y": 588,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 310,
"y": 588,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 850,
"y": 340,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 779,
"y": 377,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 707,
"y": 414,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 636,
"y": 451,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 564,
"y": 489,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 493,
"y": 526,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 421,
"y": 563,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 350,
"y": 600,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 240,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 345,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 450,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 555,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 660,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 765,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 870,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 975,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 560,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 640,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
}
],
"walls": [],
"moving": []
}

View File

@ -0,0 +1,328 @@
{
"version": 1,
"board": {
"width": 1200,
"height": 900
},
"orangeCount": 25,
"greenCount": 2,
"pegs": [
{
"x": 750,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 733,
"y": 500,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 685,
"y": 553,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 618,
"y": 579,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 547,
"y": 570,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 488,
"y": 529,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 454,
"y": 466,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 454,
"y": 394,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 488,
"y": 331,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 547,
"y": 290,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 618,
"y": 281,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 685,
"y": 307,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 733,
"y": 360,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 670,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 644,
"y": 485,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 584,
"y": 498,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 537,
"y": 460,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 537,
"y": 400,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 584,
"y": 362,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 644,
"y": 375,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 190,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 285,
"y": 640,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 261,
"y": 691,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 206,
"y": 703,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 161,
"y": 668,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 161,
"y": 612,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 206,
"y": 577,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 261,
"y": 589,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1045,
"y": 640,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1021,
"y": 691,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 966,
"y": 703,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 921,
"y": 668,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 921,
"y": 612,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 966,
"y": 577,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1021,
"y": 589,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 160,
"y": 300,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 260,
"y": 300,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 360,
"y": 300,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 840,
"y": 300,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 940,
"y": 300,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 1040,
"y": 300,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 430,
"y": 740,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 543,
"y": 740,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 657,
"y": 740,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 770,
"y": 740,
"shape": "circle",
"r": 16,
"orangeEligible": false
}
],
"walls": [],
"moving": []
}

View File

@ -0,0 +1,279 @@
{
"version": 1,
"board": {
"width": 1200,
"height": 900
},
"orangeCount": 25,
"greenCount": 2,
"pegs": [
{
"x": 600,
"y": 200,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 530,
"y": 245,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 460,
"y": 290,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 390,
"y": 335,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 320,
"y": 380,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 670,
"y": 245,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 740,
"y": 290,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 810,
"y": 335,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 880,
"y": 380,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 320,
"y": 460,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 320,
"y": 540,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 320,
"y": 620,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 320,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 880,
"y": 460,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 880,
"y": 540,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 880,
"y": 620,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 880,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 400,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 480,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 560,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 640,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 720,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 800,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 460,
"y": 460,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 460,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 740,
"y": 460,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 460,
"y": 570,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 570,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 740,
"y": 570,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 680,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 140,
"y": 500,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 240,
"y": 500,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 960,
"y": 500,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 1060,
"y": 500,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 430,
"y": 780,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 543,
"y": 780,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 657,
"y": 780,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 770,
"y": 780,
"shape": "circle",
"r": 16,
"orangeEligible": false
}
],
"walls": [],
"moving": []
}

View File

@ -0,0 +1,335 @@
{
"version": 1,
"board": {
"width": 1200,
"height": 900
},
"orangeCount": 25,
"greenCount": 2,
"pegs": [
{
"x": 600,
"y": 250,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 619,
"y": 309,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 639,
"y": 369,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 658,
"y": 428,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 677,
"y": 488,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 697,
"y": 547,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 716,
"y": 607,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 735,
"y": 666,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 685,
"y": 629,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 634,
"y": 593,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 584,
"y": 556,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 533,
"y": 519,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 482,
"y": 482,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 432,
"y": 446,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 381,
"y": 409,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 444,
"y": 409,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 506,
"y": 409,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 569,
"y": 409,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 694,
"y": 409,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 756,
"y": 409,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 819,
"y": 409,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 768,
"y": 446,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 718,
"y": 482,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 566,
"y": 593,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 515,
"y": 629,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 465,
"y": 666,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 484,
"y": 607,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 503,
"y": 547,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 561,
"y": 369,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 581,
"y": 309,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 972,
"y": 577,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 942,
"y": 638,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 901,
"y": 693,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 852,
"y": 740,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 796,
"y": 779,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 404,
"y": 779,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 348,
"y": 740,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 299,
"y": 693,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 258,
"y": 638,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 228,
"y": 577,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 240,
"y": 240,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 350,
"y": 240,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 460,
"y": 240,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 740,
"y": 240,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 850,
"y": 240,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 960,
"y": 240,
"shape": "circle",
"r": 16,
"orangeEligible": false
}
],
"walls": [],
"moving": []
}

View File

@ -0,0 +1,272 @@
{
"version": 1,
"board": {
"width": 1200,
"height": 900
},
"orangeCount": 25,
"greenCount": 2,
"pegs": [
{
"x": 625,
"y": 208,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 678,
"y": 228,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 726,
"y": 260,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 765,
"y": 301,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 795,
"y": 349,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 814,
"y": 403,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 820,
"y": 460,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 814,
"y": 517,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 795,
"y": 571,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 765,
"y": 619,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 726,
"y": 660,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 678,
"y": 692,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 625,
"y": 712,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 858,
"y": 432,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 858,
"y": 488,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 280,
"y": 220,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 304,
"y": 292,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 327,
"y": 365,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 265,
"y": 320,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 204,
"y": 275,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 356,
"y": 275,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 233,
"y": 365,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 920,
"y": 540,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 944,
"y": 612,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 967,
"y": 685,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 905,
"y": 640,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 844,
"y": 595,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 996,
"y": 595,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 873,
"y": 685,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 180,
"y": 660,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 260,
"y": 693,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 340,
"y": 727,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 420,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 760,
"y": 220,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 840,
"y": 220,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 920,
"y": 220,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 1000,
"y": 220,
"shape": "circle",
"r": 16,
"orangeEligible": false
}
],
"walls": [],
"moving": []
}

View File

@ -0,0 +1,286 @@
{
"version": 1,
"board": {
"width": 1200,
"height": 900
},
"orangeCount": 25,
"greenCount": 2,
"pegs": [
{
"x": 800,
"y": 420,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 783,
"y": 501,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 734,
"y": 569,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 662,
"y": 610,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 579,
"y": 619,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 500,
"y": 593,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 438,
"y": 538,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 404,
"y": 462,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 404,
"y": 378,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 438,
"y": 302,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 500,
"y": 247,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 579,
"y": 221,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 662,
"y": 230,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 734,
"y": 271,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 783,
"y": 339,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 490,
"y": 340,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 340,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 710,
"y": 340,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 490,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 710,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 490,
"y": 520,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 520,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 710,
"y": 520,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 420,
"y": 680,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 510,
"y": 680,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 680,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 690,
"y": 680,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 780,
"y": 680,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 470,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 557,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 643,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 730,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 160,
"y": 300,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 240,
"y": 300,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 320,
"y": 300,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 880,
"y": 300,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 960,
"y": 300,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 1040,
"y": 300,
"shape": "circle",
"r": 16,
"orangeEligible": false
}
],
"walls": [],
"moving": []
}

View File

@ -0,0 +1,363 @@
{
"version": 1,
"board": {
"width": 1200,
"height": 900
},
"orangeCount": 25,
"greenCount": 2,
"pegs": [
{
"x": 330,
"y": 230,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 350,
"y": 292,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 370,
"y": 353,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 390,
"y": 415,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 410,
"y": 476,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 430,
"y": 538,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 378,
"y": 500,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 325,
"y": 462,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 273,
"y": 423,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 221,
"y": 385,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 168,
"y": 347,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 233,
"y": 347,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 298,
"y": 347,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 427,
"y": 347,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 492,
"y": 347,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 439,
"y": 385,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 282,
"y": 500,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 230,
"y": 538,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 250,
"y": 476,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 310,
"y": 292,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 870,
"y": 390,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 890,
"y": 452,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 910,
"y": 513,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 930,
"y": 575,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 950,
"y": 636,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 970,
"y": 698,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 918,
"y": 660,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 865,
"y": 622,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 813,
"y": 583,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 761,
"y": 545,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 708,
"y": 507,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 773,
"y": 507,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 838,
"y": 507,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 967,
"y": 507,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1032,
"y": 507,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 979,
"y": 545,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 822,
"y": 660,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 770,
"y": 698,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 790,
"y": 636,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 850,
"y": 452,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 537,
"y": 480,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 643,
"y": 490,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 200,
"y": 740,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 293,
"y": 740,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 387,
"y": 740,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 480,
"y": 740,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 650,
"y": 220,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 767,
"y": 220,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 883,
"y": 220,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 1000,
"y": 220,
"shape": "circle",
"r": 16,
"orangeEligible": false
}
],
"walls": [],
"moving": []
}

View File

@ -0,0 +1,286 @@
{
"version": 1,
"board": {
"width": 1200,
"height": 900
},
"orangeCount": 25,
"greenCount": 2,
"pegs": [
{
"x": 860,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 844,
"y": 559,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 799,
"y": 637,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 730,
"y": 695,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 645,
"y": 726,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 555,
"y": 726,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 470,
"y": 695,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 401,
"y": 637,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 356,
"y": 559,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 340,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 356,
"y": 381,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 401,
"y": 303,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 470,
"y": 245,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 555,
"y": 214,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 645,
"y": 214,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 730,
"y": 245,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 799,
"y": 303,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 844,
"y": 381,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 730,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 705,
"y": 546,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 640,
"y": 594,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 560,
"y": 594,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 495,
"y": 546,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 470,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 495,
"y": 394,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 560,
"y": 346,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 640,
"y": 346,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 705,
"y": 394,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 230,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 340,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 610,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 720,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 300,
"y": 240,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 900,
"y": 240,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 300,
"y": 720,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 900,
"y": 720,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 480,
"y": 780,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 600,
"y": 780,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 720,
"y": 780,
"shape": "circle",
"r": 16,
"orangeEligible": false
}
],
"walls": [],
"moving": []
}

View File

@ -0,0 +1,468 @@
{
"version": 1,
"board": {
"width": 1200,
"height": 900
},
"orangeCount": 25,
"greenCount": 2,
"pegs": [
{
"x": 690,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 664,
"y": 534,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 560,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 536,
"y": 534,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 510,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 536,
"y": 406,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 380,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 664,
"y": 406,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 775,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 758,
"y": 546,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 709,
"y": 607,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 639,
"y": 641,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 561,
"y": 641,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 491,
"y": 607,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 442,
"y": 546,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 425,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 442,
"y": 394,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 491,
"y": 333,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 561,
"y": 299,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 639,
"y": 299,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 709,
"y": 333,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 758,
"y": 394,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 860,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 847,
"y": 550,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 810,
"y": 623,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 753,
"y": 680,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 680,
"y": 717,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 730,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 520,
"y": 717,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 447,
"y": 680,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 390,
"y": 623,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 353,
"y": 550,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 340,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 353,
"y": 390,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 390,
"y": 317,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 447,
"y": 260,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 520,
"y": 223,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 680,
"y": 223,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 753,
"y": 260,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 810,
"y": 317,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 847,
"y": 390,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 829,
"y": 212,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 886,
"y": 278,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 926,
"y": 356,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 944,
"y": 442,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 940,
"y": 529,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 914,
"y": 613,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 868,
"y": 687,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 805,
"y": 748,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 728,
"y": 790,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 472,
"y": 790,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 395,
"y": 748,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 332,
"y": 687,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 286,
"y": 613,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 260,
"y": 529,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 256,
"y": 442,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 274,
"y": 356,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 314,
"y": 278,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 371,
"y": 212,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 600,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 160,
"y": 740,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 280,
"y": 740,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 920,
"y": 740,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 1040,
"y": 740,
"shape": "circle",
"r": 16,
"orangeEligible": false
}
],
"walls": [],
"moving": []
}

View File

@ -0,0 +1,265 @@
{
"version": 1,
"board": {
"width": 1200,
"height": 900
},
"orangeCount": 25,
"greenCount": 2,
"pegs": [
{
"x": 710,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 684,
"y": 541,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 619,
"y": 578,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 545,
"y": 565,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 497,
"y": 508,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 497,
"y": 432,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 545,
"y": 375,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 619,
"y": 362,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 684,
"y": 399,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 766,
"y": 539,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 834,
"y": 567,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 902,
"y": 595,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 970,
"y": 623,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 669,
"y": 636,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 697,
"y": 704,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 725,
"y": 772,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 531,
"y": 636,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 503,
"y": 704,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 475,
"y": 772,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 434,
"y": 539,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 366,
"y": 567,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 298,
"y": 595,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 230,
"y": 623,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 434,
"y": 401,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 366,
"y": 373,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 298,
"y": 345,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 230,
"y": 317,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 531,
"y": 304,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 503,
"y": 236,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 669,
"y": 304,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 697,
"y": 236,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 766,
"y": 401,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 834,
"y": 373,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 902,
"y": 345,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 970,
"y": 317,
"shape": "circle",
"r": 16,
"orangeEligible": true
}
],
"walls": [],
"moving": []
}

View File

@ -0,0 +1,314 @@
{
"version": 1,
"board": {
"width": 1200,
"height": 900
},
"orangeCount": 25,
"greenCount": 2,
"pegs": [
{
"x": 660,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 630,
"y": 522,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 570,
"y": 522,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 540,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 570,
"y": 418,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 630,
"y": 418,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 608,
"y": 558,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 548,
"y": 626,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 463,
"y": 659,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 373,
"y": 648,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 298,
"y": 596,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 256,
"y": 515,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 256,
"y": 425,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 298,
"y": 344,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 373,
"y": 292,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 463,
"y": 281,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 548,
"y": 314,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 608,
"y": 382,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 950,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 928,
"y": 558,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 868,
"y": 626,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 783,
"y": 659,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 693,
"y": 648,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 618,
"y": 596,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 618,
"y": 344,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 693,
"y": 292,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 783,
"y": 281,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 868,
"y": 314,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 928,
"y": 382,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 790,
"y": 320,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 768,
"y": 408,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 708,
"y": 476,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 458,
"y": 446,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 416,
"y": 365,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 416,
"y": 275,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 458,
"y": 194,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 768,
"y": 232,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 200,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 320,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 440,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 760,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 880,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 1000,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
}
],
"walls": [],
"moving": []
}

View File

@ -0,0 +1,328 @@
{
"version": 1,
"board": {
"width": 1200,
"height": 900
},
"orangeCount": 25,
"greenCount": 2,
"pegs": [
{
"x": 140,
"y": 230,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 165,
"y": 312,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 190,
"y": 393,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 215,
"y": 475,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 240,
"y": 557,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 265,
"y": 638,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 290,
"y": 720,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 300,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 350,
"y": 230,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 375,
"y": 312,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 400,
"y": 393,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 425,
"y": 475,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 450,
"y": 557,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 475,
"y": 638,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 500,
"y": 720,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 510,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 560,
"y": 230,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 585,
"y": 312,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 610,
"y": 393,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 635,
"y": 475,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 660,
"y": 557,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 685,
"y": 638,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 710,
"y": 720,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 720,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 770,
"y": 230,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 795,
"y": 312,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 820,
"y": 393,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 845,
"y": 475,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 870,
"y": 557,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 895,
"y": 638,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 920,
"y": 720,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 930,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 980,
"y": 230,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1005,
"y": 312,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1030,
"y": 393,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1055,
"y": 475,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1080,
"y": 557,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1105,
"y": 638,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1130,
"y": 720,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1140,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 180,
"y": 200,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 516,
"y": 200,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 684,
"y": 200,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 852,
"y": 200,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 1020,
"y": 200,
"shape": "circle",
"r": 16,
"orangeEligible": false
}
],
"walls": [],
"moving": []
}

View File

@ -0,0 +1,335 @@
{
"version": 1,
"board": {
"width": 1200,
"height": 900
},
"orangeCount": 25,
"greenCount": 2,
"pegs": [
{
"x": 690,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 664,
"y": 534,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 560,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 536,
"y": 534,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 510,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 536,
"y": 406,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 380,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 664,
"y": 406,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 810,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 794,
"y": 550,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 748,
"y": 618,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 680,
"y": 664,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 680,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 520,
"y": 664,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 452,
"y": 618,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 406,
"y": 550,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 390,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 406,
"y": 390,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 452,
"y": 322,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 520,
"y": 276,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 260,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 680,
"y": 276,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 748,
"y": 322,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 794,
"y": 390,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 860,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 940,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1020,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 730,
"y": 695,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 770,
"y": 764,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 470,
"y": 695,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 430,
"y": 764,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 340,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 260,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 180,
"y": 470,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 470,
"y": 245,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 730,
"y": 245,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 290,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 270,
"y": 285,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 215,
"y": 340,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 140,
"y": 360,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 1060,
"y": 360,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 985,
"y": 340,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 930,
"y": 285,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 910,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 543,
"y": 780,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 657,
"y": 780,
"shape": "circle",
"r": 16,
"orangeEligible": false
}
],
"walls": [],
"moving": []
}

View File

@ -0,0 +1,307 @@
{
"version": 1,
"board": {
"width": 1200,
"height": 900
},
"orangeCount": 25,
"greenCount": 2,
"pegs": [
{
"x": 220,
"y": 300,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 370,
"y": 300,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 520,
"y": 300,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 670,
"y": 300,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 820,
"y": 300,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 970,
"y": 300,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 220,
"y": 450,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 370,
"y": 450,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 520,
"y": 450,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 670,
"y": 450,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 820,
"y": 450,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 970,
"y": 450,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 220,
"y": 600,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 370,
"y": 600,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 520,
"y": 600,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 670,
"y": 600,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 820,
"y": 600,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 970,
"y": 600,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 295,
"y": 375,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 445,
"y": 375,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 595,
"y": 375,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 745,
"y": 375,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 895,
"y": 375,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1045,
"y": 375,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 295,
"y": 525,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 445,
"y": 525,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 595,
"y": 525,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 745,
"y": 525,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 895,
"y": 525,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1045,
"y": 525,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 295,
"y": 675,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 445,
"y": 675,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 595,
"y": 675,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 745,
"y": 675,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 895,
"y": 675,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1045,
"y": 675,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 160,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 336,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 512,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 688,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 864,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 1040,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
}
],
"walls": [],
"moving": []
}

View File

@ -0,0 +1,279 @@
{
"version": 1,
"board": {
"width": 1200,
"height": 900
},
"orangeCount": 25,
"greenCount": 2,
"pegs": [
{
"x": 240,
"y": 260,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 240,
"y": 350,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 240,
"y": 440,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 335,
"y": 440,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 430,
"y": 440,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 520,
"y": 220,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 520,
"y": 310,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 520,
"y": 400,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 615,
"y": 400,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 710,
"y": 400,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 800,
"y": 260,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 800,
"y": 350,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 800,
"y": 440,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 895,
"y": 440,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 990,
"y": 440,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 380,
"y": 520,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 380,
"y": 610,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 380,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 475,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 570,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 660,
"y": 480,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 660,
"y": 570,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 660,
"y": 660,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 755,
"y": 660,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 850,
"y": 660,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 940,
"y": 520,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 940,
"y": 610,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 940,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1035,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1130,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 160,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 260,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 360,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 460,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 740,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 840,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 940,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 1040,
"y": 760,
"shape": "circle",
"r": 16,
"orangeEligible": false
}
],
"walls": [],
"moving": []
}

View File

@ -0,0 +1,321 @@
{
"version": 1,
"board": {
"width": 1200,
"height": 900
},
"orangeCount": 25,
"greenCount": 2,
"pegs": [
{
"x": 240,
"y": 260,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 312,
"y": 278,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 384,
"y": 296,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 456,
"y": 314,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 528,
"y": 332,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 350,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 672,
"y": 332,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 744,
"y": 314,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 816,
"y": 296,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 888,
"y": 278,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 960,
"y": 260,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 240,
"y": 400,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 312,
"y": 418,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 384,
"y": 436,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 456,
"y": 454,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 528,
"y": 472,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 490,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 672,
"y": 472,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 744,
"y": 454,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 816,
"y": 436,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 888,
"y": 418,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 960,
"y": 400,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 240,
"y": 540,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 312,
"y": 558,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 384,
"y": 576,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 456,
"y": 594,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 528,
"y": 612,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 630,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 672,
"y": 612,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 744,
"y": 594,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 816,
"y": 576,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 888,
"y": 558,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 960,
"y": 540,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 240,
"y": 680,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 312,
"y": 698,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 384,
"y": 716,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 456,
"y": 734,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 528,
"y": 752,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 770,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 672,
"y": 752,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 744,
"y": 734,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 816,
"y": 716,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 888,
"y": 698,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 960,
"y": 680,
"shape": "circle",
"r": 16,
"orangeEligible": true
}
],
"walls": [],
"moving": []
}

View File

@ -0,0 +1,335 @@
{
"version": 1,
"board": {
"width": 1200,
"height": 900
},
"orangeCount": 25,
"greenCount": 2,
"pegs": [
{
"x": 220,
"y": 260,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 315,
"y": 260,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 410,
"y": 260,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 505,
"y": 260,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 260,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 695,
"y": 260,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 790,
"y": 260,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 885,
"y": 260,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 980,
"y": 260,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 220,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 315,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 410,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 505,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 695,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 790,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 885,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 980,
"y": 700,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 220,
"y": 330,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 220,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 220,
"y": 530,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 220,
"y": 630,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 475,
"y": 330,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 475,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 475,
"y": 530,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 475,
"y": 630,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 725,
"y": 330,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 725,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 725,
"y": 530,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 725,
"y": 630,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 980,
"y": 330,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 980,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 980,
"y": 530,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 980,
"y": 630,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 330,
"y": 400,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 430,
"y": 400,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 330,
"y": 530,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 430,
"y": 530,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 580,
"y": 400,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 680,
"y": 400,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 580,
"y": 530,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 680,
"y": 530,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 830,
"y": 400,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 930,
"y": 400,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 830,
"y": 530,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 930,
"y": 530,
"shape": "circle",
"r": 16,
"orangeEligible": true
}
],
"walls": [],
"moving": []
}

View File

@ -0,0 +1,629 @@
{
"version": 1,
"board": {
"width": 1200,
"height": 900
},
"orangeCount": 25,
"greenCount": 2,
"pegs": [
{
"x": 180,
"y": 250,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 300,
"y": 250,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 420,
"y": 250,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 540,
"y": 250,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 660,
"y": 250,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 780,
"y": 250,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 900,
"y": 250,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1020,
"y": 250,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 180,
"y": 370,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 300,
"y": 370,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 420,
"y": 370,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 540,
"y": 370,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 660,
"y": 370,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 780,
"y": 370,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 900,
"y": 370,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1020,
"y": 370,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 180,
"y": 490,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 300,
"y": 490,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 420,
"y": 490,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 540,
"y": 490,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 660,
"y": 490,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 780,
"y": 490,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 900,
"y": 490,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1020,
"y": 490,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 180,
"y": 610,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 300,
"y": 610,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 420,
"y": 610,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 540,
"y": 610,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 660,
"y": 610,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 780,
"y": 610,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 900,
"y": 610,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1020,
"y": 610,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 180,
"y": 730,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 300,
"y": 730,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 420,
"y": 730,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 540,
"y": 730,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 660,
"y": 730,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 780,
"y": 730,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 900,
"y": 730,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1020,
"y": 730,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 240,
"y": 310,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 360,
"y": 310,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 480,
"y": 310,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 310,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 720,
"y": 310,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 840,
"y": 310,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 960,
"y": 310,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1080,
"y": 310,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 240,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 360,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 480,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 720,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 840,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 960,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1080,
"y": 430,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 240,
"y": 550,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 360,
"y": 550,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 480,
"y": 550,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 550,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 720,
"y": 550,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 840,
"y": 550,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 960,
"y": 550,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1080,
"y": 550,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 240,
"y": 670,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 360,
"y": 670,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 480,
"y": 670,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 670,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 720,
"y": 670,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 840,
"y": 670,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 960,
"y": 670,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1080,
"y": 670,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 240,
"y": 790,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 360,
"y": 790,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 480,
"y": 790,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 600,
"y": 790,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 720,
"y": 790,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 840,
"y": 790,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 960,
"y": 790,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 1080,
"y": 790,
"shape": "circle",
"r": 16,
"orangeEligible": true
},
{
"x": 160,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 286,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 411,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 537,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 663,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 789,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 914,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
},
{
"x": 1040,
"y": 210,
"shape": "circle",
"r": 16,
"orangeEligible": false
}
],
"walls": [],
"moving": []
}

View File

@ -11,34 +11,194 @@
},
{
"level": 2,
"name": "Fetch!",
"masterId": "kona",
"powerId": "multiball",
"name": "Fine China",
"masterId": "ethel",
"powerId": "superguide",
"file": "level-002.json",
"background": "park"
"background": "parlor"
},
{
"level": 3,
"name": "Hocus Pocus",
"masterId": "zanthor",
"powerId": "spaceblast",
"name": "Doily Drop",
"masterId": "ethel",
"powerId": "superguide",
"file": "level-003.json",
"background": "arcana"
"background": "parlor"
},
{
"level": 4,
"name": "X-Ray Vision",
"masterId": "fireball",
"powerId": "fireball",
"name": "Lace & Grace",
"masterId": "ethel",
"powerId": "superguide",
"file": "level-004.json",
"background": "lab"
"background": "parlor"
},
{
"level": 5,
"name": "Grandma's Attic",
"masterId": "ethel",
"powerId": "superguide",
"file": "level-005.json",
"background": "parlor"
},
{
"level": 6,
"name": "Fetch!",
"masterId": "kona",
"powerId": "multiball",
"file": "level-006.json",
"background": "park"
},
{
"level": 7,
"name": "Paw Prints",
"masterId": "kona",
"powerId": "multiball",
"file": "level-007.json",
"background": "park"
},
{
"level": 8,
"name": "Buried Bones",
"masterId": "kona",
"powerId": "multiball",
"file": "level-008.json",
"background": "park"
},
{
"level": 9,
"name": "Squeaky Toy",
"masterId": "kona",
"powerId": "multiball",
"file": "level-009.json",
"background": "park"
},
{
"level": 10,
"name": "Best in Show",
"masterId": "kona",
"powerId": "multiball",
"file": "level-010.json",
"background": "park"
},
{
"level": 11,
"name": "Hocus Pocus",
"masterId": "zanthor",
"powerId": "spaceblast",
"file": "level-011.json",
"background": "arcana"
},
{
"level": 12,
"name": "Crescent Moon",
"masterId": "zanthor",
"powerId": "spaceblast",
"file": "level-012.json",
"background": "arcana"
},
{
"level": 13,
"name": "Crystal Ball",
"masterId": "zanthor",
"powerId": "spaceblast",
"file": "level-013.json",
"background": "arcana"
},
{
"level": 14,
"name": "Twin Stars",
"masterId": "zanthor",
"powerId": "spaceblast",
"file": "level-014.json",
"background": "arcana"
},
{
"level": 15,
"name": "Grand Sigil",
"masterId": "zanthor",
"powerId": "spaceblast",
"file": "level-015.json",
"background": "arcana"
},
{
"level": 16,
"name": "X-Ray Vision",
"masterId": "fireball",
"powerId": "fireball",
"file": "level-016.json",
"background": "lab"
},
{
"level": 17,
"name": "Solar Flare",
"masterId": "fireball",
"powerId": "fireball",
"file": "level-017.json",
"background": "lab"
},
{
"level": 18,
"name": "Atomic Age",
"masterId": "fireball",
"powerId": "fireball",
"file": "level-018.json",
"background": "lab"
},
{
"level": 19,
"name": "Meteor Shower",
"masterId": "fireball",
"powerId": "fireball",
"file": "level-019.json",
"background": "lab"
},
{
"level": 20,
"name": "Supernova",
"masterId": "fireball",
"powerId": "fireball",
"file": "level-020.json",
"background": "lab"
},
{
"level": 21,
"name": "Opening Move",
"masterId": "victor",
"powerId": "zenball",
"file": "level-021.json",
"background": "study"
},
{
"level": 22,
"name": "Knight's Tour",
"masterId": "victor",
"powerId": "zenball",
"file": "level-022.json",
"background": "study"
},
{
"level": 23,
"name": "Double Gambit",
"masterId": "victor",
"powerId": "zenball",
"file": "level-023.json",
"background": "study"
},
{
"level": 24,
"name": "Fortress",
"masterId": "victor",
"powerId": "zenball",
"file": "level-024.json",
"background": "study"
},
{
"level": 25,
"name": "Checkmate",
"masterId": "victor",
"powerId": "zenball",
"file": "level-005.json",
"file": "level-025.json",
"background": "study"
}
]

View File

@ -79,6 +79,25 @@ One optional PNG per friend/master, shown behind the peg field on their levels.
code change). Missing files fall back to the procedural starfield with a
harmless console warning.
## Intro videos (per friend)
One optional MP4 per friend, played on the intro screen that precedes their
first level (levels 1, 6, 11, 16, 21 — detected automatically as the first
level of each friend's block in `levels.json`).
- **Path & naming:** `assets/videos/peggle/<masterId>.mp4` — e.g. `ethel.mp4`
(already saved), `kona.mp4`, `zanthor.mp4`, `fireball.mp4`, `victor.mp4`.
- **Dimensions:** **720 × 720 px**, MP4 (H.264 video + AAC audio for the widest
browser support). Displayed at 560×560 in the intro window.
- **Behavior:** autoplays when the intro opens (the level click counts as the
user gesture browsers require); when it finishes, a ▶ Replay overlay appears
and clicking the video plays it again. The Continue button starts the level
(and never auto-fires the cannon).
- **Fallback:** a friend with no video yet shows their static 300×300 roster
portrait in the same window — the intro screen works either way.
- The intro shows on every fresh entry to that level (level select or "Next
Level") but is skipped on Replay / Try Again.
## Not covered by the sheet
- **Level editor** (`?peggle-editor=1`) intentionally keeps procedural circles —

Binary file not shown.

Binary file not shown.

View File

@ -60,6 +60,9 @@ export default class PeggleGame extends Phaser.Scene {
this.portrait = null;
this.tube = null;
this.reservoirBalls = [];
this.inputHoldUntil = 0; // suppress launches right after UI clicks
this.introDom = null;
this.introVideo = null;
// end-of-level celebration
this.celebrating = false;
@ -171,6 +174,9 @@ export default class PeggleGame extends Phaser.Scene {
// updatePowerHud() / the celebration don't poke dead objects before the
// next level rebuilds them.
this.powerStatus = null;
if (this.introVideo) { try { this.introVideo.pause(); } catch (_) { /* already gone */ } this.introVideo = null; }
this.introDom?.destroy();
this.introDom = null;
this.celebrating = false;
this.countDone = false;
this.countTween?.remove();
@ -215,46 +221,60 @@ export default class PeggleGame extends Phaser.Scene {
}).setOrigin(0.5);
this.layer.add(prog);
const COLS = Math.min(5, this.manifest.length);
const SIZE = 240;
const GAP = 26;
const gridW = COLS * SIZE + (COLS - 1) * GAP;
const left = cx - gridW / 2 + SIZE / 2;
const top = 420;
// One row per friend: portrait + name + power on the left, that friend's
// level tiles on the right. Blocks are consecutive same-master runs, so
// future friends slot in with no code change.
const blocks = [];
for (const entry of this.manifest) {
const last = blocks[blocks.length - 1];
if (last && last.masterId === entry.masterId) last.entries.push(entry);
else blocks.push({ masterId: entry.masterId, entries: [entry] });
}
this.manifest.forEach((entry, i) => {
const col = i % COLS;
const row = Math.floor(i / COLS);
const x = left + col * (SIZE + GAP);
const y = top + row * (SIZE + GAP + 60);
const rowH = 134;
const top = 300;
const SIZE = 110;
blocks.forEach((blk, b) => {
const y = top + b * rowH;
const first = blk.entries[0];
const master = this.masterFor(first);
const power = POWERS[first.powerId];
const rowUnlocked = first.level <= nextLevel;
const face = this.add.image(320, y, 'opponents', master.spriteIndex ?? 0)
.setDisplaySize(104, 104);
if (!rowUnlocked) face.setTint(0x334455).setAlpha(0.6);
const name = this.add.text(400, y - 24, master.name, {
fontFamily: 'Righteous', fontSize: '30px',
color: rowUnlocked ? COLORS.textHex : '#54606b',
}).setOrigin(0, 0.5);
const ptxt = this.add.text(400, y + 18, power?.name ?? '', {
fontFamily: '"Julius Sans One"', fontSize: '19px',
color: rowUnlocked ? '#3ed164' : '#54606b',
}).setOrigin(0, 0.5);
this.layer.add([face, name, ptxt]);
blk.entries.forEach((entry, i) => {
const x = 850 + i * 140;
const level = entry.level;
const cleared = level <= this.levelsCompleted;
const playable = level <= nextLevel;
const master = this.masterFor(entry);
const power = POWERS[entry.powerId];
const fill = cleared ? 0x1f5c3a : playable ? 0x1e3a52 : 0x16202b;
const stroke = cleared ? 0x2ecc71 : playable ? COLORS.gold : 0x2a3744;
const tile = this.add.rectangle(x, y, SIZE, SIZE + 46, fill).setStrokeStyle(playable || cleared ? 3 : 2, stroke, 1);
const face = this.add.image(x, y - 46, 'opponents', master.spriteIndex ?? 0)
.setDisplaySize(120, 120);
if (!playable && !cleared) face.setTint(0x334455).setAlpha(0.6);
const num = this.add.text(x - SIZE / 2 + 16, y - SIZE / 2 - 6, String(level), {
fontFamily: 'Righteous', fontSize: '30px',
color: playable || cleared ? COLORS.goldHex : '#54606b',
}).setOrigin(0, 0);
const name = this.add.text(x, y + 36, entry.name, {
fontFamily: 'Righteous', fontSize: '26px',
const tile = this.add.rectangle(x, y, SIZE, SIZE, fill)
.setStrokeStyle(playable || cleared ? 3 : 2, stroke, 1);
const num = this.add.text(x, y - 12, String(level), {
fontFamily: 'Righteous', fontSize: '36px',
color: playable || cleared ? COLORS.textHex : '#54606b',
}).setOrigin(0.5);
const info = this.add.text(x, y + 74,
cleared ? '✓ cleared' : playable ? `${master.name} · ${power?.name ?? ''}` : 'locked', {
fontFamily: '"Julius Sans One"', fontSize: '17px',
const tag = this.add.text(x, y + 30, cleared ? '✓' : playable ? entry.name : 'locked', {
fontFamily: '"Julius Sans One"', fontSize: '13px',
color: cleared ? '#9be7b4' : playable ? COLORS.mutedHex : '#54606b',
}).setOrigin(0.5);
this.layer.add([tile, face, num, name, info]);
// Keep long level names inside the tile.
if (tag.width > SIZE - 10) tag.setScale((SIZE - 10) / tag.width);
this.layer.add([tile, num, tag]);
if (playable) {
tile.setInteractive({ useHandCursor: true });
@ -263,6 +283,7 @@ export default class PeggleGame extends Phaser.Scene {
tile.on('pointerup', () => this.playLevel(entry));
}
});
});
const resume = new Button(this, cx - 150, GAME_HEIGHT - 78, `Play Level ${nextLevel}`,
() => this.playLevel(this.manifest[nextLevel - 1]), { width: 280, height: 58, fontSize: 24 });
@ -301,7 +322,7 @@ export default class PeggleGame extends Phaser.Scene {
// ── Level start ─────────────────────────────────────────────────────────────
async playLevel(entry) {
async playLevel(entry, opts = {}) {
if (!entry) return;
let layout = this.levelCache.get(entry.file);
if (!layout) {
@ -313,8 +334,116 @@ export default class PeggleGame extends Phaser.Scene {
return;
}
}
if (!opts.skipIntro && !this.testLevel && this.isFirstOfBlock(entry)) {
this.showFriendIntro(entry, layout);
} else {
this.startLevel(entry, layout);
}
}
// A friend's first level (the manifest entry where masterId changes) gets
// the video intro screen.
isFirstOfBlock(entry) {
const idx = this.manifest.findIndex((m) => m.level === entry.level);
if (idx < 0) return false;
return idx === 0 || this.manifest[idx - 1].masterId !== entry.masterId;
}
// ── Friend intro (video + power explainer before a friend's first level) ────
showFriendIntro(entry, layout) {
this.view = 'intro';
this.state = null;
this.overlayUp = true;
this.clearLayer();
const master = this.masterFor(entry);
const power = POWERS[entry.powerId];
const cx = GAME_WIDTH / 2;
const cy = GAME_HEIGHT / 2;
const dim = this.add.rectangle(cx, cy, GAME_WIDTH, GAME_HEIGHT, 0x06101c, 0.96).setInteractive();
const panel = this.add.graphics();
panel.fillStyle(COLORS.panel, 0.98);
panel.fillRoundedRect(cx - 700, cy - 400, 1400, 800, 24);
panel.lineStyle(3, COLORS.gold, 1);
panel.strokeRoundedRect(cx - 700, cy - 400, 1400, 800, 24);
const headline = this.add.text(cx, cy - 352, `LEVEL ${entry.level} — MEET YOUR FRIEND`, {
fontFamily: '"Julius Sans One"', fontSize: '24px', color: COLORS.mutedHex,
}).setOrigin(0.5);
this.layer.add([dim, panel, headline]);
// Video window (720×720 source shown at 560×560). Click replays once the
// video has finished; a missing/broken file falls back to the portrait.
const vx = cx - 380;
const vy = cy + 10;
const wrap = document.createElement('div');
wrap.style.cssText = 'position:relative; width:560px; height:560px; border-radius:18px; overflow:hidden;'
+ ' border:3px solid #f0c75e; background:#0a1522; cursor:pointer;';
const vid = document.createElement('video');
vid.src = `assets/videos/peggle/${master.id}.mp4`;
vid.playsInline = true;
vid.style.cssText = 'width:100%; height:100%; object-fit:cover;';
const replay = document.createElement('div');
replay.style.cssText = 'position:absolute; inset:0; display:none; flex-direction:column; align-items:center;'
+ ' justify-content:center; background:rgba(6,16,28,.55); color:#fff; font-family:Righteous,sans-serif;';
replay.innerHTML = '<div style="font-size:76px; line-height:1;">▶</div><div style="font-size:30px;">Replay</div>';
wrap.append(vid, replay);
wrap.addEventListener('click', () => {
replay.style.display = 'none';
vid.currentTime = 0;
vid.play().catch(() => { replay.style.display = 'flex'; });
});
vid.addEventListener('ended', () => { replay.style.display = 'flex'; });
vid.addEventListener('error', () => {
// No video for this friend (yet) — show their portrait frame instead.
this.introDom?.destroy();
this.introDom = null;
this.introVideo = null;
const face = this.add.image(vx, vy, 'opponents', master.spriteIndex ?? 0).setDisplaySize(560, 560);
const frame = this.add.graphics();
frame.lineStyle(3, COLORS.gold, 1);
frame.strokeRoundedRect(vx - 280, vy - 280, 560, 560, 18);
this.layer.add([face, frame]);
});
this.introDom = this.add.dom(vx, vy, wrap);
this.introVideo = vid;
vid.play().catch(() => {
// Autoplay blocked — invite the user to start it.
replay.lastElementChild.textContent = 'Play';
replay.style.display = 'flex';
});
// Friend + power explainer column.
const tx = cx - 40;
const name = this.add.text(tx, cy - 250, master.name, {
fontFamily: 'Righteous', fontSize: '58px', color: COLORS.goldHex,
}).setOrigin(0, 0.5);
const bio = this.add.text(tx, cy - 178, master.bio ?? '', {
fontFamily: '"Julius Sans One"', fontSize: '22px', color: COLORS.textHex,
wordWrap: { width: 640 }, lineSpacing: 6,
}).setOrigin(0, 0);
const pTitle = this.add.text(tx, cy - 20, `SPECIAL SHOT — ${power?.name ?? ''}`, {
fontFamily: 'Righteous', fontSize: '30px', color: '#3ed164',
}).setOrigin(0, 0.5);
const pDesc = this.add.text(tx, cy + 16, power?.desc ?? '', {
fontFamily: '"Julius Sans One"', fontSize: '24px', color: COLORS.textHex,
wordWrap: { width: 640 }, lineSpacing: 8,
}).setOrigin(0, 0);
const hint = this.add.text(tx, cy + 148, 'Hit a green peg during a shot to charge it up!', {
fontFamily: '"Julius Sans One"', fontSize: '20px', color: COLORS.mutedHex,
}).setOrigin(0, 0.5);
this.layer.add([name, bio, pTitle, pDesc, hint]);
const cont = new Button(this, cx + 380, cy + 310, 'Continue ▶', () => {
// Swallow this click entirely — the pointerup that triggered the button
// must not also fire the cannon once the level is live.
this.inputHoldUntil = this.time.now + 400;
this.startLevel(entry, layout);
}, { width: 300, height: 66, fontSize: 26 });
const back = new Button(this, cx + 30, cy + 310, 'Back', () => this.showLevelSelect(),
{ variant: 'ghost', width: 180, height: 66, fontSize: 24 });
this.layer.add([cont, back]);
}
startLevel(entry, layout) {
this.view = 'play';
@ -333,8 +462,9 @@ export default class PeggleGame extends Phaser.Scene {
this.drawBucket();
this.drawLauncher();
this.drawHud();
// The portrait (playIntro: true) already queues one random intro clip and
// animates the speech visualizer — don't queue a second one here.
this.drawMasterPanel();
this.say('intro');
}
// ── Board rendering ─────────────────────────────────────────────────────────
@ -695,6 +825,7 @@ export default class PeggleGame extends Phaser.Scene {
});
this.input.on('pointerup', (pointer) => {
if (this.view !== 'play' || !this.state || this.overlayUp) return;
if (this.time.now < this.inputHoldUntil) return; // e.g. the intro's Continue click
if (this.state.phase !== 'aim' || this.state.ballsLeft <= 0) return;
const bx = pointer.x - BOARD_X;
const by = pointer.y - BOARD_Y;
@ -1110,11 +1241,11 @@ export default class PeggleGame extends Phaser.Scene {
}).setOrigin(0.5));
}
} else {
btns.push(new Button(this, cx, cy + 60, 'Try Again', () => this.playLevel(this.entry),
btns.push(new Button(this, cx, cy + 60, 'Try Again', () => this.playLevel(this.entry, { skipIntro: true }),
{ width: 320, height: 60, fontSize: 26 }));
}
if (!this.returnToEditor) {
btns.push(new Button(this, cx - 115, cy + 145, 'Replay', () => this.playLevel(this.entry),
btns.push(new Button(this, cx - 115, cy + 145, 'Replay', () => this.playLevel(this.entry, { skipIntro: true }),
{ width: 200, height: 54, fontSize: 22, variant: 'ghost' }));
btns.push(new Button(this, cx + 115, cy + 145, 'Levels', () => this.showLevelSelect(),
{ width: 200, height: 54, fontSize: 22, variant: 'ghost' }));

View File

@ -1,6 +1,10 @@
// Generates the first five Peggle stub layouts + the level manifest.
// Generates the Peggle level bank + manifest: 25 levels, 5 per friend.
// node tools/genPeggleLevels.js
// Writes assets/gamedata/peggle/level-001..005.json and levels.json.
// Writes assets/gamedata/peggle/level-001..025.json and levels.json.
//
// Blocks: 1-5 Ethel (superguide), 6-10 Kona (multiball), 11-15 Zanthor
// (spaceblast), 16-20 Fireball (fireball), 21-25 Victor (zenball). Each block
// is one shape family with 5 variants ramping in density/difficulty.
//
// Layouts are starting points meant to be hand-tuned later in the editor
// (index.html?peggle-editor=1); pegs violating spacing are dropped, so shapes
@ -55,6 +59,23 @@ function circle(cx, cy, radius, n, opts = {}) {
return arc(cx, cy, radius, 0, Math.PI * 2 * (1 - 1 / n), n, opts);
}
// Pentagram stroke centered at (cx, cy), point-up, `per` pegs per stroke.
function pentagram(cx, cy, radius, per, opts = {}) {
const verts = [];
for (let i = 0; i < 5; i++) {
const a = -Math.PI / 2 + (i * 2 * Math.PI) / 5;
verts.push([cx + radius * Math.cos(a), cy + radius * Math.sin(a)]);
}
const order = [0, 2, 4, 1, 3, 0];
const pegs = [];
for (let i = 0; i < 5; i++) {
const [x0, y0] = verts[order[i]];
const [x1, y1] = verts[order[i + 1]];
pegs.push(...line(x0, y0, x1, y1, per, opts));
}
return pegs;
}
// Drop pegs out of bounds or too close to an earlier peg.
function settle(pegs) {
const out = [];
@ -84,115 +105,379 @@ function levelFile(pegs, over = {}) {
const el = { orangeEligible: true };
// ── Level 1 — Tea Time (Ethel): gentle nested arcs + bottom row ─────────────
// ── Ethel (1-5): parlor arcs & chandeliers ───────────────────────────────────
function level1() {
const pegs = [
function ethelLevel(v) {
const pegs = [];
switch (v) {
case 0: // Tea Time — gentle nested arcs + bottom row
pegs.push(
...arc(600, 120, 420, Math.PI * 0.15, Math.PI * 0.85, 14, el),
...arc(600, 60, 560, Math.PI * 0.20, Math.PI * 0.80, 13, el),
...arc(600, 10, 700, Math.PI * 0.25, Math.PI * 0.75, 12, el),
...line(160, 770, 1040, 770, 10),
...line(320, 300, 880, 300, 5),
];
);
break;
case 1: // Fine China — a saucer stack: opposing arc pairs
pegs.push(
...arc(600, 40, 500, Math.PI * 0.22, Math.PI * 0.78, 12, el),
...arc(600, 940, 500, -Math.PI * 0.76, -Math.PI * 0.24, 12, el),
...arc(600, 470, 210, 0, Math.PI * 2 * (1 - 1 / 12), 12, el),
...line(150, 480, 330, 480, 3),
...line(870, 480, 1050, 480, 3),
...line(380, 740, 820, 740, 5),
);
break;
case 2: // Doily Drop — lace fan of alternating arcs with side tassels
pegs.push(
...arc(600, 130, 350, Math.PI * 0.1, Math.PI * 0.9, 12, el),
...arc(600, 130, 470, Math.PI * 0.14, Math.PI * 0.86, 13, el),
...arc(600, 130, 590, Math.PI * 0.18, Math.PI * 0.82, 14, el),
...line(180, 260, 180, 560, 4),
...line(1020, 260, 1020, 560, 4),
...line(420, 760, 780, 760, 4),
);
break;
case 3: // Lace & Grace — S-curve of two big arcs + hanging drops
pegs.push(
...arc(320, 300, 240, -Math.PI * 0.5, Math.PI * 0.5, 12, el),
...arc(880, 560, 240, Math.PI * 0.5, Math.PI * 1.5, 12, el),
...line(300, 640, 300, 780, 3, el),
...line(600, 620, 600, 780, 3, el),
...line(160, 210, 420, 210, 4),
...line(780, 210, 1040, 210, 4),
...grid(480, 340, 3, 2, 120, 100, el),
);
break;
default: // Grandma's Attic — chandelier: arcs + hanging strands
pegs.push(
...arc(600, 90, 380, Math.PI * 0.15, Math.PI * 0.85, 12, el),
...arc(600, 90, 520, Math.PI * 0.2, Math.PI * 0.8, 13, el),
...line(280, 420, 280, 720, 5, el),
...line(440, 470, 440, 770, 5, el),
...line(600, 500, 600, 780, 5, el),
...line(760, 470, 760, 770, 5, el),
...line(920, 420, 920, 720, 5, el),
...line(200, 250, 1000, 250, 6),
);
break;
}
return levelFile(settle(pegs));
}
// ── Level 2 — Fetch! (Kona): a dog bone + scattered field ───────────────────
// ── Kona (6-10): bones, paws & toys ──────────────────────────────────────────
function level2() {
const pegs = [
// bone: two knuckle circles joined by a shaft
function konaLevel(v) {
const pegs = [];
switch (v) {
case 0: // Fetch! — the dog bone
pegs.push(
...circle(310, 430, 95, 9, el),
...circle(890, 430, 95, 9, el),
...line(400, 390, 800, 390, 6, el),
...line(400, 470, 800, 470, 6, el),
...line(430, 430, 770, 430, 5, el),
// scattered field above and below
...grid(220, 240, 6, 1, 152, 0),
...grid(300, 620, 5, 2, 150, 90),
...line(140, 320, 220, 560, 3),
...line(1060, 320, 980, 560, 3),
);
break;
case 1: { // Paw Prints — big pad + four toes, twice
const paw = (cx, cy, s) => [
...circle(cx, cy, 110 * s, 10, el),
...circle(cx - 130 * s, cy - 150 * s, 40 * s, 5, el),
...circle(cx - 45 * s, cy - 190 * s, 40 * s, 5, el),
...circle(cx + 45 * s, cy - 190 * s, 40 * s, 5, el),
...circle(cx + 130 * s, cy - 150 * s, 40 * s, 5, el),
];
pegs.push(
...paw(390, 520, 1),
...paw(880, 620, 0.8),
...line(700, 240, 1050, 240, 4),
...line(150, 740, 350, 740, 3),
);
break;
}
case 2: // Buried Bones — two crossed bones + dirt scatter
pegs.push(
...circle(280, 300, 60, 6, el),
...circle(920, 640, 60, 6, el),
...line(350, 340, 850, 600, 8, el),
...circle(920, 300, 60, 6, el),
...circle(280, 640, 60, 6, el),
...line(850, 340, 350, 600, 8, el),
...grid(240, 760, 8, 1, 105, 0),
...line(560, 210, 640, 210, 2),
);
break;
case 3: // Squeaky Toy — ball on a rope with small toys
pegs.push(
...circle(600, 430, 150, 13, el),
...circle(600, 430, 70, 7, el),
...line(600, 190, 600, 340, 3, el),
...circle(220, 640, 65, 7, el),
...circle(980, 640, 65, 7, el),
...line(160, 300, 360, 300, 3),
...line(840, 300, 1040, 300, 3),
...line(430, 740, 770, 740, 4),
);
break;
default: // Best in Show — kennel house + trophy rows
pegs.push(
...line(600, 200, 320, 380, 5, el),
...line(600, 200, 880, 380, 5, el),
...line(320, 380, 320, 700, 5, el),
...line(880, 380, 880, 700, 5, el),
...line(320, 700, 880, 700, 8, el),
...grid(460, 460, 3, 3, 140, 110, el),
...line(140, 500, 240, 500, 2),
...line(960, 500, 1060, 500, 2),
...line(430, 780, 770, 780, 4),
);
break;
}
return levelFile(settle(pegs));
}
// ── Level 3 — Hocus Pocus (Zanthor): five-point star inside an arc ──────────
// ── Zanthor (11-15): stars, moons & sigils ───────────────────────────────────
function level3() {
const cx = 600;
const cy = 480;
const outer = 230;
// star vertices (point up)
const verts = [];
for (let i = 0; i < 5; i++) {
const a = -Math.PI / 2 + (i * 2 * Math.PI) / 5;
verts.push([cx + outer * Math.cos(a), cy + outer * Math.sin(a)]);
}
const order = [0, 2, 4, 1, 3, 0]; // pentagram stroke
function zanthorLevel(v) {
const pegs = [];
for (let i = 0; i < 5; i++) {
const [x0, y0] = verts[order[i]];
const [x1, y1] = verts[order[i + 1]];
pegs.push(...line(x0, y0, x1, y1, 8, el));
switch (v) {
case 0: // Hocus Pocus — pentagram inside an arc
pegs.push(
...pentagram(600, 480, 230, 8, el),
...arc(600, 430, 400, Math.PI * 0.12, Math.PI * 0.88, 15, el),
...line(240, 240, 460, 240, 3),
...line(740, 240, 960, 240, 3),
);
break;
case 1: // Crescent Moon — offset arcs + scattered stars
pegs.push(
...arc(560, 460, 260, -Math.PI * 0.42, Math.PI * 0.42, 13, el),
...arc(660, 460, 200, -Math.PI * 0.40, Math.PI * 0.40, 10, el),
...pentagram(280, 300, 80, 3, el),
...pentagram(920, 620, 80, 3, el),
...line(180, 660, 420, 760, 4),
...line(760, 220, 1000, 220, 4),
);
break;
case 2: // Crystal Ball — orb on a stand with facet lattice
pegs.push(
...circle(600, 420, 200, 15, el),
...grid(490, 340, 3, 3, 110, 90, el),
...line(420, 680, 780, 680, 5, el),
...line(470, 760, 730, 760, 4, el),
...line(160, 300, 320, 300, 3),
...line(880, 300, 1040, 300, 3),
);
break;
case 3: // Twin Stars — two pentagrams joined by a beam
pegs.push(
...pentagram(330, 400, 170, 6, el),
...pentagram(870, 560, 170, 6, el),
...line(430, 470, 750, 500, 4, el),
...line(200, 740, 480, 740, 4),
...line(650, 220, 1000, 220, 4),
);
break;
default: // Grand Sigil — double circle, cross & diagonals
pegs.push(
...circle(600, 470, 260, 18, el),
...circle(600, 470, 130, 10, el),
...line(600, 230, 600, 340, 2, el),
...line(600, 610, 600, 720, 2, el),
...line(350, 470, 460, 470, 2, el),
...line(740, 470, 850, 470, 2, el),
...line(300, 240, 420, 330, 2),
...line(900, 240, 780, 330, 2),
...line(300, 720, 420, 620, 2),
...line(900, 720, 780, 620, 2),
...line(480, 780, 720, 780, 3),
);
break;
}
pegs.push(...arc(600, 430, 400, Math.PI * 0.12, Math.PI * 0.88, 15, el));
pegs.push(...line(240, 240, 460, 240, 3));
pegs.push(...line(740, 240, 960, 240, 3));
return levelFile(settle(pegs));
}
// ── Level 4 — X-Ray Vision (Fireball): concentric rings, orange core ────────
// ── Fireball (16-20): rings, rays & bursts ───────────────────────────────────
function level4() {
const cx = 600;
const cy = 470;
const pegs = [
...circle(cx, cy, 90, 8, el),
...circle(cx, cy, 175, 14, el),
...circle(cx, cy, 260, 20, el),
...arc(cx, cy, 345, Math.PI * -0.35, Math.PI * 1.35, 22),
{ x: cx, y: cy, ...el },
function fireballLevel(v) {
const pegs = [];
switch (v) {
case 0: // X-Ray Vision — concentric rings, orange core
pegs.push(
...circle(600, 470, 90, 8, el),
...circle(600, 470, 175, 14, el),
...circle(600, 470, 260, 20, el),
...arc(600, 470, 345, Math.PI * -0.35, Math.PI * 1.35, 22),
{ x: 600, y: 470, ...el },
...line(160, 740, 400, 740, 3),
...line(800, 740, 1040, 740, 3),
];
);
break;
case 1: { // Solar Flare — core + radial rays
pegs.push(...circle(600, 470, 110, 9, el), { x: 600, y: 470, ...el });
for (let i = 0; i < 8; i++) {
const a = (i * Math.PI * 2) / 8 + Math.PI / 8;
pegs.push(...line(
600 + 180 * Math.cos(a), 470 + 180 * Math.sin(a),
600 + 400 * Math.cos(a), 470 + 400 * Math.sin(a), 4, el,
));
}
break;
}
case 2: // Atomic Age — three overlapping orbit rings + nucleus
pegs.push(
...circle(600, 470, 60, 6, el),
...circle(440, 470, 190, 13, el),
...circle(760, 470, 190, 13, el),
...circle(600, 320, 190, 13, el),
...line(200, 760, 440, 760, 3),
...line(760, 760, 1000, 760, 3),
);
break;
case 3: { // Meteor Shower — diagonal streaks with cores
for (let i = 0; i < 5; i++) {
const x0 = 140 + i * 210;
pegs.push(...line(x0, 230, x0 + 150, 720, 7, el));
pegs.push({ x: x0 + 160, y: 760, ...el });
}
pegs.push(...line(180, 200, 1020, 200, 6));
break;
}
default: // Supernova — rings + rays + corner shields
pegs.push(
...circle(600, 470, 90, 8, el),
...circle(600, 470, 210, 16, el),
);
for (let i = 0; i < 6; i++) {
const a = (i * Math.PI * 2) / 6;
pegs.push(...line(
600 + 260 * Math.cos(a), 470 + 260 * Math.sin(a),
600 + 420 * Math.cos(a), 470 + 420 * Math.sin(a), 3, el,
));
}
pegs.push(
...arc(140, 210, 150, 0, Math.PI * 0.5, 4),
...arc(1060, 210, 150, Math.PI * 0.5, Math.PI, 4),
...line(430, 780, 770, 780, 4),
);
break;
}
return levelFile(settle(pegs));
}
// ── Level 5 — Checkmate (Victor): diagonal checkerboard lattice ─────────────
// ── Victor (21-25): boards & lattices ────────────────────────────────────────
function level5() {
const pegs = [
function victorLevel(v) {
const pegs = [];
switch (v) {
case 0: // Opening Move — light checker rows
pegs.push(
...grid(220, 300, 6, 3, 150, 150, el),
...grid(295, 375, 6, 3, 150, 150, el),
...line(160, 210, 1040, 210, 6),
);
break;
case 1: { // Knight's Tour — L-shaped clusters
const L = (x, y) => [
...line(x, y, x, y + 180, 3, el),
...line(x, y + 180, x + 190, y + 180, 3, el),
];
pegs.push(
...L(240, 260), ...L(520, 220), ...L(800, 260),
...L(380, 520), ...L(660, 480), ...L(940, 520),
...line(160, 760, 460, 760, 4),
...line(740, 760, 1040, 760, 4),
);
break;
}
case 2: // Double Gambit — chevrons
for (let i = 0; i < 4; i++) {
const y = 260 + i * 140;
pegs.push(
...line(240, y, 600, y + 90, 6, el),
...line(600, y + 90, 960, y, 6, el),
);
}
break;
case 3: // Fortress — walls, towers & courtyard
pegs.push(
...line(220, 260, 980, 260, 9, el),
...line(220, 700, 980, 700, 9, el),
...line(220, 330, 220, 630, 4, el),
...line(475, 330, 475, 630, 4, el),
...line(725, 330, 725, 630, 4, el),
...line(980, 330, 980, 630, 4, el),
...grid(330, 400, 2, 2, 100, 130, el),
...grid(580, 400, 2, 2, 100, 130, el),
...grid(830, 400, 2, 2, 100, 130, el),
);
break;
default: // Checkmate — the dense diagonal lattice
pegs.push(
...grid(180, 250, 8, 5, 120, 120, el),
...grid(240, 310, 8, 5, 120, 120, el),
...line(160, 210, 1040, 210, 8),
];
);
break;
}
return levelFile(settle(pegs));
}
// ── Manifest + write ─────────────────────────────────────────────────────────
const LEVELS = [
{ level: 1, name: 'Tea Time', masterId: 'ethel', powerId: 'superguide', file: 'level-001.json', background: 'parlor', build: level1 },
{ level: 2, name: 'Fetch!', masterId: 'kona', powerId: 'multiball', file: 'level-002.json', background: 'park', build: level2 },
{ level: 3, name: 'Hocus Pocus', masterId: 'zanthor', powerId: 'spaceblast', file: 'level-003.json', background: 'arcana', build: level3 },
{ level: 4, name: 'X-Ray Vision', masterId: 'fireball', powerId: 'fireball', file: 'level-004.json', background: 'lab', build: level4 },
{ level: 5, name: 'Checkmate', masterId: 'victor', powerId: 'zenball', file: 'level-005.json', background: 'study', build: level5 },
const BLOCKS = [
{
masterId: 'ethel', powerId: 'superguide', background: 'parlor', build: ethelLevel,
names: ['Tea Time', 'Fine China', 'Doily Drop', 'Lace & Grace', "Grandma's Attic"],
},
{
masterId: 'kona', powerId: 'multiball', background: 'park', build: konaLevel,
names: ['Fetch!', 'Paw Prints', 'Buried Bones', 'Squeaky Toy', 'Best in Show'],
},
{
masterId: 'zanthor', powerId: 'spaceblast', background: 'arcana', build: zanthorLevel,
names: ['Hocus Pocus', 'Crescent Moon', 'Crystal Ball', 'Twin Stars', 'Grand Sigil'],
},
{
masterId: 'fireball', powerId: 'fireball', background: 'lab', build: fireballLevel,
names: ['X-Ray Vision', 'Solar Flare', 'Atomic Age', 'Meteor Shower', 'Supernova'],
},
{
masterId: 'victor', powerId: 'zenball', background: 'study', build: victorLevel,
names: ['Opening Move', "Knight's Tour", 'Double Gambit', 'Fortress', 'Checkmate'],
},
];
mkdirSync(OUT_DIR, { recursive: true });
for (const def of LEVELS) {
const data = def.build();
const manifestLevels = [];
let levelNo = 0;
for (const block of BLOCKS) {
for (let v = 0; v < 5; v++) {
levelNo++;
const file = `level-${String(levelNo).padStart(3, '0')}.json`;
const data = block.build(v);
const eligible = data.pegs.filter((p) => p.orangeEligible).length;
if (eligible < data.orangeCount) {
throw new Error(`${def.file}: only ${eligible} orange-eligible pegs (< ${data.orangeCount})`);
throw new Error(`${file} (${block.names[v]}): only ${eligible} orange-eligible pegs (< ${data.orangeCount})`);
}
writeFileSync(join(OUT_DIR, file), `${JSON.stringify(data, null, 2)}\n`);
console.log(`${file}: ${block.names[v]} [${block.masterId}] — ${data.pegs.length} pegs (${eligible} orange-eligible)`);
manifestLevels.push({
level: levelNo,
name: block.names[v],
masterId: block.masterId,
powerId: block.powerId,
file,
background: block.background,
});
}
writeFileSync(join(OUT_DIR, def.file), `${JSON.stringify(data, null, 2)}\n`);
console.log(`${def.file}: ${data.pegs.length} pegs (${eligible} orange-eligible)`);
}
const manifest = {
version: 1,
levels: LEVELS.map(({ build, ...entry }) => entry),
};
const manifest = { version: 1, levels: manifestLevels };
writeFileSync(join(OUT_DIR, 'levels.json'), `${JSON.stringify(manifest, null, 2)}\n`);
console.log(`levels.json: ${manifest.levels.length} levels`);

View File

@ -453,6 +453,24 @@ console.log('― data lint');
check('manifest has levels', Array.isArray(manifest.levels) && manifest.levels.length >= 5);
check('manifest levels sequential from 1',
manifest.levels.every((l, i) => l.level === i + 1));
// Friend blocks: 5 consecutive levels per master, in the expected order,
// one power per block. The intro screen keys off masterId changing between
// consecutive entries, so block integrity matters.
const BLOCK_ORDER = ['ethel', 'kona', 'zanthor', 'fireball', 'victor'];
check('25 levels in 5 friend blocks', manifest.levels.length === 25);
let blocksOk = true;
for (let b = 0; b < BLOCK_ORDER.length; b++) {
const block = manifest.levels.slice(b * 5, b * 5 + 5);
if (!block.every((l) => l.masterId === BLOCK_ORDER[b])) blocksOk = false;
if (new Set(block.map((l) => l.powerId)).size !== 1) blocksOk = false;
}
check('blocks of 5 share master+power in order', blocksOk);
const introLevels = manifest.levels
.filter((l, i) => i === 0 || manifest.levels[i - 1].masterId !== l.masterId)
.map((l) => l.level);
check('masterId-change rule marks intros at 1,6,11,16,21', introLevels.join(',') === '1,6,11,16,21', introLevels.join(','));
check('level names unique', new Set(manifest.levels.map((l) => l.name)).size === manifest.levels.length);
check('manifest masters exist in opponents.json',
manifest.levels.every((l) => roster.has(l.masterId)),
manifest.levels.filter((l) => !roster.has(l.masterId)).map((l) => l.masterId).join(','));
@ -504,7 +522,7 @@ console.log('― soak');
let invariantOk = true;
for (const entry of manifest.levels) {
const lvl = JSON.parse(readFileSync(join(DATA_DIR, entry.file), 'utf8'));
for (let g = 0; g < 6; g++) {
for (let g = 0; g < 3; g++) {
games++;
const st = createRound({ ...lvl, powerId: entry.powerId }, { seed: g * 977 + entry.level });
const rng = mulberry32(g * 31 + 7);