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 starship-command roguelike for WebXR, built for Meta Quest 2 and newer. It also plays in any desktop or phone browser.
You command a Fedoration courier carrying data that could end the war. Cross eight sectors, one jump at a time, while the Rebuff Fleet closes in behind you. Then chase down the Flaggship before it destroys Fedoration command.
It's a fan homage to FTL: Faster Than Light. The code, art, names and writing are all original, with plenty of puns.
Host the repo with GitHub Pages: Settings → Pages → Deploy from a branch → main / root. On a Quest, open the Pages link in the Meta Quest Browser and press Enter VR, or Enter mixed reality for passthrough.
| Quest control | Action |
|---|---|
| Point + trigger (or pinch) | Use whatever you point at: the main screen, your datapad, a pop-out window, a bridge station, the holotable or the enemy ship outside |
| Touch with the controller tip | Press buttons on screens and stations directly, like a touchscreen |
| Point at the floor + trigger | Teleport there |
| Left stick | Walk (push fully to run), with a comfort vignette |
| Right stick left / right | Turn (snap 30°, 45° or smooth) |
| Left stick click | Hold up your datapad: the whole game screen in your hand |
| Right stick click | Back to the captain's spot |
| A / X | Pause or resume |
| B / Y | Open or close the map (the holotable turns into a 3D star chart) |
| Grip | Carry the main screen, take the fire extinguisher off its rack, or pull the jump lever |
| Glance at your left wrist | Wrist menu |
Play position. Choose Standing, Seated or Lying down in Settings, or from the pause screen while in VR. Seated puts you in the captain's chair at chair height. Lying down tilts the whole bridge so that looking at the ceiling shows the console in front of you: lie back, look up, and click the right stick to re-aim if needed. The right stick click always resets your position for the chosen mode.
Look at either controller to see a label of what its buttons do. Turning style, teleport-only movement, the vignette, the magnifier, bigger VR text and the controller labels are in Settings → VR movement and Settings → VR console. Hovering over buttons gives a small haptic tick, the console texture is mipmapped so small text stays sharp, and small fonts are enlarged in VR.
In VR you stand on the bridge of your ship. A holotable under the console shows 3D models of both ships, with fires, damage, crew, drones and shots in flight, and the enemy ship is out there beyond the canopy. You can turn the holotable off in Settings.
Phones and tablets. Tap Full screen on the title screen (or pause and tap ⛶ Full screen) to hide the browser bars and lock to landscape. On iPhone, which has no full-screen mode for web pages, the game shows how to add it to your Home Screen instead; it then opens full screen like an app. Held upright, a phone turns the game sideways for you (switch this off in Settings → Screen & touch).
| Touch | Action |
|---|---|
| Tap | Use anything. Taps that land just off a button still hit it |
| Tap a weapon or drone card | Power it (the game moves spare reactor power over if it needs to) and pick it for aiming |
| Press and hold | Show details about what's under your finger, without clicking it |
| Pinch or double-tap the ships | Zoom into the battle (up to 3×). Only the ships are magnified: the top bar, crew, power and weapon panels stay normal size and keep working, so you can aim, give orders and power systems while zoomed |
| Drag while zoomed | Look around the battle (or tap the small map under Zoom out) |
| Pinch or double-tap anywhere else | Zoom the whole screen (up to 4×); double-tap again or tap Reset zoom to zoom out |
On a computer, the mouse wheel over the ships zooms the battle the same way. Switch it off in Settings → Display → Zoom into the ships.
Screen shape (Settings → Screen & touch): Fill stretches the game to the whole screen so no black bars show (the default on phones and tablets), 16:10 is the original shape, 16:9 and 21:9 are wide shapes, and Crop zooms in so nothing is left over; drag to see the edges.
Text is larger by default on touch screens (Normal / Large / Huge in Settings). If you'd like events and messages to zoom in to fill a phone screen while they're open, switch on Settings → Display → Zoom in to read (off by default; tips never zoom). Tips are spaced out, so you don't get one straight after another. The game pauses itself when you switch apps, keeps the screen awake while you play, and gives a short vibration on hits (switch off in Settings). Settings can also be opened from the pause screen mid-run.
| Keyboard | Action |
|---|---|
| Space | Pause |
| M | Map |
| S | Ship screen |
| 1–4 | Select a weapon to target |
| V | Hold fire / fire volley |
| F | Autofire on / off |
| C | Cloak |
| H | Crew back to stations |
| + / − | Game speed |
| Arrow keys, Enter | Move between buttons and rooms, and select |
| Esc | Close or cancel |
| Game controller | Action |
|---|---|
| D-pad | Jump between buttons and rooms |
| Left stick | Move a free cursor |
| A / B | Select / back out |
| X / Y | Hold fire / map |
| LB / RB | Previous / next weapon (the cursor jumps to the enemy ship) |
| LT / RT | Crew back to stations / autofire |
| Start / View | Pause / ship screen |
Free, with no accounts and no game servers: players connect directly, browser to browser, so a Quest, a laptop and a phone can all play together. Open Multiplayer on the title screen, host a game and read out the five-letter room code, or join with a friend's code (typed on the on-screen keyboard, which works in VR, or opened from an invite link like …/index.html#join=ABCDE). You can also invite friends into the run you're already flying: pause and press Invite friends into this run.
| Mode | Players | What it is |
|---|---|---|
| Co-op crew | 2–4 | One ship, everyone aboard. By default anyone can do anything; turn on Stick to stations to give each player a role (Captain, Helm, Tactical, Engineer). The map, ship screen and store are each player's own window, so two players can browse different things at once. Event choices can be anyone's, or the captain's only. |
| Navigator | 2 | A captain in VR flies and fights; a navigator on a laptop or phone plots the course, answers beacons and runs the shop. |
| Away team | 2–4 | Co-op with a boarding specialist, who is prompted to beam over with the teleporter crew. In VR they can walk the enemy ship, sabotage systems by hand and use the sidearm. |
| Go live | 1 + up to 7 viewers | Stream your run. Viewers watch from any device, can look at the map and ship screen, and send emoji that float up on everyone's screen. Games can be listed publicly, and any co-op game can take viewers too. |
| Hunter and hunted | 2 | The host flies the courier as usual. The guest is the Rebuff fleet commander, earning 2 command points per courier jump and spending them on cards: ambushes and hazards placed on the map, fleet surges, jammed sensors, and in a fight overcharged guns, boarders and shield surges. The commander can also aim every enemy gun. Play the whole run, or a short hunt to sector 4. |
| Duel arena | 2 | Each player picks a hull and spends the same budget in an arena store that sells everything, then the two ships fight. Best of 1, 3 or 5. Each player's own game runs their own ship; shots, boarders, hacking pulses and mind control cross over, and whoever is hit works out the hit. |
| Boarding brawl | 2 | Pick up to four crew on a points budget. Both crews start at opposite ends of the same ship with the doors open; the medbay heals whoever stands in it. After two minutes, life support fails. |
| Race to the Flaggship | 2–4 | Everyone flies the same seed at the same time. A strip under the top bar shows how far each rival has got; winning fights draws trouble cards to play on them (fleet surge, ambush, ion storm, sensor jam, fuel leak, pirate toll, or a jammer to block one). |
| Wingmen | 2–4 | Your own ships on the same sectors. Jump to the same beacon as a wingmate and you fight the same ship together: each of your shots is echoed into their fight as covering fire. Send each other scrap, fuel, missiles and drone parts. |
No room needed. Seed duels send any finished run as a link or code: your friend flies the same seed (same maps, events and shops) and sees whose score wins, and their answer comes back the same way. Challenge codes: design a challenge (ship, difficulty, goal, hull, crew, starting supplies, guns, fleet speed, sector count, salvage) and share it as a code; codes from friends are saved to the Challenges screen. The weekly cup is a run everyone flies all week (Normal, mods off); it and the daily run have public score boards.
Talking. Quick chat (T, or the Chat button) sends calls like Fire! or Jump now? and emoji. Voice is optional: it asks for your microphone and sends your voice straight to the other players. Everyone sees where the others are pointing, with their name. In co-op, VR players see each other on the bridge as a helmet, hands and a name tag, and flat-screen players see a marker in the room a VR player is standing in.
If the host's connection drops, guests in a shared game can keep playing the run solo, or rejoin with the same code. Leaving on purpose takes you back to the multiplayer menu. Players who join late are brought straight into the run in progress (or to the end screen, if the run just ended); in a race, late arrivals are asked to pick a ship if picking is still going on. Settings → Multiplayer has your name, which meeting servers to use, automatic score posting and an optional TURN relay server (only needed on networks that block direct connections).
Ships and crew
Systems
Ship interiors
Combat
Augments
The journey
Your crew's story
Inspired by the spirit of the absurd trail games: a small crew you grow fond of, strange things on the road, and deaths that get remembered.
Stores and trade
Home life aboard (light touch, all optional)
Story and dialogue
Graphics
Sound and music
Crew at a glance
VR command deck
Your whole ship, in 3D (VR)
VR ship overhaul: space, height, running and interaction
A living sky
Settings are organised into Audio (master, music, effects, ambience, music source), Graphics (effects quality, VR resolution and foveation, living sky, shooting stars, bridge, holotable, screen shake, reduce flashes), Screen & touch, VR movement (play position, height, turning, walking, running, vignette, comfort presets), VR console (datapad hand, pop-out windows, bridge stations, main screen on or off, magnifier, text size, controller help, controller buzz, size resets, replay the VR tour), Gameplay (difficulty, game speed, ship experience, hands-on play, tips, smart pause, unlocks, mod scripts) and Profile.
Runs, seeds and the daily challenge
Crew traits, veterans and voices
Sector map and routes
Accessibility
Interface helpers
Captain's tips
Balance, tested by autoplay
Mechanics tuned to FTL reference numbers
Around the game
Challenges
challenges fields below).Mods are JSON files. In the game, open Mods:
mods/index.json. This works inside VR on GitHub Pages..json files from your device. On Quest, exit VR first so the file picker can open.Mods are saved in the browser and apply when you start a new run. Turn them on or off from the Mods screen.
Make mods with an AI. The Mods screen has an AI mod guide button that downloads mods/AI-MOD-GUIDE.md. Paste the guide into any AI chat, describe the mod you want ("a haunted sector with three ghost ships and a quest"), save the reply as a .json file and add it with Add mod files, or paste it straight into the mod panel. The guide lists every field, every effect, the ids of everything in the base game and a balance guide, so the AI's mods load first time.
42 mods come with the game in mods/, all installable from the Mod library (filter by Content, Ships, Trials, Rules or Scripts):
They are inspired by the kinds of content FTL mods add, but every name, number and line of text is new; nothing is copied from another mod. When you add a mod, the game warns about any field it doesn't use, so a typo like "damge" doesn't fail silently.
{ "name": "My Mod", "version": "1.0", "author": "You",
"rules": { "startScrap": 40 },
"races": [], "weapons": [], "drones": [], "augments": [],
"ships": [], "enemies": [], "sectors": [], "events": [], "traits": [], "challenges": [],
"remove": { "events": ["quiet"] },
"script": "VTL.on('arrive', function(node){ VTL.toast('Hello!'); });" }
Every list holds objects with an id. Reusing an existing id replaces that item, so mods can also rebalance base content.
| Kind | Fields |
|---|---|
rules | sectors, startScrap, fleetSpeed, shieldRegen, repairRate, enemyPace, bossId, maxCrew, weaponSlots, droneSlots, augmentSlots, baseHP, startParts |
races | name, color, hp, repair, combat, speed, power (free power to the room's system), heal (health per second for everyone in the same room, true = 1), fireproof, noAir (needs no oxygen), armor (share of weapon damage taken, e.g. 0.7), telepathic, mindImmune, deathBurst, learn, desc |
weapons | name, type (laser, missile, ion, beam, flak, bomb), damage, shots, charge, power, cost, tier, fire, breach, sysDamage, crewDamage, ion, stun, pierce (ignores that many shield layers), rooms (beams), radius (flak), heal (bombs), desc |
drones | name, kind (attack, defense, anti, internal, boarding, hull), power, cost, rate, shot (a weapon object for attack drones), targets (defense), role (repair or fight for internal), heal (hull) |
Event choices
text plus either an effect, or a chance with success and fail effects.req limits who can pick it: race, quirk (a crew personality such as "gambler"), pet (true: needs the ship's pet), system + level, weaponType, drone, augment, scrap, fuel, missiles, parts, crewCount. Race, personality, pet, system and equipment requirements show as blue options.cost takes scrap, fuel, missiles or parts.Effects can include:
textscrap, fuel, missiles, parts, hullcrew (a race id or "random"), crewLossweapon, drone, augment (an id or "random")install (a system or "random"), upgrade, damageSystem (a system or "random"), reactor, firefight (an enemy id or "random"), afterWin (an effect applied if you win that fight), event (chains to another event), quest (marks a quest beacon with that event), later ({"event":"id","jumps":4} fires an event after some jumps), storechoices (continue the conversation on a new page), setFlag / clearFlag (story flags that choices and events can require), begin / dismiss (in hails: start the fight, or end the encounter)crewHeal, crewHurt, maxHull, xp ({"skill":"pilot","amt":20}), reveal (shows the sector map), fleetPush, mapPiece{crew}, {who} (the crew member who meets a race or personality requirement), {ship}, {enemy} and {sector}, and in crew moments {friend}, {fallen}, {pet} and {nemesis}.moment: true and it is picked as a crew scene instead of a normal beacon. star (a personality, or "any") chooses who it is about, bond: true (with an optional bondKind) needs a crew member with a friend, sibling, rival or sweetheart, pair: true picks two crew with no bond yet ({crew} and {friend}), fallen: true needs someone who died, pet: true needs the pet. Extra effects for these: starHurt, starHeal, starXp, , , , , , , , and (the line the run's saga tells about that choice).Ship layouts
pattern builds the layout from columns: T tail, A small/big/small, B two big rooms, C one big room, D two narrow rooms, N nose. For example "TABAN".rooms yourself as {"sys":"shields","x":0,"y":0,"w":2,"h":2} grid cells. Doors and airlocks are added automatically.Scripts only run when Allow mod scripts is turned on in Settings. Only turn it on for mods you trust.
A script receives a VTL object with:
on(event, fn). Events are runStart, arrive, event, combatStart, combatEnd, fire, tick and runEnd.toast(text), applyEffect(effect), startCombat(id), giveWeapon(id), addEvent(id, event), rand and pick.G (the current run), DATA and UI.List mods in mods/index.json so players can install them from the Mods screen, including in VR:
{ "mods": [ { "file": "my-mod.json", "name": "My Mod", "desc": "One line about it." } ] }
The game is plain HTML and JavaScript with no build step. It uses three.js r128 from cdnjs for WebXR.
The whole interface is drawn on a 1600×1000 canvas. On flat screens the canvas is shown directly; in VR it becomes the texture of a floating console, with the holotable rendered in 3D below it.
| File | Contents |
|---|---|
js/data.js | Ships, races, weapons, drones, augments, enemies, sectors, events, achievements |
js/story.js | Hails, quest chains, the secret sector, extra events, chatter, taunts, intros |
js/tales.js | More events: distress calls, everyday oddities, short quest chains, follow-ups that remember your choices, beacons for each sector |
js/market.js | Store kinds and keepers, prices, haggling, deals, mystery crates, the guild card, crew worth, trade goods and the cargo hold, the store screen |
js/homestead.js | The garden, galley and meals, friendship hearts and gifts, personality perks, fishing, the bar |
js/travellers.js | Kestrel Jones's bounties, Doctor Oddly's implants and clinic, devotion at ten hearts, and more strange days |
js/saga.js | Crew personalities, bonds, crew moments and their chains, the ship's pet, the nemesis, last words and ghosts, and the written saga of each run |
js/variety.js | Extra hails and enemy ships, larger pools of chatter, taunts, greetings and quiet-beacon text, and the helpers that keep them from repeating |
js/gfx.js | Procedural hulls, planets, nebulae, icons, particles, event art |
js/sprites.js | Crew looks, sprites, poses and portraits for every race |
js/core.js | Utilities, profile and unlocks, mod loading and scripts, audio and music |
js/ship.js | Layout generator, doors and airlocks, pathfinding, crew |
js/sim.js | Power, systems, damage, fire, oxygen, drones, crew AI, enemy AI, hazards |
js/run.js | Run flow, map, events, stores, combat start and end, the Flaggship chase, saving |
js/ui.js | All canvas drawing and input |
js/scene3d.js | VR bridge, 3D ship models, holotable, battle outside the canopy |
js/audio.js | Synthesised sound effects, ambience and adaptive music |
js/crewui.js |
No servers of our own. Players find each other through free public meeting points (the PeerJS cloud server and a handful of Nostr relays, tried at the same time), swap connection details, then talk directly over WebRTC data channels: one reliable and ordered for game state, one fast and lossy for pointers and VR poses. Messages over 15 KB are chunked. The host is the hub: guests connect to the host, which passes on what the others need. On Nostr, connection details are sealed with AES-GCM using a key made from the room code, and posted as short-lived events tagged with a hash of it.
Shared-ship modes (co-op, navigator, away team, go live, hunter and hunted, brawl): the host runs the only real game. Ten times a second it works out what changed in the game state since the last send and sends a patch: arrays of crew, shots and drones are matched by id, everything else by key, numbers rounded. Each guest applies patches to its own copy and animates it in between (shots fly, crew walk, drones circle). A guest's own actions run on their copy at once, then a comparison with the copy as it was finds what changed (power, targets, doors, crew orders, upgrades, store buys, VR hands-on work) and sends it to the host: counts like scrap, hull, fire and repair progress as differences, crew paths as move orders, and teleporting, hacking, mind control and jumps as commands. Until the host confirms, the guest keeps showing its own change. Shared pop-ups (events, results, surrender offers) are run by the host: a guest's click is sent as "this button was pressed", so every player sees the same choice play out. Sounds, toasts, sparks and medals the host's game makes are sent along with each patch.
Duels split the work: each player's game runs their own ship and shows a copy of the opponent's, refreshed ten times a second; shots, boarders and mind control cross as messages. Race and wingmen games are fully separate games of the same seed, with the host's game data, exchanging progress, cards, covering fire and supplies.
Scoreboards and the public room list are Nostr events (kind 30078), signed with a key made on the device and kept in the browser's storage.
Artwork (title wallpaper, concept-art gallery, crew avatars) and five soundtrack tracks come from FTL: Faster Than Light, © Subset Games, with music by Ben Prunty. They are used with the rights holders' permission and live in assets/. The wallpaper has had its logo painted out. In Settings you can switch crew portraits to Drawn and the music to Generated to play without them.
augments | name, cost, desc, fx. fx gives a new augment real effects, and several augments add up: charge, shield, repair, speed, dps, scrap (fractions, 0.1 = 10% more), ionRes, sysRes, breachRes (chance to shrug off ion, system damage, breaches), ammo (chance a missile or drone part isn't used), evade (extra evasion points), heal (health per second for your crew, anywhere), superShield (super shield points at the start of each fight). Reusing a base id keeps its built-in effect. |
ships | name, cls (groups A/B layouts in the hangar), layout, desc, hull, reactor, color, image (a picture to use as the hull), systems (name → level), reserve (empty rooms for later systems), weapons, drones, crew (race ids), augments, fuel, missiles, parts, pattern or rooms, unlock ({"sector":3}, {"win":"shipId"}, {"ach":"id"}, {"kills":25}) |
enemies | name, tags, onlyTagged (only met in sectors whose enemyTags include one of its tags), eventOnly (never met at random, only through an event's fight), hull, systems, weapons, drones, crew, sectors: [min, max], auto (no crew), super, boss, phases |
sectors | name, blurb (shown on the route cards), intro (a list of arrival lines), color, mix (beacon weights for event, combat, store, empty), tags, enemyTags, hazards (chance per hazard), nebula, fleetMult |
traits | name, desc, and any of: repair, dps, speed (multipliers), charge (weapon charge while manning weapons), shield (shield recharge while manning shields), hp (extra health), evade (extra evasion while piloting), heal (health per second for everyone in the same room). Every recruit gets one trait at random. |
challenges | name, desc, tier (1-3 stars), ship, difficulty, rules (rule changes for that run), start (hull, crew (race ids), crewCount, weapons, drones, augments, systems, scrap, fuel, missiles, parts), scrapMult, goal ({"sector":5} or {"win":true}) |
events | text, weight, minSector, maxSector, tags (only in sectors with one of these tags; add "" to allow it anywhere but favour those sectors), nebula, distress, questOnly, once, flag, noFlag, hail (a faction or enemy tag: shown before fights with ships that carry it), art, choices |
starQuirkstarLeavestarClonebondFixpetpetBigpetGonesagaunlock, achievement| Crew jobs, job icons and the crew detail card |
js/interior.js | The walkable 3D ship: rooms, machines, doors, hazards, beaming, walking and pointing |
js/crew3d.js | Life-size 3D crew for every race, animation and nameplates |
js/skyfx.js | Living sky, hyperspace tunnel and battle effects in VR |
js/vrgrab.js | Grab, move and resize the console and holotable; holotable picking |
js/challenges.js | Challenge runs, their goals and screen, and the newer medals |
js/hints.js | Contextual captain's tips and their triggers |
js/vrnav.js | VR walking, teleport, snap turn, vignette, magnifier, controller labels |
js/vrui.js | VR widgets: wrist menu and wall-mounted room consoles |
js/handson.js | VR hands-on bonuses: fixing hazards, captain's station pads, enemy sabotage, salvage crates |
js/vrdeck.js | VR command deck: datapad, pop-out windows, touch presses, bridge stations, aiming at the enemy ship, 3D star map, jump lever, extinguisher, sidearm, hit sparks, guided tour |
js/mobile.js | Screen fitting, safe areas, sideways mode, full screen, touch taps, long press, pinch and double-tap zoom, wake lock |
js/keyboard.js | The on-screen QWERTY keyboard every text box uses (VR, touch, mouse and physical keys) |
js/pad.js | Game controller and keyboard focus: d-pad and arrow-key navigation between buttons and rooms, cursor, button actions |
js/media.js | FTL artwork and soundtrack: title wallpaper, gallery, crew avatars, streamed music |
js/xr.js | WebXR session, console, controllers, haptics, dialogs, boot |
js/netcrypto.js | SHA-256, AES-GCM and BIP-340 Schnorr signatures (for Nostr), with no libraries |
js/net.js | Rooms and codes, WebRTC connections, the three meeting points (PeerJS, Nostr, a local BroadcastChannel for testing), a small Nostr client, the public room list |
js/netsync.js | Shared-ship replication: patches, the guest copy, capturing guest changes, shared pop-ups, sounds and effects relayed from the host |
js/mp.js | The multiplayer menu, rooms, players and roles, the in-game strip, pointers, quick chat |
js/mphunt.js | Hunter and hunted, what viewers may press, co-op medals |
js/mpcodes.js | Seed duels, challenge codes and their builder, the weekly cup and daily boards |
js/mprun.js | Race to the Flaggship and Wingmen: progress, trouble cards, covering fire, supplies |
js/mpversus.js | Duel arena and Boarding brawl |
js/mpvr.js | VR avatars and voice chat |