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,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Tools for Players and Dungeon Masters: generate Player Characters, NPCs, maps, and in time a companion for building worlds. The first public product is the Player Character generator.
The living handbook is the Wiki.
Tickets (questae) live in Documenta/Questae/ (new) and Curia/Questae/ (older, being merged into Documenta). Decisions live in the Agora.
make setup builds .venv from requirements.txt the first time (Python 3.10+, 3.14 recommended). make dev reloads on edits. The server is app.main:app; there is no other entry point.查看完整 README ↗Tools for Players and Dungeon Masters: generate Player Characters, NPCs, maps, and in time a companion for building worlds. The first public product is the Player Character generator.
The living handbook is the Wiki.
Tickets (questae) live in Documenta/Questae/ (new) and Curia/Questae/ (older, being merged into Documenta). Decisions live in the Agora.
make run
make setup builds .venv from requirements.txt the first time (Python 3.10+, 3.14 recommended). make dev reloads on edits. The server is app.main:app; there is no other entry point.
make smoke-player
Boot and generate seed 42. make replay-player proves a seeded request replays exactly; make sweep-player builds every Guild at levels 1 and 5 (WIDE=1 builds every level, Species, Background and Specialization and renders every sheet, about nine minutes). The pre-push hook runs the smoke.
mainorigin/main on GitHub is the product. There is no other remote branch. Local main tracks it and is never force-moved (Decree 0008).
Every piece of work is a questa branch, fast-forwarded into main when its gate passes:
git fetch origin
git worktree add ~/Desktop/DnD-session-<short> origin/main
cd ~/Desktop/DnD-session-<short>
git checkout -b questa/QST-####-short-slug
make install-hooks once per clone. Older lines from the 2026 recovery are local archive tags (archive/*, salvage/*, safepoint/*); they are evidence, not product, and are not pushed.
Merging a pull request into main publishes the site. That is the whole procedure. GitHub proves the code first, then deploys it. The change is live in about five minutes.
To republish without changing code: Actions → Prove and Publish → Run workflow, branch main.
Two jobs run. Prove checks every pull request and every push to main. Publish deploys, and only from main, and only once Prove is green.
A green tick means the robot finished, not that the site changed. Open genlegend.eu and look at the thing you changed. Hard-refresh (Ctrl+Shift+R) before believing the page is unchanged.
Publish showing skipped in grey is not a failure. It skips on every pull request, by design, because only main publishes. If it skips on a push to main, the three variables below are missing.
Settings → Secrets and variables → Actions → Variables. Variables, not Secrets: none of them is a password, and hiding them only makes the next failure harder to read.
| Name | Value |
|---|---|
GCP_PROJECT_ID | gen-legend |
GCP_SERVICE_ACCOUNT | [email protected] |
GCP_WORKLOAD_IDENTITY_PROVIDER | projects/1068852386499/locations/global/workloadIdentityPools/github/providers/github |
Set once, on 21 September 2026, by scripts/setup-github-deploy.sh. No key exists anywhere. GitHub proves who it is, and Google answers with a token good for minutes — so there is nothing long-lived to leak. If the variables are ever lost, re-run that script from Cloud Shell; it is safe to repeat and prints them again.
Only when GitHub cannot, or to test a build before it is committed:
gcloud run deploy gen-legends --source . --region us-central1 --allow-unauthenticated
The service is gen-legends, with an s. genlegend.eu maps to it, and to nothing else. Deploying to gen-legend builds fine and changes nothing a visitor sees, because it quietly creates a second service the domain does not point at.
gen-legend, without the s, is the Google Cloud project — the box that holds the service, the billing and the permissions. Both names are correct, one layer apart. The service URL spells the nesting out: gen-legends-1068852386499.us-central1.run.app is the service, then the project's number. The s is a plural somebody typed in 2023, not an abbreviation for anything.
--source . uploads the working directory as it stands, not the last commit, so deploy from a clean checkout of main or you ship whatever you were editing. The GitHub route has no such trap: it always deploys the commit.
If the deploy stops on Missing required argument [--clear-base-image], the service is still set to let Cloud Run manage a base image for it, which a Dockerfile build cannot do. Add --clear-base-image once; the setting stays cleared.
docker build --build-arg BUILD_SHA=$(git rev-parse --short HEAD) -t gen-legends .
docker run -p 8080:8080 gen-legends
Cloud Run builds this same Dockerfile.
By default main publishes by itself. To make it wait for your word instead: Settings → Environments → New environment, named exactly production, then tick Required reviewers and add yourself. Publish then stops and emails you until you approve. Untick to go back to automatic.