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
PokeWorld — where Pokémon live wild. Explore the reef, observe the ecosystem, catch Pokémon.
Translation pending
GamesTypeScript · CSSGitHub @ZahinizeOnlineOwner 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
Experience Pokémon as wildlife — explore, observe, and catch them in their natural habitats.
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Where Pokémon live wild: explore a procedurally generated underwater reef, observe schools, guardians, predators and gentle giants behaving naturally, and catch the Pokémon your mission asks for — before the ecosystem gets there first. Every Pokémon fights with two real moves; from Level 3 you bring a party of your own caught Pokémon, duel wild ones to weaken them, and face the bosses of the deep. React + React Three Fiber + Three.js, no heavyweight game engine.Read the full README ↗
Where Pokémon live wild: explore a procedurally generated underwater reef, observe schools, guardians, predators and gentle giants behaving naturally, and catch the Pokémon your mission asks for — before the ecosystem gets there first. Every Pokémon fights with two real moves; from Level 3 you bring a party of your own caught Pokémon, duel wild ones to weaken them, and face the bosses of the deep. React + React Three Fiber + Three.js, no heavyweight game engine.
The Sea World (4 levels): 1 · Sunlit Shallows → 2 · Dusk Reef → 3 · Night Reef (companions unlock; boss: Dondozo + Tatsugiri) → 4 · Deep Trench (bosses: Wailord, then Kyogre). Defeat Kyogre to complete the world.
npm install
npm run dev # http://localhost:5173
npm run build # production bundle in dist/
| Desktop | |
|---|---|
W A S D / arrows | swim (you swim where you look) |
| Mouse | look · left click throws the selected ball · right click cycles balls (levels 1–2) |
Shift | swim faster |
Space / Ctrl (or X) | swim up / down |
1–4 | select Poké / Great / Ultra / Master Ball (or right-click to cycle) |
E | lure (15 s, nearby Pokémon circle you) — one use every 5 minutes |
| Right click | quick attack (levels 3–4): fires the best ready companion move at your crosshair |
5 6 · 7 8 | specific companion moves, slot 1 · slot 2 (levels 3–4) — same aiming as a ball |
Tab | mission details · C collection · P / Esc pause |
Touch: left stick swims, drag the right side to look, 🔴 throws, ▲▼ swim up/down, » toggles sprint, tap the tray to switch balls.
PokeWorld is a fully static single-page app — no backend and no environment variables. Player saves live in the
browser's localStorage; Pokémon base stats come from the public PokeAPI (fetched client-side, cached in localStorage,
with embedded fallback stats if it is unreachable). All sprites and trainer portraits are vendored under
public/sprites/, so the game does not depend on any third-party image host.
Push the repository to GitHub and import it at vercel.com/new.
Vercel auto-detects Vite; the included vercel.json pins the settings and adds cache headers:
| Setting | Value |
|---|---|
| Framework preset | Vite |
| Build command | npm run build |
| Output directory | dist |
| Install command | npm install |
| Node.js version | 18 or newer |
Deploy. No rewrites are needed (all screens are in-app state, not URL routes).
The api/ folder holds Vercel Node functions for signup/login, stats sync and the
leaderboard. User data is stored as JSON documents — plain files under data/ in local
dev, Vercel Blob in production. One-time setup on the Vercel dashboard:
BLOB_STORE_ID and the runtime
provides VERCEL_OIDC_TOKEN — no read-write token needed (a classic
BLOB_READ_WRITE_TOKEN also works if you prefer one). All documents are written
with access: 'private' — they are never publicly fetchable.SESSION_SECRET = 32+ random characters
(e.g. openssl rand -hex 32). This signs session cookies AND derives the unguessable
blob keys for user documents — never rotate it casually (existing sessions and doc
keys derive from it).users/<64-hex>.json (never a guessable username), and the session cookie is
HttpOnly; Secure; SameSite=Lax.Local dev needs nothing: npm run dev serves /api/* through a Vite middleware and
writes JSON files to ./data (gitignored). npm run check:api runs the API test suite.
Any other static host (Netlify, Cloudflare Pages, GitHub Pages, an S3 bucket) works the same way: build, then serve dist/.
npm run check # data checks: move kits, stat normalization, damage-formula clamps
npm run sim # headless ecosystem sim: balance targets, boss flows, perf budget (ms/step)
src/
data/ species roster (role matrix), behavior groups, balls, damage table, trainers, levels/1–5
engine/
rng.ts seeded PRNG (every dive has a reproducible seed)
world/ zones + terrain heightfield, day/night lighting model, Ecosystem (entity lifecycle, LOD AI, HP)
ai/ steering helpers + data-driven behavior systems (schooling/boids, guardians, predators, curious,
bottom dwellers, defensive, gentle giants, drifters) — no rendering code
sim/ damage formula, move execution (projectiles/cooldowns/effects), catching, missions, balls, duels
ecosystem/ seeded level generator → groups, spawns, obstacles, mission objectives
sim/ catching rules, ball physics, mission state
player/ swimming controller (inertia, damping, sway)
GameSession.ts orchestrates a level: sim ↔ store ↔ audio, lure, restoration, reinforcement, completion
pokeapi/ PokeAPI client with persistent cache + deterministic HP normalisation (offline fallback stats)
persistence/ save schema (versioned), migration/recovery, storage adapter (localStorage today, API later)
state/ zustand store (UI state, save mirror, HUD, toasts)
render/ R3F: instanced billboard sprites (GIF → spritesheet, shader-animated), reef environment,
health bars, balls + FX, camera rig + desktop input
ui/ screens (trainer, menu, levels, brief, complete, collection, settings), HUD, touch controls
audio/ procedural WebAudio soundscape (drone, current, bubbles, whale calls, predator tension, SFX)
Key design rules: AI decisions are throttled (10 / 4 / 1.5 Hz by distance), movement interpolates every frame,
mission state is event-driven, every Pokémon is one instance in a per-species InstancedMesh, and the only per-frame
GPU uploads are instance matrices/attributes. PokeAPI is read once, cached, and never touched per frame.
Gameplay tunables live in src/data/gameConfig.ts, src/data/damageRules.ts, src/data/balls.ts and the level
configs under src/data/levels/.