Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
つなげる、そろえる、対戦する。ぷよとテトリス、2つの落ちものパズルをブラウザで。オンライン・CPU・2人対戦、スマホ操作に対応。
Translation pending
GamesTypeScript · CSSGitHub @th2ch-gOnlineOwner 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
ぷよぷよテトリス
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A complete, mobile-friendly falling-block puzzle game for GitHub Pages. Play Puyo-style chains and Tetris-style line clearing against the CPU, on one shared device, or online with a friend.Read the full README ↗A complete, mobile-friendly falling-block puzzle game for GitHub Pages. Play Puyo-style chains and Tetris-style line clearing against the CPU, on one shared device, or online with a friend.
Puyo uses a six-column, twelve-visible-row field with two hidden rows. Groups of four or more orthogonally connected colors clear together; gravity can trigger additional chains. Adjacent garbage disappears with colored groups. Chain, color, group, and all-clear bonuses contribute to scoring and attacks. The marked spawn cell determines top-out.
Tetris uses ten columns and twenty visible rows, plus two hidden rows. It includes seven-bag randomization, five-piece preview, hold, a landing guide, SRS kicks, a 500 ms lock delay with a 15-reset cap, T-spin recognition, combos, back-to-back bonuses, and perfect clears.
Attacks first cancel the sender's pending garbage. Simultaneous attacks cancel each other. One Tetris garbage row equals six Puyo garbage units; fractional row units remain pending. Garbage arrives after piece resolution, at most eight Tetris rows or thirty Puyos at once. Both players receive the same piece sequence for the same puzzle type. The CPU searches reachable placements and evaluates the resulting board.
This is an independent fan-made implementation. It is not affiliated with an official game or service and does not reproduce all official scoring, timing, or competitive balance rules. All visual artwork and synthesized sound effects are original.
| Action | Solo / online | Local player 1 | Local player 2 |
|---|---|---|---|
| Move | Left / Right | A / D | Left / Right |
| Soft drop | Down | S | Down |
| Clockwise | Up / X | W / E | Up / Period |
| Counterclockwise | Z | Q | Comma |
| Hard drop | Space | F | Enter |
| Hold | C / Shift | R | Right Shift |
| Pause | Escape / P | Escape / P | Escape / P |
Touch controls support pointer capture, simultaneous fingers, directional repeat, and pointer cancellation. Directional delay and repeat speed are adjustable. Settings include sound, volume, landing guides, color identification marks, and vibration on supported devices. The interface honors reduced-motion preferences.
Use Node.js 22.12 or newer.
npm ci
npm run dev
npm test
npm run build
npx playwright install chromium
npm run test:e2e
Browser tests use the production build served by Vite preview. They cover complete game flows, deterministic saved-board scenarios, keyboard and mobile touch interactions, accessibility, corrupt storage recovery, and an actual PeerJS/WebRTC connection between isolated browser contexts. The online test requires access to the signaling service and working WebRTC networking.
To use an existing Chrome installation:
PLAYWRIGHT_CHANNEL=chrome npm run test:e2e
PLAYWRIGHT_CHANNEL=chrome node tests/capture.mjs
For WebKit compatibility checks:
npx playwright install webkit
PLAYWRIGHT_BROWSER=webkit npm run test:e2e -- tests/game.spec.ts
To verify a deployed site, set PLAYWRIGHT_BASE_URL to its full URL, including the trailing slash. Generated screenshots, traces, builds, and dependency directories are ignored by Git.
Enable Settings → Pages → Source → GitHub Actions. Push to main or run the deployment workflow manually. The workflow checks formatting, unit tests, the production build, and browser tests before publishing dist/. Relative asset paths allow deployment under a repository subpath without a hard-coded account or repository name.
The application requires no application server. Online discovery uses PeerJS signaling, and game data travels over a WebRTC data channel. The host runs the authoritative game simulation; the guest receives snapshots and predicts its own outstanding inputs. Player tokens prevent a different guest from taking an occupied slot. Input validation and rate limiting protect the host against malformed commands; this is a casual friend-to-friend game, not a cheat-proof ranked service.
| Path | Responsibility |
|---|---|
src/game/engine.ts | Deterministic board, clear, attack, and match rules |
src/game/pieces.ts | Piece geometry, randomizer, projection, and SRS kicks |
src/game/ai.ts | Reachable CPU placement search and heuristics |
src/lib/network.ts | Room protocol, synchronization, and reconnect |
src/lib/useGame.ts | Fixed-step simulation and browser lifecycle |
src/lib/input.ts | Keyboard and touch repeat handling |
src/lib/storage.ts | Validated settings, saves, and history |
src/components/ | SVG boards, controls, dialogs, and application screens |
tests/ | Rule, integration, accessibility, and visual checks |
Source is available under the repository's MIT license. The names of established games remain the property of their respective owners.