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,即可验证所有权并自行管理介绍。
一分钟完成验证保衛台北:萬華淪陷區——以真實台北街道為舞台的 3D 生存遊戲,在解放軍佔領下的萬華搜刮物資、避開巡邏、奪回街區。Defend Taipei: a 3D survival game in occupied Wanhua, Taipei. three.js + TypeScript.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗以真實台北街道為戰場的生存遊戲原型:玩法參考《Project Zomboid》(俯視生存沙盒),但敵人是已經佔領台北的解放軍佔領部隊。你是萬華巷弄裡的倖存者,搜刮物資、避開巡邏、一區一區奪回街區。
線上遊玩: https://game.lijiabao.uk/defendtaipei/(遊戲總站 https://game.lijiabao.uk/ ;舊網址 https://lijiabao1998.github.io/DefendTaipei-Lab/ 會自動轉址)
可在標題畫面或「設定」選擇 English/繁體中文,切換會重新載入;一般單人遊戲會先存檔並續玩。預設維持繁體中文,既有存檔 ID 不變。原場景招牌與歷史紀錄保留原文。驗證界線見 English localization notes。
| 按鍵 | 功能 |
|---|---|
| WASD | 移動 |
| Shift | 奔跑(噪音大、耗體力) |
| C | 切換潛行(慢、無腳步聲、較難被看見) |
| 滑鼠 / 左鍵 | 瞄準 / 攻擊(近戰從背後偷襲傷害×3) |
| E | 搜刮附近容器/上下車/和 NPC 交談 |
| Tab / I | 背包(點物品使用或裝備) |
| B | 用鐵鎚+木板封門/拆除 |
| Z | 室內睡覺(時間快轉) |
| F | 手電筒 |
| 空白鍵 | 翻越矮牆 |
| Q | 推開敵人 |
| 1 / 2 / 3 | 時間 ×1 / ×3 / ×20 |
| M | 生存者地圖(Esc 關閉) |
| 滾輪 | 縮放 |
手機:畫面左下方的虛擬搖桿移動(推到底奔跑),上車後同一個搖桿駕駛;地圖按右側 🗺。
npm install
npm run dev # 開發伺服器
npm run typecheck # TypeScript 型別檢查
npm run format # Prettier 排版(設定在 .prettierrc.json)
npm run build && npm run smoke # 建置後跑冒煙測試(Playwright:選角、序章、移動、背包、搜刮、夜間)
npm run fetch-osm # 重新從 Overpass API 抓取地圖
node scripts/tiles.mjs # 重新切 200 m 道路細節圖塊(public/data/tiles/)
main 會由 GitHub Actions 建置並部署到 GitHub Pages。.github/workflows/ci.yml):型別檢查、排版檢查、不需瀏覽器的檢查(node scripts/checks/modules.mjs)、建置,接著平行跑三個瀏覽器測試:冒煙測試、劇情存檔流程、警報測試音。CI 用軟體算圖,全部跑完約 15 分鐘。合併前請等 CI 全綠。scripts/checks/ 是各版本的功能截圖腳本(例如 node scripts/checks/v18veh.mjs),需要先 npm run preview;截圖存到 shots/。共用設定見 scripts/lib.mjs:URL(遊戲網址)、SHOTS_DIR(截圖資料夾)、PW_CHROMIUM(沒有安裝 Playwright 瀏覽器時指定 Chromium 路徑)。server/,說明見 server/README.md。| 檔案 | 內容 |
|---|---|
src/main.ts | 遊戲狀態與各系統的串接、主迴圈、開機流程(檔案開頭有章節索引) |
src/world.ts、geom.ts | 共用型別(建築、門、牆段、容器)、道路寬度、2D 幾何工具 |
src/textures.ts、texq.ts | 程序生成的牆面/道路/招牌貼圖與材質(手機半解析度) |
src/interiors.ts、alley.ts、decay.ts、facade.ts、park.ts、rooftin.ts | 室內、夜巷、破舊感、窗戶與人行道、公園、頂樓加蓋 |
src/roads.ts、roadglyphs.ts、traffic.ts | 道路細節串流(v19)、標線字樣圖集(v19.2)、序章車流 |
src/human.ts、fabric.ts、roles.ts、portrait.ts | 白面人角色與動畫、程序化布料材質(v17.2)、5 種職業、選角立繪 |
src/drive.ts、vehicles.ts | 可駕駛載具(v18)、路邊停放的車輛 |
src/armor.ts、drone.ts、fpv.ts、roc.ts、pla-loot.ts | 解放軍裝甲與無人機、FPV 自殺無人機、國軍支援、士兵掉落物 |
src/items.ts、icons.ts | 物品資料與圖示 |
src/map.ts | 生存者地圖 |
src/evac.ts、cine.ts | 撤離區與過場動畫 |
src/net.ts、sim/core.ts | 多人連線用戶端、與伺服器共用的模擬核心 |
src/joystick.ts、nav.ts | 手機搖桿、A* 尋路 |
地圖資料 © OpenStreetMap contributors,以 ODbL 授權。本作為虛構作品,人物、部隊番號皆為虛構;店名皆為諧仿,與真實品牌無關。
src/alley.ts:臨街立面自動佈景:鐵皮雨遮+日光燈管、捲門/亮燈店面、牆面電線束、電表箱、水管、春聯/福。cine chunk):手工建模福特級航艦(斜角甲板標線、艦島雷達、3 座升降機、彈射軌、攔截索、停放艦載機、彩色背心甲板人員)、護衛艦、Gerstner 海洋+浪花+航跡+旋翼下洗、燃燒中的台北天際線、多鏡頭運鏡、景深、bloom、調色、膠片顆粒、黑邊與字幕。素材授權見 CREDITS.md。armor.hit(x,z,dmg,antiArmor) 為之後 FPV 無人機/反裝甲武器預留。路上另有燒毀的殘骸。開局先選性別,再從 5 種職業選一位倖存者(皆為虛構人物):
| 職業 | 男/女 | 起點 | 特長 |
|---|---|---|---|
| 上班族 | 志偉/雅婷 | 自家 | 背包正常 |
| 學生 | 冠宇/欣妤 | 自家 | 體力恢復快(睡覺時「精神」恢復 1.5 倍)、書包稍大(背得比較重才會變慢) |
| 外送員 | 阿明/佳琪 | 門口就是自己的外送機車(有鑰匙) | 熟悉街道(地圖全開)、騎機車更快、背包小 |
| 護理師 | 柏翰/小雯 | 醫院宿舍 | 醫療用品效果加倍 |
| 水電師傅 | 阿財/淑芬 | 自家 | 修無線電只需 1 顆鋰電池、可接線發動沒鑰匙的車、修車更快、開局帶工具 |
每個職業有自己的開局背包與白面人職業服裝(外送員安全帽、水電師傅工作帽會蓋住頭髮),選角畫面是即時算圖的 3D 立繪。
早晨序章(可勾選「跳過開場」):07:20 鬧鐘響 → 跟著黃色光柱去上班/上學,手機推播新聞 → 半路響起飛彈空襲警報、防空廣播與爆炸 → 解放軍封鎖路口,正式開始求生。
v17.2:角色改為光滑亮面的白色人台風格——蛋形無臉光頭、明顯的頸部、手肘與手指、較細的腰;衣物加上翻領、袖口、腰帶扣、口袋、縫線、手肘膝蓋皺褶、褲腳堆疊與鞋底;src/fabric.ts 以程序化法線/粗糙度貼圖做出棉布、丹寧斜紋、格紋、皮革與軍規織帶(所有角色共用材質);遠處角色(> 22 m)隱藏細節網格(LOD)。角色檢視頁:scripts/checks/lineup/(npx vite 後執行 scripts/checks/v172chars.mjs)。
scripts/tiles.mjs → public/data/tiles/),只載入玩家周圍 3×3 塊,走遠就卸載。每塊內容由固定種子產生;玩家造成的變化(搜刮過的廢車、撞開的路障)另外存檔。src/roadglyphs.ts。src/arcade.ts;scripts/checks/v193shot.mjs 會拍街景並檢查建築外柱子數必須為 0。src/trees.ts:低多邊形但辨識度高的台北樹種(台灣欒樹含黃花/紅蒴果季節色、樟樹、榕樹含氣根、茄苳、黑板樹、小葉欖仁、大王椰子、過度修剪的行道樹),加灌木、公園長椅、園燈、樹穴鐵格柵;每種一個 InstancedMesh,部分行道樹傾斜。walkH:玩家與佔領軍站在 15 cm 人行道上(不再陷入);路口端點緣石降低為斜坡;鋪面貼圖在手機上走 texq 半解析度。scripts/checks/v214trees.mjs:公園樹、行道樹、掩體射擊截圖。src/paving.ts:共用 canvas 貼圖(灰/土色 10×20 cm 人字鋪連 30×30 收邊、花崗岩緣石、黃色導盲磚、騎樓五款磁磚、老舊水泥地含磁磚/磚塊補丁、人孔蓋、樹穴)與世界座標 UV。roads.ts)內,主要道路與街道兩側加 18 cm 花崗岩緣石與高 15 cm 人行道,遇建築線截止;路口端點鋪導盲磚,隨機人孔蓋,主要道路加樹穴與行道樹。鋪面用獨立亂數,不影響原有標線。路面與標線不變。scripts/checks/v213paving.mjs:人行道定點截圖(可帶入座標做前後對比)。escapeCheck(0.25 m 網格 BFS,依玩家半徑 0.35 m 與牆體判斷)與 unstuck 後備(就近移到可通往街道的點)。scripts/checks/v212spawn.mjs 可單獨執行。scripts/checks/v212occlusion.mjs 在高樓後方與外圍街區拍攝開/關對照。roofClass()(src/rooftin.ts)依樓層、面積、地塊形狀分類:連棟透天(≤5F、深 6–22 m、≤450 m²)逐戶切分 4–6 m 地塊,每戶加蓋覆蓋 60–90 %,沿同一側女兒牆整齊排列,約 20 % 戶留空;4–5F 公寓僅一端局部加蓋(約 40 % 無);6F 以上或 >600 m² 大樓多無,僅偶有退縮的小樓梯間/水箱室(≤18 % 屋頂);學校、廟宇、市場、地標等非住宅不加蓋。v21district.mjs 輸出各類覆蓋率:row 94 % 有加蓋/覆蓋 40 % 屋頂面積、walkup 50 %/9 %、big 36 %/1 %、none 0 %。scripts/district.mjs 產生 public/data/district/。dt.tiles,資料以 tile key 為單位便於多人同步。district/index.json 49 kB+wanhua.json 132 kB,map.json 410 kB 於開地圖時才載入,tile 檔合計約 2.1 MB 按需載入。node scripts/checks/v21district.mjs <url> <out>。?room=代碼&mp=伺服器網址 直接加入。src/sim/core.ts(20 Hz)。伺服器會檢查移動速度、攻擊距離與冷卻,搜刮先搶先贏,斷線後可以重連。server/README.md)。線上版還沒有架設伺服器,所以 GitHub Pages 上的多人功能暫時無法使用。src/walkup.ts:後巷懸臂式折返樓梯(暗紅扶手)、鐵窗/陽台鐵籠(鏽色、綠色)、分離式冷氣、藍綠/紅色鐵皮雨遮與加蓋、剝落見紅磚的灰色粉刷、直式招牌(虛構店名)。t<tile>:100+,按區塊存檔),由區塊的確定性亂數產生,多人模式下大家看到的一樣。sandbags(),低矮掩體,高 1 公尺);龍山寺廟埕有榕樹和長椅。scripts/checks/v215walkup.mjs。scripts/checks/v2151portrait.mjs,在 390x844 和 412x915 執行。src/metro.ts:虛構的「北都地下鐵 BEIDU METRO」,有自己的標誌(白底、橘色圓環、綠色「北」字),用橘色和深綠色。萬華區內有四站:龍山寺、西門、萬大、華江。m<站>:<n>,跟著存檔)。生成是確定性的,多人模式下大家一樣。靠鏡頭那一側的牆壁做成矮牆剖面,所以不用改鏡頭。scripts/checks/v216metro.mjs(每站都測下樓再上樓)。scripts/checks/v22survival.mjs。scripts/checks/v221metro.mjs(每站的每個出口都測下樓再上樓)。scripts/checks/v222metro.mjs。base 改為 /,舊的 github.io 網址自動轉址。public/og.jpg 1200×630)、robots.txt、sitemap.xml。http://localhost:4173/;多人伺服器 ALLOWED_ORIGINS 加入新網域(伺服器尚未部署)。scripts/checks/v231radio.mjs。授權見 CREDITS.md(無任何錄音或預錄語音)。scripts/checks/v2301hud.mjs(360×780、390×844、412×915)。src/clutter.ts:所有沒有手工佈置的可進入建築(約 480 棟)依建築 id 決定性產生室內配置,每位玩家看到的家具與掩體完全相同。f<建築>_<n> 容器,戰利品以建築種子決定,存檔可還原)。scripts/checks/v230interiors.mjs。src/squadai.ts,純函式、依士兵 id 排序 → 各端一致、無隨機):交戰中 25 m 內的士兵自動編成小隊;第 1 人在掩體後壓制射擊(射速 ×1.67、命中 ×0.6),第 2、3 人左右翼包抄(側移至玩家側面 7 m,約 7 秒),其餘為步槍兵。包抄開始時有無線電喊話「左翼/右翼包抄!」+無線電音效(可預判、公平)。scripts/checks/v2211ai.mjs。src/trail.ts,單一 ribbon、固定緩衝)、程序合成揮刀聲與打擊聲(AU.swish / AU.meleeHit,無外部音源)。scripts/checks/v2210anim.mjs(搭配 npx vite 開發伺服器的 scripts/anim/ 側視測試台),量測腳底最低點:走 −0.13→−0.001 m、跑 6.5 m/s −0.71→−0.009 m、8 m/s −0.70→−0.014 m。/workspace/v229/roofs/before|after(檢查:scripts/checks/v2291roofs.mjs)。CREDITS.md),含距離延遲、街道回音、室內悶音;載入失敗退回合成音。scripts/checks/v229shells.mjs。CREDITS.md):手槍(Walther PPQ)、步槍(AR-15/AK-47 各型)、狙擊槍(Tikka .30-06,較低沉並加長街道回音)、機槍(7.62×54mmR)、霰彈槍(Benelli Nova),遠處(>70 m)改用中距離錄音;反裝甲仍為程序合成。scripts/checks/v228guns.mjs(含封鎖音檔時的退回測試)。src/version.ts(目前 v22.7.1);載入完成前不顯示遊戲內按鈕(武器欄 ⇄ 等);選單若 6 秒內沒有出現,或載入失敗,會出現「清除快取並重新載入」按鈕(解除 Service Worker、清掉 dt- 快取)。Service Worker 以 updateViaCache: 'none' 註冊,頁面導覽一律 no-store 取最新的 index.html。scripts/checks/v2271mobileui.mjs(360×780、390×844、412×915,Android Chrome UA+觸控,含首次載入與重新整理)。scripts/checks/v227portrait.mjs(390×844、412×915、360×780)。src/audio.ts;共用兩個 AudioContext:音效(設定→音效音量)與環境/雨聲/避難所(以 markMusic 歸入音樂/環境音量);手機首次觸控即恢復播放。scripts/checks/v226audio.mjs。scripts/checks/v225snipers.mjs。dbgAt 除錯函式;門的近照截圖 scripts/checks/v2241doorshots.mjs。scripts/checks/v2241walkout.mjs 驗證 5 角色 × 2 性別 × 是否跳過開場共 20 組皆可從床邊走到街上(無推擠、無傳送)。scripts/checks/v2241sel.mjs)。dt.settings):主音量/音效/環境音、畫質 低/中/高(材質解析度與像素比)、語言(預留)、滑鼠靈敏度(FPV 無人機)、手機震動開關。dt.keys):所有按鍵可重新綁定,重複的鍵自動互換,可恢復預設。預設:WASD 移動、Shift 奔跑、C 潛行、G 掩體、E 互動、空白鍵 翻越、Q 推開、Tab/I 背包、M 地圖、H 避難所、B 封門、Z 睡覺、F 手電筒、1/2/3 時間、左鍵 攻擊、Esc 選單。提示文字會顯示目前綁定的按鍵。cig,舊存檔相容)。scripts/checks/v224menu.mjs。scripts/checks/v223retail.mjs。defendtaipei,移除本 repo 的自訂網域與 public/CNAME、robots.txt、sitemap.xml(改由總站提供);Vite base 改為 /defendtaipei/,canonical/OG 網址與檢查腳本同步更新。?mpdebug=1(或 ?mp=/?room=)即恢復原本的多人連線流程。src/ 依功能分成資料夾:core/(遊戲主迴圈、事件匯流排、模擬核心)、map/、systems/、npc/、player/、story/(events/、broadcasts/)、audio/、ui/、net/、debug/。各資料夾負責人見 docs/MODULES.md。src/core/bus.ts:簡單的型別化事件匯流排(emit/on,同步執行)。序章空襲開始時改為發出 alert 事件,由警報器監聽後響起,時序與先前完全相同。src/story/broadcasts/prologue.ts;網址測試旗標(?mpdebug=1 等)移到 src/debug/flags.ts。alert 事件新增 kind: 'test':播放短促、較小聲的三音提示(合成音效,不用音檔),不是完整的萬安警報;室內會變悶。emit('alert')(不帶參數)仍等於 'alert';'clear' 仍是解除警報。window.__game.siren('test')。