BeamNG.Earth
A 1:1 scale streamed Earth for BeamNG.drive: real elevation and satellite imagery, floating origin, LOD streaming from a companion server
Nexus Cascade — hybrid pachinko and pinball arcade cabinet. Install for fullscreen landscape play, offline after first visit.
GamesTypeScript · C++GitHub @ford442OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Modern 3D pachinko/pinball game built with Babylon.js + Rapier physics. Features advanced ball physics, spinners, traps, and gold ball swarms.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A Babylon.js scene backed by physics, showcasing a pachinko/pinball hybrid with WebGPU-first rendering.
Stack
• Vite (vanilla TypeScript template)
• Babylon.js (core)
• Physics: in-house C++ engine (native/ + src/wasm/) compiled to WASM and stepped as the wasm-owner default for both the table and adventure tracks; Rapier 3D WASM (@dimforge/rapier3d-compat) is loaded lazily only for the explicit rapier / wasm-mirror modes and the missing-bundle degrade path — selectable via the pachinball:physics-engine localStorage flagRead the full README ↗A Babylon.js scene backed by physics, showcasing a pachinko/pinball hybrid with WebGPU-first rendering.
native/ + src/wasm/) compiled to WASM for both the table and adventure tracks — by default in a Dedicated Worker (wasm-worker) when the page is cross-origin isolated, else in-process (wasm-owner); Rapier 3D WASM (@dimforge/rapier3d-compat) is loaded lazily only for the explicit rapier / wasm-mirror modes and the missing-bundle degrade path — selectable via the pachinball:physics-engine localStorage flagnpm install
npm run dev
Open http://localhost:5173/. Use 1 / 0 for the flippers, hold Space or Enter to charge and release the plunger, and press R to reset the ball.
On viewports ≤768px wide, on-screen controls appear at the bottom of the playfield:
| Control | Element | Action |
|---|---|---|
| Left flipper | #touch-left | Hold to raise left flipper |
| Right flipper | #touch-right | Hold to raise right flipper |
| Plunger | #touch-plunger | Hold to charge, release to launch — also starts the game from the menu (unlocks audio) |
| Nudge | #touch-nudge | Tap to nudge the table |
Safe-area insets and touch-action: manipulation are applied for lower touch latency. Landscape short-height layouts reflow the center controls into a row.
deviceMemory ≤ 4 or Save-Data).navigator.vibrate when available (silent no-op on iOS Safari). Fullscreen is requested on Start when the Fullscreen API exists (often unavailable on iOS).Playwright: npx playwright test --project=mobile-chrome (Pixel 7 viewport smoke).
Every pull request and push to main is gated by GitHub Actions (.github/workflows/ci.yml; native C++ changes are additionally gated by .github/workflows/native-physics.yml, which runs the Catch2 suite, npm run check:compile-db and npm run check:wasm-docs):
tsc -b, npm run lint, npx vitest run, and npx vite build. Keep PRs green. A
blocking Playwright smoke job (desktop + mobile, plus a no-WASM physics-degrade check) also
runs against a live dev server — a red e2e blocks merges. CI builds the bundle
with vite build (not npm run build) so the Emscripten/WASM step is skipped on the runner —
the physics-engine flag falls back to Rapier when the C++ bundle is absent. Enabling branch
protection on main (require the CI check job) is recommended.
npm run compile-db configures native/build-native with an explicit
-DCMAKE_BUILD_TYPE=Debug and writes compile_commands.json there — configure only, no
Catch2 build (npm run test:native runs it first). npm run check:compile-db verifies
every TU is present with a single -O level. The root .clangd
points clangd at that directory and nowhere else — do not copy the Emscripten database
from native/build/ to the repo root or to native/; clangd cannot parse em++ command
lines and a stale emcc dump silently omits newer sources.
The recommended progression path is the alternating A/B campaign system (EXTENDED_MAP <-> STATIONARY_TABLE) driven by AdventureTrackProgression + AdventureProgressionSupervisor. See docs/ADVENTURE_CAMPAIGN.md.
To play it, pick Campaign in the start screen's Mode select, or open the Stage Map (start screen, the in-play Campaign button, or L) and click a reached stage. H enters the current stage during a game.
The game runs WebGPU-first with an automatic WebGL fallback, but you can force WebGL2 — handy for visual debugging, Playwright, and CI where WebGPU output isn't easily inspectable.
Ways to select a renderer (checked in this order):
http://localhost:5173/?renderer=webgl2 (or ?renderer=webgpu)window.DEBUG_RENDERER = 'webgl2' set before the page loadslocalStorage, reloads the page)auto (WebGPU first, WebGL fallback)The Developer settings panel (visible in dev builds or with a debug query param) also has two debug overlays, available in either renderer:
scene.forceWireframewasm-owner / wasm-worker, the default), and Rapier's collider/joint wireframes via world.debugRender() only in the Rapier modesSee AGENTS.md for implementation details and WebGL2 ↔ WebGPU porting notes.
Production deploy is a two-step local workflow:
npm run build
cp .env.deploy.example .env.deploy # first time only
# Edit .env.deploy and set DEPLOY_TOKEN (from VPS env)
python3 deploy.py
Dry-run without uploading:
python3 deploy.py --list-only
deploy.py contains no secrets. Required config is read from .env.deploy (gitignored) or
shell environment variables. See .env.deploy.example for all supported keys.