{"_id":"@caputchin/game-fruit-slash","_rev":"6-16f3bd17217ace32a99089d5c56f57f0","name":"@caputchin/game-fruit-slash","dist-tags":{"latest":"0.5.0"},"versions":{"0.2.0":{"name":"@caputchin/game-fruit-slash","version":"0.2.0","keywords":["caputchin","caputchin-game","captcha","slice","fruit","arcade","game"],"license":"MIT","_id":"@caputchin/game-fruit-slash@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":"18167bccd2ada3da478efd930506bf16ad48108f","tarball":"https://registry.npmjs.org/@caputchin/game-fruit-slash/-/game-fruit-slash-0.2.0.tgz","fileCount":6,"integrity":"sha512-RIvhu+DXUvOOqnORS1Ye4qOHpaqCH4BSdgSy/9xi3zZNyIb1klmSSDcDm7IOLIDaTQWtbDvDa8kqs3Kc0BevpQ==","signatures":[{"sig":"MEUCIQCnivWYeazSnZKbrIwpZx2d0Nv+X6GRyk5Lz0M2Qll36wIgMmZXZ+pxTkWAoZ/bVXV4u4Nv63+/BbVHP0IBimE32Rc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":75577},"type":"module","_from":"file:caputchin-game-fruit-slash-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/59ca20acb08b0f1eafa51489faa11166/caputchin-game-fruit-slash-0.2.0.tgz","_integrity":"sha512-RIvhu+DXUvOOqnORS1Ye4qOHpaqCH4BSdgSy/9xi3zZNyIb1klmSSDcDm7IOLIDaTQWtbDvDa8kqs3Kc0BevpQ==","repository":{"url":"git+https://github.com/Caputchin/caputchin-games.git","type":"git","directory":"packages/fruit-slash"},"_npmVersion":"10.9.8","description":"Slice the flying fruit, dodge the bombs. A Caputchin first-party game.","directories":{},"sideEffects":["./dist/fruit-slash.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-fruit-slash_0.2.0_1779708847087_0.05910302585025362","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@caputchin/game-fruit-slash","version":"0.3.0","keywords":["caputchin","caputchin-game","captcha","slice","fruit","arcade","game"],"license":"MIT","_id":"@caputchin/game-fruit-slash@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":"a3bb809b39435a8287adf1ad631c17326d69a994","tarball":"https://registry.npmjs.org/@caputchin/game-fruit-slash/-/game-fruit-slash-0.3.0.tgz","fileCount":7,"integrity":"sha512-VXvxIb/P4LB1TK+PZsWh7I2Tmmfs/uGXPglQscWM8zOwDhE+h67RrxssfWQpHCIdMLW2YJLmnh1Hy1KZoLJJmw==","signatures":[{"sig":"MEQCIG03KZjx1fHf2EObb6Jy3p+JN9kv0TA8/f+W6Dsw3NAJAiAZWp+QcqJfL2Rki/O3EZx+QCEcCrjl3Fr4H4sfEExwfg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":45116},"type":"module","_from":"file:caputchin-game-fruit-slash-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/06e9e5b2a298e1326b721c137be38006/caputchin-game-fruit-slash-0.3.0.tgz","_integrity":"sha512-VXvxIb/P4LB1TK+PZsWh7I2Tmmfs/uGXPglQscWM8zOwDhE+h67RrxssfWQpHCIdMLW2YJLmnh1Hy1KZoLJJmw==","repository":{"url":"git+https://github.com/Caputchin/caputchin-games.git","type":"git","directory":"packages/fruit-slash"},"_npmVersion":"10.9.8","description":"Slice the flying fruit, dodge the bombs. A Caputchin first-party game.","directories":{},"sideEffects":["./dist/fruit-slash.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-fruit-slash_0.3.0_1780326416285_0.39124243901043343","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@caputchin/game-fruit-slash","version":"0.3.1","keywords":["caputchin","caputchin-game","captcha","slice","fruit","arcade","game"],"license":"MIT","_id":"@caputchin/game-fruit-slash@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":"da1743724b91fa1512937203c1ae50bddbcbcefe","tarball":"https://registry.npmjs.org/@caputchin/game-fruit-slash/-/game-fruit-slash-0.3.1.tgz","fileCount":10,"integrity":"sha512-fx14BE2efekySbLyXyyMMPDZ/vc42MKgBaXRayZJDfJJCSEUbPOmbhWoVbvPRDwL49tNovF0P992BMvjrDk1Rg==","signatures":[{"sig":"MEYCIQCB1wuqrtyIq6YfV/ajke0Nf8z8JNearvpGGg0+ulEn7AIhAMyzmXCDMBxqpMH8Vt6QvjuY7zEpPMORJhSjHZM2sY6v","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67952},"type":"module","_from":"file:caputchin-game-fruit-slash-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/e45863563de3359d352baf2aff5f1f5c/caputchin-game-fruit-slash-0.3.1.tgz","_integrity":"sha512-fx14BE2efekySbLyXyyMMPDZ/vc42MKgBaXRayZJDfJJCSEUbPOmbhWoVbvPRDwL49tNovF0P992BMvjrDk1Rg==","repository":{"url":"git+https://github.com/Caputchin/caputchin-games.git","type":"git","directory":"packages/fruit-slash"},"_npmVersion":"10.9.8","description":"Slice the flying fruit, dodge the bombs. A Caputchin first-party game.","directories":{},"sideEffects":["./dist/fruit-slash.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-fruit-slash_0.3.1_1780392434331_0.5897313653102616","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@caputchin/game-fruit-slash","version":"0.3.2","keywords":["caputchin","caputchin-game","captcha","slice","fruit","arcade","game"],"license":"MIT","_id":"@caputchin/game-fruit-slash@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":"a3401ef19b0f59b48976b811193f765de987b1ad","tarball":"https://registry.npmjs.org/@caputchin/game-fruit-slash/-/game-fruit-slash-0.3.2.tgz","fileCount":10,"integrity":"sha512-eRPuSWjgGO9F/Rd9vJXz5lmMhxc77bujZjUmbKuTi1VLWMUqC9e4dE6WHYA/402ufFHbCSlbaNH8VwzRH45iag==","signatures":[{"sig":"MEUCIQDG1mUpTLA4iLekVNc8mR4C6Vv+AAViX2UUV4r6+W58igIgTNMFc853qLCfEDPMG+3JI6tq7jn8D3WJ1uBJlGgO9Ek=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70676},"type":"module","_from":"file:caputchin-game-fruit-slash-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/d41304a7a4e61f2d67e62f8014e54a9f/caputchin-game-fruit-slash-0.3.2.tgz","_integrity":"sha512-eRPuSWjgGO9F/Rd9vJXz5lmMhxc77bujZjUmbKuTi1VLWMUqC9e4dE6WHYA/402ufFHbCSlbaNH8VwzRH45iag==","repository":{"url":"git+https://github.com/Caputchin/caputchin-games.git","type":"git","directory":"packages/fruit-slash"},"_npmVersion":"10.9.8","description":"Slice the flying fruit, dodge the bombs. A Caputchin first-party game.","directories":{},"sideEffects":["./dist/fruit-slash.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-fruit-slash_0.3.2_1780543629395_0.5486668382265305","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@caputchin/game-fruit-slash","version":"0.4.0","keywords":["caputchin","caputchin-game","captcha","slice","fruit","arcade","game"],"license":"MIT","_id":"@caputchin/game-fruit-slash@0.4.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":"f19ec5a0c58cbd1adb1362a95bd86d4673bace15","tarball":"https://registry.npmjs.org/@caputchin/game-fruit-slash/-/game-fruit-slash-0.4.0.tgz","fileCount":10,"integrity":"sha512-ZgZ9XgY4dPIBBdkfDBqb98l18HXQzsBbN9ty+6+dXBc0pyq3GBCssczsUXIbm58GJRbQncvLkI01xqwkEUTpjw==","signatures":[{"sig":"MEUCIQCawTKm1i+wy3tXaGwLAFHl5XhO0jINFq8nzbLJ5J3BwwIgRL+/A+VmXgR/x1CJEWLt6sJFuSk6LbIwS0u9BNkay/4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":71445},"type":"module","_from":"file:caputchin-game-fruit-slash-0.4.0.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/2b4633ea49f5a0fd9fdd69eee04a2677/caputchin-game-fruit-slash-0.4.0.tgz","_integrity":"sha512-ZgZ9XgY4dPIBBdkfDBqb98l18HXQzsBbN9ty+6+dXBc0pyq3GBCssczsUXIbm58GJRbQncvLkI01xqwkEUTpjw==","repository":{"url":"git+https://github.com/Caputchin/caputchin-games.git","type":"git","directory":"packages/fruit-slash"},"_npmVersion":"10.9.8","description":"Slice the flying fruit, dodge the bombs. A Caputchin first-party game.","directories":{},"sideEffects":["./dist/fruit-slash.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.2.0","@caputchin/engine-kit":"^0.5.0","@caputchin/determinism":"^0.2.0","@caputchin/replay-contract":"^0.3.0"},"_npmOperationalInternal":{"tmp":"tmp/game-fruit-slash_0.4.0_1780846221019_0.04319188236685578","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@caputchin/game-fruit-slash","version":"0.5.0","description":"Slice the flying fruit, dodge the bombs. A Caputchin first-party game.","keywords":["caputchin","caputchin-game","captcha","slice","fruit","arcade","game"],"homepage":"https://github.com/Caputchin/caputchin-games#readme","repository":{"type":"git","url":"git+https://github.com/Caputchin/caputchin-games.git","directory":"packages/fruit-slash"},"license":"MIT","private":false,"type":"module","sideEffects":["./dist/fruit-slash.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-fruit-slash@0.5.0","bugs":{"url":"https://github.com/Caputchin/caputchin-games/issues"},"_integrity":"sha512-r/yGLjg+61pRL0W2h1+v/4FRTI0NKsPoHh/W0Rbays9wHqY3rh8IlKvf5HFdx9RfuId78LD0fbS6n0zY88iCjA==","_resolved":"/tmp/a90ad48897b86004c0a135ea1313caad/caputchin-game-fruit-slash-0.5.0.tgz","_from":"file:caputchin-game-fruit-slash-0.5.0.tgz","_nodeVersion":"22.22.3","_npmVersion":"10.9.8","dist":{"integrity":"sha512-r/yGLjg+61pRL0W2h1+v/4FRTI0NKsPoHh/W0Rbays9wHqY3rh8IlKvf5HFdx9RfuId78LD0fbS6n0zY88iCjA==","shasum":"55806d064e1f95e2e88ec7ef3d5d1eafc671717e","tarball":"https://registry.npmjs.org/@caputchin/game-fruit-slash/-/game-fruit-slash-0.5.0.tgz","fileCount":10,"unpackedSize":71863,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBhMSwE0IIsJ/g8rRYSZGj0o/kzs9KfVKK8XqP8zCpICAiBl/Md4hwBb6lHU5Sa7xjoylHFQwU6R0FW9WG+c2NkEqg=="}]},"_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-fruit-slash_0.5.0_1781025954863_0.2594162839636662"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-25T11:34:06.954Z","modified":"2026-06-09T17:25:55.142Z","0.2.0":"2026-05-25T11:34:07.257Z","0.3.0":"2026-06-01T15:06:56.442Z","0.3.1":"2026-06-02T09:27:14.494Z","0.3.2":"2026-06-04T03:27:09.525Z","0.4.0":"2026-06-07T15:30:21.175Z","0.5.0":"2026-06-09T17:25:54.986Z"},"bugs":{"url":"https://github.com/Caputchin/caputchin-games/issues"},"license":"MIT","homepage":"https://github.com/Caputchin/caputchin-games#readme","keywords":["caputchin","caputchin-game","captcha","slice","fruit","arcade","game"],"repository":{"type":"git","url":"git+https://github.com/Caputchin/caputchin-games.git","directory":"packages/fruit-slash"},"description":"Slice the flying fruit, dodge the bombs. A Caputchin first-party game.","maintainers":[{"name":"caputchiner","email":"info@caputchin.com"}],"readme":"# Fruit Slash\n\nSwipe to slice the flying fruit, avoid the bombs. A Caputchin first-party game,\nwritten clean-room in framework-free TypeScript and rendered on a 2D canvas so\nthe play field is opaque to DOM scrapers.\n\n## How it plays\n\nFruit and the occasional bomb are launched from the bottom of the field on real\nprojectile arcs (constant horizontal velocity, gravity-only vertical). They\nenter and leave only through the bottom border, never crossing a side or the\ntop. Swipe across a fruit to slice it; let a fruit fall past the floor unsliced,\nor slice a bomb, and you lose a life.\n\nSlicing the configured **pass score** of fruit reports success (`bridge.pass`)\nand lights a **Verified** badge, but the round does **not** stop there: you keep\nslicing to raise your score, and the final (highest) score is re-reported when\nthe round ends. The round ends only when lives run out. Difficulty **ramps up\nover time** (faster spawns, more bombs), so the score chase gets harder.\n\nSound effects (slice / miss / verify) are synthesized at runtime (no audio\nfiles); an in-game mute toggle turns them on/off, and the host can default them\noff via config. Colors, the fruit palette, and optional fruit/bomb art are\nskinnable; difficulty (pass score, lives, spawn rate, gravity, bomb chance) is\nconfigurable; all copy is localized. Light and dark are separate skins the host\npicks.\n\n## Frame-rate independence\n\nThe game runs its own `requestAnimationFrame` loop driven by real elapsed time:\nevery physics step is scaled by the delta in seconds (clamped after a stall),\nand the field is rendered every frame at the native refresh rate. The arc plays\nat the same real-world speed on a 60Hz or a 240Hz display. This is enforced by\n`tests/frame-rate.test.ts`; do not reintroduce any per-frame (\"MS_PER_FRAME\")\ncoupling.\n\n## Storage\n\nThe game runs in a sandboxed, opaque-origin iframe, so `localStorage` is\nunavailable. No score is persisted; session state is in memory only.\n","readmeFilename":"README.md"}