diff --git a/assets/gamedata/peggle/level-033.json b/assets/gamedata/peggle/level-033.json index 23ae92e..1a4cd20 100644 --- a/assets/gamedata/peggle/level-033.json +++ b/assets/gamedata/peggle/level-033.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-034.json b/assets/gamedata/peggle/level-034.json index 87bae0c..44f4489 100644 --- a/assets/gamedata/peggle/level-034.json +++ b/assets/gamedata/peggle/level-034.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-035.json b/assets/gamedata/peggle/level-035.json index ccdf76f..40fa608 100644 --- a/assets/gamedata/peggle/level-035.json +++ b/assets/gamedata/peggle/level-035.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-036.json b/assets/gamedata/peggle/level-036.json index 7b30848..901450d 100644 --- a/assets/gamedata/peggle/level-036.json +++ b/assets/gamedata/peggle/level-036.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-037.json b/assets/gamedata/peggle/level-037.json index 8f67bd6..96a2511 100644 --- a/assets/gamedata/peggle/level-037.json +++ b/assets/gamedata/peggle/level-037.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-038.json b/assets/gamedata/peggle/level-038.json index a3ccc4a..cbd6239 100644 --- a/assets/gamedata/peggle/level-038.json +++ b/assets/gamedata/peggle/level-038.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-039.json b/assets/gamedata/peggle/level-039.json index 28e040a..70cd060 100644 --- a/assets/gamedata/peggle/level-039.json +++ b/assets/gamedata/peggle/level-039.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-040.json b/assets/gamedata/peggle/level-040.json index cce3e34..f40a71f 100644 --- a/assets/gamedata/peggle/level-040.json +++ b/assets/gamedata/peggle/level-040.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-041.json b/assets/gamedata/peggle/level-041.json index 51c147c..66f6271 100644 --- a/assets/gamedata/peggle/level-041.json +++ b/assets/gamedata/peggle/level-041.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-042.json b/assets/gamedata/peggle/level-042.json index 672a481..5c4396d 100644 --- a/assets/gamedata/peggle/level-042.json +++ b/assets/gamedata/peggle/level-042.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-043.json b/assets/gamedata/peggle/level-043.json index 6f80051..4263b72 100644 --- a/assets/gamedata/peggle/level-043.json +++ b/assets/gamedata/peggle/level-043.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-044.json b/assets/gamedata/peggle/level-044.json index 1864e4f..7047908 100644 --- a/assets/gamedata/peggle/level-044.json +++ b/assets/gamedata/peggle/level-044.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-045.json b/assets/gamedata/peggle/level-045.json index ebd7e9d..b312bcf 100644 --- a/assets/gamedata/peggle/level-045.json +++ b/assets/gamedata/peggle/level-045.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-046.json b/assets/gamedata/peggle/level-046.json index 8f61a0a..ccaa562 100644 --- a/assets/gamedata/peggle/level-046.json +++ b/assets/gamedata/peggle/level-046.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-047.json b/assets/gamedata/peggle/level-047.json index dc26380..164e780 100644 --- a/assets/gamedata/peggle/level-047.json +++ b/assets/gamedata/peggle/level-047.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-048.json b/assets/gamedata/peggle/level-048.json index 89ab33d..e71b324 100644 --- a/assets/gamedata/peggle/level-048.json +++ b/assets/gamedata/peggle/level-048.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-049.json b/assets/gamedata/peggle/level-049.json index 2fb1b74..de157ac 100644 --- a/assets/gamedata/peggle/level-049.json +++ b/assets/gamedata/peggle/level-049.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-050.json b/assets/gamedata/peggle/level-050.json index 1674e12..f9a4636 100644 --- a/assets/gamedata/peggle/level-050.json +++ b/assets/gamedata/peggle/level-050.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-051.json b/assets/gamedata/peggle/level-051.json index d83176e..900e90f 100644 --- a/assets/gamedata/peggle/level-051.json +++ b/assets/gamedata/peggle/level-051.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-052.json b/assets/gamedata/peggle/level-052.json index 341e7ea..bd19857 100644 --- a/assets/gamedata/peggle/level-052.json +++ b/assets/gamedata/peggle/level-052.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-053.json b/assets/gamedata/peggle/level-053.json index 5e926b4..283f627 100644 --- a/assets/gamedata/peggle/level-053.json +++ b/assets/gamedata/peggle/level-053.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-054.json b/assets/gamedata/peggle/level-054.json index 3fa3b8e..e719139 100644 --- a/assets/gamedata/peggle/level-054.json +++ b/assets/gamedata/peggle/level-054.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-055.json b/assets/gamedata/peggle/level-055.json index 350ddaa..4206998 100644 --- a/assets/gamedata/peggle/level-055.json +++ b/assets/gamedata/peggle/level-055.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-056.json b/assets/gamedata/peggle/level-056.json index b44a6c9..6fb1791 100644 --- a/assets/gamedata/peggle/level-056.json +++ b/assets/gamedata/peggle/level-056.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-057.json b/assets/gamedata/peggle/level-057.json index 4c42788..3253aee 100644 --- a/assets/gamedata/peggle/level-057.json +++ b/assets/gamedata/peggle/level-057.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-058.json b/assets/gamedata/peggle/level-058.json index 2a00034..6d2cc08 100644 --- a/assets/gamedata/peggle/level-058.json +++ b/assets/gamedata/peggle/level-058.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-059.json b/assets/gamedata/peggle/level-059.json index 6d60033..f72fa0b 100644 --- a/assets/gamedata/peggle/level-059.json +++ b/assets/gamedata/peggle/level-059.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-060.json b/assets/gamedata/peggle/level-060.json index 9cb271d..1190c3c 100644 --- a/assets/gamedata/peggle/level-060.json +++ b/assets/gamedata/peggle/level-060.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-061.json b/assets/gamedata/peggle/level-061.json index 983a869..474bdbc 100644 --- a/assets/gamedata/peggle/level-061.json +++ b/assets/gamedata/peggle/level-061.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-062.json b/assets/gamedata/peggle/level-062.json index a61b24c..c6342b1 100644 --- a/assets/gamedata/peggle/level-062.json +++ b/assets/gamedata/peggle/level-062.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-063.json b/assets/gamedata/peggle/level-063.json index 0fa4167..9d283db 100644 --- a/assets/gamedata/peggle/level-063.json +++ b/assets/gamedata/peggle/level-063.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-064.json b/assets/gamedata/peggle/level-064.json index eed979d..2e004d3 100644 --- a/assets/gamedata/peggle/level-064.json +++ b/assets/gamedata/peggle/level-064.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-065.json b/assets/gamedata/peggle/level-065.json index 70e90eb..5102246 100644 --- a/assets/gamedata/peggle/level-065.json +++ b/assets/gamedata/peggle/level-065.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-066.json b/assets/gamedata/peggle/level-066.json index f2c90b7..4cf6f1b 100644 --- a/assets/gamedata/peggle/level-066.json +++ b/assets/gamedata/peggle/level-066.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-067.json b/assets/gamedata/peggle/level-067.json index 284f09f..c68c84d 100644 --- a/assets/gamedata/peggle/level-067.json +++ b/assets/gamedata/peggle/level-067.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-068.json b/assets/gamedata/peggle/level-068.json index 8fc56d8..934ddd1 100644 --- a/assets/gamedata/peggle/level-068.json +++ b/assets/gamedata/peggle/level-068.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-069.json b/assets/gamedata/peggle/level-069.json index 72ab5e8..a912992 100644 --- a/assets/gamedata/peggle/level-069.json +++ b/assets/gamedata/peggle/level-069.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-070.json b/assets/gamedata/peggle/level-070.json index 0e8567f..f965d06 100644 --- a/assets/gamedata/peggle/level-070.json +++ b/assets/gamedata/peggle/level-070.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-071.json b/assets/gamedata/peggle/level-071.json index db94998..c14442e 100644 --- a/assets/gamedata/peggle/level-071.json +++ b/assets/gamedata/peggle/level-071.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-072.json b/assets/gamedata/peggle/level-072.json index 89e598c..bd3cd94 100644 --- a/assets/gamedata/peggle/level-072.json +++ b/assets/gamedata/peggle/level-072.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-073.json b/assets/gamedata/peggle/level-073.json index 1ce85e9..424b877 100644 --- a/assets/gamedata/peggle/level-073.json +++ b/assets/gamedata/peggle/level-073.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-074.json b/assets/gamedata/peggle/level-074.json index 58bf42f..b086fc0 100644 --- a/assets/gamedata/peggle/level-074.json +++ b/assets/gamedata/peggle/level-074.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-075.json b/assets/gamedata/peggle/level-075.json index 260bdf1..1b8ac08 100644 --- a/assets/gamedata/peggle/level-075.json +++ b/assets/gamedata/peggle/level-075.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-076.json b/assets/gamedata/peggle/level-076.json index 3d5c81a..e33038d 100644 --- a/assets/gamedata/peggle/level-076.json +++ b/assets/gamedata/peggle/level-076.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-077.json b/assets/gamedata/peggle/level-077.json index b24bb14..f95ca56 100644 --- a/assets/gamedata/peggle/level-077.json +++ b/assets/gamedata/peggle/level-077.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-078.json b/assets/gamedata/peggle/level-078.json index b955bce..1f62c13 100644 --- a/assets/gamedata/peggle/level-078.json +++ b/assets/gamedata/peggle/level-078.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-079.json b/assets/gamedata/peggle/level-079.json index d94237c..65e2fe6 100644 --- a/assets/gamedata/peggle/level-079.json +++ b/assets/gamedata/peggle/level-079.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-080.json b/assets/gamedata/peggle/level-080.json index 4799219..fe51aaf 100644 --- a/assets/gamedata/peggle/level-080.json +++ b/assets/gamedata/peggle/level-080.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-081.json b/assets/gamedata/peggle/level-081.json index f184302..e406ebe 100644 --- a/assets/gamedata/peggle/level-081.json +++ b/assets/gamedata/peggle/level-081.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-082.json b/assets/gamedata/peggle/level-082.json index b81eb86..8416903 100644 --- a/assets/gamedata/peggle/level-082.json +++ b/assets/gamedata/peggle/level-082.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-083.json b/assets/gamedata/peggle/level-083.json index 5d4c144..c4de3e2 100644 --- a/assets/gamedata/peggle/level-083.json +++ b/assets/gamedata/peggle/level-083.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-084.json b/assets/gamedata/peggle/level-084.json index 9198efd..2fdaa8a 100644 --- a/assets/gamedata/peggle/level-084.json +++ b/assets/gamedata/peggle/level-084.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/gamedata/peggle/level-085.json b/assets/gamedata/peggle/level-085.json index 65be37c..578618e 100644 --- a/assets/gamedata/peggle/level-085.json +++ b/assets/gamedata/peggle/level-085.json @@ -4,7 +4,7 @@ "width": 1200, "height": 900 }, - "orangeCount": 25, + "orangeCount": 18, "greenCount": 2, "pegs": [ { diff --git a/assets/images/peggle/gerome.png b/assets/images/peggle/gerome.png new file mode 100644 index 0000000..2c12252 Binary files /dev/null and b/assets/images/peggle/gerome.png differ diff --git a/assets/images/peggle/schooner.png b/assets/images/peggle/schooner.png new file mode 100644 index 0000000..8e7939c Binary files /dev/null and b/assets/images/peggle/schooner.png differ diff --git a/assets/images/peggle/terry.png b/assets/images/peggle/terry.png new file mode 100644 index 0000000..ede45e3 Binary files /dev/null and b/assets/images/peggle/terry.png differ diff --git a/assets/videos/peggle/gerome.mp4 b/assets/videos/peggle/gerome.mp4 new file mode 100644 index 0000000..9667a9c Binary files /dev/null and b/assets/videos/peggle/gerome.mp4 differ diff --git a/assets/videos/peggle/schooner.mp4 b/assets/videos/peggle/schooner.mp4 new file mode 100644 index 0000000..2b0ae56 Binary files /dev/null and b/assets/videos/peggle/schooner.mp4 differ diff --git a/assets/videos/peggle/terry.mp4 b/assets/videos/peggle/terry.mp4 new file mode 100644 index 0000000..1b7d351 Binary files /dev/null and b/assets/videos/peggle/terry.mp4 differ diff --git a/src/games/peggle/PeggleLogic.js b/src/games/peggle/PeggleLogic.js index 49e6309..e9148fa 100644 --- a/src/games/peggle/PeggleLogic.js +++ b/src/games/peggle/PeggleLogic.js @@ -90,8 +90,8 @@ export const POWERS = { }, meteor: { // Terry id: 'meteor', name: 'Meteor Strike', trigger: 'instant', - desc: 'A meteor crashes down through the green peg, lighting every peg in its column.', - params: { halfWidth: 70 }, + desc: 'A meteor crashes down through the green peg, lighting every peg in its column — then two more rain down on random orange pegs over the next 1.5s.', + params: { halfWidth: 70, delays: [1, 1.5] }, }, overclock: { // Nicole id: 'overclock', name: 'Overclock', trigger: 'instant', @@ -110,8 +110,8 @@ export const POWERS = { }, beaverdam: { // Maurice id: 'beaverdam', name: 'Beaver Dam', trigger: 'charge', - desc: 'The free-ball bucket is dammed up to nearly double width for your next 3 shots.', - params: { widthScale: 1.9, shots: 3 }, + desc: 'The free-ball bucket is dammed up to nearly double width for your next 5 shots.', + params: { widthScale: 1.9, shots: 5 }, }, shadowslash: { // Kage id: 'shadowslash', name: 'Shadow Slash', trigger: 'instant', @@ -120,8 +120,8 @@ export const POWERS = { }, tailwind: { // Schooner id: 'tailwind', name: 'Tailwind', trigger: 'nextBall', - desc: 'Your next ball rides the sea breeze — light as a gull, it floats far longer.', - params: { gravityScale: 0.55 }, + desc: 'Your next 3 balls ride the sea breeze — light as gulls, they float far longer.', + params: { gravityScale: 0.55, shots: 3 }, }, cosmicbloom: { // Aiko id: 'cosmicbloom', name: 'Cosmic Bloom', trigger: 'instant', @@ -333,6 +333,7 @@ export function createRound(levelDef, opts = {}) { wideBucketShots: 0, rewindCharges: 0, feverResolved: false, + pendingMeteors: [], // absolute state.time values for Meteor Strike follow-ups }; assignPurple(state); return state; @@ -363,6 +364,7 @@ export function cloneState(state) { pegs: state.pegs.map((p) => ({ ...p })), balls: state.balls.map((b) => ({ ...b })), lastPegHit: state.lastPegHit ? { ...state.lastPegHit } : null, + pendingMeteors: [...state.pendingMeteors], }; c.rng.state = state.rng.state; return c; @@ -604,6 +606,18 @@ function areaBlast(state, events, type, origin, predicate) { return hit; } +// Meteor Strike follow-up: crashes a meteor onto a random still-active orange +// peg (scoring it directly, since no ball is involved) and blasts its column. +function fireMeteorStrike(state, events) { + const half = POWERS.meteor.params.halfWidth; + const eligible = state.pegs.filter((q) => q.color === 'orange' && !q.lit && !q.removed).map((q) => q.id); + if (!eligible.length) return; + const [id] = pickN(state.rng, eligible, 1); + const target = state.pegs[id]; + scorePeg(state, target, events, { fromBlast: true }); + areaBlast(state, events, 'meteorColumn', target, (q) => Math.abs(q.x - target.x) <= half); +} + export function applyPower(state, powerId, ctx = {}) { const events = ctx.events ?? []; switch (powerId) { @@ -669,6 +683,9 @@ export function applyPower(state, powerId, ctx = {}) { const half = POWERS.meteor.params.halfWidth; areaBlast(state, events, 'meteorColumn', peg, (q) => Math.abs(q.x - peg.x) <= half); events.push({ type: 'powerFired', powerId: 'meteor' }); + for (const delay of POWERS.meteor.params.delays) { + state.pendingMeteors.push(state.time + delay); + } } break; } @@ -706,7 +723,7 @@ export function applyPower(state, powerId, ctx = {}) { break; } case 'tailwind': // Schooner - state.floatyNext++; + state.floatyNext += POWERS.tailwind.params.shots; break; case 'cosmicbloom': { // Aiko const blues = state.pegs.filter((q) => q.color === 'blue' && !q.lit && !q.removed).map((q) => q.id); @@ -732,6 +749,15 @@ export function applyPower(state, powerId, ctx = {}) { export function stepSim(state, dt) { const events = []; state.time += dt; + if (state.pendingMeteors.length) { + const due = state.pendingMeteors.filter((t) => t <= state.time).sort((a, b) => a - b); + if (due.length) { + state.pendingMeteors = state.pendingMeteors.filter((t) => t > state.time); + if (state.phase !== 'won' && state.phase !== 'lost') { + for (let i = 0; i < due.length; i++) fireMeteorStrike(state, events); + } + } + } if (state.phase !== 'flight' && state.phase !== 'fever') return events; state.flightTime += dt; diff --git a/tools/genPeggleLevels.js b/tools/genPeggleLevels.js index 787b444..f21fd28 100644 --- a/tools/genPeggleLevels.js +++ b/tools/genPeggleLevels.js @@ -1096,6 +1096,7 @@ for (const block of BLOCKS) { levelNo++; const file = `level-${String(levelNo).padStart(3, '0')}.json`; const data = block.build(v); + if (levelNo >= 33) data.orangeCount -= 7; const info = validate(data, `${file} (${block.names[v]})`); writeFileSync(join(OUT_DIR, file), `${JSON.stringify(data, null, 2)}\n`); console.log(`${file}: ${block.names[v]} [${block.masterId}] — ${data.pegs.length} pegs + ${info.bricks} bricks (${info.eligible} orange-eligible)`); diff --git a/tools/verifyPeggle.js b/tools/verifyPeggle.js index 5c3c1d7..f7d7270 100644 --- a/tools/verifyPeggle.js +++ b/tools/verifyPeggle.js @@ -600,6 +600,27 @@ console.log('― powers (new wave)'); met && JSON.stringify(met.pegIds)); } +{ + // Meteor Strike: two follow-up meteors land on random active orange pegs, + // 1s and 1.5s after the initial strike, for 3 total. + const st = mkState([ + { x: 600, y: 500 }, // green + { x: 100, y: 500 }, { x: 400, y: 500 }, { x: 1000, y: 500 }, // oranges, each >140 apart so blast columns don't overlap + ], { powerId: 'meteor' }); + st.pegs[0].color = 'green'; + st.pegs[1].color = 'orange'; + st.pegs[2].color = 'orange'; + st.pegs[3].color = 'orange'; + inject(st, { x: 600, y: 450, vx: 0, vy: 200 }); + const log = []; + for (let t = 0; t < 3; t += 1 / 60) log.push(...stepSim(st, 1 / 60)); + const strikes = log.filter((e) => e.type === 'meteorColumn'); + check('meteor strikes 3 times total (1 instant + 2 follow-ups)', strikes.length === 3, `got ${strikes.length}`); + const orangeHits = log.filter((e) => e.type === 'pegHit' && e.color === 'orange'); + check('the 2 follow-ups each score a distinct orange peg', orangeHits.length === 2 + && new Set(orangeHits.map((e) => e.pegId)).size === 2, JSON.stringify(orangeHits)); +} + { // Overclock: doubles peg scoring for the rest of the shot only. An orange // far off the path keeps the round alive; force the target peg blue (the @@ -649,16 +670,17 @@ console.log('― powers (new wave)'); } { - // Beaver Dam: wider opening catches wide, expires after 3 launches. + // Beaver Dam: wider opening catches wide, expires after N launches. + const damShots = POWERS.beaverdam.params.shots; const st = mkState([]); applyPower(st, 'beaverdam'); - check('dam charges 3 shots', st.wideBucketShots === 3); + check(`dam charges ${damShots} shots`, st.wideBucketShots === damShots); check('dam widens the bucket', bucketWidth(st) === T.BUCKET_W * POWERS.beaverdam.params.widthScale); st.time = 0; const bx = bucketX(st); const wideX = bx + T.BUCKET_W / 2 + 20; // outside normal opening, inside dam st.phase = 'flight'; - st.wideBucketShots = 3; + st.wideBucketShots = damShots; st.balls.push({ x: wideX, y: T.BUCKET_Y - 30, vx: 0, vy: 300, stuckFor: 0, fireball: false, r: T.BALL_R, pierce: 0, spooky: 0 }); let caught = false; for (let i = 0; i < 60 && !caught; i++) { @@ -667,10 +689,11 @@ console.log('― powers (new wave)'); check('dam catches outside the normal opening', caught); const st3 = mkState([]); applyPower(st3, 'beaverdam'); - launchBall(st3, 0); st3.balls.length = 0; st3.phase = 'aim'; - launchBall(st3, 0); st3.balls.length = 0; st3.phase = 'aim'; + for (let i = 0; i < damShots - 1; i++) { + launchBall(st3, 0); st3.balls.length = 0; st3.phase = 'aim'; + } launchBall(st3, 0); - check('dam expires after 3 launches', st3.wideBucketShots === 0 && bucketWidth(st3) === T.BUCKET_W); + check(`dam expires after ${damShots} launches`, st3.wideBucketShots === 0 && bucketWidth(st3) === T.BUCKET_W); } {