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
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
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).