diff --git a/games/Gober_Nacho_Maze.js b/games/Gober_Nacho_Maze.js new file mode 100644 index 0000000000..c74cd010fe --- /dev/null +++ b/games/Gober_Nacho_Maze.js @@ -0,0 +1,330 @@ +/* +@title: Gober Nacho Maze +@author: gober +@description: A little pink creature moving through a maze to eat all the nachos. +@tags: ['music', 'maze'] +@addedOn: 2026-10-16 +*/ + +const player = "p"; +const nachos = "n"; +const block = "b"; +const target = "t"; +const wall = "w"; +const moveBlip = tune` +77.92207792207792: G4/77.92207792207792, +2415.5844155844156`; +const killBlip = tune` +56.60377358490566: D4/56.60377358490566, +56.60377358490566: E4/56.60377358490566, +56.60377358490566: D5/56.60377358490566, +1641.5094339622642`; +const resetBlip = tune` +46.875: A4/46.875, +46.875: E4/46.875, +46.875: C4/46.875, +1359.375`; +const winTune = tune` +114.50381679389314: F4/114.50381679389314, +114.50381679389314: C5/114.50381679389314, +114.50381679389314: A4/114.50381679389314, +114.50381679389314, +114.50381679389314: C5/114.50381679389314, +114.50381679389314: E5/114.50381679389314, +114.50381679389314: D5/114.50381679389314, +114.50381679389314: C5/114.50381679389314, +114.50381679389314: D5/114.50381679389314, +114.50381679389314: C5/114.50381679389314, +2519.083969465649` +const nextLevelBlip = tune` +47.543581616481774: D4/47.543581616481774, +47.543581616481774: D5/47.543581616481774, +47.543581616481774: A4/47.543581616481774, +1378.7638668779714`; + +setLegend( + [player, bitmap` +................ +................ +................ +................ +......888.88.... +.....888888.8... +....888888888... +...888888888.... +...8880888088... +....8888888880.. +.....8080808000. +.....880808.000. +.....888888..0.. +.....888888000.. +.....88..88..... +................`], + [wall, bitmap` +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000`], + [nachos, bitmap` +................ +................ +................ +................ +................ +................ +................ +................ +....99.99.99.... +..996696696699.. +1196969669696911 +12116CCCCCC61121 +1122111111112211 +.11222222222211. +..111222222111.. +....11111111....`], + [block, bitmap` +................ +................ +................ +................ +...7777777777... +...7777777777... +...7777777777... +...7777777777... +...7777777777... +...7777777777... +...7777777777... +...7777777777... +...7777777777... +...7777777777... +................ +................`], + [target, bitmap` +................ +................ +................ +..44........44.. +..444......444.. +....44....44.... +.....44..44..... +......44444..... +.......444...... +......44444..... +.....44..444.... +....44....444... +...44......44... +...44........... +................ +................`], +) + +setSolids([player, wall, nachos]); + +let level = 0 +const levels = [ + map` +pwwww.tw +.www...w +.ww..www +....wwww +www.wwwn +www..... +ww..ww.. +ww.wwww.`, + + map` +wwtwww +wwn.ww +www..w +p..... +ww..ww +wn.www`, + + map` +wwwwwwwww +wpwn.w..w +w.ww.w..w +w....wn.w +www.www.w +wnw.n...w +w...ww..w +www..w.tw +wwwwwwwww`, + + map` +wwwwwwwwww +p.w......w +w.w.wwww.w +w.w..nwn.w +w.wwwww..w +w.....wt.w +wwwww.ww.w +wn.......w +wwwwwwwwww`, + + map` +wwwwwwwwwwwww +p...wn..w...w +www.w.w.w.w.w +wnw...w.wnw.w +w.wwwww.www.w +w.w..nw.wn..w +w.w.w.wnw.www +w.w.w.w.w...w +w.w.w.w.www.w +w.n.w.w.wn..w +w.www.w.w.w.w +w..nw..t..w.w +wwwwwwwwwwwww`, + + map` +wwwwwwwwwwwwwww +p.......wn....w +wwwwwww.www.w.w +wn....wn....w.w +www.wwwwwwwww.w +w...wn.....nw.w +w.www.w.www.w.w +w...w.wt.nw.w.w +w.w.w.www.www.w +w.wn....w.w..nw +w.wwwwwww.w.www +w.wn..wn..w...w +w.www.w.wwwww.w +w.....w.......w +wwwwwwwwwwwwwww`, + + map` +wwwwwwwwwwwwwwwwwww +p.....wt.........nw +wwwww.w.wwwwwww.www +wnw...w......nw...w +w.w.wwwwwwwww.www.w +w.w.wn..w...w.w...w +w.w.w.w.w.w.w.w.w.w +w.w.w.w..nw.w.w.wnw +w.w.w.wwwwwww.w.www +w...w.w.....w.wn..w +w.www.w.www.w.www.w +w...wn...nw.w..nw.w +www.wwwww.w.w.www.w +wnw...w...w...w..nw +w.www.wwwww.www.www +w.....w...w..nwn..w +w.wwwww.w.wwwwwww.w +w.......wn........w +wwwwwwwwwwwwwwwwwww`, + + map` +wwwwwwwwwwwwwwwwwwww +p.w..nw...........ww +w.w.www.w.wwwwwww.ww +w.w.....w.wn....w.ww +w.www.www.www.www.ww +w...w.w...w...wn..ww +www.w.w.www.w.w.wwww +wnw.w.w..nw.wnw...nw +w.w.w.www.w.wwwwww.w +w.w.w.wnw.w.....nw.w +w.w.w.w.w.w.www..w.w +w...w...w.w..nw..w.w +w.wwwwwww.w.www.ww.w +wn......w.wnw...w..w +wwwwwww.w.www.w.w..w +w.....w.w...w.wnwn.w +w.w.www.www.w.wwww.w +wnw.........w.....tw +wwwwwwwwwwwwwwwwwwww`, +] + +setMap(levels[level]) + +setPushables({ + [player]: [block], + [block]: [block] +}) + +onInput("w", () => { + playTune(moveBlip); + getFirst(player).y += -1 +}) + +onInput("a", () => { + playTune(moveBlip); + getFirst(player).x += -1 +}) + +onInput("s", () => { + playTune(moveBlip); + getFirst(player).y += 1 +}) + +onInput("d", () => { + playTune(moveBlip); + getFirst(player).x += 1 +}) + +onInput("i", () => { + playTune(moveBlip); +}) + +onInput("j", () => { + playTune(resetBlip); + const currentLevel = levels[level]; // get the original map of the level + + // make sure the level exists before we load it + if (currentLevel !== undefined) { + clearText(""); + setMap(currentLevel); + } +}) + +onInput("k", () => { + playTune(moveBlip); +}) + +onInput("l", () => { + playTune(killBlip); + + const pSprite = getFirst(player); + if (!pSprite) return; + + const nearbyEnemies = getAll(nachos).filter(eSprite => { + const dx = Math.abs(pSprite.x - eSprite.x); + const dy = Math.abs(pSprite.y - eSprite.y); + return dx <= 1 && dy <= 1; + }); + + if (nearbyEnemies.length > 0) { + nearbyEnemies[0].remove(); + } +}) + +afterInput(() => { + const numberOfGoalsCovered = tilesWith(player, target).length; + const enemiesLeft = getAll(nachos).length; + + // must be standing on the target and all level nachos must be totally gone :P + if (numberOfGoalsCovered > 0 && enemiesLeft === 0) { + level = level + 1; + if (level < levels.length) { + playTune(nextLevelBlip); + setMap(levels[level]); + } else { + playTune(winTune); + addText("you win!", { y: 4, color: color`3` }) + } + } +})