BeamNG.Earth
BeamNG.drive용 1:1 비율 실시간 지구, 실제 고도·위성 이미지·부동 원점·보조 서버에서 LOD 스트리밍
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Four-hand euchre for two players: you play both hands of your partnership. Pixel-art cabin, solo vs a bot or online with a friend. React + TypeScript on Cloudflare Durable Objects.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
The euchre you know and love, for when you only have one other friend.
▶ Play it: doublehand.willpaz16.workers.dev, solo against a bot or online with a friend.
A pixel-art cabin, a crackling fire, and a variant of euchre we invented so two people can play
the four-handed game. Each of you plays both hands of a partnership: one you picked without
looking, and one you only see when it's that hand's turn.
Standard 24-card euchre, first to 10, with two twists that change everything:README 전문 보기 ↗The euchre you know and love, for when you only have one other friend.
▶ Play it: doublehand.willpaz16.workers.dev, solo against a bot or online with a friend.
A pixel-art cabin, a crackling fire, and a variant of euchre we invented so two people can play the four-handed game. Each of you plays both hands of a partnership: one you picked without looking, and one you only see when it's that hand's turn.
Standard 24-card euchre, first to 10, with two twists that change everything:
The established two-handed variants deal one playable hand per player, so this isn't one of them. The full spec is in RULES.md.
flowchart LR
subgraph Browser
UI["React UI<br/>(src/)"]
Engine1["Rules engine<br/>(shared/engine)"]
UI -- solo --> Engine1
end
subgraph Cloudflare["Cloudflare edge"]
Worker["Worker<br/>assets + routing"]
DO["Durable Object<br/>one per room code"]
Engine2["Rules engine<br/>(shared/engine)"]
Worker -- "/ws?code=XXXX" --> DO
DO --> Engine2
end
UI -- "WebSocket (online)" --> Worker
One rules engine, two homes. shared/engine is a pure TypeScript reducer with no DOM and no
network, seeded so every deal is reproducible. Solo play runs it in the browser; online play runs
the same code on the server, so the two modes can't disagree about the rules.
The server is authoritative. Clients send intentions. The room checks each one against the engine's legal moves for that connection's seat, and sends every player a view redacted for their eyes only. A modified client can't see hidden cards or play out of turn, because the move simply isn't in its legal list.
One Durable Object per room. The room code is the object's identity, so Cloudflare guarantees exactly one instance of each game worldwide: no single server to outgrow and no split-brain. Sockets use the Hibernation API, so an idle game costs nothing, and the whole thing runs on Cloudflare's free tier.
Art and audio are generated by code. Every card, character, and piece of the cabin is drawn
by a deterministic Python generator (art/generate_art.py), and every
sound is synthesized from waveform math (art/generate_audio.py). There
are no hand-painted or model-generated asset files, and regenerating is pixel-identical.
Every pull request and every push to dev or main runs these in CI. Nothing deploys unless all
of them pass.
| Check | What it guards |
|---|---|
| 200+ unit & component tests (Vitest) | rules, scoring, room logic, multiplayer protocol, UI behavior, crash and storage fallbacks |
| 10,000-deal fuzz | random legal play under random rule settings never reaches an illegal state |
| Layout audit (Playwright) | 11 screen sizes: whole-pixel art scaling, UI/scenery collisions, edge anchoring, hand-fan spacing |
| Art checks | two generator runs are pixel-identical, card art is unchanged, sprites have no holes |
| Production build | the app and the Worker both type-check and build |
| Multiplayer smoke test | two real WebSocket clients against the Worker under wrangler dev: seating, hidden cards, turn enforcement, reconnect, a full hand |
| Post-deploy smoke test | the same test against the live URL right after each deploy |
| Client | React 19, TypeScript, Vite, vite-plugin-pwa |
| Server | Cloudflare Workers, Durable Objects (SQLite storage), Hibernatable WebSockets |
| Testing | Vitest, Testing Library, Playwright |
| Assets | Python + Pillow (sprites), stdlib wave (audio) |
| CI/CD | GitHub Actions → Wrangler; dev and main deploy to separate staging and production Workers |
Requires Node 22+.
npm install
npm run dev # the game with hot reload, http://localhost:5173
npm run worker # multiplayer server on :8787 (run `npm run build` once first)
Solo play needs only npm run dev. Other useful scripts:
npm test # unit and component tests
npm run fuzz # 10,000 random deals
npm run audit # layout audit across 11 screen sizes
npm run typecheck && npm run typecheck:worker
To regenerate art or audio (Python 3.11+):
pip install -r art/requirements.txt
python3 art/generate_art.py && npm run art:check
python3 art/generate_audio.py
When editing the characters, python3 art/check_avatar_posture.py compares the sprites against
the last commit.
src/ React app: screens, table, hooks, styles
shared/engine/ pure rules engine (deal, bidding, loners, tricks, scoring, redaction)
shared/net/ room logic and wire protocol, shared by client and server
shared/bot/ the solo opponent
worker/ Cloudflare Worker and the per-room Durable Object
tests/ Vitest suite
scripts/ fuzz, layout audit, multiplayer smoke test, bot balance
art/ asset generators, checks, and the art spec (ASSETS.md)
public/ generated sprites and audio
docs/ README screenshots
| File | What's in it |
|---|---|
| RULES.md | The complete rules, and the reference the engine is built from. Starts with a summary for people who already know euchre. |
| art/ASSETS.md | How every sprite is drawn by code, and the rules that keep it all crisp and consistent. |
| DEPLOY.md | Environments, the deploy pipeline, and running it locally. |
Reading the code? shared/engine/ is the best place to start: it's pure
TypeScript with no DOM and no network, so the whole game is legible without a browser.
shared/net/room.ts is the multiplayer rules on top of it, and
worker/room-object.ts is the server that holds one room.
Pushing to dev deploys the staging site, and merging to main deploys production, both only
after every check passes. Environments, setup, and manual deploys are in DEPLOY.md.
MIT © 2026 Will Paz