Underground 2 Revived
Chrome과 Firefox에서 Need for Speed Underground 2를 WebGPU로 두고 팬 프로젝트입니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A multiplayer wizard first-person shooter that runs in the browser. Cast elemental spells at other players (and AI bots) in a castle arena.
Built with Three.js and Vite. Multiplayer uses Photon Realtime, and sign-in and saved stats use Firebase. It deploys to Vercel.
▶ Watch the gameplay demo (mp4)
Quick Match arena: a castle with walls, climbable towers, stairs, ladders and raised platforms, plus courtyard cover, ruins and boulders to fight around. Respawns pick a spot away from enemies.
Five spells, each with its own effect:
| Spell | Effect |
|---|---|
| 🔥 Fire | Burns for 5 damage a second for 3s |
| ❄️ Ice | Slows the target by 70% for 3s |
| ⚡ Lightning | Silences the target (no casting) for 2s |
| 💨 Air | Knocks the target back |
| 🪨 Earth | Grounds the target (no jumping) for 3s |
Bots fill the lobby to three combatants: 1 human gets 2 bots, 2 humans get 1 bot, and 3 or more humans get none. The lowest-numbered human runs the bots and everyone else mirrors them.
Coins and skins: every kill earns a coin and daily quests pay more. Spend coins on skins in four rarity tiers, from common recolours up to Epic and Legendary skins with glowing patterns or a translucent robe.
Sound: synthesized sound effects, including a distinct hit sound for each spell, a kill chime and a low-health heartbeat.
Settings: mouse sensitivity, field of view, volume and mute, and an FPS counter toggle, saved in the browser.
Chat: from the lobby, or press Enter in a match.
Accounts: sign in with Google to keep coins and lifetime stats across devices.
Scoreboard and kill feed.
Abuse protection: each client rate-limits and validates incoming multiplayer events, so one modified client can't flood or spoof others.
| Input | Action |
|---|---|
| W A S D | Move |
| Mouse | Look around |
| Left click | Cast your spell |
| Shift (hold) | Aim down the scope |
| Space | Jump |
| Tab (hold) | Scoreboard |
| Enter | Chat (Enter sends, Esc cancels) |
| Esc | Back to the menu |
Requires Node.js 20.19+ or 22.12+ (Vite 8) and npm.
npm install
cp .env.example .env.local
# fill in the values in .env.local (see below)
npm run dev
Then open the URL Vite prints (usually http://localhost:5173).
Set these in .env.local:
| Variable | Purpose |
|---|---|
VITE_PHOTON_APP_ID | Photon Realtime app ID for multiplayer |
VITE_FIREBASE_API_KEY | Firebase web config |
VITE_FIREBASE_AUTH_DOMAIN | Firebase web config |
VITE_FIREBASE_PROJECT_ID | Firebase web config |
VITE_FIREBASE_STORAGE_BUCKET | Firebase web config |
VITE_FIREBASE_MESSAGING_SENDER_ID | Firebase web config |
VITE_FIREBASE_APP_ID | Firebase web config |
Get the Photon app ID from the Photon dashboard. The Firebase values come from your Firebase project settings, which also needs Google sign-in enabled.
| Command | Description |
|---|---|
npm run dev | Start the Vite dev server |
npm run build | Build for production into dist/ |
npm run preview | Serve the production build locally |
index.html Lobby UI and game container
public/
styles.css Styles
privacy.html Privacy policy
terms.html Terms of service
favicon.svg Tab icon (plus favicon-32.png)
src/
main.js Game loop, match logic, bots, quests, shop, settings and chat
scene.js Arena, lighting, colliders and spawn points
collision.js Shared movement collision for players and bots
player.js Wizard model, skins, movement state and effects
controls.js Keyboard and pointer-lock mouse input
fireball.js Spell projectiles, visual effects and collisions
bot.js Bot AI
network.js Photon networking and incoming-event rate limiting
audio.js Synthesized sound effects
news.js Wizard News entries shown in the lobby
ui.js HUD, kill feed, minimap and scoreboard
lib/
firebase.js Firebase and Google auth setup
lifetime-stats.js Persistent stats and coins
WIZARD_NEWS in src/news.js, with tag set to 'new' or 'update' plus a title and a body.version from package.json. Bump it with npm version <x.y.z> --no-git-tag-version.PLAYER_SKINS in src/player.js, then add a matching button to the skin picker in index.html.The project is configured for Vercel (vercel.json): it runs npm run build and serves dist/. Add the same VITE_* environment variables in your Vercel project settings.