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,即可驗證所有權並自行管理介紹。
一分鐘完成驗證OSRS Tower Defense prototype
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
An Old School RuneScape–themed tower defense game that runs entirely in the
browser. Place OSRS-flavoured towers along a winding path, survive escalating
waves, and earn gold to upgrade your defenses.
Status: being rebuilt for a clean, public-ready core. The playable MVP
lives in lib/game/core/ + components/game/;
the richer OSRS subsystems (Slayer, Prayer, Farming, Magic, Grand Exchange,
quests, pets, bosses) are being reintroduced incrementally. See
CLAUDE.md for architecture.檢視完整 README ↗We rebuilt Old School RuneScape as a tower defense game. It runs in your browser, talks to no server, and every sprite and sound in it came out of the real OSRS game cache.
Nothing to install and no account to make. Your progress lives in the browser, and a save code carries it to another machine.
You defend one board, 45×20 tiles at a fixed 1440×640. Everyone plays that same board, and you get a different road cut through it every run. Monsters walk that road end to end. You build beside it, upgrade what you built, and lose one of your 20 lives every time something reaches the far side.
You meet a boss every tenth wave. Kill one and the road forks: you pick where to march next out of seven regions, the Kharidian desert, Morytania's swamp, the Wilderness, Trollweiss snow, the Karamja jungle, the TzHaar caverns and the Misthalin plains you started on. Your towers, your terrain and the bends you paid to carve all survive the move. Only the palette, the monsters native to the place and the diary tasks change. Put down every boss a run schedules and you win at wave 130. Endless keeps counting after that, for as long as you last.
| Mode | What it is |
|---|---|
| Classic | Build towers, survive waves. No cards, no relics. |
| Roguelite | Classic, plus reward cards you buy with gold between waves. Each boss pays a relic that rewrites a rule of the whole run. |
You also pick a difficulty, seven tiers named after the OSRS Combat Achievement tiers. Start on Normal; win once and the tier above it opens, up to Grandmaster: 2.8× enemy HP, 30% less gold per kill, five lives instead of twenty.
Six towers, and six more you forge. Archer, Wizard, Cannon, TzHaar, Slayer and Toxic each climb a tier ladder built from real OSRS gear. Every one owns a niche the Wizard cannot cover, so none of them is a worse version of another. Stand two finished towers of the right pair on adjacent tiles, pay the fee, and they fuse into one weapon: a Scorching bow, a Venator bow, a Noxious halberd, a Purging staff, a Toxic staff of the dead or an Eclipse atlatl. A fusion does something no quantity of its parents can.
Sixty-one monsters and fourteen bosses, plus the minions they call in. Each boss fights back with a mechanic of its own. Zulrah rotates through forms that answer to one combat style at a time, Jad calls Yt-HurKot healers that drain the damage you just dealt, and the Corporeal Beast siphons a tower so its shot never leaves the barrel. Ordinary monsters roll affixes, so a goblin can turn up Volatile and knock your towers offline when it dies, or Warded against every freeze you own.
Wizards choose a spellbook. Elemental picks an element and hits one target. Ancients barrage a crowd with ice, blood, shadow or smoke. Utility buys you curses and sanctity instead of damage.
OSRS skills, doing OSRS jobs. Slayer masters hand out tasks. Prayer burns points for damage and protection. Herblore brews potions you drink for a stretch of waves. Farming, Fishing and Hunter fill the gaps between fights, and none of them asks you for timing or clicks per second.
Things to chase. A Collection Log, a Bestiary you can rotate the models in, Combat Achievements, Achievement Diaries per region, boss pets, and an Essence Shop where clearing waves buys permanent upgrades for every run after.
A daily challenge. You and everybody else get the same map and the same boss order each UTC day. Replay it as often as you like; the scoreboard keeps your best.
npm install
npm run dev # http://localhost:3000
npm install resolves clean. next is pinned to 15.4.11, which peer-accepts the
React 19.2 the app runs on.
| Command | What it does |
|---|---|
npm run dev | Next.js dev server |
npm run build | Static export to out/ |
npm run test | Vitest, 1,703 tests across 70 files |
npm run lint | ESLint, advice only |
Before you claim a change works, run npx tsc --noEmit, then npx vitest run,
then npm run build. Type errors fail the build; lint errors do not. The
.claude/skills/game-verify skill explains how to drive the exported game in a
headless browser when the gate cannot tell you what you need to know.
One imperative class runs the game, one React component draws the interface, and we keep the two apart on purpose.
lib/game/core/engine.ts owns the state, the
requestAnimationFrame loop and every method the interface calls. The
simulation itself lives under core/sim/.lib/game/core/renderer.ts owns every Canvas 2D
draw call and keeps no state of its own. Each layer is a module under
core/render/.components/game/GameRoot.tsx is the React
bridge and the whole OSRS interface.React never touches a game entity. The engine pushes Partial<UIState> patches
up; the interface calls methods back down. Game rules live in
lib/game/systems/ as pure functions with tests beside
them, which is where the whole safety net sits. Static content lives in
lib/game/data/.
CLAUDE.md documents the boundaries in full, and the four skills in
.claude/skills/ carry the detailed rules for the interface, for new content,
for verification and for commit messages.
The scripts in scripts/ bake every sprite, model render, animation
frame and sound effect out of a local OSRS cache. We hot-link nothing from the
wiki or anywhere else, and a test fails the build if a data table names an icon
with no bake behind it.
Rendering an enemy takes three steps: export it as an animated glTF, bake the
walk, hurt and death sheets with three.js, then regenerate the animation tables.
Picking which cache sequence is a death animation is its own problem, and
npm run anims:triage <slug> exists because guessing at it wastes hours.
We read the cache with other people's tools.
scripts/ goes through it: interface
sprites, NPC models, animation frames, sound.lib/game/music/ is a port of the
client's own MIDI player, patch loader and Vorbis decoder, read from the
deobfuscated clients in RT4-Client
(OpenRS2's deob of the 2009 client, where the same classes carry readable names)
and OpenOSRS.app/fonts/.The game is a static site, so GitHub Pages serves it with no server behind it.
main. .github/workflows/deploy.yml
builds the export and publishes it.The workflow sets NEXT_PUBLIC_BASE_PATH=/<repo-name> so assets resolve under the
project subpath. To build that bundle by hand:
NEXT_PUBLIC_BASE_PATH=/osrs-tower-defense npm run build # serve ./out
The 💬 button in game opens a bug form, a suggestion form and an invite to the Discord. Reports go into a triage ledger, and when we build one it turns up in the in-game "Recent updates" list with a 💬 beside it.
Next.js App Router, React 19, TypeScript, HTML Canvas, Tailwind v4 over hand-rolled OSRS CSS. No backend, and none planned.
Old School RuneScape belongs to Jagex Ltd. This is an unofficial fan project, not affiliated with or endorsed by Jagex.