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,即可验证所有权并自行管理介绍。
一分钟完成验证Launcher for the nine JEV Arcade games, linking each to its own subdomain at jevplay.games.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Front door for the nine JEV games. It is a launcher: each card links to that game's own
subdomain (tic-tac-toe.jevplay.games, sudoku.jevplay.games, …). Every game stays a
separate app with its own Discord application, secrets and origin checks, so nothing in the
games changes.
Zero runtime dependencies, native Node http. Requires Node 18 or newer (engines in package.json).
To try it locally, run npm start and open http://localhost:3000. The live hub is at jevplay.games.查看完整 README ↗The front door at jevplay.games. It is a launcher: each card links to that game's own subdomain
(noul-who.jevplay.games, typedoku.jevplay.games, …). Every game stays a separate app with its own Discord
application, secrets and origin checks, so nothing in the games changes. The games: Tic-Tac-Typed, Choice Four,
Typecheckers, Box Score, Noul Who, Typecrack, SafeSweep, Typedoku and Slide Score.
[!NOTE] All nine games run as Discord Activities, but only Tic-Tac-Typed has been verified launching inside Discord (
DISCORD.md). The other eight use the same pattern and have not been launched there yet. During the rename, cards link to each game's pre-rename subdomain until that game cuts over (deploy/REDIRECTS.md).
Requires Node 18 or newer (engines in package.json). Zero runtime dependencies, native Node http.
npm test # node --test
npm run build # validates games.json and the shipped assets, prints each game's URL
npm start # listens on process.env.PORT (default 3000), 0.0.0.0
Open http://localhost:3000.
flowchart LR
B[Browser or Discord Activity] -->|GET /| H[Hub: server.js]
B -->|GET /api/games| H
B -->|GET /api/status| H
H -->|reads| J[games.json]
H -->|probe, cached 60 s| G[Game subdomains<br/>slug.jevplay.games]
B -->|card click| G
classDef ink fill:#1E1E1E,stroke:#1E1E1E,color:#FEFEFE
classDef pink fill:#F386A1,stroke:#1E1E1E,color:#1E1E1E
classDef grey fill:#DEDEDE,stroke:#1E1E1E,color:#1E1E1E
class B grey
class H ink
class J grey
class G pink
games.json is the one source of names, slugs, taglines and card art, for the launcher and the art scripts./api/games returns the catalog with each game's resolved URL. /api/status probes each game's origin
server-side (cached 60 s); any response under 500, including a 403 origin_rejected, counts as online.public/brand/brand.css is the shared pink/ink stylesheet, with Inter and VT323 self-hosted (SIL OFL 1.1,
public/brand/OFL.txt, public/brand/OFL-VT323.txt). This repo owns it: change it here, then copy it to the nine
games byte for byte and check the hash (deploy/BRAND-RESYNC.md).Add or rename games in games.json. URLs come from HUB_BASE_DOMAIN (default jevplay.games) or per-game
GAME_URL_<SLUG> overrides; see .env.example.
While a row carries legacySlug, its card points at https://<legacySlug>.<HUB_BASE_DOMAIN>: the game's new
subdomain is not live yet, so the card goes where the game answers today. Override per game with
GAME_URL_<NEW_SLUG>, for example GAME_URL_NOUL_WHO=https://noul-who.jevplay.games to flip one game early. An
override set under the pre-rename key is still honoured while the row has legacySlug. When a game's new subdomain
is live, delete legacySlug from its row. The full runbook, including the Cloudflare 301s, is
deploy/REDIRECTS.md.
Follows the upload guide:
root package.json with build and start, port from PORT, no node_modules in the zip
(package.json has no zip script, so build the zip by hand), well under 100 MB, one app per upload.
npm test && npm run buildnode_modules, no .env, no art/).HUB_BASE_DOMAIN (and any GAME_URL_*) in Settings, then Publish Now.The games are deployed separately and each is attached to its own subdomain. The hub never proxies them.
.github/workflows/deploy.yml runs npm test on every pull request and push. On a push to main (or Run workflow) it then zips the committed tree with git archive and scripts/godaddy-deploy.js uploads it through the GoDaddy Hosting API (https://api.godaddy.com/v1/hosting), waits for the import, and deploys it to the published app NODEJS-0n4hbgyu3g. A failed test, import or build stops the run and leaves the live app unchanged.
GODADDY_PAT: a GoDaddy Personal Access Token with hosting.application:read, hosting.source:write and hosting.deployment:execute. Without it the deploy step is skipped with a warning.GODADDY_APP_ID overrides the target app (API IDs carry the NODEJS- prefix).GODADDY_APP_ID and GODADDY_PAT in .env, then git archive --format=zip -o deploy.zip HEAD && npm run deploy:godaddy -- deploy.zip.| Path | What it is |
|---|---|
server.js | The hub: static files, /api/games, /api/status, /api/activity/config, /healthz |
lib/catalog.js | Loads and validates games.json, resolves each game's URL |
games.json | The nine games: slug, legacy slug, name, tagline, tags, Discord app ID, card art |
public/ | Landing page, terms, privacy, hub.css, hub.js |
public/brand/ | Shared brand.css, fonts and their licences, icons, card art, hosted social cards |
art/ | Art pipeline (emblems, Discord art, icons); not shipped |
deploy/ | Rename cutover runbook, brand.css re-sync procedure (BRAND-RESYNC.md), Train compose for SafeSweep and Typedoku |
tests/ | node --test suite |
Run npm test and npm run build before opening a pull request. Keep brand.css byte-identical across the ten
repos: change it here, copy it out, compare hashes. Write the opponent as Jev and the brand as jevplay.games.