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,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Open-source, dependency-free gomoku board editor with variation trees, spiral cell numbers and accessible themes.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
A static gomoku board for livestreamed games. One host runs the page and plays both sides,
while players call their moves over voice (TikTok live, video calls, ...). No server, no build step.檢視完整 README ↗A static gomoku board for livestreamed games. One host runs the page and plays both sides, while players call their moves over voice (TikTok live, video calls, ...). No server, no build step.
YXPLAYSELF / YXOPPDIST). Walls are sent to the engine, which treats them as line blockers.
The Engine tab loads it and sets rule, time, suggestions, depth, strength, playing style (normal, aggressive, defensive or troll), threads and hash.
Boards up to 22×22 (Rapfi's limit). The board itself still enforces no rules.Keyboard: ← → back/forward · ↑ ↓ switch branch · Home End · S setup · N new game ·
F hide the side panel (board only, for streaming) · A analyze / stop · E engine move.
Open index.html in a browser. It uses plain scripts (no ES modules), so it also works from file://,
except the engine: browsers do not run Web Workers or WebAssembly files from file://. For the engine,
serve the folder: python3 -m http.server 8000 and open http://localhost:8000.
The multi-threaded engine needs SharedArrayBuffer, which browsers only allow on cross-origin isolated
pages (COOP/COEP headers). GitHub Pages cannot send those headers, so when multi-threading is on (the
default), coi-serviceworker.js (registered on every visit) adds them, and loading the engine reloads the page
once if it was not yet in control. Without service workers (or when isolation fails) the single-threaded build is used, and it
stops a search by restarting the engine. See engine/README.md for the engine files, their GPLv3
licence and how to rebuild them.
/ (root).Browsers cache the site's files (GitHub Pages allows about 10 minutes). Before pushing changes, bump the version:
node tools/bump-version.js 1.2.0
It updates index.html: the app-version meta tag and the ?v= query on every stylesheet and script. The engine
worker passes the same query on to the engine's .js, .wasm and .data files, so a returning visitor gets the whole
new release at once instead of a mix of old and new files. The current version is shown at the bottom of Settings.
| File | Role |
|---|---|
js/game.js | Game model: walls and the variation tree (flat node array, parents before children) |
js/board.js | SVG renderer for both themes, hover preview, click-to-cell mapping |
js/coords.js | Edge labels and spiral cell numbering |
js/security.js | Device-bound key pair (non-extractable), key codes, export signing and verification (Web Crypto) |
js/security-panel.js | Security card in Settings and the engine key gate |
tools/add-key.js | Adds a public key code to allowed-keys.json (the engine allow-list) |
js/storage.js | localStorage access, guarded against full or disabled storage |
js/settings.js | Default settings and colour presets |
js/i18n.js | UI strings (vi, en) and the data-i18n markup translator |
js/contrast.js | WCAG contrast ratios, fix suggestions and the board colour audit |
js/engine.js | Engine client: Web Worker lifecycle, search jobs, protocol builder and parser |
js/engine-panel.js | Analyse tab (engine and Explain), engine block of the Play tab, board overlay |
js/main.js | UI wiring, panels, keyboard, import/export |
engine/ | Rapfi WebAssembly builds, their worker host and build script (GPLv3, see engine/README.md) |
tools/bump-version.js | Sets the release version used for cache busting (see Releasing a new version) |
coi-serviceworker.js | Service worker: adds COOP/COEP headers (engine threads on GitHub Pages) and caches the app shell for offline use |
js/install.js | Phone-only banner that offers to install the app |
manifest.webmanifest, icons/ | PWA manifest and icons: the site can be installed on a phone (Chrome: Install app; iOS Safari: Share → Add to Home Screen). The engine is never cached offline |
{
"id": "m1abc2de3f",
"name": "Game 26 Sep 14:05",
"size": 15,
"createdAt": 1790000000000,
"updatedAt": 1790000000000,
"walls": [[3, 3], [11, 11]],
"portals": [[2, 2, 10, 11]],
"torus": true,
"players": ["An", "Binh"],
"nodes": [[0, 7, 7], [1, 8, 7], [1, 6, 6]],
"prefs": [1, 2, -1, -1],
"cur": 2
}
x and y are 0-based with the origin at the top-left. portals entries are [ax, ay, bx, by]
(optional: older saves have none; pairs that break the placement rules are dropped on load). group (the group name shown in the Games tab, up to 40 characters) is optional and written only when set. players (first and second player names, up to 24 characters) is optional and written only when a name is set. torus is optional
and written only when true; portal distances are then measured across the seam. nodes[i] is node i + 1 as
[parent, x, y]; node 0 is the empty board. prefs[n] is the child that Forward follows from
node n (-1 when there is none). cur is the node currently shown.
tests/model.test.js | Model and engine protocol tests: node tests/model.test.js |