{"_id":"@caputchin/game-voidshot","_rev":"3-0e065276c2cddb862bba9b76897be05b","name":"@caputchin/game-voidshot","dist-tags":{"latest":"0.4.0"},"versions":{"0.2.0":{"name":"@caputchin/game-voidshot","version":"0.2.0","keywords":["caputchin","caputchin-game","captcha","rapier","ogl","shooter","game"],"license":"MIT AND Apache-2.0 AND Unlicense","_id":"@caputchin/game-voidshot@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":"e858249b0446df1a43798de8e69fb889a5f93c0e","tarball":"https://registry.npmjs.org/@caputchin/game-voidshot/-/game-voidshot-0.2.0.tgz","fileCount":11,"integrity":"sha512-XVHLOUTD4UfAWloByT4ORzkYD2t3SEbyVu8AD2rEtXmpZyQHN35f1n6y415YWtQr7EDYI0J48pCAWItz90RlQw==","signatures":[{"sig":"MEUCIEWobEe4aMx9h9ZNU8A2vte38VcsGz8x49x8pXMH873SAiEAxD2VhJNKMfJZoJIAJMXyQJfWbKTozPnBh8INK2h3m6s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1154080},"type":"module","_from":"file:caputchin-game-voidshot-0.2.0.tgz","private":false,"scripts":{"dev":"tsup --watch","test":"cargo test && vitest run","build":"tsup","predev":"[ -f src/generated/live-wasm.ts ] || pnpm build:wasm","pretest":"[ -f src/generated/live-wasm.ts ] || pnpm build:wasm","prebuild":"[ -f src/generated/live-wasm.ts ] || pnpm build:wasm","typecheck":"tsc --noEmit","build:wasm":"bash scripts/build-wasm.sh","test:watch":"vitest"},"_npmUser":{"name":"caputchiner","email":"info@caputchin.com"},"_resolved":"/tmp/96315fa692b85c44713d8c117014e997/caputchin-game-voidshot-0.2.0.tgz","_integrity":"sha512-XVHLOUTD4UfAWloByT4ORzkYD2t3SEbyVu8AD2rEtXmpZyQHN35f1n6y415YWtQr7EDYI0J48pCAWItz90RlQw==","repository":{"url":"git+https://github.com/Caputchin/caputchin-games.git","type":"git","directory":"packages/voidshot"},"_npmVersion":"10.9.8","description":"Pilot your drone through a neon swarm and clear every wave to prove you're human. A rapier3d + OGL captcha. A Caputchin first-party game.","directories":{},"sideEffects":["./dist/voidshot.js"],"_nodeVersion":"22.22.3","_hasShrinkwrap":false,"devDependencies":{"ogl":"^1.0.0","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/replay-wasm":"^0.3.0","@caputchin/replay-contract":"^0.3.0"},"_npmOperationalInternal":{"tmp":"tmp/game-voidshot_0.2.0_1780595900554_0.7983298587281973","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@caputchin/game-voidshot","version":"0.3.0","keywords":["caputchin","caputchin-game","captcha","rapier","ogl","shooter","game"],"license":"MIT AND Apache-2.0 AND Unlicense","_id":"@caputchin/game-voidshot@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":"42558a559a24dac089a0d862d2c83dc2dc8c57ba","tarball":"https://registry.npmjs.org/@caputchin/game-voidshot/-/game-voidshot-0.3.0.tgz","fileCount":11,"integrity":"sha512-nnHGdN/Q8UizM2kG3ssqNcsZIotpbZo/erzIaVQsZiGTNdUGU2lULeRW/M5EedRAEq496Uvmu2CBghMe741YWw==","signatures":[{"sig":"MEUCIFPnKEpao9yPvaAhhIulFEy7/BXFIfIvWciYHkqDYfVGAiEAvAElSWTEFDx6YQUTgAlONhr3VfXGFgYUoMcSVMsVFuw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1154186},"type":"module","_from":"file:caputchin-game-voidshot-0.3.0.tgz","private":false,"scripts":{"dev":"tsup --watch","test":"cargo test && vitest run","build":"tsup","check":"node scripts/check.mjs","predev":"[ -f src/generated/live-wasm.ts ] || pnpm build:wasm","pretest":"[ -f src/generated/live-wasm.ts ] || pnpm build:wasm","prebuild":"[ -f src/generated/live-wasm.ts ] || pnpm build:wasm","typecheck":"tsc --noEmit","build:wasm":"bash scripts/build-wasm.sh","test:watch":"vitest"},"_npmUser":{"name":"caputchiner","email":"info@caputchin.com"},"_resolved":"/tmp/22b2b3b603ddba2810d80ece3898a702/caputchin-game-voidshot-0.3.0.tgz","_integrity":"sha512-nnHGdN/Q8UizM2kG3ssqNcsZIotpbZo/erzIaVQsZiGTNdUGU2lULeRW/M5EedRAEq496Uvmu2CBghMe741YWw==","repository":{"url":"git+https://github.com/Caputchin/caputchin-games.git","type":"git","directory":"packages/voidshot"},"_npmVersion":"10.9.8","description":"Pilot your drone through a neon swarm and clear every wave to prove you're human. A rapier3d + OGL captcha. A Caputchin first-party game.","directories":{},"sideEffects":["./dist/voidshot.js"],"_nodeVersion":"22.22.3","_hasShrinkwrap":false,"devDependencies":{"ogl":"^1.0.0","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/replay-wasm":"^0.3.0","@caputchin/replay-contract":"^0.3.0","@caputchin/replay-selfcheck":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/game-voidshot_0.3.0_1780846267740_0.10797747085001008","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@caputchin/game-voidshot","version":"0.4.0","description":"Pilot your drone through a neon swarm and clear every wave to prove you're human. A rapier3d + OGL captcha. A Caputchin first-party game.","keywords":["caputchin","caputchin-game","captcha","rapier","ogl","shooter","game"],"homepage":"https://github.com/Caputchin/caputchin-games#readme","repository":{"type":"git","url":"git+https://github.com/Caputchin/caputchin-games.git","directory":"packages/voidshot"},"license":"MIT AND Apache-2.0 AND Unlicense","private":false,"type":"module","sideEffects":["./dist/voidshot.js"],"devDependencies":{"@caputchin/game-sdk":"^3.2.0","@caputchin/replay-contract":"^0.3.0","@caputchin/replay-selfcheck":"^0.2.0","@caputchin/replay-wasm":"^0.3.0","@types/node":"^20.0.0","happy-dom":"^15.0.0","ogl":"^1.0.0","tsup":"^8.0.0","typescript":"^5.4.0","vitest":"^2.0.0"},"scripts":{"build:wasm":"bash scripts/build-wasm.sh","pretest":"bash scripts/ensure-wasm.sh","test":"cargo test && vitest run","test:watch":"vitest","prebuild":"bash scripts/ensure-wasm.sh","build":"tsup","predev":"bash scripts/ensure-wasm.sh","dev":"tsup --watch","typecheck":"tsc --noEmit","check":"node scripts/check.mjs"},"_id":"@caputchin/game-voidshot@0.4.0","bugs":{"url":"https://github.com/Caputchin/caputchin-games/issues"},"_integrity":"sha512-YIMhAqhfQcexg17fIvmxcRTygpoWOf8kWLRwrAmSbw7ffdy0WY7e/iUgXUThVTk5elC54+eOQ7KGqfAyh5IsKA==","_resolved":"/tmp/8543af1cf8fe9f47b1ced7381399c8d4/caputchin-game-voidshot-0.4.0.tgz","_from":"file:caputchin-game-voidshot-0.4.0.tgz","_nodeVersion":"22.22.3","_npmVersion":"10.9.8","dist":{"integrity":"sha512-YIMhAqhfQcexg17fIvmxcRTygpoWOf8kWLRwrAmSbw7ffdy0WY7e/iUgXUThVTk5elC54+eOQ7KGqfAyh5IsKA==","shasum":"874b627d1c08a9f75eaa64282c31a4b1f85431cf","tarball":"https://registry.npmjs.org/@caputchin/game-voidshot/-/game-voidshot-0.4.0.tgz","fileCount":11,"unpackedSize":1157714,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCx1RuQ9TA3qeHaYVjsFgq+8MWz1h+5obyJHGky4bCVJgIgSEVNaiHs+ilbcw//pZN3Hi2/Lob7PPWGrnGvMGkR/Ds="}]},"_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-voidshot_0.4.0_1781025996020_0.6912739862289516"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-04T17:58:20.360Z","modified":"2026-06-09T17:26:36.367Z","0.2.0":"2026-06-04T17:58:20.721Z","0.3.0":"2026-06-07T15:31:07.949Z","0.4.0":"2026-06-09T17:26:36.256Z"},"bugs":{"url":"https://github.com/Caputchin/caputchin-games/issues"},"license":"MIT AND Apache-2.0 AND Unlicense","homepage":"https://github.com/Caputchin/caputchin-games#readme","keywords":["caputchin","caputchin-game","captcha","rapier","ogl","shooter","game"],"repository":{"type":"git","url":"git+https://github.com/Caputchin/caputchin-games.git","directory":"packages/voidshot"},"description":"Pilot your drone through a neon swarm and clear every wave to prove you're human. A rapier3d + OGL captcha. A Caputchin first-party game.","maintainers":[{"name":"caputchiner","email":"info@caputchin.com"}],"readme":"# Voidshot\n\nPilot your drone through a neon swarm and clear every wave before your shield\nburns out. A Caputchin first-party captcha game, built on the\n[rapier3d](https://rapier.rs) physics engine (the deterministic simulation) and\n[OGL](https://github.com/oframe/ogl) (a featherweight WebGL renderer).\n\nVoidshot is a cursor-piloted arena survival shooter: move the drone toward the\ncursor and the guns aim and fire automatically, so it is fully playable with the\nmouse alone, by touch (drag), or by keyboard. Clear the seeded waves to pass.\n\n## How it proves you are human\n\nCaputchin verifies a round by **re-running the simulation on the server**. Your\nbrowser records an opaque input trace while you play; the server re-executes the\nexact same simulation over that trace, under a seed it derives itself, and trusts\nonly the replayed result. A trace that did not really clear the waves replays to\na failure, and a trace recorded under one seed does not pass under another. The\nscore is never reported by the client.\n\n## Architecture (one wasm, both ends)\n\nThe whole game is a Lane-2 integration: a deterministic Rust simulation that *is*\nthe server `run`, plus a separate browser renderer that never reaches the server.\n\n- **The simulation** (`src/*.rs`) is rapier3d plus the game logic, compiled to a\n  single clean `wasm32-unknown-unknown` module with no `wasm-bindgen` and no\n  imports. It exports two C ABIs over the same code:\n  - `cap_alloc` / `cap_run`: the one-shot replay the server isolate calls\n    (emitted by [`caputchin-replay-rs`](https://crates.io/crates/caputchin-replay-rs)).\n  - `live_new` / `live_step` / `live_state` / `live_trace` / `live_free`: the\n    browser stepping interface the live driver calls.\n- **The live driver** (`src/driver.ts`) steps that same wasm at a fixed timestep,\n  reads entity positions out of linear memory, hands them to OGL to draw, and\n  records the input trace. On a win it submits the trace for verification.\n- **The renderer** (`src/render.ts`) is OGL. It only draws the simulation's state,\n  so its look and its visual effects cannot influence the verdict.\n\nBecause the identical wasm module runs live and on replay, every floating-point\nresult agrees by construction. rapier3d runs in its enhanced-determinism mode for\ncross-platform bit-exactness.\n\n## Determinism rules (non-negotiable)\n\nThe browser and the server must agree bit-for-bit, so the simulation:\n\n- draws all randomness from the four-word seed only (`src/rng.rs`), never a clock\n  or `Math::random`;\n- advances on a fixed tick, never wall-clock time;\n- touches no DOM, no network, and no host state.\n\nThe `tests/determinism.rs` and `tests/replay.test.ts` suites pin the core\ninvariant: a trace recorded by the live stepping interface replays through the\nserver path to the identical verdict.\n\n## Build\n\n```sh\npnpm build        # builds the wasm, then the live + replay bundles into dist/\npnpm test         # cargo test (determinism) + vitest (replay + locale parity)\n```\n\n`scripts/build-wasm.sh` produces one wasm: `dist/voidshot.wasm` (the replay\nmodule) and an inlined copy for the live bundle (the iframe CSP forbids fetching\na `.wasm`). Requires the `wasm32-unknown-unknown` Rust target; `wasm-opt`\n(binaryen) shrinks the artifact when present.\n\n## Customization\n\nSkins, configurations, and locales live in `.caputchin/` as split shell files:\n\n- **configurations** change the simulation (wave count, enemy count and speed,\n  shield, time limit) and are pinned into the verified round.\n- **skins** are render-only palettes and never touch the simulation.\n- **locales** ship all official languages; English is canonical.\n\n## Accessibility\n\nVoidshot is fully playable by touch, by mouse, and by keyboard. Auto-aim removes\nany need for precise aiming, and a polite live region announces wave starts,\nshield loss, and the result, so the game is operable with a screen reader. Audio\nis synthesized, optional, and never the only channel; the game is fully playable\nmuted.\n\n## License\n\nThe game's own code is MIT (see [`LICENSE`](LICENSE)). The shipped artifact also\nbundles Apache-2.0 (rapier3d, parry3d, nalgebra, simba, caputchin-replay-rs) and\nUnlicense (OGL) code, so the package license is declared as the combined SPDX\nexpression `MIT AND Apache-2.0 AND Unlicense`. See\n[`THIRD-PARTY-NOTICES.md`](THIRD-PARTY-NOTICES.md).\n","readmeFilename":"README.md"}