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
A daily dark-fantasy roguelite. Same crypt for everyone, one attempt a day. Plays in your browser in seconds.
GamesTypeScript · CSSGitHub @NotJSTN666OnlineOwner 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
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗A daily dark-fantasy roguelite that runs in the browser. Same crypt for everyone, one attempt a day. Players go down floor by floor, stack relics into broken builds, and share how deep they got.
Play: https://onemorecrypt.com/
Controls: arrows / WASD / hjkl to move, Space to wait. On mobile, swipe, tap a tile, or use the d-pad.
npm install
npm run dev # local dev server
npm test # logic tests + a bot that plays 300 full runs
npm run build # static build into dist/
Run BALANCE=1 npx vitest run to print how deep a simple bot gets, as a quick balance check.
No game engine: TypeScript, Vite and a <canvas>. Sprites are 12×12 pixel art written as strings in src/sprites.ts, and sound effects are synthesized with WebAudio, so there are no asset downloads. The gzipped build is about 16 KB of JS.
| File | What it does |
|---|---|
src/game.ts | All game rules (pure logic, no DOM) |
src/relics.ts | Relic catalogue: add new relics here, effects go in game.ts |
src/render.ts | Canvas renderer, particles, lighting |
src/content.ts | Heroes, elites, floor events, combos and achievements |
src/meta.ts | Souls, unlocks, achievements and codex that carry between runs |
src/progress-ui.ts | Hero select, Ossuary and Grimoire screens |
src/hero.ts | The hero sprite, layered by relic (preview every look at /scripts/heroes.html under npm run dev) |
src/audio.ts | Synthesized sound effects and the generative background music |
src/main.ts | UI, input, overlays |
src/share.ts | Share text for X |
src/daily.ts | Daily numbering (Daily #1 = 2026-10-14; a new crypt at midnight Central Time) |
src/online.ts | Supabase calls: sign-in, run upload, leaderboards |
src/social.ts | Sign-in, profile and leaderboard screens |
supabase/schema.sql | Database tables, security rules and leaderboard views |
With no configuration the game runs fully offline: names and progress are saved on the device and the leaderboard is hidden. To turn on accounts and leaderboards:
supabase/schema.sql and click Run.https://onemorecrypt.com/) and add it under Redirect URLs, along with https://notjstn666.github.io/one-more-crypt/ so the old address keeps working.Your code: {{ .Token }} to the template. Players who open the email outside the game's browser (common in the X app) can then type the code instead of tapping the link.SUPABASE_URL and SUPABASE_ANON_KEY. Then re-run the deploy workflow.The anon key is designed to be public; the security rules in schema.sql decide what it can do. Players can only submit runs for themselves, get one daily attempt each, and can't submit dailies for other days. Anyone can read the leaderboards.
Optional:
AUTH_X = true.Every run uploads its full input log. The game is deterministic, so Game.replay() rebuilds any run from its log, which makes it possible to check leaderboard entries for cheating.
.github/workflows/deploy.yml builds and publishes to GitHub Pages on every push to main. One-time setup: Settings → Pages → Source: GitHub Actions.
The game lives at the custom domain onemorecrypt.com (DNS at the registrar, then Settings → Pages → Custom domain with Enforce HTTPS). The link-preview tags use https://onemorecrypt.com/, set in deploy.yml; a repo variable SITE_URL overrides it. Share links use whatever address the player is on.
The social preview image is public/og.png. To regenerate it, run npx vite --port 5199 and then node scripts/make-og.mjs (needs Playwright installed).