BeamNG.Earth
BeamNG.drive용 1:1 비율 실시간 지구, 실제 고도·위성 이미지·부동 원점·보조 서버에서 LOD 스트리밍
Nexus Cascade는 하이브리드 팽코와 핀볼 아케이드 캐비닛으로, 전체 화면 가로 모드에서 오프라인으로 플레이할 수 있습니다
Nexus Cascade — hybrid pachinko and pinball arcade cabinet. Install for fullscreen landscape play, offline after first visit.
게임TypeScript · C++GitHub @ford442온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Modern 3D pachinko/pinball game built with Babylon.js + Rapier physics. Features advanced ball physics, spinners, traps, and gold ball swarms.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
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 flagREADME 전문 보기 ↗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.