{"_id":"@caputchin/game-whack-a-monkey","_rev":"5-66ca0c0b1248c6065d23ccb319f09022","name":"@caputchin/game-whack-a-monkey","dist-tags":{"latest":"0.4.0"},"versions":{"0.2.0":{"name":"@caputchin/game-whack-a-monkey","version":"0.2.0","keywords":["caputchin","caputchin-game","captcha","whack-a-mole","monkey","tap","arcade","game"],"license":"MIT","_id":"@caputchin/game-whack-a-monkey@0.2.0","maintainers":[{"name":"caputchiner","email":"info@caputchin.com"}],"homepage":"https://github.com/Caputchin/caputchin-games#readme","bugs":{"url":"https://github.com/Caputchin/caputchin-games/issues"},"dist":{"shasum":"62b852a1ee6b062c7b05be62440d05b3eb2daa1a","tarball":"https://registry.npmjs.org/@caputchin/game-whack-a-monkey/-/game-whack-a-monkey-0.2.0.tgz","fileCount":5,"integrity":"sha512-nsJU8qjgG7s7e3S+oEzduIPQJByCc5CATYBnny//yyiTo3cU8oQ1Q8Hlhym/gCNYh/prhPw6DJZLyw1wc2Yarw==","signatures":[{"sig":"MEUCIB+EPdUjlRvDKuqXi+wrE0FZmzgcroYlYFCY/Q0x3l02AiEA8La5kn7cCn3u2uj/iO9vSqSXGFTlGn5epkRbutPuCpY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":127894},"type":"module","_from":"file:caputchin-game-whack-a-monkey-0.2.0.tgz","private":false,"scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"caputchiner","email":"info@caputchin.com"},"_resolved":"/tmp/e0a0f791ac5d9811a8e26a321bde1d27/caputchin-game-whack-a-monkey-0.2.0.tgz","_integrity":"sha512-nsJU8qjgG7s7e3S+oEzduIPQJByCc5CATYBnny//yyiTo3cU8oQ1Q8Hlhym/gCNYh/prhPw6DJZLyw1wc2Yarw==","repository":{"url":"git+https://github.com/Caputchin/caputchin-games.git","type":"git","directory":"packages/whack-a-monkey"},"_npmVersion":"10.9.8","description":"Tap the monkeys before they duck, leave the jungle decoys alone. A Caputchin first-party game.","directories":{},"sideEffects":["./dist/whack-a-monkey.js"],"_nodeVersion":"22.22.3","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","happy-dom":"^15.0.0","typescript":"^5.4.0","@types/node":"^20.0.0","@caputchin/game-sdk":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/game-whack-a-monkey_0.2.0_1779729565833_0.10781505933766189","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@caputchin/game-whack-a-monkey","version":"0.3.0","keywords":["caputchin","caputchin-game","captcha","whack-a-mole","monkey","tap","arcade","game"],"license":"MIT","_id":"@caputchin/game-whack-a-monkey@0.3.0","maintainers":[{"name":"caputchiner","email":"info@caputchin.com"}],"homepage":"https://github.com/Caputchin/caputchin-games#readme","bugs":{"url":"https://github.com/Caputchin/caputchin-games/issues"},"dist":{"shasum":"6b01b2ae73939bf0c68b5977d700f75f07d86d25","tarball":"https://registry.npmjs.org/@caputchin/game-whack-a-monkey/-/game-whack-a-monkey-0.3.0.tgz","fileCount":6,"integrity":"sha512-+x54KRCi4djNTp/sqJQZodoTHB4o8tBGMtgsp0vB5UgtZPNwQGIwQLZj9ALdGL3y8teRItRTuZoguvEwNzv2Xg==","signatures":[{"sig":"MEUCIQDmZvXINVnTdfLnDozgadtuVJQGUrN3HrpD/eEZHJtfQAIgY9ZoGA4awMqFzHd1dFQjjvgyPdsfzr/rs7aw2zczbzM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":92795},"type":"module","_from":"file:caputchin-game-whack-a-monkey-0.3.0.tgz","private":false,"scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"caputchiner","email":"info@caputchin.com"},"_resolved":"/tmp/b142f923413daf0a79aa043541f9ab3f/caputchin-game-whack-a-monkey-0.3.0.tgz","_integrity":"sha512-+x54KRCi4djNTp/sqJQZodoTHB4o8tBGMtgsp0vB5UgtZPNwQGIwQLZj9ALdGL3y8teRItRTuZoguvEwNzv2Xg==","repository":{"url":"git+https://github.com/Caputchin/caputchin-games.git","type":"git","directory":"packages/whack-a-monkey"},"_npmVersion":"10.9.8","description":"Tap the monkeys before they duck, leave the jungle decoys alone. A Caputchin first-party game.","directories":{},"sideEffects":["./dist/whack-a-monkey.js"],"_nodeVersion":"22.22.3","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","happy-dom":"^15.0.0","typescript":"^5.4.0","@types/node":"^20.0.0","@caputchin/game-sdk":"^3.0.0","@caputchin/engine-runtime":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/game-whack-a-monkey_0.3.0_1780326417826_0.3638444492131674","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@caputchin/game-whack-a-monkey","version":"0.3.1","keywords":["caputchin","caputchin-game","captcha","whack-a-mole","monkey","tap","arcade","game"],"license":"MIT","_id":"@caputchin/game-whack-a-monkey@0.3.1","maintainers":[{"name":"caputchiner","email":"info@caputchin.com"}],"homepage":"https://github.com/Caputchin/caputchin-games#readme","bugs":{"url":"https://github.com/Caputchin/caputchin-games/issues"},"dist":{"shasum":"c129e5acc7683873b4403a04c5c014f6d5628804","tarball":"https://registry.npmjs.org/@caputchin/game-whack-a-monkey/-/game-whack-a-monkey-0.3.1.tgz","fileCount":9,"integrity":"sha512-kesQbGiTPfe57Mc4pZO7JK/Sx/EdvwKyyrFquncTsDNqbxoIvWPUJyP0SiAh8zFBiDuD+G+3WjsecwBZNu/fGw==","signatures":[{"sig":"MEQCICQGQDrOjL5kfgZVGE6ZpyrxcYZDRVOYF7S1l4jO0NbbAiBi/kVUZAD5wcRpgC4jNixiaFMP0J4kalqlfthgHGoLgw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":117577},"type":"module","_from":"file:caputchin-game-whack-a-monkey-0.3.1.tgz","private":false,"scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"caputchiner","email":"info@caputchin.com"},"_resolved":"/tmp/3f386e51a10b4c9dcfe4b35ebb4e90f5/caputchin-game-whack-a-monkey-0.3.1.tgz","_integrity":"sha512-kesQbGiTPfe57Mc4pZO7JK/Sx/EdvwKyyrFquncTsDNqbxoIvWPUJyP0SiAh8zFBiDuD+G+3WjsecwBZNu/fGw==","repository":{"url":"git+https://github.com/Caputchin/caputchin-games.git","type":"git","directory":"packages/whack-a-monkey"},"_npmVersion":"10.9.8","description":"Tap the monkeys before they duck, leave the jungle decoys alone. A Caputchin first-party game.","directories":{},"sideEffects":["./dist/whack-a-monkey.js"],"_nodeVersion":"22.22.3","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","happy-dom":"^15.0.0","typescript":"^5.4.0","@types/node":"^20.0.0","@caputchin/game-sdk":"^3.0.0","@caputchin/engine-runtime":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/game-whack-a-monkey_0.3.1_1780392440638_0.21054752138261046","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@caputchin/game-whack-a-monkey","version":"0.3.2","keywords":["caputchin","caputchin-game","captcha","whack-a-mole","monkey","tap","arcade","game"],"license":"MIT","_id":"@caputchin/game-whack-a-monkey@0.3.2","maintainers":[{"name":"caputchiner","email":"info@caputchin.com"}],"homepage":"https://github.com/Caputchin/caputchin-games#readme","bugs":{"url":"https://github.com/Caputchin/caputchin-games/issues"},"dist":{"shasum":"cfc65d0d3b68404eac19d818f02c0aa965bcfa73","tarball":"https://registry.npmjs.org/@caputchin/game-whack-a-monkey/-/game-whack-a-monkey-0.3.2.tgz","fileCount":10,"integrity":"sha512-5an0g4OAS7RgqdwliOCxth72i4hHbGAnOQ32uCHJqdf0w/dupU7XorZS0so73cd+EjEfPKzdjAF41mCeMr2DeQ==","signatures":[{"sig":"MEUCIEJREb75B6NscqMfqtWCC+xemLuU/HRbKxMNEBE2B9DhAiEA9zl4VUPAcC82rqEKmCO8XLJT0xq0gYTCdvxrRxCSsKE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115215},"type":"module","_from":"file:caputchin-game-whack-a-monkey-0.3.2.tgz","private":false,"scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","check":"caputchin-selfcheck dist/run.js","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"caputchiner","email":"info@caputchin.com"},"_resolved":"/tmp/18743732b4633c99b1c68c254d535309/caputchin-game-whack-a-monkey-0.3.2.tgz","_integrity":"sha512-5an0g4OAS7RgqdwliOCxth72i4hHbGAnOQ32uCHJqdf0w/dupU7XorZS0so73cd+EjEfPKzdjAF41mCeMr2DeQ==","repository":{"url":"git+https://github.com/Caputchin/caputchin-games.git","type":"git","directory":"packages/whack-a-monkey"},"_npmVersion":"10.9.8","description":"Tap the monkeys before they duck, leave the jungle decoys alone. A Caputchin first-party game.","directories":{},"sideEffects":["./dist/whack-a-monkey.js"],"_nodeVersion":"22.22.3","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^2.0.0","happy-dom":"^15.0.0","typescript":"^5.4.0","@types/node":"^20.0.0","@caputchin/game-sdk":"^3.1.0","@caputchin/engine-kit":"^0.4.0","@caputchin/determinism":"^0.2.0","@caputchin/replay-contract":"^0.3.0"},"_npmOperationalInternal":{"tmp":"tmp/game-whack-a-monkey_0.3.2_1780543626052_0.48087342940731737","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@caputchin/game-whack-a-monkey","version":"0.4.0","description":"Tap the monkeys before they duck, leave the jungle decoys alone. A Caputchin first-party game.","keywords":["caputchin","caputchin-game","captcha","whack-a-mole","monkey","tap","arcade","game"],"homepage":"https://github.com/Caputchin/caputchin-games#readme","repository":{"type":"git","url":"git+https://github.com/Caputchin/caputchin-games.git","directory":"packages/whack-a-monkey"},"license":"MIT","private":false,"type":"module","sideEffects":["./dist/whack-a-monkey.js"],"devDependencies":{"@caputchin/determinism":"^0.2.0","@caputchin/engine-kit":"^0.5.0","@caputchin/game-sdk":"^3.2.0","@caputchin/replay-contract":"^0.3.0","@types/node":"^20.0.0","happy-dom":"^15.0.0","tsup":"^8.0.0","typescript":"^5.4.0","vitest":"^2.0.0"},"scripts":{"build":"tsup","dev":"tsup --watch","typecheck":"tsc --noEmit","test":"vitest run","test:watch":"vitest","check":"caputchin-selfcheck dist/run.js"},"_id":"@caputchin/game-whack-a-monkey@0.4.0","bugs":{"url":"https://github.com/Caputchin/caputchin-games/issues"},"_integrity":"sha512-agaW2Oy6gV8+B/vY1lYCZHZtSP9PpMOW+2SVIECJyrScglTSWUwLFAkVVOFvZw1jLiEA176Re1a4LDXeIOVW3g==","_resolved":"/tmp/bccf42ecbbda622f15f8eab416765e24/caputchin-game-whack-a-monkey-0.4.0.tgz","_from":"file:caputchin-game-whack-a-monkey-0.4.0.tgz","_nodeVersion":"22.22.3","_npmVersion":"10.9.8","dist":{"integrity":"sha512-agaW2Oy6gV8+B/vY1lYCZHZtSP9PpMOW+2SVIECJyrScglTSWUwLFAkVVOFvZw1jLiEA176Re1a4LDXeIOVW3g==","shasum":"b572ee02e0533f9c74bcc44f7ba0b367f390deea","tarball":"https://registry.npmjs.org/@caputchin/game-whack-a-monkey/-/game-whack-a-monkey-0.4.0.tgz","fileCount":10,"unpackedSize":117986,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDiyic5NZ/P+1fXfutjFgC2N7KhAuFuYHbjxVU+SXRh3AiEA7TIDnk5QymElyISwzlAj5/0/i0nJGUWQm2hXJaTL7aw="}]},"_npmUser":{"name":"caputchiner","email":"info@caputchin.com"},"directories":{},"maintainers":[{"name":"caputchiner","email":"info@caputchin.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/game-whack-a-monkey_0.4.0_1780846221847_0.926698988825468"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-25T17:19:25.650Z","modified":"2026-06-07T15:30:22.135Z","0.2.0":"2026-05-25T17:19:26.000Z","0.3.0":"2026-06-01T15:06:57.976Z","0.3.1":"2026-06-02T09:27:20.784Z","0.3.2":"2026-06-04T03:27:06.195Z","0.4.0":"2026-06-07T15:30:21.990Z"},"bugs":{"url":"https://github.com/Caputchin/caputchin-games/issues"},"license":"MIT","homepage":"https://github.com/Caputchin/caputchin-games#readme","keywords":["caputchin","caputchin-game","captcha","whack-a-mole","monkey","tap","arcade","game"],"repository":{"type":"git","url":"git+https://github.com/Caputchin/caputchin-games.git","directory":"packages/whack-a-monkey"},"description":"Tap the monkeys before they duck, leave the jungle decoys alone. A Caputchin first-party game.","maintainers":[{"name":"caputchiner","email":"info@caputchin.com"}],"readme":"# Whack-a-Monkey\n\nTap the monkeys as they peek out of the bushes, leave the other jungle animals\nalone. A Caputchin first-party game, written clean-room in framework-free\nTypeScript and rendered on a 2D canvas so the play field is opaque to DOM\nscrapers.\n\n## How it plays\n\nAnimals pop up from a fixed 3x3 grid of holes set into a jungle canopy. Most are\nmonkeys (the targets); some are decoys (a frog, parrot, snake, or sloth) that you\nmust leave alone. Each pop-up springs up, stays visible for a short window, then\nducks back down. Tap a monkey while it is up to whack it; tap a decoy, and you are\ndocked points and lose 2 seconds off the clock.\n\nYou pass by whacking the configured **goal** number of monkeys before the timer\nruns out. Clear that goal and the round reports success and lights a **Verified**\nbadge; let the clock hit zero first and the round ends with a **Try again**\nscreen. Difficulty climbs across three internal levels as you progress: pop-ups\nget shorter, spawn faster, and decoys grow more common (up to a fair cap), so the\nlater monkeys are harder to catch than the first.\n\nScoring rewards clean, fast aim: each monkey is worth a base score plus a timing\nbonus for tapping it quickly after it emerges. A wrong tap on a decoy subtracts\npoints and time. The header can show the monkeys-whacked goal counter and the\ncurrent level (both toggleable). Sound effects (whack / miss / verify) are\nsynthesized at runtime with no audio files, and an in-game mute button (plus a\nhost config) turns them off.\n\n| Input | Mouse | Touch |\n|---|---|---|\n| Whack an animal | click it while it is up | tap it while it is up |\n| Start / retry | click the button | tap the button |\n\n## Determinism\n\nThe game runs a fixed logical world (800x450) advanced by a fixed logical\ntimestep, never per real frame: the live driver uses a fixed-step accumulator and\nthe server replays the exact same ticks, so the live score equals the replayed\nscore by construction. Which holes pop, when, and whether each is a monkey or a\ndecoy are all driven by the server seed, so every session differs and a memorized\nrun does not transfer to a fresh challenge. This is enforced by the sim tests; do\nnot reintroduce any per-frame coupling.\n\n## The look\n\nThe look is a **skin** the site picks (a light-theme jungle and a dark-theme\njungle), so it switches with the rest of the site's theming. Both render the same\ncanopy gradient, tinted foliage layers for depth, the animal grid, hit-burst\nparticles, and a decoy-flash overlay; only the palette differs.\n\n## Customization\n\nEverything is driven by [`caputchin.json`](caputchin.json) and resolved by the\nwidget into the game's runtime context:\n\n- **Skins**: every color is a site-settable preset, the background and canopy\n  gradient, the foliage tints, the hit-particle and decoy-flash colors, and the\n  button and focus-ring colors. Each animal sprite (monkey and the four decoys)\n  can also be overridden with custom art; leave it unset to use the bundled\n  sprite. Ships with `light` and `dark` presets.\n- **Configurations**: the pass goal, the level-1 pop-up uptime, the level-1 decoy\n  chance, the round time limit, sound on/off, and whether the goal/level counters\n  show. Ships with `default` (the default), `easy`, `medium`, and `hard` presets.\n- **Languages**: the header, screens, and screen-reader copy ship in 11 locales\n  (English, Spanish, French, German, Portuguese, Russian, Arabic, Indonesian,\n  Chinese, Japanese, Korean), with right-to-left support for Arabic. The widget\n  picks the language from the visitor's locale, and a hardcoded English fallback\n  covers any unresolved string.\n\n## Accessibility and support\n\nMouse- and touch-operable, fully responsive (the canvas reflows to any widget\nsize), with optional sound the site or player can disable and a reduced-motion\nmode. A polite live region announces the round state (start, whack, wrong tap,\nlevel up, verified, round over) to screen readers in the visitor's language. The\ncore challenge is still a real-time tap-and-reflex task, so it is **not**\nscreen-reader *solvable*; pair it with an accessible alternative challenge where\nthat matters.\n\n## Add it to your site\n\nWhack-a-Monkey embeds with a single element and runs sandboxed behind a Caputchin\nverification check, the same as every game in the pack. Preview it live and copy\nits embed snippet from the [Caputchin marketplace](https://caputchin.com/marketplace).\n\n## License\n\nMIT, see [LICENSE](LICENSE). The animal and foliage sprites are from Kenney\n(Creative Commons Zero, public domain); see\n[THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md).\n","readmeFilename":"README.md"}